From b85245717c96dd29dce27657f1a5c5c9065e66e0 Mon Sep 17 00:00:00 2001 From: Mario Date: Tue, 24 Mar 2026 08:02:57 +0100 Subject: [PATCH] Bug Fixes und Icons Refactioring --- .metadata/.lock_info | 4 +- .metadata/.log | 85 + .../.safetable/org.eclipse.core.resources | Bin 1307 -> 1307 bytes .../org.eclipse.e4.workbench/workbench.xmi | 3706 +++++++++-------- .../org.eclipse.jdt.ui/OpenTypeHistory.xml | 1 + .../org.eclipse.jdt.ui/dialog_settings.xml | 2 +- .../.plugins/org.eclipse.m2e.logback/0.log | 1 + .metadata/version.ini | 2 +- .../de/oaa/xxx/admin/AdminController.java | 44 +- .../java/de/oaa/xxx/social/SseService.java | 2 +- .../src/main/resources/static/admin.html | 160 +- .../src/main/resources/static/benutzer.html | 25 +- .../src/main/resources/static/feed.html | 10 +- .../src/main/resources/static/freunde.html | 14 +- .../src/main/resources/static/gruppe.html | 17 +- .../src/main/resources/static/gruppen.html | 16 +- .../src/main/resources/static/js/icons.js | 124 +- 17 files changed, 2277 insertions(+), 1936 deletions(-) diff --git a/.metadata/.lock_info b/.metadata/.lock_info index 37158f9..463fed8 100644 --- a/.metadata/.lock_info +++ b/.metadata/.lock_info @@ -1,5 +1,5 @@ -#Mon Mar 23 21:09:40 CET 2026 +#Tue Mar 24 06:41:43 CET 2026 display=\:0 host=mario-mint -process-id=80279 +process-id=4231 user=mario diff --git a/.metadata/.log b/.metadata/.log index 92e2ba3..7390395 100644 --- a/.metadata/.log +++ b/.metadata/.log @@ -226,3 +226,88 @@ Binding(CTRL+SHIFT+T, ,,true),null), org.eclipse.ui.defaultAcceleratorConfiguration, org.eclipse.ui.contexts.window,,,system) + +!ENTRY org.springframework.tooling.boot.ls 1 0 2026-03-23 23:23:49.341 +!MESSAGE DelegatingStreamConnectionProvider - Stopping Boot LS + +!ENTRY org.springframework.tooling.ls.eclipse.commons 1 0 2026-03-23 23:23:50.541 +!MESSAGE executing callback sts4.classpath.bMrwvfMB FAILED + +!ENTRY org.springframework.tooling.ls.eclipse.commons 4 0 2026-03-23 23:23:50.542 +!MESSAGE java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.CompletableFuture$UniCompose@203dc124 rejected from java.util.concurrent.ThreadPoolExecutor@6d6cd631[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 194] +!STACK 0 +java.util.concurrent.ExecutionException: java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.CompletableFuture$UniCompose@203dc124 rejected from java.util.concurrent.ThreadPoolExecutor@6d6cd631[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 194] + at java.base/java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:396) + at java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:2096) + at org.springframework.tooling.ls.eclipse.commons.LSP4ECommandExecutor.executeClientCommand(LSP4ECommandExecutor.java:31) + at org.springframework.tooling.jdt.ls.commons.classpath.SendClasspathNotificationsJob.flush(SendClasspathNotificationsJob.java:192) + at org.springframework.tooling.jdt.ls.commons.classpath.SendClasspathNotificationsJob.run(SendClasspathNotificationsJob.java:151) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63) +Caused by: java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.CompletableFuture$UniCompose@203dc124 rejected from java.util.concurrent.ThreadPoolExecutor@6d6cd631[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 194] + at java.base/java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2081) + at java.base/java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:841) + at java.base/java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1376) + at java.base/java.util.concurrent.Executors$DelegatedExecutorService.execute(Executors.java:754) + at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1184) + at java.base/java.util.concurrent.CompletableFuture.thenComposeAsync(CompletableFuture.java:2352) + at org.eclipse.lsp4e.LanguageServerWrapper.executeImpl(LanguageServerWrapper.java:1054) + at org.eclipse.lsp4e.LanguageServers.lambda$23(LanguageServers.java:445) + at java.base/java.util.concurrent.CompletableFuture.uniApplyNow(CompletableFuture.java:684) + at java.base/java.util.concurrent.CompletableFuture.uniApplyStage(CompletableFuture.java:662) + at java.base/java.util.concurrent.CompletableFuture.thenApply(CompletableFuture.java:2200) + at org.eclipse.lsp4e.LanguageServers.lambda$22(LanguageServers.java:443) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1708) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:575) + at java.base/java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260) + at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:616) + at org.eclipse.lsp4e.LanguageServers.computeFirst(LanguageServers.java:181) + at org.eclipse.lsp4e.LanguageServers.computeFirst(LanguageServers.java:145) + at org.springframework.tooling.ls.eclipse.commons.LSP4ECommandExecutor.executeClientCommand(LSP4ECommandExecutor.java:29) + ... 3 more +!SESSION 2026-03-24 06:41:38.442 ----------------------------------------------- +eclipse.buildId=4.39.0.20260305-0817 +java.version=21.0.6 +java.vendor=Eclipse Adoptium +BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=de_DE +Framework arguments: -product org.eclipse.epp.package.java.product +Command-line arguments: -os linux -ws gtk -arch x86_64 -clean -product org.eclipse.epp.package.java.product + +!ENTRY ch.qos.logback.classic 1 0 2026-03-24 06:41:39.956 +!MESSAGE Activated before the state location was initialized. Retry after the state location is initialized. + +!ENTRY ch.qos.logback.classic 1 0 2026-03-24 06:41:44.218 +!MESSAGE Logback config file: /home/mario/Workspaces/xxx-thegame/.metadata/.plugins/org.eclipse.m2e.logback/logback.2.7.101.20251017-1242.xml + +!ENTRY org.eclipse.ui 2 0 2026-03-24 06:41:44.360 +!MESSAGE Warnings while parsing the commands from the 'org.eclipse.ui.commands' and 'org.eclipse.ui.actionDefinitions' extension points. +!SUBENTRY 1 org.eclipse.ui 2 0 2026-03-24 06:41:44.360 +!MESSAGE Commands should really have a category: plug-in='org.springframework.tooling.boot.ls', id='spring.initializr.addStarters', categoryId='org.eclipse.lsp4e.commandCategory' + +!ENTRY org.eclipse.ui 2 0 2026-03-24 06:41:44.512 +!MESSAGE Warnings while parsing the commands from the 'org.eclipse.ui.commands' and 'org.eclipse.ui.actionDefinitions' extension points. +!SUBENTRY 1 org.eclipse.ui 2 0 2026-03-24 06:41:44.512 +!MESSAGE Commands should really have a category: plug-in='org.springframework.tooling.boot.ls', id='spring.initializr.addStarters', categoryId='org.eclipse.lsp4e.commandCategory' + +!ENTRY org.eclipse.jface 2 0 2026-03-24 06:46:26.895 +!MESSAGE Keybinding conflicts occurred. They may interfere with normal accelerator operation. +!SUBENTRY 1 org.eclipse.jface 2 0 2026-03-24 06:46:26.895 +!MESSAGE A conflict occurred for CTRL+SHIFT+T: +Binding(CTRL+SHIFT+T, + ParameterizedCommand(Command(org.eclipse.jdt.ui.navigate.open.type,Open Type, + Open a type in a Java editor, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + WorkbenchHandlerServiceHandler("org.eclipse.jdt.ui.navigate.open.type"), + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.ui.contexts.window,,,system) +Binding(CTRL+SHIFT+T, + ParameterizedCommand(Command(org.eclipse.lsp4e.symbolInWorkspace,Go to Symbol in Workspace, + , + Category(org.eclipse.lsp4e.category,Language Servers,null,true), + WorkbenchHandlerServiceHandler("org.eclipse.lsp4e.symbolInWorkspace"), + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.ui.contexts.window,,,system) diff --git a/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources b/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources index adb53a5eedbbdf8453b323efc62227f6f4591adf..3a0eb33075004424d449e4d20e54590b716aead7 100644 GIT binary patch delta 169 zcmbQuHJfXKmXwjP6%d(NDmc4_C>R+SnQ`gsl@z6>+L}*Z$RshDpM`DnJ7!tN$@Pqy zoW=$wW=58lCZ>}&GFlU(Q-#To5k;4QYDj6Sf^TAxf{}@Wfti)5xs{12UaNH(0Sr+p AYXATM delta 157 zcmbQuHJfXKmXx8Tm4UgHp_ziSYlwo8fsq-PzFtXDYO1Z-Icc_X7WF*;S4{1{Pm*+?2$85mlbTHv)#mk|ILswW`; diff --git a/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi b/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi index 6bc4c75..82ed623 100644 --- a/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi +++ b/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi @@ -1,8 +1,8 @@ - - + + activeSchemeId:org.eclipse.ui.defaultAcceleratorConfiguration - + @@ -10,9 +10,10 @@ topLevel - - - + shellMaximized + + + persp.actionSet:org.eclipse.mylyn.tasks.ui.navigation persp.actionSet:org.eclipse.ui.cheatsheets.actionSet @@ -82,120 +83,119 @@ persp.editorOnboardingCommand:Show Key Assist$$$Shift+Ctrl+L persp.editorOnboardingCommand:New$$$Ctrl+N persp.editorOnboardingCommand:Open Type$$$Shift+Ctrl+T - - - - + + + + org.eclipse.e4.primaryNavigationStack - active - noFocus - + View categoryTag:Java - + View categoryTag:Java - + View categoryTag:General - + View categoryTag:Java - - + + Minimized + View categoryTag:Spring - - + + View categoryTag:Git - - - - + + + + org.eclipse.e4.secondaryNavigationStack - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:Mylyn - + View categoryTag:Java - + View categoryTag:Ant - + org.eclipse.e4.secondaryDataStack Oomph Gradle - + View categoryTag:General - + View categoryTag:Java - + View categoryTag:Java - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:Terminal - + View categoryTag:Gradle - + View categoryTag:Gradle - + View categoryTag:Oomph NoRestore @@ -205,2544 +205,2564 @@ - - + + View categoryTag:Help - + View categoryTag:General - + View categoryTag:Help - + View categoryTag:Help - + View categoryTag:General - + ViewMenu menuContribution:menu - + - + View categoryTag:Help - - + + EditorStack org.eclipse.e4.primaryDataStack - + active + Editor removeOnHide org.eclipse.jdt.ui.CompilationUnitEditor - + Editor removeOnHide org.eclipse.jdt.ui.CompilationUnitEditor - - + + Editor removeOnHide SpringBootPropertyEditor + + + Editor + removeOnHide + org.eclipse.jdt.ui.CompilationUnitEditor + + + + Editor + removeOnHide + org.eclipse.ui.genericeditor.GenericEditor + active + - + View categoryTag:Java - active - + ViewMenu menuContribution:menu - + - + View categoryTag:Java - + View categoryTag:General - + - + View categoryTag:General - + ViewMenu menuContribution:menu - + - + View categoryTag:Java - + View categoryTag:Java - + View categoryTag:General - + View categoryTag:General - + ViewMenu menuContribution:menu - + - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + ViewMenu menuContribution:menu - + - + View categoryTag:General - + View categoryTag:General - + View categoryTag:Mylyn - + View categoryTag:Terminal - + View categoryTag:Java - + View categoryTag:Git - + View categoryTag:Java - + View categoryTag:Spring - + ViewMenu menuContribution:menu - + - + View categoryTag:Ant - + View categoryTag:Gradle - + ViewMenu menuContribution:menu - + - + View categoryTag:Gradle - + ViewMenu menuContribution:menu - + - + View categoryTag:Oomph NoRestore - + ViewMenu menuContribution:menu - + - - + + toolbarSeparator - + - + Draggable - + - + toolbarSeparator - + - + Draggable - - + + - + toolbarSeparator - + - + Draggable - + Draggable - + Draggable - + Draggable - + toolbarSeparator - + - + Draggable - + - + Draggable - + Draggable - + + Draggable + + toolbarSeparator - + - + toolbarSeparator - + - + Draggable - + stretch SHOW_RESTORE_MENU - + Draggable HIDEABLE SHOW_RESTORE_MENU - - + + stretch - + Draggable - + Draggable - - + + + TrimStack + Draggable + + TrimStack Draggable - + - - - - - - - - - - - - - - + + + + + + + + + + + + + + platform:gtk - - - - + + + + platform:gtk - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - + + + + + - - + + - - - - - - - - - + + + + + + + + + - - + + - - - + + + - - - - - + + + + + - - + + - - - + + + - - - + + + - - - - - - - - + + + + + + + + platform:gtk - - - - - + + + + + - - + + - - + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + + + - - + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - + + - - - - - - - + + + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - + + - - - - - - + + + + + + - - - - - - + + + + + + - - + + - - - - - - - - + + + + + + + + - - - + + + - - - - + + + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - + + - - - - - - - - - + + + + + + + + + - - - - - + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Editor removeOnHide - + View categoryTag:Ant - + View categoryTag:Gradle - + View categoryTag:Gradle - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Java - + View categoryTag:Git - + View categoryTag:Git - + View categoryTag:Git - + View categoryTag:Git NoRestore - + View categoryTag:Git - + View categoryTag:Help - + View categoryTag:Java - + View categoryTag:Java - + View categoryTag:Debug - + View categoryTag:Java - + View categoryTag:Java - + View categoryTag:Java - + View categoryTag:Java Browsing - + View categoryTag:Java Browsing - + View categoryTag:Java Browsing - + View categoryTag:Java Browsing - + View categoryTag:Java - + View categoryTag:General - + View categoryTag:Java - + View categoryTag:Java - + View categoryTag:Docker - + View categoryTag:Docker - + View categoryTag:Docker - + View categoryTag:Docker - + View categoryTag:Language Servers - + View categoryTag:Language Servers - + View categoryTag:Language Servers - + View categoryTag:Maven - + View categoryTag:Maven - + View categoryTag:Maven - + View categoryTag:Mylyn - + View categoryTag:Mylyn - + View categoryTag:Mylyn - + View categoryTag:Mylyn - + View categoryTag:Mylyn - + View categoryTag:Mylyn - + View categoryTag:Oomph - + View categoryTag:Oomph NoRestore - + View categoryTag:Plug-in Development - + View categoryTag:General - + View categoryTag:Version Control (Team) - + View categoryTag:Version Control (Team) - + View categoryTag:Terminal - + View categoryTag:Help - + View categoryTag:General - + View categoryTag:General - + View categoryTag:Help - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:Spring - + View categoryTag:Spring - + View categoryTag:Spring - - + + glue move_after:PerspectiveSpacer SHOW_RESTORE_MENU - + move_after:Spacer Glue HIDEABLE SHOW_RESTORE_MENU - + glue move_after:SearchField SHOW_RESTORE_MENU - - - - - + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - + + + - - - - - - - - - + + + + + + + + + - - - - - + + + + + - - - + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.jdt.ui/OpenTypeHistory.xml b/.metadata/.plugins/org.eclipse.jdt.ui/OpenTypeHistory.xml index 3a0d75d..14bad2f 100644 --- a/.metadata/.plugins/org.eclipse.jdt.ui/OpenTypeHistory.xml +++ b/.metadata/.plugins/org.eclipse.jdt.ui/OpenTypeHistory.xml @@ -1,4 +1,5 @@ + diff --git a/.metadata/.plugins/org.eclipse.jdt.ui/dialog_settings.xml b/.metadata/.plugins/org.eclipse.jdt.ui/dialog_settings.xml index 3ca8ba8..58be2e1 100644 --- a/.metadata/.plugins/org.eclipse.jdt.ui/dialog_settings.xml +++ b/.metadata/.plugins/org.eclipse.jdt.ui/dialog_settings.xml @@ -16,7 +16,7 @@
- +
diff --git a/.metadata/.plugins/org.eclipse.m2e.logback/0.log b/.metadata/.plugins/org.eclipse.m2e.logback/0.log index 7fc35ce..41ee59b 100644 --- a/.metadata/.plugins/org.eclipse.m2e.logback/0.log +++ b/.metadata/.plugins/org.eclipse.m2e.logback/0.log @@ -5,3 +5,4 @@ 2026-03-23 17:36:54,482 [Worker-8: Loading available Gradle versions] INFO o.e.b.c.i.u.g.PublishedGradleVersions - Gradle version information cache is up-to-date. Trying to read. 2026-03-23 17:38:51,039 [Worker-7: Loading available Gradle versions] INFO o.e.b.c.i.u.g.PublishedGradleVersions - Gradle version information cache is up-to-date. Trying to read. 2026-03-23 21:09:44,347 [Worker-7: Loading available Gradle versions] INFO o.e.b.c.i.u.g.PublishedGradleVersions - Gradle version information cache is up-to-date. Trying to read. +2026-03-24 06:41:47,661 [Worker-2: Loading available Gradle versions] INFO o.e.b.c.i.u.g.PublishedGradleVersions - Gradle version information cache is up-to-date. Trying to read. diff --git a/.metadata/version.ini b/.metadata/version.ini index d428925..244c875 100644 --- a/.metadata/version.ini +++ b/.metadata/version.ini @@ -1,3 +1,3 @@ -#Mon Mar 23 21:09:40 CET 2026 +#Tue Mar 24 06:41:43 CET 2026 org.eclipse.core.runtime=2 org.eclipse.platform=4.39.0.v20260226-0420 diff --git a/xxxthegame/src/main/java/de/oaa/xxx/admin/AdminController.java b/xxxthegame/src/main/java/de/oaa/xxx/admin/AdminController.java index b7b72f0..0f59cea 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/admin/AdminController.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/admin/AdminController.java @@ -4,7 +4,12 @@ import de.oaa.xxx.aufgaben.AufgabenGruppe; import de.oaa.xxx.aufgaben.Toy; import de.oaa.xxx.aufgaben.entity.AufgabenGruppeEntity; import de.oaa.xxx.aufgaben.entity.ToyEntity; +import de.oaa.xxx.aufgaben.repository.AufgabeRepository; import de.oaa.xxx.aufgaben.repository.AufgabenGruppeRepository; +import de.oaa.xxx.aufgaben.repository.FinisherRepository; +import de.oaa.xxx.aufgaben.repository.GruppenAboRepository; +import de.oaa.xxx.aufgaben.repository.SperreRepository; +import de.oaa.xxx.aufgaben.repository.StrafeRepository; import de.oaa.xxx.aufgaben.repository.ToyRepository; import de.oaa.xxx.meldung.MeldungEntity; import de.oaa.xxx.meldung.MeldungRepository; @@ -31,16 +36,31 @@ public class AdminController { private final UserRepository userRepository; private final MeldungRepository meldungRepository; private final AufgabenGruppeRepository aufgabenGruppeRepository; + private final AufgabeRepository aufgabeRepository; + private final StrafeRepository strafeRepository; + private final SperreRepository sperreRepository; + private final FinisherRepository finisherRepository; + private final GruppenAboRepository gruppenAboRepository; private final ToyRepository toyRepository; public AdminController(AdminRepository adminRepository, UserRepository userRepository, MeldungRepository meldungRepository, AufgabenGruppeRepository aufgabenGruppeRepository, + AufgabeRepository aufgabeRepository, + StrafeRepository strafeRepository, + SperreRepository sperreRepository, + FinisherRepository finisherRepository, + GruppenAboRepository gruppenAboRepository, ToyRepository toyRepository) { this.adminRepository = adminRepository; this.userRepository = userRepository; this.meldungRepository = meldungRepository; this.aufgabenGruppeRepository = aufgabenGruppeRepository; + this.aufgabeRepository = aufgabeRepository; + this.strafeRepository = strafeRepository; + this.sperreRepository = sperreRepository; + this.finisherRepository = finisherRepository; + this.gruppenAboRepository = gruppenAboRepository; this.toyRepository = toyRepository; } @@ -57,6 +77,8 @@ public class AdminController { record StatusRequest(MeldungStatus status) {} + record UserSearchDto(UUID userId, String name) {} + // ── Hilfsmethoden ──────────────────────────────────────────────────────── private AdminEntity requireAdmin(Principal principal) { @@ -115,7 +137,7 @@ public class AdminController { public ResponseEntity updateMeldung(@PathVariable("id") UUID id, @RequestBody StatusRequest body, Principal principal) { - var admin = requireAdmin(principal); + requireAdmin(principal); var user = userRepository.findByEmail(principal.getName()).orElseThrow(); MeldungEntity meldung = meldungRepository.findById(id) .orElseThrow(() -> new org.springframework.web.server.ResponseStatusException( @@ -173,6 +195,11 @@ public class AdminController { if (entity.getUserId() != null) { return ResponseEntity.status(403).build(); // Nur System-Gruppen } + gruppenAboRepository.deleteByAufgabenGruppe(entity); + aufgabeRepository.deleteAll(entity.getAufgaben()); + strafeRepository.deleteAll(entity.getStrafen()); + sperreRepository.deleteAll(entity.getSperren()); + finisherRepository.deleteAll(entity.getFinisher()); aufgabenGruppeRepository.delete(entity); return ResponseEntity.noContent().build(); } @@ -232,6 +259,21 @@ public class AdminController { return ResponseEntity.noContent().build(); } + // ── Benutzer-Suche (nur SUPERADMIN) ────────────────────────────────────── + + @GetMapping("/users/search") + public ResponseEntity> searchUsers( + @RequestParam String q, Principal principal) { + requireSuperAdmin(principal); + if (q == null || q.isBlank()) return ResponseEntity.ok(List.of()); + List users = userRepository.findByNameContainingIgnoreCase(q.trim()); + return ResponseEntity.ok(users.stream() + .filter(u -> !adminRepository.existsByUserId(u.getUserId())) + .limit(20) + .map(u -> new UserSearchDto(u.getUserId(), u.getName())) + .toList()); + } + // ── Admin-Verwaltung (nur SUPERADMIN) ──────────────────────────────────── @GetMapping("/admins") diff --git a/xxxthegame/src/main/java/de/oaa/xxx/social/SseService.java b/xxxthegame/src/main/java/de/oaa/xxx/social/SseService.java index 36a3f6b..a2d68f4 100644 --- a/xxxthegame/src/main/java/de/oaa/xxx/social/SseService.java +++ b/xxxthegame/src/main/java/de/oaa/xxx/social/SseService.java @@ -24,7 +24,7 @@ public class SseService { } public SseEmitter subscribe(UUID userId) { - SseEmitter emitter = new SseEmitter(300_000L); // 5 min – Client reconnects automatically + SseEmitter emitter = new SseEmitter(1_800_000L); // 30 min – Client reconnects automatically emitters.computeIfAbsent(userId, k -> new CopyOnWriteArrayList<>()).add(emitter); Runnable cleanup = () -> removeEmitter(userId, emitter); emitter.onCompletion(cleanup); diff --git a/xxxthegame/src/main/resources/static/admin.html b/xxxthegame/src/main/resources/static/admin.html index 90393ae..5e6ad76 100644 --- a/xxxthegame/src/main/resources/static/admin.html +++ b/xxxthegame/src/main/resources/static/admin.html @@ -418,6 +418,18 @@ + + +
@@ -502,21 +514,23 @@

