Compare commits

...

128 Commits

Author SHA1 Message Date
229a6f8e5a Merge branch 'module/spreadsheet' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m31s
Build Docker Image / Clean-Registry (push) Successful in -8s
2026-03-21 01:27:43 +01:00
20d46ea135 improved spreadsheet design
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-03-21 01:27:27 +01:00
30ebe3f4e7 first working version. need to improve styling (right align for number cells)
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-03-21 00:41:26 +01:00
87b81756cd almost there:
- spreadsheet is rendered from fenced code block
- source gets updated when spreadsheet is updated

missing: update spreadsheet, when source is updated
2026-03-20 23:16:00 +01:00
b3925bb2b9 first working transition from source to table. next: writing back to source
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-03-20 20:48:05 +01:00
1eaff233d6 found a solution to lazy-load the spreadsheet js and css
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-03-20 09:13:41 +01:00
a2e2643020 playing with jspreadsheet
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-03-20 08:26:45 +01:00
62981b22b5 success using jspreadsheet
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-03-18 23:42:01 +01:00
d936c08d35 first success with x-data-spreadsheet
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-03-18 22:55:42 +01:00
69beabfbc8 Merge branch 'feature/tag_proposal' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m19s
Build Docker Image / Clean-Registry (push) Successful in -8s
2026-03-17 09:55:31 +01:00
7349d301dd Merge branch 'feature/tag_proposal' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m18s
Build Docker Image / Clean-Registry (push) Successful in -8s
2026-03-17 09:16:54 +01:00
24c079a0ed Merge branch 'refactor/autocomplete' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m19s
Build Docker Image / Clean-Registry (push) Successful in -8s
2026-03-17 08:28:15 +01:00
40bdad12de Merge branch 'feature/bookmark_edit' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m12s
Build Docker Image / Clean-Registry (push) Successful in -8s
2026-03-16 21:47:52 +01:00
697d7b01e5 Merge branch 'TagItemDisplay' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m22s
Build Docker Image / Clean-Registry (push) Successful in -7s
2026-03-16 09:12:21 +01:00
b7219ef6ec Merge branch 'feature/bookmark_edit' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m25s
Build Docker Image / Clean-Registry (push) Successful in -6s
2026-03-13 15:23:24 +01:00
7cccb7482b Merge branch 'kanban' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m20s
Build Docker Image / Clean-Registry (push) Successful in -6s
2026-03-11 18:26:43 +01:00
dde23dc9c3 Merge branch 'module/poll' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m26s
Build Docker Image / Clean-Registry (push) Successful in -6s
2026-03-11 08:44:09 +01:00
c4351d3007 Merge branch 'module/poll' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m27s
Build Docker Image / Clean-Registry (push) Successful in -6s
2026-03-11 08:35:31 +01:00
4a5ae7e1ad Merge branch 'module/poll' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m23s
Build Docker Image / Clean-Registry (push) Successful in -6s
2026-03-10 15:34:23 +01:00
a37a57ab3f Merge branch 'module/poll' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m22s
Build Docker Image / Clean-Registry (push) Successful in -6s
2026-03-10 12:10:45 +01:00
6e73a71082 Merge branch 'module/poll' into dev
Some checks failed
Build Docker Image / Clean-Registry (push) Has been cancelled
Build Docker Image / Docker-Build (push) Has been cancelled
2026-03-10 12:09:25 +01:00
d847fbecbb Merge branch 'module/poll' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m9s
Build Docker Image / Clean-Registry (push) Successful in -6s
2026-03-10 11:53:38 +01:00
f455d748f6 Merge branch 'module/poll' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m23s
Build Docker Image / Clean-Registry (push) Successful in -6s
2026-03-10 11:35:01 +01:00
83c173a108 Merge branch 'module/poll' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m32s
Build Docker Image / Clean-Registry (push) Successful in -6s
2026-03-10 09:57:59 +01:00
4f7cbd9f22 Merge branch 'module/poll' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m18s
Build Docker Image / Clean-Registry (push) Successful in -6s
2026-03-10 09:36:48 +01:00
702684666c fixed reference to poll in build.gradle.kts
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m15s
Build Docker Image / Clean-Registry (push) Successful in -6s
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-03-09 11:28:38 +01:00
db95cdbb58 Merge branch 'module/poll' into dev
Some checks failed
Build Docker Image / Docker-Build (push) Failing after 3m32s
Build Docker Image / Clean-Registry (push) Successful in -5s
2026-03-09 11:19:22 +01:00
99b33791ef Merge branch 'bugfix/permission_checks' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m28s
Build Docker Image / Clean-Registry (push) Successful in 2s
2026-02-12 08:42:13 +01:00
a72d556a36 added permission check to StockModule.getChildLocations
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-02-12 08:41:12 +01:00
f7d6f2936a Merge branch 'feature/stock-item-link' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m48s
Build Docker Image / Clean-Registry (push) Successful in 1s
2026-02-11 14:48:10 +01:00
fb4fcc53de Merge branch 'feature/stock-item-link' into dev 2026-02-11 14:45:28 +01:00
7f39d71f4a Merge branch 'feature/stock_clone_item' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m37s
Build Docker Image / Clean-Registry (push) Successful in 2s
2026-02-10 23:48:30 +01:00
4ebb5d54d3 Merge branch 'main' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m24s
Build Docker Image / Clean-Registry (push) Successful in 3s
2026-02-09 16:11:28 +01:00
e86e9289ed Merge branch 'main' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m27s
Build Docker Image / Clean-Registry (push) Successful in 2s
2026-02-09 16:03:38 +01:00
604814e057 Merge branch 'feature/main-menu-config' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m22s
Build Docker Image / Clean-Registry (push) Successful in 2s
2026-02-09 13:13:26 +01:00
4964082c2e Merge branch 'feature/main-menu-config' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m32s
Build Docker Image / Clean-Registry (push) Successful in 2s
2026-02-09 13:01:17 +01:00
a5e2c69afb Merge branch 'main' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m23s
Build Docker Image / Clean-Registry (push) Successful in 4s
2026-02-04 10:18:36 +01:00
494ba3ff41 gp
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m16s
Build Docker Image / Clean-Registry (push) Successful in -4s
Merge branch 'main' into dev
2026-02-04 10:03:45 +01:00
53fe0db2c1 Merge branch 'main' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m26s
Build Docker Image / Clean-Registry (push) Successful in -4s
2026-02-04 08:42:13 +01:00
6843bbb475 Merge branch 'main' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m21s
Build Docker Image / Clean-Registry (push) Successful in -4s
2026-02-03 20:24:35 +01:00
79924094e4 Merge branch 'feature/markdown_save_state' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m27s
Build Docker Image / Clean-Registry (push) Successful in -4s
2026-02-03 16:15:30 +01:00
4f4174df8d Merge branch 'main' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m19s
Build Docker Image / Clean-Registry (push) Successful in -4s
2026-02-03 14:07:14 +01:00
f052b62a30 Merge branch 'feature/kanban_new_task_form' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m6s
Build Docker Image / Clean-Registry (push) Successful in -4s
2026-02-03 12:17:04 +01:00
b7c2bcb741 Merge branch 'feature/kanban_new_task_form' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m23s
Build Docker Image / Clean-Registry (push) Successful in -4s
2026-02-03 12:09:32 +01:00
c5099e41f8 Merge branch 'feature/kanban_new_task_form' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m12s
Build Docker Image / Clean-Registry (push) Successful in -4s
2026-02-03 11:53:16 +01:00
f08f7a0852 Merge branch 'feature/kanban_new_task_form' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m20s
Build Docker Image / Clean-Registry (push) Successful in -4s
2026-02-03 10:55:15 +01:00
2a134b72b7 Merge branch 'feature/task_easy_list' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m20s
Build Docker Image / Clean-Registry (push) Successful in -4s
2026-02-02 23:12:31 +01:00
3b6e84d1af improved easylist: now toggling task state between pending and open
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-02-02 23:12:23 +01:00
75441c3260 Merge branch 'feature/notifications' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m16s
Build Docker Image / Clean-Registry (push) Successful in -4s
2026-02-02 22:06:55 +01:00
fd3d01b905 Merge branch 'legacy_default_template' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m10s
Build Docker Image / Clean-Registry (push) Successful in -3s
2026-02-02 12:25:33 +01:00
efd0773e5c minor css improvement
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-02-02 12:25:23 +01:00
b2241c3504 Merge branch 'legacy_default_template' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m16s
Build Docker Image / Clean-Registry (push) Successful in -3s
2026-02-02 12:16:30 +01:00
7f48fc12c8 added legacy css for default theme
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-02-02 12:16:10 +01:00
3ba49ed87f Merge branch 'feature/notifications' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m14s
Build Docker Image / Clean-Registry (push) Successful in -2s
2026-01-29 20:04:12 +01:00
018d67e959 Merge branch 'feature/notifications' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m12s
Build Docker Image / Clean-Registry (push) Successful in -3s
2026-01-29 12:27:21 +01:00
f2065c5be6 Merge branch 'bugfix/patch_project_state' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m30s
Build Docker Image / Clean-Registry (push) Successful in -2s
2026-01-29 10:21:05 +01:00
a921fac87e Merge branch 'main' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m15s
Build Docker Image / Clean-Registry (push) Successful in -2s
2026-01-28 20:49:16 +01:00
80a471d904 Merge branch 'search' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m21s
Build Docker Image / Clean-Registry (push) Successful in -2s
2026-01-28 15:52:33 +01:00
09a6a809b2 Merge branch 'search' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m4s
Build Docker Image / Clean-Registry (push) Successful in -2s
2026-01-28 15:34:04 +01:00
6656b67ae7 Merge branch 'search' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m32s
Build Docker Image / Clean-Registry (push) Successful in -2s
2026-01-28 15:22:50 +01:00
b050f06467 Merge branch 'search' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m55s
Build Docker Image / Clean-Registry (push) Successful in -3s
2026-01-28 08:44:58 +01:00
06189dff5b Merge branch 'feature/notifications' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m9s
Build Docker Image / Clean-Registry (push) Successful in -2s
2026-01-28 00:42:04 +01:00
31bb075be7 Merge branch 'feature/fallback_sender' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m13s
Build Docker Image / Clean-Registry (push) Successful in -2s
2026-01-28 00:37:02 +01:00
f6f9a7c18b Merge branch 'feature/wiki_fulltext_search' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m24s
Build Docker Image / Clean-Registry (push) Successful in -2s
2026-01-27 22:06:06 +01:00
6fe1c82e05 Merge branch 'search_order' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m26s
Build Docker Image / Clean-Registry (push) Successful in -1s
2026-01-27 21:41:19 +01:00
3070f67274 Merge branch 'feature/notifications' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m19s
Build Docker Image / Clean-Registry (push) Successful in -2s
2026-01-27 19:54:05 +01:00
b238b21a6a Merge branch 'feature/notifications' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m13s
Build Docker Image / Clean-Registry (push) Successful in -2s
2026-01-27 16:06:24 +01:00
9221449ecf Merge branch 'docker-optimize' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m11s
Build Docker Image / Clean-Registry (push) Successful in -2s
2026-01-27 15:44:57 +01:00
866ce71b30 Merge branch 'feature/notifications' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m19s
Build Docker Image / Clean-Registry (push) Successful in -1s
2026-01-27 11:40:09 +01:00
2088cd608d Merge branch 'feature/notifications' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m19s
Build Docker Image / Clean-Registry (push) Successful in -2s
2026-01-27 11:24:35 +01:00
752a487cb0 Merge branch 'feature/notifications' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m6s
Build Docker Image / Clean-Registry (push) Successful in -1s
2026-01-27 09:17:55 +01:00
e48538727f Merge branch 'feature/notifications' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m5s
Build Docker Image / Clean-Registry (push) Successful in -2s
2026-01-27 08:45:02 +01:00
cdb8814f20 Merge branch 'docker-optimize' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m12s
Build Docker Image / Clean-Registry (push) Successful in 0s
2026-01-27 00:58:18 +01:00
b56979881f further improvements in Dockerfile
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m39s
Build Docker Image / Clean-Registry (push) Successful in -1s
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-01-27 00:40:45 +01:00
59d54b734b Merge branch 'feature/notifications' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m21s
Build Docker Image / Clean-Registry (push) Successful in -2s
2026-01-27 00:20:13 +01:00
c25c342d15 Merge branch 'feature/notifications' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m20s
Build Docker Image / Clean-Registry (push) Successful in -2s
2026-01-26 20:45:41 +01:00
6c183d0467 Merge branch 'feature/notifications' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m26s
Build Docker Image / Clean-Registry (push) Successful in -1s
2026-01-26 17:10:37 +01:00
66ea13186a Merge branch 'feature/notifications' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m30s
Build Docker Image / Clean-Registry (push) Successful in -1s
2026-01-25 22:42:36 +01:00
710ac289ec Merge branch 'feature/notifications' into dev
Some checks failed
Build Docker Image / Docker-Build (push) Successful in 2m20s
Build Docker Image / Clean-Registry (push) Failing after 15m16s
2026-01-25 12:51:42 +01:00
dc5044243b Merge branch 'bugfix/timezone' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m40s
Build Docker Image / Clean-Registry (push) Successful in -1s
2026-01-23 23:18:18 +01:00
b4e0b5ad6a Merge branch 'docker-optimize' into dev
Some checks failed
Build Docker Image / Docker-Build (push) Failing after 2m17s
Build Docker Image / Clean-Registry (push) Successful in 0s
2026-01-23 23:10:35 +01:00
6f3338a95e Merge branch 'bugfix/timezone' into dev
Some checks failed
Build Docker Image / Docker-Build (push) Failing after 2m21s
Build Docker Image / Clean-Registry (push) Successful in 0s
2026-01-23 23:00:48 +01:00
28a08670d7 Merge branch 'feature/plantuml-cache' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m24s
Build Docker Image / Clean-Registry (push) Successful in -1s
2026-01-23 22:37:09 +01:00
5992bff658 Merge branch 'feature/plantuml-cache' into dev
Some checks failed
Build Docker Image / Docker-Build (push) Failing after 2m9s
Build Docker Image / Clean-Registry (push) Successful in 0s
2026-01-22 23:46:44 +01:00
63bc54fd1b Merge branch 'bugfix/markdown' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m28s
Build Docker Image / Clean-Registry (push) Successful in -1s
2026-01-22 20:47:42 +01:00
d7d2505847 minor rephrasing of debug message
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m16s
Build Docker Image / Clean-Registry (push) Successful in 0s
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-01-21 23:52:22 +01:00
93e568624e Merge branch 'feature/notifications' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m18s
Build Docker Image / Clean-Registry (push) Successful in 0s
2026-01-21 23:43:55 +01:00
335309e20a Merge branch 'bugfix/plantuml' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m15s
Build Docker Image / Clean-Registry (push) Successful in 0s
2026-01-20 22:52:36 +01:00
121457d793 Merge branch 'bugfix/image_scale' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m19s
Build Docker Image / Clean-Registry (push) Successful in 0s
2026-01-20 22:44:37 +01:00
6f3cb577b0 Merge branch 'bugfix/plantuml' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m25s
Build Docker Image / Clean-Registry (push) Successful in 0s
2026-01-20 22:20:25 +01:00
9386668db0 Merge branch 'module/messagebus' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m27s
Build Docker Image / Clean-Registry (push) Successful in 0s
2026-01-20 20:22:09 +01:00
be2235b873 Merge branch 'bugfix/mail-constants' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m17s
Build Docker Image / Clean-Registry (push) Successful in 0s
2026-01-19 22:49:04 +01:00
8c351440c8 bugfix: renamed cosntant to make system use the right string
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-01-19 22:48:28 +01:00
5a745659b9 Merge branch 'main' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m17s
Build Docker Image / Clean-Registry (push) Successful in 0s
2026-01-19 22:30:05 +01:00
ab5a74eac7 Merge branch 'module/messagebus' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m36s
Build Docker Image / Clean-Registry (push) Successful in 0s
2026-01-19 21:13:09 +01:00
268cea0550 Merge branch 'feature/translation' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m10s
Build Docker Image / Clean-Registry (push) Successful in 2s
2026-01-16 17:10:00 +01:00
5b7bc95614 Merge branch 'module/files' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m32s
Build Docker Image / Clean-Registry (push) Successful in 1s
2026-01-16 15:49:51 +01:00
41b6af88db Merge branch 'module/files' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m29s
Build Docker Image / Clean-Registry (push) Successful in 1s
2026-01-16 09:25:42 +01:00
c75a8a4274 Merge branch 'feature/translation' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m14s
Build Docker Image / Clean-Registry (push) Successful in 1s
2026-01-15 22:54:41 +01:00
4a6bdfb215 Merge branch 'feature/translation' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m41s
Build Docker Image / Clean-Registry (push) Successful in 2s
2026-01-15 14:31:32 +01:00
f85e86bedf Merge branch 'module/journal' into dev 2026-01-12 23:52:39 +01:00
2e858e8506 bugfix: Task.tags failed when null was passed
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m11s
Build Docker Image / Clean-Registry (push) Successful in 3s
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-01-12 23:17:22 +01:00
1c104af4a6 enabled debugging in dev branch
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m17s
Build Docker Image / Clean-Registry (push) Successful in 2s
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-01-12 23:08:00 +01:00
fafe20e9e2 Merge branch 'module/journal' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m14s
Build Docker Image / Clean-Registry (push) Successful in 3s
2026-01-12 22:41:29 +01:00
83c19a7799 fixed Docker build
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-01-12 21:25:28 +01:00
a990903e3d Merge branch 'bugfix/wikipage' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 4m26s
Build Docker Image / Clean-Registry (push) Successful in 18s
2026-01-10 22:47:12 +01:00
a9a518e508 Merge branch 'module/journal' into dev 2026-01-10 22:26:24 +01:00
934aa9bc89 Merge branch 'bugfix/wikipage' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 4m57s
Build Docker Image / Clean-Registry (push) Successful in 23s
2026-01-10 15:26:58 +01:00
6406580385 added call to make.eldorado.srsoftware.de
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 3m7s
Build Docker Image / Clean-Registry (push) Successful in 1s
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-01-05 23:15:50 +01:00
562c854a5b Merge branch 'bugfix/doc_template' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m35s
Build Docker Image / Clean-Registry (push) Successful in 2s
2026-01-05 10:35:51 +01:00
73994d3a4e Merge branch 'bugfix/time_filtered_by_prj' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m40s
Build Docker Image / Clean-Registry (push) Successful in 3s
2026-01-05 08:49:30 +01:00
ac2f974e5a Merge branch 'workflow' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m31s
Build Docker Image / Clean-Registry (push) Successful in 3s
2026-01-03 23:55:31 +01:00
cd25d23246 Merge branch 'feature/workflow' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m40s
2026-01-03 22:17:39 +01:00
8d2f3ef88e fixed tagging
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-01-03 22:17:30 +01:00
8e53d3b306 Merge branch 'feature/workflow' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 41s
2026-01-03 22:14:28 +01:00
bd95c3d0c4 debugging
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-01-03 22:14:22 +01:00
421a350f57 Merge branch 'feature/workflow' into dev
Some checks failed
Build Docker Image / Docker-Build (push) Has been cancelled
2026-01-03 22:13:31 +01:00
dceb84669b debugging
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-01-03 22:13:21 +01:00
eaeb625d51 Merge branch 'feature/workflow' into dev
Some checks failed
Build Docker Image / Docker-Build (push) Failing after 2m32s
2026-01-03 22:03:10 +01:00
e980dbf884 working on tag creation
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
2026-01-03 22:03:04 +01:00
dfa991b90a Merge branch 'feature/workflow' into dev
Some checks failed
Build Docker Image / Docker-Build (push) Failing after 2m31s
2026-01-03 21:41:56 +01:00
3b40250488 Merge branch 'feature/workflow' into dev
Some checks failed
Build Docker Image / Docker-Build (push) Failing after 2m29s
2026-01-03 21:37:50 +01:00
8e8992f534 Merge branch 'feature/workflow' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m39s
2026-01-03 21:32:59 +01:00
076efda195 Merge branch 'feature/workflow' into dev
Some checks failed
Build Docker Image / Docker-Build (push) Failing after 2m46s
2026-01-03 21:23:29 +01:00
5c1e802a6f Merge branch 'feature/workflow' into dev
All checks were successful
Build Docker Image / Docker-Build (push) Successful in 2m42s
2026-01-03 21:13:42 +01:00
750e0f16e1 Merge branch 'feature/workflow' into dev
Some checks failed
Build Docker Image / Docker-Build (push) Failing after 2m43s
2026-01-03 21:07:38 +01:00
c06083476f Merge branch 'feature/workflow' into dev
Some checks failed
Build Docker Image / Docker-Build (push) Failing after 0s
2026-01-03 21:06:39 +01:00
f784ec6109 Merge branch 'main' into dev 2025-12-28 14:10:06 +01:00
23 changed files with 1019 additions and 29 deletions

