diff --git a/core/src/main/java/de/srsoftware/umbrella/core/Paths.java b/core/src/main/java/de/srsoftware/umbrella/core/Paths.java index f4c441d..14cd80a 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/Paths.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/Paths.java @@ -20,6 +20,7 @@ public class Paths { public static final String STARTED = "started"; public static final String STOP = "stop"; public static final String SUBMIT = "submit"; + public static final String TAGGED = "tagged"; public static final String TOKEN = "token"; public static final String VIEW = "view"; } diff --git a/core/src/main/java/de/srsoftware/umbrella/core/api/TagService.java b/core/src/main/java/de/srsoftware/umbrella/core/api/TagService.java index 4bb15ec..2198ef6 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/api/TagService.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/api/TagService.java @@ -4,11 +4,14 @@ package de.srsoftware.umbrella.core.api; import de.srsoftware.umbrella.core.exceptions.UmbrellaException; import de.srsoftware.umbrella.core.model.UmbrellaUser; import java.util.Collection; +import java.util.List; import java.util.Map; public interface TagService { void deleteEntity(String task, long taskId); + Map> getTagUses(UmbrellaUser user, String tag); + Collection getTags(String module, long entityId, UmbrellaUser user) throws UmbrellaException; /** diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte index c13dbac..6f75fca 100644 --- a/frontend/src/App.svelte +++ b/frontend/src/App.svelte @@ -13,6 +13,7 @@ import Companies from "./routes/company/Index.svelte"; import ContactList from "./routes/contact/Index.svelte"; import DocList from "./routes/document/List.svelte"; + import EasyList from "./routes/task/EasyList.svelte"; import EditService from "./routes/user/EditService.svelte"; import EditUser from "./routes/user/EditUser.svelte"; import FileIndex from "./routes/files/Index.svelte"; @@ -104,6 +105,7 @@ + diff --git a/frontend/src/routes/task/EasyList.svelte b/frontend/src/routes/task/EasyList.svelte new file mode 100644 index 0000000..e7cf39d --- /dev/null +++ b/frontend/src/routes/task/EasyList.svelte @@ -0,0 +1,104 @@ + + +
+
+ {t('filter')}: +
+ +
+ {t('state_open')} + {#if sorted} + {#each sorted as task} + {#if task.status == 20 && (!filter || task.name.toLowerCase().includes(search))} + close(e,task)} {oncontextmenu} > + {task.name} + + {/if} + {/each} + {/if} +
+ +
+ {t('state_complete')} + {#if sorted} + {#each sorted as task} + {#if task.status > 20 && (!filter || task.name.toLowerCase().includes(search))} + open(e,task)} {oncontextmenu} > + {task.name} + + {/if} + {/each} + {/if} +
+
\ No newline at end of file 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 f1c1763..095c2bd 100644 --- a/stock/src/main/java/de/srsoftware/umbrella/stock/StockModule.java +++ b/stock/src/main/java/de/srsoftware/umbrella/stock/StockModule.java @@ -9,7 +9,6 @@ import static de.srsoftware.umbrella.core.Field.ITEM; import static de.srsoftware.umbrella.core.ModuleRegistry.companyService; import static de.srsoftware.umbrella.core.ModuleRegistry.userService; import static de.srsoftware.umbrella.core.Paths.LIST; -import static de.srsoftware.umbrella.core.Util.mapValues; import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.*; import static de.srsoftware.umbrella.stock.Constants.*; import static java.lang.System.Logger.Level.WARNING; diff --git a/tags/src/main/java/de/srsoftware/umbrella/tags/TagModule.java b/tags/src/main/java/de/srsoftware/umbrella/tags/TagModule.java index 7dc48fa..c8e3dda 100644 --- a/tags/src/main/java/de/srsoftware/umbrella/tags/TagModule.java +++ b/tags/src/main/java/de/srsoftware/umbrella/tags/TagModule.java @@ -112,8 +112,12 @@ public class TagModule extends BaseHandler implements TagService { } } + public Map> getTagUses(UmbrellaUser user, String tag){ + return tagDb.getUses(tag,user.id()); + } + private boolean getTagUses(HttpExchange ex, String tag, UmbrellaUser user) throws IOException { - return sendContent(ex,tagDb.getUses(tag,user.id())); + return sendContent(ex,getTagUses(user,tag)); } public Collection getTags(String module, long entityId, UmbrellaUser user) throws UmbrellaException{ diff --git a/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java b/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java index 2253889..c1acdb9 100644 --- a/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java +++ b/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java @@ -1,8 +1,7 @@ /* © SRSoftware 2025 */ package de.srsoftware.umbrella.task; -import static de.srsoftware.tools.Optionals.is0; -import static de.srsoftware.tools.Optionals.isSet; +import static de.srsoftware.tools.Optionals.*; import static de.srsoftware.umbrella.core.ConnectionProvider.connect; import static de.srsoftware.umbrella.core.Constants.*; import static de.srsoftware.umbrella.core.ModuleRegistry.*; @@ -92,6 +91,7 @@ public class TaskModule extends BaseHandler implements TaskService { var head = path.pop(); return switch (head) { case PERMISSIONS -> getPermissionList(ex); + case TAGGED -> getTaggedTasks(path, user.get(), ex); case null -> getUserTasks(user.get(), ex); default -> { var taskId = Long.parseLong(head); @@ -179,6 +179,14 @@ public class TaskModule extends BaseHandler implements TaskService { return sendContent(ex, map); } + private boolean getTaggedTasks(Path path, UmbrellaUser user, HttpExchange ex) throws IOException { + var tag = path.toString(); + var tags = tagService().getTagUses(user,tag); + var taskIds = nullable(tags.get(TASK)).orElseGet(ArrayList::new); + var tasks = taskDb.load(taskIds); + return sendContent(ex, mapValues(tasks)); + } + private boolean getTask(HttpExchange ex, long taskId, UmbrellaUser user) throws IOException { var task = loadMembers(taskDb.load(taskId)); if (!task.hasMember(user)) throw forbidden("You are not a member of {0}",task.name()); diff --git a/web/src/main/resources/web/css/bloodshed-color.css b/web/src/main/resources/web/css/bloodshed-color.css index 0d9a697..8a89ab2 100644 --- a/web/src/main/resources/web/css/bloodshed-color.css +++ b/web/src/main/resources/web/css/bloodshed-color.css @@ -295,3 +295,12 @@ tr:hover .taglist .tag button { .vcard span.inactive{ color: #222200; } + +.easylist a { + border-color:orange; + color: orange; +} +.easylist fieldset { + border-color: red; + color: red; +} \ No newline at end of file diff --git a/web/src/main/resources/web/css/bloodshed.css b/web/src/main/resources/web/css/bloodshed.css index 509bf00..0c2a56e 100644 --- a/web/src/main/resources/web/css/bloodshed.css +++ b/web/src/main/resources/web/css/bloodshed.css @@ -407,6 +407,15 @@ a.wikilink{ grid-column-end: span 2; } +.easylist a { + display: block; + border: 1px solid; + margin: 7px; + padding: 5px; + border-radius: 5px; + text-align: center; +} + @media screen and (max-width: 600px) { .grid2{ display: grid; @@ -428,6 +437,13 @@ a.wikilink{ width: calc(100% - 10px); min-height: 50px; } + + .easylist a { + font-size: 25px; + } + .easylist input{ + font-size: 20px; + } } fieldset.vcard{ diff --git a/web/src/main/resources/web/css/default-color.css b/web/src/main/resources/web/css/default-color.css index 62599e4..8664570 100644 --- a/web/src/main/resources/web/css/default-color.css +++ b/web/src/main/resources/web/css/default-color.css @@ -285,3 +285,12 @@ tr:hover .taglist .tag button { .vcard span.inactive{ color: #222200; } + +.easylist a { + border-color: orange; + color: orange; +} +.easylist fieldset { + border-color: #ff7726; + color: #ff7726; +} \ No newline at end of file diff --git a/web/src/main/resources/web/css/default.css b/web/src/main/resources/web/css/default.css index 70dbbe7..50e3504 100644 --- a/web/src/main/resources/web/css/default.css +++ b/web/src/main/resources/web/css/default.css @@ -485,6 +485,15 @@ a.wikilink{ grid-column-end: span 2; } +.easylist a { + display: block; + border: 1px solid; + margin: 7px; + padding: 5px; + border-radius: 5px; + text-align: center; +} + @media screen and (max-width: 600px) { .grid2{ display: grid; @@ -506,6 +515,13 @@ a.wikilink{ width: calc(100% - 10px); min-height: 50px; } + + .easylist a { + font-size: 25px; + } + .easylist input{ + font-size: 20px; + } } fieldset.vcard{ @@ -551,4 +567,4 @@ fieldset.vcard{ margin: 0 6px; white-space: nowrap; display: inline flow-root; -} \ No newline at end of file +} diff --git a/web/src/main/resources/web/css/winter-color.css b/web/src/main/resources/web/css/winter-color.css index 7477a80..8dbf60f 100644 --- a/web/src/main/resources/web/css/winter-color.css +++ b/web/src/main/resources/web/css/winter-color.css @@ -273,3 +273,13 @@ tr:hover .taglist .tag button { .vcard span.inactive{ color: #bbb; } + +.easylist a { + border-color: blue; + color: blue; + background: #dfe4ff; +} +.easylist fieldset { + border-color: blue; + color: blue; +} \ No newline at end of file diff --git a/web/src/main/resources/web/css/winter.css b/web/src/main/resources/web/css/winter.css index f23bd4e..cccab33 100644 --- a/web/src/main/resources/web/css/winter.css +++ b/web/src/main/resources/web/css/winter.css @@ -407,6 +407,15 @@ a.wikilink{ grid-column-end: span 2; } +.easylist a { + display: block; + border: 1px solid; + margin: 7px; + padding: 5px; + border-radius: 5px; + text-align: center; +} + @media screen and (max-width: 600px) { .grid2{ display: grid; @@ -428,6 +437,13 @@ a.wikilink{ width: calc(100% - 10px); min-height: 50px; } + + .easylist a { + font-size: 25px; + } + .easylist input{ + font-size: 20px; + } } fieldset.vcard{