diff --git a/storage/d4s-storage.js b/storage/d4s-storage.js index 618b3f8..a384523 100644 --- a/storage/d4s-storage.js +++ b/storage/d4s-storage.js @@ -15,11 +15,11 @@ class D4SStorageHtmlElement extends HTMLElement { this.attachShadow({mode: 'open'}) } - static appendBootstrapStylesheets(root) { + connectedCallback() { let linkElem = document.createElement('link'); linkElem.setAttribute('rel', 'stylesheet'); linkElem.setAttribute('href', 'https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css'); - root.appendChild(linkElem); + this.shadowRoot.appendChild(linkElem); } get srcBaseURL() { @@ -28,7 +28,7 @@ class D4SStorageHtmlElement extends HTMLElement { } -class D4SStorageToolbar extends HTMLElement { +class D4SStorageToolbar extends D4SStorageHtmlElement { static toolbar_event_name = "d4s-toolbar"; @@ -43,21 +43,20 @@ class D4SStorageToolbar extends HTMLElement { constructor() { super() - this.attachShadow({mode: 'open'}) } connectedCallback() { - D4SStorageHtmlElement.appendBootstrapStylesheets(this.shadowRoot); + super.connectedCallback(); var div = document.createElement('div'); div.innerHTML = /*html*/`
- Refresh folder contents - Create new folder - Delete folder - Download folder as ZIP - Upload file - Upload archive + Refresh folder contents + Create new folder + Delete folder + Download folder as ZIP + Upload file + Upload archive
`; div.querySelector("#refresh").addEventListener('click', (ev) => { ev.stopPropagation(); @@ -88,7 +87,7 @@ class D4SStorageToolbar extends HTMLElement { actionPerformed(action) { this.#last_action = action; - this.dispatchEvent(new CustomEvent(D4SStorageToolbar.toolbar_event_name, {detail: action})); + this.dispatchEvent(new CustomEvent(D4SStorageToolbar.toolbar_event_name, {detail: {action: action}})); } get lastAction() { @@ -147,14 +146,16 @@ class D4SStorageTree extends D4SStorageHtmlElement { return this.#currentid; } - setFolderItems(id, items) { + setFolderItems(id, items, fireEvent = true) { this.#foldersMap[id] = items; - this.dispatchEvent( - new CustomEvent( - D4SStorageTree.folder_data_event_name, - {detail: id} - ) - ); + if (fireEvent) { + this.dispatchEvent( + new CustomEvent( + D4SStorageTree.folder_data_event_name, + {detail: {id: id}} + ) + ); + } } getFolderItems(id) { @@ -166,7 +167,7 @@ class D4SStorageTree extends D4SStorageHtmlElement { } connectedCallback() { - D4SStorageHtmlElement.appendBootstrapStylesheets(this.shadowRoot) + super.connectedCallback(); var div = document.createElement('div') div.innerHTML = /*css*/` @@ -197,7 +198,6 @@ class D4SStorageTree extends D4SStorageHtmlElement { this.parseItemsData(div, data); }).catch(err => console.error(err)) - this.addEventListener(D4SStorageTree.tree_event_name, this.localEventHandler); this.addEventListener(D4SStorageTree.folder_data_event_name, this.folderDataEventHandler); if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", this.registerOtherListeners.bind(this)); @@ -207,7 +207,6 @@ class D4SStorageTree extends D4SStorageHtmlElement { } disconnectedCallback() { - this.removeEventListener(D4SStorageTree.tree_event_name); this.removeEventListener(D4SStorageTree.folder_data_event_name); const toolbar = document.querySelector("d4s-storage-tool"); if (toolbar) toolbar.removeEventListener(D4SStorageToolbar.toolbar_event_name); @@ -222,18 +221,14 @@ class D4SStorageTree extends D4SStorageHtmlElement { if (folder) folder.addEventListener(D4SStorageFolder.selected_event_name, this.folderEventHandler.bind(this)); } - localEventHandler(event) { - this.select(event.detail); - } - folderDataEventHandler(event) { - if (event.detail === this.currentId) { + if (event.detail.id === this.currentId) { this.fillWithContent(this.shadowRoot.querySelector(`*[${D4SStorageTree.dataid_attr}='${this.currentId}']`)) } } toolbarEventHandler(event) { - switch (event.detail) { + switch (event.detail.action) { case D4SStorageToolbar.refresh_folder: if (this.currentId) { this.refreshFolder(this.currentId); @@ -278,7 +273,7 @@ class D4SStorageTree extends D4SStorageHtmlElement { file.click(); break; default: - console.error('Unexpected event action: ' + event.action); + console.error('Unexpected event action: ' + event.detail.action); break; } } @@ -314,11 +309,16 @@ class D4SStorageTree extends D4SStorageHtmlElement { } li.classList.add(this.#selectedClass) } - if (li.classList.contains(this.#loadedClass)) { - return + if (!li.classList.contains(this.#loadedClass)) { + this.fillWithContent(li); } - this.fillWithContent(li); + this.dispatchEvent( + new CustomEvent( + D4SStorageTree.tree_event_name, + {detail: {id: id}} + ) + ); } refreshContents(element) { @@ -330,8 +330,9 @@ class D4SStorageTree extends D4SStorageHtmlElement { fillWithContent(element) { const id = element.getAttribute(D4SStorageTree.dataid_attr); - if (this.#foldersMap[id]) { - this.parseItemsData(element, this.#foldersMap[id]); + const contents = this.getFolderItems(id); + if (contents) { + this.parseItemsData(element, contents); } else { this.d4sWorkspace.listFolder(id).then(data => { this.setFolderItems(id, data); @@ -372,13 +373,8 @@ class D4SStorageTree extends D4SStorageHtmlElement { li.addEventListener('click', (ev) => { ev.stopPropagation(); - this.dispatchEvent( - new CustomEvent( - D4SStorageTree.tree_event_name, - {detail: ev.currentTarget.getAttribute(D4SStorageTree.dataid_attr)} - ) - ); - }) + this.select(ev.currentTarget.getAttribute(D4SStorageTree.dataid_attr)); + }); return li; } @@ -418,8 +414,9 @@ class D4SStorageTree extends D4SStorageHtmlElement { refreshFolder(id) { const folder = this.shadowRoot.querySelector(`*[${D4SStorageTree.dataid_attr}='${id}']`); console.log("Refreshing folder: " + folder.getAttribute(D4SStorageTree.dataname_attr)); + this.setFolderItems(id, null, false); this.refreshContents(folder); - this.select(id); + // this.select(id); } createNewFolderIn(id) { @@ -489,7 +486,8 @@ class D4SStorageFolder extends D4SStorageHtmlElement { } connectedCallback() { - D4SStorageHtmlElement.appendBootstrapStylesheets(this.shadowRoot); + super.connectedCallback(); + const style = document.createElement('style') style.innerHTML = /*css*/` span { @@ -513,21 +511,30 @@ class D4SStorageFolder extends D4SStorageHtmlElement { disconnectedCallback() { const tree = document.querySelector("d4s-storage-tree"); if (tree) { - tree.removeEventListener(D4SStorageTree.tree_event_name); tree.removeEventListener(D4SStorageTree.folder_data_event_name); + tree.removeEventListener(D4SStorageTree.tree_event_name); } } registerOtherListeners(event) { const tree = document.querySelector("d4s-storage-tree"); if (tree) { - tree.addEventListener(D4SStorageTree.tree_event_name, this.treeEventHandler.bind(this)); tree.addEventListener(D4SStorageTree.folder_data_event_name, this.folderDataEventHandler.bind(this)); + tree.addEventListener(D4SStorageTree.tree_event_name, this.treeEventHandler.bind(this)); + } + } + + folderDataEventHandler(event) { + if (event.detail.id === event.target.currentId) { + const folderItems = event.target.getFolderItems(event.detail.id); + if (folderItems) { + this.parseItemsData(folderItems); + } } } treeEventHandler(event) { - const folderItems = event.target.getFolderItems(event.detail); + const folderItems = event.target.getFolderItems(event.detail.id); if (folderItems) { // It's first time folder is selected, data is stil not loaded, // they will be loaded by the folderDataEventHandler() function when available @@ -535,15 +542,6 @@ class D4SStorageFolder extends D4SStorageHtmlElement { } } - folderDataEventHandler(event) { - if (event.detail === event.target.currentId) { - const folderItems = event.target.getFolderItems(event.detail); - if (folderItems) { - this.parseItemsData(folderItems); - } - } - } - createContainer() { var div = document.createElement('div') div.classList.add('d4s-folder')