Admin hinzufügen

- + -
+ +
- + - +
BenutzernameUser-IDRolleSeit
BenutzernameRolleSeit
Wird geladen…
Wird geladen…
@@ -546,6 +560,12 @@ async function init() { loadAdminGruppen(); loadAdminToys(); if (admin.rolle === 'SUPERADMIN') loadAdmins(); + + const _savedAdminTab = localStorage.getItem('tab_admin'); + if (_savedAdminTab) { + const _btn = document.querySelector(`.tab-btn[data-tab="${_savedAdminTab}"]`); + if (_btn && _btn.offsetParent !== null) _btn.click(); + } } // ── Tab-Navigation ──────────────────────────────────────────────────────── @@ -556,6 +576,7 @@ document.querySelectorAll('.tab-btn[data-tab]').forEach(btn => { document.querySelectorAll('.tab-panel').forEach(p => p.classList.remove('active')); btn.classList.add('active'); document.getElementById('panel-' + btn.dataset.tab).classList.add('active'); + localStorage.setItem('tab_admin', btn.dataset.tab); }); }); @@ -595,6 +616,26 @@ async function setMeldungStatus(id, status) { if (r.ok) loadMeldungen(); } +// ── Bestätigungs-Modal ──────────────────────────────────────────────────── + +let _confirmCallback = null; +function openConfirmModal(text, callback) { + document.getElementById('confirmModalText').textContent = text; + _confirmCallback = callback; + document.getElementById('confirmModal').classList.add('open'); +} +function closeConfirmModal() { + _confirmCallback = null; + document.getElementById('confirmModal').classList.remove('open'); +} +document.getElementById('confirmModalCancel').addEventListener('click', closeConfirmModal); +document.getElementById('confirmModalOk').addEventListener('click', () => { + const cb = _confirmCallback; closeConfirmModal(); if (cb) cb(); +}); +document.getElementById('confirmModal').addEventListener('click', e => { + if (e.target === document.getElementById('confirmModal')) closeConfirmModal(); +}); + // ── Aufgabengruppen ─────────────────────────────────────────────────────── let pendingExpandId = null; @@ -761,14 +802,15 @@ const ITEM_DELETE_FIELD = { aufgabe: 'aufgabeId', strafe: 'strafeId', zeitstrafe function deleteItem(kind, itemId, gruppenId, event) { event.stopPropagation(); - if (!confirm('Eintrag wirklich löschen?')) return; - fetch(ITEM_DELETE_URL[kind], { - method: 'DELETE', headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ [ITEM_DELETE_FIELD[kind]]: itemId }) - }).then(r => { - if (r.ok || r.status === 202) { openItemId = null; pendingExpandId = gruppenId; loadAdminGruppen(); } - else document.getElementById('gruppeActionError').textContent = 'Fehler beim Löschen (HTTP ' + r.status + ').'; - }).catch(() => { document.getElementById('gruppeActionError').textContent = 'Verbindungsfehler.'; }); + openConfirmModal('Eintrag wirklich löschen?', () => { + fetch(ITEM_DELETE_URL[kind], { + method: 'DELETE', headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ [ITEM_DELETE_FIELD[kind]]: itemId }) + }).then(r => { + if (r.ok || r.status === 202) { openItemId = null; pendingExpandId = gruppenId; loadAdminGruppen(); } + else document.getElementById('gruppeActionError').textContent = 'Fehler beim Löschen (HTTP ' + r.status + ').'; + }).catch(() => { document.getElementById('gruppeActionError').textContent = 'Verbindungsfehler.'; }); + }); } async function duplicateItem(kind, itemId, gruppenId, event) { @@ -885,14 +927,15 @@ gruppeModal.addEventListener('click', e => { if (e.target === gruppeModal) close document.getElementById('gruppeDeleteBtn').addEventListener('click', () => { if (!selectedGruppeId) return; - if (!confirm('System-Aufgabengruppe und alle Inhalte wirklich löschen?')) return; - const btn = document.getElementById('gruppeDeleteBtn'); btn.disabled = true; - fetch(`/admin/aufgabengruppen/${selectedGruppeId}`, { method: 'DELETE' }) - .then(r => { - if (r.ok || r.status === 204) { loadAdminGruppen(); } - else { document.getElementById('gruppeActionError').textContent = 'Fehler beim Löschen (HTTP ' + r.status + ').'; btn.disabled = false; } - }) - .catch(() => { document.getElementById('gruppeActionError').textContent = 'Verbindungsfehler.'; btn.disabled = false; }); + openConfirmModal('System-Aufgabengruppe und alle Inhalte wirklich löschen?', () => { + const btn = document.getElementById('gruppeDeleteBtn'); btn.disabled = true; + fetch(`/admin/aufgabengruppen/${selectedGruppeId}`, { method: 'DELETE' }) + .then(r => { + if (r.ok || r.status === 204) { loadAdminGruppen(); } + else { document.getElementById('gruppeActionError').textContent = 'Fehler beim Löschen (HTTP ' + r.status + ').'; btn.disabled = false; } + }) + .catch(() => { document.getElementById('gruppeActionError').textContent = 'Verbindungsfehler.'; btn.disabled = false; }); + }); }); document.getElementById('gruppeDuplicateBtn').addEventListener('click', async () => { @@ -1300,36 +1343,73 @@ async function loadAdmins() { const r = await fetch('/admin/admins'); if (!r.ok) return; const list = await r.json(); const tbody = document.getElementById('adminsBody'); - if (!list.length) { tbody.innerHTML = 'Keine Admins vorhanden.'; return; } + if (!list.length) { tbody.innerHTML = 'Keine Admins vorhanden.'; return; } tbody.innerHTML = list.map(a => ` ${esc(a.userName)} - ${a.userId} ${a.rolle} ${fmtDate(a.createdAt)} - + `).join(''); } -async function createAdmin() { - const userId = document.getElementById('adminUserId').value.trim(); - const rolle = document.getElementById('adminRolle').value; - if (!userId) { alert('User-ID eingeben.'); return; } - const r = await fetch('/admin/admins', { - method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ userId, rolle }) - }); - if (r.status === 201) { document.getElementById('adminUserId').value = ''; loadAdmins(); } - else if (r.status === 404) alert('User nicht gefunden.'); - else if (r.status === 409) alert('Benutzer ist bereits Admin.'); - else alert('Fehler: ' + r.status); +let _adminSearchTimer = null; +function searchAdminUsers() { + clearTimeout(_adminSearchTimer); + const q = document.getElementById('adminSearch').value.trim(); + const box = document.getElementById('adminSearchResults'); + if (!q) { box.style.display = 'none'; box.innerHTML = ''; return; } + _adminSearchTimer = setTimeout(async () => { + const r = await fetch(`/admin/users/search?q=${encodeURIComponent(q)}`); + if (!r.ok) return; + const list = await r.json(); + if (!list.length) { + box.innerHTML = '
Keine Benutzer gefunden.
'; + } else { + box.innerHTML = list.map(u => ` +
+ ${esc(u.name)} + +
`).join(''); + } + box.style.display = 'block'; + }, 300); } -async function deleteAdmin(id) { - if (!confirm('Admin-Berechtigung wirklich entziehen?')) return; - const r = await fetch(`/admin/admins/${id}`, { method: 'DELETE' }); - if (r.ok || r.status === 204) loadAdmins(); - else if (r.status === 400) alert('Du kannst dich nicht selbst entfernen.'); - else alert('Fehler: ' + r.status); +async function addAdminFromSearch(userId, userName) { + const rolle = document.getElementById('adminRolle').value; + const errEl = document.getElementById('adminAddError'); + errEl.textContent = ''; + const r = await fetch('/admin/admins', { + method: 'POST', headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ userId, rolle }) + }); + if (r.status === 201) { + document.getElementById('adminSearch').value = ''; + document.getElementById('adminSearchResults').style.display = 'none'; + loadAdmins(); + } else if (r.status === 409) { + errEl.textContent = `${userName} ist bereits Admin.`; + } else { + errEl.textContent = `Fehler beim Hinzufügen (HTTP ${r.status}).`; + } +} + +async function deleteAdmin(id, userName) { + openConfirmModal(`Admin-Berechtigung von „${userName}" wirklich entziehen?`, async () => { + const r = await fetch(`/admin/admins/${id}`, { method: 'DELETE' }); + if (r.ok || r.status === 204) { + loadAdmins(); + } else if (r.status === 400) { + document.getElementById('adminAddError').textContent = 'Du kannst dich nicht selbst entfernen.'; + document.querySelector('.tab-btn[data-tab="admins"]')?.click(); + } else { + document.getElementById('adminAddError').textContent = `Fehler (HTTP ${r.status}).`; + } + }); } // ── Hilfsfunktionen ─────────────────────────────────────────────────────── diff --git a/xxxthegame/src/main/resources/static/benutzer.html b/xxxthegame/src/main/resources/static/benutzer.html index d37d411..8c90ec5 100644 --- a/xxxthegame/src/main/resources/static/benutzer.html +++ b/xxxthegame/src/main/resources/static/benutzer.html @@ -574,7 +574,8 @@ loadProfilPosts(); profilPostsObserver.observe(document.getElementById('profilPostsSentinel')); } - } catch { + } catch(e) { + console.error('[benutzer] loadProfile Fehler:', e); document.getElementById('loadingHint').textContent = 'Fehler beim Laden.'; document.getElementById('loadingHint').style.display = ''; } @@ -613,7 +614,7 @@ // Action buttons const actions = document.getElementById('profileActions'); - const isViewingOwnProfile = me && me.userId === profile.userId; + const isViewingOwnProfile = myUserId && myUserId === profile.userId; if (isOwnProfile) { actions.innerHTML = `Profil bearbeiten`; } else if (isViewingOwnProfile) { @@ -884,12 +885,16 @@ // ── Spielhistorie ── const GAME_TYPE_ICON = { - CARDLOCK: '🔒', - TIMELOCK: '🔒', - BDSM: '⛓️', - VANILLA: '❤️' + CARDLOCK: IChtml('GAME_CARDLOCK'), + TIMELOCK: IChtml('GAME_TIMELOCK'), + BDSM: IC('GAME_BDSM'), + VANILLA: IC('GAME_VANILLA') + }; + const ROLE_BADGE = { + KEYHOLDER: IC('ROLE_KEYHOLDER'), + LOCKEE: IC('ROLE_LOCKEE'), + PLAYER: '' }; - const ROLE_BADGE = { KEYHOLDER: '🔑', LOCKEE: '🔒', PLAYER: '' }; let gameHistoryLoaded = false; async function loadGameHistory() { @@ -906,10 +911,10 @@ if (entries.length === 0) { empty.style.display = ''; return; } list.innerHTML = entries.map(e => { - const gameIconRaw = GAME_TYPE_ICON[e.gameType] || '🎮'; - const gameIcon = (e.gameType === 'CARDLOCK' || e.gameType === 'TIMELOCK') + const gameIconRaw = GAME_TYPE_ICON[e.gameType]; + const gameIcon = gameIconRaw ? gameIconRaw - : `${gameIconRaw}`; + : `🎮`; const days = Math.floor(e.durationMinutes / 1440); const hours = Math.floor((e.durationMinutes % 1440) / 60); diff --git a/xxxthegame/src/main/resources/static/feed.html b/xxxthegame/src/main/resources/static/feed.html index e282eea..2c6787b 100644 --- a/xxxthegame/src/main/resources/static/feed.html +++ b/xxxthegame/src/main/resources/static/feed.html @@ -92,8 +92,8 @@
- - + +
@@ -194,8 +194,14 @@ btn.classList.add('active'); document.querySelectorAll('.tab-panel').forEach(p => p.classList.remove('active')); document.getElementById('tab-' + name).classList.add('active'); + localStorage.setItem('tab_feed', name); if (!feedState[name].loaded) loadFeed(name); } + const _savedFeedTab = localStorage.getItem('tab_feed'); + if (_savedFeedTab) { + const _btn = document.querySelector(`.tab-btn[data-tab="${_savedFeedTab}"]`); + if (_btn) switchTab(_savedFeedTab, _btn); + } // ── Feed loading ── async function loadFeed(tab) { diff --git a/xxxthegame/src/main/resources/static/freunde.html b/xxxthegame/src/main/resources/static/freunde.html index 112695d..eb59f86 100644 --- a/xxxthegame/src/main/resources/static/freunde.html +++ b/xxxthegame/src/main/resources/static/freunde.html @@ -1,7 +1,7 @@ - + Freunde – XXX The Game @@ -134,8 +134,8 @@

Freunde

- - +
@@ -166,7 +166,7 @@
- + - + +