Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
ecbccb2
Added model class Speaker
jc-programs Nov 13, 2024
722ebb7
data.sql to initialize Speaker.java
jc-programs Nov 13, 2024
73b49b0
Speaker model compatible to load data.sql
jc-programs Nov 14, 2024
ae73809
Conference model without relationships and data.sql
jc-programs Nov 14, 2024
ab06553
Conference added relationship with Book and Speaker
jc-programs Nov 14, 2024
d6feed8
basic views
jc-programs Nov 14, 2024
1987e70
books view
jc-programs Nov 14, 2024
cdb3247
BookView working
jc-programs Nov 15, 2024
1c6d3ba
SpeakerRepository
jc-programs Nov 15, 2024
bcfcef9
SpeakerView working
jc-programs Nov 15, 2024
eaa6c3d
Utilities.Views new function getNewRow()
jc-programs Nov 15, 2024
0dab5c2
InitView replaces MainView
jc-programs Nov 15, 2024
9422728
ConferenceRepository
jc-programs Nov 15, 2024
a106f02
ConferencesView
jc-programs Nov 15, 2024
488b8ac
changed Date to LocalDate in Conference model
jc-programs Nov 15, 2024
9626ac9
ConferenceGrid with order and hidden id. TODO show book and speaker (…
jc-programs Nov 15, 2024
9e23401
ConferenceGrid shows Book's title and Speaker's name
jc-programs Nov 15, 2024
c52a17f
on select some conference shows book and speaker associated on their …
jc-programs Nov 15, 2024
03f52f1
Using FormLayout in all views
jc-programs Nov 15, 2024
fac0714
DatePicker shows now YYYY-MM-DD format and forms have up to 5 columns…
jc-programs Nov 16, 2024
8efad57
created ComponentRender for book. Checked in Select component in Conf…
jc-programs Nov 16, 2024
d3989e0
created ComponentRender for speaker. Checked in Select component in C…
jc-programs Nov 16, 2024
e66afb9
ComponentRender for Book and Speaker added to grid in ConferencesView
jc-programs Nov 16, 2024
95b9ed4
EmailField en formulario SpeakerView
jc-programs Nov 18, 2024
99afbad
deleted unused ConferenceView
jc-programs Nov 18, 2024
24c4208
PRA06.md with tasks done and remarks
jc-programs Nov 18, 2024
7559e4b
capturas de pantalla
jc-programs Nov 19, 2024
9dbbb4f
Merge branch 'PRA06' into screenshots
jc-programs Nov 19, 2024
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
85 changes: 85 additions & 0 deletions MainLayout.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package com.example.application.views;

import com.vaadin.flow.component.applayout.AppLayout;
import com.vaadin.flow.component.applayout.DrawerToggle;
import com.vaadin.flow.component.html.Footer;
import com.vaadin.flow.component.html.H1;
import com.vaadin.flow.component.html.Header;
import com.vaadin.flow.component.html.Span;
import com.vaadin.flow.component.icon.SvgIcon;
import com.vaadin.flow.component.orderedlayout.Scroller;
import com.vaadin.flow.component.sidenav.SideNav;
import com.vaadin.flow.component.sidenav.SideNavItem;
import com.vaadin.flow.router.Layout;
import com.vaadin.flow.server.auth.AnonymousAllowed;
import com.vaadin.flow.server.menu.MenuConfiguration;
import com.vaadin.flow.server.menu.MenuEntry;
import com.vaadin.flow.theme.lumo.LumoUtility;
import java.util.List;

/**
* The main view is a top-level placeholder for other views.
*/
@Layout
@AnonymousAllowed
public class MainLayout extends AppLayout {

private H1 viewTitle;

public MainLayout() {
setPrimarySection(Section.DRAWER);
addDrawerContent();
addHeaderContent();
}

private void addHeaderContent() {
DrawerToggle toggle = new DrawerToggle();
toggle.setAriaLabel("Menu toggle");

viewTitle = new H1();
viewTitle.addClassNames(LumoUtility.FontSize.LARGE, LumoUtility.Margin.NONE);

addToNavbar(true, toggle, viewTitle);
}

private void addDrawerContent() {
Span appName = new Span("ConferenceIO");
appName.addClassNames(LumoUtility.FontWeight.SEMIBOLD, LumoUtility.FontSize.LARGE);
Header header = new Header(appName);

Scroller scroller = new Scroller(createNavigation());

addToDrawer(header, scroller, createFooter());
}

private SideNav createNavigation() {
SideNav nav = new SideNav();

List<MenuEntry> menuEntries = MenuConfiguration.getMenuEntries();
menuEntries.forEach(entry -> {
if (entry.icon() != null) {
nav.addItem(new SideNavItem(entry.title(), entry.path(), new SvgIcon(entry.icon())));
} else {
nav.addItem(new SideNavItem(entry.title(), entry.path()));
}
});

return nav;
}

private Footer createFooter() {
Footer layout = new Footer();

return layout;
}

@Override
protected void afterNavigation() {
super.afterNavigation();
viewTitle.setText(getCurrentPageTitle());
}

private String getCurrentPageTitle() {
return MenuConfiguration.getPageHeader(getContent()).orElse("");
}
}
40 changes: 40 additions & 0 deletions _PRA/PRA06-jose.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# PRA06

## Remarks

- Created LayoutRender for Book and Speaker
- Binder working with SelectBox. Definition of equals and hashCode of Book and Speaker
- Used ComponentRender in SelectBox for Book and Speaker
- Used ComponentRender in Grid for Book and Speaker


## Tasks

1. [x] Enhance Data Model

- Create `Conference` and `Speaker` entities
- Implement OneToMany and ManyToOne relationships
- Use `Conference` as a join table

1. [x] Configure Data Loading

- Create `data.sql` file for initial data load
- Configure `application.properties` to load data only on first start
- Remember to use SQL data loading: `spring.sql.init.mode=always` in `application.properties` just the first time, then `never`.

1. [x] Create Vaadin Views

- Implement `MainLayout`
- Create one view per entity (`Conference`, `Speaker`)
- Use Vaadin components: `Avatar`, `ComboBox`, `DatePicker`

1. [x] Implement CRUD Operations

- <mark>Bind views to repositories</mark>
- Implement **Create, Read, Update, and Delete** operations in views

1. [x] Styling and Layout

- Ensure responsive design
- Apply consistent styling across views

Binary file added _PRA/screenshots/01-welcome.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added _PRA/screenshots/02-books.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added _PRA/screenshots/03-speakers.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added _PRA/screenshots/05-conferences-one-selected.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
18 changes: 18 additions & 0 deletions books/BooksView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.example.application.views.books;

import com.vaadin.flow.component.Composite;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.router.Menu;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route;

@PageTitle("Books")
@Route("books")
@Menu(order = 1, icon = "line-awesome/svg/pencil-ruler-solid.svg")
public class BooksView extends Composite<VerticalLayout> {

public BooksView() {
getContent().setWidth("100%");
getContent().getStyle().set("flex-grow", "1");
}
}
18 changes: 18 additions & 0 deletions conferences/ConferencesView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.example.application.views.conferences;

import com.vaadin.flow.component.Composite;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.router.Menu;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route;

@PageTitle("Conferences")
@Route("conferences")
@Menu(order = 3, icon = "line-awesome/svg/pencil-ruler-solid.svg")
public class ConferencesView extends Composite<VerticalLayout> {

public ConferencesView() {
getContent().setWidth("100%");
getContent().getStyle().set("flex-grow", "1");
}
}
37 changes: 37 additions & 0 deletions main/MainView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.example.application.views.main;

import com.vaadin.flow.component.Composite;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.router.Menu;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route;
import com.vaadin.flow.theme.lumo.LumoUtility.Gap;

@PageTitle("Main")
@Route("")
@Menu(order = 0, icon = "line-awesome/svg/pencil-ruler-solid.svg")
public class MainView extends Composite<VerticalLayout> {

public MainView() {
HorizontalLayout layoutRow2 = new HorizontalLayout();
HorizontalLayout layoutRow = new HorizontalLayout();
VerticalLayout layoutColumn2 = new VerticalLayout();
VerticalLayout layoutColumn3 = new VerticalLayout();
getContent().setWidth("100%");
getContent().getStyle().set("flex-grow", "1");
layoutRow2.addClassName(Gap.MEDIUM);
layoutRow2.setWidth("100%");
layoutRow2.setHeight("min-content");
layoutRow.addClassName(Gap.MEDIUM);
layoutRow.setWidth("100%");
layoutRow.getStyle().set("flex-grow", "1");
layoutColumn2.getStyle().set("flex-grow", "1");
layoutColumn3.setWidth("100%");
layoutColumn3.getStyle().set("flex-grow", "1");
getContent().add(layoutRow2);
getContent().add(layoutRow);
layoutRow.add(layoutColumn2);
layoutRow.add(layoutColumn3);
}
}
18 changes: 18 additions & 0 deletions speakers/SpeakersView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.example.application.views.speakers;

import com.vaadin.flow.component.Composite;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.router.Menu;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route;

@PageTitle("Speakers")
@Route("speakers")
@Menu(order = 2, icon = "line-awesome/svg/pencil-ruler-solid.svg")
public class SpeakersView extends Composite<VerticalLayout> {

public SpeakersView() {
getContent().setWidth("100%");
getContent().getStyle().set("flex-grow", "1");
}
}
23 changes: 23 additions & 0 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.Objects;
import java.util.UUID;


Expand Down Expand Up @@ -36,4 +38,25 @@ public class Book {

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

// https://stackoverflow.com/questions/17298314/java-vaadin-nativeselect-setvalue-not-working/17299605#17299605
@Override
public boolean equals(Object obj) {
if(this == obj) {
return true;
}
if(!(obj instanceof Book)){
return false;
}
Book that = (Book) obj;
return this.id.equals(that.id) &&
this.author.equals(that.author) &&
this.title.equals(that.title) &&
this.ISBN.equals(that.ISBN);
}

@Override
public int hashCode() {
return Objects.hash(id, title, author, ISBN);
}
}
38 changes: 38 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,42 @@
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;
private String conference;
private String title;
private LocalDate date;
private String youtube;
private String content;
private int duration;
private String room;

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

}
45 changes: 45 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,49 @@
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.Objects;
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;
private String name;
private String bio;
private String email;

// @ManyToOne
// @JoinColumn(name = "conference_id")
// private Conference conference;


// https://stackoverflow.com/questions/17298314/java-vaadin-nativeselect-setvalue-not-working/17299605#17299605
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Speaker speaker)) return false;
return Objects.equals(id, speaker.id) && Objects.equals(name, speaker.name) &&
Objects.equals(bio, speaker.bio) && Objects.equals(email, speaker.email);
}

@Override
public int hashCode() {
return Objects.hash(id, name, bio, email);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@

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

import java.util.UUID;

@Repository
public interface BookRepository extends JpaRepository<Book, 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.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,10 @@
package io.bcn.springConference.repository;

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

import java.util.UUID;

@Repository
public interface SpeakerRepository extends JpaRepository<Speaker, UUID> {}
Loading