Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/main/frontend/generated/theme.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export declare const applyTheme: (target: Node) => void;
2 changes: 2 additions & 0 deletions src/main/frontend/generated/theme.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import {applyTheme as _applyTheme} from './theme-my-theme.generated.js';
export const applyTheme = _applyTheme;
4 changes: 4 additions & 0 deletions src/main/frontend/generated/vaadin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Empty file.
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
21 changes: 11 additions & 10 deletions src/main/java/io/bcn/springConference/model/Book.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.GenericGenerator;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;


Expand All @@ -16,24 +19,22 @@
@NoArgsConstructor
@AllArgsConstructor
public class Book {

@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID",
strategy = "org.hibernate.id.UUIDGenerator")
@Column(name = "id", updatable = false,
nullable = false)
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
@Column
private UUID id;

@Column(nullable = false)
@Column
private String title;

@Column(nullable = false)
@Column
private String author;

@Column(nullable = false, unique = true)
@Column
private String ISBN;

/* @OneToMany(mappedBy = "book")
private List<Conference> conferences;*/
@OneToMany(mappedBy = "book")
private List<Conference> conferences = new ArrayList<>();
}

37 changes: 37 additions & 0 deletions src/main/java/io/bcn/springConference/model/Conference.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,41 @@
package io.bcn.springConference.model;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.GenericGenerator;

import java.time.LocalDate;
import java.util.Date;
import java.util.UUID;

@Entity
@Table(name = "conferences")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Conference {
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
@Column
private UUID id;

@Column
private String name;

@Column
private LocalDate date;

@ManyToOne
@JoinColumn(name = "book_id")
private Book book;

@ManyToOne
@JoinColumn(name = "speaker_id")
private Speaker speaker;
}

28 changes: 28 additions & 0 deletions src/main/java/io/bcn/springConference/model/Speaker.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,32 @@
package io.bcn.springConference.model;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.GenericGenerator;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

@Entity
@Table(name = "speakers")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Speaker {
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
@Column
private UUID id;

@Column
private String name;

@OneToMany(mappedBy = "speaker")
private List<Conference> conferences = new ArrayList<>();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
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<Conference, UUID> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
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<Speaker, UUID> {
}
115 changes: 64 additions & 51 deletions src/main/java/io/bcn/springConference/view/ConferenceView.java
Original file line number Diff line number Diff line change
@@ -1,74 +1,87 @@
/*

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.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;


@Route("/conference")
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.repository.SpeakerRepository;
import org.springframework.beans.factory.annotation.Autowired;

@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<Conference> grid = new Grid<>(Conference.class);
private Binder<Conference> binder = new Binder<>(Conference.class);

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");



private ComboBox<Book> bookComboBox;
private ComboBox<Speaker> speakerComboBox;
private DatePicker datePicker;
private Button saveButton;

// 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);
@Autowired
public ConferenceView(ConferenceRepository conferenceRepository, BookRepository bookRepository, SpeakerRepository speakerRepository) {
this.conferenceRepository = conferenceRepository;
this.bookRepository = bookRepository;
this.speakerRepository = speakerRepository;

// Left column (empty for spacing)
VerticalLayout leftColumn = new VerticalLayout();
leftColumn.setWidth("20%");
setupForm();
setupGrid();
add(grid, bookComboBox, speakerComboBox, datePicker, saveButton);
updateGrid();
}

// Center column (contains all the components)
VerticalLayout centerColumn = new VerticalLayout();
centerColumn.setWidth("60%");
centerColumn.setAlignItems(Alignment.CENTER);
private void setupForm() {
bookComboBox = new ComboBox<>("Select Book");
bookComboBox.setItems(bookRepository.findAll());
bookComboBox.setItemLabelGenerator(Book::getTitle);

// Right column (empty for spacing)
VerticalLayout rightColumn = new VerticalLayout();
rightColumn.setWidth("20%");
speakerComboBox = new ComboBox<>("Select Speaker");
speakerComboBox.setItems(speakerRepository.findAll());
speakerComboBox.setItemLabelGenerator(Speaker::getName);

// Create a form layout
HorizontalLayout formLayout = new HorizontalLayout(name, email, phoneNumber);
formLayout.setWidth("100%");
formLayout.setJustifyContentMode(JustifyContentMode.CENTER);
datePicker = new DatePicker("Date");

// Create a button layout
HorizontalLayout buttonLayout = new HorizontalLayout(save, delete);
buttonLayout.setJustifyContentMode(JustifyContentMode.CENTER);
saveButton = new Button("Save", e -> saveConference());

// Add components to the center column
centerColumn.add(
new H2("Customer Management"),
formLayout,
buttonLayout
);
binder.bind(bookComboBox, Conference::getBook, Conference::setBook);
binder.bind(speakerComboBox, Conference::getSpeaker, Conference::setSpeaker);
binder.bind(datePicker, Conference::getDate, Conference::setDate);
}

// Add all columns to the main layout
mainLayout.add(leftColumn, centerColumn, rightColumn);
private void setupGrid() {
grid.setColumns("name", "date");
grid.addComponentColumn(conference -> {
Speaker speaker = conference.getSpeaker();
Avatar avatar = new Avatar(speaker.getName());
avatar.setWidth("50px");
avatar.setHeight("50px");
return avatar;
}).setHeader("Speaker Avatar");
}

return mainLayout;
private void saveConference() {
Conference conference = new Conference();
binder.writeBeanIfValid(conference);
conferenceRepository.save(conference);
updateGrid();
binder.readBean(null);
}

private void updateGrid() {
grid.setItems(conferenceRepository.findAll());
}
}
*/

14 changes: 14 additions & 0 deletions src/main/java/io/bcn/springConference/view/HomeView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package io.bcn.springConference.view;

import com.vaadin.flow.component.html.Label;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.router.Route;

@Route(value = "", layout = MainLayout.class) // Sets root URL to this view
public class HomeView extends VerticalLayout {

public HomeView() {
add(new Label("Welcome to the Spring Conference Management Application!"));
add(new Label("Use the navigation links above to access Conferences and Speakers."));
}
}
23 changes: 23 additions & 0 deletions src/main/java/io/bcn/springConference/view/MainLayout.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package io.bcn.springConference.view;

import com.vaadin.flow.component.applayout.AppLayout;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.router.RouterLink;

public class MainLayout extends AppLayout {

public MainLayout() {
createHeader();
}

private void createHeader() {
HorizontalLayout header = new HorizontalLayout();

RouterLink conferenceLink = new RouterLink("Conferences", ConferenceView.class);
RouterLink speakerLink = new RouterLink("Speakers", SpeakerView.class);

header.add(conferenceLink, speakerLink);
addToNavbar(header);
}
}

Loading