From 49e5da47cad0616eb6fdf07771d07c4841940e49 Mon Sep 17 00:00:00 2001 From: AlberteMB Date: Wed, 13 Nov 2024 19:48:32 +0100 Subject: [PATCH 01/15] New models: Speaker and Conference. --- .../springConference/model/Conference.java | 19 ++++++++++++++++++- .../bcn/springConference/model/Speaker.java | 16 +++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/bcn/springConference/model/Conference.java b/src/main/java/io/bcn/springConference/model/Conference.java index 15d79d2..9c44bcb 100644 --- a/src/main/java/io/bcn/springConference/model/Conference.java +++ b/src/main/java/io/bcn/springConference/model/Conference.java @@ -1,4 +1,21 @@ package io.bcn.springConference.model; +import jakarta.persistence.*; +import lombok.Data; + +import java.time.LocalDate; +import java.util.List; + +@Data +@Entity public class Conference { -} + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String name; + private LocalDate date; + + @OneToMany(mappedBy = "conference") + private List speakers; + // Getters and setters +} \ No newline at end of file diff --git a/src/main/java/io/bcn/springConference/model/Speaker.java b/src/main/java/io/bcn/springConference/model/Speaker.java index db76a55..c2699a0 100644 --- a/src/main/java/io/bcn/springConference/model/Speaker.java +++ b/src/main/java/io/bcn/springConference/model/Speaker.java @@ -1,4 +1,18 @@ package io.bcn.springConference.model; +import jakarta.persistence.*; +import lombok.Data; + +@Data +@Entity public class Speaker { -} + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String name; + + @ManyToOne + @JoinColumn(name = "conference_id") + private Conference conference; + // Getters and setters +} \ No newline at end of file From 90ca7df41fe8ba484a6bc90131086830e0c46028 Mon Sep 17 00:00:00 2001 From: AlberteMB Date: Wed, 13 Nov 2024 19:49:09 +0100 Subject: [PATCH 02/15] New JPA Repositories: Conference and Speaker. --- .../repository/ConferenceRepository.java | 9 +++++++++ .../springConference/repository/SpeakerRepository.java | 9 +++++++++ 2 files changed, 18 insertions(+) create mode 100644 src/main/java/io/bcn/springConference/repository/ConferenceRepository.java create mode 100644 src/main/java/io/bcn/springConference/repository/SpeakerRepository.java diff --git a/src/main/java/io/bcn/springConference/repository/ConferenceRepository.java b/src/main/java/io/bcn/springConference/repository/ConferenceRepository.java new file mode 100644 index 0000000..523d362 --- /dev/null +++ b/src/main/java/io/bcn/springConference/repository/ConferenceRepository.java @@ -0,0 +1,9 @@ +package io.bcn.springConference.repository; + +import io.bcn.springConference.model.Conference; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.UUID; + +public interface ConferenceRepository extends JpaRepository { +} diff --git a/src/main/java/io/bcn/springConference/repository/SpeakerRepository.java b/src/main/java/io/bcn/springConference/repository/SpeakerRepository.java new file mode 100644 index 0000000..a6b29ba --- /dev/null +++ b/src/main/java/io/bcn/springConference/repository/SpeakerRepository.java @@ -0,0 +1,9 @@ +package io.bcn.springConference.repository; + +import io.bcn.springConference.model.Speaker; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.UUID; + +public interface SpeakerRepository extends JpaRepository { +} From 7ed208e56978f044650446db70374c7f7d6cd28d Mon Sep 17 00:00:00 2001 From: AlberteMB Date: Wed, 13 Nov 2024 19:49:20 +0100 Subject: [PATCH 03/15] Importing classes. --- .../springConference/view/ConferenceView.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/src/main/java/io/bcn/springConference/view/ConferenceView.java b/src/main/java/io/bcn/springConference/view/ConferenceView.java index 4e99b93..aa081e0 100644 --- a/src/main/java/io/bcn/springConference/view/ConferenceView.java +++ b/src/main/java/io/bcn/springConference/view/ConferenceView.java @@ -1,3 +1,12 @@ +import com.vaadin.flow.component.datepicker.DatePicker; +import com.vaadin.flow.component.grid.Grid; +import com.vaadin.flow.component.orderedlayout.VerticalLayout; +import com.vaadin.flow.router.Route; +import io.bcn.springConference.model.Conference; +import io.bcn.springConference.repository.ConferenceRepository; + +import java.awt.*; + /* package io.bcn.springConference.view; @@ -72,3 +81,50 @@ private Component createMainLayout() { } */ + + +@Route(value = "conferences", layout = MainLayout.class) +public class ConferenceView extends VerticalLayout { + private final ConferenceRepository repository; + private Grid grid; + private TextField nameField; + private DatePicker datePicker; + + public ConferenceView(ConferenceRepository repository) { + this.repository = repository; + createGrid(); + createForm(); + add(grid, createFormLayout()); + } + + private void createGrid() { + grid = new Grid<>(Conference.class); + grid.setColumns("name", "date"); + updateList(); + } + + private void createForm() { + nameField = new TextField("Name"); + datePicker = new DatePicker("Date"); + Button saveButton = new Button("Save", e -> saveConference()); + // Add form components and logic + } + + private void saveConference() { + Conference conference = new Conference(); + conference.setName(nameField.getValue()); + conference.setDate(datePicker.getValue()); + repository.save(conference); + updateList(); + clearForm(); + } + + private void updateList() { + grid.setItems(repository.findAll()); + } + + private void clearForm() { + nameField.clear(); + datePicker.clear(); + } +} \ No newline at end of file From 347f37270803318e61082c74f6926ee4fff30dc2 Mon Sep 17 00:00:00 2001 From: AlberteMB Date: Thu, 14 Nov 2024 08:55:35 +0100 Subject: [PATCH 04/15] MainLayout generated. --- .../java/io/bcn/springConference/view/ConferenceView.java | 1 + src/main/java/io/bcn/springConference/view/MainLayout.java | 4 ++++ 2 files changed, 5 insertions(+) create mode 100644 src/main/java/io/bcn/springConference/view/MainLayout.java diff --git a/src/main/java/io/bcn/springConference/view/ConferenceView.java b/src/main/java/io/bcn/springConference/view/ConferenceView.java index aa081e0..2f2b99d 100644 --- a/src/main/java/io/bcn/springConference/view/ConferenceView.java +++ b/src/main/java/io/bcn/springConference/view/ConferenceView.java @@ -4,6 +4,7 @@ import com.vaadin.flow.router.Route; import io.bcn.springConference.model.Conference; import io.bcn.springConference.repository.ConferenceRepository; +import io.bcn.springConference.view.MainLayout; import java.awt.*; diff --git a/src/main/java/io/bcn/springConference/view/MainLayout.java b/src/main/java/io/bcn/springConference/view/MainLayout.java new file mode 100644 index 0000000..14a3abd --- /dev/null +++ b/src/main/java/io/bcn/springConference/view/MainLayout.java @@ -0,0 +1,4 @@ +package io.bcn.springConference.view; + +public class MainLayout { +} From 81da615086400364f0b9547f5f504e07010a501b Mon Sep 17 00:00:00 2001 From: AlberteMB Date: Thu, 14 Nov 2024 15:08:49 +0100 Subject: [PATCH 05/15] New entities. --- .../io/bcn/springConference/model/Book.java | 27 ++++++++------ .../springConference/model/Conference.java | 35 +++++++++++++++---- .../bcn/springConference/model/Speaker.java | 29 ++++++++++++--- 3 files changed, 70 insertions(+), 21 deletions(-) diff --git a/src/main/java/io/bcn/springConference/model/Book.java b/src/main/java/io/bcn/springConference/model/Book.java index 5638c89..54144e8 100644 --- a/src/main/java/io/bcn/springConference/model/Book.java +++ b/src/main/java/io/bcn/springConference/model/Book.java @@ -1,11 +1,10 @@ package io.bcn.springConference.model; import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; +import lombok.*; import org.hibernate.annotations.GenericGenerator; + +import java.util.List; import java.util.UUID; @@ -18,9 +17,9 @@ public class Book { @Id - @GeneratedValue(generator = "UUID") - @GenericGenerator(name = "UUID", - strategy = "org.hibernate.id.UUIDGenerator") +// @GeneratedValue(generator = "UUID") +// @GenericGenerator(name = "UUID", +// strategy = "org.hibernate.id.UUIDGenerator") @Column(name = "id", updatable = false, nullable = false) private UUID id; @@ -34,6 +33,14 @@ public class Book { @Column(nullable = false, unique = true) private String ISBN; -/* @OneToMany(mappedBy = "book") - private List conferences;*/ -} + @OneToMany(mappedBy = "bookMapped", cascade = CascadeType.ALL) + private List conferences ; + + + //method to add + public void addConference(Conference conference) { + this.getConferences().add(conference); + if (conference.getBookMapped() != null) conference.getBookMapped().getConferences().remove(conference); + conference.setBookMapped(this); + } +} \ No newline at end of file diff --git a/src/main/java/io/bcn/springConference/model/Conference.java b/src/main/java/io/bcn/springConference/model/Conference.java index 9c44bcb..7f45935 100644 --- a/src/main/java/io/bcn/springConference/model/Conference.java +++ b/src/main/java/io/bcn/springConference/model/Conference.java @@ -1,21 +1,44 @@ package io.bcn.springConference.model; +import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import java.time.LocalDate; import java.util.List; +import java.util.UUID; + -@Data @Entity +@Table(name = "conferences") +@NoArgsConstructor +@AllArgsConstructor +@Data public class Conference { @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; + @Column(name = "id", updatable = false, + nullable = false) + private UUID id; + + @Column(name = "conference_name",nullable = false) private String name; + + @Column(nullable = false) private LocalDate date; - @OneToMany(mappedBy = "conference") - private List speakers; - // Getters and setters + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "SPEAKER_FK_ID", nullable = false) + private Speaker speakerMapped; + + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "BOOK_FK_ID", nullable = false) + private Book bookMapped; + + + } \ No newline at end of file diff --git a/src/main/java/io/bcn/springConference/model/Speaker.java b/src/main/java/io/bcn/springConference/model/Speaker.java index c2699a0..f3c88be 100644 --- a/src/main/java/io/bcn/springConference/model/Speaker.java +++ b/src/main/java/io/bcn/springConference/model/Speaker.java @@ -1,18 +1,37 @@ package io.bcn.springConference.model; import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; +import java.util.UUID; @Data @Entity +@Table(name = "speakers") +@NoArgsConstructor +@AllArgsConstructor public class Speaker { @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; + //@GeneratedValue(strategy = GenerationType.IDENTITY) + private UUID id; private String name; - @ManyToOne - @JoinColumn(name = "conference_id") - private Conference conference; + @OneToMany(mappedBy = "speakerMapped", cascade = CascadeType.ALL) + private List conferences; + // Getters and setters + + //method to add + public void addConference(Conference conference) { + this.getConferences().add(conference); + if (conference.getSpeakerMapped() != null) conference.getSpeakerMapped().getConferences().remove(conference); + conference.setSpeakerMapped(this); + } + + + } \ No newline at end of file From 669f17dac6911f219905470eaf171e30152e816a Mon Sep 17 00:00:00 2001 From: AlberteMB Date: Thu, 14 Nov 2024 15:09:20 +0100 Subject: [PATCH 06/15] Changing server port = 8082 --- src/main/resources/application.properties | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 4db059e..6f7fe09 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -31,4 +31,6 @@ spring.sql.init.data-locations=classpath:/data.sql vaadin.launch-browser=true #logging.level.org.springframework=DEBUG -#logging.level.org.hibernate.SQL=DEBUG \ No newline at end of file +#logging.level.org.hibernate.SQL=DEBUG + +server.port=8082 \ No newline at end of file From 34b807c39a285b9f8f281017404547726b44468e Mon Sep 17 00:00:00 2001 From: AlberteMB Date: Thu, 14 Nov 2024 16:27:43 +0100 Subject: [PATCH 07/15] Changes in Vaadin and model. --- src/main/java/io/bcn/springConference/model/Speaker.java | 3 +++ .../io/bcn/springConference/view/ConferenceView.java | 5 +++-- .../java/io/bcn/springConference/view/MainLayout.java | 6 +++++- src/main/resources/application.properties | 9 ++++++--- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/main/java/io/bcn/springConference/model/Speaker.java b/src/main/java/io/bcn/springConference/model/Speaker.java index f3c88be..c34b15f 100644 --- a/src/main/java/io/bcn/springConference/model/Speaker.java +++ b/src/main/java/io/bcn/springConference/model/Speaker.java @@ -17,7 +17,10 @@ public class Speaker { @Id //@GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id", updatable = false, + nullable = false) private UUID id; + @Column(name = "name",nullable = false) private String name; @OneToMany(mappedBy = "speakerMapped", cascade = CascadeType.ALL) diff --git a/src/main/java/io/bcn/springConference/view/ConferenceView.java b/src/main/java/io/bcn/springConference/view/ConferenceView.java index 2f2b99d..f19c27b 100644 --- a/src/main/java/io/bcn/springConference/view/ConferenceView.java +++ b/src/main/java/io/bcn/springConference/view/ConferenceView.java @@ -84,7 +84,7 @@ private Component createMainLayout() { */ -@Route(value = "conferences", layout = MainLayout.class) +@Route(value = "/conferences", layout = MainLayout.class) public class ConferenceView extends VerticalLayout { private final ConferenceRepository repository; private Grid grid; @@ -128,4 +128,5 @@ private void clearForm() { nameField.clear(); datePicker.clear(); } -} \ No newline at end of file +} + diff --git a/src/main/java/io/bcn/springConference/view/MainLayout.java b/src/main/java/io/bcn/springConference/view/MainLayout.java index 14a3abd..8910f17 100644 --- a/src/main/java/io/bcn/springConference/view/MainLayout.java +++ b/src/main/java/io/bcn/springConference/view/MainLayout.java @@ -1,4 +1,8 @@ package io.bcn.springConference.view; -public class MainLayout { +import com.vaadin.flow.component.orderedlayout.VerticalLayout; + +public class MainLayout extends VerticalLayout { + + } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 6f7fe09..28eda26 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -18,8 +18,8 @@ spring.sql.init.platform=h2 # Ensure SQL initialization is performed #spring.datasource.initialization-mode=always -spring.sql.init.mode=always -#spring.sql.init.mode=never +#spring.sql.init.mode=always +spring.sql.init.mode=never # Defer datasource initialization spring.jpa.defer-datasource-initialization=true @@ -33,4 +33,7 @@ vaadin.launch-browser=true #logging.level.org.springframework=DEBUG #logging.level.org.hibernate.SQL=DEBUG -server.port=8082 \ No newline at end of file +server.port=8082 + +spring.main.web-application-type=VAADIN +vaadin.production-mode=false \ No newline at end of file From 06624959b43b0ca98a334fbbbd856f502a3ad3b2 Mon Sep 17 00:00:00 2001 From: AlberteMB Date: Thu, 14 Nov 2024 16:52:54 +0100 Subject: [PATCH 08/15] Changes in MainLayout. --- .../bcn/springConference/model/Speaker.java | 1 - .../springConference/view/ConferenceView.java | 45 -------------- .../bcn/springConference/view/MainLayout.java | 58 ++++++++++++++++++- src/main/resources/application.properties | 4 +- 4 files changed, 59 insertions(+), 49 deletions(-) diff --git a/src/main/java/io/bcn/springConference/model/Speaker.java b/src/main/java/io/bcn/springConference/model/Speaker.java index c34b15f..c6f6ea5 100644 --- a/src/main/java/io/bcn/springConference/model/Speaker.java +++ b/src/main/java/io/bcn/springConference/model/Speaker.java @@ -2,7 +2,6 @@ import jakarta.persistence.*; import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/src/main/java/io/bcn/springConference/view/ConferenceView.java b/src/main/java/io/bcn/springConference/view/ConferenceView.java index f19c27b..e5c2e33 100644 --- a/src/main/java/io/bcn/springConference/view/ConferenceView.java +++ b/src/main/java/io/bcn/springConference/view/ConferenceView.java @@ -84,49 +84,4 @@ private Component createMainLayout() { */ -@Route(value = "/conferences", layout = MainLayout.class) -public class ConferenceView extends VerticalLayout { - private final ConferenceRepository repository; - private Grid grid; - private TextField nameField; - private DatePicker datePicker; - - public ConferenceView(ConferenceRepository repository) { - this.repository = repository; - createGrid(); - createForm(); - add(grid, createFormLayout()); - } - - private void createGrid() { - grid = new Grid<>(Conference.class); - grid.setColumns("name", "date"); - updateList(); - } - - private void createForm() { - nameField = new TextField("Name"); - datePicker = new DatePicker("Date"); - Button saveButton = new Button("Save", e -> saveConference()); - // Add form components and logic - } - - private void saveConference() { - Conference conference = new Conference(); - conference.setName(nameField.getValue()); - conference.setDate(datePicker.getValue()); - repository.save(conference); - updateList(); - clearForm(); - } - - private void updateList() { - grid.setItems(repository.findAll()); - } - - private void clearForm() { - nameField.clear(); - datePicker.clear(); - } -} diff --git a/src/main/java/io/bcn/springConference/view/MainLayout.java b/src/main/java/io/bcn/springConference/view/MainLayout.java index 8910f17..abc3972 100644 --- a/src/main/java/io/bcn/springConference/view/MainLayout.java +++ b/src/main/java/io/bcn/springConference/view/MainLayout.java @@ -1,8 +1,64 @@ package io.bcn.springConference.view; + +import com.vaadin.flow.component.Component; +import com.vaadin.flow.component.datepicker.DatePicker; +import com.vaadin.flow.component.formlayout.FormLayout; import com.vaadin.flow.component.orderedlayout.VerticalLayout; +import com.vaadin.flow.router.Route; +import com.vaadin.flow.component.button.Button; +import com.vaadin.flow.component.grid.Grid; +import com.vaadin.flow.component.textfield.TextField; +import io.bcn.springConference.model.Conference; +import io.bcn.springConference.repository.ConferenceRepository; + +@Route public class MainLayout extends VerticalLayout { + private ConferenceRepository repository; + private Grid grid; + private TextField nameField; + private DatePicker datePicker; + + public void ConferenceView(ConferenceRepository repository) { + this.repository = repository; + createGrid(); + createForm(); + add(grid, createForm()); + } + + private void createGrid() { + grid = new Grid<>(Conference.class); + grid.setColumns("name", "date"); + updateList(); + } + + private Component createForm() { + nameField = new TextField("Name"); + datePicker = new DatePicker("Date"); + Button saveButton = new Button("Save", e -> saveConference()); + // Add form components and logic + FormLayout formLayout = new FormLayout(); + formLayout.add(nameField, datePicker, saveButton); + return formLayout; + } + + private void saveConference() { + Conference conference = new Conference(); + conference.setName(nameField.getValue()); + conference.setDate(datePicker.getValue()); + repository.save(conference); + updateList(); + clearForm(); + } + + private void updateList() { + grid.setItems(repository.findAll()); + } -} + private void clearForm() { + nameField.clear(); + datePicker.clear(); + } +} \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 28eda26..d2595b6 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -35,5 +35,5 @@ vaadin.launch-browser=true server.port=8082 -spring.main.web-application-type=VAADIN -vaadin.production-mode=false \ No newline at end of file +#spring.main.web-application-type=VAADIN +#vaadin.production-mode=false \ No newline at end of file From c0495c44787de3c5c37a4fe0d5c60a8ba42eb76e Mon Sep 17 00:00:00 2001 From: AlberteMB Date: Sat, 16 Nov 2024 18:38:05 +0100 Subject: [PATCH 09/15] Testing changes in ConferenceView. --- src/main/frontend/generated/vaadin.ts | 4 + .../SpringConferenceApplication.java | 12 +- .../springConference/model/Conference.java | 14 ++ .../bcn/springConference/model/Speaker.java | 2 +- .../springConference/view/ConferenceView.java | 148 ++++++++++-------- .../bcn/springConference/view/MainLayout.java | 117 +++++++++----- .../springConference/view/SpeakerView.java | 73 +++++++++ 7 files changed, 262 insertions(+), 108 deletions(-) create mode 100644 src/main/java/io/bcn/springConference/view/SpeakerView.java diff --git a/src/main/frontend/generated/vaadin.ts b/src/main/frontend/generated/vaadin.ts index d38f466..aabe079 100644 --- a/src/main/frontend/generated/vaadin.ts +++ b/src/main/frontend/generated/vaadin.ts @@ -35,3 +35,7 @@ import './index'; import './vaadin-react.js'; import 'Frontend/generated/jar-resources/vaadin-dev-tools/vaadin-dev-tools.js'; + +import './theme-my-theme.global.generated.js'; +import { applyTheme } from './theme.js'; +applyTheme(document); diff --git a/src/main/java/io/bcn/springConference/SpringConferenceApplication.java b/src/main/java/io/bcn/springConference/SpringConferenceApplication.java index 85c0fb5..59f0a35 100644 --- a/src/main/java/io/bcn/springConference/SpringConferenceApplication.java +++ b/src/main/java/io/bcn/springConference/SpringConferenceApplication.java @@ -2,12 +2,14 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import com.vaadin.flow.theme.Theme; +import com.vaadin.flow.component.page.AppShellConfigurator; @SpringBootApplication -public class SpringConferenceApplication { - - public static void main(String[] args) { - SpringApplication.run(SpringConferenceApplication.class, args); - } +@Theme("my-theme") +public class SpringConferenceApplication implements AppShellConfigurator { + public static void main(String[] args) { + SpringApplication.run(SpringConferenceApplication.class, args); + } } diff --git a/src/main/java/io/bcn/springConference/model/Conference.java b/src/main/java/io/bcn/springConference/model/Conference.java index 7f45935..3ac5b0e 100644 --- a/src/main/java/io/bcn/springConference/model/Conference.java +++ b/src/main/java/io/bcn/springConference/model/Conference.java @@ -39,6 +39,20 @@ public class Conference { @JoinColumn(name = "BOOK_FK_ID", nullable = false) private Book bookMapped; + public Book getBook() { + return bookMapped; + } + public void setBook(Book book) { + this.bookMapped = book; + } + + public Speaker getSpeaker() { + return speakerMapped; + } + + public void setSpeaker(Speaker speaker) { + this.speakerMapped = speaker; + } } \ No newline at end of file diff --git a/src/main/java/io/bcn/springConference/model/Speaker.java b/src/main/java/io/bcn/springConference/model/Speaker.java index c6f6ea5..056057a 100644 --- a/src/main/java/io/bcn/springConference/model/Speaker.java +++ b/src/main/java/io/bcn/springConference/model/Speaker.java @@ -25,7 +25,7 @@ public class Speaker { @OneToMany(mappedBy = "speakerMapped", cascade = CascadeType.ALL) private List conferences; - // Getters and setters + //method to add public void addConference(Conference conference) { diff --git a/src/main/java/io/bcn/springConference/view/ConferenceView.java b/src/main/java/io/bcn/springConference/view/ConferenceView.java index e5c2e33..5693cb3 100644 --- a/src/main/java/io/bcn/springConference/view/ConferenceView.java +++ b/src/main/java/io/bcn/springConference/view/ConferenceView.java @@ -1,87 +1,113 @@ + +package io.bcn.springConference.view; + +import com.vaadin.flow.component.UI; +import com.vaadin.flow.component.combobox.ComboBox; import com.vaadin.flow.component.datepicker.DatePicker; import com.vaadin.flow.component.grid.Grid; import com.vaadin.flow.component.orderedlayout.VerticalLayout; import com.vaadin.flow.router.Route; +import io.bcn.springConference.model.Book; import io.bcn.springConference.model.Conference; +import io.bcn.springConference.model.Speaker; +import io.bcn.springConference.repository.BookRepository; import io.bcn.springConference.repository.ConferenceRepository; -import io.bcn.springConference.view.MainLayout; - -import java.awt.*; - -/* - -package io.bcn.springConference.view; - import com.vaadin.flow.component.Component; import com.vaadin.flow.component.button.Button; -import com.vaadin.flow.component.grid.Grid; -import com.vaadin.flow.component.html.H2; -import com.vaadin.flow.component.orderedlayout.HorizontalLayout; -import com.vaadin.flow.component.orderedlayout.VerticalLayout; import com.vaadin.flow.component.textfield.TextField; -import com.vaadin.flow.data.binder.Binder; -import com.vaadin.flow.router.Route; - +import io.bcn.springConference.repository.SpeakerRepository; -@Route("/conference") -public class ConferenceView extends VerticalLayout { - - - - private final TextField name = new TextField("Name"); - private final TextField email = new TextField("Email"); - private final TextField phoneNumber = new TextField("Phone Number"); - private final Button save = new Button("Save"); - private final Button delete = new Button("Delete"); +import java.util.List; +@Route(value = "conferences"/*, layout = MainLayout.class*/) +public class ConferenceView extends VerticalLayout { + private final ConferenceRepository conferenceRepository; + private final BookRepository bookRepository; + private final SpeakerRepository speakerRepository; + private Grid grid; + private TextField nameField; + private DatePicker datePicker; + private ComboBox bookComboBox; + private ComboBox speakerComboBox; + + + public ConferenceView(ConferenceRepository conferenceRepository,BookRepository bookRepository, SpeakerRepository speakerRepository ) { + this.conferenceRepository = conferenceRepository; + this.bookRepository = bookRepository; + this.speakerRepository = speakerRepository; + navigateSpeakerView(); + createGrid(); + add(grid, createForm()); + } - // Method to create the main layout - private Component createMainLayout() { - // Create the 3-column layout - HorizontalLayout mainLayout = new HorizontalLayout(); - mainLayout.setSizeFull(); - mainLayout.setPadding(false); - mainLayout.setSpacing(false); + private void createGrid() { + grid = new Grid<>(Conference.class); + grid.setColumns("name", "date"); + grid.addColumn(conference -> conference.getBook() != null ? conference.getBook().getTitle() : "No Book") + .setHeader("Book"); + grid.addColumn(conference -> conference.getSpeaker() != null ? conference.getSpeaker().getName() : "No Speaker") + .setHeader("Speaker"); + updateList(); + } - // Left column (empty for spacing) - VerticalLayout leftColumn = new VerticalLayout(); - leftColumn.setWidth("20%"); + private Component createForm() { + nameField = new TextField("Name"); + datePicker = new DatePicker("Date"); + // ComboBox with books + bookComboBox = new ComboBox<>("Book"); + bookComboBox.setItemLabelGenerator(Book::getTitle); + bookComboBox.setItems(bookRepository.findAll()); + // ComboBox with speakers + speakerComboBox = new ComboBox<>("Speaker"); + speakerComboBox.setItemLabelGenerator(Speaker::getName); + speakerComboBox.setItems(speakerRepository.findAll()); // - // Center column (contains all the components) - VerticalLayout centerColumn = new VerticalLayout(); - centerColumn.setWidth("60%"); - centerColumn.setAlignItems(Alignment.CENTER); - // Right column (empty for spacing) - VerticalLayout rightColumn = new VerticalLayout(); - rightColumn.setWidth("20%"); + Button saveButton = new Button("Save", event -> saveConference()); - // Create a form layout - HorizontalLayout formLayout = new HorizontalLayout(name, email, phoneNumber); - formLayout.setWidth("100%"); - formLayout.setJustifyContentMode(JustifyContentMode.CENTER); + // Add form components and logic + VerticalLayout formLayout = new VerticalLayout(nameField,bookComboBox, speakerComboBox, datePicker, saveButton); + formLayout.setSpacing(true); + formLayout.setPadding(true); - // Create a button layout - HorizontalLayout buttonLayout = new HorizontalLayout(save, delete); - buttonLayout.setJustifyContentMode(JustifyContentMode.CENTER); + return formLayout; + } - // Add components to the center column - centerColumn.add( - new H2("Customer Management"), - formLayout, - buttonLayout - ); + private void saveConference() { + Conference conference = new Conference(); + conference.setName(nameField.getValue()); + conference.setDate(datePicker.getValue()); + conference.setBook(bookComboBox.getValue()); + conference.setSpeaker(speakerComboBox.getValue()); + conferenceRepository.save(conference); + updateList(); + clearForm(); + } - // Add all columns to the main layout - mainLayout.add(leftColumn, centerColumn, rightColumn); + private void updateList() { + grid.setItems(conferenceRepository.findAll()); + // Updating manually just in case + grid.getDataProvider().refreshAll(); + + List conferences = conferenceRepository.findAll(); + System.out.println("Conferences in DB: " + conferences.size()); + for (Conference c : conferences) { + System.out.println("Conference: " + c.getName() + " - " + c.getDate()); + } + grid.setItems(conferences); + } - return mainLayout; + private void clearForm() { + nameField.clear(); + datePicker.clear(); } + private void navigateSpeakerView(){ + Button speakerButton = new Button("Go to SpeakerView", + event -> UI.getCurrent().navigate("speakers")); + add(speakerButton); + } } -*/ - - diff --git a/src/main/java/io/bcn/springConference/view/MainLayout.java b/src/main/java/io/bcn/springConference/view/MainLayout.java index abc3972..3db63d0 100644 --- a/src/main/java/io/bcn/springConference/view/MainLayout.java +++ b/src/main/java/io/bcn/springConference/view/MainLayout.java @@ -1,64 +1,99 @@ package io.bcn.springConference.view; + import com.vaadin.flow.component.Component; +import com.vaadin.flow.component.avatar.Avatar; +import com.vaadin.flow.component.button.Button; +import com.vaadin.flow.component.combobox.ComboBox; import com.vaadin.flow.component.datepicker.DatePicker; -import com.vaadin.flow.component.formlayout.FormLayout; +import com.vaadin.flow.component.html.H2; +import com.vaadin.flow.component.orderedlayout.HorizontalLayout; import com.vaadin.flow.component.orderedlayout.VerticalLayout; -import com.vaadin.flow.router.Route; -import com.vaadin.flow.component.button.Button; -import com.vaadin.flow.component.grid.Grid; import com.vaadin.flow.component.textfield.TextField; -import io.bcn.springConference.model.Conference; -import io.bcn.springConference.repository.ConferenceRepository; +import com.vaadin.flow.router.PageTitle; +import com.vaadin.flow.router.Route; +import io.bcn.springConference.model.Book; +import io.bcn.springConference.repository.BookRepository; + +@PageTitle("Main Layout") +@Route("/mainlayout") +public class MainLayout extends VerticalLayout { + + private final BookRepository repository; + + private final TextField title = new TextField("Title"); + private final TextField author = new TextField("Author"); + private final TextField isbn = new TextField("ISBN"); + private final Button save = new Button("Save"); + private final Button delete = new Button("Delete"); -@Route -public class MainLayout extends VerticalLayout { + private final Avatar avatar = new Avatar(); + private final ComboBox comboBox = new ComboBox<>("Book"); + private final DatePicker datePicker = new DatePicker("Pick a date"); - private ConferenceRepository repository; - private Grid grid; - private TextField nameField; - private DatePicker datePicker; - public void ConferenceView(ConferenceRepository repository) { + public MainLayout(BookRepository repository) { this.repository = repository; - createGrid(); - createForm(); - add(grid, createForm()); + + // Components + configureAvatar(); + configureComboBox(); + configureDatePicker(); + + // Add components to the layout + add(createHeader(), createMainContent()); + setWidthFull(); + setSpacing(false); + setPadding(false); + } - private void createGrid() { - grid = new Grid<>(Conference.class); - grid.setColumns("name", "date"); - updateList(); + private void configureAvatar() { + avatar.setName("John Doe"); + avatar.setImage("https://i.pravatar.cc/150"); // Example for the picture } - private Component createForm() { - nameField = new TextField("Name"); - datePicker = new DatePicker("Date"); - Button saveButton = new Button("Save", e -> saveConference()); - // Add form components and logic - FormLayout formLayout = new FormLayout(); - formLayout.add(nameField, datePicker, saveButton); - return formLayout; + private void configureComboBox() { + comboBox.setItems(repository.findAll()); + comboBox.setItemLabelGenerator(Book::getTitle); + comboBox.setPlaceholder("Select a book"); } - private void saveConference() { - Conference conference = new Conference(); - conference.setName(nameField.getValue()); - conference.setDate(datePicker.getValue()); - repository.save(conference); - updateList(); - clearForm(); + private void configureDatePicker() { + datePicker.setPlaceholder("Select a date"); } - private void updateList() { - grid.setItems(repository.findAll()); + private Component createHeader() { + HorizontalLayout header = new HorizontalLayout(avatar, comboBox, datePicker); + header.setWidthFull(); + header.setSpacing(true); + header.setAlignItems(Alignment.CENTER); + header.setPadding(true); + return header; } - private void clearForm() { - nameField.clear(); - datePicker.clear(); + private Component createMainContent() { + // Form layout + HorizontalLayout formLayout = new HorizontalLayout(title, author, isbn); + formLayout.setWidthFull(); + formLayout.setSpacing(true); + + // Button layout + HorizontalLayout buttonLayout = new HorizontalLayout(save, delete); + buttonLayout.setJustifyContentMode(JustifyContentMode.CENTER); + + // Main content layout + VerticalLayout mainContent = new VerticalLayout( + new H2("Book Management"), + formLayout, + buttonLayout + ); + mainContent.setWidthFull(); + mainContent.setAlignItems(Alignment.CENTER); + + return mainContent; } -} \ No newline at end of file +} + diff --git a/src/main/java/io/bcn/springConference/view/SpeakerView.java b/src/main/java/io/bcn/springConference/view/SpeakerView.java new file mode 100644 index 0000000..7148aba --- /dev/null +++ b/src/main/java/io/bcn/springConference/view/SpeakerView.java @@ -0,0 +1,73 @@ +package io.bcn.springConference.view; + +import com.vaadin.flow.component.Component; +import com.vaadin.flow.component.UI; +import com.vaadin.flow.component.button.Button; + +import com.vaadin.flow.component.grid.Grid; +import com.vaadin.flow.component.orderedlayout.VerticalLayout; +import com.vaadin.flow.component.textfield.TextField; +import com.vaadin.flow.router.Route; + +import io.bcn.springConference.model.Speaker; +import io.bcn.springConference.repository.SpeakerRepository; + +import java.util.UUID; + +@Route(value = "speakers") +public class SpeakerView extends VerticalLayout { + + private final SpeakerRepository repository; + private Grid grid; + private TextField nameField; + + public SpeakerView(SpeakerRepository repository) { + this.repository = repository; + //createForm(); + navigateConferenceView(); + createGrid(); + add(grid, createForm()); + } + + private void createGrid() { + grid = new Grid<>(Speaker.class); + grid.setColumns("name"); + updateList(); + } + + private Component createForm() { + nameField = new TextField("Name"); + Button saveButton = new Button("Save", event -> saveSpeaker()); + + // Add form components and logic + VerticalLayout formLayout = new VerticalLayout(nameField, saveButton); + formLayout.setSpacing(true); + formLayout.setPadding(true); + + return formLayout; + + } + + private void saveSpeaker() { + Speaker speaker = new Speaker(); + speaker.setId(UUID.randomUUID()); + speaker.setName(nameField.getValue()); + repository.save(speaker); + updateList(); + clearForm(); + } + + private void updateList() { + grid.setItems(repository.findAll()); + } + + private void clearForm() { + nameField.clear(); + } + + private void navigateConferenceView(){ + Button conferenceButton = new Button("Go to ConferenceView", + event -> UI.getCurrent().navigate("conferences")); + add(conferenceButton); + } +} From 47c2e787e11a1f5135aedc16f162d464099fc46f Mon Sep 17 00:00:00 2001 From: AlberteMB Date: Sun, 17 Nov 2024 12:18:03 +0100 Subject: [PATCH 10/15] Changes in UUID generated automatically. --- src/main/java/io/bcn/springConference/model/Book.java | 6 +++--- .../java/io/bcn/springConference/model/Conference.java | 8 ++++++-- src/main/java/io/bcn/springConference/model/Speaker.java | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/java/io/bcn/springConference/model/Book.java b/src/main/java/io/bcn/springConference/model/Book.java index 54144e8..80b8a45 100644 --- a/src/main/java/io/bcn/springConference/model/Book.java +++ b/src/main/java/io/bcn/springConference/model/Book.java @@ -17,9 +17,9 @@ public class Book { @Id -// @GeneratedValue(generator = "UUID") -// @GenericGenerator(name = "UUID", -// strategy = "org.hibernate.id.UUIDGenerator") + @GeneratedValue(generator = "UUID") + @GenericGenerator(name = "UUID", + strategy = "org.hibernate.id.UUIDGenerator") @Column(name = "id", updatable = false, nullable = false) private UUID id; diff --git a/src/main/java/io/bcn/springConference/model/Conference.java b/src/main/java/io/bcn/springConference/model/Conference.java index 3ac5b0e..b35b4a2 100644 --- a/src/main/java/io/bcn/springConference/model/Conference.java +++ b/src/main/java/io/bcn/springConference/model/Conference.java @@ -6,6 +6,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.hibernate.annotations.GenericGenerator; import java.time.LocalDate; import java.util.List; @@ -21,6 +22,9 @@ public class Conference { @Id @Column(name = "id", updatable = false, nullable = false) + @GeneratedValue(generator = "UUID") + @GenericGenerator(name = "UUID", + strategy = "org.hibernate.id.UUIDGenerator") private UUID id; @Column(name = "conference_name",nullable = false) @@ -30,12 +34,12 @@ public class Conference { private LocalDate date; - @ManyToOne(fetch = FetchType.LAZY) + @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "SPEAKER_FK_ID", nullable = false) private Speaker speakerMapped; - @ManyToOne(fetch = FetchType.LAZY) + @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "BOOK_FK_ID", nullable = false) private Book bookMapped; diff --git a/src/main/java/io/bcn/springConference/model/Speaker.java b/src/main/java/io/bcn/springConference/model/Speaker.java index 056057a..74be197 100644 --- a/src/main/java/io/bcn/springConference/model/Speaker.java +++ b/src/main/java/io/bcn/springConference/model/Speaker.java @@ -15,7 +15,7 @@ @AllArgsConstructor public class Speaker { @Id - //@GeneratedValue(strategy = GenerationType.IDENTITY) + //@GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", updatable = false, nullable = false) private UUID id; From aff0d6498315ec75ff943c0311afa16f22375612 Mon Sep 17 00:00:00 2001 From: AlberteMB Date: Sun, 17 Nov 2024 14:46:37 +0100 Subject: [PATCH 11/15] Conference delete. Structuring text and buttons. Creatin MainLayout just to access to the rest of the layouts. --- .../springConference/view/ConferenceView.java | 110 ++++++++++-- .../bcn/springConference/view/MainLayout.java | 158 +++++++++++------- .../springConference/view/SpeakerView.java | 25 ++- 3 files changed, 208 insertions(+), 85 deletions(-) diff --git a/src/main/java/io/bcn/springConference/view/ConferenceView.java b/src/main/java/io/bcn/springConference/view/ConferenceView.java index 5693cb3..73e8021 100644 --- a/src/main/java/io/bcn/springConference/view/ConferenceView.java +++ b/src/main/java/io/bcn/springConference/view/ConferenceView.java @@ -5,7 +5,10 @@ import com.vaadin.flow.component.combobox.ComboBox; import com.vaadin.flow.component.datepicker.DatePicker; import com.vaadin.flow.component.grid.Grid; +import com.vaadin.flow.component.notification.Notification; +import com.vaadin.flow.component.orderedlayout.HorizontalLayout; import com.vaadin.flow.component.orderedlayout.VerticalLayout; +import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.Route; import io.bcn.springConference.model.Book; import io.bcn.springConference.model.Conference; @@ -17,9 +20,12 @@ import com.vaadin.flow.component.textfield.TextField; import io.bcn.springConference.repository.SpeakerRepository; -import java.util.List; +import java.awt.*; +import java.util.List; + +@PageTitle("Conferences") @Route(value = "conferences"/*, layout = MainLayout.class*/) public class ConferenceView extends VerticalLayout { private final ConferenceRepository conferenceRepository; @@ -30,15 +36,34 @@ public class ConferenceView extends VerticalLayout { private DatePicker datePicker; private ComboBox bookComboBox; private ComboBox speakerComboBox; + private ComboBox conferenceComboBox; - public ConferenceView(ConferenceRepository conferenceRepository,BookRepository bookRepository, SpeakerRepository speakerRepository ) { + public ConferenceView(ConferenceRepository conferenceRepository,BookRepository bookRepository, + SpeakerRepository speakerRepository) { this.conferenceRepository = conferenceRepository; this.bookRepository = bookRepository; this.speakerRepository = speakerRepository; - navigateSpeakerView(); + + + // Full size and center + setSizeFull(); + setAlignItems(Alignment.START); + + // Navigation buttons + HorizontalLayout navigationLayout = createNavigationButtons(); + + Component form = createForm(); createGrid(); - add(grid, createForm()); + // Layout + VerticalLayout gridLayout = new VerticalLayout(grid); + gridLayout.setSizeFull(); + gridLayout.setDefaultHorizontalComponentAlignment(Alignment.CENTER); + + // Adding components + add(navigationLayout, form, gridLayout); + // Grid take up the remaining space + expand(gridLayout); } @@ -49,6 +74,7 @@ private void createGrid() { .setHeader("Book"); grid.addColumn(conference -> conference.getSpeaker() != null ? conference.getSpeaker().getName() : "No Speaker") .setHeader("Speaker"); + grid.setSizeFull(); updateList(); } @@ -62,15 +88,37 @@ private Component createForm() { // ComboBox with speakers speakerComboBox = new ComboBox<>("Speaker"); speakerComboBox.setItemLabelGenerator(Speaker::getName); - speakerComboBox.setItems(speakerRepository.findAll()); // + speakerComboBox.setItems(speakerRepository.findAll()); + // ComboBox with conferences + conferenceComboBox = new ComboBox<>("Conferences"); + conferenceComboBox.setItemLabelGenerator(Conference::getName); + conferenceComboBox.setItems(conferenceRepository.findAll()); - Button saveButton = new Button("Save", event -> saveConference()); - // Add form components and logic - VerticalLayout formLayout = new VerticalLayout(nameField,bookComboBox, speakerComboBox, datePicker, saveButton); - formLayout.setSpacing(true); - formLayout.setPadding(true); + // Save + Button saveButton = new Button("Save", event -> saveConference()); + // Delete + Button deleteButton = new Button("Delete", event -> deleteConference()); + + // Add form components name date in horizontal + HorizontalLayout nameDateLayout = new HorizontalLayout(nameField,datePicker); + nameDateLayout.setSpacing(true); + nameDateLayout.setPadding(true); + nameDateLayout.setDefaultVerticalComponentAlignment(Alignment.START); + // Add form components bookComboBox and speakerComboBox + HorizontalLayout bookSpeakerLayout = new HorizontalLayout(bookComboBox, speakerComboBox); + bookSpeakerLayout.setSpacing(true); + bookSpeakerLayout.setPadding(true); + bookSpeakerLayout.setDefaultVerticalComponentAlignment(Alignment.START); + + //Add form components saveButton conferenceComboBox and deleteButton + VerticalLayout conferenceSaveDeleteLayout = new VerticalLayout(saveButton,conferenceComboBox, deleteButton); + conferenceSaveDeleteLayout.setSpacing(true); + conferenceSaveDeleteLayout.setPadding(true); + conferenceSaveDeleteLayout.setDefaultHorizontalComponentAlignment(Alignment.START); + + VerticalLayout formLayout = new VerticalLayout(nameDateLayout,bookSpeakerLayout, conferenceSaveDeleteLayout); return formLayout; } @@ -82,7 +130,9 @@ private void saveConference() { conference.setBook(bookComboBox.getValue()); conference.setSpeaker(speakerComboBox.getValue()); conferenceRepository.save(conference); + // Update list and ComboBox updateList(); + updateConferenceComboBox(); clearForm(); } @@ -104,10 +154,42 @@ private void clearForm() { datePicker.clear(); } - private void navigateSpeakerView(){ - Button speakerButton = new Button("Go to SpeakerView", - event -> UI.getCurrent().navigate("speakers")); - add(speakerButton); + + private HorizontalLayout createNavigationButtons() { + Button speakerButton = new Button("Go to SpeakerView", event -> UI.getCurrent().navigate("speakers")); + Button mainLayoutButton = new Button("Go to MainLayout", event -> UI.getCurrent().navigate("mainlayout")); + + // Buttons horizontally + HorizontalLayout navigationLayout = new HorizontalLayout(mainLayoutButton, speakerButton); + // Space between them + navigationLayout.setSpacing(true); + // Vertical center + navigationLayout.setDefaultVerticalComponentAlignment(Alignment.CENTER); + + return navigationLayout; + } + + private void deleteConference(){ + Conference selectedConference = conferenceComboBox.getValue(); + + if (selectedConference != null) { + // Delete from repository + conferenceRepository.delete(selectedConference); + + // Update list in Grid and ComboBox + updateList(); + updateConferenceComboBox(); + + // Clean selection comboBox + conferenceComboBox.clear(); + } else { + Notification.show("Please select a conference to delete.", 3000, Notification.Position.MIDDLE); + } + + } + + private void updateConferenceComboBox() { + conferenceComboBox.setItems(conferenceRepository.findAll()); } } diff --git a/src/main/java/io/bcn/springConference/view/MainLayout.java b/src/main/java/io/bcn/springConference/view/MainLayout.java index 3db63d0..eaf08b4 100644 --- a/src/main/java/io/bcn/springConference/view/MainLayout.java +++ b/src/main/java/io/bcn/springConference/view/MainLayout.java @@ -3,97 +3,125 @@ import com.vaadin.flow.component.Component; +import com.vaadin.flow.component.applayout.AppLayout; import com.vaadin.flow.component.avatar.Avatar; import com.vaadin.flow.component.button.Button; import com.vaadin.flow.component.combobox.ComboBox; import com.vaadin.flow.component.datepicker.DatePicker; import com.vaadin.flow.component.html.H2; +import com.vaadin.flow.component.html.Image; +import com.vaadin.flow.component.html.Paragraph; import com.vaadin.flow.component.orderedlayout.HorizontalLayout; import com.vaadin.flow.component.orderedlayout.VerticalLayout; import com.vaadin.flow.component.textfield.TextField; import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.Route; +import com.vaadin.flow.router.RouterLink; import io.bcn.springConference.model.Book; import io.bcn.springConference.repository.BookRepository; @PageTitle("Main Layout") @Route("/mainlayout") -public class MainLayout extends VerticalLayout { +public class MainLayout extends AppLayout { - private final BookRepository repository; - + public MainLayout() { + // Logo + Image logo = new Image("logo.png", "My Logo"); + logo.setHeight("50px"); + addToNavbar(logo); - private final TextField title = new TextField("Title"); - private final TextField author = new TextField("Author"); - private final TextField isbn = new TextField("ISBN"); - private final Button save = new Button("Save"); - private final Button delete = new Button("Delete"); + // Navigation + addToDrawer(new RouterLink("Conferences", ConferenceView.class)); + addToDrawer(new RouterLink("Speakers", SpeakerView.class)); - private final Avatar avatar = new Avatar(); - private final ComboBox comboBox = new ComboBox<>("Book"); - private final DatePicker datePicker = new DatePicker("Pick a date"); + // Pie de página o elementos adicionales + addToNavbar(new Paragraph("Main page")); + } +} - public MainLayout(BookRepository repository) { - this.repository = repository; - // Components - configureAvatar(); - configureComboBox(); - configureDatePicker(); - // Add components to the layout - add(createHeader(), createMainContent()); - setWidthFull(); - setSpacing(false); - setPadding(false); - } - private void configureAvatar() { - avatar.setName("John Doe"); - avatar.setImage("https://i.pravatar.cc/150"); // Example for the picture - } - private void configureComboBox() { - comboBox.setItems(repository.findAll()); - comboBox.setItemLabelGenerator(Book::getTitle); - comboBox.setPlaceholder("Select a book"); - } +// private final BookRepository repository; +// +// +// private final TextField title = new TextField("Title"); +// private final TextField author = new TextField("Author"); +// private final TextField isbn = new TextField("ISBN"); +// private final Button save = new Button("Save"); +// private final Button delete = new Button("Delete"); +// +// private final Avatar avatar = new Avatar(); +// private final ComboBox comboBox = new ComboBox<>("Book"); +// private final DatePicker datePicker = new DatePicker("Pick a date"); +// +// +// public MainLayout(BookRepository repository) { +// this.repository = repository; +// +// // Components +// configureAvatar(); +// configureComboBox(); +// configureDatePicker(); +// +// +// // Add components to the layout +// add(createHeader(), createMainContent()); +// setWidthFull(); +// setSpacing(false); +// setPadding(false); +// +// } +// +// private void configureAvatar() { +// avatar.setName("John Doe"); +// avatar.setImage("https://i.pravatar.cc/150"); // Example for the picture +// } +// +// private void configureComboBox() { +// comboBox.setItems(repository.findAll()); +// comboBox.setItemLabelGenerator(Book::getTitle); +// comboBox.setPlaceholder("Select a book"); +// } +// +// private void configureDatePicker() { +// datePicker.setPlaceholder("Select a date"); +// } +// +// private Component createHeader() { +// HorizontalLayout header = new HorizontalLayout(avatar, comboBox, datePicker); +// header.setWidthFull(); +// header.setSpacing(true); +// header.setAlignItems(Alignment.CENTER); +// header.setPadding(true); +// return header; +// } +// +// private Component createMainContent() { +// // Form layout +// HorizontalLayout formLayout = new HorizontalLayout(title, author, isbn); +// formLayout.setWidthFull(); +// formLayout.setSpacing(true); +// +// // Button layout +// HorizontalLayout buttonLayout = new HorizontalLayout(save, delete); +// buttonLayout.setJustifyContentMode(JustifyContentMode.CENTER); +// +// // Main content layout +// VerticalLayout mainContent = new VerticalLayout( +// new H2("Book Management"), +// formLayout, +// buttonLayout +// ); +// mainContent.setWidthFull(); +// mainContent.setAlignItems(Alignment.CENTER); +// +// return mainContent; +// } - private void configureDatePicker() { - datePicker.setPlaceholder("Select a date"); - } - private Component createHeader() { - HorizontalLayout header = new HorizontalLayout(avatar, comboBox, datePicker); - header.setWidthFull(); - header.setSpacing(true); - header.setAlignItems(Alignment.CENTER); - header.setPadding(true); - return header; - } - private Component createMainContent() { - // Form layout - HorizontalLayout formLayout = new HorizontalLayout(title, author, isbn); - formLayout.setWidthFull(); - formLayout.setSpacing(true); - - // Button layout - HorizontalLayout buttonLayout = new HorizontalLayout(save, delete); - buttonLayout.setJustifyContentMode(JustifyContentMode.CENTER); - - // Main content layout - VerticalLayout mainContent = new VerticalLayout( - new H2("Book Management"), - formLayout, - buttonLayout - ); - mainContent.setWidthFull(); - mainContent.setAlignItems(Alignment.CENTER); - - return mainContent; - } -} diff --git a/src/main/java/io/bcn/springConference/view/SpeakerView.java b/src/main/java/io/bcn/springConference/view/SpeakerView.java index 7148aba..b79f1f0 100644 --- a/src/main/java/io/bcn/springConference/view/SpeakerView.java +++ b/src/main/java/io/bcn/springConference/view/SpeakerView.java @@ -5,8 +5,10 @@ import com.vaadin.flow.component.button.Button; import com.vaadin.flow.component.grid.Grid; +import com.vaadin.flow.component.orderedlayout.HorizontalLayout; import com.vaadin.flow.component.orderedlayout.VerticalLayout; import com.vaadin.flow.component.textfield.TextField; +import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.Route; import io.bcn.springConference.model.Speaker; @@ -14,6 +16,7 @@ import java.util.UUID; +@PageTitle("Speakers") @Route(value = "speakers") public class SpeakerView extends VerticalLayout { @@ -24,9 +27,11 @@ public class SpeakerView extends VerticalLayout { public SpeakerView(SpeakerRepository repository) { this.repository = repository; //createForm(); - navigateConferenceView(); + + HorizontalLayout navigationLayout = createNavigationButtons(); + createGrid(); - add(grid, createForm()); + add(navigationLayout,grid, createForm()); } private void createGrid() { @@ -65,9 +70,17 @@ private void clearForm() { nameField.clear(); } - private void navigateConferenceView(){ - Button conferenceButton = new Button("Go to ConferenceView", - event -> UI.getCurrent().navigate("conferences")); - add(conferenceButton); + private HorizontalLayout createNavigationButtons() { + Button conferenceButton = new Button("Go to ConferenceView", event -> UI.getCurrent().navigate("conferences")); + Button mainLayoutButton = new Button("Go to MainLayout", event -> UI.getCurrent().navigate("mainlayout")); + + // Buttons horizontally + HorizontalLayout navigationLayout = new HorizontalLayout(mainLayoutButton, conferenceButton); + // Space between them + navigationLayout.setSpacing(true); + // Vertical center + navigationLayout.setDefaultVerticalComponentAlignment(Alignment.CENTER); + + return navigationLayout; } } From 2907df35f60da772fb91c430293eb9bb2f6ccece Mon Sep 17 00:00:00 2001 From: AlberteMB Date: Sun, 17 Nov 2024 19:46:39 +0100 Subject: [PATCH 12/15] Adding update function. --- .../springConference/view/ConferenceView.java | 184 +++++++++++++++--- 1 file changed, 152 insertions(+), 32 deletions(-) diff --git a/src/main/java/io/bcn/springConference/view/ConferenceView.java b/src/main/java/io/bcn/springConference/view/ConferenceView.java index 73e8021..e28506a 100644 --- a/src/main/java/io/bcn/springConference/view/ConferenceView.java +++ b/src/main/java/io/bcn/springConference/view/ConferenceView.java @@ -8,8 +8,10 @@ import com.vaadin.flow.component.notification.Notification; import com.vaadin.flow.component.orderedlayout.HorizontalLayout; import com.vaadin.flow.component.orderedlayout.VerticalLayout; +import com.vaadin.flow.data.binder.Binder; import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.Route; +import com.vaadin.flow.theme.lumo.LumoUtility; import io.bcn.springConference.model.Book; import io.bcn.springConference.model.Conference; import io.bcn.springConference.model.Speaker; @@ -32,11 +34,14 @@ public class ConferenceView extends VerticalLayout { private final BookRepository bookRepository; private final SpeakerRepository speakerRepository; private Grid grid; + private ComboBox conferenceComboBox; + private final Binder binder = new Binder<>(Conference.class); + private ComboBox updateConferenceComboBox; + private Button updateButton; private TextField nameField; private DatePicker datePicker; private ComboBox bookComboBox; private ComboBox speakerComboBox; - private ComboBox conferenceComboBox; public ConferenceView(ConferenceRepository conferenceRepository,BookRepository bookRepository, @@ -45,7 +50,6 @@ public ConferenceView(ConferenceRepository conferenceRepository,BookRepository b this.bookRepository = bookRepository; this.speakerRepository = speakerRepository; - // Full size and center setSizeFull(); setAlignItems(Alignment.START); @@ -53,7 +57,8 @@ public ConferenceView(ConferenceRepository conferenceRepository,BookRepository b // Navigation buttons HorizontalLayout navigationLayout = createNavigationButtons(); - Component form = createForm(); + Component createForm = createForm(); + Component updateForm = createUpdateForm(); createGrid(); // Layout VerticalLayout gridLayout = new VerticalLayout(grid); @@ -61,7 +66,7 @@ public ConferenceView(ConferenceRepository conferenceRepository,BookRepository b gridLayout.setDefaultHorizontalComponentAlignment(Alignment.CENTER); // Adding components - add(navigationLayout, form, gridLayout); + add(navigationLayout, createForm, updateForm, gridLayout); // Grid take up the remaining space expand(gridLayout); @@ -90,50 +95,82 @@ private Component createForm() { speakerComboBox.setItemLabelGenerator(Speaker::getName); speakerComboBox.setItems(speakerRepository.findAll()); // ComboBox with conferences - conferenceComboBox = new ComboBox<>("Conferences"); + conferenceComboBox = new ComboBox<>("Select to delete"); conferenceComboBox.setItemLabelGenerator(Conference::getName); conferenceComboBox.setItems(conferenceRepository.findAll()); - +// Label createLabel = new Label("Create Conference"); +// createLabel.addClassName("center-text"); // Save Button saveButton = new Button("Save", event -> saveConference()); // Delete Button deleteButton = new Button("Delete", event -> deleteConference()); - // Add form components name date in horizontal - HorizontalLayout nameDateLayout = new HorizontalLayout(nameField,datePicker); + // Bind fields to the Conference class + binder.forField(nameField) + .asRequired("Name is required") + .bind(Conference::getName, Conference::setName); + + binder.forField(datePicker) + .asRequired("Date is required") + .bind(Conference::getDate, Conference::setDate); + + binder.forField(bookComboBox) + .asRequired("Book selection is required") + .bind(Conference::getBook, Conference::setBook); + + binder.forField(speakerComboBox) + .asRequired("Speaker selection is required") + .bind(Conference::getSpeaker, Conference::setSpeaker); + + + // Add form components name date bookComboBox + HorizontalLayout nameDateLayout = new HorizontalLayout(nameField, datePicker,bookComboBox ); nameDateLayout.setSpacing(true); nameDateLayout.setPadding(true); nameDateLayout.setDefaultVerticalComponentAlignment(Alignment.START); - // Add form components bookComboBox and speakerComboBox - HorizontalLayout bookSpeakerLayout = new HorizontalLayout(bookComboBox, speakerComboBox); + // Add form components speakerComboBox and saveButton + HorizontalLayout bookSpeakerLayout = new HorizontalLayout(speakerComboBox,saveButton); + saveButton.addClassName("move-down"); bookSpeakerLayout.setSpacing(true); bookSpeakerLayout.setPadding(true); bookSpeakerLayout.setDefaultVerticalComponentAlignment(Alignment.START); - //Add form components saveButton conferenceComboBox and deleteButton - VerticalLayout conferenceSaveDeleteLayout = new VerticalLayout(saveButton,conferenceComboBox, deleteButton); + //Add form components conferenceComboBox and deleteButton + HorizontalLayout conferenceSaveDeleteLayout = new HorizontalLayout(conferenceComboBox, deleteButton); + deleteButton.addClassName("move-down"); conferenceSaveDeleteLayout.setSpacing(true); conferenceSaveDeleteLayout.setPadding(true); - conferenceSaveDeleteLayout.setDefaultHorizontalComponentAlignment(Alignment.START); + conferenceSaveDeleteLayout.setDefaultVerticalComponentAlignment(Alignment.START); + - VerticalLayout formLayout = new VerticalLayout(nameDateLayout,bookSpeakerLayout, conferenceSaveDeleteLayout); - return formLayout; + return new VerticalLayout(nameDateLayout,bookSpeakerLayout, conferenceSaveDeleteLayout); } private void saveConference() { Conference conference = new Conference(); - conference.setName(nameField.getValue()); - conference.setDate(datePicker.getValue()); - conference.setBook(bookComboBox.getValue()); - conference.setSpeaker(speakerComboBox.getValue()); - conferenceRepository.save(conference); - // Update list and ComboBox - updateList(); - updateConferenceComboBox(); - clearForm(); + + if (binder.writeBeanIfValid(conference)) { + conferenceRepository.save(conference); + updateConferenceComboBox(); + updateList(); + clearForm(); + } else { + binder.validate(); + Notification.show("Please fill in all required fields", 3000, Notification.Position.MIDDLE); + } + +// conference.setName(nameField.getValue()); +// conference.setDate(datePicker.getValue()); +// conference.setBook(bookComboBox.getValue()); +// conference.setSpeaker(speakerComboBox.getValue()); +// conferenceRepository.save(conference); +// // Update list and ComboBox +// updateList(); +// updateConferenceComboBox(); +// clearForm(); } private void updateList() { @@ -141,17 +178,18 @@ private void updateList() { // Updating manually just in case grid.getDataProvider().refreshAll(); - List conferences = conferenceRepository.findAll(); - System.out.println("Conferences in DB: " + conferences.size()); - for (Conference c : conferences) { - System.out.println("Conference: " + c.getName() + " - " + c.getDate()); - } - grid.setItems(conferences); + binder.readBean(new Conference()); + +// List conferences = conferenceRepository.findAll(); +// System.out.println("Conferences in DB: " + conferences.size()); +// for (Conference c : conferences) { +// System.out.println("Conference: " + c.getName() + " - " + c.getDate()); +// } +// grid.setItems(conferences); } private void clearForm() { - nameField.clear(); - datePicker.clear(); + binder.readBean(null); } @@ -191,5 +229,87 @@ private void deleteConference(){ private void updateConferenceComboBox() { conferenceComboBox.setItems(conferenceRepository.findAll()); } + + private Component createUpdateForm() { + updateConferenceComboBox = new ComboBox<>("Select Conference"); + updateConferenceComboBox.setItems(conferenceRepository.findAll()); + updateConferenceComboBox.setItemLabelGenerator(Conference::getName); + + // Add listeners to load selected conference details + updateConferenceComboBox.addValueChangeListener(event -> { + Conference selectedConference = event.getValue(); + if (selectedConference != null) { + loadConferenceDetails(selectedConference); + } else { + clearUpdateFields(); + } + }); + + // Fields to update + TextField updateNameField = new TextField("Name"); + DatePicker updateDatePicker = new DatePicker("Date"); + ComboBox updateBookComboBox = new ComboBox<>("Book"); + updateBookComboBox.setItemLabelGenerator(Book::getTitle); + updateBookComboBox.setItems(bookRepository.findAll()); + + ComboBox updateSpeakerComboBox = new ComboBox<>("Speaker"); + updateSpeakerComboBox.setItemLabelGenerator(Speaker::getName); + updateSpeakerComboBox.setItems(speakerRepository.findAll()); + + // Update button + updateButton = new Button("Update", event -> { + Conference selectedConference = updateConferenceComboBox.getValue(); + if (selectedConference != null) { + updateConference(selectedConference, updateNameField, updateDatePicker, updateBookComboBox, updateSpeakerComboBox); + } else { + Notification.show("No conference selected!", 3000, Notification.Position.MIDDLE); + } + }); + + // Layout + HorizontalLayout selectNameDateLayout = new HorizontalLayout(updateConferenceComboBox, updateNameField, updateDatePicker); + updateButton.addClassName("move-down"); + selectNameDateLayout.setSpacing(true); + selectNameDateLayout.setPadding(true); + selectNameDateLayout.setDefaultVerticalComponentAlignment(Alignment.START); + + HorizontalLayout bookSpeakerButtonLayout = new HorizontalLayout(updateBookComboBox, updateSpeakerComboBox, updateButton); + bookSpeakerButtonLayout.setSpacing(true); + bookSpeakerButtonLayout.setPadding(true); + bookSpeakerButtonLayout.setDefaultVerticalComponentAlignment(Alignment.START); + VerticalLayout twoLinesLayout = new VerticalLayout(selectNameDateLayout, bookSpeakerButtonLayout); + twoLinesLayout.setSpacing(true); + twoLinesLayout.setPadding(true); + + return twoLinesLayout; + } + + private void loadConferenceDetails(Conference conference) { + nameField.setValue(conference.getName() != null ? conference.getName() : ""); + datePicker.setValue(conference.getDate()); + bookComboBox.setValue(conference.getBook()); + speakerComboBox.setValue(conference.getSpeaker()); + } + + private void updateConference(Conference conference, TextField updateNameField, DatePicker updateDatePicker, ComboBox updateBookComboBox, ComboBox updateSpeakerComboBox) { + conference.setName(updateNameField.getValue()); + conference.setDate(updateDatePicker.getValue()); + conference.setBook(updateBookComboBox.getValue()); + conference.setSpeaker(updateSpeakerComboBox.getValue()); + + conferenceRepository.save(conference); + Notification.show("Conference updated successfully!", 3000, Notification.Position.MIDDLE); + + updateConferenceComboBox.setItems(conferenceRepository.findAll()); // Refresh the ComboBox + updateList(); // Refresh the grid + clearUpdateFields(); + } + + private void clearUpdateFields() { + nameField.clear(); + datePicker.clear(); + bookComboBox.clear(); + speakerComboBox.clear(); + } } From 556c73fe901bdc856357fffb917db288c424124a Mon Sep 17 00:00:00 2001 From: AlberteMB Date: Sun, 17 Nov 2024 19:53:30 +0100 Subject: [PATCH 13/15] Deleting MainLayout and transfer all the code to HomeView. Adding logo. Adding some CSS. --- src/main/frontend/generated/theme.d.ts | 1 + src/main/frontend/generated/theme.js | 2 + src/main/frontend/themes/my-theme/styles.css | 11 ++ .../springConference/view/ConferenceView.java | 2 +- .../bcn/springConference/view/MainLayout.java | 127 ------------------ .../springConference/view/SpeakerView.java | 2 +- .../bcn/springConference/views/HomeView.java | 32 +++++ src/main/resources/logo.png | Bin 0 -> 5728 bytes 8 files changed, 48 insertions(+), 129 deletions(-) create mode 100644 src/main/frontend/generated/theme.d.ts create mode 100644 src/main/frontend/generated/theme.js create mode 100644 src/main/frontend/themes/my-theme/styles.css delete mode 100644 src/main/java/io/bcn/springConference/view/MainLayout.java create mode 100644 src/main/java/io/bcn/springConference/views/HomeView.java create mode 100644 src/main/resources/logo.png diff --git a/src/main/frontend/generated/theme.d.ts b/src/main/frontend/generated/theme.d.ts new file mode 100644 index 0000000..94ce92d --- /dev/null +++ b/src/main/frontend/generated/theme.d.ts @@ -0,0 +1 @@ +export declare const applyTheme: (target: Node) => void; \ No newline at end of file diff --git a/src/main/frontend/generated/theme.js b/src/main/frontend/generated/theme.js new file mode 100644 index 0000000..52ce319 --- /dev/null +++ b/src/main/frontend/generated/theme.js @@ -0,0 +1,2 @@ +import {applyTheme as _applyTheme} from './theme-my-theme.generated.js'; +export const applyTheme = _applyTheme; diff --git a/src/main/frontend/themes/my-theme/styles.css b/src/main/frontend/themes/my-theme/styles.css new file mode 100644 index 0000000..dcac638 --- /dev/null +++ b/src/main/frontend/themes/my-theme/styles.css @@ -0,0 +1,11 @@ +/* Style for text betwen buttons. */ +.center-text { + text-align: center; + font-size: 24px; /* Aumenta el tamaño de la fuente */ + font-weight: bold; /* Opcional, para hacer el texto más destacado */ + color: #333; /* Color opcional para el texto */ + margin: 20px 0; /* Espacio arriba y abajo */ +} +.move-down { + margin-top: 36px; +} \ No newline at end of file diff --git a/src/main/java/io/bcn/springConference/view/ConferenceView.java b/src/main/java/io/bcn/springConference/view/ConferenceView.java index e28506a..dbbee01 100644 --- a/src/main/java/io/bcn/springConference/view/ConferenceView.java +++ b/src/main/java/io/bcn/springConference/view/ConferenceView.java @@ -195,7 +195,7 @@ private void clearForm() { private HorizontalLayout createNavigationButtons() { Button speakerButton = new Button("Go to SpeakerView", event -> UI.getCurrent().navigate("speakers")); - Button mainLayoutButton = new Button("Go to MainLayout", event -> UI.getCurrent().navigate("mainlayout")); + Button mainLayoutButton = new Button("Go to MainLayout", event -> UI.getCurrent().navigate("")); // Buttons horizontally HorizontalLayout navigationLayout = new HorizontalLayout(mainLayoutButton, speakerButton); diff --git a/src/main/java/io/bcn/springConference/view/MainLayout.java b/src/main/java/io/bcn/springConference/view/MainLayout.java deleted file mode 100644 index eaf08b4..0000000 --- a/src/main/java/io/bcn/springConference/view/MainLayout.java +++ /dev/null @@ -1,127 +0,0 @@ -package io.bcn.springConference.view; - - - -import com.vaadin.flow.component.Component; -import com.vaadin.flow.component.applayout.AppLayout; -import com.vaadin.flow.component.avatar.Avatar; -import com.vaadin.flow.component.button.Button; -import com.vaadin.flow.component.combobox.ComboBox; -import com.vaadin.flow.component.datepicker.DatePicker; -import com.vaadin.flow.component.html.H2; -import com.vaadin.flow.component.html.Image; -import com.vaadin.flow.component.html.Paragraph; -import com.vaadin.flow.component.orderedlayout.HorizontalLayout; -import com.vaadin.flow.component.orderedlayout.VerticalLayout; -import com.vaadin.flow.component.textfield.TextField; -import com.vaadin.flow.router.PageTitle; -import com.vaadin.flow.router.Route; -import com.vaadin.flow.router.RouterLink; -import io.bcn.springConference.model.Book; -import io.bcn.springConference.repository.BookRepository; - -@PageTitle("Main Layout") -@Route("/mainlayout") -public class MainLayout extends AppLayout { - - public MainLayout() { - // Logo - Image logo = new Image("logo.png", "My Logo"); - logo.setHeight("50px"); - addToNavbar(logo); - - // Navigation - addToDrawer(new RouterLink("Conferences", ConferenceView.class)); - addToDrawer(new RouterLink("Speakers", SpeakerView.class)); - - // Pie de página o elementos adicionales - addToNavbar(new Paragraph("Main page")); - } -} - - - - - - - -// private final BookRepository repository; -// -// -// private final TextField title = new TextField("Title"); -// private final TextField author = new TextField("Author"); -// private final TextField isbn = new TextField("ISBN"); -// private final Button save = new Button("Save"); -// private final Button delete = new Button("Delete"); -// -// private final Avatar avatar = new Avatar(); -// private final ComboBox comboBox = new ComboBox<>("Book"); -// private final DatePicker datePicker = new DatePicker("Pick a date"); -// -// -// public MainLayout(BookRepository repository) { -// this.repository = repository; -// -// // Components -// configureAvatar(); -// configureComboBox(); -// configureDatePicker(); -// -// -// // Add components to the layout -// add(createHeader(), createMainContent()); -// setWidthFull(); -// setSpacing(false); -// setPadding(false); -// -// } -// -// private void configureAvatar() { -// avatar.setName("John Doe"); -// avatar.setImage("https://i.pravatar.cc/150"); // Example for the picture -// } -// -// private void configureComboBox() { -// comboBox.setItems(repository.findAll()); -// comboBox.setItemLabelGenerator(Book::getTitle); -// comboBox.setPlaceholder("Select a book"); -// } -// -// private void configureDatePicker() { -// datePicker.setPlaceholder("Select a date"); -// } -// -// private Component createHeader() { -// HorizontalLayout header = new HorizontalLayout(avatar, comboBox, datePicker); -// header.setWidthFull(); -// header.setSpacing(true); -// header.setAlignItems(Alignment.CENTER); -// header.setPadding(true); -// return header; -// } -// -// private Component createMainContent() { -// // Form layout -// HorizontalLayout formLayout = new HorizontalLayout(title, author, isbn); -// formLayout.setWidthFull(); -// formLayout.setSpacing(true); -// -// // Button layout -// HorizontalLayout buttonLayout = new HorizontalLayout(save, delete); -// buttonLayout.setJustifyContentMode(JustifyContentMode.CENTER); -// -// // Main content layout -// VerticalLayout mainContent = new VerticalLayout( -// new H2("Book Management"), -// formLayout, -// buttonLayout -// ); -// mainContent.setWidthFull(); -// mainContent.setAlignItems(Alignment.CENTER); -// -// return mainContent; -// } - - - - diff --git a/src/main/java/io/bcn/springConference/view/SpeakerView.java b/src/main/java/io/bcn/springConference/view/SpeakerView.java index b79f1f0..f877d32 100644 --- a/src/main/java/io/bcn/springConference/view/SpeakerView.java +++ b/src/main/java/io/bcn/springConference/view/SpeakerView.java @@ -72,7 +72,7 @@ private void clearForm() { private HorizontalLayout createNavigationButtons() { Button conferenceButton = new Button("Go to ConferenceView", event -> UI.getCurrent().navigate("conferences")); - Button mainLayoutButton = new Button("Go to MainLayout", event -> UI.getCurrent().navigate("mainlayout")); + Button mainLayoutButton = new Button("Go to MainLayout", event -> UI.getCurrent().navigate("")); // Buttons horizontally HorizontalLayout navigationLayout = new HorizontalLayout(mainLayoutButton, conferenceButton); diff --git a/src/main/java/io/bcn/springConference/views/HomeView.java b/src/main/java/io/bcn/springConference/views/HomeView.java new file mode 100644 index 0000000..68ca689 --- /dev/null +++ b/src/main/java/io/bcn/springConference/views/HomeView.java @@ -0,0 +1,32 @@ +package io.bcn.springConference.views; + +import com.vaadin.flow.component.applayout.AppLayout; +import com.vaadin.flow.component.html.H1; +import com.vaadin.flow.component.html.Image; +import com.vaadin.flow.component.html.Paragraph; +import com.vaadin.flow.component.orderedlayout.VerticalLayout; +import com.vaadin.flow.router.PageTitle; +import com.vaadin.flow.router.Route; +import com.vaadin.flow.router.RouterLink; +import io.bcn.springConference.view.ConferenceView; +import io.bcn.springConference.view.SpeakerView; +@PageTitle("Main Layout") +@Route("") +public class HomeView extends AppLayout { + + public HomeView() { + + // Logo + Image logo = new Image("logo.png", "My Logo"); + logo.setHeight("50px"); + addToNavbar(logo); + + // Navigation + addToDrawer(new RouterLink("Conferences", ConferenceView.class)); + addToDrawer(new RouterLink("Speakers", SpeakerView.class)); + + // Pie de página o elementos adicionales + addToNavbar(new Paragraph("Main page")); + + } +} diff --git a/src/main/resources/logo.png b/src/main/resources/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2ab3b21fcccc77e6943fe5d9a59768d37420bce8 GIT binary patch literal 5728 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 Date: Sun, 17 Nov 2024 20:25:33 +0100 Subject: [PATCH 14/15] Adding avatar in homeView. CSS for Avatar. --- src/main/{resources => frontend}/logo.png | Bin src/main/frontend/themes/my-theme/styles.css | 19 ++++++-- .../bcn/springConference/views/HomeView.java | 44 +++++++++++++----- 3 files changed, 48 insertions(+), 15 deletions(-) rename src/main/{resources => frontend}/logo.png (100%) diff --git a/src/main/resources/logo.png b/src/main/frontend/logo.png similarity index 100% rename from src/main/resources/logo.png rename to src/main/frontend/logo.png diff --git a/src/main/frontend/themes/my-theme/styles.css b/src/main/frontend/themes/my-theme/styles.css index dcac638..e18a36d 100644 --- a/src/main/frontend/themes/my-theme/styles.css +++ b/src/main/frontend/themes/my-theme/styles.css @@ -1,11 +1,22 @@ /* Style for text betwen buttons. */ .center-text { text-align: center; - font-size: 24px; /* Aumenta el tamaño de la fuente */ - font-weight: bold; /* Opcional, para hacer el texto más destacado */ - color: #333; /* Color opcional para el texto */ - margin: 20px 0; /* Espacio arriba y abajo */ + font-size: 24px; /* Font size */ + font-weight: bold; /* Bold */ + color: #333; /* Color */ + margin: 20px 0; /* space up and down */ } .move-down { margin-top: 36px; +} + +.drawer-link { + font-size: 18px; /* Text size */ + font-weight: bold; /* Bold */ + color: #333; /* Color */ +} + +.avatar { + border-radius: 50%; /* Round */ + border: 2px solid #ccc; /* Border */ } \ No newline at end of file diff --git a/src/main/java/io/bcn/springConference/views/HomeView.java b/src/main/java/io/bcn/springConference/views/HomeView.java index 68ca689..ab499bd 100644 --- a/src/main/java/io/bcn/springConference/views/HomeView.java +++ b/src/main/java/io/bcn/springConference/views/HomeView.java @@ -1,32 +1,54 @@ package io.bcn.springConference.views; import com.vaadin.flow.component.applayout.AppLayout; -import com.vaadin.flow.component.html.H1; +import com.vaadin.flow.component.avatar.Avatar; import com.vaadin.flow.component.html.Image; import com.vaadin.flow.component.html.Paragraph; -import com.vaadin.flow.component.orderedlayout.VerticalLayout; +import com.vaadin.flow.component.orderedlayout.FlexComponent; +import com.vaadin.flow.component.orderedlayout.HorizontalLayout; import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.Route; import com.vaadin.flow.router.RouterLink; import io.bcn.springConference.view.ConferenceView; import io.bcn.springConference.view.SpeakerView; + +import javax.swing.*; + @PageTitle("Main Layout") @Route("") public class HomeView extends AppLayout { public HomeView() { + // Avatar + Avatar avatar = new Avatar("Alberte Martínez"); + avatar.setImage("avatar.png"); // + avatar.setHeight("50px"); + avatar.setWidth("50px"); - // Logo - Image logo = new Image("logo.png", "My Logo"); - logo.setHeight("50px"); - addToNavbar(logo); - // Navigation - addToDrawer(new RouterLink("Conferences", ConferenceView.class)); - addToDrawer(new RouterLink("Speakers", SpeakerView.class)); + // Layout para logo y avatar + HorizontalLayout navbarLayout = new HorizontalLayout(avatar); + avatar.addClassName("avatar"); + navbarLayout.setAlignItems(FlexComponent.Alignment.CENTER); + navbarLayout.setSpacing(true); - // Pie de página o elementos adicionales - addToNavbar(new Paragraph("Main page")); + addToNavbar(navbarLayout); + + + RouterLink conferencesLink = new RouterLink("Conferences", ConferenceView.class); + conferencesLink.addClassName("drawer-link"); + RouterLink speakersLink = new RouterLink("Speakers", SpeakerView.class); + speakersLink.addClassName("drawer-link"); + + addToDrawer(conferencesLink, speakersLink); + + HorizontalLayout spaceLayout = new HorizontalLayout(); + spaceLayout.setWidth("20px"); + spaceLayout.setHeight("20px"); + + addToNavbar(spaceLayout); + + addToNavbar(new Paragraph("Main page")); } } From 801acf2614593f962ed1480b8157fa2bd2da2810 Mon Sep 17 00:00:00 2001 From: AlberteMB Date: Mon, 18 Nov 2024 08:50:28 +0100 Subject: [PATCH 15/15] Refactoring HomeView --- .../io/bcn/springConference/{views => view}/HomeView.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) rename src/main/java/io/bcn/springConference/{views => view}/HomeView.java (88%) diff --git a/src/main/java/io/bcn/springConference/views/HomeView.java b/src/main/java/io/bcn/springConference/view/HomeView.java similarity index 88% rename from src/main/java/io/bcn/springConference/views/HomeView.java rename to src/main/java/io/bcn/springConference/view/HomeView.java index ab499bd..8967327 100644 --- a/src/main/java/io/bcn/springConference/views/HomeView.java +++ b/src/main/java/io/bcn/springConference/view/HomeView.java @@ -1,18 +1,13 @@ -package io.bcn.springConference.views; +package io.bcn.springConference.view; import com.vaadin.flow.component.applayout.AppLayout; import com.vaadin.flow.component.avatar.Avatar; -import com.vaadin.flow.component.html.Image; import com.vaadin.flow.component.html.Paragraph; import com.vaadin.flow.component.orderedlayout.FlexComponent; import com.vaadin.flow.component.orderedlayout.HorizontalLayout; import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.Route; import com.vaadin.flow.router.RouterLink; -import io.bcn.springConference.view.ConferenceView; -import io.bcn.springConference.view.SpeakerView; - -import javax.swing.*; @PageTitle("Main Layout") @Route("")