WikiNavigation, rename/delete
This commit is contained in:
		@ -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;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -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
 | 
				
			||||||
                        );
 | 
					                        );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -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 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 {
 | 
					    public function initWiki(string $folderPath, string $title) :?int {
 | 
				
			||||||
        $this->wikiFolder = $this->userFolder->get($folderPath);
 | 
					        $this->wikiFolder = $this->userFolder->get($folderPath);
 | 
				
			||||||
        if ( !$this->isWiki() ) {
 | 
					        if ( !$this->isWikiable() ) {
 | 
				
			||||||
            return null;
 | 
					            return null;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        $folderId = $this->wikiFolder->getId();
 | 
					 | 
				
			||||||
        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) {
 | 
				
			||||||
 | 
				
			|||||||
@ -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>	
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user