WikiPages controls

This commit is contained in:
José David Guillén 2022-04-13 22:54:23 +00:00
parent 7365248bf3
commit dc745e91da
9 changed files with 99 additions and 81 deletions

View File

@ -9,7 +9,8 @@
*/ */
return [ return [
'resources' => [ 'resources' => [
'wiki' => ['url' => '/wikis'] 'wiki' => ['url' => '/wikis'],
'wikiPage' => ['url' => '/wiki/{wikiId}']
], ],
'routes' => [ 'routes' => [
['name' => 'page#index', 'url' => '/', 'verb' => 'GET'], ['name' => 'page#index', 'url' => '/', 'verb' => 'GET'],

View File

@ -2,6 +2,7 @@
class WikiDropdownHelper { class WikiDropdownHelper {
constructor(element, onChange) { constructor(element, onChange) {
this.onSelectWiki = onChange;
this.dd = element; this.dd = element;
this.dd.addEventListener('change', e=>onChange(+e.target.value||0)); this.dd.addEventListener('change', e=>onChange(+e.target.value||0));
} }
@ -12,17 +13,22 @@ class WikiDropdownHelper {
return this; return this;
} }
add(text, value, set=false) { add(text, value, set=false) {
if (this.find(value)<=0) {
var option = document.createElement("option"); var option = document.createElement("option");
option.text = text; option.text = text;
option.value = value; option.value = value;
this.dd.appendChild(option); this.dd.appendChild(option);
}
if ( set ) { if ( set ) {
this.set(value); this.set(value);
} }
return this; return this;
} }
find(value) {
return Array.from(this.dd.options).findIndex(option=>option.value==value);
}
delete(value) { delete(value) {
let index = Array.from(this.dd.options).findIndex(option=>option.value==value); let index = this.find(value);
if (index>0) { if (index>0) {
this.dd.remove(index); this.dd.remove(index);
} }
@ -39,8 +45,8 @@ class WikiDropdownHelper {
}; };
} }
set(value) { set(value) {
this.dd.parentElement.value=value; this.dd.value=value;
// this.onSelectWiki(value); this.onSelectWiki(value);
return this; return this;
} }
} }

View File

@ -4,31 +4,30 @@ class WikiNavigation {
dd = null; dd = null;
onSelectWiki = null; onSelectWiki = null;
constructor(container, onSelectWiki){ constructor(container, onSelectWiki, onClickAddPage){
let self = this; let self = this;
this.container = container; this.container = container;
this.onSelectWiki = onSelectWiki; this.onSelectWiki = onSelectWiki;
this.onClickAddPage = onClickAddPage;
let wikiSelector = container.getElementsByTagName('select')[0]; let wikiSelector = container.getElementsByTagName('select')[0];
let appNavigationMenu = container.getElementsByClassName('app-navigation-entry-menu')[0]; let appNavigationMenu = container.getElementsByClassName('app-navigation-entry-menu')[0];
let menuEntry = { let menuEntry = {
addPage:appNavigationMenu.querySelector('[data-id="addPage"]'),
add:appNavigationMenu.querySelector('[data-id="add"]'), add:appNavigationMenu.querySelector('[data-id="add"]'),
rename:appNavigationMenu.querySelector('[data-id="rename"]'), rename:appNavigationMenu.querySelector('[data-id="rename"]'),
delete:appNavigationMenu.querySelector('[data-id="delete"]') delete:appNavigationMenu.querySelector('[data-id="delete"]')
}; };
this.dd = new WikiDropdownHelper(wikiSelector, id=>{ this.dd = new WikiDropdownHelper(wikiSelector, id=>{
menuEntry.addPage.disabled = (id==0);
menuEntry.rename.disabled = (id==0); menuEntry.rename.disabled = (id==0);
menuEntry.delete.disabled = (id==0); menuEntry.delete.disabled = (id==0);
self.onSelectWiki(id); self.onSelectWiki(id);
} ); } );
this.loadWikis(); this.loadWikis();
// Popup menu menuEntry.addPage.addEventListener('click', e=>self.onClickAddPage(e) );
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.add.addEventListener('click', ()=>self.wikiChooseFolder() ); menuEntry.add.addEventListener('click', ()=>self.wikiChooseFolder() );
menuEntry.rename.addEventListener('click', ()=>self.wikiRename() ); menuEntry.rename.addEventListener('click', ()=>self.wikiRename() );
menuEntry.delete.addEventListener('click', ()=>self.wikiDelete() ); menuEntry.delete.addEventListener('click', ()=>self.wikiDelete() );
@ -48,11 +47,11 @@ class WikiNavigation {
contentType: 'application/json', contentType: 'application/json',
data: JSON.stringify({removeFiles:false}) data: JSON.stringify({removeFiles:false})
}).done(function (response) { }).done(function (response) {
console.info('JDG :: Wiki deleted', response); console.info('JDG :: WikiNavigation.wikiDelete()', response);
self.dd.set('').delete(wiki.value); self.dd.set('').delete(wiki.value);
}).fail(function (response, code) { }).fail(function (response, code) {
OC.dialogs.alert('Error', t(appName,'Error deleting wiki {text}', wiki)); 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() { wikiRename() {
let self=this; const self=this;
OC.dialogs.prompt( OC.dialogs.prompt(
t(appName, 'This allow you to rename the displayed name for the selected wiki. (The folder will remain unchanged)'), t(appName, 'This allow you to rename the displayed name for the selected wiki. (The folder will remain unchanged)'),
t(appName, 'Rename Wiki'), t(appName, 'Rename Wiki'),
@ -77,11 +76,11 @@ class WikiNavigation {
contentType: 'application/json', contentType: 'application/json',
data: JSON.stringify({title:value}) data: JSON.stringify({title:value})
}).done(function (response) { }).done(function (response) {
console.info('JDG :: Wiki renamed', response); console.info('JDG :: WikiNavigation.wikiRename()', response);
self.dd.rename(response.id, response.title); 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 :: WikiNavigation.wikiRename()', response);
}); });
} }
} }
@ -103,12 +102,12 @@ class WikiNavigation {
type: 'GET', type: 'GET',
contentType: 'application/json' contentType: 'application/json'
}).done(function (response) { }).done(function (response) {
console.info('JDG :: Wikis loaded', response); console.info('JDG :: WikiNavigation.loadWikis()', response);
self.dd.clear().add('',''); self.dd.clear().add('','');
response.forEach( x=>self.dd.add(x.title, x.id) ); response.forEach( x=>self.dd.add(x.title, x.id) );
}).fail(function (response, code) { }).fail(function (response, code) {
OC.dialogs.alert('Error', t(appName,'Error getting the list of wikis')); 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(); self.dd.clear();
}); });
} }
@ -142,13 +141,13 @@ class WikiNavigation {
data: JSON.stringify({title:title, folderPath:folderPath}), data: JSON.stringify({title:title, folderPath:folderPath}),
contentType: 'application/json' contentType: 'application/json'
}).done(function (response) { }).done(function (response) {
console.info('JDG :: wikiAdd :: Wiki added', response); console.info('JDG :: WikiNavigation.wikiAdd("'+folderPath+'","'+title+'")', response);
if ( response.id>0 ) { if ( response.id>0 ) {
self.dd.add(response.title, response.id, true); self.dd.add(response.title, response.id, true);
} }
}).fail(function (response, code) { }).fail(function (response, code) {
OC.dialogs.alert('Error', t(appName,'It has not been possible to add the new wiki')); 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);
}); });
} }
} }

