From 9671b8353b09c38f1b54ec9a113e0e792984070b Mon Sep 17 00:00:00 2001 From: Igor Baiborodine Date: Mon, 5 Mar 2018 06:13:03 -0500 Subject: [PATCH] Upgrade to Vaadin v8.3.0 without v7 compatibility --- pom.xml | 134 +++----- .../vaadinspring/config/ServiceConfig.java | 8 + .../vaadinspring/domain/Account.java | 14 + .../vaadinspring/domain/BillingDetails.java | 16 + .../vaadinspring/domain/CartItem.java | 12 + .../jpetstore/vaadinspring/domain/Item.java | 14 +- .../jpetstore/vaadinspring/domain/Order.java | 4 + .../vaadinspring/domain/OrderDetails.java | 14 + .../jpetstore/vaadinspring/ui/AppUI.java | 8 +- .../jpetstore/vaadinspring/ui/MainView.java | 7 +- .../ui/component/CartItemListGrid.java | 129 ++++++++ .../ui/component/CartItemListTable.java | 145 --------- .../vaadinspring/ui/component/GridButton.java | 18 ++ .../ui/component/GridTextField.java | 16 + .../ui/component/ItemListTable.java | 61 ---- .../vaadinspring/ui/component/LeftNavBar.java | 7 +- .../ui/component/OrderListGrid.java | 41 +++ .../ui/component/OrderListTable.java | 34 --- .../ui/component/ProductItemListGrid.java | 71 +++++ ...uctListTable.java => ProductListGrid.java} | 27 +- .../vaadinspring/ui/component/TopNavBar.java | 8 +- .../ui/converter/BooleanConverter.java | 31 -- .../ui/converter/CurrencyConverter.java | 23 +- .../ui/converter/DateConverter.java | 41 --- .../vaadinspring/ui/form/AccountForm.java | 159 +++++----- .../ui/form/BillingDetailsForm.java | 148 +++++---- .../vaadinspring/ui/form/ProductItemForm.java | 71 +++-- .../ui/form/ShippingDetailsForm.java | 63 ++-- .../vaadinspring/ui/theme/JPetStoreTheme.java | 2 + .../vaadinspring/ui/util/CurrentCart.java | 14 +- .../vaadinspring/ui/view/AbstractView.java | 4 +- .../vaadinspring/ui/view/AccountView.java | 20 +- .../ui/view/AuthRequiredView.java | 2 +- .../ui/view/BillingDetailsView.java | 31 +- .../vaadinspring/ui/view/CartView.java | 18 +- .../ui/view/ConfirmOrderView.java | 28 +- .../vaadinspring/ui/view/ItemListView.java | 17 +- .../vaadinspring/ui/view/NewAccountView.java | 23 +- .../vaadinspring/ui/view/OrderListView.java | 18 +- .../vaadinspring/ui/view/ProductListView.java | 21 +- .../vaadinspring/ui/view/SearchView.java | 24 +- .../ui/view/ShippingDetailsView.java | 10 +- .../VAADIN/themes/jpetstoretheme/addons.scss | 10 - .../themes/jpetstoretheme/jpetstoretheme.scss | 13 +- .../VAADIN/themes/jpetstoretheme/styles.css | 289 +++++++++++++++++- 45 files changed, 1061 insertions(+), 807 deletions(-) create mode 100644 src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/CartItemListGrid.java delete mode 100644 src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/CartItemListTable.java create mode 100644 src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/GridButton.java create mode 100644 src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/GridTextField.java delete mode 100644 src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/ItemListTable.java create mode 100644 src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/OrderListGrid.java delete mode 100644 src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/OrderListTable.java create mode 100644 src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/ProductItemListGrid.java rename src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/{ProductListTable.java => ProductListGrid.java} (58%) delete mode 100644 src/main/java/com/kiroule/jpetstore/vaadinspring/ui/converter/BooleanConverter.java delete mode 100644 src/main/java/com/kiroule/jpetstore/vaadinspring/ui/converter/DateConverter.java diff --git a/pom.xml b/pom.xml index 19dd2e1..4267557 100644 --- a/pom.xml +++ b/pom.xml @@ -19,8 +19,8 @@ JPetStore Vaadin 8 with Spring Boot - 8.1.5 - 2.1.0.beta2 + 8.3.0 + 3.0.0 ${vaadin.version} 0.0.7.RELEASE @@ -60,15 +60,15 @@ com.vaadin - vaadin-compatibility-server + vaadin-server com.vaadin - vaadin-compatibility-client-compiled + vaadin-client-compiled com.vaadin - vaadin-compatibility-themes + vaadin-themes com.vaadin @@ -107,18 +107,8 @@ org.vaadin - viritin-v7-compatibility - 1.0 - - - org.vaadin.addons - formcheckbox - 1.0.2 - - - org.vaadin.addons - stepper - 2.4.0 + viritin + 2.3 @@ -181,105 +171,71 @@ guava 23.0 + + org.hibernate + hibernate-validator + 5.4.0.Final + + + org.glassfish.web + javax.el + 2.2.6 + - - org.springframework.boot - spring-boot-maven-plugin - - - org.apache.maven.plugins - maven-clean-plugin - 3.0.0 - - - - - ${basedir}/src/main/webapp/VAADIN/ - - - widgetsets/**/* - themes/styles.css - themes/styles.scss.cache - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.7.0 - - ${project.build.sourceEncoding} - ${maven.compiler.source} - ${maven.compiler.source} - - com.vaadin vaadin-maven-plugin - ${vaadin.version} + ${vaadin.plugin.version} + + + + xml-apis + xml-apis + 1.4.01 + + - ${vaadin.widgetset.mode} - -Xmx2g -Xss1024k - - ${basedir}/src/main/resources/VAADIN/widgetsets - - - - - - ${project.build.directory} - - ${project.build.directory}/gwt-deploy - false - true - - true - - + -Xmx1G - - - - - resources update-theme update-widgetset - compile-theme compile + compile-theme - org.apache.maven.plugins - maven-resources-plugin - 3.0.2 + org.springframework.boot + spring-boot-maven-plugin - ${project.build.sourceEncoding} + + + + + + org.apache.maven.plugins + maven-enforcer-plugin - copy-resources - prepare-package + enforce-no-snapshots - copy-resources + enforce - ${basedir}/target/classes/VAADIN - - - ${basedir}/src/main/resources/VAADIN - - + + + No Snapshots Allowed! + + + true diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/config/ServiceConfig.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/config/ServiceConfig.java index baec2ae..b8a6897 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/config/ServiceConfig.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/config/ServiceConfig.java @@ -8,6 +8,9 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; + +import javax.validation.Validator; /** * @author Igor Baiborodine @@ -35,4 +38,9 @@ public OrderService orderService() { public LoginService loginService() { return new LoginService(); } + + @Bean + public Validator validator() { + return new LocalValidatorFactoryBean(); + } } diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/domain/Account.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/domain/Account.java index 9cc2e2c..bebbbb4 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/domain/Account.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/domain/Account.java @@ -16,6 +16,8 @@ package com.kiroule.jpetstore.vaadinspring.domain; +import org.hibernate.validator.constraints.NotEmpty; + import java.io.Serializable; /** @@ -26,20 +28,32 @@ public class Account implements Serializable { private static final long serialVersionUID = 8751282105532159742L; + @NotEmpty private String username; + @NotEmpty private String password; + @NotEmpty private String email; + @NotEmpty private String firstName; + @NotEmpty private String lastName; private String status; + @NotEmpty private String address1; private String address2; + @NotEmpty private String city; + @NotEmpty private String state; + @NotEmpty private String zip; + @NotEmpty private String country; + @NotEmpty private String phone; private String favouriteCategoryId; + @NotEmpty private String languagePreference; private boolean listOption; private boolean bannerOption; diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/domain/BillingDetails.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/domain/BillingDetails.java index 1fb17d5..f9f800c 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/domain/BillingDetails.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/domain/BillingDetails.java @@ -16,6 +16,10 @@ package com.kiroule.jpetstore.vaadinspring.domain; +import com.google.common.base.MoreObjects; + +import org.hibernate.validator.constraints.NotEmpty; + /** * @author Igor Baiborodine * @@ -25,8 +29,11 @@ public class BillingDetails extends OrderDetails { private static final long serialVersionUID = 4974454158308328436L; // Payment method + @NotEmpty private String cardType; + @NotEmpty private String cardNumber; + @NotEmpty private String expiryDate; public BillingDetails() {} @@ -58,4 +65,13 @@ public String getExpiryDate() { public void setExpiryDate(String expiryDate) { this.expiryDate = expiryDate; } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("cardType", cardType) + .add("cardNumber", cardNumber) + .add("expiryDate", expiryDate) + .toString(); + } } \ No newline at end of file diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/domain/CartItem.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/domain/CartItem.java index 8884994..77f3d79 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/domain/CartItem.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/domain/CartItem.java @@ -70,6 +70,18 @@ public void incrementQuantity() { calculateTotal(); } + public String getDescription() { + return this.item.getDescription(); + } + + public String getProductId() { + return this.item.getProductId(); + } + + public BigDecimal getListPrice() { + return this.getItem().getListPrice(); + } + private void calculateTotal() { if (item != null && item.getListPrice() != null) { total = item.getListPrice().multiply(new BigDecimal(quantity)); diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/domain/Item.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/domain/Item.java index 6e023bf..eec852d 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/domain/Item.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/domain/Item.java @@ -42,7 +42,7 @@ public class Item implements Serializable { private String attribute4; private String attribute5; private Product product; - private int quantity; + private Integer quantity; public String getItemId() { return itemId; @@ -52,11 +52,11 @@ public void setItemId(String itemId) { this.itemId = itemId.trim(); } - public int getQuantity() { + public Integer getQuantity() { return quantity; } - public void setQuantity(int quantity) { + public void setQuantity(Integer quantity) { this.quantity = quantity; } @@ -148,6 +148,14 @@ public void setAttribute5(String attribute5) { this.attribute5 = attribute5; } + public String getDescription() { + return this.attribute1 + " " + this.getProduct().getName(); + } + + public String getProductDescription() { + return this.getProduct().getName(); + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/domain/Order.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/domain/Order.java index e0fb63c..fdac7a8 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/domain/Order.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/domain/Order.java @@ -274,6 +274,10 @@ public List getLineItems() { return lineItems; } + public String getShipToFullName() { + return this.shipToFirstName + " " + this.shipToLastName; + } + public void initOrder(String username, BillingDetails billingDetails, ShippingDetails shippingDetails, Cart cart) { this.username = username; diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/domain/OrderDetails.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/domain/OrderDetails.java index 15fc0f8..5b7ad7a 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/domain/OrderDetails.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/domain/OrderDetails.java @@ -16,6 +16,7 @@ package com.kiroule.jpetstore.vaadinspring.domain; +import org.hibernate.validator.constraints.NotEmpty; import org.springframework.beans.BeanUtils; import java.io.Serializable; @@ -26,18 +27,31 @@ */ public abstract class OrderDetails implements Serializable { + @NotEmpty protected String username; + @NotEmpty protected String password; + @NotEmpty protected String email; + @NotEmpty protected String firstName; + @NotEmpty protected String lastName; + @NotEmpty protected String status; + @NotEmpty protected String address1; + protected String address2; + @NotEmpty protected String city; + @NotEmpty protected String state; + @NotEmpty protected String zip; + @NotEmpty protected String country; + @NotEmpty protected String phone; public OrderDetails() {} diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/AppUI.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/AppUI.java index 24f726b..0d6fba0 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/AppUI.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/AppUI.java @@ -4,10 +4,8 @@ import com.kiroule.jpetstore.vaadinspring.ui.util.HasLogger; import com.vaadin.annotations.Theme; import com.vaadin.annotations.Title; -import com.vaadin.annotations.Widgetset; import com.vaadin.server.VaadinRequest; import com.vaadin.spring.annotation.SpringUI; -import com.vaadin.spring.navigator.SpringViewProvider; import com.vaadin.ui.UI; import org.springframework.beans.factory.annotation.Autowired; @@ -18,22 +16,18 @@ */ @Title("JPetStore Vaadin 8 Spring Demo") @Theme("jpetstoretheme") -@Widgetset("com.vaadin.v7.Vaadin7WidgetSet") @SpringUI public class AppUI extends UI implements HasLogger { private static final long serialVersionUID = 4670701701584923650L; private final NavigationManager navigationManager; - private final SpringViewProvider viewProvider; private final MainView mainView; private final EventBus.UIEventBus uiEventBus; @Autowired - public AppUI(NavigationManager navigationManager, SpringViewProvider viewProvider, MainView mainView, - EventBus.UIEventBus uiEventBus) { + public AppUI(NavigationManager navigationManager, MainView mainView, EventBus.UIEventBus uiEventBus) { this.navigationManager = navigationManager; - this.viewProvider = viewProvider; this.mainView = mainView; this.uiEventBus = uiEventBus; } diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/MainView.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/MainView.java index c69cee0..1efebb0 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/MainView.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/MainView.java @@ -28,8 +28,8 @@ import com.vaadin.server.VaadinSession; import com.vaadin.spring.annotation.SpringViewDisplay; import com.vaadin.spring.annotation.UIScope; -import com.vaadin.v7.ui.HorizontalLayout; -import com.vaadin.v7.ui.VerticalLayout; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.VerticalLayout; import org.springframework.beans.factory.annotation.Autowired; import org.vaadin.spring.events.annotation.EventBusListenerMethod; @@ -66,8 +66,11 @@ public MainView(NavigationManager navigationManager, LeftNavBar leftNavBar, TopN this.navBarButtonUpdater = navBarButtonUpdater; setSizeFull(); + setSpacing(false); addComponent(this.leftNavBar); + viewLayout.setMargin(false); + viewLayout.setSpacing(false); viewLayout.setSizeFull(); addComponent(viewLayout); setExpandRatio(viewLayout, 1.0f); diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/CartItemListGrid.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/CartItemListGrid.java new file mode 100644 index 0000000..fc36797 --- /dev/null +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/CartItemListGrid.java @@ -0,0 +1,129 @@ +package com.kiroule.jpetstore.vaadinspring.ui.component; + +import com.kiroule.jpetstore.vaadinspring.domain.CartItem; +import com.kiroule.jpetstore.vaadinspring.domain.Item; +import com.kiroule.jpetstore.vaadinspring.ui.event.UIChangeCartItemQuantityEvent; +import com.kiroule.jpetstore.vaadinspring.ui.event.UIRemoveItemFromCartEvent; +import com.kiroule.jpetstore.vaadinspring.ui.form.ProductItemForm; +import com.kiroule.jpetstore.vaadinspring.ui.theme.JPetStoreTheme; +import com.kiroule.jpetstore.vaadinspring.ui.util.CurrentCart; +import com.kiroule.jpetstore.vaadinspring.ui.util.HasLogger; +import com.kiroule.jpetstore.vaadinspring.ui.util.HasUIEventBus; +import com.vaadin.data.HasValue; +import com.vaadin.data.ValidationResult; +import com.vaadin.data.validator.RegexpValidator; +import com.vaadin.spring.annotation.SpringComponent; +import com.vaadin.spring.annotation.ViewScope; +import com.vaadin.ui.Button; +import com.vaadin.ui.Notification; +import com.vaadin.ui.TextField; + +import org.springframework.beans.factory.annotation.Autowired; +import org.vaadin.viritin.grid.MGrid; + +import java.text.NumberFormat; + +import static java.lang.String.format; + +/** + * @author Igor Baiborodine + */ +@SpringComponent +@ViewScope +public class CartItemListGrid extends MGrid implements HasUIEventBus, HasLogger { + + private static final long serialVersionUID = 6841591708524361792L; + + private final ProductItemForm productItemForm; + + @Autowired + public CartItemListGrid(ProductItemForm productItemForm) { + this.productItemForm = productItemForm; + + withFullWidth(); + // Item ID + addComponentColumn(cartItem -> { + Button itemIdButton = new GridButton(cartItem.getItem().getItemId(), this::viewDetails); + itemIdButton.setData(cartItem.getItem()); + itemIdButton.addStyleName(JPetStoreTheme.BUTTON_LINK); + return itemIdButton;}) + .setId("itemId") + .setCaption("Item ID"); + // Product ID + addColumn(CartItem::getProductId) + .setId("productId") + .setCaption("Product ID"); + // Description + addColumn(CartItem::getDescription) + .setId("description") + .setCaption("Description"); + // In Stock + addColumn(cartItem -> cartItem.isInStock() ? "yes" : "no") + .setId("inStock") + .setCaption("In Stock"); + // Quantity + addComponentColumn(cartItem -> this.createQuantityField(cartItem)) + .setId("quantity") + .setCaption("Quantity") + .setSortable(false); + // List Price + addColumn(cartItem -> NumberFormat.getCurrencyInstance().format(cartItem.getListPrice())) + .setId("listPrice") + .setCaption("List Price") + .setSortable(false); + // Total Cost + addColumn(cartItem -> NumberFormat.getCurrencyInstance().format(cartItem.getTotal())) + .setId("total") + .setCaption("Total") + .setSortable(false); + // Remove from Cart + addComponentColumn(cartItem -> + new GridButton("Remove", event -> { + if (CurrentCart.isEmpty()) { + return; + } + getUIEventBus().publish(this, new UIRemoveItemFromCartEvent(cartItem.getItem())); + })) + .setId("removeItem") + .setCaption("") + .setSortable(false); + } + + private TextField createQuantityField(CartItem cartItem) { + final TextField quantityField = new GridTextField(); + quantityField.setWidth(60f, Unit.PIXELS); + quantityField.addStyleName("align-right"); + quantityField.setValue(String.valueOf(cartItem.getQuantity())); + final RegexpValidator regexpValidator = new RegexpValidator("Numeric values only", "\\d+"); + + quantityField.addValueChangeListener((HasValue.ValueChangeListener) event -> { + if (((String) event.getValue()).isEmpty()) { + Notification.show("Must not be empty", Notification.Type.ERROR_MESSAGE); + return; + } + ValidationResult validationResult = regexpValidator.apply((String) event.getValue(), null); + CartItemListGrid.this.getLogger().debug("quantity validation result: {}", validationResult.isError()); + + if (!validationResult.isError()) { + Integer newQuantity = Integer.valueOf((String) event.getValue()); + CartItemListGrid.this.getUIEventBus().publish(CartItemListGrid.this, new UIChangeCartItemQuantityEvent( + cartItem.getItem(), newQuantity - cartItem.getQuantity())); + } else { + Notification.show("Numeric values only", Notification.Type.ERROR_MESSAGE); + return; + } + }); + return quantityField; + } + + private void viewDetails(Button.ClickEvent event) { + productItemForm.getAddToCartButton().setVisible(false); + Item item = (Item) event.getButton().getData(); + productItemForm.setEntity(item); + productItemForm.openInModalPopup().setCaption(getPopupCaption(item)); + } + + private String getPopupCaption(Item item) { + return format("%s | %s", item.getProductId(), item.getProduct().getName()); + } +} \ No newline at end of file diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/CartItemListTable.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/CartItemListTable.java deleted file mode 100644 index 8e75aa4..0000000 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/CartItemListTable.java +++ /dev/null @@ -1,145 +0,0 @@ -package com.kiroule.jpetstore.vaadinspring.ui.component; - -import com.kiroule.jpetstore.vaadinspring.domain.CartItem; -import com.kiroule.jpetstore.vaadinspring.domain.Item; -import com.kiroule.jpetstore.vaadinspring.ui.converter.BooleanConverter; -import com.kiroule.jpetstore.vaadinspring.ui.converter.CurrencyConverter; -import com.kiroule.jpetstore.vaadinspring.ui.event.UIChangeCartItemQuantityEvent; -import com.kiroule.jpetstore.vaadinspring.ui.event.UIRemoveItemFromCartEvent; -import com.kiroule.jpetstore.vaadinspring.ui.form.ProductItemForm; -import com.kiroule.jpetstore.vaadinspring.ui.theme.JPetStoreTheme; -import com.kiroule.jpetstore.vaadinspring.ui.util.CurrentCart; -import com.kiroule.jpetstore.vaadinspring.ui.util.HasUIEventBus; -import com.vaadin.spring.annotation.SpringComponent; -import com.vaadin.spring.annotation.ViewScope; -import com.vaadin.ui.Button; -import com.vaadin.ui.Component; -import com.vaadin.ui.Notification; -import com.vaadin.ui.UI; -import com.vaadin.v7.data.Validator; -import com.vaadin.v7.data.validator.RegexpValidator; -import com.vaadin.v7.ui.TextField; - -import org.springframework.beans.factory.annotation.Autowired; -import org.vaadin.viritinv7.fields.MTable; -import org.vaadin.viritinv7.fields.MTextField; - -import java.math.BigDecimal; - -import static java.lang.String.format; - -/** - * @author Igor Baiborodine - */ -@SpringComponent -@ViewScope -public class CartItemListTable extends MTable implements HasUIEventBus { - - private static final long serialVersionUID = 6841591708524361792L; - - @Autowired - private ProductItemForm productItemForm; - - public CartItemListTable() { - - addContainerProperty("listPrice", BigDecimal.class, new BigDecimal("0.0")); - addContainerProperty("productId", String.class, "XX-XX-00"); - addContainerProperty("description", String.class, "Not Defined"); - addContainerProperty("removeFromCart", Component.class, null); - - withProperties("itemId", "productId", "description", "inStock", "quantity", "listPrice", "total", "removeFromCart"); - withColumnHeaders("Item ID", "Product ID", "Description", "In Stock", "Quantity", "List Price", "Total Cost", ""); - setSortableProperties("itemId", "productId", "description", "inStock"); - - withGeneratedColumn("itemId", cartItem -> { - Button itemIdButton = new Button(cartItem.getItem().getItemId(), this::viewDetails); - itemIdButton.setData(cartItem.getItem()); - itemIdButton.addStyleName(JPetStoreTheme.BUTTON_LINK); - return itemIdButton; - }); - - withGeneratedColumn("listPrice", cartItem -> { - // setting a converter on this column will not work, thus format the value explicitly - return convertToCurrencyPresentation(cartItem.getItem().getListPrice()); - }); - withGeneratedColumn("productId", cartItem -> cartItem.getItem().getProductId()); - withGeneratedColumn("description", - cartItem -> cartItem.getItem().getAttribute1() + " " + cartItem.getItem().getProduct().getName()); - withGeneratedColumn("quantity", this::createQuantityField); - withGeneratedColumn("removeFromCart", - cartItem -> new Button("Remove", event -> { - if (CurrentCart.isEmpty()) { - return; - } - getUIEventBus().publish(this, new UIRemoveItemFromCartEvent(cartItem.getItem())); - } - )); - - setConverter("inStock", new BooleanConverter()); - setConverter("total", new CurrencyConverter()); - withFullWidth(); - } - - private TextField createQuantityField(CartItem cartItem) { - final TextField quantityField = new MTextField(); - quantityField.setNullSettingAllowed(false); - quantityField.setWidth(60f, Unit.PIXELS); - quantityField.addStyleName("align-right"); - quantityField.setValue(String.valueOf(cartItem.getQuantity())); - final RegexpValidator regexpValidator = new RegexpValidator("\\d+", "Numeric values only"); - - quantityField.addValueChangeListener((ValueChangeListener) event -> { - if (((String) event.getProperty().getValue()).isEmpty()) { - Notification.show("Must not be empty", Notification.Type.ERROR_MESSAGE); - return; - } - boolean valid = true; - try { - regexpValidator.validate(event.getProperty().getValue()); - } catch (Validator.InvalidValueException e) { - valid = false; - } - if (valid) { - Integer newQuantity = Integer.valueOf((String) event.getProperty().getValue()); - getUIEventBus().publish(this, new UIChangeCartItemQuantityEvent( - cartItem.getItem(), newQuantity - cartItem.getQuantity())); - } else { - Notification.show("Numeric values only", Notification.Type.ERROR_MESSAGE); - } - }); - return quantityField; -// TODO: use stepper after migrating to v8 without v7 compatibility mode -// IntStepper quantityStepper = new IntStepper(); -// quantityStepper.setMinValue(1); -// quantityStepper.setMaxValue(99); -// quantityStepper.setWidth(60f, Unit.PIXELS); -// quantityStepper.setManualInputAllowed(false); -// quantityStepper.setValue(cartItem.getQuantity()); -// quantityStepper.addValueChangeListener(event -> { -// if (CartItemListTable.this.isReadOnly()) { -// event.getSource().setValue(cartItem.getQuantity()); -// return; -// } -// Integer newQuantity = event.getSource().getValue(); -// getUIEventBus().publish(this, new UIChangeCartItemQuantityEvent(cartItem.getItem(), newQuantity - cartItem.getQuantity())); -// }); -// return quantityStepper; - } - - private void viewDetails(Button.ClickEvent event) { - if (isReadOnly()) { - productItemForm.getAddToCartButton().setEnabled(false); - } - Item item = (Item) event.getButton().getData(); - productItemForm.setEntity(item); - productItemForm.openInModalPopup().setCaption(getPopupCaption(item)); - } - - private String getPopupCaption(Item item) { - return format("%s | %s", item.getProductId(), item.getProduct().getName()); - } - - private String convertToCurrencyPresentation(BigDecimal value) { - return new CurrencyConverter().convertToPresentation(value, String.class, UI.getCurrent().getLocale()); - } -} \ No newline at end of file diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/GridButton.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/GridButton.java new file mode 100644 index 0000000..e4cd9ae --- /dev/null +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/GridButton.java @@ -0,0 +1,18 @@ +package com.kiroule.jpetstore.vaadinspring.ui.component; + +import com.kiroule.jpetstore.vaadinspring.ui.theme.JPetStoreTheme; +import com.vaadin.ui.Button; + +/** + * @author Igor Baiborodine + */ +public class GridButton extends Button { + + public GridButton() { + } + + public GridButton(String caption, ClickListener listener) { + super(caption, listener); + addStyleName(JPetStoreTheme.GRID_BUTTON); + } +} diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/GridTextField.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/GridTextField.java new file mode 100644 index 0000000..ac4bc22 --- /dev/null +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/GridTextField.java @@ -0,0 +1,16 @@ +package com.kiroule.jpetstore.vaadinspring.ui.component; + +import com.kiroule.jpetstore.vaadinspring.ui.theme.JPetStoreTheme; + +import org.vaadin.viritin.fields.MTextField; + +/** + * @author Igor Baiborodine + */ +public class GridTextField extends MTextField { + + public GridTextField() { + super(); + addStyleName(JPetStoreTheme.GRID_TEXTFIELD); + } +} diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/ItemListTable.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/ItemListTable.java deleted file mode 100644 index b87b100..0000000 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/ItemListTable.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.kiroule.jpetstore.vaadinspring.ui.component; - -import com.kiroule.jpetstore.vaadinspring.domain.Item; -import com.kiroule.jpetstore.vaadinspring.ui.converter.CurrencyConverter; -import com.kiroule.jpetstore.vaadinspring.ui.event.UIAddItemToCartEvent; -import com.kiroule.jpetstore.vaadinspring.ui.form.ProductItemForm; -import com.kiroule.jpetstore.vaadinspring.ui.theme.JPetStoreTheme; -import com.kiroule.jpetstore.vaadinspring.ui.util.HasUIEventBus; -import com.vaadin.spring.annotation.SpringComponent; -import com.vaadin.spring.annotation.ViewScope; -import com.vaadin.ui.Button; -import com.vaadin.ui.Component; - -import org.springframework.beans.factory.annotation.Autowired; -import org.vaadin.viritinv7.fields.MTable; - -import static java.lang.String.format; - -/** - * @author Igor Baiborodine - */ -@SpringComponent -@ViewScope -public class ItemListTable extends MTable implements HasUIEventBus { - - private static final long serialVersionUID = -2847546238729364925L; - - @Autowired - private ProductItemForm productItemForm; - - public ItemListTable() { - - addContainerProperty("addToCart", Component.class, null); - addContainerProperty("description", String.class, "Not defined"); - - withProperties("itemId", "description", "listPrice", "addToCart"); - withColumnHeaders("Item ID", "Description", "List Price", ""); - setSortableProperties("itemId", "listPrice"); - withGeneratedColumn("itemId", item -> { - Button itemIdButton = new Button(item.getItemId(), this::viewDetails); - itemIdButton.addStyleName(JPetStoreTheme.BUTTON_LINK); - itemIdButton.setData(item); - return itemIdButton; - }); - withGeneratedColumn("description", item -> item.getAttribute1() + " " + item.getProduct().getName()); - withGeneratedColumn("addToCart", - item -> new Button("Add to Cart", event -> getUIEventBus().publish(this, new UIAddItemToCartEvent(item)))); - setConverter("listPrice", new CurrencyConverter()); - withFullWidth(); - } - - private void viewDetails(Button.ClickEvent event) { - Item item = (Item) event.getButton().getData(); - productItemForm.setEntity(item); - productItemForm.openInModalPopup().setCaption(getPopupCaption(item)); - } - - private String getPopupCaption(Item item) { - return format("%s | %s", item.getProductId(), item.getProduct().getName()); - } -} \ No newline at end of file diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/LeftNavBar.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/LeftNavBar.java index 74c6bba..73cab20 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/LeftNavBar.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/LeftNavBar.java @@ -9,8 +9,10 @@ import com.vaadin.spring.annotation.UIScope; import com.vaadin.ui.Button; import com.vaadin.ui.CssLayout; -import com.vaadin.v7.shared.ui.label.ContentMode; -import com.vaadin.v7.ui.Label; +import com.vaadin.shared.ui.ContentMode; +import com.vaadin.ui.Label; + +import org.springframework.beans.factory.annotation.Autowired; import javax.annotation.PostConstruct; @@ -25,6 +27,7 @@ public class LeftNavBar extends CssLayout implements HasUIEventBus { private final NavBarButtonUpdater navBarButtonUpdater; + @Autowired public LeftNavBar(NavBarButtonUpdater navBarButtonUpdater) { this.navBarButtonUpdater = navBarButtonUpdater; } diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/OrderListGrid.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/OrderListGrid.java new file mode 100644 index 0000000..657e39e --- /dev/null +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/OrderListGrid.java @@ -0,0 +1,41 @@ +package com.kiroule.jpetstore.vaadinspring.ui.component; + +import com.kiroule.jpetstore.vaadinspring.domain.Order; +import com.vaadin.spring.annotation.SpringComponent; +import com.vaadin.spring.annotation.ViewScope; + +import org.vaadin.viritin.grid.MGrid; + +import java.text.NumberFormat; +import java.text.SimpleDateFormat; + +/** + * @author Igor Baiborodine + */ +@SpringComponent +@ViewScope +public class OrderListGrid extends MGrid { + + private static final long serialVersionUID = -2208557159696611423L; + + public OrderListGrid() { + withFullWidth(); + + addColumn(Order::getOrderId) + .setCaption("Order ID") + .setSortable(true); + + addColumn(order -> new SimpleDateFormat("dd-MMM-yyyy").format(order.getOrderDate())) + .setCaption("Order Placed") + .setSortable(true); + + addColumn(order -> NumberFormat.getCurrencyInstance().format(order.getTotalPrice())) + .setCaption("Total") + .setSortable(false); + + addColumn(Order::getShipToFullName) + .setId("shipTo") + .setCaption("Ship to") + .setSortable(false); + } +} \ No newline at end of file diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/OrderListTable.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/OrderListTable.java deleted file mode 100644 index 165f76e..0000000 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/OrderListTable.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.kiroule.jpetstore.vaadinspring.ui.component; - -import com.kiroule.jpetstore.vaadinspring.domain.Order; -import com.kiroule.jpetstore.vaadinspring.ui.converter.CurrencyConverter; -import com.kiroule.jpetstore.vaadinspring.ui.converter.DateConverter; -import com.vaadin.spring.annotation.SpringComponent; -import com.vaadin.spring.annotation.ViewScope; - -import org.vaadin.viritinv7.fields.MTable; - -/** - * @author Igor Baiborodine - */ -@SpringComponent -@ViewScope -public class OrderListTable extends MTable { - - private static final long serialVersionUID = -2208557159696611423L; - - public OrderListTable() { - - addContainerProperty("shipTo", String.class, "Not Defined"); - - withProperties("orderId", "orderDate", "totalPrice", "shipTo"); - withColumnHeaders("Order ID", "Order Placed", "Total", "Ship to"); - setSortableProperties("productId", "orderDate"); - withGeneratedColumn("orderId", entity -> String.valueOf(entity.getOrderId())); - withGeneratedColumn("shipTo", entity -> entity.getShipToFirstName() + " " + entity.getShipToLastName()); - - setConverter("orderDate", new DateConverter()); - setConverter("totalPrice", new CurrencyConverter()); - withFullWidth(); - } -} \ No newline at end of file diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/ProductItemListGrid.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/ProductItemListGrid.java new file mode 100644 index 0000000..d1a747f --- /dev/null +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/ProductItemListGrid.java @@ -0,0 +1,71 @@ +package com.kiroule.jpetstore.vaadinspring.ui.component; + +import com.kiroule.jpetstore.vaadinspring.domain.Item; +import com.kiroule.jpetstore.vaadinspring.ui.event.UIAddItemToCartEvent; +import com.kiroule.jpetstore.vaadinspring.ui.form.ProductItemForm; +import com.kiroule.jpetstore.vaadinspring.ui.theme.JPetStoreTheme; +import com.kiroule.jpetstore.vaadinspring.ui.util.HasUIEventBus; +import com.vaadin.spring.annotation.SpringComponent; +import com.vaadin.spring.annotation.ViewScope; +import com.vaadin.ui.Button; +import com.vaadin.ui.renderers.NumberRenderer; + +import org.springframework.beans.factory.annotation.Autowired; +import org.vaadin.viritin.grid.MGrid; + +import java.text.NumberFormat; + +import static java.lang.String.format; + +/** + * @author Igor Baiborodine + */ +@SpringComponent +@ViewScope +public class ProductItemListGrid extends MGrid implements HasUIEventBus { + + private static final long serialVersionUID = -2847546238729364925L; + + private final ProductItemForm productItemForm; + + @Autowired + public ProductItemListGrid(ProductItemForm productItemForm) { + this.productItemForm = productItemForm; + + withFullWidth(); + + addComponentColumn(item -> { + Button itemIdButton = new GridButton(item.getItemId(), this::viewDetails); + itemIdButton.addStyleName(JPetStoreTheme.BUTTON_LINK); + itemIdButton.setData(item); + return itemIdButton; + }) + .setId("itemId") + .setCaption("Item ID"); + + addColumn(Item::getDescription) + .setId("description") + .setCaption("Description"); + + addComponentColumn(item -> new GridButton("Add to Cart", + event -> getUIEventBus().publish(this, new UIAddItemToCartEvent(item))) + ) + .setId("addToCart") + .setCaption("") + .setSortable(false); + + addColumn(Item::getListPrice, new NumberRenderer(NumberFormat.getCurrencyInstance())) + .setId("listPrice") + .setCaption("List Price"); + } + + private void viewDetails(Button.ClickEvent event) { + Item item = (Item) event.getButton().getData(); + productItemForm.setEntity(item); + productItemForm.openInModalPopup().setCaption(getPopupCaption(item)); + } + + private String getPopupCaption(Item item) { + return format("%s | %s", item.getProductId(), item.getProduct().getName()); + } +} \ No newline at end of file diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/ProductListTable.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/ProductListGrid.java similarity index 58% rename from src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/ProductListTable.java rename to src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/ProductListGrid.java index 06fcf3b..08aca03 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/ProductListTable.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/ProductListGrid.java @@ -8,30 +8,33 @@ import com.vaadin.spring.annotation.ViewScope; import com.vaadin.ui.Button; -import org.vaadin.viritinv7.fields.MTable; +import org.vaadin.viritin.grid.MGrid; /** * @author Igor Baiborodine */ @SpringComponent @ViewScope -public class ProductListTable extends MTable implements HasUIEventBus { +public class ProductListGrid extends MGrid implements HasUIEventBus { private static final long serialVersionUID = 2029031508462137840L; - public ProductListTable() { + public ProductListGrid() { + withFullWidth(); - withProperties("productId", "name"); - withColumnHeaders("Product ID", "Name"); - setSortableProperties("productId", "name"); - withGeneratedColumn("productId", entity -> { - String uri = ItemListView.VIEW_NAME + "/" + entity.getProductId(); - Button inventoryButton = new Button(entity.getProductId(), + addComponentColumn(product -> { + String uri = ItemListView.VIEW_NAME + "/" + product.getProductId(); + Button inventoryButton = new GridButton(product.getProductId(), event -> getUIEventBus().publish(this, new UINavigationEvent(uri))); - inventoryButton.setData(entity.getProductId()); + inventoryButton.setData(product.getProductId()); inventoryButton.addStyleName("link"); return inventoryButton; - }); - withFullWidth(); + }) + .setId("productId") + .setCaption("Product ID"); + + addColumn(Product::getName) + .setId("name") + .setCaption("Name"); } } diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/TopNavBar.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/TopNavBar.java index 937ab32..0dd7f45 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/TopNavBar.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/component/TopNavBar.java @@ -24,8 +24,10 @@ import com.vaadin.ui.Notification; import com.vaadin.ui.UI; import com.vaadin.ui.Window; -import com.vaadin.v7.ui.Label; -import com.vaadin.v7.ui.TextField; +import com.vaadin.ui.Label; +import com.vaadin.ui.TextField; + +import org.springframework.beans.factory.annotation.Autowired; import javax.annotation.PostConstruct; import javax.security.auth.login.LoginException; @@ -53,6 +55,7 @@ public class TopNavBar extends CssLayout implements HasUIEventBus { private Button signoutButton; private Label userLabel; + @Autowired public TopNavBar(NavBarButtonUpdater navBarButtonUpdater, SigninForm signinForm, LoginService loginService) { this.navBarButtonUpdater = navBarButtonUpdater; this.signinForm = signinForm; @@ -67,7 +70,6 @@ void init() { final TextField searchTextField = new TextField(); searchTextField.setDescription("Product's name contains"); - searchTextField.setImmediate(true); searchTextField.addShortcutListener(new ShortcutListener("enter-shortcut", ShortcutAction.KeyCode.ENTER, null) { private static final long serialVersionUID = 4638926023595229738L; @Override diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/converter/BooleanConverter.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/converter/BooleanConverter.java deleted file mode 100644 index cebb01a..0000000 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/converter/BooleanConverter.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.kiroule.jpetstore.vaadinspring.ui.converter; - -import com.vaadin.v7.data.util.converter.Converter; - -import java.util.Locale; - -/** - * @author Igor Baiborodine - */ -public class BooleanConverter implements Converter { - - @Override - public Boolean convertToModel(String s, Class aClass, Locale locale) throws ConversionException { - return null; - } - - @Override - public String convertToPresentation(Boolean aBoolean, Class aClass, Locale locale) throws ConversionException { - return aBoolean ? "yes" : "no"; - } - - @Override - public Class getModelType() { - return Boolean.class; - } - - @Override - public Class getPresentationType() { - return String.class; - } -} diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/converter/CurrencyConverter.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/converter/CurrencyConverter.java index 1e46df7..b34c605 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/converter/CurrencyConverter.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/converter/CurrencyConverter.java @@ -1,35 +1,28 @@ package com.kiroule.jpetstore.vaadinspring.ui.converter; -import com.vaadin.v7.data.util.converter.Converter; +import com.vaadin.data.Converter; +import com.vaadin.data.Result; +import com.vaadin.data.ValueContext; import java.math.BigDecimal; import java.text.NumberFormat; -import java.util.Locale; /** * @author Igor Baiborodine */ public class CurrencyConverter implements Converter { - NumberFormat formatter = NumberFormat.getCurrencyInstance(); + private static final long serialVersionUID = -904416628121822435L; + + private final NumberFormat formatter = NumberFormat.getCurrencyInstance(); @Override - public BigDecimal convertToModel(String value, Class targetType, Locale locale) throws ConversionException { + public Result convertToModel(String value, ValueContext context) { return null; } @Override - public String convertToPresentation(BigDecimal value, Class targetType, Locale locale) throws ConversionException { + public String convertToPresentation(BigDecimal value, ValueContext context) { return formatter.format(value); } - - @Override - public Class getModelType() { - return BigDecimal.class; - } - - @Override - public Class getPresentationType() { - return String.class; - } } diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/converter/DateConverter.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/converter/DateConverter.java deleted file mode 100644 index 12e2842..0000000 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/converter/DateConverter.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.kiroule.jpetstore.vaadinspring.ui.converter; - -import com.vaadin.v7.data.util.converter.Converter; - -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; - -/** - * @author Igor Baiborodine - */ -public class DateConverter implements Converter { - - private static final long serialVersionUID = 6226046049923436569L; - - @Override - public Date convertToModel(String value, Class targetType, Locale locale) throws ConversionException { - return null; - } - - @Override - public String convertToPresentation(Date value, Class targetType, Locale locale) - throws ConversionException { - SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy"); - - if (value != null) { - return sdf.format(value); - } - return null; - } - - @Override - public Class getModelType() { - return Date.class; - } - - @Override - public Class getPresentationType() { - return String.class; - } -} \ No newline at end of file diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/form/AccountForm.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/form/AccountForm.java index bc41d19..5757422 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/form/AccountForm.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/form/AccountForm.java @@ -1,32 +1,28 @@ package com.kiroule.jpetstore.vaadinspring.ui.form; -import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import com.eijsink.vaadin.components.formcheckbox.FormCheckBox; import com.kiroule.jpetstore.vaadinspring.domain.Account; import com.kiroule.jpetstore.vaadinspring.domain.Banner; import com.kiroule.jpetstore.vaadinspring.domain.Category; import com.kiroule.jpetstore.vaadinspring.service.CatalogService; import com.kiroule.jpetstore.vaadinspring.ui.theme.JPetStoreTheme; +import com.vaadin.shared.ui.ContentMode; import com.vaadin.spring.annotation.SpringComponent; import com.vaadin.spring.annotation.ViewScope; +import com.vaadin.ui.CheckBox; +import com.vaadin.ui.ComboBox; import com.vaadin.ui.Component; -import com.vaadin.ui.Notification; -import com.vaadin.ui.Panel; -import com.vaadin.v7.data.Validator; -import com.vaadin.v7.shared.ui.label.ContentMode; -import com.vaadin.v7.ui.ComboBox; -import com.vaadin.v7.ui.Field; import com.vaadin.ui.HorizontalLayout; -import com.vaadin.v7.ui.Label; -import com.vaadin.v7.ui.PasswordField; +import com.vaadin.ui.Label; +import com.vaadin.ui.Panel; +import com.vaadin.ui.PasswordField; import org.springframework.beans.factory.annotation.Autowired; +import org.vaadin.viritin.fields.MTextField; +import org.vaadin.viritin.form.AbstractForm; import org.vaadin.viritin.layouts.MFormLayout; import org.vaadin.viritin.layouts.MVerticalLayout; -import org.vaadin.viritinv7.fields.MTextField; -import org.vaadin.viritinv7.form.AbstractForm; import java.util.Comparator; import java.util.List; @@ -35,7 +31,6 @@ import javax.annotation.PostConstruct; -import static com.google.common.base.Strings.isNullOrEmpty; import static com.google.common.collect.Lists.newArrayList; /** @@ -47,8 +42,7 @@ public class AccountForm extends AbstractForm { private static final long serialVersionUID = 3039694090615398389L; - @Autowired - private CatalogService catalogService; + private final CatalogService catalogService; // Sign on private MTextField username = new MTextField("Username"); @@ -56,10 +50,10 @@ public class AccountForm extends AbstractForm { private PasswordField passwordConfirmation = new PasswordField("Password Confirmation"); // Profile - private ComboBox languagePreference = new ComboBox("Language Preference"); - private ComboBox favouriteCategoryId = new ComboBox("Favourite Category"); - private FormCheckBox listOption = new FormCheckBox("Wish List"); - private FormCheckBox bannerOption = new FormCheckBox("Show Banner"); + private ComboBox languagePreference = createLanguagePreferenceComboBox(); + private ComboBox favouriteCategoryId = createFavoriteCategoryComboBox(); + private CheckBox listOption = new CheckBox("Wish List"); + private CheckBox bannerOption = new CheckBox("Show Banner"); private Label bannerImage = new Label(); // User @@ -75,19 +69,45 @@ public class AccountForm extends AbstractForm { private MTextField country = new MTextField("Country"); private Map categoryIdToBannerNameMap = Maps.newHashMap(); + private Map categoryIdToNameMap = Maps.newHashMap(); private List categories = newArrayList(); + public enum Mode { + ADD, EDIT + } + + @Autowired + public AccountForm(CatalogService catalogService) { + super(Account.class); + this.catalogService = catalogService; + } + @PostConstruct public void init() { + setHeightUndefined(); + + setStyleName(JPetStoreTheme.BASE_FORM); + email.setStyleName(JPetStoreTheme.WIDE_TEXT_FIELD); + address1.setStyleName(JPetStoreTheme.WIDE_TEXT_FIELD); + address2.setStyleName(JPetStoreTheme.WIDE_TEXT_FIELD); + + bannerImage.setCaption("Banner Image"); + bannerImage.setContentMode(ContentMode.HTML); + bannerImage.setWidth(300, Unit.PIXELS); + bannerImage.setStyleName(JPetStoreTheme.BANNER); categoryIdToBannerNameMap = catalogService.getBannerList().stream() .collect(Collectors.toMap(Banner::getFavouriteCategoryId, Banner::getBannerName)); categories = catalogService.getCategoryList(); categories.sort(Comparator.comparing(Category::getName)); + categoryIdToNameMap = categories.stream() + .collect(Collectors.toMap(Category::getCategoryId, Category::getName)); - setStyleName(JPetStoreTheme.BASE_FORM); - setEagerValidation(false); - setHeightUndefined(); + initBindings(); + setListeners(); + + favouriteCategoryId.setItems(categoryIdToNameMap.keySet()); + favouriteCategoryId.setItemCaptionGenerator(categoryIdToNameMap::get); } public void setReadOnlyFields(Mode mode) { @@ -101,7 +121,7 @@ public HorizontalLayout getToolbar(Mode mode) { getSaveButton().setVisible(true); getResetButton().setVisible(true); - if (Mode.INSERT.equals(mode)) { + if (Mode.ADD.equals(mode)) { getResetButton().setCaption("Clear"); } if (Mode.EDIT.equals(mode)) { @@ -115,48 +135,9 @@ public void clear() { passwordConfirmation.clear(); } - public enum Mode { - INSERT, EDIT - } - - public boolean validate() { - - try { - getFieldGroup().getFields().forEach(field -> { - field.focus(); - field.validate(); - }); - validatePasswordConfirmation(); - } catch (Validator.InvalidValueException e) { - Notification.show(e.getMessage(), Notification.Type.ERROR_MESSAGE); - return false; - } - return true; - } - @Override protected Component createContent() { - password.setNullRepresentation(""); - email.setStyleName(JPetStoreTheme.WIDE_TEXT_FIELD); - address1.setStyleName(JPetStoreTheme.WIDE_TEXT_FIELD); - address2.setStyleName(JPetStoreTheme.WIDE_TEXT_FIELD); - - // TODO: investigate if it's needed in v.8 -// listOption.setImmediate(true); -// bannerOption.setImmediate(true); - - bannerImage.setCaption("Banner Image"); - bannerImage.setContentMode(ContentMode.HTML); - bannerImage.setWidth(300, Unit.PIXELS); - bannerImage.setStyleName(JPetStoreTheme.BANNER); - - setLanguagePreferenceCombo(); - setFavouriteCategoryCombo(); - setRequiredFields(username, password, languagePreference, firstName, lastName, email, phone, - address1, city, state, zip, country); - setListeners(); - MFormLayout signonFormLayout = new MFormLayout(username, password, passwordConfirmation).withWidth("-1px"); MFormLayout accountFormLayout = new MFormLayout(firstName, lastName, email, phone, address1, address2, city, state, zip, country).withWidth("-1px"); @@ -185,42 +166,42 @@ private void setListeners() { }); } - private void setLanguagePreferenceCombo() { - languagePreference.addItem("English"); - languagePreference.addItem("Komi"); - languagePreference.addItem("Russian"); + private ComboBox createFavoriteCategoryComboBox() { + return new ComboBox<>("Favourite Category"); } - private void setFavouriteCategoryCombo() { - - categories.forEach(category -> { - favouriteCategoryId.addItem(category.getCategoryId()); - favouriteCategoryId.setItemCaption(category.getCategoryId(), category.getName()); - }); - favouriteCategoryId.setNullSelectionAllowed(false); + private ComboBox createLanguagePreferenceComboBox() { + ComboBox comboBox = new ComboBox<>("Language Preference"); + comboBox.setEmptySelectionAllowed(false); + comboBox.setItems("English", "Komi", "Russian"); + return comboBox; } - private void setRequiredFields(Field... fields) { + private void initBindings() { + // explicit binding for combo boxes and password field + getBinder() + .forField(languagePreference) + .bind("languagePreference"); - Lists.newArrayList(fields).forEach(field -> { - field.setRequired(true); - field.setRequiredError(field.getCaption() + " is required"); - }); - passwordConfirmation.setRequired(true); - } + getBinder() + .forField(favouriteCategoryId) + .bind("favouriteCategoryId"); - private void validatePasswordConfirmation() { + getBinder() + .forField(password) + .bind("password"); - passwordConfirmation.focus(); - if (isNullOrEmpty(passwordConfirmation.getValue())) { - throw new Validator.InvalidValueException("Password Confirmation is required"); - } - if (!passwordConfirmation.getValue().equals(getEntity().getPassword())) { - throw new Validator.InvalidValueException("Confirmation Password is not identical"); - } + getBinder() + .forField(passwordConfirmation) + .withValidator(value -> value.equals(password.getValue()), "Confirmation Password is not identical") + .bind("password"); } private String getBannerStyleName(String bannerName) { - return bannerName.contains("reptiles") ? JPetStoreTheme.BANNER_2 : JPetStoreTheme.BANNER; + String bannerTheme = JPetStoreTheme.BANNER; + if (bannerName.contains("reptiles")) { + bannerTheme = JPetStoreTheme.BANNER_2; + } + return bannerTheme; } } \ No newline at end of file diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/form/BillingDetailsForm.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/form/BillingDetailsForm.java index c2fc837..6d6fa36 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/form/BillingDetailsForm.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/form/BillingDetailsForm.java @@ -1,126 +1,120 @@ package com.kiroule.jpetstore.vaadinspring.ui.form; -import com.google.common.collect.Lists; - import com.kiroule.jpetstore.vaadinspring.domain.BillingDetails; +import com.kiroule.jpetstore.vaadinspring.domain.ShippingDetails; +import com.kiroule.jpetstore.vaadinspring.ui.event.UINavigationEvent; import com.kiroule.jpetstore.vaadinspring.ui.theme.JPetStoreTheme; +import com.kiroule.jpetstore.vaadinspring.ui.util.CurrentCart; +import com.kiroule.jpetstore.vaadinspring.ui.util.HasUIEventBus; +import com.kiroule.jpetstore.vaadinspring.ui.view.ConfirmOrderView; +import com.kiroule.jpetstore.vaadinspring.ui.view.ShippingDetailsView; +import com.vaadin.data.BinderValidationStatus; import com.vaadin.spring.annotation.SpringComponent; import com.vaadin.spring.annotation.ViewScope; +import com.vaadin.ui.CheckBox; +import com.vaadin.ui.ComboBox; import com.vaadin.ui.Component; -import com.vaadin.ui.Notification; import com.vaadin.ui.Panel; -import com.vaadin.v7.ui.CheckBox; -import com.vaadin.v7.data.Validator; -import com.vaadin.v7.ui.ComboBox; -import com.vaadin.v7.ui.Field; -import com.vaadin.v7.ui.TextField; +import com.vaadin.ui.TextField; +import org.vaadin.viritin.fields.MTextField; +import org.vaadin.viritin.form.AbstractForm; import org.vaadin.viritin.layouts.MFormLayout; import org.vaadin.viritin.layouts.MVerticalLayout; -import org.vaadin.viritinv7.fields.MTextField; -import org.vaadin.viritinv7.form.AbstractForm; import javax.annotation.PostConstruct; +import static com.kiroule.jpetstore.vaadinspring.ui.util.CurrentCart.Key.BILLING_DETAILS; + /** * @author Igor Baiborodine */ @SpringComponent @ViewScope -public class BillingDetailsForm extends AbstractForm { +public class BillingDetailsForm extends AbstractForm implements HasUIEventBus { private static final long serialVersionUID = 9027401445749403710L; // Payment method - private ComboBox cardType = new ComboBox("Card Type"); - private MTextField cardNumber = new MTextField("Card Number").withNullRepresentation(""); - private MTextField expiryDate = new MTextField("Expiry Date (MM/YYYY)").withNullRepresentation(""); + private ComboBox cardType = createCardTypeCombo(); + private MTextField cardNumber = new MTextField("Card Number"); + private MTextField expiryDate = new MTextField("Expiry Date (MM/YYYY)"); // Billing address - private TextField firstName = new MTextField("First Name").withNullRepresentation(""); - private TextField lastName = new MTextField("LastName").withNullRepresentation(""); - private TextField email = new MTextField("Email").withNullRepresentation(""); - private TextField phone = new MTextField("Phone").withNullRepresentation(""); - private TextField address1 = new MTextField("Address 1").withNullRepresentation(""); - private TextField address2 = new MTextField("Address 2").withNullRepresentation(""); - private TextField city = new MTextField("City").withNullRepresentation(""); - private TextField state = new MTextField("State").withNullRepresentation(""); - private TextField zip = new MTextField("ZIP Code").withNullRepresentation(""); - private TextField country = new MTextField("Country").withNullRepresentation(""); + private TextField firstName = new MTextField("First Name"); + private TextField lastName = new MTextField("LastName"); + private TextField email = new MTextField("Email"); + private TextField phone = new MTextField("Phone"); + private TextField address1 = new MTextField("Address 1"); + private TextField address2 = new MTextField("Address 2"); + private TextField city = new MTextField("City"); + private TextField state = new MTextField("State"); + private TextField zip = new MTextField("ZIP Code"); + private TextField country = new MTextField("Country"); private CheckBox shipToDifferentAddress = new CheckBox("Ship to Different Address", false); + public BillingDetailsForm() { + super(BillingDetails.class); + } + @PostConstruct public void init() { - setStyleName(JPetStoreTheme.BASE_FORM); - setEagerValidation(false); setHeightUndefined(); - } - public boolean validate() { - - try { - getFieldGroup().getFields().forEach(field -> { - field.focus(); - field.validate(); - }); - } catch (Validator.InvalidValueException e) { - Notification.show(e.getMessage(), Notification.Type.ERROR_MESSAGE); - return false; - } - return true; + setStyleName(JPetStoreTheme.BASE_FORM); + email.setStyleName(JPetStoreTheme.WIDE_TEXT_FIELD); + address1.setStyleName(JPetStoreTheme.WIDE_TEXT_FIELD); + address2.setStyleName(JPetStoreTheme.WIDE_TEXT_FIELD); + + setSavedHandler(billingDetails -> { + BinderValidationStatus status = getBinder().validate(); + if (status.hasErrors()) { + return; + } + CurrentCart.set(BILLING_DETAILS, billingDetails); + + if (isShipToDifferentAddress()) { + getUIEventBus().publish(this, new UINavigationEvent(ShippingDetailsView.VIEW_NAME)); + } else { + CurrentCart.set(CurrentCart.Key.SHIPPING_DETAILS, new ShippingDetails(billingDetails)); + getUIEventBus().publish(this, new UINavigationEvent(ConfirmOrderView.VIEW_NAME)); + } + }); + setResetHandler(billingDetails -> { + setEntity(new BillingDetails()); + shipToDifferentAddress.setValue(false); + }); + // explicit binding for combo box + getBinder() + .forField(cardType) + .bind("cardType"); } public boolean isShipToDifferentAddress() { return shipToDifferentAddress.getValue(); } - public void clear() { - setEntity(new BillingDetails()); - shipToDifferentAddress.setValue(false); - } - @Override - protected Component createContent() { + public Component createContent() { - email.setStyleName(JPetStoreTheme.WIDE_TEXT_FIELD); - address1.setStyleName(JPetStoreTheme.WIDE_TEXT_FIELD); - address2.setStyleName(JPetStoreTheme.WIDE_TEXT_FIELD); - - setCardTypeCombo(); - setToolBarVisible(); - setRequiredFields(cardType, cardNumber, expiryDate, firstName, lastName, email, - phone, address1, city, state, zip, country); + getSaveButton().setVisible(true); + getSaveButton().setCaption("Continue"); + getResetButton().setVisible(true); + getResetButton().setCaption("Clear"); MFormLayout paymentMethodFormLayout = new MFormLayout(cardType, cardNumber, expiryDate).withWidth("-1px"); - MFormLayout billingDetailsFormLayout = new MFormLayout(firstName, lastName, email, phone, address1, address2, - city, state, zip, country, shipToDifferentAddress).withWidth("-1px"); + MFormLayout billingDetailsFormLayout = new MFormLayout(shipToDifferentAddress, firstName, lastName, email, phone, + address1, address2, city, state, zip, country).withWidth("-1px"); return new MVerticalLayout( new Panel("Payment Method", paymentMethodFormLayout), new Panel("Billing Address", billingDetailsFormLayout)); } - private void setCardTypeCombo() { - - cardType.addItem("American Express"); - cardType.addItem("Master Card"); - cardType.addItem("Visa"); - cardType.setNullSelectionAllowed(false); - } - - private void setRequiredFields(Field... fields) { - - Lists.newArrayList(fields).forEach(field -> { - field.setRequired(true); - field.setRequiredError(field.getCaption() + " is required"); - }); - } - - private void setToolBarVisible() { - - getSaveButton().setVisible(true); - getSaveButton().setCaption("Continue"); - getResetButton().setVisible(true); - getResetButton().setCaption("Clear"); + private ComboBox createCardTypeCombo() { + ComboBox cardTypeCombo = new ComboBox("Card Type"); + cardTypeCombo.setItems("", "American Express", "Master Card", "Visa"); + cardTypeCombo.setEmptySelectionAllowed(false); + return cardTypeCombo; } } \ No newline at end of file diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/form/ProductItemForm.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/form/ProductItemForm.java index 1874bb8..fa9d48b 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/form/ProductItemForm.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/form/ProductItemForm.java @@ -5,21 +5,22 @@ import com.kiroule.jpetstore.vaadinspring.ui.event.UIAddItemToCartEvent; import com.kiroule.jpetstore.vaadinspring.ui.theme.JPetStoreTheme; import com.kiroule.jpetstore.vaadinspring.ui.util.HasUIEventBus; +import com.vaadin.data.Binder; +import com.vaadin.data.converter.StringToIntegerConverter; +import com.vaadin.shared.ui.ContentMode; import com.vaadin.spring.annotation.SpringComponent; import com.vaadin.spring.annotation.ViewScope; import com.vaadin.ui.Button; import com.vaadin.ui.Component; +import com.vaadin.ui.Label; +import com.vaadin.ui.TextField; import com.vaadin.ui.UI; -import com.vaadin.v7.shared.ui.label.ContentMode; -import com.vaadin.v7.ui.Label; -import com.vaadin.v7.ui.TextField; import org.vaadin.viritin.button.MButton; +import org.vaadin.viritin.fields.MTextField; +import org.vaadin.viritin.form.AbstractForm; import org.vaadin.viritin.layouts.MFormLayout; import org.vaadin.viritin.layouts.MVerticalLayout; -import org.vaadin.viritinv7.MBeanFieldGroup; -import org.vaadin.viritinv7.fields.MTextField; -import org.vaadin.viritinv7.form.AbstractForm; import javax.annotation.PostConstruct; @@ -40,46 +41,50 @@ public class ProductItemForm extends AbstractForm implements HasUIEventBus private TextField quantity = new MTextField("Stock Quantity"); private Button addToCartButton = new MButton("Add to Cart"); + public ProductItemForm() { + super(Item.class); + // Override binder initialized in the parent class + setBinder(new Binder<>(Item.class)); + } + @PostConstruct public void init() { - + setStyleName(JPetStoreTheme.BASE_FORM); + setSizeUndefined(); image.setContentMode(ContentMode.HTML); - listPrice.setConverter(new CurrencyConverter()); + + // bind will null setter to set read-only mode + getBinder() + .forField(itemId) + .bind(Item::getItemId, null); + getBinder() + .forField(itemDescription) + .bind(Item::getDescription, null); + getBinder() + .forField(productDescription) + .bind(Item::getProductDescription, null); + getBinder() + .forField(listPrice) + .withConverter(new CurrencyConverter()) + .bind(Item::getListPrice, null); + getBinder() + .forField(quantity) + .withConverter(new StringToIntegerConverter(0, null)) + .bind(Item::getQuantity, null); addToCartButton.addClickListener(event -> { UI.getCurrent().removeWindow(getPopup()); - getUIEventBus().publish(this, new UIAddItemToCartEvent(getEntity())); + getUIEventBus().publish(this, new UIAddItemToCartEvent(getBinder().getBean())); } ); addToCartButton.focus(); - setStyleName(JPetStoreTheme.BASE_FORM); - setSizeUndefined(); } @Override - public MBeanFieldGroup setEntity(Item entity) { - - setReadOnly(false); - MBeanFieldGroup fieldGroup = super.setEntity(entity); - image.setValue(entity.getProduct().getDescription()); - itemDescription.setValue(entity.getAttribute1() + " " + entity.getProduct().getName()); - productDescription.setValue(entity.getProduct().getName()); - setReadOnly(true); - - return fieldGroup; + public void setEntity(Item item) { + image.setValue(item.getProduct().getDescription()); + getBinder().setBean(item); } - @Override - public void setReadOnly(boolean readOnly) { - - //super.setReadOnly(readOnly); - itemId.setReadOnly(readOnly); - itemDescription.setReadOnly(readOnly); - productDescription.setReadOnly(readOnly); - listPrice.setReadOnly(readOnly); - quantity.setReadOnly(readOnly); - } - - public Button getAddToCartButton() { return addToCartButton; } diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/form/ShippingDetailsForm.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/form/ShippingDetailsForm.java index 780f5ef..a8aa626 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/form/ShippingDetailsForm.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/form/ShippingDetailsForm.java @@ -4,17 +4,14 @@ import com.kiroule.jpetstore.vaadinspring.domain.ShippingDetails; import com.kiroule.jpetstore.vaadinspring.ui.theme.JPetStoreTheme; -import com.vaadin.v7.data.Validator; import com.vaadin.spring.annotation.SpringComponent; import com.vaadin.spring.annotation.ViewScope; import com.vaadin.ui.Component; -import com.vaadin.v7.ui.Field; -import com.vaadin.ui.Notification; import com.vaadin.ui.Panel; -import com.vaadin.v7.ui.TextField; +import com.vaadin.ui.TextField; -import org.vaadin.viritinv7.fields.MTextField; -import org.vaadin.viritinv7.form.AbstractForm; +import org.vaadin.viritin.fields.MTextField; +import org.vaadin.viritin.form.AbstractForm; import org.vaadin.viritin.layouts.MFormLayout; import org.vaadin.viritin.layouts.MVerticalLayout; @@ -29,38 +26,27 @@ public class ShippingDetailsForm extends AbstractForm { private static final long serialVersionUID = 3450336789838413879L; - private TextField firstName = new MTextField("First Name").withNullRepresentation(""); - private TextField lastName = new MTextField("LastName").withNullRepresentation(""); - private TextField email = new MTextField("Email").withNullRepresentation(""); - private TextField phone = new MTextField("Phone").withNullRepresentation(""); - private TextField address1 = new MTextField("Address 1").withNullRepresentation(""); - private TextField address2 = new MTextField("Address 2").withNullRepresentation(""); - private TextField city = new MTextField("City").withNullRepresentation(""); - private TextField state = new MTextField("State").withNullRepresentation(""); - private TextField zip = new MTextField("ZIP Code").withNullRepresentation(""); - private TextField country = new MTextField("Country").withNullRepresentation(""); + private TextField firstName = new MTextField("First Name"); + private TextField lastName = new MTextField("LastName"); + private TextField email = new MTextField("Email"); + private TextField phone = new MTextField("Phone"); + private TextField address1 = new MTextField("Address 1"); + private TextField address2 = new MTextField("Address 2"); + private TextField city = new MTextField("City"); + private TextField state = new MTextField("State"); + private TextField zip = new MTextField("ZIP Code"); + private TextField country = new MTextField("Country"); + + public ShippingDetailsForm() { + super(ShippingDetails.class); + } @PostConstruct public void init() { setStyleName(JPetStoreTheme.BASE_FORM); - setEagerValidation(false); setHeightUndefined(); } - public boolean validate() { - - try { - getFieldGroup().getFields().forEach(field -> { - field.focus(); - field.validate(); - }); - } catch (Validator.InvalidValueException e) { - Notification.show(e.getMessage(), Notification.Type.ERROR_MESSAGE); - return false; - } - return true; - } - public void clear() { setEntity(new ShippingDetails()); } @@ -73,7 +59,7 @@ protected Component createContent() { address2.setStyleName(JPetStoreTheme.WIDE_TEXT_FIELD); setToolBarVisible(); - setRequiredFields(firstName, lastName, email, phone, address1, city, state, zip, country); + configureFields(); MFormLayout shippingDetailsFormLayout = new MFormLayout(firstName, lastName, email, phone, address1, address2, city, state, zip, country).withWidth("-1px"); @@ -83,16 +69,15 @@ protected Component createContent() { ); } - private void setRequiredFields(Field... fields) { - - Lists.newArrayList(fields).forEach(field -> { - field.setRequired(true); - field.setRequiredError(field.getCaption() + " is required"); - }); + private void configureFields() { + Lists.newArrayList(firstName, lastName, email, phone, address1, city, state, zip, country) + .forEach(field -> getBinder() + .forField(field) + .withNullRepresentation("") + .asRequired(field.getCaption() + " is required")); } private void setToolBarVisible() { - getSaveButton().setVisible(true); getSaveButton().setCaption("Continue"); getResetButton().setVisible(true); diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/theme/JPetStoreTheme.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/theme/JPetStoreTheme.java index 554b563..4059229 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/theme/JPetStoreTheme.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/theme/JPetStoreTheme.java @@ -18,4 +18,6 @@ public class JPetStoreTheme extends ValoTheme { public static final String VIEW_LABEL_MEDIUM = "view-label-medium"; public static final String VIEW_LABEL_SMALL = "view-label-small"; public static final String BASE_FORM = "base-form"; + public static final String GRID_BUTTON = "grid-button"; + public static final String GRID_TEXTFIELD = "grid-textfield"; } \ No newline at end of file diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/util/CurrentCart.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/util/CurrentCart.java index 48cf769..6a55e7f 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/util/CurrentCart.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/util/CurrentCart.java @@ -1,12 +1,12 @@ package com.kiroule.jpetstore.vaadinspring.ui.util; +import com.kiroule.jpetstore.vaadinspring.domain.Cart; +import com.vaadin.server.VaadinSession; + import static com.kiroule.jpetstore.vaadinspring.ui.util.CurrentCart.Key.BILLING_DETAILS; import static com.kiroule.jpetstore.vaadinspring.ui.util.CurrentCart.Key.SHIPPING_DETAILS; import static com.kiroule.jpetstore.vaadinspring.ui.util.CurrentCart.Key.SHOPPING_CART; -import com.kiroule.jpetstore.vaadinspring.domain.Cart; -import com.vaadin.server.VaadinSession; - /** * @author Igor Baiborodine */ @@ -24,6 +24,14 @@ public static boolean isEmpty() { return get(SHOPPING_CART) == null || ((Cart) get(SHOPPING_CART)).getCartItemList().isEmpty(); } + public static int getItemCount() { + int count = 0; + if (get(SHOPPING_CART) != null) { + count = ((Cart) get(SHOPPING_CART)).getCartItemList().size(); + } + return count; + } + public static void clear() { set(SHOPPING_CART, null); set(BILLING_DETAILS, null); diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/AbstractView.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/AbstractView.java index 4e6d0e3..262b1d9 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/AbstractView.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/AbstractView.java @@ -12,8 +12,8 @@ import com.vaadin.ui.Alignment; import com.vaadin.ui.Component; import com.vaadin.ui.Notification; -import com.vaadin.v7.shared.ui.label.ContentMode; -import com.vaadin.v7.ui.Label; +import com.vaadin.shared.ui.ContentMode; +import com.vaadin.ui.Label; import org.vaadin.viritin.layouts.MVerticalLayout; diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/AccountView.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/AccountView.java index 308ba5f..3f798c0 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/AccountView.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/AccountView.java @@ -31,28 +31,30 @@ public class AccountView extends AbstractView { public static final String VIEW_NAME = "account"; + private final AccountForm accountForm; + private final AccountService accountService; + @Autowired - private AccountForm accountForm; - @Autowired - private AccountService accountService; + public AccountView(AccountForm accountForm, AccountService accountService) { + this.accountForm = accountForm; + this.accountService = accountService; + } @PostConstruct void init() { accountForm.setSavedHandler(account -> { try { - if (!accountForm.validate()) { - return; - } accountService.updateAccount(account); accountForm.clear(); showConfirmation("Your account has been updated."); getUIEventBus().publish(AccountView.this, new UIUpdateAccountEvent(account)); - } catch (Throwable t) { - Notification.show("An error occurred while updating account: " + t.getMessage(), ERROR_MESSAGE); + } catch (Exception e) { + Notification.show("An error occurred while updating account: " + e.getMessage(), ERROR_MESSAGE); } }); - accountForm.setResetHandler(account -> getUIEventBus().publish(this, new UINavigationEvent(OrderListView.VIEW_NAME))); + accountForm.setResetHandler(account -> + getUIEventBus().publish(this, new UINavigationEvent(OrderListView.VIEW_NAME))); Panel contentPanel = new Panel(accountForm); addComponents(initTitleLabel(), contentPanel, accountForm.getToolbar(EDIT)); diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/AuthRequiredView.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/AuthRequiredView.java index 7e37183..9c29998 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/AuthRequiredView.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/AuthRequiredView.java @@ -3,7 +3,7 @@ import com.kiroule.jpetstore.vaadinspring.ui.theme.JPetStoreTheme; import com.kiroule.jpetstore.vaadinspring.ui.util.ViewConfig; import com.vaadin.spring.annotation.SpringView; -import com.vaadin.v7.ui.Label; +import com.vaadin.ui.Label; import javax.annotation.PostConstruct; diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/BillingDetailsView.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/BillingDetailsView.java index f43bf5f..52e455b 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/BillingDetailsView.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/BillingDetailsView.java @@ -1,11 +1,11 @@ package com.kiroule.jpetstore.vaadinspring.ui.view; import com.kiroule.jpetstore.vaadinspring.domain.BillingDetails; -import com.kiroule.jpetstore.vaadinspring.domain.ShippingDetails; import com.kiroule.jpetstore.vaadinspring.ui.event.UINavigationEvent; import com.kiroule.jpetstore.vaadinspring.ui.form.BillingDetailsForm; import com.kiroule.jpetstore.vaadinspring.ui.util.CurrentAccount; import com.kiroule.jpetstore.vaadinspring.ui.util.CurrentCart; +import com.kiroule.jpetstore.vaadinspring.ui.util.HasLogger; import com.kiroule.jpetstore.vaadinspring.ui.util.ViewConfig; import com.vaadin.navigator.ViewChangeListener; import com.vaadin.spring.annotation.SpringView; @@ -15,41 +15,26 @@ import javax.annotation.PostConstruct; -import static com.kiroule.jpetstore.vaadinspring.ui.util.CurrentCart.Key.BILLING_DETAILS; - /** * @author Igor Baiborodine */ @SpringView(name = BillingDetailsView.VIEW_NAME) @ViewConfig(displayName = "Billing Details", authRequired = true) -public class BillingDetailsView extends AbstractView { +public class BillingDetailsView extends AbstractView implements HasLogger { private static final long serialVersionUID = 259508511415536436L; public static final String VIEW_NAME = "billing-details"; + private final BillingDetailsForm billingDetailsForm; + @Autowired - private BillingDetailsForm billingDetailsForm; + public BillingDetailsView(BillingDetailsForm billingDetailsForm) { + this.billingDetailsForm = billingDetailsForm; + } @PostConstruct void init() { - - billingDetailsForm.setSavedHandler(billingDetails -> { - - if (!billingDetailsForm.validate()) { - return; - } - CurrentCart.set(BILLING_DETAILS, billingDetails); - - if (billingDetailsForm.isShipToDifferentAddress()) { - getUIEventBus().publish(this, new UINavigationEvent(ShippingDetailsView.VIEW_NAME)); - } else { - CurrentCart.set(CurrentCart.Key.SHIPPING_DETAILS, new ShippingDetails(billingDetails)); - getUIEventBus().publish(this, new UINavigationEvent(ConfirmOrderView.VIEW_NAME)); - } - }); - billingDetailsForm.setResetHandler(billingDetails -> billingDetailsForm.clear()); - Panel contentPanel = new Panel(billingDetailsForm); addComponents(initTitleLabel(), contentPanel, billingDetailsForm.getToolbar()); setSizeFull(); @@ -67,6 +52,8 @@ public void executeOnEnter(ViewChangeListener.ViewChangeEvent event) { billingDetails.setCardType("Visa"); billingDetails.setCardNumber("9999 9999 9999 9999"); billingDetails.setExpiryDate("01/1900"); + + getLogger().debug("billing details[{}]", billingDetails); billingDetailsForm.setEntity(billingDetails); } } \ No newline at end of file diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/CartView.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/CartView.java index 8b6370a..66055a2 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/CartView.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/CartView.java @@ -1,8 +1,7 @@ package com.kiroule.jpetstore.vaadinspring.ui.view; import com.kiroule.jpetstore.vaadinspring.domain.Cart; -import com.kiroule.jpetstore.vaadinspring.ui.component.CartItemListTable; -import com.kiroule.jpetstore.vaadinspring.ui.converter.CurrencyConverter; +import com.kiroule.jpetstore.vaadinspring.ui.component.CartItemListGrid; import com.kiroule.jpetstore.vaadinspring.ui.event.UINavigationEvent; import com.kiroule.jpetstore.vaadinspring.ui.theme.JPetStoreTheme; import com.kiroule.jpetstore.vaadinspring.ui.util.CurrentAccount; @@ -11,8 +10,8 @@ import com.vaadin.navigator.ViewChangeListener; import com.vaadin.spring.annotation.SpringView; import com.vaadin.ui.Alignment; +import com.vaadin.ui.Label; import com.vaadin.ui.UI; -import com.vaadin.v7.ui.Label; import org.springframework.beans.factory.annotation.Autowired; import org.vaadin.viritin.button.MButton; @@ -20,6 +19,7 @@ import org.vaadin.viritin.layouts.MVerticalLayout; import java.math.BigDecimal; +import java.text.NumberFormat; import javax.annotation.PostConstruct; @@ -38,13 +38,17 @@ public class CartView extends AbstractView { public static final String VIEW_NAME = "cart"; public static final String SUBTOTAL_LABEL_PATTERN = "Subtotal: %s"; - @Autowired - private CartItemListTable cartItemList; + private final CartItemListGrid cartItemList; private Label emptyCartLabel; private MVerticalLayout cartItemListLayout; private Label subtotalLabel; + @Autowired + public CartView(CartItemListGrid cartItemList) { + this.cartItemList = cartItemList; + } + @PostConstruct void init() { @@ -75,7 +79,7 @@ public void executeOnEnter(ViewChangeListener.ViewChangeEvent event) { if (!CurrentCart.isEmpty()) { Cart cart = (Cart) CurrentCart.get(SHOPPING_CART); - cartItemList.setBeans(cart.getCartItemList()); + cartItemList.setItems(cart.getCartItemList()); subtotalLabel.setValue(format(SUBTOTAL_LABEL_PATTERN, formatSubtotal(cart.getSubTotal()))); } expand(CurrentCart.isEmpty() ? emptyCartLabel : cartItemListLayout); @@ -94,6 +98,6 @@ private Label initSubtotalLabel() { } private String formatSubtotal(BigDecimal subtotal) { - return new CurrencyConverter().convertToPresentation(subtotal, String.class, UI.getCurrent().getLocale()); + return NumberFormat.getCurrencyInstance(UI.getCurrent().getLocale()).format(subtotal); } } \ No newline at end of file diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/ConfirmOrderView.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/ConfirmOrderView.java index 8e07899..1a30cdf 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/ConfirmOrderView.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/ConfirmOrderView.java @@ -7,8 +7,7 @@ import com.kiroule.jpetstore.vaadinspring.domain.OrderDetails; import com.kiroule.jpetstore.vaadinspring.domain.ShippingDetails; import com.kiroule.jpetstore.vaadinspring.service.OrderService; -import com.kiroule.jpetstore.vaadinspring.ui.component.CartItemListTable; -import com.kiroule.jpetstore.vaadinspring.ui.converter.CurrencyConverter; +import com.kiroule.jpetstore.vaadinspring.ui.component.CartItemListGrid; import com.kiroule.jpetstore.vaadinspring.ui.event.UINavigationEvent; import com.kiroule.jpetstore.vaadinspring.ui.theme.JPetStoreTheme; import com.kiroule.jpetstore.vaadinspring.ui.util.CurrentAccount; @@ -16,14 +15,14 @@ import com.kiroule.jpetstore.vaadinspring.ui.util.ViewConfig; import com.vaadin.navigator.ViewChangeListener; import com.vaadin.server.ThemeResource; +import com.vaadin.shared.ui.ContentMode; import com.vaadin.spring.annotation.SpringView; import com.vaadin.ui.Alignment; import com.vaadin.ui.Image; +import com.vaadin.ui.Label; import com.vaadin.ui.Panel; import com.vaadin.ui.UI; import com.vaadin.ui.Window; -import com.vaadin.v7.shared.ui.label.ContentMode; -import com.vaadin.v7.ui.Label; import org.springframework.beans.factory.annotation.Autowired; import org.vaadin.viritin.button.MButton; @@ -32,6 +31,7 @@ import org.vaadin.viritin.layouts.MVerticalLayout; import java.math.BigDecimal; +import java.text.NumberFormat; import javax.annotation.PostConstruct; @@ -54,10 +54,8 @@ public class ConfirmOrderView extends AbstractView { public static final String VIEW_NAME = "confirm-order"; public static final String SUBTOTAL_LABEL_PATTERN = "Subtotal: %s"; - @Autowired - private OrderService orderService; - @Autowired - private CartItemListTable cartItemList; + private final OrderService orderService; + private final CartItemListGrid cartItemList; private MHorizontalLayout orderDetailsLayout = new MHorizontalLayout().withMargin(false); private PaymentMethodFormLayout paymentMethodFormLayout = new PaymentMethodFormLayout(); @@ -67,6 +65,12 @@ public class ConfirmOrderView extends AbstractView { private MButton viewOrdersButton = createViewOrdersButton(); private Label subtotalLabel = createSubtotalLabel(); + @Autowired + public ConfirmOrderView(OrderService orderService, CartItemListGrid cartItemList) { + this.orderService = orderService; + this.cartItemList = cartItemList; + } + @PostConstruct void init() { @@ -80,8 +84,7 @@ void init() { orderDetailsLayout.setExpandRatio(shippingDetailsPanel, 1.0f); orderDetailsLayout.setSizeFull(); viewOrdersButton.setVisible(false); - int actualRowCount = cartItemList.getContainerDataSource().size(); - cartItemList.setPageLength(Math.min(actualRowCount, 5)); + cartItemList.setHeightByRows(Math.min(CurrentCart.getItemCount(), 5)); MVerticalLayout content = new MVerticalLayout(cartItemList, subtotalLabel, orderDetailsLayout); Panel contentPanel = new Panel(content); @@ -100,7 +103,7 @@ public void executeOnEnter(ViewChangeListener.ViewChangeEvent event) { return; } Cart cart = (Cart) CurrentCart.get(SHOPPING_CART); - cartItemList.setBeans(cart.getCartItemList()); + cartItemList.setItems(cart.getCartItemList()); subtotalLabel.setValue(format(SUBTOTAL_LABEL_PATTERN, formatSubtotal(cart.getSubTotal()))); paymentMethodFormLayout.setEntity((BillingDetails) CurrentCart.get(BILLING_DETAILS)); @@ -126,7 +129,6 @@ private MButton createPlaceOrderButton() { CurrentCart.clear(); event.getButton().setVisible(false); viewOrdersButton.setVisible(true); - cartItemList.setReadOnly(true); showConfirmation("Thank you, your order has been submitted."); } catch (Exception e) { @@ -141,7 +143,7 @@ private MButton createViewOrdersButton() { } private String formatSubtotal(BigDecimal subtotal) { - return new CurrencyConverter().convertToPresentation(subtotal, String.class, UI.getCurrent().getLocale()); + return NumberFormat.getCurrencyInstance(UI.getCurrent().getLocale()).format(subtotal); } @Override diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/ItemListView.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/ItemListView.java index 15575af..491b632 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/ItemListView.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/ItemListView.java @@ -2,7 +2,7 @@ import com.kiroule.jpetstore.vaadinspring.domain.Product; import com.kiroule.jpetstore.vaadinspring.service.CatalogService; -import com.kiroule.jpetstore.vaadinspring.ui.component.ItemListTable; +import com.kiroule.jpetstore.vaadinspring.ui.component.ProductItemListGrid; import com.kiroule.jpetstore.vaadinspring.ui.util.ViewConfig; import com.vaadin.navigator.ViewChangeListener; import com.vaadin.spring.annotation.SpringView; @@ -24,13 +24,16 @@ public class ItemListView extends AbstractView { public static final String VIEW_NAME = "item-list"; - @Autowired - private CatalogService catalogService; - @Autowired - private ItemListTable itemList; - + private final CatalogService catalogService; + private final ProductItemListGrid itemList; private Product product; + @Autowired + public ItemListView(CatalogService catalogService, ProductItemListGrid itemList) { + this.catalogService = catalogService; + this.itemList = itemList; + } + @PostConstruct public void init() { addComponents(initTitleLabel(), itemList); @@ -41,7 +44,7 @@ public void init() { @Override public void executeOnEnter(ViewChangeListener.ViewChangeEvent event) { product = catalogService.getProduct(event.getParameters()); - itemList.setBeans(catalogService.getItemListByProduct(product.getProductId())); + itemList.setItems(catalogService.getItemListByProduct(product.getProductId())); } @Override diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/NewAccountView.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/NewAccountView.java index ff5bac0..d8b7b99 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/NewAccountView.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/NewAccountView.java @@ -15,7 +15,7 @@ import javax.annotation.PostConstruct; -import static com.kiroule.jpetstore.vaadinspring.ui.form.AccountForm.Mode.INSERT; +import static com.kiroule.jpetstore.vaadinspring.ui.form.AccountForm.Mode.ADD; import static com.vaadin.ui.Notification.Type.ERROR_MESSAGE; /** @@ -29,30 +29,31 @@ public class NewAccountView extends AbstractView { public static final String VIEW_NAME = "new-account"; + private final AccountForm accountForm; + private final AccountService accountService; + @Autowired - private AccountForm accountForm; - @Autowired - private AccountService accountService; + public NewAccountView(AccountForm accountForm, AccountService accountService) { + this.accountForm = accountForm; + this.accountService = accountService; + } @PostConstruct void init() { accountForm.setSavedHandler(account -> { try { - if (!accountForm.validate()) { - return; - } accountService.insertAccount(account); showConfirmation("New account has been created."); getUIEventBus().publish(this, new UINavigationEvent(HomeView.VIEW_NAME)); - } catch (Throwable t) { - Notification.show("An error occurred while creating new account: " + t.getMessage(), ERROR_MESSAGE); + } catch (Exception e) { + Notification.show("An error occurred while creating new account: " + e.getMessage(), ERROR_MESSAGE); } }); accountForm.setResetHandler(account -> accountForm.clear()); Panel contentPanel = new Panel(accountForm); - addComponents(initTitleLabel(), contentPanel, accountForm.getToolbar(INSERT)); + addComponents(initTitleLabel(), contentPanel, accountForm.getToolbar(ADD)); setSizeFull(); expand(contentPanel); } @@ -64,6 +65,6 @@ public void executeOnEnter(ViewChangeListener.ViewChangeEvent event) { getUIEventBus().publish(this, new UINavigationEvent(HomeView.VIEW_NAME)); } accountForm.setEntity(new Account()); - accountForm.setReadOnlyFields(INSERT); + accountForm.setReadOnlyFields(ADD); } } \ No newline at end of file diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/OrderListView.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/OrderListView.java index 01252f2..c43ab80 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/OrderListView.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/OrderListView.java @@ -2,13 +2,13 @@ import com.kiroule.jpetstore.vaadinspring.domain.Order; import com.kiroule.jpetstore.vaadinspring.service.OrderService; -import com.kiroule.jpetstore.vaadinspring.ui.component.OrderListTable; +import com.kiroule.jpetstore.vaadinspring.ui.component.OrderListGrid; import com.kiroule.jpetstore.vaadinspring.ui.theme.JPetStoreTheme; import com.kiroule.jpetstore.vaadinspring.ui.util.CurrentAccount; import com.kiroule.jpetstore.vaadinspring.ui.util.ViewConfig; import com.vaadin.navigator.ViewChangeListener; import com.vaadin.spring.annotation.SpringView; -import com.vaadin.v7.ui.Label; +import com.vaadin.ui.Label; import org.springframework.beans.factory.annotation.Autowired; @@ -27,13 +27,17 @@ public class OrderListView extends AbstractView { public static final String VIEW_NAME = "order-list"; - @Autowired - private OrderService orderService; - @Autowired - private OrderListTable orderList; + private final OrderService orderService; + private final OrderListGrid orderList; private Label noOrdersLabel; + @Autowired + public OrderListView(OrderService orderService, OrderListGrid orderList) { + this.orderService = orderService; + this.orderList = orderList; + } + @PostConstruct void init() { addComponents(initTitleLabel(), initNoOrdersLabel(), orderList); @@ -44,7 +48,7 @@ void init() { public void executeOnEnter(ViewChangeListener.ViewChangeEvent event) { List orders = orderService.getOrdersByUsername(CurrentAccount.get().getUsername()); - orderList.setBeans(orders); + orderList.setItems(orders); orderList.setVisible(!orders.isEmpty()); noOrdersLabel.setVisible(orders.isEmpty()); expand(orders.isEmpty() ? noOrdersLabel : orderList); diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/ProductListView.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/ProductListView.java index 5a01e00..70092de 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/ProductListView.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/ProductListView.java @@ -1,14 +1,17 @@ package com.kiroule.jpetstore.vaadinspring.ui.view; import com.kiroule.jpetstore.vaadinspring.domain.Category; +import com.kiroule.jpetstore.vaadinspring.domain.Product; import com.kiroule.jpetstore.vaadinspring.service.CatalogService; -import com.kiroule.jpetstore.vaadinspring.ui.component.ProductListTable; +import com.kiroule.jpetstore.vaadinspring.ui.component.ProductListGrid; import com.kiroule.jpetstore.vaadinspring.ui.util.ViewConfig; import com.vaadin.navigator.ViewChangeListener; import com.vaadin.spring.annotation.SpringView; import org.springframework.beans.factory.annotation.Autowired; +import java.util.List; + import javax.annotation.PostConstruct; /** @@ -22,16 +25,19 @@ public class ProductListView extends AbstractView { public static final String VIEW_NAME = "product-list"; - @Autowired - private CatalogService catalogService; - @Autowired - private ProductListTable productList; + private final CatalogService catalogService; + private final ProductListGrid productList; private Category category; + @Autowired + public ProductListView(CatalogService catalogService, ProductListGrid productList) { + this.catalogService = catalogService; + this.productList = productList; + } + @PostConstruct public void init() { - addComponents(initTitleLabel(), productList); setSizeFull(); expand(productList); @@ -40,7 +46,8 @@ public void init() { @Override public void executeOnEnter(ViewChangeListener.ViewChangeEvent event) { category = catalogService.getCategory(event.getParameters()); - productList.setBeans(catalogService.getProductListByCategory(category.getCategoryId())); + List products = catalogService.getProductListByCategory(category.getCategoryId()); + productList.setItems(products); } @Override diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/SearchView.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/SearchView.java index 24c9776..ca3faab 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/SearchView.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/SearchView.java @@ -2,13 +2,13 @@ import com.kiroule.jpetstore.vaadinspring.domain.Product; import com.kiroule.jpetstore.vaadinspring.service.CatalogService; -import com.kiroule.jpetstore.vaadinspring.ui.component.ProductListTable; +import com.kiroule.jpetstore.vaadinspring.ui.component.ProductListGrid; import com.kiroule.jpetstore.vaadinspring.ui.theme.JPetStoreTheme; import com.kiroule.jpetstore.vaadinspring.ui.util.ViewConfig; import com.kiroule.jpetstore.vaadinspring.ui.util.ViewConfigUtil; import com.vaadin.navigator.ViewChangeListener; import com.vaadin.spring.annotation.SpringView; -import com.vaadin.v7.ui.Label; +import com.vaadin.ui.Label; import org.springframework.beans.factory.annotation.Autowired; @@ -29,18 +29,22 @@ public class SearchView extends AbstractView { public static final String VIEW_NAME = "search"; - @Autowired - private CatalogService catalogService; - @Autowired - private ProductListTable productListTable; + private final CatalogService catalogService; + private final ProductListGrid productListGrid; private Label noResultLabel; private String keyword; private String noResultMessage = "Your search \"%s\" did not match any products."; + @Autowired + public SearchView(CatalogService catalogService, ProductListGrid productListGrid) { + this.catalogService = catalogService; + this.productListGrid = productListGrid; + } + @PostConstruct public void init() { - addComponents(initTitleLabel(), initNoResultLabel(), productListTable); + addComponents(initTitleLabel(), initNoResultLabel(), productListGrid); setSizeFull(); } @@ -52,9 +56,9 @@ public void executeOnEnter(ViewChangeListener.ViewChangeEvent event) { noResultLabel.setValue(format(noResultMessage, keyword)); noResultLabel.setVisible(products.isEmpty()); - productListTable.setBeans(products); - productListTable.setVisible(!products.isEmpty()); - expand(products.isEmpty() ? noResultLabel : productListTable); + productListGrid.setItems(products); + productListGrid.setVisible(!products.isEmpty()); + expand(products.isEmpty() ? noResultLabel : productListGrid); } @Override diff --git a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/ShippingDetailsView.java b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/ShippingDetailsView.java index 8a926a1..76f58fe 100644 --- a/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/ShippingDetailsView.java +++ b/src/main/java/com/kiroule/jpetstore/vaadinspring/ui/view/ShippingDetailsView.java @@ -27,17 +27,17 @@ public class ShippingDetailsView extends AbstractView { public static final String VIEW_NAME = "shipping-details"; + private final ShippingDetailsForm shippingDetailsForm; + @Autowired - private ShippingDetailsForm shippingDetailsForm; + public ShippingDetailsView(ShippingDetailsForm shippingDetailsForm) { + this.shippingDetailsForm = shippingDetailsForm; + } @PostConstruct void init() { shippingDetailsForm.setSavedHandler(shippingDetails -> { - - if (!shippingDetailsForm.validate()) { - return; - } CurrentCart.set(SHIPPING_DETAILS, shippingDetails); getUIEventBus().publish(this, new UINavigationEvent(ConfirmOrderView.VIEW_NAME)); }); diff --git a/src/main/webapp/VAADIN/themes/jpetstoretheme/addons.scss b/src/main/webapp/VAADIN/themes/jpetstoretheme/addons.scss index 074cbd1..a5670b7 100644 --- a/src/main/webapp/VAADIN/themes/jpetstoretheme/addons.scss +++ b/src/main/webapp/VAADIN/themes/jpetstoretheme/addons.scss @@ -1,17 +1,7 @@ /* This file is automatically managed and will be overwritten from time to time. */ /* Do not manually edit this file. */ -/* Provided by stepper-2.4.0.jar */ -@import "../../..//VAADIN/addons/stepper/stepper.scss"; - - -/* Provided by stepper-2.4.0.jar */ -@import "../../../VAADIN/addons/stepper/stepper.scss"; - - /* Import and include this mixin into your project theme to include the addon themes */ @mixin addons { - @include stepper; - @include stepper; } diff --git a/src/main/webapp/VAADIN/themes/jpetstoretheme/jpetstoretheme.scss b/src/main/webapp/VAADIN/themes/jpetstoretheme/jpetstoretheme.scss index 6868294..0f181d1 100644 --- a/src/main/webapp/VAADIN/themes/jpetstoretheme/jpetstoretheme.scss +++ b/src/main/webapp/VAADIN/themes/jpetstoretheme/jpetstoretheme.scss @@ -5,16 +5,16 @@ @include valo; .v-margin-left { - padding-left: 20px; + padding-left: 10px; } .v-margin-bottom { - padding-bottom: 20px; + padding-bottom: 10px; } .v-margin-right { - padding-right: 20px; + padding-right: 10px; } .v-margin-top { - padding-top: 20px; + padding-top: 10px; } .v-panel-caption { font-weight: 500; @@ -115,4 +115,9 @@ .banner-2 { background-color: #8b9a93; } + + .grid-button, + .grid-textfield { + height: 30px; + } } diff --git a/src/main/webapp/VAADIN/themes/jpetstoretheme/styles.css b/src/main/webapp/VAADIN/themes/jpetstoretheme/styles.css index 9d762b4..998e29c 100644 --- a/src/main/webapp/VAADIN/themes/jpetstoretheme/styles.css +++ b/src/main/webapp/VAADIN/themes/jpetstoretheme/styles.css @@ -1081,7 +1081,7 @@ */ .v-vaadin-version:after { - content: "8.1.5"; + content: "8.3.0"; } .v-widget { @@ -1172,7 +1172,7 @@ overflow: auto; } -.v-assistive-device-only { +.v-assistive-device-only, .v-assistive-device-only-label label { position: absolute; top: -2000px; left: -2000px; @@ -1751,6 +1751,61 @@ div.v-layout.v-horizontal.v-widget { content: "!"; } +.jpetstoretheme .v-errorindicator-info { + color: #00a7f5; + font-weight: 600; + width: 19px; + text-align: center; +} + +.jpetstoretheme .v-errorindicator-info:before { + content: "!"; +} + +.jpetstoretheme .v-errorindicator-warning { + color: #fc9c00; + font-weight: 600; + width: 19px; + text-align: center; +} + +.jpetstoretheme .v-errorindicator-warning:before { + content: "!"; +} + +.jpetstoretheme .v-errorindicator-error { + color: #ed473b; + font-weight: 600; + width: 19px; + text-align: center; +} + +.jpetstoretheme .v-errorindicator-error:before { + content: "!"; +} + +.jpetstoretheme .v-errorindicator-critical { + color: #fa007d; + font-weight: 600; + width: 19px; + text-align: center; +} + +.jpetstoretheme .v-errorindicator-critical:before { + content: "!"; +} + +.jpetstoretheme .v-errorindicator-system { + color: #bb00ff; + font-weight: 600; + width: 19px; + text-align: center; +} + +.jpetstoretheme .v-errorindicator-system:before { + content: "!"; +} + .jpetstoretheme .v-required-field-indicator { color: #ed473b; padding: 0 0.2em; @@ -1830,6 +1885,26 @@ div.v-layout.v-horizontal.v-widget { line-height: inherit; } +.jpetstoretheme .v-tooltip .v-errormessage-info { + color: #00a7f5; +} + +.jpetstoretheme .v-tooltip .v-errormessage-warning { + color: #fc9c00; +} + +.jpetstoretheme .v-tooltip .v-errormessage-error { + color: #ed473b; +} + +.jpetstoretheme .v-tooltip .v-errormessage-critical { + color: #fa007d; +} + +.jpetstoretheme .v-tooltip .v-errormessage-system { + color: #bb00ff; +} + .jpetstoretheme .v-tooltip .v-tooltip-text { max-height: 10em; overflow: auto; @@ -3087,6 +3162,61 @@ div.v-layout.v-horizontal.v-widget { border-color: #ed473b; } +.jpetstoretheme .v-filterselect-error-info .v-filterselect-input { + border-color: #00a7f5 !important; + background: #fafdff; + color: #195774; +} + +.jpetstoretheme .v-filterselect-error-info .v-filterselect-button { + color: #00a7f5; + border-color: #00a7f5; +} + +.jpetstoretheme .v-filterselect-error-warning .v-filterselect-input { + border-color: #fc9c00 !important; + background: #fffdfa; + color: #745119; +} + +.jpetstoretheme .v-filterselect-error-warning .v-filterselect-button { + color: #fc9c00; + border-color: #fc9c00; +} + +.jpetstoretheme .v-filterselect-error-error .v-filterselect-input { + border-color: #ed473b !important; + background: #fffbfb; + color: #6c2621; +} + +.jpetstoretheme .v-filterselect-error-error .v-filterselect-button { + color: #ed473b; + border-color: #ed473b; +} + +.jpetstoretheme .v-filterselect-error-critical .v-filterselect-input { + border-color: #fa007d !important; + background: #fffafc; + color: #741947; +} + +.jpetstoretheme .v-filterselect-error-critical .v-filterselect-button { + color: #fa007d; + border-color: #fa007d; +} + +.jpetstoretheme .v-filterselect-error-system .v-filterselect-input { + border-color: #bb00ff !important; + background: #fefaff; + color: #5c1974; +} + +.jpetstoretheme .v-filterselect-error-system .v-filterselect-button { + color: #bb00ff; + border-color: #bb00ff; +} + .jpetstoretheme .v-filterselect-suggestpopup { margin-top: 5px !important; } @@ -5117,6 +5247,36 @@ div.v-layout.v-horizontal.v-widget { color: #6c2621; } +.jpetstoretheme .v-textfield-error-info { + border-color: #00a7f5 !important; + background: #fafdff; + color: #195774; +} + +.jpetstoretheme .v-textfield-error-warning { + border-color: #fc9c00 !important; + background: #fffdfa; + color: #745119; +} + +.jpetstoretheme .v-textfield-error-error { + border-color: #ed473b !important; + background: #fffbfb; + color: #6c2621; +} + +.jpetstoretheme .v-textfield-error-critical { + border-color: #fa007d !important; + background: #fffafc; + color: #741947; +} + +.jpetstoretheme .v-textfield-error-system { + border-color: #bb00ff !important; + background: #fefaff; + color: #5c1974; +} + .jpetstoretheme .v-textfield-borderless { border: none; border-radius: 0; @@ -5863,6 +6023,61 @@ div.v-layout.v-horizontal.v-widget { border-color: #ed473b; } +.jpetstoretheme .v-datefield-error-info .v-datefield-textfield { + border-color: #00a7f5 !important; + background: #fafdff; + color: #195774; +} + +.jpetstoretheme .v-datefield-error-info .v-datefield-button { + color: #00a7f5; + border-color: #00a7f5; +} + +.jpetstoretheme .v-datefield-error-warning .v-datefield-textfield { + border-color: #fc9c00 !important; + background: #fffdfa; + color: #745119; +} + +.jpetstoretheme .v-datefield-error-warning .v-datefield-button { + color: #fc9c00; + border-color: #fc9c00; +} + +.jpetstoretheme .v-datefield-error-error .v-datefield-textfield { + border-color: #ed473b !important; + background: #fffbfb; + color: #6c2621; +} + +.jpetstoretheme .v-datefield-error-error .v-datefield-button { + color: #ed473b; + border-color: #ed473b; +} + +.jpetstoretheme .v-datefield-error-critical .v-datefield-textfield { + border-color: #fa007d !important; + background: #fffafc; + color: #741947; +} + +.jpetstoretheme .v-datefield-error-critical .v-datefield-button { + color: #fa007d; + border-color: #fa007d; +} + +.jpetstoretheme .v-datefield-error-system .v-datefield-textfield { + border-color: #bb00ff !important; + background: #fefaff; + color: #5c1974; +} + +.jpetstoretheme .v-datefield-error-system .v-datefield-button { + color: #bb00ff; + border-color: #bb00ff; +} + .jpetstoretheme .v-datefield-full { width: 240px; } @@ -8359,6 +8574,30 @@ div.v-layout.v-horizontal.v-widget { color: inherit; } +.jpetstoretheme .v-window-closebox:focus::after { + content: ""; + position: absolute; + top: 6px; + right: 6px; + bottom: 6px; + left: 2px; + border-radius: 4px; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); +} + +.jpetstoretheme .v-window-maximizebox:focus::after, .jpetstoretheme .v-window-restorebox:focus::after { + content: ""; + position: absolute; + top: 6px; + right: 2px; + bottom: 6px; + left: 6px; + border-radius: 4px; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); +} + .jpetstoretheme .v-window-closebox { padding-right: 4px; border-radius: 0 4px 0 4px; @@ -8388,6 +8627,10 @@ div.v-layout.v-horizontal.v-widget { border-bottom-left-radius: 4px; } +.jpetstoretheme .v-window-closebox-disabled + .v-window-closebox:focus::after, .jpetstoretheme .v-window-resizebox-disabled + .v-window-closebox:focus::after, .jpetstoretheme .v-window-restorebox-disabled + .v-window-closebox:focus::after, .jpetstoretheme .v-window-maximizebox-disabled + .v-window-closebox:focus::after { + left: 6px; +} + .jpetstoretheme .v-window-maximizebox:before { content: "+"; } @@ -12736,6 +12979,36 @@ div.v-layout.v-horizontal.v-widget { color: #6c2621; } +.jpetstoretheme .v-select-twincol-error-info .v-select-twincol-options, .jpetstoretheme .v-select-twincol-error-info .v-select-twincol-selections { + border-color: #00a7f5 !important; + background: #fafdff; + color: #195774; +} + +.jpetstoretheme .v-select-twincol-error-warning .v-select-twincol-options, .jpetstoretheme .v-select-twincol-error-warning .v-select-twincol-selections { + border-color: #fc9c00 !important; + background: #fffdfa; + color: #745119; +} + +.jpetstoretheme .v-select-twincol-error-error .v-select-twincol-options, .jpetstoretheme .v-select-twincol-error-error .v-select-twincol-selections { + border-color: #ed473b !important; + background: #fffbfb; + color: #6c2621; +} + +.jpetstoretheme .v-select-twincol-error-critical .v-select-twincol-options, .jpetstoretheme .v-select-twincol-error-critical .v-select-twincol-selections { + border-color: #fa007d !important; + background: #fffafc; + color: #741947; +} + +.jpetstoretheme .v-select-twincol-error-system .v-select-twincol-options, .jpetstoretheme .v-select-twincol-error-system .v-select-twincol-selections { + border-color: #bb00ff !important; + background: #fefaff; + color: #5c1974; +} + .jpetstoretheme .v-select select { border: 1px solid #c5c5c5; background-color: #fafafa; @@ -14781,19 +15054,19 @@ div.v-layout.v-horizontal.v-widget { } .jpetstoretheme .v-margin-left { - padding-left: 20px; + padding-left: 10px; } .jpetstoretheme .v-margin-bottom { - padding-bottom: 20px; + padding-bottom: 10px; } .jpetstoretheme .v-margin-right { - padding-right: 20px; + padding-right: 10px; } .jpetstoretheme .v-margin-top { - padding-top: 20px; + padding-top: 10px; } .jpetstoretheme .v-panel-caption { @@ -14894,4 +15167,8 @@ div.v-layout.v-horizontal.v-widget { .jpetstoretheme .banner-2 { background-color: #8b9a93; +} + +.jpetstoretheme .grid-button, .jpetstoretheme .grid-textfield { + height: 30px; } \ No newline at end of file