View File

@@ -41,10 +41,10 @@ jobs:
docker push ${{ secrets.REGISTRY_PATH }}/umbrella:${{ gitea.ref_name }}
docker push ${{ secrets.REGISTRY_PATH }}/umbrella:$TAG
- name: Restart vj.srsoftware.de
if: github.ref == 'refs/heads/main'
- name: Restart umbrella.srsoftware.de
if: github.ref == 'refs/heads/dev'
run: |
curl -X POST -H "Authorization: Bearer ${{ secrets.MAKE_BEARER }}" -d vj_start https://make.srsoftware.de/launch
curl -X POST -H "Authorization: Bearer ${{ secrets.ELDORADO_MAKE_BEARER }}" -d umbrella_25_start https://make.eldorado.srsoftware.de/launch
Clean-Registry:
runs-on: ubuntu-latest

View File

@@ -22,7 +22,7 @@ RUN apk --no-cache add bash fontconfig font-opensans graphviz openjdk21-jre tzda
WORKDIR /home/umbrella
EXPOSE 80
CMD java -jar jar/backend.jar
CMD java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:9999 -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/

View File

@@ -37,12 +37,51 @@ import org.json.JSONObject;
public class Util {
public static final System.Logger LOG = System.getLogger("Util");
private static final Pattern UML_PATTERN = Pattern.compile("@start(\\w+)(.*?)@end(\\1)",Pattern.DOTALL);
private static final Pattern SPREADSHEET_PATTERN = Pattern.compile("@startsheet(.*?)@endsheet",Pattern.DOTALL);
private static File plantumlJar = null;
private static final JParsedown MARKDOWN = new JParsedown();
public static final String SHA1 = "SHA-1";
private static final MessageDigest SHA1_DIGEST;
private static final Map<Integer,String> umlCache = new HashMap<>();
private static final String SCRIPT = """
<script src="http://127.0.0.1:8080/js/jspreadsheet-ce.js"></script>
<div id="spreadsheet"></div>
<script type="application/javascript">
alert('Test');
jspreadsheet(document.getElementById('spreadsheet'), {
worksheets: [
{
data: [
['Jazz', 'Honda', '2019-02-12', '', true, '$ 2.000,00', '#777700'],
['Civic', 'Honda', '2018-07-11', '', true, '$ 4.000,01', '#007777'],
],
columns: [
{ type: 'text', title: 'Car', width: 120 },
{
type: 'dropdown',
title: 'Make',
width: 200,
source: ['Alfa Romeo', 'Audi', 'Bmw', 'Honda'],
},
{ type: 'calendar', title: 'Available', width: 200 },
{ type: 'image', title: 'Photo', width: 120 },
{ type: 'checkbox', title: 'Stock', width: 80 },
{
type: 'numeric',
title: 'Price',
width: 100,
mask: '$ #.##,00',
decimal: ',',
},
{ type: 'color', width: 100, render: 'square' },
],
},
],
});
</script>
""";
static {
try {
SHA1_DIGEST = MessageDigest.getInstance(SHA1);
@@ -79,8 +118,22 @@ public class Util {
public static String markdown(String source){
if (source == null) return source;
try {
var matcher = SPREADSHEET_PATTERN.matcher(source);
var count = 0;
while (matcher.find()){
count++;
var sheetData = matcher.group(0).trim();
var start = matcher.start(0);
var end = matcher.end(0);
source = source.substring(0, start)
+ "<div class=\"spreadsheet\" id=\"spreadsheet-"+count+"\">"
+ sheetData.substring(11,sheetData.length()-10)
+ "</div>"
+ source.substring(end);
matcher = SPREADSHEET_PATTERN.matcher(source);
}
if (plantumlJar != null && plantumlJar.exists()) {
var matcher = UML_PATTERN.matcher(source);
matcher = UML_PATTERN.matcher(source);
while (matcher.find()) {
var uml = matcher.group(0).trim();
var start = matcher.start(0);

View File

@@ -8,6 +8,7 @@
"name": "frontend",
"version": "0.0.0",
"dependencies": {
"jspreadsheet-ce": "^5.0.4",
"svelte-tiny-router": "^1.0.5"
},
"devDependencies": {
@@ -488,6 +489,11 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"node_modules/@jspreadsheet/formula": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/@jspreadsheet/formula/-/formula-2.0.2.tgz",
"integrity": "sha512-PDQYf9REQA53I7tVYkvkeyQxrd5jcjUeHgItYnRpjN2QiIQwawSqBDtGGEVQTSboTG+JwgGCuhvOpj7FxeKwew=="
},
"node_modules/@rollup/rollup-android-arm-eabi": {
"version": "4.44.1",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.1.tgz",
@@ -951,6 +957,20 @@
"@types/estree": "^1.0.6"
}
},
"node_modules/jspreadsheet-ce": {
"version": "5.0.4",
"resolved": "https://registry.npmjs.org/jspreadsheet-ce/-/jspreadsheet-ce-5.0.4.tgz",
"integrity": "sha512-ra1JI1n+tEGgRMzTzNkPZjG0HZz8W6bFGAiTiHl+eYarXdRmS5qDc/ua3l2ev7oZ6Og9kjfrXYHVLUWiVc308w==",
"dependencies": {
"@jspreadsheet/formula": "^2.0.2",
"jsuites": "^5.12.0"
}
},
"node_modules/jsuites": {
"version": "5.13.5",
"resolved": "https://registry.npmjs.org/jsuites/-/jsuites-5.13.5.tgz",
"integrity": "sha512-cvkcpy/v5I3+IAcNPE4UP38PFCEfUQw9JI5NN61dlcXLwkD+2UTIOsRPvgMLeqI1eDWHL4AHfrbcE/+TFciUsw=="
},
"node_modules/kleur": {
"version": "4.1.5",
"dev": true,

View File

@@ -14,6 +14,7 @@
"vite": "^6.3.5"
},
"dependencies": {
"jspreadsheet-ce": "^5.0.4",
"svelte-tiny-router": "^1.0.5"
}
}

View File

@@ -33,6 +33,7 @@
import ResetPw from "./routes/user/ResetPw.svelte";
import Search from "./routes/search/Search.svelte";
import SendDoc from "./routes/document/Send.svelte";
import Spreadsheet from "./routes/calc.svelte";
import Stock from './routes/stock/Index.svelte';
import TagList from "./routes/tags/Index.svelte";
import TagUses from "./routes/tags/TagUses.svelte";
@@ -89,6 +90,7 @@
<Route path="/" component={User} />
<Route path="/bookmark" component={Bookmarks} />
<Route path="/bookmark/:id/view" component={Bookmark} />
<Route path="/calc" component={Spreadsheet} />
<Route path="/company" component={Companies} />
<Route path="/contact" component={ContactList} />
<Route path="/document" component={DocList} />

View File

@@ -0,0 +1,78 @@
<script>
import { onMount, onDestroy } from 'svelte';
let { classes='markdown', markdown=$bindable({source:'',rendered:''}), onclick = null, oncontextmenu = null, title='', wrapper = 'div' } = $props();
let jspreadsheet = null;
const regex = /@startsheet[\s\S]*?@endsheet/g;
const number = /^[0-9.-]+$/
function update(sheet, index){
const data = sheet.getData(false,false,'|',false);
markdown.source = replaceNthSpreadsheet(markdown.source,index,data);
}
function replaceNthSpreadsheet(text, n, newContent) {
const blocks = text.match(regex) || [];
if (blocks.length < n+1){
console.warn(`cannot replace block ${n}: only ${blocks.length} blocks found!`);
return text;
}
let count = 0;
return text.replace(regex, (match) => count++ === n ? `@startsheet\n${newContent}\n@endsheet` : match);
}
function formatCell(cell, value, x, y, instance, options){
value = value.trim();
if (value.startsWith('=') || number.test(value)) cell.style.textAlign = 'right';
}
async function transform(){
if (!markdown.rendered) return;
let sheets = document.getElementsByClassName('spreadsheet');
for (let i = 0; i < sheets.length; i++) {
if (!jspreadsheet) {
let module = await import('jspreadsheet-ce'); // path or package name
await import('jspreadsheet-ce/dist/jspreadsheet.css');
jspreadsheet = module.default ?? module;
}
if (!jspreadsheet) break; // break loop if library fails to load
let sheet = sheets[i];
let raw = sheet.innerHTML.trim();
// Use parseCSV from the helpers
const parsed = jspreadsheet.helpers.parseCSV(raw, '|');
let columns = {};
for (let row of parsed){
for (let col in row){
let data = ""+row[col];
if (data.startsWith('=')) continue;
let len = data.length;
columns[col] = Math.max(columns[col]??0,len);
}
}
columns = Object.values(columns).map((len) => {return {
align: 'left',
render: formatCell,
width:`${len}0px`
}});
let config = {
worksheets : [{
data:parsed,
columns
}],
onchange : (instance, cell, x, y, value) => update(instance, i)
};
let wb = jspreadsheet(document.getElementById(sheet.id), config);
}
}
onMount(() => { setTimeout(transform,200)});
</script>
{#if markdown.rendered}
<svelte:element this={wrapper} class={classes} {onclick} {oncontextmenu} {title}>
{@html markdown.rendered}
</svelte:element>
{/if}

View File

@@ -3,6 +3,8 @@
import { api, target } from '../urls.svelte.js';
import { t } from '../translations.svelte.js';
import Display from './MarkdownDisplay.svelte';
let {
editable = true,
onclick = evt => {},
@@ -136,7 +138,7 @@
<span id="restore_markdown" onclick={restore} class="hint">{t('unsaved_content')}</span>
{/if}
<textarea bind:value={editValue.source} onkeyup={typed} autofocus={!simple}></textarea>
<div class="preview">{@html target(editValue.rendered)}</div>
<Display classes="preview" bind:markdown={editValue} />
{#if !simple}
<div class="buttons">
<button class="cancel" onclick={e => editing = false}>{t('cancel')}</button>
@@ -144,6 +146,6 @@
</div>
{/if}
{:else}
<svelte:element this={type} {onclick} {oncontextmenu} class={{editable}} title={t('right_click_to_edit')} >{@html target(value.rendered)}</svelte:element>
<Display classes={{editable}} markdown={value} {onclick} {oncontextmenu} title={t('right_click_to_edit')} wrapper={type} />
{/if}
</div>

View File

@@ -0,0 +1,59 @@
<script>
import { onMount } from 'svelte';
var spreadsheet = null;
const config = {
worksheets: [{
data: [
["1","Sum of A:","=SUM(A1:A99)"],
["2"],
["3"],
["4"]
],
columns: [
{ type: 'autonumber', title: 'amount' },
{ type: 'text', width: '350px', title: 'description', align: 'right' },
{ type: 'text', width: '250px', title: 'value' },
],
// Name of the worksheet
worksheetName: 'Albums'
}],
onchange: update
};
function update(instance, cell, x, y, value) {
console.log({instance,cell,x,y,value});
console.log(spreadsheet[0].getData());
}
let loading = true;
let module = null;
async function load(){
try {
const module = await import('jspreadsheet-ce'); // path or package name
await import('jspreadsheet-ce/dist/jspreadsheet.css');
let jspreadsheet = module.default ?? module;
let element = document.getElementById('spreadsheet');
console.log(element);
spreadsheet = jspreadsheet(element, config);
} catch (e) {
console.log(e);
} finally {
loading = false;
}
}
onMount(load);
</script>
{#if loading}
Loading…
{:else}
{/if}
<div id="spreadsheet">Spreadsheet loading…</div>

View File

@@ -76,11 +76,9 @@
<table>
<tbody>
<tr>
<td>{t('ID')}</td>
<td>{item.id}</td>
</tr>
<tr>
<td>{t('Code')}:</td>
<td>
{t('ID')}
</td>
<td>
<LineEditor type="span" editable={true} value={item.code} onSet={v => update('code',v)} />
</td>

View File

@@ -88,8 +88,8 @@
function onclick(evt) {
ignore(evt);
let task = getTask(evt);
if (task.status <= 20) { // open
update(task,60);
if (task.status == 20) { // open
update(task,10);
} else update(task,20);
return false;
}
@@ -153,7 +153,7 @@
<legend>{t('state_complete')}</legend>
{#if sorted}
{#each sorted as task}
{#if task.status > 20 && match(task)}
{#if task.status < 20 && match(task)}
<div href={`/task/${task.id}/view`} title={task.description.source} task_id={task.id} {onclick} {oncontextmenu} {ontouchstart} {ontouchend} onmousedown={ontouchstart} onmouseup={ontouchend} >
{task.name}
</div>

View File

@@ -0,0 +1,84 @@
body{
color: orange;
background-color: black;
}
a{
color: red;
}
.tasks .pending>a{
color: gray;
}
.completed>a,
.started>a{
color: #5bc500;
}
.canceled>a{
color: gray;
}
tr{
background-color: #52525270;
}
tr:nth-child(2n+1){
background-color: #a7a7a740;
}
fieldset {
border-color: orange;
}
.button,
input,
button {
background-color: orange;
color: #303030;
}
.hover{
background-color: black;
border-color: orange;
}
form.invoice textarea {
background-color: orange;
color: black;
}
.infos span{
background-color: #00ad00;
color: black;
}
.errors span{
background-color: #ff9847;
color: black;
}
.warnings span{
background-color: #ffff00;
color: black;
}
#announce{
background-color: black;
}
#main_menu .button:hover {
color: orange;
background-color: gray;
}
tr:hover td{
background-color: #160202;
}
code {
background-color: black;
color: orange;
}
.description img,
#preview img{
background: lightcyan;
}

View File

@@ -0,0 +1,584 @@
@font-face {
font-family: "awesome";
src: url("../fontawesome-webfont.woff");
}
*{
max-width:100%;
min-width:auto;
}
a{
text-decoration: none;
}
body{
font-family: sans-serif;
}
code {
display: inline-block;
padding: 5px;
margin: 5px 0;
}
textarea {
min-height: 60px;
width: 100%;
font-size: 16px;
}
textarea:hover{
min-height: 400px;
width: 100%;
}
input[type=text],input[type=email]{
width: 100%;
}
td.connectors form input{
width: 200px;
}
img#logo{
position: fixed;
top: 10px;
right: 10px;
z-index: -1;
}
blockquote{
font-style: italic;
}
#main_menu,
#main_menu form{
display: inline;
}
#main_menu .button {
font-size: 12px;
font-weight: normal;
margin-top: 7px;
vertical-align: bottom;
}
.hidden{
display: none !important;
}
.hover:hover .hidden{
display: inherit !important;
}
.emphasized{
font-weight: bold;
}
.add_positions,
.requirements{
max-height: 60px;
max-width: 66%;
overflow: hidden;
}
.add_positions:hover,
.requirements:hover{
max-height: 999999px;
max-width: 999999px;
}
.add_positions > ul > li{
max-height: 20px;
overflow: hidden;
padding-top: 20px;
}
.add_positions > ul > li:hover{
max-height: 999999px;
}
fieldset.add.document:hover {
max-height: unset;
}
fieldset.add.document {
max-height: 5px;
overflow: hidden;
}
fieldset.options label,
.add_positions label span,
.poll_status label,
.requirements label{
display: block;
}
.tasks .canceled a,
.children .inactive,
.requirements .inactive,
.tasks .inactive{
text-decoration: line-through;
}
.tasks .navi a{
display: inline-table;
}
blockquote a,
p a,
.description a{
text-decoration: underline;
}
table {
border-collapse: collapse;
}
tr > *{
padding: 5px 10px;
}
label.street:after,
label.location::after {
content: "\a ";
white-space: pre;
}
.poll.evaluate table tr:nth-child(n+2) th,
.poll.evaluate table td{
text-align: right;
}
.poll .disabled{
text-decoration: line-through;
}
.company div > fieldset,
.company > table{
margin-right: 10px;
float: left;
}
table.time h2{
margin-right: 60px;
}
.file label,
.document .dates label{
display: block
}
.document .header,
.document .tags{
clear: both;
}
fieldset {
border-radius: 10px;
border-width: 1px;
}
.contacts fieldset,
.document .customer,
.document .document_type,
.document .sender,
.document .court,
.document .dates,
.document .template,
fieldset.del_note,
fieldset.login_service_list,
fieldset.userlist,
fieldset.document.list{
float: left;
}
.document .dates label{
text-align: right;
}
.button,
input,
button {
border: 0 none;
font-weight: bold;
margin: 0 2px;
padding: 3px;
display: inline-block;
}
.change_state,
td.connectors button[type="submit"],
.prop_action,
input[type="submit"] {
clear: both;
float: right;
}
.symbol{
font-family: awesome;
font-size: 20px;
font-weight: normal;
}
#main_menu .symbol{
font-size: 14px;
}
.right{
float: right;
margin: 0 0 0 5px;
}
.tasks .project {
font-weight: bold;
}
.right-abs {
position: absolute;
right: 5px;
top: 5px;
}
.right-fix {
position: fixed;
right: 5px;
top: 5px;
}
.hover {
border-width: 1px;
border-style: solid;
border-radius: 5px;
max-height: 35px;
overflow: hidden;
z-index: 10;
}
.hover:hover {
max-height: unset;
}
.hover_h > a:nth-child(n+2){
display: none;
}
.hover_h:hover {
padding: 5px 0 20px;
}
.hover_h:hover > a:nth-child(n+2){
display: inherit;
}
form.document textarea {
font-weight: bold;
min-height: 90px;
width: 100%;
}
.pos_price,
form.document input.price,
form.document input.amount{
max-width: 60px;
text-align: right;
}
form.document .tax{
min-width: 70px;
}
form.document .tax input{
max-width: 40px;
text-align: right;
}
td > h1{
display: inline-block;
margin: 0 10px 0 0;
}
.center,
.infos,
.errors,
.warnings{
text-align: center;
}
.infos span,
.errors span,
.warnings span{
margin: 5px 0 0;
padding: 5px;
border-radius: 10px;
display: inline-block;
}
.tags span{
display: inline-block;
vertical-align: top;
}
.bookmark .share,
.bookmark .tags{
display: inline-block;
}
.bookmark form .share{
height: 20px;
overflow: hidden;
}
.bookmark form .share:hover{
height: initial;
}
fieldset.bookmark > fieldset{
max-height: 14px;
overflow: hidden;
}
fieldset.bookmark > fieldset.tags{
max-height: unset;
}
fieldset.bookmark > fieldset:hover{
max-height: unset;
}
.bookmark>fieldset>a{
word-wrap: break-word;
display: block;
min-width: auto;
}
.bookmark>fieldset>a.button{
display: inline-block;
}
.copytext{
position:fixed;
width: 100px;
left: -1000px;
}
img[src*="pos=right"] {
float:right;
margin: 5px 0 5px 5px;
}
img[src*="pos=left"] {
float:left;
margin: 5px 5px 5px 0;
}
img[src*="width=100"]{
max-width: 100px;
}
img[src*="width=200"]{
max-width: 200px;
}
img[src*="width=300"]{
max-width: 300px;
}
img[src*="width=400"]{
max-width: 400px;
}
img[src*="width=500"]{
max-width: 500px;
}
img[src*="width=600"]{
max-width: 600px;
}
img[src*="width=700"]{
max-width: 700px;
}
img[src*="width=800"]{
max-width: 800px;
}
img[src*="width=900"]{
max-width: 900px;
}
img[src*="width=50%"]{
max-width: 50%;
}
img[src*="width=33%"]{
max-width: 33%;
}
img[src$="width=25%"]{
max-width: 25%;
}
#announce{
position: fixed;
bottom: 0;
right: 0;
padding: 3px 5px 0;
border-top-left-radius: 7px;
}
fieldset.scrolling{
overflow: scroll;
max-height: 80%;
}
svg#gantt{
max-width: unset;
}
svg .row{
fill: none;
pointer-events: all;
}
svg .row:hover{
fill: #333333;
}
svg .duration{
fill:rgba(255,0,255,0.4);
stroke:none;
}
svg .schedule{
fill:none;
stroke-width:1;
stroke: yellow;
}
svg .start{
stroke-dasharray: 10,30,40;
}
svg .stop{
stroke-dasharray: 50,30;
}
svg text{
stroke: none;
fill: red;
}
div.search{
display: inline-block;
max-width: 150px;
}
div.search input,
div.search label{
display: none;
}
div.search:hover input,
div.search:hover label{
display: initial;
}
.note td.code {
width: 50%;
}
.note td.code textarea {
min-height: 200px;
}
.project-index td .users{
max-height: 30px;
overflow: hidden;
}
.project-index tr:hover td .users{
max-height: none;
}
.easylist fieldset a.button {
width: 80%;
padding: 30px;
text-align: center;
}
#preview,
#preview-source{
display: inline-block;
max-width: calc(50% - 20px);
vertical-align: bottom;
}
table #preview,
table #preview-source{
display: inherit;
max-width: unset;
vertical-align: inherit;
}
#preview.loading{
opacity: 0.2;
}
.completed > a::before {
content: " ✓";
}
@media (max-width:1199px) {
*[hide="12"]{
display: none;
}
table.document input{
max-width: 100px;
}
}
@media (max-width: 900px){
*[hide="9"]{
display: none;
}
table.document input{
max-width: 60px;
}
table.document .tax input,
table.document input.amount{
max-width: 25px;
}
}
@media (max-width: 800px){
*[hide="8"]{
display: none;
}
}
@media (max-width: 700px){
*[hide="7"]{
display: none;
}
fieldset.bookmark > fieldset{
max-height: 50px;
}
#preview,
#preview-source{
display: block;
max-width: unset;
}
}
@media (max-width: 600px){
*[hide="6"]{
display: none;
}
.easylist fieldset a.button {
width: 60%;
}
}
@media (max-width: 500px){
*[hide="5"]{
display: none;
}
}
@media (max-width: 400px){
*[hide="4"]{
display: none;
}
}
@media print{
fieldset.note span.right,
#logo, #main_menu {
display: none;
}
fieldset.process, fieldset.database{
page-break-after: always;
}
.export>fieldset{
border: 0 none;
}
}

View File

@@ -0,0 +1,41 @@
.arrow{
stroke: orange;
}
circle, ellipse, rect{
stroke: black;
}
ellipse,
circle.process{
fill: rgba(255,255,255,0.5);
}
rect.terminal{
fill: white;
}
circle.connector{
fill: rgba(0,0,0,0.05);
stroke: none;
}
circle.connector:hover{
fill: rgba(0,0,0,0.6);
}
#backdrop{
fill: transparent;
}
.arrow circle{
stroke: none;
fill: rgba(128,128,128,0.5);
}
.arrow text{
fill: black;
stroke: none;
}
.arrow:hover circle{
fill: rgba(255,0,0,0.3);
}
.process text{
fill: black;
}

