From ffbfe1965a34800f933b20a32374d9cd9eb7ea72 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Daniel=20Kuty=C5=82a?= Date: Mon, 21 Sep 2020 18:09:35 +0200 Subject: [PATCH] 16243: Fixed copy of selected items to new collection MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Arvados-DCO-1.1-Signed-off-by: Daniel Kutyła --- .../collection-panel-files-reducer.ts | 23 ++++++++++++++----- .../collection-panel-files-state.ts | 1 - .../collection-partial-copy-actions.ts | 12 ++++++++-- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/store/collection-panel/collection-panel-files/collection-panel-files-reducer.ts b/src/store/collection-panel/collection-panel-files/collection-panel-files-reducer.ts index 25323e27..03de8e34 100644 --- a/src/store/collection-panel/collection-panel-files/collection-panel-files-reducer.ts +++ b/src/store/collection-panel/collection-panel-files/collection-panel-files-reducer.ts @@ -27,8 +27,8 @@ export const collectionPanelFilesReducer = (state: CollectionPanelFilesState = c .map(toggleDescendants(data.id))[0], ON_SEARCH_CHANGE: (searchValue) => { - // node.children = children.filter((id: string) => id.replace(parentId, '').toLowerCase().indexOf(searchValue.toLowerCase()) > -1); - const ids: string[] = []; + const fileIds: string[] = []; + const directoryIds: string[] = []; const filteredFiles = Object.keys(fetchedFiles) .filter((key: string) => { const node = fetchedFiles[key]; @@ -40,22 +40,33 @@ export const collectionPanelFilesReducer = (state: CollectionPanelFilesState = c const { id, value: { type, name } } = node; if (type === CollectionFileType.DIRECTORY) { - ids.push(id); + directoryIds.push(id); return true; } const includeFile = name.toLowerCase().indexOf(searchValue.toLowerCase()) > -1; if (includeFile) { - ids.push(id); + fileIds.push(id); } return includeFile; }) .reduce((prev, next) => { const node = JSON.parse(JSON.stringify(fetchedFiles[next])); - node.children = node.children.filter((key: string) => ids.indexOf(key) > -1); - prev[next] = node; + const { value: { type }, children } = node; + + node.children = node.children.filter((key: string) => { + const isFile = directoryIds.indexOf(key) === -1; + return isFile ? + fileIds.indexOf(key) > -1 : + !!fileIds.find(id => id.indexOf(key) > -1); + }); + + if (type === CollectionFileType.FILE || children.length > 0) { + prev[next] = node; + } + return prev; }, {}); diff --git a/src/store/collection-panel/collection-panel-files/collection-panel-files-state.ts b/src/store/collection-panel/collection-panel-files/collection-panel-files-state.ts index 9d5b06ce..aa3bd305 100644 --- a/src/store/collection-panel/collection-panel-files/collection-panel-files-state.ts +++ b/src/store/collection-panel/collection-panel-files/collection-panel-files-state.ts @@ -38,7 +38,6 @@ export const mergeCollectionPanelFilesStates = (oldState: CollectionPanelFilesSt export const filterCollectionFilesBySelection = (tree: CollectionPanelFilesState, selected: boolean) => { const allFiles = getNodeDescendants('')(tree).map(node => node.value); - const selectedDirectories = allFiles.filter(file => file.selected === selected && file.type === CollectionFileType.DIRECTORY); const selectedFiles = allFiles.filter(file => file.selected === selected && !selectedDirectories.some(dir => dir.id === file.path)); return [...selectedDirectories, ...selectedFiles]; diff --git a/src/store/collections/collection-partial-copy-actions.ts b/src/store/collections/collection-partial-copy-actions.ts index 72374e65..621f1957 100644 --- a/src/store/collections/collection-partial-copy-actions.ts +++ b/src/store/collections/collection-partial-copy-actions.ts @@ -61,8 +61,16 @@ export const copyCollectionPartial = ({ name, description, projectUuid }: Collec manifestText: collection.manifestText, }; const newCollection = await services.collectionService.create(collectionCopy); - const paths = filterCollectionFilesBySelection(state.collectionPanelFiles, false).map(file => file.id); - await services.collectionService.deleteFiles(newCollection.uuid, paths); + const copiedFiles = await services.collectionService.files(newCollection.uuid); + const paths = filterCollectionFilesBySelection(state.collectionPanelFiles, true).map(file => file.id); + const filesToDelete = copiedFiles.map(({ id }) => id).filter(file => { + return !paths.find(path => path.indexOf(file.replace(newCollection.uuid, '')) > -1); + }); + // console.log(paths.length, filesToDelete.length, copiedFiles.length); + await services.collectionService.deleteFiles( + '', + filesToDelete + ); dispatch(dialogActions.CLOSE_DIALOG({ id: COLLECTION_PARTIAL_COPY_FORM_NAME })); dispatch(snackbarActions.OPEN_SNACKBAR({ message: 'New collection created.', -- 2.30.2