From aad9a7d9b801a75c357fba1f9ffd1596939227d6 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Wed, 10 Sep 2025 15:44:51 +0200 Subject: [PATCH] implemented storing edit as new version, impelemented loading of arbitrary versions of wiki page Signed-off-by: Stephan Richter --- frontend/src/routes/wiki/View.svelte | 56 ++++++++++++------- translations/src/main/resources/de.json | 1 + web/src/main/resources/web/css/default.css | 16 ++++++ .../de/srsoftware/umbrella/wiki/SqliteDb.java | 12 ++-- .../de/srsoftware/umbrella/wiki/WikiDb.java | 2 +- .../srsoftware/umbrella/wiki/WikiModule.java | 24 +++++--- 6 files changed, 77 insertions(+), 34 deletions(-) diff --git a/frontend/src/routes/wiki/View.svelte b/frontend/src/routes/wiki/View.svelte index a49e13b..958315a 100644 --- a/frontend/src/routes/wiki/View.svelte +++ b/frontend/src/routes/wiki/View.svelte @@ -1,25 +1,43 @@ -

{id}

{#if error} {error} {/if} {#if page} {t('version')} -{#each Array.from({ length: page.version }, (_, i) => page.version - i) as v} +{#each page.versions as v} - {#if v == page.version}[{/if} - {v} - {#if v == page.version}]{/if} + {v}   {/each} +{/if} +

{id}

+{#if page} +{#if page.version != page.versions[0]} +{t('not_recent_version')} +{/if} patch({content:s})}> {/if} \ No newline at end of file diff --git a/translations/src/main/resources/de.json b/translations/src/main/resources/de.json index 894cddc..9dc4d09 100644 --- a/translations/src/main/resources/de.json +++ b/translations/src/main/resources/de.json @@ -156,6 +156,7 @@ "no_company": "keine Firma", "note": "Notiz", "notes": "Notizen", + "not_recent_version": "Die ist nicht die neuste Version dieser Seite!", "number": "Nummer", "oidc_Login" : "Anmeldung mit OIDC", diff --git a/web/src/main/resources/web/css/default.css b/web/src/main/resources/web/css/default.css index ee8dac1..d86b632 100644 --- a/web/src/main/resources/web/css/default.css +++ b/web/src/main/resources/web/css/default.css @@ -69,6 +69,13 @@ nav { border-radius: 6px; } +.warn { + background: yellow; + color: black; + padding: 5px; + border-radius: 6px; +} + fieldset[tabindex="0"]{ max-height: 55px; overflow: hidden; @@ -369,4 +376,13 @@ table{ position: absolute; right: 0; bottom: 0; +} + +.version > a{ + padding: 5px; +} + +.version a.selected{ + border: 1px solid orange; + border-radius: 5px; } \ No newline at end of file diff --git a/wiki/src/main/java/de/srsoftware/umbrella/wiki/SqliteDb.java b/wiki/src/main/java/de/srsoftware/umbrella/wiki/SqliteDb.java index 08b51c5..4924842 100644 --- a/wiki/src/main/java/de/srsoftware/umbrella/wiki/SqliteDb.java +++ b/wiki/src/main/java/de/srsoftware/umbrella/wiki/SqliteDb.java @@ -2,8 +2,6 @@ package de.srsoftware.umbrella.wiki; import de.srsoftware.tools.jdbc.Condition; import de.srsoftware.umbrella.core.BaseDb; -import de.srsoftware.umbrella.core.exceptions.UmbrellaException; -import de.srsoftware.umbrella.core.model.Hash; import de.srsoftware.umbrella.core.model.Permission; import de.srsoftware.umbrella.core.model.WikiPage; @@ -80,9 +78,15 @@ public class SqliteDb extends BaseDb implements WikiDb { } @Override - public WikiPage load(String id) { + public WikiPage load(String id, Integer version) { try { - var rs = select(ALL).from(TABLE_PAGES).where(ID,Condition.equal(id)).sort(VERSION+" DESC").limit(1).exec(db); + var query = select(ALL).from(TABLE_PAGES).where(ID,Condition.equal(id)); + if (version == null) { + query.sort(VERSION+" DESC").limit(1); + } else { + query.where(VERSION,Condition.equal(version)); + } + var rs = query.exec(db); WikiPage page = null; if (rs.next()) page = WikiPage.of(rs); rs.close(); diff --git a/wiki/src/main/java/de/srsoftware/umbrella/wiki/WikiDb.java b/wiki/src/main/java/de/srsoftware/umbrella/wiki/WikiDb.java index 435944c..48c2fac 100644 --- a/wiki/src/main/java/de/srsoftware/umbrella/wiki/WikiDb.java +++ b/wiki/src/main/java/de/srsoftware/umbrella/wiki/WikiDb.java @@ -12,7 +12,7 @@ public interface WikiDb { List listUserPages(long userId); - WikiPage load(String id); + WikiPage load(String id, Integer version); Map loadMembers(WikiPage page); diff --git a/wiki/src/main/java/de/srsoftware/umbrella/wiki/WikiModule.java b/wiki/src/main/java/de/srsoftware/umbrella/wiki/WikiModule.java index b16bdf8..26c1fe1 100644 --- a/wiki/src/main/java/de/srsoftware/umbrella/wiki/WikiModule.java +++ b/wiki/src/main/java/de/srsoftware/umbrella/wiki/WikiModule.java @@ -17,11 +17,9 @@ import java.io.IOException; import java.util.Optional; import static de.srsoftware.umbrella.core.ConnectionProvider.connect; +import static de.srsoftware.umbrella.core.Constants.VERSION; import static de.srsoftware.umbrella.core.Paths.PAGE; -import static de.srsoftware.umbrella.core.Paths.VIEW; -import static de.srsoftware.umbrella.core.Util.mapValues; -import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.forbidden; -import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.missingFieldException; +import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.*; import static de.srsoftware.umbrella.core.model.Permission.EDIT; import static de.srsoftware.umbrella.wiki.Constants.*; @@ -73,7 +71,17 @@ public class WikiModule extends BaseHandler implements WikiService { private boolean getPage(Path path, UmbrellaUser user, HttpExchange ex) throws IOException { var id = path.pop(); - var page = loadPage(id); + Integer version = null; + if (!path.empty()){ + var head = path.pop(); + if (!VERSION.equals(head)) return doGet(path,ex); + try { + version = Integer.parseInt(path.pop()); + } catch (NumberFormatException e) { + throw invalidFieldException(VERSION,"int number"); + } + } + var page = loadPage(id,version); var permission = page.members().get(user.id()); if (permission == null) throw forbidden("You are not allowed to access \"{0}\"!",id); return sendContent(ex, page); @@ -97,14 +105,14 @@ public class WikiModule extends BaseHandler implements WikiService { return page; } - private WikiPage loadPage(String id){ + private WikiPage loadPage(String id, Integer version){ if (id == null) throw missingFieldException(PAGE_ID); - return loadMembers(wikiDb.load(id)); + return loadMembers(wikiDb.load(id, version)); } private boolean patchPage(Path path, UmbrellaUser user, HttpExchange ex) throws IOException { var id = path.pop(); - var page = loadPage(id); + var page = loadPage(id, null); var member = page.members().get(user.id()); if (member == null || member.permission() != EDIT) throw forbidden("You are not allowed to edit {0}!",id); var json = json(ex);