From 8cfedaa767c2a2d955d1d4585b5e0ffea239a9d8 Mon Sep 17 00:00:00 2001
From: Tamara Steinwender <tamara.steinwender@tugraz.at>
Date: Thu, 29 Apr 2021 11:30:26 +0200
Subject: [PATCH] Add checks in filehandling when accessing dom

---
 .../src/dbp-nextcloud-file-picker.js          |  4 +-
 packages/file-handling/src/file-sink.js       | 38 +++++++++----------
 packages/file-handling/src/file-source.js     | 13 +++----
 3 files changed, 24 insertions(+), 31 deletions(-)

diff --git a/packages/file-handling/src/dbp-nextcloud-file-picker.js b/packages/file-handling/src/dbp-nextcloud-file-picker.js
index 4c4af48a..cbd010fb 100644
--- a/packages/file-handling/src/dbp-nextcloud-file-picker.js
+++ b/packages/file-handling/src/dbp-nextcloud-file-picker.js
@@ -326,10 +326,10 @@ export class NextcloudFilePicker extends ScopedElementsMixin(DBPLitElement) {
      * @param path
      */
     loadDirectory(path) {
-        if ( typeof this.directoryPath === 'undefined' || this.directoryPath === undefined) {
+        if (typeof this.directoryPath === 'undefined' || this.directoryPath === undefined) {
            this.directoryPath = '';
         }
-        if(path === undefined) {
+        if (path === undefined) {
             path = '';
         }
 
diff --git a/packages/file-handling/src/file-sink.js b/packages/file-handling/src/file-sink.js
index 9c83bad2..85a9c3eb 100644
--- a/packages/file-handling/src/file-sink.js
+++ b/packages/file-handling/src/file-sink.js
@@ -35,7 +35,6 @@ export class FileSink extends ScopedElementsMixin(DBPLitElement) {
         this.isDialogOpen = false;
         this.enabledTargets = 'local';
         this.firstOpen = true;
-        this.showClipboard = false;
         this.fullsizeModal = false;
 
         this.initialFileHandlingState = {target: '', path: ''};
@@ -71,7 +70,6 @@ export class FileSink extends ScopedElementsMixin(DBPLitElement) {
             activeTarget: {type: String, attribute: 'active-target'},
             firstOpen: {type: Boolean, attribute: false},
             nextcloudPath: {type: String, attribute: false},
-            showClipboard: { type: Boolean, attribute: 'show-clipboard' },
             fullsizeModal: { type: Boolean, attribute: 'fullsize-modal' },
 
             initialFileHandlingState: {type: Object, attribute: 'initial-file-handling-state'},
@@ -84,8 +82,6 @@ export class FileSink extends ScopedElementsMixin(DBPLitElement) {
         super.connectedCallback();
 
         this.updateComplete.then(() => {
-
-            console.log("initialFileHandlingState", this.initialFileHandlingState);
         });
     }
 
@@ -137,10 +133,12 @@ export class FileSink extends ScopedElementsMixin(DBPLitElement) {
                     break;
                 case "files":
                     if (this.files.length !== 0 && !this.isDialogOpen) {
-                        console.log("--------------", this.files);
                         this.openDialog();
-                        if (this.showClipboard && this.enabledTargets.includes("clipboard")) {
-                            this._("#clipboard-file-sink").filesToSave = this.files;
+                        if (this.enabledTargets.includes("clipboard")) {
+                            const clipboardSink = this._("#clipboard-file-sink");
+                            if (clipboardSink) {
+                                this._("#clipboard-file-sink").filesToSave = this.files;
+                            }
                         }
                     }
                     break;
@@ -198,6 +196,7 @@ export class FileSink extends ScopedElementsMixin(DBPLitElement) {
     }
 
     loadWebdavDirectory() {
+
         const filePicker = this._('#nextcloud-file-picker');
 
         if (filePicker && filePicker.webDavClient !== null) {
@@ -207,37 +206,35 @@ export class FileSink extends ScopedElementsMixin(DBPLitElement) {
 
     openDialog() {
         this.loadWebdavDirectory();
-        MicroModal.show(this._('#modal-picker'), {
-            disableScroll: true,
-            onClose: modal => { this.isDialogOpen = false; },
-        });
-
-        console.log("initialFileHandlingState", this.initialFileHandlingState);
+        const filePicker = this._('#modal-picker');
+        if (filePicker) {
+            MicroModal.show(filePicker, {
+                disableScroll: true,
+                onClose: modal => { this.isDialogOpen = false; },
+            });
+        }
 
         //check if default destination is set
         if (this.initialFileHandlingState.target !== '' && typeof this.initialFileHandlingState.target !== 'undefined'  && this.firstOpen) {
             this.activeTarget = this.initialFileHandlingState.target;
             this.nextcloudPath = this.initialFileHandlingState.path;
+
             const filePicker = this._('#nextcloud-file-picker');
 
             if (filePicker && filePicker.webDavClient !== null) {
                 filePicker.loadDirectory(this.initialFileHandlingState.path);
-                console.log("load default nextcloud sink", this.initialFileHandlingState.path);
             }
             this.firstOpen = false;
         }
     }
 
     closeDialog(e) {
-        console.log("close start");
         this.sendDestination();
         MicroModal.close(this._('#modal-picker'));
-        console.log("close end");
-
     }
 
     getClipboardHtml() {
-        if (this.enabledTargets.includes('clipboard') && this.showClipboard) {
+        if (this.enabledTargets.includes('clipboard')) {
             return html`
                 <dbp-clipboard 
                    id="clipboard-file-sink"
@@ -323,7 +320,6 @@ export class FileSink extends ScopedElementsMixin(DBPLitElement) {
     }
 
     render() {
-        const isClipboardHidden = !this.showClipboard;
 
         return html`
             <vpu-notification lang="de" client-id="my-client-id"></vpu-notification>
@@ -345,7 +341,7 @@ export class FileSink extends ScopedElementsMixin(DBPLitElement) {
                             </div>
                             <div title="Clipboard"
                                  @click="${() => { this.activeTarget = "clipboard"; }}"
-                                 class="${classMap({"active": this.activeTarget === "clipboard", hidden: (!this.hasEnabledDestination("clipboard") || isClipboardHidden) })}">
+                                 class="${classMap({"active": this.activeTarget === "clipboard", hidden: (!this.hasEnabledDestination("clipboard")) })}">
                                 <dbp-icon class="nav-icon" name="clipboard"></dbp-icon>
                                 <p>Clipboard</p>
                             </div>
@@ -374,7 +370,7 @@ export class FileSink extends ScopedElementsMixin(DBPLitElement) {
                             <div class="source-main ${classMap({"hidden": this.activeTarget !== "nextcloud" || this.nextcloudWebDavUrl === "" || this.nextcloudAuthUrl === ""})}">
                                 ${this.getNextcloudHtml()}
                             </div>
-                            <div class="source-main ${classMap({"hidden": this.activeTarget !== "clipboard" || isClipboardHidden})}">
+                            <div class="source-main ${classMap({"hidden": this.activeTarget !== "clipboard"})}">
                                 ${this.getClipboardHtml()}
                             </div>
                         </main>
diff --git a/packages/file-handling/src/file-source.js b/packages/file-handling/src/file-source.js
index 963fae08..2c155dc5 100644
--- a/packages/file-handling/src/file-source.js
+++ b/packages/file-handling/src/file-source.js
@@ -54,7 +54,6 @@ export class FileSource extends ScopedElementsMixin(DBPLitElement) {
         this.activeTarget = 'local';
         this.isDialogOpen = false;
         this.firstOpen = true;
-        this.showClipboard = false;
 
         this.initialFileHandlingState = {target: '', path: ''};
 
@@ -90,7 +89,6 @@ export class FileSource extends ScopedElementsMixin(DBPLitElement) {
             decompressZip: { type: Boolean, attribute: 'decompress-zip' },
             activeTarget: { type: String, attribute: 'active-target' },
             isDialogOpen: { type: Boolean, attribute: 'dialog-open' },
-            showClipboard: { type: Boolean, attribute: 'show-clipboard' },
 
             initialFileHandlingState: {type: Object, attribute: 'initial-file-handling-state'},
         };
@@ -366,7 +364,6 @@ export class FileSource extends ScopedElementsMixin(DBPLitElement) {
 
     loadWebdavDirectory() {
         const filePicker = this._('#nextcloud-file-picker');
-
         // check if element is already in the dom (for example if "dialog-open" attribute is set)
         if (filePicker && filePicker.webDavClient !== null) {
             filePicker.loadDirectory(filePicker.directoryPath);
@@ -378,7 +375,7 @@ export class FileSource extends ScopedElementsMixin(DBPLitElement) {
             this.loadWebdavDirectory();
         }
 
-        if (this.enabledTargets.includes('clipboard') && this.showClipboard) {
+        if (this.enabledTargets.includes('clipboard') && this._("#clipboard-file-picker")) {
             this._("#clipboard-file-picker").generateClipboardTable();
             this._("#clipboard-file-picker").showSelectAllButton = true;
         }
@@ -391,6 +388,7 @@ export class FileSource extends ScopedElementsMixin(DBPLitElement) {
                 disableScroll: true,
                 onClose: modal => {
                     this.isDialogOpen = false;
+
                     const filePicker = this._('#nextcloud-file-picker');
 
                     if (filePicker) {
@@ -426,7 +424,7 @@ export class FileSource extends ScopedElementsMixin(DBPLitElement) {
     }
 
     getClipboardHtml() {
-        if (this.enabledTargets.includes('clipboard') && this.showClipboard) {
+        if (this.enabledTargets.includes('clipboard')) {
             return html`
                 <dbp-clipboard 
                    id="clipboard-file-picker"
@@ -519,7 +517,6 @@ export class FileSource extends ScopedElementsMixin(DBPLitElement) {
 
     render() {
         let allowedMimeTypes = this.allowedMimeTypes;
-        const isClipboardHidden = !this.showClipboard;
 
         if (this.decompressZip && this.allowedMimeTypes !== "*/*") {
             allowedMimeTypes += ",application/zip,application/x-zip-compressed";
@@ -550,7 +547,7 @@ export class FileSource extends ScopedElementsMixin(DBPLitElement) {
                             </div>
                             <div title="Clipboard"
                                  @click="${() => { this.activeTarget = "clipboard"; }}"
-                                 class="${classMap({"active": this.activeTarget === "clipboard", hidden: !this.hasEnabledSource("clipboard") || isClipboardHidden })}">
+                                 class="${classMap({"active": this.activeTarget === "clipboard", hidden: !this.hasEnabledSource("clipboard") })}">
                                 <dbp-icon class="nav-icon" name="clipboard"></dbp-icon>
                                 <p>Clipboard</p>
                             </div>
@@ -584,7 +581,7 @@ export class FileSource extends ScopedElementsMixin(DBPLitElement) {
                             <div class="source-main ${classMap({"hidden": this.activeTarget !== "nextcloud" || this.nextcloudWebDavUrl === "" || this.nextcloudAuthUrl === ""})}">
                                 ${this.getNextcloudHtml()}
                             </div>
-                            <div class="source-main ${classMap({"hidden": (this.activeTarget !== "clipboard" || isClipboardHidden)})}">
+                            <div class="source-main ${classMap({"hidden": (this.activeTarget !== "clipboard")})}">
                                 ${this.getClipboardHtml()}
                             </div>
                         </main>
-- 
GitLab