View File

@@ -12,9 +12,18 @@ public class Constants {
public static final String CONFIG_SMTP_USER = "umbrella.modules.message.smtp.user";
public static final String DEBUG_ADDREESS = "umbrella.modules.message.debug_address";
public static final String ENVELOPE_FROM = "mail.smtp.from";
public static final String PORT = "mail.smtp.port";
public static final String SMTP_AUTH = "mail.smtp.auth";
public static final String SMTP_HOST = "mail.smtp.host";
public static final String SMTP_FROM = "mail.smtp.from";
public static final String SMTP_PORT = "mail.smtp.port";
public static final String SMTP_SSL = "mail.smtp.ssl.enable";
public static final String SSL = "mail.smtp.ssl.enable";
public static final String SUBMISSION = "submission";
public static final String PORT = "mail.smtp.port";
public static final String TABLE_ATTACHMENTS = "attachments";
public static final String TABLE_MESSAGES = "messages";

View File

@@ -93,10 +93,10 @@ public class MessageSystem extends BaseHandler implements PostBox, EventListener
debugAddress = config.get(DEBUG_ADDREESS).map(Object::toString).orElse(null);
port = config.get(CONFIG_SMTP_PORT,587);
host = config.get(CONFIG_SMTP_HOST).map(Object::toString).orElseThrow(() -> new RuntimeException("umbrella.modules.message.smtp.host not configured!"));
user = config.get(CONFIG_SMTP_USER).map(Object::toString).orElseThrow(() -> new RuntimeException("umbrella.modules.message.smtp.user not configured!"));
pass = config.get(CONFIG_SMTP_PASS).map(Object::toString).orElseThrow(() -> new RuntimeException("umbrella.modules.message.smtp.pass not configured!"));
from = user;
host = config.get(CONFIG_SMTP_HOST).map(Object::toString).orElseThrow(() -> missingConfig(CONFIG_SMTP_HOST));
user = config.get(CONFIG_SMTP_USER).map(Object::toString).orElseThrow(() -> missingConfig(CONFIG_SMTP_USER));
pass = config.get(CONFIG_SMTP_PASS).map(Object::toString).orElseThrow(() -> missingConfig(CONFIG_SMTP_PASS));
from = config.get(CONFIG_SMTP_FROM).map(Object::toString).orElseThrow(() -> missingConfig(CONFIG_SMTP_FROM));
ModuleRegistry.add(this);
new SubmissionTask(8).schedule();
new SubmissionTask(10).schedule();
@@ -326,11 +326,11 @@ public class MessageSystem extends BaseHandler implements PostBox, EventListener
private Session session() {
if (session == null){
Properties props = new Properties();
props.put(HOST, host);
props.put(PORT, port);
props.put(AUTH, true);
props.put(SSL, true);
props.put(ENVELOPE_FROM,from);
props.put(SMTP_HOST, host);
props.put(SMTP_PORT, port);
props.put(SMTP_AUTH, true);
props.put(SMTP_SSL, true);
props.put(SMTP_FROM,from);
session = Session.getInstance(props);
}
return session;

View File

@@ -27,9 +27,9 @@ public class CombinedMessage {
public CombinedMessage(Translatable subjectForCombinedMessage, User receiver, User fallbackSender){
LOG.log(DEBUG,"Creating combined message for {0}…",receiver);
this.subjectForCombinedMessage = subjectForCombinedMessage;
this.fallbackSender = fallbackSender;
this.receiver = receiver;
this.lang = receiver.language();
this.fallbackSender = fallbackSender;
}
public void addNote() {

View File

@@ -9,8 +9,7 @@ import static de.srsoftware.umbrella.core.constants.Field.PERMISSION;
import static de.srsoftware.umbrella.core.constants.Field.SETTINGS;
import static de.srsoftware.umbrella.core.constants.Field.TAGS;
import static de.srsoftware.umbrella.core.constants.Module.PROJECT;
import static de.srsoftware.umbrella.core.constants.Path.LIST;
import static de.srsoftware.umbrella.core.constants.Path.SEARCH;
import static de.srsoftware.umbrella.core.constants.Path.*;
import static de.srsoftware.umbrella.core.constants.Text.*;
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.*;
import static de.srsoftware.umbrella.core.model.Permission.*;

View File

@@ -226,7 +226,8 @@ public class StockModule extends BaseHandler implements StockService {
}
private boolean getChildLocations(UmbrellaUser user, long parentId, HttpExchange ex) throws IOException {
LOG.log(WARNING,"No security check implemented for {0}.getChildLocations(user, parentId, ex)!",getClass().getSimpleName()); // TODO check, that user is allowed to request that location
var owner = stockDb.loadLocation(parentId).owner();
if (!assigned(owner,user)) throw forbidden("You are not allowed to access items of {owner}", OWNER,owner);
return sendContent(ex, stockDb.listChildLocations(parentId).stream().sorted(comparing(l -> l.name().toLowerCase())).map(DbLocation::toMap));
}

View File

@@ -11,3 +11,20 @@ tasks.processResources {
}
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
fun download(url : String, destination : String){
var destFile = projectDir.toPath().resolve(destination).toFile();
destFile.parentFile.mkdirs()
if (!destFile.exists()) {
System.out.println("Downloading "+url)
ant.invokeMethod("get", mapOf("src" to url, "dest" to destFile))
}
}
tasks.register("downloadLib"){
download("https://bossanova.uk/jspreadsheet/v5/jspreadsheet.js", "src/main/resources/web/js/jspreadsheet-ce.js")
}
tasks.named("compileJava") {
dependsOn("downloadLib")
}

View File

@@ -317,6 +317,23 @@ tr:hover .taglist .tag button {
border: 1px solid red;
}
.jss_worksheet{
background: black !important;
border-right: 1px solid #333 !important;
border-bottom: 1px solid #333 !important;
}
.jss_worksheet > thead > tr > td,
.jss_worksheet > tbody > tr > td:first-child{
background: #730000 !important;
color: yellow;
}
.jss_worksheet td{
border-top: 1px solid #333 !important;
border-left: 1px solid #333 !important;
}
@media screen and (max-width: 900px) {
#app nav a{
background: black;

View File

@@ -308,6 +308,23 @@ tr:hover .taglist .tag button {
background: #a00;
}
.jss_worksheet{
background: black !important;
border-right: 1px solid #333 !important;
border-bottom: 1px solid #333 !important;
}
.jss_worksheet > thead > tr > td,
.jss_worksheet > tbody > tr > td:first-child{
background: orange !important;
color: black;
}
.jss_worksheet td{
border-top: 1px solid #333 !important;
border-left: 1px solid #333 !important;
}
@media screen and (max-width: 900px) {
#app nav a{
background: black;

File diff suppressed because one or more lines are too long