From 977a83a76cb35ef37690cb7192ec839635044b79 Mon Sep 17 00:00:00 2001
From: Tamara Steinwender <tamara.steinwender@tugraz.at>
Date: Wed, 5 Aug 2020 15:44:45 +0200
Subject: [PATCH] Handle close dialog error in Micromodal library, few
 bugfixes, create propfind for checking rights

---
 .../src/dbp-nextcloud-file-picker.js          | 100 ++++++++++--------
 packages/file-handling/src/file-sink.js       |  25 ++---
 packages/file-handling/src/file-source.js     |   4 +-
 packages/file-handling/src/micromodal.es.js   |   8 +-
 4 files changed, 70 insertions(+), 67 deletions(-)

diff --git a/packages/file-handling/src/dbp-nextcloud-file-picker.js b/packages/file-handling/src/dbp-nextcloud-file-picker.js
index cdb0c047..7762e60d 100644
--- a/packages/file-handling/src/dbp-nextcloud-file-picker.js
+++ b/packages/file-handling/src/dbp-nextcloud-file-picker.js
@@ -11,7 +11,6 @@ import {humanFileSize} from 'dbp-common/i18next';
 import Tabulator from 'tabulator-tables';
 import nextcloudFileURL from 'consts:nextcloudFileURL';
 import MicroModal from './micromodal.es';
