|o4QBaG@5X{!+U_uQfgtx79B!|<_5ZM6~AQ*
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%0DTU;5jF
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
fJY$}J8_)X&A{a)ySyjK)ITmnQ4|L7
zABIF^qL5esIu@X#)hHAw)HWc|*nmc213C?}0G&jGOeA6f3Y|tFBt*6WzUk9RWCRXeN~KMG!pRM
zP4pmakj0v|b+LHHc;`^|$VE8C7Dfts?(x`-D7L|mkn+j(gfbRQVgtiDwKH6%62&Z9
z6+dz
diff --git a/src/main/resources/org/chainoptim/desktop/core/main/HeaderView.fxml b/src/main/resources/org/chainoptim/desktop/core/main/ListHeaderView.fxml
similarity index 88%
rename from src/main/resources/org/chainoptim/desktop/core/main/HeaderView.fxml
rename to src/main/resources/org/chainoptim/desktop/core/main/ListHeaderView.fxml
index 7e58119f..8de3fd81 100644
--- a/src/main/resources/org/chainoptim/desktop/core/main/HeaderView.fxml
+++ b/src/main/resources/org/chainoptim/desktop/core/main/ListHeaderView.fxml
@@ -4,7 +4,7 @@
@@ -12,16 +12,14 @@
-
+
-
+
-
-
\ No newline at end of file
From 27f65dd0c0ae0d709470864d282be86bd25bdb0d Mon Sep 17 00:00:00 2001
From: TudorOrban <130213626+TudorOrban@users.noreply.github.com>
Date: Sat, 23 Mar 2024 16:02:25 +0200
Subject: [PATCH 06/11] Add refresh button for List Header
---
.../main/controller/ListHeaderController.java | 48 ++++++++++++---
.../client/controller/ClientsController.java | 58 +++++++++++--------
.../controller/FactoriesController.java | 2 +-
.../controller/ProductsController.java | 2 +-
.../controller/SuppliersController.java | 2 +-
.../controller/WarehousesController.java | 2 +-
src/main/resources/css/list-header.css | 15 +++++
.../desktop/core/main/ListHeaderView.fxml | 2 +
.../desktop/features/client/ClientsView.fxml | 20 ++++---
9 files changed, 109 insertions(+), 42 deletions(-)
diff --git a/src/main/java/org/chainoptim/desktop/core/main/controller/ListHeaderController.java b/src/main/java/org/chainoptim/desktop/core/main/controller/ListHeaderController.java
index 971d442b..ef216d3c 100644
--- a/src/main/java/org/chainoptim/desktop/core/main/controller/ListHeaderController.java
+++ b/src/main/java/org/chainoptim/desktop/core/main/controller/ListHeaderController.java
@@ -1,11 +1,15 @@
package org.chainoptim.desktop.core.main.controller;
import com.google.inject.Inject;
+import javafx.animation.Animation;
+import javafx.animation.Interpolator;
+import javafx.animation.RotateTransition;
import javafx.fxml.FXML;
import javafx.scene.control.*;
import javafx.scene.effect.ColorAdjust;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
+import javafx.util.Duration;
import org.chainoptim.desktop.core.main.service.NavigationService;
import org.chainoptim.desktop.shared.search.model.SearchParams;
@@ -25,13 +29,15 @@ public class ListHeaderController {
@FXML
private TextField searchBar;
@FXML
+ private Button searchButton;
+ @FXML
private ComboBox sortOptions;
@FXML
private Button orderingButton;
@FXML
- private Button createNewItemButton;
+ private Button refreshButton;
@FXML
- private Button searchButton;
+ private Button createNewItemButton;
private Map sortOptionsMap;
@@ -49,12 +55,16 @@ public ListHeaderController(
this.navigationService = navigationService;
}
- public void initializeHeader(String titleText, String titleIconPath, Map sortOptionsMap, String createNewItemButtonText, String createNewItem) {
+ public void initializeHeader(String titleText, String titleIconPath,
+ Map sortOptionsMap,
+ Runnable refreshAction,
+ String createNewItemButtonText, String createNewItem) {
this.sortOptionsMap = sortOptionsMap;
setTitle(titleText, titleIconPath);
setSearchButton();
setOrderingButton();
setSortOptions(new ArrayList<>(sortOptionsMap.values()));
+ setRefreshButton(refreshAction);
setCreateNewItemButton(createNewItemButtonText);
setNewItemKey(createNewItem);
}
@@ -95,6 +105,28 @@ private void setOrderingButton() {
orderingButton.setGraphic(sortUpImageView);
}
+ public void setRefreshButton(Runnable refreshAction) {
+ Image refreshIcon = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/img/rotate-right-solid.png")));
+ ImageView refreshIconView = new ImageView(refreshIcon);
+ refreshIconView.setFitWidth(14);
+ refreshIconView.setFitHeight(14);
+
+ // Apply rotation on click
+ RotateTransition rotateTransition = new RotateTransition(Duration.seconds(1), refreshIconView);
+ rotateTransition.setByAngle(360);
+ rotateTransition.setCycleCount(1);
+ rotateTransition.setInterpolator(Interpolator.LINEAR);
+
+ refreshButton.setGraphic(refreshIconView);
+
+ refreshButton.setOnAction(e -> {
+ rotateTransition.stop();
+ rotateTransition.playFromStart();
+ // Run refresh action
+ refreshAction.run();
+ });
+ }
+
private void setCreateNewItemButton(String text) {
createNewItemButton.setText("Create New " + text);
Image plusIcon = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/img/plus.png")));
@@ -125,13 +157,13 @@ private void handleOrdering() {
@FXML
private void handleSortOption() {
- String selectedFilter = sortOptions.getValue();
- String backendFilter = sortOptionsMap.entrySet().stream()
- .filter(entry -> Objects.equals(entry.getValue(), selectedFilter))
+ String selectedSortOption = sortOptions.getValue();
+ String backendSortOption = sortOptionsMap.entrySet().stream()
+ .filter(entry -> Objects.equals(entry.getValue(), selectedSortOption))
.map(Map.Entry::getKey)
.findFirst()
- .orElse(selectedFilter);
- searchParams.setSortOption(backendFilter);
+ .orElse(selectedSortOption);
+ searchParams.setSortOption(backendSortOption);
}
private void setNewItemKey(String createNewItem) {
diff --git a/src/main/java/org/chainoptim/desktop/features/client/controller/ClientsController.java b/src/main/java/org/chainoptim/desktop/features/client/controller/ClientsController.java
index 21290ba2..ae912290 100644
--- a/src/main/java/org/chainoptim/desktop/features/client/controller/ClientsController.java
+++ b/src/main/java/org/chainoptim/desktop/features/client/controller/ClientsController.java
@@ -8,6 +8,7 @@
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
+import javafx.scene.control.ScrollPane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import org.chainoptim.desktop.core.abstraction.ControllerFactory;
@@ -45,13 +46,15 @@ public class ClientsController implements Initializable {
@FXML
private PageSelectorController pageSelectorController;
@FXML
- private StackPane pageSelectorContainer;
+ private ScrollPane clientsScrollPane;
@FXML
- private StackPane fallbackContainer;
+ private VBox clientsVBox;
@FXML
private StackPane headerContainer;
@FXML
- private VBox clientsVBox;
+ private StackPane fallbackContainer;
+ @FXML
+ private StackPane pageSelectorContainer;
private long totalCount;
@@ -82,26 +85,11 @@ public ClientsController(ClientService clientService,
public void initialize(URL location, ResourceBundle resources) {
initializeHeader();
loadFallbackManager();
- loadClients();
setUpListeners();
+ loadClients();
initializePageSelector();
}
- private void initializePageSelector() {
- FXMLLoader loader = fxmlLoaderService.setUpLoader(
- "/org/chainoptim/desktop/shared/search/PageSelectorView.fxml",
- controllerFactory::createController
- );
- try {
- Node pageSelectorView = loader.load();
- pageSelectorContainer.getChildren().add(pageSelectorView);
- pageSelectorController = loader.getController();
- searchParams.getPageProperty().addListener((observable, oldPage, newPage) -> loadClients());
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
private void initializeHeader() {
FXMLLoader loader = fxmlLoaderService.setUpLoader(
"/org/chainoptim/desktop/core/main/ListHeaderView.fxml",
@@ -111,7 +99,7 @@ private void initializeHeader() {
Node headerView = loader.load();
headerContainer.getChildren().add(headerView);
headerController = loader.getController();
- headerController.initializeHeader("Clients", "/img/truck-arrow-right-solid.png", sortOptions, "Client", "Create-Client");
+ headerController.initializeHeader("Clients", "/img/truck-arrow-right-solid.png", sortOptions, this::loadClients, "Client", "Create-Client");
} catch (IOException e) {
e.printStackTrace();
}
@@ -125,22 +113,46 @@ private void loadFallbackManager() {
fallbackContainer.getChildren().add(fallbackView);
}
+ private void initializePageSelector() {
+ FXMLLoader loader = fxmlLoaderService.setUpLoader(
+ "/org/chainoptim/desktop/shared/search/PageSelectorView.fxml",
+ controllerFactory::createController
+ );
+ try {
+ Node pageSelectorView = loader.load();
+ pageSelectorContainer.getChildren().add(pageSelectorView);
+ pageSelectorController = loader.getController();
+ searchParams.getPageProperty().addListener((observable, oldPage, newPage) -> loadClients());
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
private void setUpListeners() {
searchParams.getSearchQueryProperty().addListener((observable, oldValue, newValue) -> loadClients());
searchParams.getAscendingProperty().addListener((observable, oldValue, newValue) -> loadClients());
searchParams.getSortOptionProperty().addListener((observable, oldValue, newValue) -> loadClients());
+
+ // Listen to empty fallback state
+ fallbackManager.isEmptyProperty().addListener((observable, oldValue, newValue) -> {
+ clientsScrollPane.setVisible(newValue);
+ clientsScrollPane.setManaged(newValue);
+ fallbackContainer.setVisible(!newValue);
+ fallbackContainer.setManaged(!newValue);
+ });
}
private void loadClients() {
+ fallbackManager.reset();
+ fallbackManager.setLoading(true);
+
User currentUser = TenantContext.getCurrentUser();
if (currentUser == null) {
Platform.runLater(() -> fallbackManager.setLoading(false));
return;
}
-
- fallbackManager.setLoading(true);
-
Integer organizationId = currentUser.getOrganization().getId();
+
clientService.getClientsByOrganizationIdAdvanced(organizationId, searchParams)
.thenApply(this::handleClientResponse)
.exceptionally(this::handleClientException)
diff --git a/src/main/java/org/chainoptim/desktop/features/factory/controller/FactoriesController.java b/src/main/java/org/chainoptim/desktop/features/factory/controller/FactoriesController.java
index a68bf926..94552006 100644
--- a/src/main/java/org/chainoptim/desktop/features/factory/controller/FactoriesController.java
+++ b/src/main/java/org/chainoptim/desktop/features/factory/controller/FactoriesController.java
@@ -99,7 +99,7 @@ private void initializeHeader() {
Node headerView = loader.load();
headerContainer.getChildren().add(headerView);
headerController = loader.getController();
- headerController.initializeHeader("Factories", "/img/industry-solid.png", sortOptions, "Factory", "Create-Factory");
+ headerController.initializeHeader("Factories", "/img/industry-solid.png", sortOptions, this::loadFactories, "Factory", "Create-Factory");
} catch (IOException e) {
e.printStackTrace();
}
diff --git a/src/main/java/org/chainoptim/desktop/features/product/controller/ProductsController.java b/src/main/java/org/chainoptim/desktop/features/product/controller/ProductsController.java
index 55d8fb09..c625a3f3 100644
--- a/src/main/java/org/chainoptim/desktop/features/product/controller/ProductsController.java
+++ b/src/main/java/org/chainoptim/desktop/features/product/controller/ProductsController.java
@@ -97,7 +97,7 @@ private void initializeHeader() {
Node headerView = loader.load();
headerContainer.getChildren().add(headerView);
headerController = loader.getController();
- headerController.initializeHeader("Products", "/img/box-solid.png", sortOptions, "Product", "Create-Product");
+ headerController.initializeHeader("Products", "/img/box-solid.png", sortOptions, this::loadProducts, "Product", "Create-Product");
} catch (IOException e) {
e.printStackTrace();
}
diff --git a/src/main/java/org/chainoptim/desktop/features/supplier/controller/SuppliersController.java b/src/main/java/org/chainoptim/desktop/features/supplier/controller/SuppliersController.java
index 56cd7cbc..fc261002 100644
--- a/src/main/java/org/chainoptim/desktop/features/supplier/controller/SuppliersController.java
+++ b/src/main/java/org/chainoptim/desktop/features/supplier/controller/SuppliersController.java
@@ -99,7 +99,7 @@ private void initializeHeader() {
Node headerView = loader.load();
headerContainer.getChildren().add(headerView);
headerController = loader.getController();
- headerController.initializeHeader("Suppliers", "/img/truck-arrow-right-solid.png", sortOptions, "Supplier", "Create-Supplier");
+ headerController.initializeHeader("Suppliers", "/img/truck-arrow-right-solid.png", sortOptions, this::loadSuppliers, "Supplier", "Create-Supplier");
} catch (IOException e) {
e.printStackTrace();
}
diff --git a/src/main/java/org/chainoptim/desktop/features/warehouse/controller/WarehousesController.java b/src/main/java/org/chainoptim/desktop/features/warehouse/controller/WarehousesController.java
index 63898319..d4608db0 100644
--- a/src/main/java/org/chainoptim/desktop/features/warehouse/controller/WarehousesController.java
+++ b/src/main/java/org/chainoptim/desktop/features/warehouse/controller/WarehousesController.java
@@ -100,7 +100,7 @@ private void initializeHeader() {
Node headerView = loader.load();
headerContainer.getChildren().add(headerView);
headerController = loader.getController();
- headerController.initializeHeader("Warehouses", "/img/warehouse-solid.png", sortOptions, "Warehouse", "Create-Warehouse");
+ headerController.initializeHeader("Warehouses", "/img/warehouse-solid.png", sortOptions, this::loadWarehouses, "Warehouse", "Create-Warehouse");
} catch (IOException e) {
e.printStackTrace();
}
diff --git a/src/main/resources/css/list-header.css b/src/main/resources/css/list-header.css
index 0c0d765c..498907c4 100644
--- a/src/main/resources/css/list-header.css
+++ b/src/main/resources/css/list-header.css
@@ -66,4 +66,19 @@
.ordering-button:hover {
-fx-background-color: #f0f0f0;
+}
+
+.refresh-button {
+ -fx-pref-height: 32px;
+ -fx-background-color: transparent;
+ -fx-focus-color: transparent;
+ -fx-faint-focus-color: transparent;
+ -fx-border-color: #c0c0c0;
+ -fx-border-width: 1px;
+ -fx-border-radius: 4px;
+ -fx-cursor: hand;
+}
+
+.refresh-button:hover {
+ -fx-background-color: #f0f0f0;
}
\ No newline at end of file
diff --git a/src/main/resources/org/chainoptim/desktop/core/main/ListHeaderView.fxml b/src/main/resources/org/chainoptim/desktop/core/main/ListHeaderView.fxml
index 8de3fd81..7ad6296f 100644
--- a/src/main/resources/org/chainoptim/desktop/core/main/ListHeaderView.fxml
+++ b/src/main/resources/org/chainoptim/desktop/core/main/ListHeaderView.fxml
@@ -19,6 +19,8 @@
+
+
diff --git a/src/main/resources/org/chainoptim/desktop/features/client/ClientsView.fxml b/src/main/resources/org/chainoptim/desktop/features/client/ClientsView.fxml
index a552afc3..89c133b0 100644
--- a/src/main/resources/org/chainoptim/desktop/features/client/ClientsView.fxml
+++ b/src/main/resources/org/chainoptim/desktop/features/client/ClientsView.fxml
@@ -2,17 +2,23 @@
+
+ xmlns:fx="http://javafx.com/fxml"
+ styleClass="main-container"
+ fx:controller="org.chainoptim.desktop.features.client.controller.ClientsController">
-
+
+
+
+
+
+
+
-
-
-
+
+
From 3a262e0f0ce5135b90a85112bf9e83238f6a161c Mon Sep 17 00:00:00 2001
From: TudorOrban <130213626+TudorOrban@users.noreply.github.com>
Date: Sat, 23 Mar 2024 16:56:49 +0200
Subject: [PATCH 07/11] Add Back button and navigation history to support it
---
.../main/controller/ListHeaderController.java | 2 +-
.../main/controller/SidebarController.java | 41 ++++++++++--------
.../core/main/service/NavigationService.java | 4 +-
.../main/service/NavigationServiceImpl.java | 30 +++++++++++--
.../client/controller/ClientsController.java | 2 +-
.../controller/CreateClientController.java | 2 +-
.../controller/CreateFactoryController.java | 2 +-
.../controller/FactoriesController.java | 2 +-
.../controller/CreateProductController.java | 2 +-
.../controller/ProductsController.java | 2 +-
.../controller/CreateComponentController.java | 2 +-
.../controller/CreateSupplierController.java | 2 +-
.../controller/SuppliersController.java | 2 +-
.../controller/CreateWarehouseController.java | 2 +-
.../controller/WarehousesController.java | 2 +-
.../shared/fallback/FallbackManager.java | 1 -
src/main/resources/css/forms.css | 1 +
src/main/resources/img/rotate-right-solid.png | Bin 0 -> 7484 bytes
.../desktop/core/main/SidebarView.fxml | 11 ++---
.../main/service/NavigationServiceTest.java | 4 +-
20 files changed, 73 insertions(+), 43 deletions(-)
create mode 100644 src/main/resources/img/rotate-right-solid.png
diff --git a/src/main/java/org/chainoptim/desktop/core/main/controller/ListHeaderController.java b/src/main/java/org/chainoptim/desktop/core/main/controller/ListHeaderController.java
index ef216d3c..bf7d09f9 100644
--- a/src/main/java/org/chainoptim/desktop/core/main/controller/ListHeaderController.java
+++ b/src/main/java/org/chainoptim/desktop/core/main/controller/ListHeaderController.java
@@ -172,7 +172,7 @@ private void setNewItemKey(String createNewItem) {
@FXML
private void handleCreateNewItem() {
- navigationService.switchView(createNewItem);
+ navigationService.switchView(createNewItem, true);
}
}
diff --git a/src/main/java/org/chainoptim/desktop/core/main/controller/SidebarController.java b/src/main/java/org/chainoptim/desktop/core/main/controller/SidebarController.java
index 529a1e1d..7c006471 100644
--- a/src/main/java/org/chainoptim/desktop/core/main/controller/SidebarController.java
+++ b/src/main/java/org/chainoptim/desktop/core/main/controller/SidebarController.java
@@ -46,25 +46,28 @@ public SidebarController(NavigationService navigationService, AuthenticationServ
private VBox buttonContainer;
private final List navigationButtons = new ArrayList<>();
+ private static final String ICONS_PATH = "/img/";
@FXML
public Button toggleButton;
-// @FXML
-// public Button accountButton;
+ @FXML
+ public Button backButton;
@FXML
public Button logoutButton;
// Configuration
private final List orderedKeys = List.of("Overview", "Organization", "Products", "Factories", "Warehouses", "Suppliers", "Clients");
- private final Map buttonIconMap = Map.of(
- "Overview", "globe-solid.png",
- "Organization", "building-regular.png",
- "Products", "box-solid.png",
- "Factories", "industry-solid.png",
- "Warehouses", "warehouse-solid.png",
- "Suppliers", "truck-arrow-right-solid.png",
- "Clients", "universal-access-solid.png",
- "Account", "user-solid.png",
- "Toggle", "bars-solid.png"
+ private final Map buttonIconMap = Map.ofEntries(
+ Map.entry("Overview", "globe-solid.png"),
+ Map.entry("Organization", "building-regular.png"),
+ Map.entry("Products", "box-solid.png"),
+ Map.entry("Factories", "industry-solid.png"),
+ Map.entry("Warehouses", "warehouse-solid.png"),
+ Map.entry("Suppliers", "truck-arrow-right-solid.png"),
+ Map.entry("Clients", "universal-access-solid.png"),
+ Map.entry("Account", "user-solid.png"),
+ Map.entry("Back", "arrow-left-solid.png"),
+ Map.entry("Toggle", "bars-solid.png"),
+ Map.entry("Logout", "right-from-bracket-solid.png")
);
private static final double COLLAPSED_WIDTH = 52;
private static final double EXPANDED_WIDTH = 256;
@@ -75,20 +78,22 @@ public SidebarController(NavigationService navigationService, AuthenticationServ
public void initialize() {
initializeNavigationButtons();
createSidebarButtons();
- setButtonGraphic(logoutButton, "/img/right-from-bracket-solid.png");
// Navigate to Overview
- navigationService.switchView("Overview");
+ navigationService.switchView("Overview", true);
- // Toggle button
- setButtonGraphic(toggleButton, "/img/" + buttonIconMap.get("Toggle"));
+ // Back, Toggle and Logout buttons
+ setButtonGraphic(backButton, ICONS_PATH + buttonIconMap.get("Back"));
+ backButton.setOnAction(e -> navigationService.goBack());
+ setButtonGraphic(toggleButton, ICONS_PATH + buttonIconMap.get("Toggle"));
toggleButton.setOnAction(e -> toggleSidebar());
+ setButtonGraphic(logoutButton, ICONS_PATH + buttonIconMap.get("Logout"));
}
private void initializeNavigationButtons() {
orderedKeys.forEach(key -> {
- String iconPath = "/img/" + buttonIconMap.get(key);
- Runnable action = () -> navigationService.switchView(key);
+ String iconPath = ICONS_PATH + buttonIconMap.get(key);
+ Runnable action = () -> navigationService.switchView(key, true);
navigationButtons.add(new SidebarButton(key, iconPath, action));
});
}
diff --git a/src/main/java/org/chainoptim/desktop/core/main/service/NavigationService.java b/src/main/java/org/chainoptim/desktop/core/main/service/NavigationService.java
index 2c048a04..3042cdbf 100644
--- a/src/main/java/org/chainoptim/desktop/core/main/service/NavigationService.java
+++ b/src/main/java/org/chainoptim/desktop/core/main/service/NavigationService.java
@@ -4,7 +4,9 @@
public interface NavigationService {
- void switchView(String viewKey);
+ void switchView(String viewKey, boolean forward);
void setMainContentArea(StackPane contentArea);
+
+ void goBack();
}
diff --git a/src/main/java/org/chainoptim/desktop/core/main/service/NavigationServiceImpl.java b/src/main/java/org/chainoptim/desktop/core/main/service/NavigationServiceImpl.java
index a74644e9..6fb3a07b 100644
--- a/src/main/java/org/chainoptim/desktop/core/main/service/NavigationServiceImpl.java
+++ b/src/main/java/org/chainoptim/desktop/core/main/service/NavigationServiceImpl.java
@@ -11,9 +11,7 @@
import lombok.Getter;
import lombok.Setter;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -44,6 +42,7 @@ public NavigationServiceImpl(FXMLLoaderService fxmlLoaderService,
private StackPane mainContentArea;
private String currentViewKey;
+ private List previousViewKeys;
@Getter
private static final Map viewCache = new HashMap<>();
@@ -73,7 +72,7 @@ public NavigationServiceImpl(FXMLLoaderService fxmlLoaderService,
Map.entry("Create-Stage", "/org/chainoptim/desktop/features/client/CreateFactoryStageView.fxml")
);
- public void switchView(String viewKey) {
+ public void switchView(String viewKey, boolean forward) {
// Skip if already there
if (Objects.equals(currentViewKey, viewKey)) {
return;
@@ -88,6 +87,7 @@ public void switchView(String viewKey) {
// Display view
if (view != null) {
threadRunner.runLater(() -> mainContentArea.getChildren().setAll(view));
+ handleHistory(forward);
currentViewKey = viewKey;
}
}
@@ -125,6 +125,28 @@ private String findBaseKey(String viewKey) {
return baseViewKey;
}
+ private void handleHistory(boolean forward) {
+ // Add to history if forward and remove last otherwise
+ if (forward) {
+ if (previousViewKeys == null) {
+ previousViewKeys = new ArrayList<>();
+ }
+ if (currentViewKey != null) {
+ previousViewKeys.add(currentViewKey);
+ }
+ } else {
+ if (previousViewKeys != null && !previousViewKeys.isEmpty()) {
+ previousViewKeys.removeLast();
+ }
+ }
+ }
+
+ public void goBack() {
+ if (previousViewKeys != null && !previousViewKeys.isEmpty()) {
+ switchView(previousViewKeys.getLast(), false);
+ }
+ }
+
public static void invalidateViewCache() {
viewCache.clear();
}
diff --git a/src/main/java/org/chainoptim/desktop/features/client/controller/ClientsController.java b/src/main/java/org/chainoptim/desktop/features/client/controller/ClientsController.java
index ae912290..2ec5e4fa 100644
--- a/src/main/java/org/chainoptim/desktop/features/client/controller/ClientsController.java
+++ b/src/main/java/org/chainoptim/desktop/features/client/controller/ClientsController.java
@@ -214,7 +214,7 @@ private void openClientDetails(Integer clientId) {
currentSelectionService.setSelectedId(clientId);
currentSelectionService.setSelectedPage("Client");
- navigationService.switchView("Client?id=" + clientId);
+ navigationService.switchView("Client?id=" + clientId, true);
}
diff --git a/src/main/java/org/chainoptim/desktop/features/client/controller/CreateClientController.java b/src/main/java/org/chainoptim/desktop/features/client/controller/CreateClientController.java
index dd360898..948ffc08 100644
--- a/src/main/java/org/chainoptim/desktop/features/client/controller/CreateClientController.java
+++ b/src/main/java/org/chainoptim/desktop/features/client/controller/CreateClientController.java
@@ -115,7 +115,7 @@ private void handleSubmit() {
Client client = clientOptional.get();
fallbackManager.setLoading(false);
currentSelectionService.setSelectedId(client.getId());
- navigationService.switchView("Client?id=" + client.getId());
+ navigationService.switchView("Client?id=" + client.getId(), true);
})
)
.exceptionally(ex -> {
diff --git a/src/main/java/org/chainoptim/desktop/features/factory/controller/CreateFactoryController.java b/src/main/java/org/chainoptim/desktop/features/factory/controller/CreateFactoryController.java
index 1f2b269e..e2e71383 100644
--- a/src/main/java/org/chainoptim/desktop/features/factory/controller/CreateFactoryController.java
+++ b/src/main/java/org/chainoptim/desktop/features/factory/controller/CreateFactoryController.java
@@ -115,7 +115,7 @@ private void handleSubmit() {
Factory factory = factoryOptional.get();
fallbackManager.setLoading(false);
currentSelectionService.setSelectedId(factory.getId());
- navigationService.switchView("Factory?id=" + factory.getId());
+ navigationService.switchView("Factory?id=" + factory.getId(), true);
})
)
.exceptionally(ex -> {
diff --git a/src/main/java/org/chainoptim/desktop/features/factory/controller/FactoriesController.java b/src/main/java/org/chainoptim/desktop/features/factory/controller/FactoriesController.java
index 94552006..d070d90e 100644
--- a/src/main/java/org/chainoptim/desktop/features/factory/controller/FactoriesController.java
+++ b/src/main/java/org/chainoptim/desktop/features/factory/controller/FactoriesController.java
@@ -220,6 +220,6 @@ private void openFactoryDetails(Integer factoryId) {
currentSelectionService.setSelectedId(factoryId);
currentSelectionService.setSelectedPage("Factory");
- navigationService.switchView("Factory?id=" + factoryId);
+ navigationService.switchView("Factory?id=" + factoryId, true);
}
}
diff --git a/src/main/java/org/chainoptim/desktop/features/product/controller/CreateProductController.java b/src/main/java/org/chainoptim/desktop/features/product/controller/CreateProductController.java
index aca2a3ef..2400b872 100644
--- a/src/main/java/org/chainoptim/desktop/features/product/controller/CreateProductController.java
+++ b/src/main/java/org/chainoptim/desktop/features/product/controller/CreateProductController.java
@@ -117,7 +117,7 @@ private void handleSubmit() {
Product product = productOptional.get();
fallbackManager.setLoading(false);
currentSelectionService.setSelectedId(product.getId());
- navigationService.switchView("Product?id=" + product.getId());
+ navigationService.switchView("Product?id=" + product.getId(), true);
})
)
.exceptionally(ex -> {
diff --git a/src/main/java/org/chainoptim/desktop/features/product/controller/ProductsController.java b/src/main/java/org/chainoptim/desktop/features/product/controller/ProductsController.java
index c625a3f3..345a0006 100644
--- a/src/main/java/org/chainoptim/desktop/features/product/controller/ProductsController.java
+++ b/src/main/java/org/chainoptim/desktop/features/product/controller/ProductsController.java
@@ -209,6 +209,6 @@ private void openProductDetails(Integer productId) {
// And also encode it in the viewKey for caching purposes
currentSelectionService.setSelectedId(productId);
currentSelectionService.setSelectedPage("Product");
- navigationService.switchView("Product?id=" + productId);
+ navigationService.switchView("Product?id=" + productId, true);
}
}
\ No newline at end of file
diff --git a/src/main/java/org/chainoptim/desktop/features/productpipeline/controller/CreateComponentController.java b/src/main/java/org/chainoptim/desktop/features/productpipeline/controller/CreateComponentController.java
index d2b42bcd..2af9f206 100644
--- a/src/main/java/org/chainoptim/desktop/features/productpipeline/controller/CreateComponentController.java
+++ b/src/main/java/org/chainoptim/desktop/features/productpipeline/controller/CreateComponentController.java
@@ -117,7 +117,7 @@ private void handleSubmit() {
Component component = componentOptional.get();
fallbackManager.setLoading(false);
currentSelectionService.setSelectedId(component.getId());
- navigationService.switchView("Component?id=" + component.getId());
+ navigationService.switchView("Component?id=" + component.getId(), true);
})
)
.exceptionally(ex -> {
diff --git a/src/main/java/org/chainoptim/desktop/features/supplier/controller/CreateSupplierController.java b/src/main/java/org/chainoptim/desktop/features/supplier/controller/CreateSupplierController.java
index 3997490b..f5dcfa44 100644
--- a/src/main/java/org/chainoptim/desktop/features/supplier/controller/CreateSupplierController.java
+++ b/src/main/java/org/chainoptim/desktop/features/supplier/controller/CreateSupplierController.java
@@ -113,7 +113,7 @@ private void handleSubmit() {
Supplier supplier = supplierOptional.get();
fallbackManager.setLoading(false);
currentSelectionService.setSelectedId(supplier.getId());
- navigationService.switchView("Supplier?id=" + supplier.getId());
+ navigationService.switchView("Supplier?id=" + supplier.getId(), true);
})
)
.exceptionally(ex -> {
diff --git a/src/main/java/org/chainoptim/desktop/features/supplier/controller/SuppliersController.java b/src/main/java/org/chainoptim/desktop/features/supplier/controller/SuppliersController.java
index fc261002..d99259bc 100644
--- a/src/main/java/org/chainoptim/desktop/features/supplier/controller/SuppliersController.java
+++ b/src/main/java/org/chainoptim/desktop/features/supplier/controller/SuppliersController.java
@@ -213,7 +213,7 @@ private void openSupplierDetails(Integer supplierId) {
currentSelectionService.setSelectedId(supplierId);
currentSelectionService.setSelectedPage("Supplier");
- navigationService.switchView("Supplier?id=" + supplierId);
+ navigationService.switchView("Supplier?id=" + supplierId, true);
}
diff --git a/src/main/java/org/chainoptim/desktop/features/warehouse/controller/CreateWarehouseController.java b/src/main/java/org/chainoptim/desktop/features/warehouse/controller/CreateWarehouseController.java
index ef1ab1de..28883646 100644
--- a/src/main/java/org/chainoptim/desktop/features/warehouse/controller/CreateWarehouseController.java
+++ b/src/main/java/org/chainoptim/desktop/features/warehouse/controller/CreateWarehouseController.java
@@ -115,7 +115,7 @@ private void handleSubmit() {
fallbackManager.setLoading(false);
currentSelectionService.setSelectedId(warehouse.getId());
System.out.println(warehouseDTO);
- navigationService.switchView("Warehouse?id=" + warehouse.getId());
+ navigationService.switchView("Warehouse?id=" + warehouse.getId(), true);
})
)
.exceptionally(ex -> {
diff --git a/src/main/java/org/chainoptim/desktop/features/warehouse/controller/WarehousesController.java b/src/main/java/org/chainoptim/desktop/features/warehouse/controller/WarehousesController.java
index d4608db0..7de47fbb 100644
--- a/src/main/java/org/chainoptim/desktop/features/warehouse/controller/WarehousesController.java
+++ b/src/main/java/org/chainoptim/desktop/features/warehouse/controller/WarehousesController.java
@@ -215,7 +215,7 @@ private void openWarehouseDetails(Integer warehouseId) {
currentSelectionService.setSelectedId(warehouseId);
currentSelectionService.setSelectedPage("Warehouse");
- navigationService.switchView("Warehouse?id=" + warehouseId);
+ navigationService.switchView("Warehouse?id=" + warehouseId, true);
}
diff --git a/src/main/java/org/chainoptim/desktop/shared/fallback/FallbackManager.java b/src/main/java/org/chainoptim/desktop/shared/fallback/FallbackManager.java
index 9b9fe2a3..f65124b5 100644
--- a/src/main/java/org/chainoptim/desktop/shared/fallback/FallbackManager.java
+++ b/src/main/java/org/chainoptim/desktop/shared/fallback/FallbackManager.java
@@ -23,7 +23,6 @@ public String getErrorMessage() {
}
public void setErrorMessage(String errorMessage) {
- System.out.println("Setting error message: " + errorMessage);
this.errorMessage.set(errorMessage);
}
diff --git a/src/main/resources/css/forms.css b/src/main/resources/css/forms.css
index 2e1a24a5..53ba412c 100644
--- a/src/main/resources/css/forms.css
+++ b/src/main/resources/css/forms.css
@@ -14,6 +14,7 @@
-fx-margin-bottom: 4px;
-fx-font-size: 18px;
-fx-font-weight: bold;
+ -fx-padding: 4px;
}
.form-title {
diff --git a/src/main/resources/img/rotate-right-solid.png b/src/main/resources/img/rotate-right-solid.png
new file mode 100644
index 0000000000000000000000000000000000000000..873db7e55a3a37d6d1a86ee1e20cc16304b269dd
GIT binary patch
literal 7484
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