From: Michal Klobukowski Date: Thu, 11 Oct 2018 15:11:39 +0000 (+0200) Subject: Make file ids unique, fix bad file download url X-Git-Tag: 1.3.0~62^2~7^2~7 X-Git-Url: https://git.arvados.org/arvados-workbench2.git/commitdiff_plain/9e53e34ec65cdd0934aa46465ff4ac758c013529 Make file ids unique, fix bad file download url Feature #13862 Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski --- diff --git a/src/services/collection-service/collection-service-files-response.ts b/src/services/collection-service/collection-service-files-response.ts index b8a7970d..a4b527a2 100644 --- a/src/services/collection-service/collection-service-files-response.ts +++ b/src/services/collection-service/collection-service-files-response.ts @@ -26,7 +26,7 @@ export const sortFilesTree = (tree: Tree) }; export const extractFilesData = (document: Document) => { - const collectionUrlPrefix = /\/c=[0-9a-zA-Z\-]*/; + const collectionUrlPrefix = /\/c=([0-9a-zA-Z\-]*)/; return Array .from(document.getElementsByTagName('D:response')) .slice(1) // omit first element which is collection itself @@ -35,13 +35,20 @@ export const extractFilesData = (document: Document) => { const size = parseInt(getTagValue(element, 'D:getcontentlength', '0'), 10); const url = getTagValue(element, 'D:href', ''); const nameSuffix = `/${name || ''}`; + const collectionUuidMatch = collectionUrlPrefix.exec(url); + const collectionUuid = collectionUuidMatch ? collectionUuidMatch.pop() : ''; const directory = url .replace(collectionUrlPrefix, '') .replace(nameSuffix, ''); + const data = { url, - id: `${directory}/${name}`, + id: [ + collectionUuid ? collectionUuid : '', + directory ? '/' + directory : '', + '/' + name + ].join(''), name, path: directory, }; @@ -52,3 +59,6 @@ export const extractFilesData = (document: Document) => { }); }; + +export const getFileFullPath = ({ name, path }: CollectionFile | CollectionDirectory) => + `${path}/${name}`; diff --git a/src/services/collection-service/collection-service.ts b/src/services/collection-service/collection-service.ts index 138f16a1..00ba8547 100644 --- a/src/services/collection-service/collection-service.ts +++ b/src/services/collection-service/collection-service.ts @@ -50,10 +50,15 @@ export class CollectionService extends TrashableResourceService ({ - ...file, - url: this.webdavClient.defaults.baseURL + file.url + '?api_token=' + this.authService.getApiToken() - }) + private extendFileURL = (file: CollectionDirectory | CollectionFile) => { + const baseUrl = this.webdavClient.defaults.baseURL.endsWith('/') + ? this.webdavClient.defaults.baseURL.slice(0, -1) + : this.webdavClient.defaults.baseURL; + return { + ...file, + url: baseUrl + file.url + '?api_token=' + this.authService.getApiToken() + }; + } private async uploadFile(collectionUuid: string, file: File, fileId: number, onProgress: UploadProgress = () => { return; }) { const fileURL = `c=${collectionUuid}/${file.name}`; diff --git a/src/store/collection-panel/collection-panel-files/collection-panel-files-actions.ts b/src/store/collection-panel/collection-panel-files/collection-panel-files-actions.ts index 0460c977..99ab6829 100644 --- a/src/store/collection-panel/collection-panel-files/collection-panel-files-actions.ts +++ b/src/store/collection-panel/collection-panel-files/collection-panel-files-actions.ts @@ -13,6 +13,7 @@ import { getNodeValue } from "~/models/tree"; import { filterCollectionFilesBySelection } from './collection-panel-files-state'; import { startSubmit, stopSubmit, reset } from 'redux-form'; import { getDialog } from "~/store/dialog/dialog-reducer"; +import { getFileFullPath } from "~/services/collection-service/collection-service-files-response"; export const collectionPanelFilesAction = unionize({ SET_COLLECTION_FILES: ofType(), @@ -43,7 +44,8 @@ export const removeCollectionFiles = (filePaths: string[]) => export const removeCollectionsSelectedFiles = () => (dispatch: Dispatch, getState: () => RootState) => { - const paths = filterCollectionFilesBySelection(getState().collectionPanelFiles, true).map(file => file.id); + const paths = filterCollectionFilesBySelection(getState().collectionPanelFiles, true) + .map(getFileFullPath); dispatch(removeCollectionFiles(paths)); }; @@ -101,16 +103,19 @@ export const renameFile = (newName: string) => const dialog = getDialog(getState().dialog, RENAME_FILE_DIALOG); const currentCollection = getState().collectionPanel.item; if (dialog && currentCollection) { - dispatch(startSubmit(RENAME_FILE_DIALOG)); - const oldPath = dialog.data.id; - const newPath = dialog.data.id.replace(dialog.data.name, newName); - try { - await services.collectionService.moveFile(currentCollection.uuid, oldPath, newPath); - dispatch(loadCollectionFiles(currentCollection.uuid)); - dispatch(dialogActions.CLOSE_DIALOG({ id: RENAME_FILE_DIALOG })); - dispatch(snackbarActions.OPEN_SNACKBAR({ message: 'File name changed.', hideDuration: 2000 })); - } catch (e) { - dispatch(stopSubmit(RENAME_FILE_DIALOG, { name: 'Could not rename the file' })); + const file = getNodeValue(dialog.data.id)(getState().collectionPanelFiles); + if (file) { + dispatch(startSubmit(RENAME_FILE_DIALOG)); + const oldPath = getFileFullPath(file); + const newPath = getFileFullPath({ ...file, name: newName }); + try { + await services.collectionService.moveFile(currentCollection.uuid, oldPath, newPath); + dispatch(loadCollectionFiles(currentCollection.uuid)); + dispatch(dialogActions.CLOSE_DIALOG({ id: RENAME_FILE_DIALOG })); + dispatch(snackbarActions.OPEN_SNACKBAR({ message: 'File name changed.', hideDuration: 2000 })); + } catch (e) { + dispatch(stopSubmit(RENAME_FILE_DIALOG, { name: 'Could not rename the file' })); + } } } };