-import {waitFor} from "@babel/core/lib/gensync-utils/async";
 
 /**
  * NextcloudFilePicker web component
@@ -40,7 +39,6 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
         this.replaceFilename = '';
         this.uploadFileObject = null;
         this.uploadFileDirectory = null;
-        this.isDialogOpen = true;
         this.fileList = [];
     }
 
@@ -71,7 +69,6 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
             replaceFilename: { type: String, attribute: false },
             uploadFileObject: { type: Object, attribute: false },
             uploadFileDirectory: { type: String, attribute: false },
-            isDialogOpen: { type: Boolean, attribute: false },
         };
     }
 
@@ -280,7 +277,7 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
         this.webDavClient
             .getDirectoryContents(path, {details: true})
             .then(contents => {
-                console.log("contents", contents);
+                //console.log("contents", contents);
                 this.loading = false;
                 this.statusText = "";
                 this.tabulatorTable.setData(contents.data);
@@ -307,6 +304,23 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
                 this.statusText = reloadButton;
         });
 
+        const contents2 = this.webDavClient.customRequest(path, {
+            method: "PROPFIND",
+            headers: {
+                Accept: "text/plain",
+                Depth: 0
+            },
+            data: "<?xml version=\"1.0\"?>\n" +
+                "<d:propfind  xmlns:d=\"DAV:\" xmlns:oc=\"http://owncloud.org/ns\" xmlns:nc=\"http://nextcloud.org/ns\">\n" +
+                "  <d:prop>\n" +
+                "        <oc:permissions />\n" +
+                "        <nc:acl-permissions />\n" +
+                "  </d:prop>\n" +
+                "</d:propfind>",
+            responseType: "text"
+        }); // contents => { //console.log("---------", contents)});
+
+
     }
 
     directoryClicked(event, file) {
@@ -316,7 +330,7 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
 
     downloadFiles(files) {
         files.forEach((fileData) => this.downloadFile(fileData));
-        MicroModal.close();
+
     }
 
     downloadFile(fileData) {
@@ -378,8 +392,7 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
             let path = directory + "/" + file.name;
             // https://github.com/perry-mitchell/webdav-client#putfilecontents
             let ret = false;
-            try{
-                let contents = await this.webDavClient
+            let contents = await this.webDavClient
                     .putFileContents(path, file,  { overwrite: false, onUploadProgress: progress => {
                             console.log(`Uploaded ${progress.loaded} bytes of ${progress.total}`);
                         }}).then(function() {
@@ -390,22 +403,20 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
                             this.fileList.shift();
                             console.log("FileList: ", this.fileList);
                             this.uploadFile(directory);
+                        }).catch(error => {
+                            console.error(error.message);
+                            //this.loading = false;
+                            //this.statusText = error.message;
+                            console.log("--- h-", error.message);
+                            if(error.message.search("412") !== -1) {
+                                this.replaceModalDialog(file, directory);
+                            }
                         }
-                    );
-
-            } catch(error ) {
-                console.error(error.message);
-                this.loading = false;
-                this.statusText = error.message;
-                console.log("----", error.message);
-                if(error.message.search("412") !== -1) {
-                    this.replaceModalDialog(file, directory);
-                    console.log("dialog open after upload? ", this.isDialogOpen);
-                }
-            }
-
+                        );
         }
         else {
+            this.loading = false;
+            this.statusText = "";
             const event = new CustomEvent("dbp-nextcloud-file-picker-file-uploaded-finished",
                 {  bubbles: true, composed: true });
             this.dispatchEvent(event);
@@ -421,8 +432,9 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
         let directory = this.uploadFileDirectory;
 
         if(this._("input[name='replacement']:checked").value === "ignore") {
-            MicroModal.close();
+            MicroModal.close(this._("#replace-modal"));
             this.fileList.shift();
+            this.uploadFile(directory);
             return true;
         }
         else if (this._("input[name='replacement']:checked").value === "new-name") {
@@ -437,32 +449,29 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
         }
 
         // https://github.com/perry-mitchell/webdav-client#putfilecontents
-        try{
-            let contents = await this.webDavClient
+        let contents = await this.webDavClient
                 .putFileContents(path, file,  { overwrite: overwrite, onUploadProgress: progress => {
                         console.log(`Uploaded ${progress.loaded} bytes of ${progress.total}`);
-                    }});
-            this.loading = false;
-            this.statusText = "";
-            console.log("try finished");
-            console.log("after one file finished");
-            this.fileList.shift();
-            console.log("FileList length: ", this.fileList.length);
-            console.log("########## after one file finished");
-            MicroModal.close();
-            this.uploadFile(directory);
-
-        } catch(error ) {
-            console.error(error.message);
-            this.loading = false;
-            this.statusText = error.message;
-            console.log("----", error.message);
-            if(error.message.search("412") !== -1) {
-                MicroModal.close();
-                this.replaceModalDialog(file, directory);
-                console.log("dialog open after upload? ", this.isDialogOpen);
-            }
-        }
+                    }}).then(content => {
+                        this.loading = false;
+                        this.statusText = "";
+                        console.log("try finished");
+                        console.log("after one file finished");
+                        this.fileList.shift();
+                        console.log("FileList length: ", this.fileList.length);
+                        console.log("########## after one file finished");
+                        MicroModal.close(this._("#replace-modal"));
+                        this.uploadFile(directory);
+                    }).catch(error => {
+                        console.error(error.message);
+                        this.loading = false;
+                        this.statusText = error.message;
+                        console.log("----", error.message);
+                        if(error.message.search("412") !== -1) {
+                            MicroModal.close(this._("#replace-modal"));
+                            this.replaceModalDialog(file, directory);
+                        }
+                    });
     }
 
     /**
@@ -476,7 +485,6 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
         this.uploadFileDirectory = directory;
 
         MicroModal.show(this._('#replace-modal'));
-        console.log("dialog is open? ", this.isDialogOpen);
     }
 
     /**
diff --git a/packages/file-handling/src/file-sink.js b/packages/file-handling/src/file-sink.js
index 8ef1b2ae..e0b890e5 100644
--- a/packages/file-handling/src/file-sink.js
+++ b/packages/file-handling/src/file-sink.js
@@ -114,28 +114,14 @@ export class FileSink extends ScopedElementsMixin(DBPLitElement) {
     }
 
     async uploadToNextcloud(directory) {
-
         let that = this;
         const element = that._('#nextcloud-file-picker');
         console.log("davor");
         await element.uploadFiles(that.files, directory);
-        /*console.log("fertig", finished);
-        if(finished) {
-            MicroModal.close();
-            console.log("close");
-            send({
-                "summary": i18n.t('file-sink.upload-success-title'),
-                "body": i18n.t('file-sink.upload-success-body', {name: this.nextcloudName}),
-                "type": "success",
-                "timeout": 5,
-            });
-        }*/
-
-
     }
 
     finishedFileUpload() {
-        MicroModal.close();
+        MicroModal.close(this._('#modal-picker'));
         console.log("close");
         send({
             "summary": i18n.t('file-sink.upload-success-title'),
@@ -153,13 +139,14 @@ export class FileSink extends ScopedElementsMixin(DBPLitElement) {
     openDialog() {
         console.log("openDialog");
         MicroModal.show(this._('#modal-picker'), {
-            onClose: modal => { this.isDialogOpen = false; }
+            onClose: modal => { this.isDialogOpen = false; },
+            closeTrigger: 'data-custom-close',
         });
     }
 
     closeDialog() {
         console.log("closeDialog");
-        MicroModal.close();
+        MicroModal.close(this._('#modal-picker'));
     }
 
     static get styles() {
@@ -189,7 +176,7 @@ export class FileSink extends ScopedElementsMixin(DBPLitElement) {
         return html`
             <vpu-notification lang="de" client-id="my-client-id"></vpu-notification>
             <div class="modal micromodal-slide" id="modal-picker" aria-hidden="true">
-                <div class="modal-overlay" tabindex="-1" data-micromodal-close>
+                <div class="modal-overlay" tabindex="-1" data-custom-close>
                     <div class="modal-container" role="dialog" aria-modal="true" aria-labelledby="modal-picker-title">
                         <nav class="modal-nav">
                             <div title="${i18n.t('file-sink.nav-local')}"
@@ -206,7 +193,7 @@ export class FileSink extends ScopedElementsMixin(DBPLitElement) {
                             </div>
                         </nav>
                             <div class="modal-header">
-                                <button title="${i18n.t('file-sink.modal-close')}" class="modal-close"  aria-label="Close modal"  data-micromodal-close>
+                                <button title="${i18n.t('file-sink.modal-close')}" class="modal-close"  aria-label="Close modal" data-custom-close @click="${() => { this.closeDialog()}}">
                                         <dbp-icon title="${i18n.t('file-sink.modal-close')}" name="close" class="close-icon"></dbp-icon>
                                 </button> 
                                 <p class="modal-context"> ${this.context}</p>
diff --git a/packages/file-handling/src/file-source.js b/packages/file-handling/src/file-source.js
index 72880778..03b288a7 100644
--- a/packages/file-handling/src/file-source.js
+++ b/packages/file-handling/src/file-source.js
@@ -205,6 +205,8 @@ export class FileSource extends ScopedElementsMixin(DBPLitElement) {
      * @param file
      */
     sendFileEvent(file) {
+        MicroModal.close(this._('#modal-picker'));
+        console.log("close filesource modal.")
         const data = {"file": file};
         const event = new CustomEvent("dbp-file-source-file-selected", { "detail": data, bubbles: true, composed: true });
         this.dispatchEvent(event);
@@ -319,7 +321,7 @@ export class FileSource extends ScopedElementsMixin(DBPLitElement) {
 
     closeDialog() {
         console.log("closeDialog");
-        MicroModal.close();
+        MicroModal.close(this._('#modal-picker'));
     }
 
     static get styles() {
diff --git a/packages/file-handling/src/micromodal.es.js b/packages/file-handling/src/micromodal.es.js
index 0118dd1d..e79dcf78 100644
--- a/packages/file-handling/src/micromodal.es.js
+++ b/packages/file-handling/src/micromodal.es.js
@@ -185,7 +185,13 @@ var MicroModal = function () {
     }, {
       key: "closeModalById",
       value: function closeModalById(targetModal) {
-        this.modal = document.getElementById(targetModal);
+        // added support to pass on an element or an id -> for webcomponents
+        if (targetModal instanceof HTMLElement) {
+          this.modal = targetModal;
+        }
+        else {
+          this.model = document.getElementById(targetModal);
+        }
         if (this.modal) this.closeModal();
       }
     }, {
-- 
GitLab