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
10 changes: 6 additions & 4 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,8 @@
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.GenericGenerator;

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


Expand All @@ -31,9 +33,9 @@ public class Book {
@Column(nullable = false)
private String author;

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

/* @OneToMany(mappedBy = "book")
private List<Conference> conferences;*/
@OneToMany(mappedBy = "book")
private List<Conference> conferences;
}
53 changes: 52 additions & 1 deletion src/main/java/io/bcn/springConference/model/Conference.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,55 @@
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.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(name = "id", updatable = false, nullable = false)
private UUID id;

@Column(nullable = false)
private LocalDate date;

@Column(name = "link_to_youtube_video", nullable = false)
private String linkToYoutubeVideo;

@Column(nullable = false)
private String title;

@Column(name = "conference_name", nullable = false)
private String conferenceName;

@Column(columnDefinition = "TEXT")
private String content;

@Column(nullable = false)
private int duration;

@Column(nullable = false)
private String room;

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

@ManyToOne
@JoinColumn(name = "speaker_id", nullable = false)
private Speaker speaker;
}
36 changes: 35 additions & 1 deletion src/main/java/io/bcn/springConference/model/Speaker.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,38 @@
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.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(name = "id", updatable = false, nullable = false)
private UUID id;

@Column(nullable = false)
private String name;

@Column(columnDefinition = "TEXT")
private String bio;

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

@OneToMany(mappedBy = "speaker")
private List<Conference> conferences;
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,17 @@

import io.bcn.springConference.model.Book;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

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

@Repository
public interface BookRepository extends JpaRepository<Book, UUID> {
}

@Query("SELECT DISTINCT b.author FROM Book b")
List<String> findAllAuthors();

List<Book> findByAuthor(String author);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package io.bcn.springConference.repository;

import io.bcn.springConference.model.Conference;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

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

@Repository
public interface ConferenceRepository extends JpaRepository<Conference, UUID> {
// Find conferences by date
List<Conference> findByDate(LocalDate date);

// Find conferences by conference name (case-insensitive)
List<Conference> findByConferenceNameContainingIgnoreCase(String conferenceName);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package io.bcn.springConference.repository;

import io.bcn.springConference.model.Conference;
import org.springframework.data.jpa.repository.JpaRepository;

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

public interface ConferenceRepository extends JpaRepository<Conference, UUID> {
List<Conference> findByDate(LocalDate date);
}
Original file line number Diff line number Diff line change
@@ -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<Speaker, UUID> {
}
132 changes: 132 additions & 0 deletions src/main/java/io/bcn/springConference/view/BookView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
package io.bcn.springConference.view;

import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.formlayout.FormLayout;
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.component.combobox.ComboBox;
import com.vaadin.flow.router.Route;
import io.bcn.springConference.model.Book;
import io.bcn.springConference.repository.BookRepository;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;
import java.util.Optional;

@Route("books")
public class BookView extends VerticalLayout {

private final BookRepository bookRepository;
private final Grid<Book> grid = new Grid<>(Book.class);
private final ComboBox<String> authorComboBox = new ComboBox<>("Filter by Author");

// Form components
private TextField titleField = new TextField("Title");
private TextField authorField = new TextField("Author");
private TextField isbnField = new TextField("ISBN");
private Button saveButton = new Button("Save");
private Button cancelButton = new Button("Cancel");

private Book bookToEdit = null;

@Autowired
public BookView(BookRepository bookRepository) {
this.bookRepository = bookRepository;
createAuthorComboBox(); // Crear el ComboBox de autores
configureGrid();
configureForm();

// Add components to the layout
add(authorComboBox, grid, titleField, authorField, isbnField, saveButton, cancelButton);
updateList(); // Inicializar el listado de libros
}

// Crear el ComboBox de autores y configurar su comportamiento
private void createAuthorComboBox() {
List<String> authors = bookRepository.findAllAuthors(); // Necesitarás implementar este método en el repositorio
authorComboBox.setItems(authors); // Poner los autores en el ComboBox
authorComboBox.addValueChangeListener(event -> updateList()); // Filtrar cuando se seleccione un autor
}

// Configurar la tabla de libros
private void configureGrid() {
grid.setColumns("title", "author", "isbn"); // Mostrar estos campos en la tabla
grid.getColumnByKey("title").setHeader("Title");
grid.getColumnByKey("author").setHeader("Author");
grid.getColumnByKey("isbn").setHeader("ISBN");
grid.setHeight("400px");

// Agregar acción de edición y eliminación
grid.asSingleSelect().addValueChangeListener(event -> editBook(event.getValue()));

// Agregar botón para eliminar
grid.addComponentColumn(book -> new Button("Delete", click -> deleteBook(book)))
.setHeader("Actions");
}

// Configurar el formulario de edición
private void configureForm() {
saveButton.addClickListener(event -> saveBook());
cancelButton.addClickListener(event -> clearForm());

cancelButton.setVisible(false);
}

// Método para actualizar la lista de libros
private void updateList() {
if (authorComboBox.getValue() != null) {
// Filtrar libros por el autor seleccionado en el ComboBox
grid.setItems(bookRepository.findByAuthor(authorComboBox.getValue()));
} else {
// Si no se selecciona ningún autor, mostrar todos los libros
grid.setItems(bookRepository.findAll());
}
}

// Método para editar un libro
private void editBook(Book book) {
if (book == null) {
clearForm();
} else {
bookToEdit = book;
titleField.setValue(book.getTitle());
authorField.setValue(book.getAuthor());
isbnField.setValue(book.getIsbn());

saveButton.setText("Update");
cancelButton.setVisible(true);
}
}

// Método para guardar un libro (crear o actualizar)
private void saveBook() {
if (bookToEdit == null) {
bookToEdit = new Book();
}

bookToEdit.setTitle(titleField.getValue());
bookToEdit.setAuthor(authorField.getValue());
bookToEdit.setIsbn(isbnField.getValue());

bookRepository.save(bookToEdit);
clearForm();
updateList();
}

// Método para eliminar un libro
private void deleteBook(Book book) {
bookRepository.delete(book);
updateList();
}

// Limpiar el formulario
private void clearForm() {
titleField.clear();
authorField.clear();
isbnField.clear();
bookToEdit = null;
saveButton.setText("Save");
cancelButton.setVisible(false);
}
}
Loading