16243: Fixed copy of selected items to new collection
authorDaniel Kutyła <daniel.kutyla@contractors.roche.com>
Mon, 21 Sep 2020 16:09:35 +0000 (18:09 +0200)
committerDaniel Kutyła <daniel.kutyla@contractors.roche.com>
Mon, 21 Sep 2020 16:09:35 +0000 (18:09 +0200)
Arvados-DCO-1.1-Signed-off-by: Daniel Kutyła <daniel.kutyla@contractors.roche.com>

src/store/collection-panel/collection-panel-files/collection-panel-files-reducer.ts
src/store/collection-panel/collection-panel-files/collection-panel-files-state.ts
src/store/collections/collection-partial-copy-actions.ts

index 25323e27bf966431adc9349e916f6bab003655b6..03de8e34f4c05c0b9bb849bce97ae68b02d8b6f0 100644 (file)
@@ -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;
                 }, {});
 
index 9d5b06cea6b9c94f74e5fadbebd022b5b6366178..aa3bd3057d36601bc9119b4bb721348975e3422d 100644 (file)
@@ -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];
index 72374e65970aae31c50a36387d2788107ec30222..621f1957d4ab639262f9b9570ac3bc18dec1ebcc 100644 (file)
@@ -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.',