From 7365248bf3333cccd2c739ad8d4df7ba8a86ebf1 Mon Sep 17 00:00:00 2001 From: jdg Date: Tue, 29 Mar 2022 22:24:32 +0000 Subject: [PATCH] WikiNavigation, rename/delete --- js/WikiDropdownHelper.js | 19 ++++++++--- js/WikiNavigation.js | 59 ++++++++++++++++++++++++++-------- lib/Helper/WikiHelper.php | 37 +++++++++++---------- templates/navigation/index.php | 14 ++++---- 4 files changed, 86 insertions(+), 43 deletions(-) diff --git a/js/WikiDropdownHelper.js b/js/WikiDropdownHelper.js index fc19fc4..495b508 100644 --- a/js/WikiDropdownHelper.js +++ b/js/WikiDropdownHelper.js @@ -1,8 +1,9 @@ 'use strict'; class WikiDropdownHelper { - constructor(element) { + constructor(element, onChange) { this.dd = element; + this.dd.addEventListener('change', e=>onChange(+e.target.value||0)); } clear() { while (this.dd.hasChildNodes()) { @@ -20,18 +21,26 @@ class WikiDropdownHelper { } return this; } - rename(value, text) { - this.dd.querySelector(`option[value="${value}"]`).innerHTML=text; + delete(value) { + let index = Array.from(this.dd.options).findIndex(option=>option.value==value); + if (index>0) { + this.dd.remove(index); + } + return this; + } + rename(value, newText) { + this.dd.querySelector(`option[value="${value}"]`).innerHTML=newText; return this; } get() { return { - text:this.dd.parentElement.value, - value:this.dd.parentElement.text + text:this.dd.options[this.dd.selectedIndex].innerHTML, + value:this.dd.value }; } set(value) { this.dd.parentElement.value=value; // this.onSelectWiki(value); + return this; } } \ No newline at end of file diff --git a/js/WikiNavigation.js b/js/WikiNavigation.js index 028d94f..3547ef6 100644 --- a/js/WikiNavigation.js +++ b/js/WikiNavigation.js @@ -10,23 +10,54 @@ class WikiNavigation { this.onSelectWiki = onSelectWiki; let wikiSelector = container.getElementsByTagName('select')[0]; - this.dd = new WikiDropdownHelper(wikiSelector); - wikiSelector.addEventListener('change', e=>{ - if(self.onSelectWiki) { - self.onSelectWiki(+e.target.value||0); - } - }); + + let appNavigationMenu = container.getElementsByClassName('app-navigation-entry-menu')[0]; + let menuEntry = { + add:appNavigationMenu.querySelector('[data-id="add"]'), + rename:appNavigationMenu.querySelector('[data-id="rename"]'), + delete:appNavigationMenu.querySelector('[data-id="delete"]') + }; + this.dd = new WikiDropdownHelper(wikiSelector, id=>{ + menuEntry.rename.disabled = (id==0); + menuEntry.delete.disabled = (id==0); + self.onSelectWiki(id); + } ); this.loadWikis(); // Popup menu - let appNavigationMenu = container.getElementsByClassName('app-navigation-entry-menu')[0]; let button = container.querySelector('.app-navigation-entry-utils-menu-button button'); button.addEventListener('click', ()=>appNavigationMenu.classList.toggle("open") ); document.addEventListener('click', e=>{if(e.target!==button)appNavigationMenu.classList.remove("open");}) - appNavigationMenu.querySelector('[data-id="add"]').addEventListener('click', ()=>self.wikiChooseFolder() ); - appNavigationMenu.querySelector('[data-id="rename"]').addEventListener('click', ()=>self.wikiRename() ); - appNavigationMenu.querySelector('[data-id="delete"]').addEventListener('click', ()=>self.wikiDelete() ); + menuEntry.add.addEventListener('click', ()=>self.wikiChooseFolder() ); + menuEntry.rename.addEventListener('click', ()=>self.wikiRename() ); + menuEntry.delete.addEventListener('click', ()=>self.wikiDelete() ); + } + + wikiDelete() { + let self=this; + let wiki = this.dd.get(); + OC.dialogs.confirm( t(appName, 'Delete the wiki {text}?', wiki), + t(appName, 'Delete Wiki'), + (ok)=>{ + if ( ok ) { + var baseUrl = OC.generateUrl('/apps/mywiki/wikis'); + $.ajax({ + url: baseUrl+'/'+wiki.value, + type: 'DELETE', + contentType: 'application/json', + data: JSON.stringify({removeFiles:false}) + }).done(function (response) { + console.info('JDG :: Wiki deleted', response); + self.dd.set('').delete(wiki.value); + }).fail(function (response, code) { + OC.dialogs.alert('Error', t(appName,'Error deleting wiki {text}', wiki)); + console.error('JDG :: Error deleting wiki', response); + }); + } + }, + false + ); } wikiRename() { @@ -41,13 +72,13 @@ class WikiNavigation { let wiki = self.dd.get(); var baseUrl = OC.generateUrl('/apps/mywiki/wikis'); $.ajax({ - url: baseUrl, + url: baseUrl+'/'+wiki.value, type: 'PUT', contentType: 'application/json', - data: JSON.stringify({id:wiki.value, title:value}) + data: JSON.stringify({title:value}) }).done(function (response) { console.info('JDG :: Wiki renamed', response); - // ToDo :: Rename in the dropdown + self.dd.rename(response.id, response.title); }).fail(function (response, code) { OC.dialogs.alert('Error', t(appName,'Error renaming wiki')); console.error('JDG :: Error renaming wiki', response); @@ -56,7 +87,7 @@ class WikiNavigation { } }, false, - t(appName, 'New name:'), + t(appName, 'New name'), false ); } diff --git a/lib/Helper/WikiHelper.php b/lib/Helper/WikiHelper.php index a77e721..366937e 100644 --- a/lib/Helper/WikiHelper.php +++ b/lib/Helper/WikiHelper.php @@ -60,16 +60,10 @@ class WikiHelper { return $this; } - private function isWiki() :bool { + private function isWikiable() :bool { return $this->wikiFolder && $this->wikiFolder->getType() == \OCP\Files\Node::TYPE_FOLDER; } - public function reloadWikiTree(): array { - $wiki = $this->getWikiData(); - $wiki['pages'] = $this->rebuildWikiTree(); - $this->setWikiData($wiki); - return $wiki; - } public function getWikiData(): ?array { try { @@ -96,24 +90,33 @@ class WikiHelper { return true; } + public function createWikiData(): array { + $wiki = [ + "title"=>$this->wikiFolder->getName(), + "folderId"=>$this->wikiFolder->getId(), + "pages"=>[] + ]; + $wiki['pages'] = $this->rebuildWikiTree(); + return $wiki; + } + + public function rebuildWiki($title): ?array { + $wiki = $this->createWikiData(true); + $wiki['title'] = $title; + return $this->setWikiData($wiki) ? $wiki : null; + } + public function initWiki(string $folderPath, string $title) :?int { $this->wikiFolder = $this->userFolder->get($folderPath); - if ( !$this->isWiki() ) { + if ( !$this->isWikiable() ) { return null; } - - $folderId = $this->wikiFolder->getId(); if ( $this->getWikiData() === null ) { - $wiki = [ - "title"=>$title, - "folderId"=>$folderId, - "pages"=>$this->rebuildWikiTree() - ]; - if ( !$this->setWikiData($wiki) ) { + if ( $this->rebuildWiki($title) === null ) { return null; } } - return $folderId; + return $this->wikiFolder->getId(); } public function add(int $parentId, string $title) { diff --git a/templates/navigation/index.php b/templates/navigation/index.php index b14f4c5..50181ec 100644 --- a/templates/navigation/index.php +++ b/templates/navigation/index.php @@ -13,20 +13,20 @@
  • - Add + Add Wiki
  • - +
  • - +