diff --git a/Dockerfile b/Dockerfile
index e5006505..e060138c 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,15 +1,15 @@
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
RUN npm install && npm run build
-FROM alpine AS java_build
-RUN apk add gradle fontconfig font-opensans openjdk21-jre
+FROM alpine:3.22 AS java_build
+RUN apk add gradle
ADD . /Umbrella
WORKDIR /Umbrella
COPY --from=svelte_build /home/svelte/Umbrella/frontend/dist web/src/main/resources/web
@@ -17,14 +17,18 @@ RUN gradle --no-daemon build
FROM alpine
-RUN apk 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
+RUN apk --no-cache add bash fontconfig font-opensans graphviz openjdk21-jre tzdata weasyprint \
+ && adduser -D umbrella
WORKDIR /home/umbrella
-RUN chmod a+rx plantuml.jar
-USER umbrella
-RUN mkdir .config && ln -s /host/config.json .config/Umbrella.json
+
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 . \
+ && ln -s /usr/share/zoneinfo/Europe/Berlin /etc/localtime
+USER umbrella
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 45bbf862..22e152da 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/project/View.svelte b/frontend/src/routes/project/View.svelte
index c65ce803..f17986b5 100644
--- a/frontend/src/routes/project/View.svelte
+++ b/frontend/src/routes/project/View.svelte
@@ -222,7 +222,7 @@
{t('state')}
- update({status:val})} {project} />
+ update({status:+val})} {project} />
{#if project.company}
{t('company')}
diff --git a/frontend/src/routes/search/Search.svelte b/frontend/src/routes/search/Search.svelte
index 9883aaf1..118954e7 100644
--- a/frontend/src/routes/search/Search.svelte
+++ b/frontend/src/routes/search/Search.svelte
@@ -1,14 +1,15 @@
@@ -236,23 +277,6 @@
{/if}
-{#if notes}
-
-{/if}
{#if times}
{/if}
+{#if notes}
+
+{/if}
diff --git a/stock/src/main/java/de/srsoftware/umbrella/stock/StockModule.java b/stock/src/main/java/de/srsoftware/umbrella/stock/StockModule.java
index 4b46a2b6..bd8d574d 100644
--- a/stock/src/main/java/de/srsoftware/umbrella/stock/StockModule.java
+++ b/stock/src/main/java/de/srsoftware/umbrella/stock/StockModule.java
@@ -132,7 +132,23 @@ public class StockModule extends BaseHandler implements StockService {
yield super.doGet(path,ex);
}
}
- case null, default -> super.doGet(path,ex);
+ case null -> super.doGet(path,ex);
+ default -> {
+ try {
+ var id = Long.parseLong(head);
+ Item item = stockDb.loadItem(id);
+ Owner owner = item.owner().resolve();
+ if (owner instanceof Company company) {
+ if (!companyService().membership(company.id(),user.get().id())) throw forbidden("You are not allowed to access {0}",OBJECT);
+ }
+ if (owner instanceof UmbrellaUser u){
+ if (u.id() != user.get().id()) throw forbidden("You are not allowed to access {0}",OBJECT);
+ }
+ yield sendContent(ex,item);
+ } catch (NumberFormatException nfe){
+ yield super.doGet(path,ex);
+ }
+ }
};
} catch (UmbrellaException e){
return send(ex,e);
diff --git a/tags/src/main/java/de/srsoftware/umbrella/tags/SqliteDb.java b/tags/src/main/java/de/srsoftware/umbrella/tags/SqliteDb.java
index 48f8163a..30f6f8fb 100644
--- a/tags/src/main/java/de/srsoftware/umbrella/tags/SqliteDb.java
+++ b/tags/src/main/java/de/srsoftware/umbrella/tags/SqliteDb.java
@@ -39,6 +39,7 @@ public class SqliteDb extends BaseDb implements TagDB{
public SqliteDb(Connection tagDb, Connection bmDb) {
super(tagDb);
bookmarks = new de.srsoftware.umbrella.bookmarks.SqliteDb(bmDb);
+ createTables();
}
@Override
diff --git a/translations/src/main/resources/de.json b/translations/src/main/resources/de.json
index 90a55aaf..00cc7b21 100644
--- a/translations/src/main/resources/de.json
+++ b/translations/src/main/resources/de.json
@@ -305,6 +305,7 @@
"saved": "gespeichert",
"save_object": "{object} speichern",
"search": "Suche",
+ "searching…": "suche…",
"select_company" : "Wählen Sie eine ihrer Firmen:",
"select_customer": "Kunde auswählen",
"select_property": "Eigenschaft auswählen",
diff --git a/translations/src/main/resources/en.json b/translations/src/main/resources/en.json
index 5db18341..1925432e 100644
--- a/translations/src/main/resources/en.json
+++ b/translations/src/main/resources/en.json
@@ -305,6 +305,7 @@
"saved": "saved",
"save_object": "save {object}",
"search": "search",
+ "searching…": "searhcing…",
"select_company" : "select on of you companies:",
"select_customer": "select customer",
"select_property": "select property",
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);