From: Lucas Di Pentima Date: Thu, 24 Sep 2020 21:58:35 +0000 (-0300) Subject: Merge branch '16592-renaming-fix' X-Git-Tag: 2.1.0~7 X-Git-Url: https://git.arvados.org/arvados-workbench2.git/commitdiff_plain/33c03ae3c79936cc1a69129f07fba33fe2d28fd8?hp=fd6e59dc0cc2168b51ca585814bac6694c131300 Merge branch '16592-renaming-fix' Closes #16592 Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima --- diff --git a/src/common/webdav.test.ts b/src/common/webdav.test.ts index c85f30e7..b928f82a 100644 --- a/src/common/webdav.test.ts +++ b/src/common/webdav.test.ts @@ -62,7 +62,7 @@ describe('WebDAV', () => { expect(request).toBeInstanceOf(XMLHttpRequest); }); - it('COPY - adds baseURL to Destination header', async () => { + it('COPY - adds baseURL with trailing slash to Destination header', async () => { const { open, setRequestHeader, load, createRequest } = mockCreateRequest(); const webdav = new WebDAV(undefined, createRequest); webdav.defaults.baseURL = 'base/'; @@ -74,18 +74,30 @@ describe('WebDAV', () => { expect(request).toBeInstanceOf(XMLHttpRequest); }); + it('COPY - adds baseURL without trailing slash to Destination header', async () => { + const { open, setRequestHeader, load, createRequest } = mockCreateRequest(); + const webdav = new WebDAV(undefined, createRequest); + webdav.defaults.baseURL = 'base'; + const promise = webdav.copy('foo', 'foo-copy'); + load(); + const request = await promise; + expect(open).toHaveBeenCalledWith('COPY', 'base/foo'); + expect(setRequestHeader).toHaveBeenCalledWith('Destination', 'base/foo-copy'); + expect(request).toBeInstanceOf(XMLHttpRequest); + }); + it('MOVE', async () => { const { open, setRequestHeader, load, createRequest } = mockCreateRequest(); const webdav = new WebDAV(undefined, createRequest); - const promise = webdav.move('foo', 'foo-copy'); + const promise = webdav.move('foo', 'foo-moved'); load(); const request = await promise; expect(open).toHaveBeenCalledWith('MOVE', 'foo'); - expect(setRequestHeader).toHaveBeenCalledWith('Destination', 'foo-copy'); + expect(setRequestHeader).toHaveBeenCalledWith('Destination', 'foo-moved'); expect(request).toBeInstanceOf(XMLHttpRequest); }); - it('MOVE - adds baseURL to Destination header', async () => { + it('MOVE - adds baseURL with trailing slash to Destination header', async () => { const { open, setRequestHeader, load, createRequest } = mockCreateRequest(); const webdav = new WebDAV(undefined, createRequest); webdav.defaults.baseURL = 'base/'; @@ -97,6 +109,18 @@ describe('WebDAV', () => { expect(request).toBeInstanceOf(XMLHttpRequest); }); + it('MOVE - adds baseURL without trailing slash to Destination header', async () => { + const { open, setRequestHeader, load, createRequest } = mockCreateRequest(); + const webdav = new WebDAV(undefined, createRequest); + webdav.defaults.baseURL = 'base'; + const promise = webdav.move('foo', 'foo-moved'); + load(); + const request = await promise; + expect(open).toHaveBeenCalledWith('MOVE', 'base/foo'); + expect(setRequestHeader).toHaveBeenCalledWith('Destination', 'base/foo-moved'); + expect(request).toBeInstanceOf(XMLHttpRequest); + }); + it('DELETE', async () => { const { open, load, createRequest } = mockCreateRequest(); const webdav = new WebDAV(undefined, createRequest); diff --git a/src/common/webdav.ts b/src/common/webdav.ts index b2f43348..17032768 100644 --- a/src/common/webdav.ts +++ b/src/common/webdav.ts @@ -42,14 +42,24 @@ export class WebDAV { this.request({ ...config, url, method: 'COPY', - headers: { ...config.headers, Destination: this.defaults.baseURL + destination } + headers: { + ...config.headers, + Destination: this.defaults.baseURL + ? this.defaults.baseURL.replace(/\/+$/, '') + '/' + destination.replace(/^\/+/, '') + : destination + } }) move = (url: string, destination: string, config: WebDAVRequestConfig = {}) => this.request({ ...config, url, method: 'MOVE', - headers: { ...config.headers, Destination: this.defaults.baseURL + destination } + headers: { + ...config.headers, + Destination: this.defaults.baseURL + ? this.defaults.baseURL.replace(/\/+$/, '') + '/' + destination.replace(/^\/+/, '') + : destination + } }) delete = (url: string, config: WebDAVRequestConfig = {}) => diff --git a/src/views-components/context-menu/action-sets/collection-files-item-action-set.ts b/src/views-components/context-menu/action-sets/collection-files-item-action-set.ts index 2ded3736..b900d186 100644 --- a/src/views-components/context-menu/action-sets/collection-files-item-action-set.ts +++ b/src/views-components/context-menu/action-sets/collection-files-item-action-set.ts @@ -3,9 +3,9 @@ // SPDX-License-Identifier: AGPL-3.0 import { ContextMenuActionSet } from "../context-menu-action-set"; -import { RemoveIcon } from "~/components/icon/icon"; +import { RemoveIcon, RenameIcon } from "~/components/icon/icon"; import { DownloadCollectionFileAction } from "../actions/download-collection-file-action"; -import { openFileRemoveDialog } from '~/store/collection-panel/collection-panel-files/collection-panel-files-actions'; +import { openFileRemoveDialog, openRenameFileDialog } from '~/store/collection-panel/collection-panel-files/collection-panel-files-actions'; import { CollectionFileViewerAction } from '~/views-components/context-menu/actions/collection-file-viewer-action'; @@ -21,14 +21,13 @@ export const readOnlyCollectionFilesItemActionSet: ContextMenuActionSet = [[ ]]; export const collectionFilesItemActionSet: ContextMenuActionSet = readOnlyCollectionFilesItemActionSet.concat([[ - // FIXME: This isn't working. Maybe something related to WebDAV? - // { - // name: "Rename", - // icon: RenameIcon, - // execute: (dispatch, resource) => { - // dispatch(openRenameFileDialog({ name: resource.name, id: resource.uuid })); - // } - // }, + { + name: "Rename", + icon: RenameIcon, + execute: (dispatch, resource) => { + dispatch(openRenameFileDialog({ name: resource.name, id: resource.uuid })); + } + }, { name: "Remove", icon: RemoveIcon,