Files
Ruokamanageri/src/main/java/fi/lpam/gui/Kierroshallinta.java
T
2026-05-11 00:00:27 +03:00

128 lines
4.7 KiB
Java

package fi.lpam.gui;
import com.dlsc.gemsfx.MultiColumnListView;
import fi.lpam.dataluokat.Asiakas;
import fi.lpam.dataluokat.Kierros;
import fi.lpam.gui.elementit.AsiakasListCell;
import fi.lpam.gui.elementit.TabPohja;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Objects;
public class Kierroshallinta extends TabPohja {
private final MultiColumnListView<Asiakas> mclv = new MultiColumnListView<>();
private final ArrayList<Kierros> kierrokset = Kierros.haeKaikki();
private final ArrayList<Asiakas> kaikkiAsiakkaat = Asiakas.haeKaikki();
public Kierroshallinta() {
BorderPane root = new BorderPane();
this.getChildren().add(root);
root.setPadding(oletusInsets);
root.setCenter(mclv);
mclv.setCellFactory(_ -> new AsiakasListCell(mclv));
mclv.setPlaceholderFrom(new Asiakas(""));
mclv.setPlaceholderTo(new Asiakas(""));
rakennaSarakkeet();
BorderPane yläpalkki = new BorderPane();
root.setTop(yläpalkki);
Label infoTeksti = new Label("Siirrä asiakkaat haluamallesi kierrokselle. Kierroksia voit lisätä painamalla lisää uusi kierros painiketta.\nKierrosnumerot päivittyvät, sekä tyhjät poistuvat kierroksia tallentaessa.");
infoTeksti.setFont(tekstiFont);
yläpalkki.setLeft(infoTeksti);
HBox yläpalkinNapit = new HBox();
yläpalkinNapit.setSpacing(5);
yläpalkki.setRight(yläpalkinNapit);
Button lisääKierros = new Button("Lisää uusi kierros");
lisääKierros.setOnAction(_ -> {
int uudenKierroksenNumero = mclv.getColumns().size();
lisaaKierros(new Kierros(uudenKierroksenNumero, FXCollections.observableArrayList(new ArrayList<>())));
});
lisääKierros.setFont(TabPohja.buttonFont);
yläpalkinNapit.getChildren().add(lisääKierros);
Button tallenna = new Button("Tallenna kierrokset");
tallenna.setFont(TabPohja.buttonFont);
tallenna.setOnAction(_ ->tallennaKierrokset());
yläpalkinNapit.getChildren().add(tallenna);
}
private void rakennaSarakkeet() {
mclv.getColumns().clear();
ObservableList<Asiakas> eiKierroksella = FXCollections.observableArrayList(new ArrayList<>());
HashSet<Integer> kierroksellaOlevatAsiakasIDt = new HashSet<>();
if (!kierrokset.isEmpty()) {
for (Kierros kierros : kierrokset) {
lisaaKierros(kierros);
for (Asiakas asiakas : kierros.getAsiakkaat()) {
kierroksellaOlevatAsiakasIDt.add(asiakas.getId());
}
}
}
for (Asiakas k : Objects.requireNonNull(kaikkiAsiakkaat)) {
if (!kierroksellaOlevatAsiakasIDt.contains(k.getId())) {
eiKierroksella.add(k);
}
}
MultiColumnListView.ListViewColumn<Asiakas> colEiKierroksella = new MultiColumnListView.ListViewColumn<>();
colEiKierroksella.setHeader(new Label("Ei vielä kierroksella"));
colEiKierroksella.setItems(FXCollections.observableArrayList(eiKierroksella));
mclv.getColumns().add(colEiKierroksella);
}
private void lisaaKierros(Kierros kierros) {
if (kierros.getId() == -1) kierrokset.add(kierros);
MultiColumnListView.ListViewColumn<Asiakas> uusiSarake = new MultiColumnListView.ListViewColumn<>();
uusiSarake.setHeader(new Label("Kierros " + kierros.getKierrosNumero()));
uusiSarake.setItems(kierros.getAsiakkaat());
mclv.getColumns().add(kierros.getKierrosNumero()-1, uusiSarake);
}
private void tallennaKierrokset() {
int kierrosNumero = 1;
int index = 0;
for (int i = 0; i < kierrokset.size();) {
Kierros k = kierrokset.get(i);
k.setAsiakkaat(FXCollections.observableArrayList(new ArrayList<>()));
k.setAsiakkaat(mclv.getColumns().get(index).getItems());
index++;
if (k.getAsiakkaat().isEmpty()) {
k.poista();
kierrokset.remove(i);
continue;
}
k.setKierrosNumero(kierrosNumero);
kierrosNumero++;
k.tallenna();
i++;
}
rakennaSarakkeet();
Alert info = new Alert(Alert.AlertType.INFORMATION);
info.setTitle("Kierrokset tallennettu");
info.setHeaderText("Kierrokset tallennettu onnistuneesti");
info.setContentText(null);
info.showAndWait();
}
}