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);