Merge branch '17016-delete-single-file-deletes-whole-collection'
authorDaniel Kutyła <daniel.kutyla@contractors.roche.com>
Mon, 11 Jan 2021 15:58:44 +0000 (16:58 +0100)
committerDaniel Kutyła <daniel.kutyla@contractors.roche.com>
Mon, 11 Jan 2021 15:58:44 +0000 (16:58 +0100)
closes #17016

Arvados-DCO-1.1-Signed-off-by: Daniel Kutyła <daniel.kutyla@contractors.roche.com>

1  2 
src/services/collection-service/collection-service.ts
src/store/collection-panel/collection-panel-files/collection-panel-files-actions.ts

index 04c01a113e8852a02be4c034d4334bdc236bdc78,5ae03b89eb0f816c7f595d322dadd1000d94b8cd..c46c3e27764470f1c214cc4ff82200d612b6a8c4
@@@ -27,14 -27,6 +27,14 @@@ export class CollectionService extends 
          ]);
      }
  
 +    create(data?: Partial<CollectionResource>) {
 +        return super.create({ ...data, preserveVersion: true });
 +    }
 +
 +    update(uuid: string, data: Partial<CollectionResource>) {
 +        return super.update(uuid, { ...data, preserveVersion: true });
 +    }
 +
      async files(uuid: string) {
          const request = await this.webdavClient.propfind(`c=${uuid}`);
          if (request.responseXML != null) {
      }
  
      async deleteFiles(collectionUuid: string, filePaths: string[]) {
-         if (collectionUuid === "" || filePaths.length === 0) { return; }
-         for (const path of filePaths) {
-             const splittedPath = path.split('/');
-             if (collectionUuid) {
-                 await this.webdavClient.delete(`c=${collectionUuid}/${splittedPath[1]}`);
-             } else {
+         const sortedUniquePaths = Array.from(new Set(filePaths))
+             .sort((a, b) => a.length - b.length)
+             .reduce((acc, currentPath) => {
+                 const parentPathFound = acc.find((parentPath) => currentPath.indexOf(`${parentPath}/`) > -1);
+                 if (!parentPathFound) {
+                     return [...acc, currentPath];
+                 }
+                 return acc;
+             }, []);
+         for (const path of sortedUniquePaths) {
+             if (path.indexOf(collectionUuid) === -1) {
                  await this.webdavClient.delete(`c=${collectionUuid}${path}`);
+             } else {
+                 await this.webdavClient.delete(`c=${path}`);
              }
          }
 +        await this.update(collectionUuid, { preserveVersion: true });
      }
  
      async uploadFiles(collectionUuid: string, files: File[], onProgress?: UploadProgress) {
 +        if (collectionUuid === "" || files.length === 0) { return; }
          // files have to be uploaded sequentially
          for (let idx = 0; idx < files.length; idx++) {
              await this.uploadFile(collectionUuid, files[idx], idx, onProgress);
          }
 +        await this.update(collectionUuid, { preserveVersion: true });
      }
  
 -    moveFile(collectionUuid: string, oldPath: string, newPath: string) {
 -        return this.webdavClient.move(
 +    async moveFile(collectionUuid: string, oldPath: string, newPath: string) {
 +        await this.webdavClient.move(
              `c=${collectionUuid}${oldPath}`,
              `c=${collectionUuid}${encodeURI(newPath)}`
          );
 +        await this.update(collectionUuid, { preserveVersion: true });
      }
  
      extendFileURL = (file: CollectionDirectory | CollectionFile) => {
index 80d61ea04cb3efbf42c1904a223d5165c45c7d44,373ee04eec06e3735d5c469668352394c274de85..c7a3bdc50372fdd457de1df63b7523174592f1ea
@@@ -42,12 -42,13 +42,13 @@@ export const loadCollectionFiles = (uui
              const mapped = mapTreeValues(services.collectionService.extendFileURL)(sorted);
              dispatch(collectionPanelFilesAction.SET_COLLECTION_FILES(mapped));
              dispatch(progressIndicatorActions.STOP_WORKING(COLLECTION_PANEL_LOAD_FILES));
 -        }).catch(e => {
 +        }).catch(() => {
              dispatch(progressIndicatorActions.STOP_WORKING(COLLECTION_PANEL_LOAD_FILES));
              dispatch(snackbarActions.OPEN_SNACKBAR({
 -                message: `Error getting file list: ${e.errors[0]}`,
 +                message: `Error getting file list`,
                  hideDuration: 2000,
-                 kind: SnackbarKind.ERROR }));
+                 kind: SnackbarKind.ERROR
+             }));
          });
      };
  
@@@ -149,7 -150,7 +150,7 @@@ export const renameFile = (newFullPath
                      dispatch<any>(loadCollectionPanel(currentCollection.uuid, true));
                      dispatch(dialogActions.CLOSE_DIALOG({ id: RENAME_FILE_DIALOG }));
                      dispatch(snackbarActions.OPEN_SNACKBAR({ message: 'File name changed.', hideDuration: 2000 }));
-                 }).catch (e => {
+                 }).catch(e => {
                      const errors: FormErrors<RenameFileDialogData, string> = {
                          path: `Could not rename the file: ${e.responseText}`
                      };