Added slots, clients, partners
This commit is contained in:
parent
5f557d5d43
commit
13f3132947
@ -1 +0,0 @@
|
|||||||
TODO: Change package
|
|
@ -0,0 +1,70 @@
|
|||||||
|
package ru.vyatsu.qr_access_admin.client.component;
|
||||||
|
|
||||||
|
import com.vaadin.flow.component.Composite;
|
||||||
|
import com.vaadin.flow.component.Key;
|
||||||
|
import com.vaadin.flow.component.button.Button;
|
||||||
|
import com.vaadin.flow.component.button.ButtonVariant;
|
||||||
|
import com.vaadin.flow.component.icon.VaadinIcon;
|
||||||
|
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
|
||||||
|
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
||||||
|
import com.vaadin.flow.component.textfield.EmailField;
|
||||||
|
import com.vaadin.flow.data.binder.BeanValidationBinder;
|
||||||
|
import com.vaadin.flow.data.binder.Binder;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import ru.vyatsu.qr_access_admin.client.entity.ClientEntity;
|
||||||
|
|
||||||
|
public class ClientEditor extends Composite<VerticalLayout> {
|
||||||
|
|
||||||
|
public interface SaveListener {
|
||||||
|
void onSave(ClientEntity qr);
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface DeleteListener {
|
||||||
|
void onDelete(ClientEntity qr);
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface CancelListener {
|
||||||
|
void onCancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
private volatile ClientEntity currentClient;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private SaveListener saveListener;
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private DeleteListener deleteListener;
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private CancelListener cancelListener;
|
||||||
|
|
||||||
|
private final Binder<ClientEntity> binder = new BeanValidationBinder<>(ClientEntity.class);
|
||||||
|
|
||||||
|
public void setCurrentClient(ClientEntity client) {
|
||||||
|
this.currentClient = client;
|
||||||
|
binder.setBean(client);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ClientEditor() {
|
||||||
|
var email = new EmailField("E-mail");
|
||||||
|
|
||||||
|
var save = new Button("Сохранить", VaadinIcon.CHECK.create());
|
||||||
|
var cancel = new Button("Отмена");
|
||||||
|
var delete = new Button("Удалить", VaadinIcon.TRASH.create());
|
||||||
|
|
||||||
|
binder.forField(email).bind("email");
|
||||||
|
|
||||||
|
save.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
|
||||||
|
save.addClickListener(e -> saveListener.onSave(currentClient));
|
||||||
|
save.addClickShortcut(Key.ENTER);
|
||||||
|
|
||||||
|
delete.addThemeVariants(ButtonVariant.LUMO_ERROR);
|
||||||
|
delete.addClickListener(e -> deleteListener.onDelete(currentClient));
|
||||||
|
|
||||||
|
cancel.addClickListener(e -> cancelListener.onCancel());
|
||||||
|
|
||||||
|
getContent().add(email, new HorizontalLayout(save, cancel, delete));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
package ru.vyatsu.qr_access_admin.client.entity;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "clients")
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
public class ClientEntity {
|
||||||
|
@Id
|
||||||
|
@Column
|
||||||
|
@GeneratedValue(strategy = GenerationType.UUID)
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
@Column
|
||||||
|
private String email;
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package ru.vyatsu.qr_access_admin.client.entity;
|
||||||
|
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
public interface ClientRepository extends JpaRepository<ClientEntity, String> {
|
||||||
|
}
|
@ -0,0 +1,76 @@
|
|||||||
|
package ru.vyatsu.qr_access_admin.client.view;
|
||||||
|
|
||||||
|
import com.vaadin.flow.component.button.Button;
|
||||||
|
import com.vaadin.flow.component.grid.Grid;
|
||||||
|
import com.vaadin.flow.component.icon.VaadinIcon;
|
||||||
|
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 ru.vyatsu.qr_access_admin.client.component.ClientEditor;
|
||||||
|
import ru.vyatsu.qr_access_admin.client.entity.ClientEntity;
|
||||||
|
import ru.vyatsu.qr_access_admin.client.entity.ClientRepository;
|
||||||
|
import ru.vyatsu.qr_access_admin.common.MainLayout;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Route(value = "clients", layout = MainLayout.class)
|
||||||
|
@PageTitle("Клиенты")
|
||||||
|
public class ClientView extends VerticalLayout {
|
||||||
|
private final ClientRepository repository;
|
||||||
|
private final Grid<ClientEntity> grid;
|
||||||
|
private final ClientEditor editor;
|
||||||
|
|
||||||
|
public ClientView(ClientRepository repository) {
|
||||||
|
this.repository = repository;
|
||||||
|
|
||||||
|
var addButton = new Button("Добавить клиента", VaadinIcon.PLUS.create());
|
||||||
|
grid = new Grid<>(ClientEntity.class);
|
||||||
|
grid.setColumns("id", "email");
|
||||||
|
editor = new ClientEditor();
|
||||||
|
|
||||||
|
var actionsLayout = new HorizontalLayout(addButton);
|
||||||
|
add(actionsLayout, grid, editor);
|
||||||
|
|
||||||
|
this.configureEditor();
|
||||||
|
|
||||||
|
addButton.addClickListener(e -> editClient(new ClientEntity()));
|
||||||
|
|
||||||
|
grid.setHeight("200px");
|
||||||
|
grid.asSingleSelect().addValueChangeListener(e -> editClient(e.getValue()));
|
||||||
|
|
||||||
|
refreshClientGrid();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void refreshClientGrid() {
|
||||||
|
List<ClientEntity> entities = repository.findAll();
|
||||||
|
grid.setItems(entities);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void editClient(ClientEntity client) {
|
||||||
|
if (client == null) {
|
||||||
|
editor.setVisible(false);
|
||||||
|
} else {
|
||||||
|
editor.setVisible(true);
|
||||||
|
editor.setCurrentClient(client);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void configureEditor() {
|
||||||
|
editor.setVisible(false);
|
||||||
|
|
||||||
|
editor.setSaveListener(client -> {
|
||||||
|
repository.save(client);
|
||||||
|
refreshClientGrid();
|
||||||
|
editClient(null);
|
||||||
|
});
|
||||||
|
|
||||||
|
editor.setDeleteListener(client -> {
|
||||||
|
repository.deleteById(client.getId());
|
||||||
|
refreshClientGrid();
|
||||||
|
editClient(null);
|
||||||
|
});
|
||||||
|
|
||||||
|
editor.setCancelListener(() -> editClient(null));
|
||||||
|
}
|
||||||
|
}
|
@ -1,9 +1,5 @@
|
|||||||
package ru.vyatsu.qr_access_admin.common;
|
package ru.vyatsu.qr_access_admin.common;
|
||||||
|
|
||||||
import ru.vyatsu.qr_access_admin.common.view.MainView;
|
|
||||||
import ru.vyatsu.qr_access_admin.door.view.DoorView;
|
|
||||||
import ru.vyatsu.qr_access_admin.qr.view.QrView;
|
|
||||||
import ru.vyatsu.qr_access_admin.unit.view.UnitView;
|
|
||||||
import com.vaadin.flow.component.Component;
|
import com.vaadin.flow.component.Component;
|
||||||
import com.vaadin.flow.component.ComponentUtil;
|
import com.vaadin.flow.component.ComponentUtil;
|
||||||
import com.vaadin.flow.component.applayout.AppLayout;
|
import com.vaadin.flow.component.applayout.AppLayout;
|
||||||
@ -19,6 +15,13 @@ import com.vaadin.flow.component.tabs.Tabs;
|
|||||||
import com.vaadin.flow.component.tabs.TabsVariant;
|
import com.vaadin.flow.component.tabs.TabsVariant;
|
||||||
import com.vaadin.flow.router.PageTitle;
|
import com.vaadin.flow.router.PageTitle;
|
||||||
import com.vaadin.flow.router.RouterLink;
|
import com.vaadin.flow.router.RouterLink;
|
||||||
|
import ru.vyatsu.qr_access_admin.client.view.ClientView;
|
||||||
|
import ru.vyatsu.qr_access_admin.common.view.MainView;
|
||||||
|
import ru.vyatsu.qr_access_admin.door.view.DoorView;
|
||||||
|
import ru.vyatsu.qr_access_admin.partner.view.PartnerView;
|
||||||
|
import ru.vyatsu.qr_access_admin.qr.view.QrView;
|
||||||
|
import ru.vyatsu.qr_access_admin.slot.view.SlotView;
|
||||||
|
import ru.vyatsu.qr_access_admin.unit.view.UnitView;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
@ -118,7 +121,10 @@ public class MainLayout extends AppLayout {
|
|||||||
createTab("Домашняя страница", MainView.class),
|
createTab("Домашняя страница", MainView.class),
|
||||||
createTab("Устройства", UnitView.class),
|
createTab("Устройства", UnitView.class),
|
||||||
createTab("Двери", DoorView.class),
|
createTab("Двери", DoorView.class),
|
||||||
createTab("QR-коды", QrView.class)
|
createTab("QR-коды", QrView.class),
|
||||||
|
createTab("Слоты", SlotView.class),
|
||||||
|
createTab("Партнеры", PartnerView.class),
|
||||||
|
createTab("Клиенты", ClientView.class)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,70 @@
|
|||||||
|
package ru.vyatsu.qr_access_admin.partner.component;
|
||||||
|
|
||||||
|
import com.vaadin.flow.component.Composite;
|
||||||
|
import com.vaadin.flow.component.Key;
|
||||||
|
import com.vaadin.flow.component.button.Button;
|
||||||
|
import com.vaadin.flow.component.button.ButtonVariant;
|
||||||
|
import com.vaadin.flow.component.icon.VaadinIcon;
|
||||||
|
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.BeanValidationBinder;
|
||||||
|
import com.vaadin.flow.data.binder.Binder;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import ru.vyatsu.qr_access_admin.partner.entity.PartnerEntity;
|
||||||
|
|
||||||
|
public class PartnerEditor extends Composite<VerticalLayout> {
|
||||||
|
|
||||||
|
public interface SaveListener {
|
||||||
|
void onSave(PartnerEntity qr);
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface DeleteListener {
|
||||||
|
void onDelete(PartnerEntity qr);
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface CancelListener {
|
||||||
|
void onCancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
private volatile PartnerEntity currentPartner;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private SaveListener saveListener;
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private DeleteListener deleteListener;
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private CancelListener cancelListener;
|
||||||
|
|
||||||
|
private final Binder<PartnerEntity> binder = new BeanValidationBinder<>(PartnerEntity.class);
|
||||||
|
|
||||||
|
public void setCurrentPartner(PartnerEntity partner) {
|
||||||
|
this.currentPartner = partner;
|
||||||
|
binder.setBean(partner);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PartnerEditor() {
|
||||||
|
var name = new TextField("Наименование");
|
||||||
|
|
||||||
|
var save = new Button("Сохранить", VaadinIcon.CHECK.create());
|
||||||
|
var cancel = new Button("Отмена");
|
||||||
|
var delete = new Button("Удалить", VaadinIcon.TRASH.create());
|
||||||
|
|
||||||
|
binder.forField(name).bind("name");
|
||||||
|
|
||||||
|
save.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
|
||||||
|
save.addClickListener(e -> saveListener.onSave(currentPartner));
|
||||||
|
save.addClickShortcut(Key.ENTER);
|
||||||
|
|
||||||
|
delete.addThemeVariants(ButtonVariant.LUMO_ERROR);
|
||||||
|
delete.addClickListener(e -> deleteListener.onDelete(currentPartner));
|
||||||
|
|
||||||
|
cancel.addClickListener(e -> cancelListener.onCancel());
|
||||||
|
|
||||||
|
getContent().add(name, new HorizontalLayout(save, cancel, delete));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
package ru.vyatsu.qr_access_admin.partner.entity;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "partners")
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
public class PartnerEntity {
|
||||||
|
@Id
|
||||||
|
@Column
|
||||||
|
@GeneratedValue(strategy = GenerationType.UUID)
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
@Column
|
||||||
|
private String name;
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package ru.vyatsu.qr_access_admin.partner.entity;
|
||||||
|
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
public interface PartnerRepository extends JpaRepository<PartnerEntity, String> {
|
||||||
|
}
|
@ -0,0 +1,76 @@
|
|||||||
|
package ru.vyatsu.qr_access_admin.partner.view;
|
||||||
|
|
||||||
|
import com.vaadin.flow.component.button.Button;
|
||||||
|
import com.vaadin.flow.component.grid.Grid;
|
||||||
|
import com.vaadin.flow.component.icon.VaadinIcon;
|
||||||
|
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 ru.vyatsu.qr_access_admin.common.MainLayout;
|
||||||
|
import ru.vyatsu.qr_access_admin.partner.component.PartnerEditor;
|
||||||
|
import ru.vyatsu.qr_access_admin.partner.entity.PartnerEntity;
|
||||||
|
import ru.vyatsu.qr_access_admin.partner.entity.PartnerRepository;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Route(value = "partners", layout = MainLayout.class)
|
||||||
|
@PageTitle("Партнеры")
|
||||||
|
public class PartnerView extends VerticalLayout {
|
||||||
|
private final PartnerRepository repository;
|
||||||
|
private final Grid<PartnerEntity> grid;
|
||||||
|
private final PartnerEditor editor;
|
||||||
|
|
||||||
|
public PartnerView(PartnerRepository repository) {
|
||||||
|
this.repository = repository;
|
||||||
|
|
||||||
|
var addButton = new Button("Добавить партнера", VaadinIcon.PLUS.create());
|
||||||
|
grid = new Grid<>(PartnerEntity.class);
|
||||||
|
grid.setColumns("id", "name");
|
||||||
|
editor = new PartnerEditor();
|
||||||
|
|
||||||
|
var actionsLayout = new HorizontalLayout(addButton);
|
||||||
|
add(actionsLayout, grid, editor);
|
||||||
|
|
||||||
|
this.configureEditor();
|
||||||
|
|
||||||
|
addButton.addClickListener(e -> editPartner(new PartnerEntity()));
|
||||||
|
|
||||||
|
grid.setHeight("200px");
|
||||||
|
grid.asSingleSelect().addValueChangeListener(e -> editPartner(e.getValue()));
|
||||||
|
|
||||||
|
refreshPartnerGrid();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void refreshPartnerGrid() {
|
||||||
|
List<PartnerEntity> entities = repository.findAll();
|
||||||
|
grid.setItems(entities);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void editPartner(PartnerEntity partner) {
|
||||||
|
if (partner == null) {
|
||||||
|
editor.setVisible(false);
|
||||||
|
} else {
|
||||||
|
editor.setVisible(true);
|
||||||
|
editor.setCurrentPartner(partner);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void configureEditor() {
|
||||||
|
editor.setVisible(false);
|
||||||
|
|
||||||
|
editor.setSaveListener(partner -> {
|
||||||
|
repository.save(partner);
|
||||||
|
refreshPartnerGrid();
|
||||||
|
editPartner(null);
|
||||||
|
});
|
||||||
|
|
||||||
|
editor.setDeleteListener(partner -> {
|
||||||
|
repository.deleteById(partner.getId());
|
||||||
|
refreshPartnerGrid();
|
||||||
|
editPartner(null);
|
||||||
|
});
|
||||||
|
|
||||||
|
editor.setCancelListener(() -> editPartner(null));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,79 @@
|
|||||||
|
package ru.vyatsu.qr_access_admin.slot.component;
|
||||||
|
|
||||||
|
import com.vaadin.flow.component.Composite;
|
||||||
|
import com.vaadin.flow.component.Key;
|
||||||
|
import com.vaadin.flow.component.button.Button;
|
||||||
|
import com.vaadin.flow.component.button.ButtonVariant;
|
||||||
|
import com.vaadin.flow.component.combobox.ComboBox;
|
||||||
|
import com.vaadin.flow.component.datetimepicker.DateTimePicker;
|
||||||
|
import com.vaadin.flow.component.icon.VaadinIcon;
|
||||||
|
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
|
||||||
|
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
||||||
|
import com.vaadin.flow.component.timepicker.TimePicker;
|
||||||
|
import com.vaadin.flow.data.binder.BeanValidationBinder;
|
||||||
|
import com.vaadin.flow.data.binder.Binder;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import ru.vyatsu.qr_access_admin.door.entity.DoorEntity;
|
||||||
|
import ru.vyatsu.qr_access_admin.door.entity.DoorRepository;
|
||||||
|
import ru.vyatsu.qr_access_admin.slot.entity.SlotEntity;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public class SlotEditor extends Composite<VerticalLayout> {
|
||||||
|
|
||||||
|
public interface SaveListener {
|
||||||
|
void onSave(SlotEntity qr);
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface DeleteListener {
|
||||||
|
void onDelete(SlotEntity qr);
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface CancelListener {
|
||||||
|
void onCancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
private volatile SlotEntity currentSlot;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private SaveListener saveListener;
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private DeleteListener deleteListener;
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private CancelListener cancelListener;
|
||||||
|
|
||||||
|
private final Binder<SlotEntity> binder = new BeanValidationBinder<>(SlotEntity.class);
|
||||||
|
|
||||||
|
public void setCurrentSlot(SlotEntity slot) {
|
||||||
|
this.currentSlot = slot;
|
||||||
|
binder.setBean(slot);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SlotEditor() {
|
||||||
|
var startTime = new TimePicker("Начало действия");
|
||||||
|
var endTime = new TimePicker("Конец действия");
|
||||||
|
|
||||||
|
var save = new Button("Сохранить", VaadinIcon.CHECK.create());
|
||||||
|
var cancel = new Button("Отмена");
|
||||||
|
var delete = new Button("Удалить", VaadinIcon.TRASH.create());
|
||||||
|
|
||||||
|
binder.forField(startTime).bind("startTime");
|
||||||
|
binder.forField(endTime).bind("endTime");
|
||||||
|
|
||||||
|
save.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
|
||||||
|
save.addClickListener(e -> saveListener.onSave(currentSlot));
|
||||||
|
save.addClickShortcut(Key.ENTER);
|
||||||
|
|
||||||
|
delete.addThemeVariants(ButtonVariant.LUMO_ERROR);
|
||||||
|
delete.addClickListener(e -> deleteListener.onDelete(currentSlot));
|
||||||
|
|
||||||
|
cancel.addClickListener(e -> cancelListener.onCancel());
|
||||||
|
|
||||||
|
getContent().add(startTime, endTime, new HorizontalLayout(save, cancel, delete));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
package ru.vyatsu.qr_access_admin.slot.entity;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
import java.time.LocalTime;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "slots")
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
public class SlotEntity {
|
||||||
|
@Id
|
||||||
|
@Column
|
||||||
|
@GeneratedValue(strategy = GenerationType.UUID)
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
@Column
|
||||||
|
private LocalTime startTime;
|
||||||
|
|
||||||
|
@Column
|
||||||
|
private LocalTime endTime;
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package ru.vyatsu.qr_access_admin.slot.entity;
|
||||||
|
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
public interface SlotRepository extends JpaRepository<SlotEntity, String> {
|
||||||
|
}
|
@ -0,0 +1,76 @@
|
|||||||
|
package ru.vyatsu.qr_access_admin.slot.view;
|
||||||
|
|
||||||
|
import com.vaadin.flow.component.button.Button;
|
||||||
|
import com.vaadin.flow.component.grid.Grid;
|
||||||
|
import com.vaadin.flow.component.icon.VaadinIcon;
|
||||||
|
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 ru.vyatsu.qr_access_admin.common.MainLayout;
|
||||||
|
import ru.vyatsu.qr_access_admin.slot.component.SlotEditor;
|
||||||
|
import ru.vyatsu.qr_access_admin.slot.entity.SlotEntity;
|
||||||
|
import ru.vyatsu.qr_access_admin.slot.entity.SlotRepository;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Route(value = "slots", layout = MainLayout.class)
|
||||||
|
@PageTitle("Слоты")
|
||||||
|
public class SlotView extends VerticalLayout {
|
||||||
|
private final SlotRepository repository;
|
||||||
|
private final Grid<SlotEntity> grid;
|
||||||
|
private final SlotEditor editor;
|
||||||
|
|
||||||
|
public SlotView(SlotRepository repository) {
|
||||||
|
this.repository = repository;
|
||||||
|
|
||||||
|
var addButton = new Button("Добавить слот", VaadinIcon.PLUS.create());
|
||||||
|
grid = new Grid<>(SlotEntity.class);
|
||||||
|
grid.setColumns("id", "startTime", "endTime");
|
||||||
|
editor = new SlotEditor();
|
||||||
|
|
||||||
|
var actionsLayout = new HorizontalLayout(addButton);
|
||||||
|
add(actionsLayout, grid, editor);
|
||||||
|
|
||||||
|
this.configureEditor();
|
||||||
|
|
||||||
|
addButton.addClickListener(e -> editSlot(new SlotEntity()));
|
||||||
|
|
||||||
|
grid.setHeight("200px");
|
||||||
|
grid.asSingleSelect().addValueChangeListener(e -> editSlot(e.getValue()));
|
||||||
|
|
||||||
|
refreshSlotGrid();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void refreshSlotGrid() {
|
||||||
|
List<SlotEntity> entities = repository.findAll();
|
||||||
|
grid.setItems(entities);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void editSlot(SlotEntity slot) {
|
||||||
|
if (slot == null) {
|
||||||
|
editor.setVisible(false);
|
||||||
|
} else {
|
||||||
|
editor.setVisible(true);
|
||||||
|
editor.setCurrentSlot(slot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void configureEditor() {
|
||||||
|
editor.setVisible(false);
|
||||||
|
|
||||||
|
editor.setSaveListener(slot -> {
|
||||||
|
repository.save(slot);
|
||||||
|
refreshSlotGrid();
|
||||||
|
editSlot(null);
|
||||||
|
});
|
||||||
|
|
||||||
|
editor.setDeleteListener(slot -> {
|
||||||
|
repository.deleteById(slot.getId());
|
||||||
|
refreshSlotGrid();
|
||||||
|
editSlot(null);
|
||||||
|
});
|
||||||
|
|
||||||
|
editor.setCancelListener(() -> editSlot(null));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user