Compare commits

...

11 Commits

Author SHA1 Message Date
StephanRichter 8392edf408 Merge branch 'main' into module/journal 2026-04-22 08:26:07 +02:00
StephanRichter 9c80e0d77c preparing for journal with timestamps
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-04-22 08:24:54 +02:00
StephanRichter 0429e14715 Merge branch 'bugfix/tag-header'
Build Docker Image / Docker-Build (push) Successful in 2m35s
Build Docker Image / Clean-Registry (push) Successful in 6s
2026-04-20 08:21:26 +02:00
StephanRichter ff618f75fa css work
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-04-19 11:07:47 +02:00
StephanRichter dbfd50bfa9 html improvement
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-04-19 10:40:03 +02:00
StephanRichter ff65cfd958 bugfix: now trimming tags on creation
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-04-18 15:36:35 +02:00
StephanRichter 877547df0d bugfix: now trimming tags on creation
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-04-18 15:28:21 +02:00
StephanRichter 0db8ed4867 added header for tags in wiki pages
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-04-18 15:07:54 +02:00
StephanRichter 55ece851be added title to wiki pages
Build Docker Image / Docker-Build (push) Successful in 1m59s
Build Docker Image / Clean-Registry (push) Successful in -15s
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-04-09 09:12:12 +02:00
StephanRichter ed26f6e46f Merge branch 'bugfix/wiki-css'
Build Docker Image / Docker-Build (push) Successful in 2m6s
Build Docker Image / Clean-Registry (push) Successful in -11s
2026-03-31 00:16:37 +02:00
StephanRichter eb4a983d11 fixed bug: now redirecting to newest version when deleting wiki page
Build Docker Image / Docker-Build (push) Successful in 2m1s
Build Docker Image / Clean-Registry (push) Successful in -12s
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-03-30 21:07:55 +02:00
6 changed files with 38 additions and 17 deletions
+3 -3
View File
@@ -241,7 +241,7 @@
</script>
<h2>{t('Stock')}</h2>
<div class="grid3">
<div class="stock grid3">
<div class="locations">
{#if top_level}
{#each top_level as realm,idx}
@@ -278,11 +278,11 @@
</div>
{#if item && data && data.users}
<div class="tags">
<span>{t('tags')}</span>
<h4>{t('tags')}</h4>
<Tags module="stock" id={item.id} user_list={data.users} />
</div>
<div class="notes">
<span>{t('notes')}</span>
<h4>{t('notes')}</h4>
<Notes module="stock" entity_id={item.id} />
</div>
{/if}
+1 -1
View File
@@ -88,7 +88,7 @@
}
async function onCommit(wrapped){
addTag(wrapped.display);
addTag(wrapped.display.trim());
}
function onSelect(dummy){}
+18 -5
View File
@@ -1,7 +1,7 @@
<script>
import { onMount } from 'svelte';
import { useTinyRouter } from 'svelte-tiny-router';
import { api, eventStream } from '../../urls.svelte';
import { api, eventStream, get } from '../../urls.svelte';
import { error, yikes } from '../../warn.svelte';
import { t } from '../../translations.svelte';
import { user } from '../../user.svelte';
@@ -48,8 +48,13 @@
});
if (res.ok){
let json = await res.json();
router.navigate(`/wiki/${page.id}/view`);
yikes();
let target = `/wiki/${page.id}/view`;
if (window.location.pathname == target) {
loadPage();
} else {
router.navigate(target);
yikes();
}
} else {
error(res);
}
@@ -100,7 +105,7 @@
let path = `wiki/page/${key}`;
if (version) path += `/version/${version}`;
const url = api(path);
const res = await fetch(url,{credentials:'include'});
const res = await get(url);
loadJson(res);
}
@@ -145,6 +150,11 @@
$effect(loadPage);
onMount(connectToBus);
</script>
<svelte:head>
<title>Umbrella {t('wiki')}: {page?.title}</title>
</svelte:head>
{#if page && page.versions}
<div class="wiki page">
<div class="versions">
@@ -188,7 +198,10 @@
{/if}
{/if}
<MarkdownEditor {editable} value={page.content} onSet={s => patch({content:s})} store_id="wiki/{page.id}/description" />
<TagList module="wiki" id={page.id} user_list={Object.keys(page.members).map(id => +id)} />
<div class="tags">
<h3>{t('tags')}</h3>
<TagList module="wiki" id={page.id} user_list={Object.keys(page.members).map(id => +id)} />
</div>
<div class="notes">
<h3>{t('notes')}</h3>
<Notes module="wiki" entity_id={page.id} />
@@ -13,6 +13,8 @@ import de.srsoftware.umbrella.core.BaseDb;
import de.srsoftware.umbrella.messagebus.events.Event;
import java.sql.Connection;
import java.sql.SQLException;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
public class SqliteDb extends BaseDb implements JournalDb{
public SqliteDb(Connection connection) {
@@ -33,13 +35,14 @@ public class SqliteDb extends BaseDb implements JournalDb{
var sql = """
CREATE TABLE IF NOT EXISTS {0} (
{1} INTEGER PRIMARY KEY,
{2} INTEGER,
{3} VARCHAR(255) NOT NULL,
{4} VARCHAR(16) NOT NULL,
{5} TEXT
{2} LONG NOT NULL,
{3} INTEGER,
{4} VARCHAR(255) NOT NULL,
{5} VARCHAR(16) NOT NULL,
{6} TEXT
);
""";
sql = format(sql,TABLE_JOURNAL,ID,USER_ID,MODULE,ACTION,DESCRIPTION);
sql = format(sql,TABLE_JOURNAL,ID,TIMESTAMP,USER_ID,MODULE,ACTION,DESCRIPTION);
try {
db.prepareStatement(sql).execute();
} catch (SQLException e) {
@@ -50,8 +53,9 @@ public class SqliteDb extends BaseDb implements JournalDb{
@Override
public void logEvent(Event<?> event) {
try {
insertInto(TABLE_JOURNAL,USER_ID,MODULE,ACTION,DESCRIPTION)
.values(event.initiator().id(), event.module(), event.eventType(), event.describe())
var timestamp = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC);
insertInto(TABLE_JOURNAL,TIMESTAMP,USER_ID,MODULE,ACTION,DESCRIPTION)
.values(timestamp,event.initiator().id(), event.module(), event.eventType(), event.describe())
.execute(db).close();
} catch (SQLException e) {
throw databaseException(ERROR_WRITE_EVENT,event.eventType(),event.initiator().name());
@@ -144,7 +144,7 @@ public class TagModule extends BaseHandler implements TagService {
@Override
public void save(String module, long entityId, Collection<Long> userIds, Collection<String> tags) {
tagDb.save(userIds,module,entityId,tags);
tagDb.save(userIds,module,entityId,tags.stream().map(String::trim).toList());
}
@Override
@@ -524,6 +524,10 @@ a.wikilink{
grid-template-columns: [left] 1fr [first] 1fr [second] 1fr [right]
}
.stock.grid3{
grid-template-columns: [left] 1fr [first] 1fr [second] 2fr [right]
}
.grid3 .locations {
grid-row-end: span 3;
}