WikiNavigation, rename/delete

This commit is contained in:
José David Guillén 2022-03-29 22:24:32 +00:00
parent 296ad3a2ce
commit 7365248bf3
4 changed files with 86 additions and 43 deletions

View File

@ -1,8 +1,9 @@
'use strict'; 'use strict';
class WikiDropdownHelper { class WikiDropdownHelper {
constructor(element) { constructor(element, onChange) {
this.dd = element; this.dd = element;
this.dd.addEventListener('change', e=>onChange(+e.target.value||0));
} }
clear() { clear() {
while (this.dd.hasChildNodes()) { while (this.dd.hasChildNodes()) {
@ -20,18 +21,26 @@ class WikiDropdownHelper {
} }
return this; return this;
} }
rename(value, text) { delete(value) {
this.dd.querySelector(`option[value="${value}"]`).innerHTML=text; 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; return this;
} }
get() { get() {
return { return {
text:this.dd.parentElement.value, text:this.dd.options[this.dd.selectedIndex].innerHTML,
value:this.dd.parentElement.text value:this.dd.value
}; };
} }
set(value) { set(value) {
this.dd.parentElement.value=value; this.dd.parentElement.value=value;
// this.onSelectWiki(value); // this.onSelectWiki(value);
return this;
} }
} }

View File

@ -10,23 +10,54 @@ class WikiNavigation {
this.onSelectWiki = onSelectWiki; this.onSelectWiki = onSelectWiki;
let wikiSelector = container.getElementsByTagName('select')[0]; let wikiSelector = container.getElementsByTagName('select')[0];
this.dd = new WikiDropdownHelper(wikiSelector);
wikiSelector.addEventListener('change', e=>{ let appNavigationMenu = container.getElementsByClassName('app-navigation-entry-menu')[0];
if(self.onSelectWiki) { let menuEntry = {
self.onSelectWiki(+e.target.value||0); 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(); this.loadWikis();
// Popup menu // Popup menu
let appNavigationMenu = container.getElementsByClassName('app-navigation-entry-menu')[0];
let button = container.querySelector('.app-navigation-entry-utils-menu-button button'); let button = container.querySelector('.app-navigation-entry-utils-menu-button button');
button.addEventListener('click', ()=>appNavigationMenu.classList.toggle("open") ); button.addEventListener('click', ()=>appNavigationMenu.classList.toggle("open") );
document.addEventListener('click', e=>{if(e.target!==button)appNavigationMenu.classList.remove("open");}) document.addEventListener('click', e=>{if(e.target!==button)appNavigationMenu.classList.remove("open");})
appNavigationMenu.querySelector('[data-id="add"]').addEventListener('click', ()=>self.wikiChooseFolder() ); menuEntry.add.addEventListener('click', ()=>self.wikiChooseFolder() );
appNavigationMenu.querySelector('[data-id="rename"]').addEventListener('click', ()=>self.wikiRename() ); menuEntry.rename.addEventListener('click', ()=>self.wikiRename() );
appNavigationMenu.querySelector('[data-id="delete"]').addEventListener('click', ()=>self.wikiDelete() ); 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() { wikiRename() {
@ -41,13 +72,13 @@ class WikiNavigation {
let wiki = self.dd.get(); let wiki = self.dd.get();
var baseUrl = OC.generateUrl('/apps/mywiki/wikis'); var baseUrl = OC.generateUrl('/apps/mywiki/wikis');
$.ajax({ $.ajax({
url: baseUrl, url: baseUrl+'/'+wiki.value,
type: 'PUT', type: 'PUT',
contentType: 'application/json', contentType: 'application/json',
data: JSON.stringify({id:wiki.value, title:value}) data: JSON.stringify({title:value})
}).done(function (response) { }).done(function (response) {
console.info('JDG :: Wiki renamed', response); console.info('JDG :: Wiki renamed', response);
// ToDo :: Rename in the dropdown self.dd.rename(response.id, response.title);
}).fail(function (response, code) { }).fail(function (response, code) {
OC.dialogs.alert('Error', t(appName,'Error renaming wiki')); OC.dialogs.alert('Error', t(appName,'Error renaming wiki'));
console.error('JDG :: Error renaming wiki', response); console.error('JDG :: Error renaming wiki', response);
@ -56,7 +87,7 @@ class WikiNavigation {
} }
}, },
false, false,
t(appName, 'New name:'), t(appName, 'New name'),
false false
); );
} }

View File

@ -60,16 +60,10 @@ class WikiHelper {
return $this; return $this;
} }
private function isWiki() :bool { private function isWikiable() :bool {
return $this->wikiFolder && $this->wikiFolder->getType() == \OCP\Files\Node::TYPE_FOLDER; 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 { public function getWikiData(): ?array {
try { try {
@ -96,24 +90,33 @@ class WikiHelper {
return true; return true;
} }
public function initWiki(string $folderPath, string $title) :?int { public function createWikiData(): array {
$this->wikiFolder = $this->userFolder->get($folderPath); $wiki = [
if ( !$this->isWiki() ) { "title"=>$this->wikiFolder->getName(),
return null; "folderId"=>$this->wikiFolder->getId(),
"pages"=>[]
];
$wiki['pages'] = $this->rebuildWikiTree();
return $wiki;
} }
$folderId = $this->wikiFolder->getId(); 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->isWikiable() ) {
return null;
}
if ( $this->getWikiData() === null ) { if ( $this->getWikiData() === null ) {
$wiki = [ if ( $this->rebuildWiki($title) === null ) {
"title"=>$title,
"folderId"=>$folderId,
"pages"=>$this->rebuildWikiTree()
];
if ( !$this->setWikiData($wiki) ) {
return null; return null;
} }
} }
return $folderId; return $this->wikiFolder->getId();
} }
public function add(int $parentId, string $title) { public function add(int $parentId, string $title) {

View File

@ -13,20 +13,20 @@
<li> <li>
<a href="#" data-id="add"> <a href="#" data-id="add">
<span class="icon-add"></span> <span class="icon-add"></span>
<span>Add</span> <span>Add Wiki</span>
</a> </a>
</li> </li>
<li> <li>
<a href="#" data-id="rename"> <button disabled data-id="rename">
<span class="icon-rename"></span> <span class="icon-rename"></span>
<span>Edit</span> <span>Rename Wiki</span>
</a> </button>
</li> </li>
<li> <li>
<a href="#" data-id="delete"> <button disabled data-id="delete">
<span class="icon-delete"></span> <span class="icon-delete"></span>
<span>Remove</span> <span>Delete Wiki</span>
</a> </button>
</li> </li>
</ul> </ul>
</div> </div>