From 1302165ab200763c5fbcda7feacbe7273f74ba42 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Fri, 23 Jan 2026 23:00:41 +0100 Subject: [PATCH 01/13] fixing timezone for local deployment Signed-off-by: Stephan Richter --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index e5006505..632c5979 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,7 +17,7 @@ RUN gradle --no-daemon build FROM alpine -RUN apk add bash fontconfig font-opensans graphviz openjdk21-jre weasyprint +RUN apk add bash fontconfig font-opensans graphviz openjdk21-jre tzdata weasyprint RUN adduser -D umbrella COPY --from=java_build /Umbrella/backend/build/libs/backend.jar /home/umbrella/jar/ RUN chown -R umbrella /home/umbrella @@ -25,6 +25,6 @@ ADD https://github.com/plantuml/plantuml/releases/download/v1.2025.10/plantuml-1 WORKDIR /home/umbrella RUN chmod a+rx plantuml.jar USER umbrella -RUN mkdir .config && ln -s /host/config.json .config/Umbrella.json +RUN mkdir .config && ln -s /host/config.json .config/Umbrella.json && ln -s /usr/share/zoneinfo/Europe/Berlin /etc/localtime EXPOSE 80 CMD java -jar jar/backend.jar From 3e71ecc6cbd9816fd2f755f1dd6a2fe0418c41f2 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Fri, 23 Jan 2026 23:09:25 +0100 Subject: [PATCH 02/13] optimized dockerfile Signed-off-by: Stephan Richter --- Dockerfile | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index e5006505..75742839 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,13 +17,12 @@ RUN gradle --no-daemon build FROM alpine -RUN apk add bash fontconfig font-opensans graphviz openjdk21-jre weasyprint +RUN apk --no-cache add bash fontconfig font-opensans graphviz openjdk21-jre weasyprint RUN adduser -D umbrella COPY --from=java_build /Umbrella/backend/build/libs/backend.jar /home/umbrella/jar/ -RUN chown -R umbrella /home/umbrella ADD https://github.com/plantuml/plantuml/releases/download/v1.2025.10/plantuml-1.2025.10.jar /home/umbrella/plantuml.jar WORKDIR /home/umbrella -RUN chmod a+rx plantuml.jar +RUN chown -R umbrella . ; chmod a+rx plantuml.jar USER umbrella RUN mkdir .config && ln -s /host/config.json .config/Umbrella.json EXPOSE 80 From cf0cf2f5e9f436a0d3d8c0d11a67129d12b69d4d Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Fri, 23 Jan 2026 23:17:00 +0100 Subject: [PATCH 03/13] fixed missing permissions for setting localtime Signed-off-by: Stephan Richter --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 632c5979..e04ed2f7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,8 +23,8 @@ COPY --from=java_build /Umbrella/backend/build/libs/backend.jar /home/umbrella/j RUN chown -R umbrella /home/umbrella ADD https://github.com/plantuml/plantuml/releases/download/v1.2025.10/plantuml-1.2025.10.jar /home/umbrella/plantuml.jar WORKDIR /home/umbrella -RUN chmod a+rx plantuml.jar +RUN chmod a+rx plantuml.jar && ln -s /usr/share/zoneinfo/Europe/Berlin /etc/localtime USER umbrella -RUN mkdir .config && ln -s /host/config.json .config/Umbrella.json && ln -s /usr/share/zoneinfo/Europe/Berlin /etc/localtime +RUN mkdir .config && ln -s /host/config.json .config/Umbrella.json EXPOSE 80 CMD java -jar jar/backend.jar From 2375746d91b8ced0bd7f59d5b00cd5396d0d46ad Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Tue, 27 Jan 2026 00:29:43 +0100 Subject: [PATCH 04/13] further optimization of dockerfile Signed-off-by: Stephan Richter --- Dockerfile | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 75742839..8c6ed08f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,13 +17,15 @@ RUN gradle --no-daemon build FROM alpine -RUN apk --no-cache add bash fontconfig font-opensans graphviz openjdk21-jre weasyprint -RUN adduser -D umbrella +RUN apk --no-cache add bash fontconfig font-opensans graphviz openjdk21-jre weasyprint \ + && adduser -D umbrella COPY --from=java_build /Umbrella/backend/build/libs/backend.jar /home/umbrella/jar/ ADD https://github.com/plantuml/plantuml/releases/download/v1.2025.10/plantuml-1.2025.10.jar /home/umbrella/plantuml.jar WORKDIR /home/umbrella -RUN chown -R umbrella . ; chmod a+rx plantuml.jar +RUN mkdir .config \ + && ln -s /host/config.json .config/Umbrella.json \ + && chmod a+rx plantuml.jar \ + && chown -R umbrella . USER umbrella -RUN mkdir .config && ln -s /host/config.json .config/Umbrella.json EXPOSE 80 CMD java -jar jar/backend.jar From fda40d72f88cf6b7e7dc6e8e24cfe4791a1ddcc8 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Tue, 27 Jan 2026 00:46:45 +0100 Subject: [PATCH 05/13] re-ordered docker commands Signed-off-by: Stephan Richter --- Dockerfile | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 8c6ed08f..35c2aa1d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -19,13 +19,15 @@ RUN gradle --no-daemon build FROM alpine RUN apk --no-cache add bash fontconfig font-opensans graphviz openjdk21-jre weasyprint \ && adduser -D umbrella -COPY --from=java_build /Umbrella/backend/build/libs/backend.jar /home/umbrella/jar/ -ADD https://github.com/plantuml/plantuml/releases/download/v1.2025.10/plantuml-1.2025.10.jar /home/umbrella/plantuml.jar WORKDIR /home/umbrella + +EXPOSE 80 +CMD java -jar jar/backend.jar + +ADD https://github.com/plantuml/plantuml/releases/download/v1.2025.10/plantuml-1.2025.10.jar /home/umbrella/plantuml.jar +COPY --from=java_build /Umbrella/backend/build/libs/backend.jar /home/umbrella/jar/ RUN mkdir .config \ && ln -s /host/config.json .config/Umbrella.json \ && chmod a+rx plantuml.jar \ && chown -R umbrella . USER umbrella -EXPOSE 80 -CMD java -jar jar/backend.jar From a321c813de85b1e8491bd5a81fa1ad6d23243533 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Tue, 27 Jan 2026 15:34:33 +0100 Subject: [PATCH 06/13] working on timezone problems Signed-off-by: Stephan Richter --- Dockerfile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 35c2aa1d..5490a515 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM alpine:3.22 AS svelte_build RUN apk add npm RUN adduser -Dh /home/svelte svelte -ADD . /home/svelte/Umbrella +ADD frontend /home/svelte/Umbrella/frontend RUN chown -R svelte /home/svelte/Umbrella USER svelte WORKDIR /home/svelte/Umbrella/frontend @@ -29,5 +29,6 @@ COPY --from=java_build /Umbrella/backend/build/libs/backend.jar /home/umbrella/j RUN mkdir .config \ && ln -s /host/config.json .config/Umbrella.json \ && chmod a+rx plantuml.jar \ - && chown -R umbrella . + && chown -R umbrella . \ + && ln -s /usr/share/zoneinfo/Europe/Berlin /etc/localtime USER umbrella From b0ee825e0a14e68b53688da87f72986d955933ea Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Tue, 27 Jan 2026 21:41:12 +0100 Subject: [PATCH 07/13] moved notes to the bottom of the search result list Signed-off-by: Stephan Richter --- frontend/src/routes/search/Search.svelte | 34 ++++++++++++------------ 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/frontend/src/routes/search/Search.svelte b/frontend/src/routes/search/Search.svelte index 9883aaf1..f1fd1813 100644 --- a/frontend/src/routes/search/Search.svelte +++ b/frontend/src/routes/search/Search.svelte @@ -236,23 +236,6 @@ {/if} -{#if notes} -
- - {t('notes')} - - -
-{/if} {#if times}
@@ -308,3 +291,20 @@
{/if} +{#if notes} +
+ + {t('notes')} + + +
+{/if} From 8d66ed4cbe0778227c77bf539e39301d2bd71c30 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Tue, 27 Jan 2026 22:05:56 +0100 Subject: [PATCH 08/13] implemented full-text search for wiki Signed-off-by: Stephan Richter --- .../de/srsoftware/umbrella/wiki/SqliteDb.java | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) 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 3603899b..7243134f 100644 --- a/wiki/src/main/java/de/srsoftware/umbrella/wiki/SqliteDb.java +++ b/wiki/src/main/java/de/srsoftware/umbrella/wiki/SqliteDb.java @@ -152,15 +152,27 @@ public class SqliteDb extends BaseDb implements WikiDb { @Override public Map find(long userId, List keys, boolean fulltext) { try { - var query = select(ALL).from(TABLE_PAGES).leftJoin(ID,TABLE_PAGES_USERS,PAGE_ID).where(USER_ID,equal(userId)); - for (var key : keys) query.where(TITLE,like("%"+key+"%")); - var rs = query.exec(db); var map = new HashMap(); - while (rs.next()) { - var page = WikiPage.of(rs); - map.put(page.id(),page); + { + var query = select(ALL).from(TABLE_PAGES).leftJoin(ID, TABLE_PAGES_USERS, PAGE_ID).where(USER_ID, equal(userId)); + for (var key : keys) query.where(TITLE, like("%" + key.replaceAll("[ÄäÖöÜüß]", "%") + "%")); + var rs = query.exec(db); + while (rs.next()) { + var page = WikiPage.of(rs); + map.put(page.id(), page); + } + rs.close(); + } + if (fulltext) { + var query = select(ALL).from(TABLE_PAGES).leftJoin(ID, TABLE_PAGES_USERS, PAGE_ID).where(USER_ID, equal(userId)); + for (var key : keys) query.where(CONTENT, like("%" + key.replaceAll("[ÄäÖöÜüß]", "%") + "%")); + var rs = query.exec(db); + while (rs.next()) { + var page = WikiPage.of(rs); + map.put(page.id(), page); + } + rs.close(); } - rs.close(); return map; } catch (SQLException e) { throw failedToSearchDb(t(WIKI_PAGES)).causedBy(e); From 4339e4fd981504a53ab8621068f514dc4242e3c0 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Wed, 28 Jan 2026 08:44:52 +0100 Subject: [PATCH 09/13] added notification to search Signed-off-by: Stephan Richter --- .../umbrella/documents/DocumentApi.java | 5 +++++ frontend/src/routes/search/Search.svelte | 21 +++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java b/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java index 46036fee..a43ac578 100644 --- a/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java +++ b/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java @@ -541,6 +541,11 @@ public class DocumentApi extends BaseHandler implements DocumentService { var userCompanyIds = companyService().listCompaniesOf(user).keySet(); var documents = db.find(userCompanyIds,keys,fulltext); + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } return sendContent(ex,mapValues(documents)); } diff --git a/frontend/src/routes/search/Search.svelte b/frontend/src/routes/search/Search.svelte index f1fd1813..bdde9757 100644 --- a/frontend/src/routes/search/Search.svelte +++ b/frontend/src/routes/search/Search.svelte @@ -2,13 +2,14 @@ import { onMount } from 'svelte'; import { useTinyRouter } from 'svelte-tiny-router'; import { api, post, target } from '../../urls.svelte.js'; - import { error, yikes } from '../../warn.svelte'; + import { error, warn, yikes } from '../../warn.svelte'; import { t } from '../../translations.svelte.js'; import { display } from '../../time.svelte'; import Bookmark from '../bookmark/Template.svelte'; const router = useTinyRouter(); + let counter = 9; let bookmarks = $state(null); let companies = $state(null); let documents = $state(null); @@ -34,12 +35,12 @@ }); function doSearch(ignored){ + warn(t('searching…')); let url = window.location.origin + window.location.pathname; if (key) url += '?key=' + encodeURI(key); window.history.replaceState(history.state, '', url); const data = { key : key, fulltext : fulltext }; - post(api('bookmark/search'),data).then(handleBookmarks); post(api('company/search '),data).then(handleCompanies); post(api('document/search'),data).then(handleDocuments); @@ -61,6 +62,7 @@ } async function handleBookmarks(resp){ + quitOne(); if (resp.ok){ const res = await resp.json(); bookmarks = Object.keys(res).length ? res : null; @@ -70,6 +72,7 @@ } async function handleCompanies(resp){ + quitOne(); if (resp.ok){ const json = await resp.json(); companies = Object.keys(json).length ? json : null; @@ -79,6 +82,7 @@ } async function handleDocuments(resp){ + quitOne(); if (resp.ok){ const json = await resp.json(); documents = Object.keys(json).length ? json : null; @@ -88,6 +92,7 @@ } async function handleNotes(resp){ + quitOne(); if (resp.ok){ const json = await resp.json(); notes = Object.keys(json).length ? json : null; @@ -97,6 +102,7 @@ } async function handleProjects(resp){ + quitOne(); if (resp.ok){ const res = await resp.json(); projects = Object.keys(res).length ? res : null; @@ -106,6 +112,7 @@ } async function handleStock(resp){ + quitOne(); if (resp.ok){ const res = await resp.json(); stock = Object.keys(res).length ? res : null; @@ -115,6 +122,7 @@ } async function handleTasks(resp){ + quitOne(); if (resp.ok){ const res = await resp.json(); tasks = Object.keys(res).length ? res : null; @@ -124,6 +132,7 @@ } async function handleTimes(resp){ + quitOne(); if (resp.ok){ const res = await resp.json(); times = Object.keys(res).length ? res : null; @@ -133,6 +142,7 @@ } async function handleWikiPages(resp){ + quitOne(); if (resp.ok){ const res = await resp.json(); pages = Object.keys(res).length ? res : null; @@ -140,6 +150,13 @@ error(resp); } } + + function quitOne(){ + counter--; + if (counter > 0) { + warn(t('searching…')+" "+counter); + } else yikes(); + } $effect(() => doSearch(key)) From f402122d0c15b78e129acdd99e6efa0ed9d2b8db Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Wed, 28 Jan 2026 15:22:20 +0100 Subject: [PATCH 10/13] improved search: motes now showing name/title of related entities Signed-off-by: Stephan Richter --- frontend/src/routes/search/Search.svelte | 28 +++++++++++++++++-- .../umbrella/stock/StockModule.java | 18 +++++++++++- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/frontend/src/routes/search/Search.svelte b/frontend/src/routes/search/Search.svelte index bdde9757..dea0c210 100644 --- a/frontend/src/routes/search/Search.svelte +++ b/frontend/src/routes/search/Search.svelte @@ -1,7 +1,7 @@