View File

@ -1,26 +1,6 @@
const appName = 'MyWiki'; 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 { class WikiEditor {
load(wikiId, wikiPageId) { load(wikiId, wikiPageId) {
console.info(`JDG :: Loading Wiki ${wikiId}/${wikiPageId}`); console.info(`JDG :: Loading Wiki ${wikiId}/${wikiPageId}`);
@ -33,14 +13,35 @@ var MyWiki = MyWiki || {};
(function(window, $, exports, undefined) { (function(window, $, exports, undefined) {
'use strict'; 'use strict';
let wikiNavigation = new WikiNavigation(document.querySelector('li[data-id="wikis"]'), onSelectWiki); // Navigation menu --------------------------------
let wikiPages = new WikiPages(document.querySelector('li[data-id="pages"]'), onSelectWikiPage); function appNavigationEntryMenuClose() {
function onSelectWiki(wikiId) { document.querySelectorAll('.app-navigation-entry-menu').forEach(e=>e.classList.remove("open"));
console.info(`JDG :: WikiList selected ${wikiId}` );
if ( wikiId > 0 ) {
wikiPages.load(wikiId);
} }
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) { function onSelectWikiPage(wikiPageId) {
console.info(`JDG :: WikiPage selected ${wikiPageId}` ); console.info(`JDG :: WikiPage selected ${wikiPageId}` );
if ( wikiPageId > 0 ) { if ( wikiPageId > 0 ) {

View File

@ -34,7 +34,7 @@ class WikiMapper extends QBMapper {
return $this->findEntity($qb); 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 = $this->db->getQueryBuilder();
$qb->select('*') $qb->select('*')
@ -46,12 +46,12 @@ class WikiMapper extends QBMapper {
if ($filter) { if ($filter) {
if (array_key_exists('title',$filter) ) { if (array_key_exists('title',$filter) ) {
$qb->where( $qb->where(
$qb->expr()->eq('title', $qb->createNamedParameter($id)) $qb->expr()->eq('title', $qb->createNamedParameter($filter['title']))
); );
} }
if (array_key_exists('fileId',$filter) ) { if (array_key_exists('fileId',$filter) ) {
$qb->where( $qb->where(
$qb->expr()->eq('fileId', $qb->createNamedParameter($id)) $qb->expr()->eq('file_id', $qb->createNamedParameter($filter['fileId']))
); );
} }
} }

View File

@ -106,7 +106,7 @@ class WikiHelper {
return $this->setWikiData($wiki) ? $wiki : null; 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); $this->wikiFolder = $this->userFolder->get($folderPath);
if ( !$this->isWikiable() ) { if ( !$this->isWikiable() ) {
return null; return null;
@ -119,21 +119,36 @@ class WikiHelper {
return $this->wikiFolder->getId(); return $this->wikiFolder->getId();
} }
public function add(int $parentId, string $title) { public function add(int $parentId, string $title, ?string $content) :int {
// $folder = ...newFolder($path) if ($parentId>0) {
$parentFolder = $this->getFolderById($parentId);
} else {
$parentFolder = $this->wikiFolder;
}
try {
$folder = $parentFolder->newFolder($this->sanitize_file_name($title));
$wikiData = $this->getWikiData(); $wikiTreePage = new WikiTreePage();
if ($wikiData) { $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 = new WikiTree($wikiData['pages']);
$wikiPage = new WikiTreePage(); $wikiTree->set($wikiTreePage);
$wikiPage->id = $id;
$wikiPage->pid = $parentId;
$wikiPage->title = $title;
$wikiTree->set($wikiPage);
$wikiData['pages'] = $wikiTree->getWikiPages(); $wikiData['pages'] = $wikiTree->getWikiPages();
$this->setWikiData($wikiData); $this->setWikiData($wikiData);
} }
} catch(\Exception $ex) {
return -1;
}
return $wikiTreePage->id;
} }
public function update(int $id, string $content) { public function update(int $id, string $content) {

View File

@ -58,7 +58,7 @@ class WikiService {
} }
public function create(string $folderPath, string $title, string $userId) { public function create(string $folderPath, string $title, string $userId) {
$folderId = $this->wikiHelper->initWiki($folderPath, $title); $folderId = $this->wikiHelper->create($folderPath, $title);
if ( $folderId === null ) { if ( $folderId === null ) {
throw new ReadOnlyException('Error creating wiki'); throw new ReadOnlyException('Error creating wiki');
} }
@ -79,7 +79,8 @@ class WikiService {
try { try {
$wiki = $this->mapper->find($id, $userId); $wiki = $this->mapper->find($id, $userId);
$wiki->setTitle($title); $wiki->setTitle($title);
return $this->mapper->update($wiki); $res = $this->mapper->update($wiki);
return $res;
} catch(Exception $e) { } catch(Exception $e) {
$this->handleException($e); $this->handleException($e);
} }

View File

@ -1,6 +1,7 @@
<?php <?php
\OCP\Util::addScript('mywiki', 'WikiDropdownHelper'); \OCP\Util::addScript('mywiki', 'WikiDropdownHelper');
\OCP\Util::addScript('mywiki', 'WikiNavigation'); \OCP\Util::addScript('mywiki', 'WikiNavigation');
\OCP\Util::addScript('mywiki', 'WikiPages');
\OCP\Util::addScript('mywiki', 'script'); \OCP\Util::addScript('mywiki', 'script');
\OCP\Util::addStyle('mywiki', 'style'); \OCP\Util::addStyle('mywiki', 'style');
?> ?>

View File

@ -11,22 +11,16 @@
<div class="app-navigation-entry-menu"> <div class="app-navigation-entry-menu">
<ul> <ul>
<li> <li>
<a href="#" data-id="add"> <button data-id="add" class="icon-folder">Add Wiki</button>
<span class="icon-add"></span>
<span>Add Wiki</span>
</a>
</li> </li>
<li> <li>
<button disabled data-id="rename"> <button disabled data-id="addPage" class="icon-add">Add Page</button>
<span class="icon-rename"></span>
<span>Rename Wiki</span>
</button>
</li> </li>
<li> <li>
<button disabled data-id="delete"> <button disabled data-id="rename" class="icon-rename">Rename Wiki</button>
<span class="icon-delete"></span> </li>
<span>Delete Wiki</span> <li>
</button> <button disabled data-id="delete" class="icon-delete">Delete Wiki</button>
</li> </li>
</ul> </ul>
</div> </div>