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/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/frontend/logo.png b/src/main/frontend/logo.png new file mode 100644 index 0000000..2ab3b21 Binary files /dev/null and b/src/main/frontend/logo.png differ 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..e18a36d --- /dev/null +++ b/src/main/frontend/themes/my-theme/styles.css @@ -0,0 +1,22 @@ +/* Style for text betwen buttons. */ +.center-text { + text-align: center; + 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/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/Book.java b/src/main/java/io/bcn/springConference/model/Book.java index 5638c89..80b8a45 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; @@ -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 15d79d2..b35b4a2 100644 --- a/src/main/java/io/bcn/springConference/model/Conference.java +++ b/src/main/java/io/bcn/springConference/model/Conference.java @@ -1,4 +1,62 @@ 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 org.hibernate.annotations.GenericGenerator; + +import java.time.LocalDate; +import java.util.List; +import java.util.UUID; + + +@Entity +@Table(name = "conferences") +@NoArgsConstructor +@AllArgsConstructor +@Data 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) + private String name; + + @Column(nullable = false) + private LocalDate date; + + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "SPEAKER_FK_ID", nullable = false) + private Speaker speakerMapped; + + + @ManyToOne(fetch = FetchType.EAGER) + @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 db76a55..74be197 100644 --- a/src/main/java/io/bcn/springConference/model/Speaker.java +++ b/src/main/java/io/bcn/springConference/model/Speaker.java @@ -1,4 +1,39 @@ package io.bcn.springConference.model; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +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) + @Column(name = "id", updatable = false, + nullable = false) + private UUID id; + @Column(name = "name",nullable = false) + private String name; + + @OneToMany(mappedBy = "speakerMapped", cascade = CascadeType.ALL) + private List conferences; + + + + //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 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 { +} diff --git a/src/main/java/io/bcn/springConference/view/ConferenceView.java b/src/main/java/io/bcn/springConference/view/ConferenceView.java index 4e99b93..dbbee01 100644 --- a/src/main/java/io/bcn/springConference/view/ConferenceView.java +++ b/src/main/java/io/bcn/springConference/view/ConferenceView.java @@ -1,74 +1,315 @@ -/* package io.bcn.springConference.view; -import com.vaadin.flow.component.Component; -import com.vaadin.flow.component.button.Button; +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.html.H2; +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.component.textfield.TextField; 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; +import io.bcn.springConference.repository.BookRepository; +import io.bcn.springConference.repository.ConferenceRepository; +import com.vaadin.flow.component.Component; +import com.vaadin.flow.component.button.Button; +import com.vaadin.flow.component.textfield.TextField; +import io.bcn.springConference.repository.SpeakerRepository; + -@Route("/conference") +import java.awt.*; +import java.util.List; + +@PageTitle("Conferences") +@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 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; + + + public ConferenceView(ConferenceRepository conferenceRepository,BookRepository bookRepository, + SpeakerRepository speakerRepository) { + this.conferenceRepository = conferenceRepository; + this.bookRepository = bookRepository; + this.speakerRepository = speakerRepository; + + // Full size and center + setSizeFull(); + setAlignItems(Alignment.START); + + // Navigation buttons + HorizontalLayout navigationLayout = createNavigationButtons(); + + Component createForm = createForm(); + Component updateForm = createUpdateForm(); + createGrid(); + // Layout + VerticalLayout gridLayout = new VerticalLayout(grid); + gridLayout.setSizeFull(); + gridLayout.setDefaultHorizontalComponentAlignment(Alignment.CENTER); + + // Adding components + add(navigationLayout, createForm, updateForm, gridLayout); + // Grid take up the remaining space + expand(gridLayout); + + } + + 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"); + grid.setSizeFull(); + updateList(); + } + + 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()); + // ComboBox with 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()); + + // 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 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 conferenceComboBox and deleteButton + HorizontalLayout conferenceSaveDeleteLayout = new HorizontalLayout(conferenceComboBox, deleteButton); + deleteButton.addClassName("move-down"); + conferenceSaveDeleteLayout.setSpacing(true); + conferenceSaveDeleteLayout.setPadding(true); + conferenceSaveDeleteLayout.setDefaultVerticalComponentAlignment(Alignment.START); - 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"); + return new VerticalLayout(nameDateLayout,bookSpeakerLayout, conferenceSaveDeleteLayout); + } + + private void saveConference() { + Conference conference = new Conference(); + + 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() { + grid.setItems(conferenceRepository.findAll()); + // Updating manually just in case + grid.getDataProvider().refreshAll(); + + 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() { + binder.readBean(null); + } + + + 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("")); + + // 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()); + } + + 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(); + } + }); - // 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); + // 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()); - // Left column (empty for spacing) - VerticalLayout leftColumn = new VerticalLayout(); - leftColumn.setWidth("20%"); + ComboBox updateSpeakerComboBox = new ComboBox<>("Speaker"); + updateSpeakerComboBox.setItemLabelGenerator(Speaker::getName); + updateSpeakerComboBox.setItems(speakerRepository.findAll()); - // Center column (contains all the components) - VerticalLayout centerColumn = new VerticalLayout(); - centerColumn.setWidth("60%"); - centerColumn.setAlignItems(Alignment.CENTER); + // 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); + } + }); - // Right column (empty for spacing) - VerticalLayout rightColumn = new VerticalLayout(); - rightColumn.setWidth("20%"); + // Layout + HorizontalLayout selectNameDateLayout = new HorizontalLayout(updateConferenceComboBox, updateNameField, updateDatePicker); + updateButton.addClassName("move-down"); + selectNameDateLayout.setSpacing(true); + selectNameDateLayout.setPadding(true); + selectNameDateLayout.setDefaultVerticalComponentAlignment(Alignment.START); - // Create a form layout - HorizontalLayout formLayout = new HorizontalLayout(name, email, phoneNumber); - formLayout.setWidth("100%"); - formLayout.setJustifyContentMode(JustifyContentMode.CENTER); + 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); - // Create a button layout - HorizontalLayout buttonLayout = new HorizontalLayout(save, delete); - buttonLayout.setJustifyContentMode(JustifyContentMode.CENTER); + return twoLinesLayout; + } - // Add components to the center column - centerColumn.add( - new H2("Customer Management"), - formLayout, - buttonLayout - ); + private void loadConferenceDetails(Conference conference) { + nameField.setValue(conference.getName() != null ? conference.getName() : ""); + datePicker.setValue(conference.getDate()); + bookComboBox.setValue(conference.getBook()); + speakerComboBox.setValue(conference.getSpeaker()); + } - // Add all columns to the main layout - mainLayout.add(leftColumn, centerColumn, rightColumn); + 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()); - return mainLayout; + 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(); + } } -*/ + diff --git a/src/main/java/io/bcn/springConference/view/HomeView.java b/src/main/java/io/bcn/springConference/view/HomeView.java new file mode 100644 index 0000000..8967327 --- /dev/null +++ b/src/main/java/io/bcn/springConference/view/HomeView.java @@ -0,0 +1,49 @@ +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.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; + +@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"); + + + // Layout para logo y avatar + HorizontalLayout navbarLayout = new HorizontalLayout(avatar); + avatar.addClassName("avatar"); + navbarLayout.setAlignItems(FlexComponent.Alignment.CENTER); + navbarLayout.setSpacing(true); + + 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")); + } +} 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..f877d32 --- /dev/null +++ b/src/main/java/io/bcn/springConference/view/SpeakerView.java @@ -0,0 +1,86 @@ +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.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; +import io.bcn.springConference.repository.SpeakerRepository; + +import java.util.UUID; + +@PageTitle("Speakers") +@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(); + + HorizontalLayout navigationLayout = createNavigationButtons(); + + createGrid(); + add(navigationLayout,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 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("")); + + // Buttons horizontally + HorizontalLayout navigationLayout = new HorizontalLayout(mainLayoutButton, conferenceButton); + // Space between them + navigationLayout.setSpacing(true); + // Vertical center + navigationLayout.setDefaultVerticalComponentAlignment(Alignment.CENTER); + + return navigationLayout; + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 4db059e..d2595b6 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 @@ -31,4 +31,9 @@ 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 + +#spring.main.web-application-type=VAADIN +#vaadin.production-mode=false \ No newline at end of file