diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/modules/stock_screen/product_manager_screen/ProductManagerScreenController.java b/Workspace/client/src/main/java/com/pqt/client/gui/modules/stock_screen/product_manager_screen/ProductManagerScreenController.java index b13b8702..f4f0cb23 100644 --- a/Workspace/client/src/main/java/com/pqt/client/gui/modules/stock_screen/product_manager_screen/ProductManagerScreenController.java +++ b/Workspace/client/src/main/java/com/pqt/client/gui/modules/stock_screen/product_manager_screen/ProductManagerScreenController.java @@ -21,6 +21,7 @@ class ProductManagerScreenController { void setView(ProductManagerScreenView view){ this.view = view; + view.setCategoryCollection(model.getCategoryCollection()); } ChangeListener getProductComponentSelectionListener() { @@ -36,9 +37,10 @@ class ProductManagerScreenController { } void updateView() { + //view.setCategoryCollection(model.getCategoryCollection()); view.setProduct(model.getActualProductState()); - view.setCategoryCollection(model.getCategoryCollection()); view.setProductCollection(model.getEligibleComponentList()); + view.updateGuiLocks(); } IValidatorComponentListener getValidatorListener() { @@ -63,32 +65,46 @@ class ProductManagerScreenController { listenerList.remove(IValidatorComponentListener.class, l); } + boolean lockAmountRemainingfield(){ + return !model.getActualProductState().getComponents().isEmpty(); + } + + boolean lockValidationButton(){ + return !model.isProductCreationPossible(); + } + boolean isProductHighlighted(Product product) { return model.getActualProductState().getComponents().contains(product); } - void onNameChanged(String oldVal, String newVal) { + void onNameChanged(String newVal) { model.changeName(newVal); + updateView(); } - void onPriceChanged(double oldVal, double newVal) { + void onPriceChanged(double newVal) { model.changePrice(newVal); + updateView(); } - void onCategoryChanged(Category oldVal, Category newVal) { + void onCategoryChanged(Category newVal) { model.changeCategory(newVal); + view.updateGuiLocks(); } - void onAmountRemainingChanged(int oldVal, int newVal) { + void onAmountRemainingChanged(int newVal) { model.changeAmountRemaining(newVal); + updateView(); } - void onAmountSoldChanged(int oldVal, int newVal) { + void onAmountSoldChanged(int newVal) { model.changeAmountSold(newVal); + updateView(); } - void onSellableStateChanged(boolean oldVal, boolean newVal) { + void onSellableStateChanged(boolean newVal) { model.setSellable(newVal); + updateView(); } public void delete() { diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/modules/stock_screen/product_manager_screen/ProductManagerScreenModel.java b/Workspace/client/src/main/java/com/pqt/client/gui/modules/stock_screen/product_manager_screen/ProductManagerScreenModel.java index 49e1b7f0..8e49e06f 100644 --- a/Workspace/client/src/main/java/com/pqt/client/gui/modules/stock_screen/product_manager_screen/ProductManagerScreenModel.java +++ b/Workspace/client/src/main/java/com/pqt/client/gui/modules/stock_screen/product_manager_screen/ProductManagerScreenModel.java @@ -39,6 +39,7 @@ class ProductManagerScreenModel { boolean isProductCreationPossible() { return (initialData==null || !areProductsEqual(initialData, currentData)) + && currentData.getName() != null && !currentData.getName().isEmpty() && currentData.getCategory()!=null && currentData.getPrice()>=0; diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/modules/stock_screen/product_manager_screen/ProductManagerScreenView.java b/Workspace/client/src/main/java/com/pqt/client/gui/modules/stock_screen/product_manager_screen/ProductManagerScreenView.java index 8bde00d1..33d9db95 100644 --- a/Workspace/client/src/main/java/com/pqt/client/gui/modules/stock_screen/product_manager_screen/ProductManagerScreenView.java +++ b/Workspace/client/src/main/java/com/pqt/client/gui/modules/stock_screen/product_manager_screen/ProductManagerScreenView.java @@ -32,6 +32,7 @@ class ProductManagerScreenView implements IFXComponent { private ComboBox productCategoryComboBox; private CheckBox productSellableCheckBox; private ListView productComponentsListView; + private SimpleValidator validator; ProductManagerScreenView(ProductManagerScreenController ctrl) { this.ctrl = ctrl; @@ -52,54 +53,69 @@ class ProductManagerScreenView implements IFXComponent { Label productNameLabel = new Label(GUIStringTool.getProductNameLabel()); productNameTextField = new TextField(); - productNameTextField.textProperty().addListener((obs, oldVal, newVal)->ctrl.onNameChanged(oldVal,newVal)); + productNameTextField.focusedProperty().addListener((obs, oldVal, newVal)->{ + if(!newVal) + ctrl.onNameChanged(productNameTextField.getText()); + }); addLineToGrid(mainPaneCenterContent, productNameLabel, productNameTextField); Label productCategoryLabel = new Label(GUIStringTool.getProductCategoryLabel()); productCategoryComboBox = new ComboBox<>(); productCategoryComboBox.setEditable(true); productCategoryComboBox.setConverter(GUIStringTool.getCategoryStringConverter()); - productCategoryComboBox.valueProperty().addListener((obs, oldVal, newVal)->ctrl.onCategoryChanged(oldVal, newVal)); + productCategoryComboBox.valueProperty().addListener((obs, oldVal, newVal)->{ + ctrl.onCategoryChanged(newVal); + }); addLineToGrid(mainPaneCenterContent, productCategoryLabel, productCategoryComboBox); Label productAmountRemainingLabel = new Label(GUIStringTool.getProductAmountRemainingLabel()); productAmountRemainingTextField = getNumberOnlyTextField(intFormat); - productAmountRemainingTextField.textProperty().addListener((obs, oldVal, newVal)->{ - try{ - int oldInt = oldVal.isEmpty()?0:Integer.parseInt(oldVal); - int newInt = newVal.isEmpty()?0:Integer.parseInt(newVal); - ctrl.onAmountRemainingChanged(oldInt, newInt); - }catch(NumberFormatException e){ - e.printStackTrace(); + productAmountRemainingTextField.focusedProperty().addListener((obs, oldVal, newVal)->{ + if(!newVal) { + try { + int newInt = productAmountRemainingTextField.getText().isEmpty() ? + 0 : + Integer.parseInt(productAmountRemainingTextField.getText()); + ctrl.onAmountRemainingChanged(newInt); + } catch (NumberFormatException e) { + e.printStackTrace(); + } } }); addLineToGrid(mainPaneCenterContent, productAmountRemainingLabel, productAmountRemainingTextField); Label productAmountSoldLabel = new Label(GUIStringTool.getProductAmountSoldLabel()); productAmountSoldTextField = getNumberOnlyTextField(intFormat); - productAmountSoldTextField.textProperty().addListener((obs, oldVal, newVal)->{ - try{ - int oldInt = oldVal.isEmpty()?0:Integer.parseInt(oldVal); - int newInt = newVal.isEmpty()?0:Integer.parseInt(newVal); - ctrl.onAmountSoldChanged(oldInt, newInt); - }catch(NumberFormatException e){ - e.printStackTrace(); + productAmountSoldTextField.focusedProperty().addListener((obs, oldVal, newVal)->{ + if(!newVal) { + try { + int newInt = productAmountSoldTextField.getText().isEmpty() ? + 0 : + Integer.parseInt(productAmountSoldTextField.getText()); + ctrl.onAmountSoldChanged(newInt); + } catch (NumberFormatException e) { + e.printStackTrace(); + } } }); addLineToGrid(mainPaneCenterContent, productAmountSoldLabel, productAmountSoldTextField); Label productSellableLabel = new Label(GUIStringTool.getProductSellableLabel()); productSellableCheckBox = new CheckBox(); - productSellableCheckBox.selectedProperty().addListener((obs, oldVal, newVal)->ctrl.onSellableStateChanged(oldVal,newVal)); + productSellableCheckBox.selectedProperty().addListener((obs, oldVal, newVal)->ctrl.onSellableStateChanged(newVal)); addLineToGrid(mainPaneCenterContent, productSellableLabel, productSellableCheckBox); Label productPriceLabel = new Label(GUIStringTool.getProductPriceLabel()); productPriceTextField = getNumberOnlyTextField(priceFormat); - productPriceTextField.textProperty().addListener((obs, oldVal, newVal)->{ - try{ - ctrl.onPriceChanged((oldVal.isEmpty()?-1:Double.parseDouble(oldVal)), (newVal.isEmpty()?-1:Double.parseDouble(newVal))); - }catch(NumberFormatException e){ - e.printStackTrace(); + productPriceTextField.focusedProperty().addListener((obs, oldVal, newVal)->{ + if(!newVal) { + try { + ctrl.onPriceChanged((productPriceTextField.getText().isEmpty() ? + -1 : + Double.parseDouble(productPriceTextField.getText()))); + } catch (NumberFormatException e) { + e.printStackTrace(); + } } }); addLineToGrid(mainPaneCenterContent, productPriceLabel, productPriceTextField); @@ -147,7 +163,7 @@ class ProductManagerScreenView implements IFXComponent { HBox mainPaneBottomContent = new HBox(); HBox separator = new HBox(); - SimpleValidator validator = new SimpleValidator(); + validator = new SimpleValidator(); validator.addListener(ctrl.getValidatorListener()); mainPaneBottomContent.getChildren().addAll(separator, validator.getPane()); HBox.setHgrow(separator, Priority.ALWAYS); @@ -209,6 +225,14 @@ class ProductManagerScreenView implements IFXComponent { productComponentsListView.getItems().addAll(productCollection); }); } + + void updateGuiLocks(){ + Platform.runLater(()->{ + productAmountRemainingTextField.setDisable(ctrl.lockAmountRemainingfield()); + validator.setValidationButtonEnable(!ctrl.lockValidationButton()); + }); + } + public void delete() { ctrl = null; } diff --git a/Workspace/server/src/main/java/com/pqt/server/TestMain.java b/Workspace/server/src/main/java/com/pqt/server/TestMain.java new file mode 100644 index 00000000..a5ae32f1 --- /dev/null +++ b/Workspace/server/src/main/java/com/pqt/server/TestMain.java @@ -0,0 +1,63 @@ +package com.pqt.server; + +import com.pqt.core.communication.GSonMessageToolFactory; +import com.pqt.core.communication.IMessageToolFactory; +import com.pqt.core.communication.IObjectFormatter; +import com.pqt.core.entities.messages.Message; +import com.pqt.core.entities.messages.MessageType; +import com.pqt.core.entities.product.Category; +import com.pqt.core.entities.product.Product; +import com.pqt.core.entities.user_account.Account; +import com.pqt.core.entities.user_account.AccountLevel; +import com.pqt.server.module.account.FileAccountDao; +import com.pqt.server.module.account.IAccountDao; +import com.pqt.server.module.stock.FileStockDao; +import com.pqt.server.module.stock.IStockDao; + +import java.util.ArrayList; +import java.util.List; + +public class TestMain { + + public static void main(String[] args){ + + IMessageToolFactory messageToolFactory = new GSonMessageToolFactory(); + IObjectFormatter messageFormater = messageToolFactory.getObjectFormatter(Message.class); + System.out.println(messageFormater.format(new Message(MessageType.QUERY_PING, null, null, null, null))); + + //generateAccountFile(); + //generateProductFile(); + } + + private static void generateProductFile(){ + System.out.println("PRODUCTS"); + List products = new ArrayList<>(); + + Category mealsCat = new Category(0, "Meals"); + Category drinksCat = new Category(1, "Drinks"); + Category sidesCat = new Category(2, "Sides"); + + //long id, String name, int amountRemaining, int amountSold, boolean sellable, double price, List components, Category category + products.add(new Product(0, "Meal 1", 10, 0, true, 1d, null, mealsCat)); + products.add(new Product(0, "Meal 2", 20, 10, true, 1.5d, null, mealsCat)); + products.add(new Product(0, "Drink 1", 30, 20, true, 2d, null, drinksCat)); + products.add(new Product(0, "Side 1", 40, 30, true, 2.5d, null, sidesCat)); + + IStockDao stockDao = new FileStockDao("G:\\temp"); + products.forEach(stockDao::addProduct); + } + + private static void generateAccountFile(){ + System.out.println("ACCOUNTS"); + List accounts = new ArrayList<>(); + + accounts.add(new Account("Master", "Master", AccountLevel.MASTER)); + accounts.add(new Account("Waiter", "Waiter", AccountLevel.WAITER)); + accounts.add(new Account("Guest", "Guest", AccountLevel.GUEST)); + accounts.add(new Account("Staff", "Staff", AccountLevel.STAFF)); + accounts.add(new Account("Lowest", "Lowest", AccountLevel.LOWEST)); + + IAccountDao accountDao = new FileAccountDao("G:\\temp"); + accounts.forEach(accountDao::addAccount); + } +}