Browse Source

implemented renaming of wiki page

Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
module/wiki
Stephan Richter 2 months ago
parent
commit
7ddd32bb72
  1. 10
      core/src/main/java/de/srsoftware/umbrella/core/model/WikiPage.java
  2. 18
      frontend/src/routes/wiki/View.svelte
  3. 3
      wiki/src/main/java/de/srsoftware/umbrella/wiki/SqliteDb.java

10
core/src/main/java/de/srsoftware/umbrella/core/model/WikiPage.java

@ -4,6 +4,7 @@ package de.srsoftware.umbrella.core.model;
import static de.srsoftware.umbrella.core.Constants.*; import static de.srsoftware.umbrella.core.Constants.*;
import static de.srsoftware.umbrella.core.Util.markdown; import static de.srsoftware.umbrella.core.Util.markdown;
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.invalidFieldException; import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.invalidFieldException;
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.unprocessable;
import de.srsoftware.tools.Mappable; import de.srsoftware.tools.Mappable;
import de.srsoftware.umbrella.core.api.UserService; import de.srsoftware.umbrella.core.api.UserService;
@ -71,9 +72,7 @@ public class WikiPage implements Mappable {
var val = json.get(key); var val = json.get(key);
switch (key){ switch (key){
case ID: case ID:
if (!(val instanceof String s)) throw invalidFieldException(ID,"String"); throw unprocessable("{0} cannot be altered!",ID);
title(s);
break;
case CONTENT: case CONTENT:
if (!(val instanceof String s)) throw invalidFieldException(CONTENT,"String"); if (!(val instanceof String s)) throw invalidFieldException(CONTENT,"String");
content(s); content(s);
@ -101,6 +100,10 @@ public class WikiPage implements Mappable {
} }
} }
break; break;
case TITLE:
if (!(val instanceof String t)) throw invalidFieldException(TITLE,"String");
title(t);
break;
} }
} }
return this; return this;
@ -113,6 +116,7 @@ public class WikiPage implements Mappable {
private WikiPage title(String newVal) { private WikiPage title(String newVal) {
if (title.equals(newVal)) return this; if (title.equals(newVal)) return this;
title = newVal; title = newVal;
version++;
dirtyFields.add(TITLE); dirtyFields.add(TITLE);
return this; return this;
} }

18
frontend/src/routes/wiki/View.svelte

@ -5,7 +5,8 @@
import { t } from '../../translations.svelte'; import { t } from '../../translations.svelte';
import { user } from '../../user.svelte'; import { user } from '../../user.svelte';
import Editor from '../../Components/MarkdownEditor.svelte'; import MarkdownEditor from '../../Components/MarkdownEditor.svelte';
import LineEditor from '../../Components/LineEditor.svelte';
import Notes from '../notes/RelatedNotes.svelte'; import Notes from '../notes/RelatedNotes.svelte';
import PermissionEditor from '../../Components/PermissionEditor.svelte'; import PermissionEditor from '../../Components/PermissionEditor.svelte';
import TagList from '../tags/TagList.svelte'; import TagList from '../tags/TagList.svelte';
@ -15,6 +16,7 @@
let page = $state(null); let page = $state(null);
let router = useTinyRouter(); let router = useTinyRouter();
let members = $state({}); let members = $state({});
let editable = $derived(page.members[user.id].permission.code<4);
async function addMember(entry){ async function addMember(entry){
let newMembers = JSON.parse(JSON.stringify(page.members)); let newMembers = JSON.parse(JSON.stringify(page.members));
@ -88,6 +90,11 @@
return loadContent(res); return loadContent(res);
} }
async function patchTitle(t){
var result = await(patch({title:t}));
router.navigate(`/wiki/${page.id}/view`);
}
async function updatePermission(uid, newPerm){ async function updatePermission(uid, newPerm){
let newMembers = JSON.parse(JSON.stringify(page.members)); let newMembers = JSON.parse(JSON.stringify(page.members));
newMembers[uid] = {permission:newPerm}; newMembers[uid] = {permission:newPerm};
@ -103,18 +110,17 @@
<span class="version">{t('version')}</span> <span class="version">{t('version')}</span>
{#each page.versions as v} {#each page.versions as v}
<span class="version"> <span class="version">
<a href={`/wiki/${key}/version/${v}`} {onclick} class={page.version == v?'selected':''}>{v}</a> &nbsp; <a href={`/wiki/${page.id}/version/${v}`} {onclick} class={page.version == v?'selected':''}>{v}</a> &nbsp;
</span> </span>
{/each} {/each}
<h2>{page.title}</h2> <LineEditor value={page.title} type="h2" {editable} onSet={t => patchTitle(t)} />
{#if page.version != page.versions[0]} {#if page.version != page.versions[0]}
<span class="warn">{t('not_recent_version')}</span> <span class="warn">{t('not_recent_version')}</span>
{/if} {/if}
{#if page.members[user.id].permission.code<4} <MarkdownEditor {editable} value={page.content} onSet={s => patch({content:s})} />
<Editor editable={true} value={page.content} onSet={s => patch({content:s})}></Editor> {#if editable}
<PermissionEditor members={page.members} {addMember} {dropMember} {getCandidates} {updatePermission} /> <PermissionEditor members={page.members} {addMember} {dropMember} {getCandidates} {updatePermission} />
{:else} {:else}
<div class="markdown">{@html page.content.rendered}</div>
<table> <table>
<thead> <thead>
<tr> <tr>

3
wiki/src/main/java/de/srsoftware/umbrella/wiki/SqliteDb.java

@ -306,7 +306,8 @@ public class SqliteDb extends BaseDb implements WikiDb {
@Override @Override
public WikiPage save(WikiPage page) { public WikiPage save(WikiPage page) {
try { try {
if (page.isDirty(CONTENT) || page.isDirty(ID)) insertInto(TABLE_PAGES,ID,VERSION,CONTENT).values(page.title(),page.version(),page.content()).execute(db).close(); if (page.isDirty(CONTENT) || page.isDirty(ID) || page.isDirty(TITLE)) insertInto(TABLE_PAGES,ID,VERSION,TITLE,CONTENT)
.values(page.id(),page.version(),page.title(),page.content()).execute(db).close();
if (page.isDirty(MEMBERS)){ if (page.isDirty(MEMBERS)){
Query.delete().from(TABLE_PAGES_USERS).where(PAGE_ID,Condition.equal(page.title())).where(USER_ID,Condition.notIn(page.members().keySet().toArray())).execute(db); Query.delete().from(TABLE_PAGES_USERS).where(PAGE_ID,Condition.equal(page.title())).where(USER_ID,Condition.notIn(page.members().keySet().toArray())).execute(db);
var query = replaceInto(TABLE_PAGES_USERS,PAGE_ID,USER_ID,PERMISSIONS); var query = replaceInto(TABLE_PAGES_USERS,PAGE_ID,USER_ID,PERMISSIONS);

Loading…
Cancel
Save