diff --git a/vaadincreate-ui/src/main/java/org/vaadin/tatu/vaadincreate/crud/BookGrid.java b/vaadincreate-ui/src/main/java/org/vaadin/tatu/vaadincreate/crud/BookGrid.java index 33e246b..0859c4e 100644 --- a/vaadincreate-ui/src/main/java/org/vaadin/tatu/vaadincreate/crud/BookGrid.java +++ b/vaadincreate-ui/src/main/java/org/vaadin/tatu/vaadincreate/crud/BookGrid.java @@ -268,7 +268,6 @@ public void setEdited(Product product) { @Override public void eventFired(Object event) { if (event instanceof BookEvent && isAttached()) { - logger.info("Book locking update"); var bookEvent = (BookEvent) event; getUI().access(() -> { ListDataProvider dataProvider = (ListDataProvider) getDataProvider(); diff --git a/vaadincreate-ui/src/main/java/org/vaadin/tatu/vaadincreate/crud/BooksPresenter.java b/vaadincreate-ui/src/main/java/org/vaadin/tatu/vaadincreate/crud/BooksPresenter.java index 9d05b1c..cb3374b 100644 --- a/vaadincreate-ui/src/main/java/org/vaadin/tatu/vaadincreate/crud/BooksPresenter.java +++ b/vaadincreate-ui/src/main/java/org/vaadin/tatu/vaadincreate/crud/BooksPresenter.java @@ -153,6 +153,8 @@ public void editProduct(Product product) { if (product == null) { view.setFragmentParameter(""); unlockBook(); + } else if (product.getId() == -1) { + view.setFragmentParameter("new"); } else { view.setFragmentParameter(product.getId() + ""); lockBook(product.getId()); diff --git a/vaadincreate-ui/src/main/java/org/vaadin/tatu/vaadincreate/crud/BooksView.java b/vaadincreate-ui/src/main/java/org/vaadin/tatu/vaadincreate/crud/BooksView.java index 403cfa6..64b28c5 100644 --- a/vaadincreate-ui/src/main/java/org/vaadin/tatu/vaadincreate/crud/BooksView.java +++ b/vaadincreate-ui/src/main/java/org/vaadin/tatu/vaadincreate/crud/BooksView.java @@ -130,9 +130,8 @@ private HorizontalLayout createTopBar() { ResetButtonForTextField.extend(filter); // Apply the filter to grid's data provider. TextField value is never // null - filter.addValueChangeListener( - event -> dataProvider - .setFilter(book -> passesFilter(book, event.getValue()))); + filter.addValueChangeListener(event -> dataProvider + .setFilter(book -> passesFilter(book, event.getValue()))); newProduct = new Button(getTranslation(NEW_PRODUCT)); newProduct.setId("new-product"); @@ -299,9 +298,11 @@ public void beforeLeave(ViewBeforeLeaveEvent event) { // IMHO: Navigator clears url too early and this workaround // shouldn't be necessary. This is a possible bug. var book = getSelectedRow(); - getUI().access(() -> { - setFragmentParameter("" + book.getId()); - }); + if (book != null) { + getUI().access(() -> { + setFragmentParameter("" + book.getId()); + }); + } } else { event.navigate(); } diff --git a/vaadincreate-ui/src/main/java/org/vaadin/tatu/vaadincreate/crud/LockedBooksImpl.java b/vaadincreate-ui/src/main/java/org/vaadin/tatu/vaadincreate/crud/LockedBooksImpl.java index a2d8f0b..1d35a42 100644 --- a/vaadincreate-ui/src/main/java/org/vaadin/tatu/vaadincreate/crud/LockedBooksImpl.java +++ b/vaadincreate-ui/src/main/java/org/vaadin/tatu/vaadincreate/crud/LockedBooksImpl.java @@ -34,12 +34,16 @@ public Collection lockedBooks() { @Override public void lock(Integer id) { + if (id != null && id < 0) { + throw new IllegalArgumentException( + "Id can't be null and must be positive"); + } synchronized (books) { var match = books.keySet().stream().filter(i -> i.equals(id)) .findFirst(); if (match.isPresent()) { throw new IllegalStateException( - "Can't open book already opened: " + id); + "Can't locked book already locked: " + id); } books.put(id, null); eventBus.post(new BookEvent(id)); diff --git a/vaadincreate-ui/src/test/java/org/vaadin/tatu/vaadincreate/crud/BooksViewTest.java b/vaadincreate-ui/src/test/java/org/vaadin/tatu/vaadincreate/crud/BooksViewTest.java index 1f3c876..5e25412 100644 --- a/vaadincreate-ui/src/test/java/org/vaadin/tatu/vaadincreate/crud/BooksViewTest.java +++ b/vaadincreate-ui/src/test/java/org/vaadin/tatu/vaadincreate/crud/BooksViewTest.java @@ -227,6 +227,16 @@ public void editProduct() { assertEquals("Edited book", edited.getProductName()); } + @Test + public void editLockedProduct() { + var book = test(grid).item(0); + LockedBooks.get().lock(book.getId()); + + test(grid).click(1, 0); + assertFalse(form.isShown()); + LockedBooks.get().unlock(book.getId()); + } + @Test public void editProductDiscardChanges() { test(grid).click(1, 0);