Add rent functions
This commit is contained in:
		
							parent
							
								
									8e70180266
								
							
						
					
					
						commit
						deb18f48c0
					
				| @ -19,6 +19,7 @@ import ru.vyatsu.qr_access_admin.client.view.ClientView; | |||||||
| import ru.vyatsu.qr_access_admin.common.view.MainView; | import ru.vyatsu.qr_access_admin.common.view.MainView; | ||||||
| import ru.vyatsu.qr_access_admin.door.view.DoorView; | import ru.vyatsu.qr_access_admin.door.view.DoorView; | ||||||
| import ru.vyatsu.qr_access_admin.partner.view.PartnerView; | import ru.vyatsu.qr_access_admin.partner.view.PartnerView; | ||||||
|  | import ru.vyatsu.qr_access_admin.rent.view.RentView; | ||||||
| import ru.vyatsu.qr_access_admin.unit.view.UnitView; | import ru.vyatsu.qr_access_admin.unit.view.UnitView; | ||||||
| 
 | 
 | ||||||
| import java.util.Optional; | import java.util.Optional; | ||||||
| @ -120,6 +121,7 @@ public class MainLayout extends AppLayout { | |||||||
|                 createTab("Устройства", UnitView.class), |                 createTab("Устройства", UnitView.class), | ||||||
|                 createTab("Двери", DoorView.class), |                 createTab("Двери", DoorView.class), | ||||||
|                 createTab("Партнеры", PartnerView.class), |                 createTab("Партнеры", PartnerView.class), | ||||||
|  |                 createTab("Бронирование", RentView.class), | ||||||
|                 createTab("Клиенты", ClientView.class) |                 createTab("Клиенты", ClientView.class) | ||||||
|         }; |         }; | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -17,11 +17,11 @@ import ru.vyatsu.qr_access_admin.partner.entity.PartnerEntity; | |||||||
| public class PartnerEditor extends Composite<VerticalLayout> { | public class PartnerEditor extends Composite<VerticalLayout> { | ||||||
| 
 | 
 | ||||||
|     public interface SaveListener { |     public interface SaveListener { | ||||||
|         void onSave(PartnerEntity qr); |         void onSave(PartnerEntity partner); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public interface DeleteListener { |     public interface DeleteListener { | ||||||
|         void onDelete(PartnerEntity qr); |         void onDelete(PartnerEntity partner); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public interface CancelListener { |     public interface CancelListener { | ||||||
|  | |||||||
| @ -0,0 +1,107 @@ | |||||||
|  | package ru.vyatsu.qr_access_admin.rent.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.checkbox.Checkbox; | ||||||
|  | import com.vaadin.flow.component.combobox.ComboBox; | ||||||
|  | import com.vaadin.flow.component.datepicker.DatePicker; | ||||||
|  | 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.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.client.entity.ClientEntity; | ||||||
|  | import ru.vyatsu.qr_access_admin.client.entity.ClientRepository; | ||||||
|  | import ru.vyatsu.qr_access_admin.door.entity.DoorEntity; | ||||||
|  | import ru.vyatsu.qr_access_admin.door.entity.DoorRepository; | ||||||
|  | import ru.vyatsu.qr_access_admin.rent.entity.RentEntity; | ||||||
|  | 
 | ||||||
|  | import java.util.Map; | ||||||
|  | import java.util.stream.Collectors; | ||||||
|  | 
 | ||||||
|  | public class RentEditor extends Composite<VerticalLayout> { | ||||||
|  | 
 | ||||||
|  |     public interface SaveListener { | ||||||
|  |         void onSave(RentEntity rent); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public interface DeleteListener { | ||||||
|  |         void onDelete(RentEntity rent); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public interface CancelListener { | ||||||
|  |         void onCancel(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private volatile RentEntity currentRent; | ||||||
|  | 
 | ||||||
|  |     @Getter | ||||||
|  |     @Setter | ||||||
|  |     private SaveListener saveListener; | ||||||
|  |     @Getter | ||||||
|  |     @Setter | ||||||
|  |     private DeleteListener deleteListener; | ||||||
|  |     @Getter | ||||||
|  |     @Setter | ||||||
|  |     private CancelListener cancelListener; | ||||||
|  | 
 | ||||||
|  |     private final Binder<RentEntity> binder = new BeanValidationBinder<>(RentEntity.class); | ||||||
|  | 
 | ||||||
|  |     public void setCurrentRent(RentEntity rent) { | ||||||
|  |         this.currentRent = rent; | ||||||
|  |         binder.setBean(rent); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public RentEditor(DoorRepository doorRepository, ClientRepository clientRepository) { | ||||||
|  |         var startTimeField = new TimePicker("Время начала действия"); | ||||||
|  |         var endTimeField = new TimePicker("Время окончания действия"); | ||||||
|  |         var dateField = new DatePicker("Дата бронирования"); | ||||||
|  |         var qrCodeField = new TextField("Закодированный идентификатор"); | ||||||
|  |         var payedField = new Checkbox("Оплачено"); | ||||||
|  |         ComboBox<DoorEntity> doorField = new ComboBox<>("Дверь"); | ||||||
|  |         doorField.setItemLabelGenerator(DoorEntity::getDescription); | ||||||
|  |         ComboBox<ClientEntity> clientField = new ComboBox<>("Клиент"); | ||||||
|  |         clientField.setItemLabelGenerator(ClientEntity::getEmail); | ||||||
|  |         Map<String, DoorEntity> doors = doorRepository.findAllByParentDoorIdsIsNull() | ||||||
|  |                 .stream() | ||||||
|  |                 .collect(Collectors.toMap(DoorEntity::getId, d -> d)); | ||||||
|  |         Map<String, ClientEntity> clients = clientRepository.findAll() | ||||||
|  |                 .stream() | ||||||
|  |                 .collect(Collectors.toMap(ClientEntity::getId, c -> c)); | ||||||
|  |         doorField.setItems(doors.values()); | ||||||
|  |         clientField.setItems(clients.values()); | ||||||
|  | 
 | ||||||
|  |         binder.forField(doorField) | ||||||
|  |                 .withConverter(DoorEntity::getId, doors::get) | ||||||
|  |                 .bind("doorId"); | ||||||
|  |         binder.forField(clientField) | ||||||
|  |                 .withConverter(ClientEntity::getId, clients::get) | ||||||
|  |                 .bind("clientId"); | ||||||
|  |         binder.forField(startTimeField).bind("startTime"); | ||||||
|  |         binder.forField(endTimeField).bind("endTime"); | ||||||
|  |         binder.forField(dateField).bind("date"); | ||||||
|  |         binder.forField(qrCodeField).bind("qrCode"); | ||||||
|  |         binder.forField(payedField).bind("payed"); | ||||||
|  | 
 | ||||||
|  |         var save = new Button("Сохранить", VaadinIcon.CHECK.create()); | ||||||
|  |         var cancel = new Button("Отмена"); | ||||||
|  |         var delete = new Button("Удалить", VaadinIcon.TRASH.create()); | ||||||
|  | 
 | ||||||
|  |         save.addThemeVariants(ButtonVariant.LUMO_PRIMARY); | ||||||
|  |         save.addClickListener(e -> saveListener.onSave(currentRent)); | ||||||
|  |         save.addClickShortcut(Key.ENTER); | ||||||
|  | 
 | ||||||
|  |         delete.addThemeVariants(ButtonVariant.LUMO_ERROR); | ||||||
|  |         delete.addClickListener(e -> deleteListener.onDelete(currentRent)); | ||||||
|  | 
 | ||||||
|  |         cancel.addClickListener(e -> cancelListener.onCancel()); | ||||||
|  | 
 | ||||||
|  |         getContent().add(startTimeField, endTimeField, dateField, doorField, clientField, qrCodeField, payedField, new HorizontalLayout(save, cancel, delete)); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,46 @@ | |||||||
|  | package ru.vyatsu.qr_access_admin.rent.entity; | ||||||
|  | 
 | ||||||
|  | import jakarta.persistence.*; | ||||||
|  | import lombok.Getter; | ||||||
|  | import lombok.Setter; | ||||||
|  | import org.hibernate.annotations.CreationTimestamp; | ||||||
|  | import org.hibernate.annotations.SourceType; | ||||||
|  | 
 | ||||||
|  | import java.time.LocalDate; | ||||||
|  | import java.time.LocalDateTime; | ||||||
|  | import java.time.LocalTime; | ||||||
|  | 
 | ||||||
|  | @Table(name = "rent") | ||||||
|  | @Entity | ||||||
|  | @Getter | ||||||
|  | @Setter | ||||||
|  | public class RentEntity { | ||||||
|  |     @Id | ||||||
|  |     @GeneratedValue(strategy = GenerationType.UUID) | ||||||
|  |     private String id; | ||||||
|  | 
 | ||||||
|  |     @Column | ||||||
|  |     private LocalTime startTime; | ||||||
|  | 
 | ||||||
|  |     @Column | ||||||
|  |     private LocalTime endTime; | ||||||
|  | 
 | ||||||
|  |     @Column | ||||||
|  |     private String clientId; | ||||||
|  | 
 | ||||||
|  |     @Column | ||||||
|  |     private LocalDate date; | ||||||
|  | 
 | ||||||
|  |     @Column | ||||||
|  |     private String doorId; | ||||||
|  | 
 | ||||||
|  |     @Column | ||||||
|  |     private String qrCode; | ||||||
|  | 
 | ||||||
|  |     @Column | ||||||
|  |     private Boolean payed; | ||||||
|  | 
 | ||||||
|  |     @Column | ||||||
|  |     @CreationTimestamp(source = SourceType.DB) | ||||||
|  |     private LocalDateTime dateCreated; | ||||||
|  | } | ||||||
| @ -0,0 +1,8 @@ | |||||||
|  | package ru.vyatsu.qr_access_admin.rent.entity; | ||||||
|  | 
 | ||||||
|  | import org.springframework.data.jpa.repository.JpaRepository; | ||||||
|  | import org.springframework.stereotype.Repository; | ||||||
|  | 
 | ||||||
|  | @Repository | ||||||
|  | public interface RentRepository extends JpaRepository<RentEntity, String> { | ||||||
|  | } | ||||||
| @ -0,0 +1,80 @@ | |||||||
|  | package ru.vyatsu.qr_access_admin.rent.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 jakarta.annotation.security.PermitAll; | ||||||
|  | import ru.vyatsu.qr_access_admin.client.entity.ClientRepository; | ||||||
|  | import ru.vyatsu.qr_access_admin.common.MainLayout; | ||||||
|  | import ru.vyatsu.qr_access_admin.door.entity.DoorRepository; | ||||||
|  | import ru.vyatsu.qr_access_admin.rent.component.RentEditor; | ||||||
|  | import ru.vyatsu.qr_access_admin.rent.entity.RentEntity; | ||||||
|  | import ru.vyatsu.qr_access_admin.rent.entity.RentRepository; | ||||||
|  | 
 | ||||||
|  | import java.util.List; | ||||||
|  | 
 | ||||||
|  | @Route(value = "rent", layout = MainLayout.class) | ||||||
|  | @PageTitle("Бронирование") | ||||||
|  | @PermitAll | ||||||
|  | public class RentView extends VerticalLayout { | ||||||
|  |     private final RentRepository repository; | ||||||
|  |     private final Grid<RentEntity> grid; | ||||||
|  |     private final RentEditor editor; | ||||||
|  | 
 | ||||||
|  |     public RentView(RentRepository repository, DoorRepository doorRepository, ClientRepository clientRepository) { | ||||||
|  |         this.repository = repository; | ||||||
|  | 
 | ||||||
|  |         var addButton = new Button("Добавить бронирование", VaadinIcon.PLUS.create()); | ||||||
|  |         grid = new Grid<>(RentEntity.class); | ||||||
|  |         grid.setColumns("clientId", "date", "startTime", "endTime", "payed", "dateCreated"); | ||||||
|  |         editor = new RentEditor(doorRepository, clientRepository); | ||||||
|  | 
 | ||||||
|  |         var actionsLayout = new HorizontalLayout(addButton); | ||||||
|  |         add(actionsLayout, grid, editor); | ||||||
|  | 
 | ||||||
|  |         this.configureEditor(); | ||||||
|  | 
 | ||||||
|  |         addButton.addClickListener(e -> editRent(new RentEntity())); | ||||||
|  | 
 | ||||||
|  |         grid.setHeight("200px"); | ||||||
|  |         grid.asSingleSelect().addValueChangeListener(e -> editRent(e.getValue())); | ||||||
|  | 
 | ||||||
|  |         refreshRentGrid(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private void refreshRentGrid() { | ||||||
|  |         List<RentEntity> entities = repository.findAll(); | ||||||
|  |         grid.setItems(entities); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private void editRent(RentEntity rent) { | ||||||
|  |         if (rent == null) { | ||||||
|  |             editor.setVisible(false); | ||||||
|  |         } else { | ||||||
|  |             editor.setVisible(true); | ||||||
|  |             editor.setCurrentRent(rent); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private void configureEditor() { | ||||||
|  |         editor.setVisible(false); | ||||||
|  | 
 | ||||||
|  |         editor.setSaveListener(rent -> { | ||||||
|  |             repository.save(rent); | ||||||
|  |             refreshRentGrid(); | ||||||
|  |             editRent(null); | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |         editor.setDeleteListener(rent -> { | ||||||
|  |             repository.deleteById(rent.getId()); | ||||||
|  |             refreshRentGrid(); | ||||||
|  |             editRent(null); | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |         editor.setCancelListener(() -> editRent(null)); | ||||||
|  |     } | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user