From c2bc4e4900dafe168bfe3467c62c93654b39746e Mon Sep 17 00:00:00 2001 From: Sven Carstensen Date: Fri, 20 Mar 2026 15:10:29 +0100 Subject: [PATCH] =?UTF-8?q?style:=20UI-Optimierungen=20f=C3=BCr=20Message-?= =?UTF-8?q?Views?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../frontend/themes/votian-modern/styles.css | 8 ++- .../pages/view/MessageDetailsView.java | 10 ++-- .../votianlt/pages/view/UserMessagesView.java | 50 +++++-------------- 3 files changed, 22 insertions(+), 46 deletions(-) diff --git a/src/main/frontend/themes/votian-modern/styles.css b/src/main/frontend/themes/votian-modern/styles.css index 5c0e4b1..d65148e 100644 --- a/src/main/frontend/themes/votian-modern/styles.css +++ b/src/main/frontend/themes/votian-modern/styles.css @@ -1220,8 +1220,8 @@ vaadin-grid-tree-toggle[expanded] .nav-expand-icon { border-radius: 22px !important; background: linear-gradient(180deg, rgba(255, 255, 255, 0.98), rgba(246, 249, 255, 0.9)) !important; box-shadow: var(--app-shadow-sm) !important; - max-width: 100% !important; margin-bottom: 0.85rem !important; + box-sizing: border-box !important; } .message-section { @@ -1281,10 +1281,14 @@ vaadin-grid-tree-toggle[expanded] .nav-expand-icon { padding: 1rem 1.15rem; } -.message-thread { +.message-thread-scroller { border: 1px solid var(--app-border-strong); background: linear-gradient(180deg, rgba(239, 244, 255, 0.72), rgba(248, 250, 252, 0.92)); border-radius: 24px; + overflow-y: auto !important; +} + +.message-thread { padding: 1rem !important; } diff --git a/src/main/java/de/assecutor/votianlt/pages/view/MessageDetailsView.java b/src/main/java/de/assecutor/votianlt/pages/view/MessageDetailsView.java index bff8b42..5fbb895 100644 --- a/src/main/java/de/assecutor/votianlt/pages/view/MessageDetailsView.java +++ b/src/main/java/de/assecutor/votianlt/pages/view/MessageDetailsView.java @@ -182,6 +182,7 @@ public class MessageDetailsView extends Main implements BeforeEnterObserver, Has messagesScroller.setHeightFull(); messagesScroller.setScrollDirection(Scroller.ScrollDirection.VERTICAL); messagesScroller.getStyle().set("flex", "1 1 auto"); + messagesScroller.addClassName("message-thread-scroller"); contentLayout.add(messagesScroller); contentLayout.setFlexGrow(1, messagesScroller); @@ -669,10 +670,6 @@ public class MessageDetailsView extends Main implements BeforeEnterObserver, Has } private HorizontalLayout createHeaderLayout(String clientName, String conversationTitle) { - Button backButton = new Button("Zurück", VaadinIcon.ARROW_LEFT.create()); - backButton.addThemeVariants(com.vaadin.flow.component.button.ButtonVariant.LUMO_TERTIARY); - backButton.addClickListener(e -> UI.getCurrent().navigate("user-messages/" + participantKey)); - VerticalLayout titleLayout = new VerticalLayout(); titleLayout.setPadding(false); titleLayout.setSpacing(false); @@ -685,7 +682,7 @@ public class MessageDetailsView extends Main implements BeforeEnterObserver, Has titleLayout.add(title, subtitle); - HorizontalLayout layout = new HorizontalLayout(backButton, titleLayout); + HorizontalLayout layout = new HorizontalLayout(titleLayout); layout.setWidthFull(); layout.setAlignItems(com.vaadin.flow.component.orderedlayout.FlexComponent.Alignment.CENTER); layout.setSpacing(true); @@ -709,9 +706,10 @@ public class MessageDetailsView extends Main implements BeforeEnterObserver, Has attachButton.getElement().setAttribute("aria-label", "Bild anhängen"); attachButton.addClickListener(event -> openImageUploadDialog()); - Button sendButton = new Button("Senden", VaadinIcon.PAPERPLANE.create()); + Button sendButton = new Button(VaadinIcon.PAPERPLANE.create()); sendButton.addThemeVariants(com.vaadin.flow.component.button.ButtonVariant.LUMO_PRIMARY); sendButton.getStyle().set("height", "60px"); + sendButton.getStyle().set("min-width", "90px"); sendButton.addClickListener(e -> { String message = messageInput.getValue(); diff --git a/src/main/java/de/assecutor/votianlt/pages/view/UserMessagesView.java b/src/main/java/de/assecutor/votianlt/pages/view/UserMessagesView.java index f3a0b45..51e84cb 100644 --- a/src/main/java/de/assecutor/votianlt/pages/view/UserMessagesView.java +++ b/src/main/java/de/assecutor/votianlt/pages/view/UserMessagesView.java @@ -1,14 +1,11 @@ package de.assecutor.votianlt.pages.view; import com.vaadin.flow.component.UI; -import com.vaadin.flow.component.button.Button; -import com.vaadin.flow.component.button.ButtonVariant; import com.vaadin.flow.component.html.Div; import com.vaadin.flow.component.html.H2; import com.vaadin.flow.component.html.H3; import com.vaadin.flow.component.html.Main; import com.vaadin.flow.component.html.Span; -import com.vaadin.flow.component.icon.VaadinIcon; import com.vaadin.flow.component.orderedlayout.HorizontalLayout; import com.vaadin.flow.component.orderedlayout.VerticalLayout; import com.vaadin.flow.router.BeforeEvent; @@ -90,21 +87,14 @@ public class UserMessagesView extends Main implements HasUrlParameter, H Map> messagesByType = conversation.stream().collect(Collectors .groupingBy(message -> Optional.ofNullable(message.getMessageType()).orElse(MessageType.GENERAL))); - VerticalLayout generalSection = createGeneralMessagesSection(messagesByType.get(MessageType.GENERAL)); - - VerticalLayout jobSection = createJobMessagesSection(messagesByType.get(MessageType.JOB_RELATED)); - - contentLayout.add(generalSection, jobSection); + addGeneralMessagesTo(contentLayout, messagesByType.get(MessageType.GENERAL)); + addJobMessagesTo(contentLayout, messagesByType.get(MessageType.JOB_RELATED)); } private HorizontalLayout createHeaderLayout(String clientName) { - Button backButton = new Button(getTranslation("button.back"), VaadinIcon.ARROW_LEFT.create()); - backButton.addThemeVariants(ButtonVariant.LUMO_TERTIARY); - backButton.addClickListener(e -> UI.getCurrent().navigate("messages")); - H2 title = new H2(getTranslation("usermessages.title.with", clientName)); - HorizontalLayout layout = new HorizontalLayout(backButton, title); + HorizontalLayout layout = new HorizontalLayout(title); layout.setWidthFull(); layout.setAlignItems(com.vaadin.flow.component.orderedlayout.FlexComponent.Alignment.CENTER); layout.setSpacing(true); @@ -113,16 +103,10 @@ public class UserMessagesView extends Main implements HasUrlParameter, H return layout; } - private VerticalLayout createGeneralMessagesSection(List generalMessages) { - VerticalLayout section = new VerticalLayout(); - section.setPadding(true); - section.setSpacing(true); - section.setWidthFull(); - section.addClassName("message-section"); - + private void addGeneralMessagesTo(VerticalLayout target, List generalMessages) { H3 title = new H3(getTranslation("usermessages.general.title")); title.addClassName("message-section-title"); - section.add(title); + target.add(title); List sortedMessages = new ArrayList<>(); if (generalMessages != null) { @@ -139,26 +123,18 @@ public class UserMessagesView extends Main implements HasUrlParameter, H LocalDateTime lastMessageTime = latest != null ? latest.getCreatedAt() : null; String preview = resolvePreview(latest); - section.add(createMessageCard(getTranslation("usermessages.general.conversation"), preview, lastMessageTime, + target.add(createMessageCard(getTranslation("usermessages.general.conversation"), preview, lastMessageTime, messageCount, unreadCount, "general")); - - return section; } - private VerticalLayout createJobMessagesSection(List jobMessages) { - VerticalLayout section = new VerticalLayout(); - section.setPadding(true); - section.setSpacing(true); - section.setWidthFull(); - section.addClassName("message-section"); - + private void addJobMessagesTo(VerticalLayout target, List jobMessages) { H3 title = new H3(getTranslation("usermessages.job.title")); title.addClassName("message-section-title"); - section.add(title); + target.add(title); if (jobMessages == null || jobMessages.isEmpty()) { - section.add(new Span(getTranslation("usermessages.no.job.messages"))); - return section; + target.add(new Span(getTranslation("usermessages.no.job.messages"))); + return; } Map> messagesByJob = jobMessages.stream() @@ -171,11 +147,9 @@ public class UserMessagesView extends Main implements HasUrlParameter, H .filter(message -> message.getOrigin() == MessageOrigin.CLIENT && !message.isRead()).count(); String conversationTitle = getTranslation("usermessages.job.conversation", jobKey); - section.add(createMessageCard(conversationTitle, resolvePreview(latest), latest.getCreatedAt(), + target.add(createMessageCard(conversationTitle, resolvePreview(latest), latest.getCreatedAt(), messages.size(), unreadCount, "job-" + sanitizeConversationId(jobKey))); }); - - return section; } private String resolvePreview(Message message) { @@ -236,7 +210,7 @@ public class UserMessagesView extends Main implements HasUrlParameter, H // Add all elements to card VerticalLayout cardContent = new VerticalLayout(titleRow, preview, metaRow); cardContent.setWidthFull(); - cardContent.setPadding(false); + cardContent.setPadding(true); cardContent.setSpacing(false); card.add(cardContent);