From b1a17d80d35ad0d9bd9eb097575fc2467d521b9b Mon Sep 17 00:00:00 2001 From: Marcus Fihlon Date: Tue, 26 Mar 2024 16:04:28 +0100 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20complete=20refactor=20and?= =?UTF-8?q?=20redesign=20to=20fit=20perfectly=20on=20FullHD=20monitors?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marcus Fihlon --- .../{social-wall.css => conference-view.css} | 17 ++++--- .../{posts-view.css => message-view.css} | 8 ++- .../themes/apus/views/next-session-view.css | 22 -------- .../apus/views/running-session-view.css | 22 -------- ...ing-sessions-view.css => session-view.css} | 15 +++++- frontend/themes/apus/views/sessions-view.css | 22 -------- ...next-sessions-view.css => social-view.css} | 14 ++++- .../{post-view.css => social-wall-view.css} | 22 +++++--- .../apus/service/ConferenceService.java | 8 ++- .../fihlon/apus/service/SocialService.java | 10 ++-- .../apus/social/{Post.java => Message.java} | 6 +-- .../apus/social/mastodon/MastodonAPI.java | 10 ++-- ...tSessionsView.java => ConferenceView.java} | 23 +++++---- .../view/{PostView.java => MessageView.java} | 12 ++--- .../fihlon/apus/ui/view/NextSessionView.java | 39 -------------- .../apus/ui/view/RunningSessionsView.java | 40 --------------- ...nningSessionView.java => SessionView.java} | 27 ++++++---- .../view/{PostsView.java => SocialView.java} | 22 ++++---- .../swiss/fihlon/apus/ui/view/SocialWall.java | 51 ------------------- ...{SessionsView.java => SocialWallView.java} | 17 ++++--- .../apus/social/mastodon/MastodonAPITest.java | 11 ++-- ...lWallTest.java => SocialWallViewTest.java} | 10 ++-- 22 files changed, 143 insertions(+), 285 deletions(-) rename frontend/themes/apus/views/{social-wall.css => conference-view.css} (81%) rename frontend/themes/apus/views/{posts-view.css => message-view.css} (87%) delete mode 100644 frontend/themes/apus/views/next-session-view.css delete mode 100644 frontend/themes/apus/views/running-session-view.css rename frontend/themes/apus/views/{running-sessions-view.css => session-view.css} (77%) delete mode 100644 frontend/themes/apus/views/sessions-view.css rename frontend/themes/apus/views/{next-sessions-view.css => social-view.css} (81%) rename frontend/themes/apus/views/{post-view.css => social-wall-view.css} (78%) rename src/main/java/swiss/fihlon/apus/social/{Post.java => Message.java} (83%) rename src/main/java/swiss/fihlon/apus/ui/view/{NextSessionsView.java => ConferenceView.java} (61%) rename src/main/java/swiss/fihlon/apus/ui/view/{PostView.java => MessageView.java} (77%) delete mode 100644 src/main/java/swiss/fihlon/apus/ui/view/NextSessionView.java delete mode 100644 src/main/java/swiss/fihlon/apus/ui/view/RunningSessionsView.java rename src/main/java/swiss/fihlon/apus/ui/view/{RunningSessionView.java => SessionView.java} (59%) rename src/main/java/swiss/fihlon/apus/ui/view/{PostsView.java => SocialView.java} (63%) delete mode 100644 src/main/java/swiss/fihlon/apus/ui/view/SocialWall.java rename src/main/java/swiss/fihlon/apus/ui/view/{SessionsView.java => SocialWallView.java} (66%) rename src/test/java/swiss/fihlon/apus/ui/view/{SocialWallTest.java => SocialWallViewTest.java} (81%) diff --git a/frontend/themes/apus/views/social-wall.css b/frontend/themes/apus/views/conference-view.css similarity index 81% rename from frontend/themes/apus/views/social-wall.css rename to frontend/themes/apus/views/conference-view.css index 872fdf9..f203c49 100644 --- a/frontend/themes/apus/views/social-wall.css +++ b/frontend/themes/apus/views/conference-view.css @@ -16,14 +16,17 @@ * along with this program. If not, see . */ -:root { - font-family: Arial, Helvetica, sans-serif; -} - -#social-wall { +#conference-view { background-color: #007e89; + position: absolute; + top: 0; + left: 0; + width: 1300px; + height: 1080px; + overflow: clip; } -#social-wall-container { - width: 100%; +#conference-view h2 { + font-size: 30px; + margin: 10px; } diff --git a/frontend/themes/apus/views/posts-view.css b/frontend/themes/apus/views/message-view.css similarity index 87% rename from frontend/themes/apus/views/posts-view.css rename to frontend/themes/apus/views/message-view.css index 77c04bc..134dda7 100644 --- a/frontend/themes/apus/views/posts-view.css +++ b/frontend/themes/apus/views/message-view.css @@ -16,8 +16,12 @@ * along with this program. If not, see . */ -#posts { +.message-view { background-color: #84ddee; border-radius: 5px; - width: 500px; + display: inline-block; + width: 580px; + margin-left: 10px; + margin-bottom: 10px; + padding: 10px; } diff --git a/frontend/themes/apus/views/next-session-view.css b/frontend/themes/apus/views/next-session-view.css deleted file mode 100644 index 8933708..0000000 --- a/frontend/themes/apus/views/next-session-view.css +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Apus - A social wall for conferences with additional features. - * Copyright (C) Marcus Fihlon and the individual contributors to Apus. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -.next-session { - border: 1px solid #007e89; - border-radius: 5px; -} diff --git a/frontend/themes/apus/views/running-session-view.css b/frontend/themes/apus/views/running-session-view.css deleted file mode 100644 index 735f73c..0000000 --- a/frontend/themes/apus/views/running-session-view.css +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Apus - A social wall for conferences with additional features. - * Copyright (C) Marcus Fihlon and the individual contributors to Apus. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -.running-session { - border: 1px solid #007e89; - border-radius: 5px; -} diff --git a/frontend/themes/apus/views/running-sessions-view.css b/frontend/themes/apus/views/session-view.css similarity index 77% rename from frontend/themes/apus/views/running-sessions-view.css rename to frontend/themes/apus/views/session-view.css index 3511bb9..3054a1d 100644 --- a/frontend/themes/apus/views/running-sessions-view.css +++ b/frontend/themes/apus/views/session-view.css @@ -16,7 +16,20 @@ * along with this program. If not, see . */ -#running-sessions { +.session-view { background-color: #21ccdd; border-radius: 5px; + display: inline-block; + width: 400px; + height: 174px; + margin-left: 10px; + margin-bottom: 10px; + padding: 10px; + overflow: clip; + font-size: 16px; +} + +.session-view h3 { + font-size: 18px; + margin-bottom: 10px; } diff --git a/frontend/themes/apus/views/sessions-view.css b/frontend/themes/apus/views/sessions-view.css deleted file mode 100644 index 4388473..0000000 --- a/frontend/themes/apus/views/sessions-view.css +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Apus - A social wall for conferences with additional features. - * Copyright (C) Marcus Fihlon and the individual contributors to Apus. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -#sessions { - margin: -15px; - width: 2600px !important; -} diff --git a/frontend/themes/apus/views/next-sessions-view.css b/frontend/themes/apus/views/social-view.css similarity index 81% rename from frontend/themes/apus/views/next-sessions-view.css rename to frontend/themes/apus/views/social-view.css index 005f122..a0834cf 100644 --- a/frontend/themes/apus/views/next-sessions-view.css +++ b/frontend/themes/apus/views/social-view.css @@ -16,7 +16,17 @@ * along with this program. If not, see . */ -#next-sessions { +#social-view { background-color: #1aa3b1; - border-radius: 5px; + position: absolute; + top: 0; + left: 1300px; + width: 620px; + height: 1080px; + overflow: clip; +} + +#social-view h2 { + font-size: 30px; + margin: 10px; } diff --git a/frontend/themes/apus/views/post-view.css b/frontend/themes/apus/views/social-wall-view.css similarity index 78% rename from frontend/themes/apus/views/post-view.css rename to frontend/themes/apus/views/social-wall-view.css index ff3a51d..74ae4e7 100644 --- a/frontend/themes/apus/views/post-view.css +++ b/frontend/themes/apus/views/social-wall-view.css @@ -16,12 +16,22 @@ * along with this program. If not, see . */ -.post-view { - border: 1px solid #007e89; - border-radius: 5px; - width: 100%; +:root { + background-color: #000000; } -.post-view > div { - padding: 5px; +:root, h3, a, a:visited { + color: #014f7a; +} + +h2 { + color: #003861; +} + +#social-wall-view { + position: absolute; + top: 0; + left: 0; + width: 1920px; + height: 1080px; } diff --git a/src/main/java/swiss/fihlon/apus/service/ConferenceService.java b/src/main/java/swiss/fihlon/apus/service/ConferenceService.java index 9dabc2d..d3e0c86 100644 --- a/src/main/java/swiss/fihlon/apus/service/ConferenceService.java +++ b/src/main/java/swiss/fihlon/apus/service/ConferenceService.java @@ -17,6 +17,8 @@ */ package swiss.fihlon.apus.service; +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.RandomUtils; import org.springframework.stereotype.Service; import swiss.fihlon.apus.conference.Session; @@ -72,8 +74,8 @@ public List getNextSessions() { private List generateSampleData() { final int sampleDataSize = 100; - final int sampleSessionParallel = 5; - final int sampleDuration = 5; + final int sampleSessionParallel = 15; + final int sampleDuration = 10; final List sampleData = new ArrayList<>(sampleDataSize); @@ -91,6 +93,8 @@ private List generateSampleData() { final String id = UUID.randomUUID().toString(); final LocalDateTime endDate = startDate.plusMinutes(sampleDuration); final String room = String.valueOf((char) ('A' + counter)); + // final String random = RandomStringUtils.random(RandomUtils.nextInt(1, 150), "abcd efghi jklmn opqrst uvwxyz "); + // final String title = random + " Test Session #" + index; final String title = "Test Session #" + index; final String speaker = "Speaker #" + (counter + 1); sampleData.add(new Session(id, startDate, endDate, room, title, speaker)); diff --git a/src/main/java/swiss/fihlon/apus/service/SocialService.java b/src/main/java/swiss/fihlon/apus/service/SocialService.java index 681f2a3..c9729ed 100644 --- a/src/main/java/swiss/fihlon/apus/service/SocialService.java +++ b/src/main/java/swiss/fihlon/apus/service/SocialService.java @@ -18,7 +18,7 @@ package swiss.fihlon.apus.service; import org.springframework.stereotype.Service; -import swiss.fihlon.apus.social.Post; +import swiss.fihlon.apus.social.Message; import swiss.fihlon.apus.social.mastodon.MastodonAPI; import java.util.Collections; @@ -27,15 +27,15 @@ @Service public final class SocialService { - private final List posts; + private final List messages; public SocialService() { final MastodonAPI mastodonAPI = new MastodonAPI("mastodon.social"); - posts = mastodonAPI.getPosts("javaland"); + messages = mastodonAPI.getMessages("javaland"); } - public List getPosts() { - return Collections.unmodifiableList(posts); + public List getMessages() { + return Collections.unmodifiableList(messages); } } diff --git a/src/main/java/swiss/fihlon/apus/social/Post.java b/src/main/java/swiss/fihlon/apus/social/Message.java similarity index 83% rename from src/main/java/swiss/fihlon/apus/social/Post.java rename to src/main/java/swiss/fihlon/apus/social/Message.java index d55ed09..0882bc6 100644 --- a/src/main/java/swiss/fihlon/apus/social/Post.java +++ b/src/main/java/swiss/fihlon/apus/social/Message.java @@ -21,10 +21,10 @@ import java.time.LocalDateTime; -public record Post(String id, LocalDateTime date, String author, String avatar, String html) - implements Comparable { +public record Message(String id, LocalDateTime date, String author, String avatar, String html) + implements Comparable { @Override - public int compareTo(@NotNull final Post other) { + public int compareTo(@NotNull final Message other) { return date.compareTo(other.date); } } diff --git a/src/main/java/swiss/fihlon/apus/social/mastodon/MastodonAPI.java b/src/main/java/swiss/fihlon/apus/social/mastodon/MastodonAPI.java index 9b32739..9970593 100644 --- a/src/main/java/swiss/fihlon/apus/social/mastodon/MastodonAPI.java +++ b/src/main/java/swiss/fihlon/apus/social/mastodon/MastodonAPI.java @@ -23,7 +23,7 @@ import social.bigbone.api.entity.Account; import social.bigbone.api.entity.Status; import social.bigbone.api.exception.BigBoneRequestException; -import swiss.fihlon.apus.social.Post; +import swiss.fihlon.apus.social.Message; import java.time.Instant; import java.time.LocalDateTime; @@ -40,12 +40,12 @@ public MastodonAPI(@NotNull final String instance) { this.instance = instance; } - public List getPosts(@NotNull final String hashtag) { + public List getMessages(@NotNull final String hashtag) { try { final MastodonClient client = new MastodonClient.Builder(instance).build(); final Pageable statuses = client.timelines().getTagTimeline(hashtag, LOCAL_AND_REMOTE).execute(); return statuses.getPart().stream() - .map(this::convertToPost) + .map(this::convertToMessage) .sorted() .toList() .reversed(); @@ -55,11 +55,11 @@ public List getPosts(@NotNull final String hashtag) { return List.of(); } - private Post convertToPost(@NotNull final Status status) { + private Message convertToMessage(@NotNull final Status status) { final Account account = status.getAccount(); final Instant instant = status.getCreatedAt().mostPreciseInstantOrNull(); final LocalDateTime date = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()); - return new Post( + return new Message( status.getId(), date, account.getDisplayName(), diff --git a/src/main/java/swiss/fihlon/apus/ui/view/NextSessionsView.java b/src/main/java/swiss/fihlon/apus/ui/view/ConferenceView.java similarity index 61% rename from src/main/java/swiss/fihlon/apus/ui/view/NextSessionsView.java rename to src/main/java/swiss/fihlon/apus/ui/view/ConferenceView.java index c300d79..b998384 100644 --- a/src/main/java/swiss/fihlon/apus/ui/view/NextSessionsView.java +++ b/src/main/java/swiss/fihlon/apus/ui/view/ConferenceView.java @@ -18,23 +18,24 @@ package swiss.fihlon.apus.ui.view; import com.vaadin.flow.component.dependency.CssImport; -import com.vaadin.flow.component.html.H3; -import com.vaadin.flow.component.orderedlayout.HorizontalLayout; -import com.vaadin.flow.component.orderedlayout.VerticalLayout; +import com.vaadin.flow.component.html.Div; +import com.vaadin.flow.component.html.H2; import org.jetbrains.annotations.NotNull; import swiss.fihlon.apus.conference.Session; import swiss.fihlon.apus.service.ConferenceService; -@CssImport(value = "./themes/apus/views/next-sessions-view.css") -public class NextSessionsView extends VerticalLayout { +@CssImport(value = "./themes/apus/views/conference-view.css") +public final class ConferenceView extends Div { - public NextSessionsView(@NotNull final ConferenceService conferenceService) { - final HorizontalLayout nextSessions = new HorizontalLayout(); - for (final Session session : conferenceService.getNextSessions()) { - nextSessions.add(new NextSessionView(session)); + public ConferenceView(@NotNull final ConferenceService conferenceService) { + setId("conference-view"); + final var sessions = conferenceService.getRunningSessions(); + add(new H2(String.format("Agenda (%d)", sessions.size()))); + final var sessionContainer = new Div(); + for (final Session session : sessions) { + sessionContainer.add(new SessionView(session)); } - setId("next-sessions"); - add(new H3("Next Sessions"), nextSessions); + add(sessionContainer); } } diff --git a/src/main/java/swiss/fihlon/apus/ui/view/PostView.java b/src/main/java/swiss/fihlon/apus/ui/view/MessageView.java similarity index 77% rename from src/main/java/swiss/fihlon/apus/ui/view/PostView.java rename to src/main/java/swiss/fihlon/apus/ui/view/MessageView.java index 8b537f8..23517d3 100644 --- a/src/main/java/swiss/fihlon/apus/ui/view/PostView.java +++ b/src/main/java/swiss/fihlon/apus/ui/view/MessageView.java @@ -21,14 +21,14 @@ import com.vaadin.flow.component.dependency.CssImport; import com.vaadin.flow.component.html.Div; import org.jetbrains.annotations.NotNull; -import swiss.fihlon.apus.social.Post; +import swiss.fihlon.apus.social.Message; -@CssImport(value = "./themes/apus/views/post-view.css") -public final class PostView extends Div { +@CssImport(value = "./themes/apus/views/message-view.css") +public final class MessageView extends Div { - public PostView(@NotNull final Post post) { - addClassName("post-view"); - add(new Html("
" + post.html() + "
")); + public MessageView(@NotNull final Message message) { + addClassName("message-view"); + add(new Html("
" + message.html() + "
")); } } diff --git a/src/main/java/swiss/fihlon/apus/ui/view/NextSessionView.java b/src/main/java/swiss/fihlon/apus/ui/view/NextSessionView.java deleted file mode 100644 index 3cb268d..0000000 --- a/src/main/java/swiss/fihlon/apus/ui/view/NextSessionView.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Apus - A social wall for conferences with additional features. - * Copyright (C) Marcus Fihlon and the individual contributors to Apus. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ -package swiss.fihlon.apus.ui.view; - -import com.vaadin.flow.component.dependency.CssImport; -import com.vaadin.flow.component.html.Div; -import com.vaadin.flow.component.html.H4; -import com.vaadin.flow.component.html.Paragraph; -import com.vaadin.flow.component.orderedlayout.VerticalLayout; -import org.jetbrains.annotations.NotNull; -import swiss.fihlon.apus.conference.Session; - -@CssImport(value = "./themes/apus/views/next-session-view.css") -public class NextSessionView extends VerticalLayout { - - public NextSessionView(@NotNull final Session session) { - addClassName("next-session"); - add(new H4(session.title())); - add(new Paragraph("\uD83D\uDC64 " + session.speaker())); - add(new Div("\uD83D\uDCCD " + String.format("Room %s", session.room()))); - add(new Paragraph("⌚ " + session.startDate().toLocalTime())); - } - -} diff --git a/src/main/java/swiss/fihlon/apus/ui/view/RunningSessionsView.java b/src/main/java/swiss/fihlon/apus/ui/view/RunningSessionsView.java deleted file mode 100644 index f2efe10..0000000 --- a/src/main/java/swiss/fihlon/apus/ui/view/RunningSessionsView.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Apus - A social wall for conferences with additional features. - * Copyright (C) Marcus Fihlon and the individual contributors to Apus. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ -package swiss.fihlon.apus.ui.view; - -import com.vaadin.flow.component.dependency.CssImport; -import com.vaadin.flow.component.html.H3; -import com.vaadin.flow.component.orderedlayout.HorizontalLayout; -import com.vaadin.flow.component.orderedlayout.VerticalLayout; -import org.jetbrains.annotations.NotNull; -import swiss.fihlon.apus.conference.Session; -import swiss.fihlon.apus.service.ConferenceService; - -@CssImport(value = "./themes/apus/views/running-sessions-view.css") -public class RunningSessionsView extends VerticalLayout { - - public RunningSessionsView(@NotNull final ConferenceService conferenceService) { - final HorizontalLayout runningSessions = new HorizontalLayout(); - for (final Session session : conferenceService.getRunningSessions()) { - runningSessions.add(new RunningSessionView(session)); - } - setId("running-sessions"); - add(new H3("Running Sessions"), runningSessions); - } - -} diff --git a/src/main/java/swiss/fihlon/apus/ui/view/RunningSessionView.java b/src/main/java/swiss/fihlon/apus/ui/view/SessionView.java similarity index 59% rename from src/main/java/swiss/fihlon/apus/ui/view/RunningSessionView.java rename to src/main/java/swiss/fihlon/apus/ui/view/SessionView.java index 32df111..0ecfd8a 100644 --- a/src/main/java/swiss/fihlon/apus/ui/view/RunningSessionView.java +++ b/src/main/java/swiss/fihlon/apus/ui/view/SessionView.java @@ -19,26 +19,31 @@ import com.vaadin.flow.component.dependency.CssImport; import com.vaadin.flow.component.html.Div; -import com.vaadin.flow.component.html.H4; -import com.vaadin.flow.component.orderedlayout.VerticalLayout; +import com.vaadin.flow.component.html.H3; import org.jetbrains.annotations.NotNull; import swiss.fihlon.apus.conference.Session; import java.time.Duration; import java.time.LocalDateTime; -@CssImport(value = "./themes/apus/views/running-session-view.css") -public class RunningSessionView extends VerticalLayout { +@CssImport(value = "./themes/apus/views/session-view.css") +public final class SessionView extends Div { - public RunningSessionView(@NotNull final Session session) { - final Duration duration = Duration.between(LocalDateTime.now(), session.endDate()); - final long timeLeft = Math.round(duration.getSeconds() / 60f); - final String timeUnit = timeLeft == 1 ? "minute" : "minutes"; - addClassName("running-session"); - add(new H4(session.title())); + public SessionView(@NotNull final Session session) { + addClassName("session-view"); + add(new H3(session.title())); add(new Div("\uD83D\uDC64 " + session.speaker())); add(new Div("\uD83D\uDCCD " + String.format("Room %s", session.room()))); - add(new Div("⌛ " + String.format("%d %s left", timeLeft, timeUnit))); + + final var now = LocalDateTime.now(); + if (session.startDate().isBefore(now) && session.endDate().isAfter(now)) { // running session + final Duration duration = Duration.between(LocalDateTime.now(), session.endDate()); + final long timeLeft = Math.round(duration.getSeconds() / 60f); + final String timeUnit = timeLeft == 1 ? "minute" : "minutes"; + add(new Div("⌛ " + String.format("%d %s left", timeLeft, timeUnit))); + } else { + add(new Div("⌚ " + session.startDate().toLocalTime())); + } } } diff --git a/src/main/java/swiss/fihlon/apus/ui/view/PostsView.java b/src/main/java/swiss/fihlon/apus/ui/view/SocialView.java similarity index 63% rename from src/main/java/swiss/fihlon/apus/ui/view/PostsView.java rename to src/main/java/swiss/fihlon/apus/ui/view/SocialView.java index 15139e9..4cff39a 100644 --- a/src/main/java/swiss/fihlon/apus/ui/view/PostsView.java +++ b/src/main/java/swiss/fihlon/apus/ui/view/SocialView.java @@ -18,21 +18,23 @@ package swiss.fihlon.apus.ui.view; import com.vaadin.flow.component.dependency.CssImport; -import com.vaadin.flow.component.html.H3; -import com.vaadin.flow.component.orderedlayout.VerticalLayout; +import com.vaadin.flow.component.html.Div; +import com.vaadin.flow.component.html.H2; import org.jetbrains.annotations.NotNull; import swiss.fihlon.apus.service.SocialService; -import swiss.fihlon.apus.social.Post; +import swiss.fihlon.apus.social.Message; -@CssImport(value = "./themes/apus/views/posts-view.css") -public final class PostsView extends VerticalLayout { +@CssImport(value = "./themes/apus/views/social-view.css") +public final class SocialView extends Div { - public PostsView(@NotNull final SocialService socialService) { - setId("posts"); - add(new H3("Posts with #JavaLand")); - for (final Post post : socialService.getPosts()) { - add(new PostView(post)); + public SocialView(@NotNull final SocialService socialService) { + setId("social-view"); + add(new H2("#JavaLand on Mastodon")); + final var messageContainer = new Div(); + for (final Message message : socialService.getMessages()) { + messageContainer.add(new MessageView(message)); } + add(messageContainer); } } diff --git a/src/main/java/swiss/fihlon/apus/ui/view/SocialWall.java b/src/main/java/swiss/fihlon/apus/ui/view/SocialWall.java deleted file mode 100644 index 822d511..0000000 --- a/src/main/java/swiss/fihlon/apus/ui/view/SocialWall.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Apus - A social wall for conferences with additional features. - * Copyright (C) Marcus Fihlon and the individual contributors to Apus. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ -package swiss.fihlon.apus.ui.view; - -import com.vaadin.flow.component.dependency.CssImport; -import com.vaadin.flow.component.html.Div; -import com.vaadin.flow.component.orderedlayout.HorizontalLayout; -import com.vaadin.flow.component.orderedlayout.VerticalLayout; -import com.vaadin.flow.router.Route; -import org.jetbrains.annotations.NotNull; -import swiss.fihlon.apus.service.ConferenceService; -import swiss.fihlon.apus.service.SocialService; - -import java.io.Serial; - -@Route("") -@CssImport(value = "./themes/apus/views/social-wall.css") -public class SocialWall extends VerticalLayout { - - @Serial - private static final long serialVersionUID = 7909437130138135008L; - - public SocialWall(@NotNull final ConferenceService conferenceService, - @NotNull final SocialService socialService) { - setId("social-wall"); - setSizeFull(); - - final var sessionsView = new SessionsView(conferenceService); - final var postsView = new PostsView(socialService); - final var layout = new HorizontalLayout(sessionsView, postsView); - layout.setId("social-wall-container"); - add(layout); - add(new Div("Footer")); - } - -} diff --git a/src/main/java/swiss/fihlon/apus/ui/view/SessionsView.java b/src/main/java/swiss/fihlon/apus/ui/view/SocialWallView.java similarity index 66% rename from src/main/java/swiss/fihlon/apus/ui/view/SessionsView.java rename to src/main/java/swiss/fihlon/apus/ui/view/SocialWallView.java index 5c68309..bd5edc8 100644 --- a/src/main/java/swiss/fihlon/apus/ui/view/SessionsView.java +++ b/src/main/java/swiss/fihlon/apus/ui/view/SocialWallView.java @@ -18,17 +18,20 @@ package swiss.fihlon.apus.ui.view; import com.vaadin.flow.component.dependency.CssImport; -import com.vaadin.flow.component.orderedlayout.VerticalLayout; +import com.vaadin.flow.component.html.Div; +import com.vaadin.flow.router.Route; import org.jetbrains.annotations.NotNull; import swiss.fihlon.apus.service.ConferenceService; +import swiss.fihlon.apus.service.SocialService; -@CssImport(value = "./themes/apus/views/sessions-view.css") -public class SessionsView extends VerticalLayout { +@Route("") +@CssImport(value = "./themes/apus/views/social-wall-view.css") +public final class SocialWallView extends Div { - public SessionsView(@NotNull final ConferenceService conferenceService) { - setId("sessions"); - add(new RunningSessionsView(conferenceService)); - add(new NextSessionsView(conferenceService)); + public SocialWallView(@NotNull final ConferenceService conferenceService, + @NotNull final SocialService socialService) { + setId("social-wall-view"); + add(new ConferenceView(conferenceService), new SocialView(socialService)); } } diff --git a/src/test/java/swiss/fihlon/apus/social/mastodon/MastodonAPITest.java b/src/test/java/swiss/fihlon/apus/social/mastodon/MastodonAPITest.java index aaf8a51..93e00b3 100644 --- a/src/test/java/swiss/fihlon/apus/social/mastodon/MastodonAPITest.java +++ b/src/test/java/swiss/fihlon/apus/social/mastodon/MastodonAPITest.java @@ -18,7 +18,7 @@ package swiss.fihlon.apus.social.mastodon; import org.junit.jupiter.api.Test; -import swiss.fihlon.apus.social.Post; +import swiss.fihlon.apus.social.Message; import java.util.List; @@ -27,12 +27,9 @@ class MastodonAPITest { @Test - void getPosts() { + void getMessages() { final MastodonAPI mastodonAPI = new MastodonAPI("mastodon.social"); - final List posts = mastodonAPI.getPosts("java"); - assertNotNull(posts); - for (final Post post : posts) { - System.out.println(post); - } + final List messages = mastodonAPI.getMessages("java"); + assertNotNull(messages); } } diff --git a/src/test/java/swiss/fihlon/apus/ui/view/SocialWallTest.java b/src/test/java/swiss/fihlon/apus/ui/view/SocialWallViewTest.java similarity index 81% rename from src/test/java/swiss/fihlon/apus/ui/view/SocialWallTest.java rename to src/test/java/swiss/fihlon/apus/ui/view/SocialWallViewTest.java index d0c39e9..0101559 100644 --- a/src/test/java/swiss/fihlon/apus/ui/view/SocialWallTest.java +++ b/src/test/java/swiss/fihlon/apus/ui/view/SocialWallViewTest.java @@ -23,13 +23,15 @@ import static com.github.mvysny.kaributesting.v10.LocatorJ._assertOne; -class SocialWallTest extends KaribuTest { +class SocialWallViewTest extends KaribuTest { @Test @SuppressWarnings("java:S2699") // flase positiv: Karibu assertions are not recognized - void upAndRunning() { - UI.getCurrent().navigate(SocialWall.class); - _assertOne(SocialWall.class); + void socialWallContainsViews() { + UI.getCurrent().navigate(SocialWallView.class); + _assertOne(SocialWallView.class); + _assertOne(ConferenceView.class); + _assertOne(SocialView.class); } }