From dc745e91da285e831e33bd00b355f12a56650c44 Mon Sep 17 00:00:00 2001 From: jdg Date: Wed, 13 Apr 2022 22:54:23 +0000 Subject: [PATCH] WikiPages controls --- appinfo/routes.php | 3 +- js/WikiDropdownHelper.js | 20 ++++++++----- js/WikiNavigation.js | 29 +++++++++--------- js/script.js | 55 +++++++++++++++++----------------- lib/Db/WikiMapper.php | 6 ++-- lib/Helper/WikiHelper.php | 43 +++++++++++++++++--------- lib/Service/WikiService.php | 5 ++-- templates/index.php | 1 + templates/navigation/index.php | 18 ++++------- 9 files changed, 99 insertions(+), 81 deletions(-) diff --git a/appinfo/routes.php b/appinfo/routes.php index 20e7aee..9a59ae4 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -9,7 +9,8 @@ */ return [ 'resources' => [ - 'wiki' => ['url' => '/wikis'] + 'wiki' => ['url' => '/wikis'], + 'wikiPage' => ['url' => '/wiki/{wikiId}'] ], 'routes' => [ ['name' => 'page#index', 'url' => '/', 'verb' => 'GET'], diff --git a/js/WikiDropdownHelper.js b/js/WikiDropdownHelper.js index 495b508..9dc5c45 100644 --- a/js/WikiDropdownHelper.js +++ b/js/WikiDropdownHelper.js @@ -2,6 +2,7 @@ class WikiDropdownHelper { constructor(element, onChange) { + this.onSelectWiki = onChange; this.dd = element; this.dd.addEventListener('change', e=>onChange(+e.target.value||0)); } @@ -12,17 +13,22 @@ class WikiDropdownHelper { return this; } add(text, value, set=false) { - var option = document.createElement("option"); - option.text = text; - option.value = value; - this.dd.appendChild(option); + if (this.find(value)<=0) { + var option = document.createElement("option"); + option.text = text; + option.value = value; + this.dd.appendChild(option); + } if ( set ) { this.set(value); } return this; } + find(value) { + return Array.from(this.dd.options).findIndex(option=>option.value==value); + } delete(value) { - let index = Array.from(this.dd.options).findIndex(option=>option.value==value); + let index = this.find(value); if (index>0) { this.dd.remove(index); } @@ -39,8 +45,8 @@ class WikiDropdownHelper { }; } set(value) { - this.dd.parentElement.value=value; - // this.onSelectWiki(value); + this.dd.value=value; + this.onSelectWiki(value); return this; } } \ No newline at end of file diff --git a/js/WikiNavigation.js b/js/WikiNavigation.js index 3547ef6..a6395b3 100644 --- a/js/WikiNavigation.js +++ b/js/WikiNavigation.js @@ -4,31 +4,30 @@ class WikiNavigation { dd = null; onSelectWiki = null; - constructor(container, onSelectWiki){ + constructor(container, onSelectWiki, onClickAddPage){ let self = this; this.container = container; this.onSelectWiki = onSelectWiki; + this.onClickAddPage = onClickAddPage; let wikiSelector = container.getElementsByTagName('select')[0]; let appNavigationMenu = container.getElementsByClassName('app-navigation-entry-menu')[0]; let menuEntry = { + addPage:appNavigationMenu.querySelector('[data-id="addPage"]'), 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.addPage.disabled = (id==0); menuEntry.rename.disabled = (id==0); menuEntry.delete.disabled = (id==0); self.onSelectWiki(id); } ); this.loadWikis(); - // Popup menu - 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");}) - + menuEntry.addPage.addEventListener('click', e=>self.onClickAddPage(e) ); menuEntry.add.addEventListener('click', ()=>self.wikiChooseFolder() ); menuEntry.rename.addEventListener('click', ()=>self.wikiRename() ); menuEntry.delete.addEventListener('click', ()=>self.wikiDelete() ); @@ -48,11 +47,11 @@ class WikiNavigation { contentType: 'application/json', data: JSON.stringify({removeFiles:false}) }).done(function (response) { - console.info('JDG :: Wiki deleted', response); + console.info('JDG :: WikiNavigation.wikiDelete()', 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); + console.error('JDG :: WikiNavigation.wikiDelete()', response); }); } }, @@ -61,7 +60,7 @@ class WikiNavigation { } wikiRename() { - let self=this; + const self=this; OC.dialogs.prompt( t(appName, 'This allow you to rename the displayed name for the selected wiki. (The folder will remain unchanged)'), t(appName, 'Rename Wiki'), @@ -77,11 +76,11 @@ class WikiNavigation { contentType: 'application/json', data: JSON.stringify({title:value}) }).done(function (response) { - console.info('JDG :: Wiki renamed', response); + console.info('JDG :: WikiNavigation.wikiRename()', response); 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); + console.error('JDG :: WikiNavigation.wikiRename()', response); }); } } @@ -103,12 +102,12 @@ class WikiNavigation { type: 'GET', contentType: 'application/json' }).done(function (response) { - console.info('JDG :: Wikis loaded', response); + console.info('JDG :: WikiNavigation.loadWikis()', response); self.dd.clear().add('',''); response.forEach( x=>self.dd.add(x.title, x.id) ); }).fail(function (response, code) { OC.dialogs.alert('Error', t(appName,'Error getting the list of wikis')); - console.error('JDG :: Error getting the wikis', response); + console.error('JDG :: WikiNavigation.loadWikis()', response); self.dd.clear(); }); } @@ -142,13 +141,13 @@ class WikiNavigation { data: JSON.stringify({title:title, folderPath:folderPath}), contentType: 'application/json' }).done(function (response) { - console.info('JDG :: wikiAdd :: Wiki added', response); + console.info('JDG :: WikiNavigation.wikiAdd("'+folderPath+'","'+title+'")', response); if ( response.id>0 ) { self.dd.add(response.title, response.id, true); } }).fail(function (response, code) { OC.dialogs.alert('Error', t(appName,'It has not been possible to add the new wiki')); - console.error('JDG :: wikiAdd :: Error adding the wiki', response); + console.error('JDG :: WikiNavigation.wikiAdd("'+folderPath+'","'+title+'")', response); }); } } \ No newline at end of file diff --git a/js/script.js b/js/script.js index 68392dd..23394d0 100644 --- a/js/script.js +++ b/js/script.js @@ -1,26 +1,6 @@ const appName = 'MyWiki'; -class WikiPages { - constructor(container){ - this.wikiId = null; - } - load(wikiId) { - console.info('JDG :: Loading wiki', wikiId ); - this.wikiId = wikiId; - } - getWikiId() { - return this.wikiId; - } - add(parentPageId, title) { - } - delete() { - - } - rename() { - - } -} class WikiEditor { load(wikiId, wikiPageId) { console.info(`JDG :: Loading Wiki ${wikiId}/${wikiPageId}`); @@ -33,14 +13,35 @@ var MyWiki = MyWiki || {}; (function(window, $, exports, undefined) { 'use strict'; - let wikiNavigation = new WikiNavigation(document.querySelector('li[data-id="wikis"]'), onSelectWiki); - let wikiPages = new WikiPages(document.querySelector('li[data-id="pages"]'), onSelectWikiPage); - function onSelectWiki(wikiId) { - console.info(`JDG :: WikiList selected ${wikiId}` ); - if ( wikiId > 0 ) { - wikiPages.load(wikiId); - } + // Navigation menu -------------------------------- + function appNavigationEntryMenuClose() { + document.querySelectorAll('.app-navigation-entry-menu').forEach(e=>e.classList.remove("open")); } + document.addEventListener('click', e=>{ + if (e.target.tagName === 'BUTTON' ) { + const li = e.target.parentNode?.parentNode?.closest('li'); + if (!li) return; + const menu = li.querySelector(".app-navigation-entry-menu"); + if (!menu) return; + if ( menu.classList.contains("open") ) { + menu.classList.remove("open"); + } else { + appNavigationEntryMenuClose(); + menu.classList.add("open"); + } + return; + } + appNavigationEntryMenuClose(); + }) + // ------------------------------------------------ + + + let wikiPages = new WikiPages(document.querySelector('li[data-id="pages"]').parentNode, onSelectWikiPage); + let wikiNavigation = new WikiNavigation(document.querySelector('li[data-id="wikis"]'), + wikiId => wikiPages.load(wikiId), + e=>wikiPages.onClickAdd(e) + ); + function onSelectWikiPage(wikiPageId) { console.info(`JDG :: WikiPage selected ${wikiPageId}` ); if ( wikiPageId > 0 ) { diff --git a/lib/Db/WikiMapper.php b/lib/Db/WikiMapper.php index 55090c2..d0aaf7a 100644 --- a/lib/Db/WikiMapper.php +++ b/lib/Db/WikiMapper.php @@ -34,7 +34,7 @@ class WikiMapper extends QBMapper { return $this->findEntity($qb); } - public function findAll(string $userId, mixed $filter=null) { + public function findAll(string $userId, ?array $filter=null) { $qb = $this->db->getQueryBuilder(); $qb->select('*') @@ -46,12 +46,12 @@ class WikiMapper extends QBMapper { if ($filter) { if (array_key_exists('title',$filter) ) { $qb->where( - $qb->expr()->eq('title', $qb->createNamedParameter($id)) + $qb->expr()->eq('title', $qb->createNamedParameter($filter['title'])) ); } if (array_key_exists('fileId',$filter) ) { $qb->where( - $qb->expr()->eq('fileId', $qb->createNamedParameter($id)) + $qb->expr()->eq('file_id', $qb->createNamedParameter($filter['fileId'])) ); } } diff --git a/lib/Helper/WikiHelper.php b/lib/Helper/WikiHelper.php index 366937e..780fe95 100644 --- a/lib/Helper/WikiHelper.php +++ b/lib/Helper/WikiHelper.php @@ -106,7 +106,7 @@ class WikiHelper { return $this->setWikiData($wiki) ? $wiki : null; } - public function initWiki(string $folderPath, string $title) :?int { + public function create(string $folderPath, string $title) :?int { $this->wikiFolder = $this->userFolder->get($folderPath); if ( !$this->isWikiable() ) { return null; @@ -119,21 +119,36 @@ class WikiHelper { return $this->wikiFolder->getId(); } - public function add(int $parentId, string $title) { -// $folder = ...newFolder($path) + public function add(int $parentId, string $title, ?string $content) :int { + if ($parentId>0) { + $parentFolder = $this->getFolderById($parentId); + } else { + $parentFolder = $this->wikiFolder; + } + try { + $folder = $parentFolder->newFolder($this->sanitize_file_name($title)); -$wikiData = $this->getWikiData(); -if ($wikiData) { - $wikiTree = new WikiTree($wikiData['pages']); - $wikiPage = new WikiTreePage(); - $wikiPage->id = $id; - $wikiPage->pid = $parentId; - $wikiPage->title = $title; - $wikiTree->set($wikiPage); - $wikiData['pages'] = $wikiTree->getWikiPages(); - $this->setWikiData($wikiData); -} + $wikiTreePage = new WikiTreePage(); + $wikiTreePage->id = $folder->getId(); + $wikiTreePage->pid = $parentId; + $wikiTreePage->title = $title; + $wikiTreePage->sort = 0; + if ( !is_null($content) ) { + $this->update($wikiTreePage->id, $content); + } + + $wikiData = $this->getWikiData(); + if ($wikiData) { + $wikiTree = new WikiTree($wikiData['pages']); + $wikiTree->set($wikiTreePage); + $wikiData['pages'] = $wikiTree->getWikiPages(); + $this->setWikiData($wikiData); + } + } catch(\Exception $ex) { + return -1; + } + return $wikiTreePage->id; } public function update(int $id, string $content) { diff --git a/lib/Service/WikiService.php b/lib/Service/WikiService.php index 6376bdf..e38ec61 100644 --- a/lib/Service/WikiService.php +++ b/lib/Service/WikiService.php @@ -58,7 +58,7 @@ class WikiService { } public function create(string $folderPath, string $title, string $userId) { - $folderId = $this->wikiHelper->initWiki($folderPath, $title); + $folderId = $this->wikiHelper->create($folderPath, $title); if ( $folderId === null ) { throw new ReadOnlyException('Error creating wiki'); } @@ -79,7 +79,8 @@ class WikiService { try { $wiki = $this->mapper->find($id, $userId); $wiki->setTitle($title); - return $this->mapper->update($wiki); + $res = $this->mapper->update($wiki); + return $res; } catch(Exception $e) { $this->handleException($e); } diff --git a/templates/index.php b/templates/index.php index c6f2d53..6a3e99f 100644 --- a/templates/index.php +++ b/templates/index.php @@ -1,6 +1,7 @@ diff --git a/templates/navigation/index.php b/templates/navigation/index.php index 50181ec..d1ee0be 100644 --- a/templates/navigation/index.php +++ b/templates/navigation/index.php @@ -11,22 +11,16 @@