From 00313aa49dc11ca56cd8259417cc5f1413237677 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Koivisto=20Ida=20Maria=20Hannuntyt=C3=A4r?=
 <ida.m.koivisto@student.jyu.fi>
Date: Mon, 24 Mar 2025 20:49:13 +0200
Subject: [PATCH] =?UTF-8?q?ralleja=20saadaan=20lis=C3=A4tty=C3=A4=20henkil?=
 =?UTF-8?q?=C3=B6lle?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/RalliJava/Henkilo.java           |  14 +--
 src/RalliJava/Ralli.java             |  41 +++++--
 src/RalliJava/Rallit.java            |   4 +-
 src/RalliJava/Rekisteri.java         |  27 ++---
 src/application/RalliController.java | 163 +++++++++++++++++----------
 src/application/Sample.fxml          |   5 +-
 src/application/henkilonLisays.fxml  | 151 +++++++++++++++++++++++++
 src/application/rallinLisays.fxml    | 111 ++++++++++++++++++
 8 files changed, 421 insertions(+), 95 deletions(-)
 create mode 100644 src/application/henkilonLisays.fxml
 create mode 100644 src/application/rallinLisays.fxml

diff --git a/src/RalliJava/Henkilo.java b/src/RalliJava/Henkilo.java
index e442247..a28ad64 100644
--- a/src/RalliJava/Henkilo.java
+++ b/src/RalliJava/Henkilo.java
@@ -11,7 +11,7 @@ import java.util.Random;
  */
 public class Henkilo {
     
-    private int     tunnusNro       = 0;
+    private int     henkilonTunnusNro       = 0;
     private String  nimi            = "";
     private String  sukunimi        = "";
     private int     ika             = 0;
@@ -27,7 +27,7 @@ public class Henkilo {
      * 
      */
     public void rekisteroi() {
-        this.tunnusNro = seuraavaNro;
+        henkilonTunnusNro = seuraavaNro;
         seuraavaNro++;
     }
     
@@ -70,7 +70,7 @@ public class Henkilo {
         if(kp==5) kotipaikkakunta = "Rovaniemi";
         if(kp==6) kotipaikkakunta = "Keuruu";
         
-        Henkilo henkilo = new Henkilo(tunnusNro, nimi, sukunimi, ika, kotipaikkakunta, seura, rallienMaara, voitetutRallit);
+        Henkilo henkilo = new Henkilo(henkilonTunnusNro, nimi, sukunimi, ika, kotipaikkakunta, seura, rallienMaara, voitetutRallit);
         henkilo.tulosta(System.out);
     }
     
@@ -78,8 +78,8 @@ public class Henkilo {
     /**
      * @return tunnusnro
      */
-    public  int getTunnusNro() {
-        return tunnusNro;
+    public  int getHenkilonTunnusNro() {
+        return henkilonTunnusNro;
     }
     
     /**
@@ -101,7 +101,7 @@ public class Henkilo {
      */
     public Henkilo(int tunnusNro, String nimi, String sukunimi, int ika, String kotipaikkakunta, String seura, int rallienMaara, int voitetutRallit) {
     this.nimi = nimi;
-    this.tunnusNro = tunnusNro;
+    this.henkilonTunnusNro = tunnusNro;
     this.sukunimi = sukunimi;
     this.ika = ika;
     this.seura = seura;
@@ -114,7 +114,7 @@ public class Henkilo {
      * @param tulostettava tietovirta mitä tulostetaan
      */
     public void tulosta(PrintStream tulostettava) {
-        tulostettava.println(String.format("%03d", tunnusNro, 3) + " " + nimi +  " " + sukunimi + ", ikä: " + ika);
+        tulostettava.println(String.format("%03d", henkilonTunnusNro, 3) + " " + nimi +  " " + sukunimi + ", ikä: " + ika);
         tulostettava.println("Kotipaikkakunta: " + kotipaikkakunta);
         tulostettava.println("Seura: " + seura);
         tulostettava.println("Osallistunut " + rallienMaara + " ralliin");
diff --git a/src/RalliJava/Ralli.java b/src/RalliJava/Ralli.java
index bcc9a7e..80b1fd6 100644
--- a/src/RalliJava/Ralli.java
+++ b/src/RalliJava/Ralli.java
@@ -18,8 +18,8 @@ public class Ralli {
      * Vois kirjottaa luokan CRC-kortin vastuut
      *
      */
-    private int     tunnusNro;
-    private int     htunnusNro;
+    private int     rallinTunnusNro;
+    private int     henkilonTunnusNro;
     private String  rallinNimi                = "";
     private String  sijainti            = "";
     private int     osallistujienMaara;
@@ -32,14 +32,30 @@ public class Ralli {
     
     private static int seuraavaNro = 0;    
         
+        /**
+         * Alustaa henkilön
+         */
+        public Ralli() {
+        //ei välttämättä tarttis
+        }
+        
+        
+        /**
+         * @param henkilonTunnusNro ilmottaununeen henkilon tunnusnumero
+         */
+        public Ralli(int henkilonTunnusNro) {
+            this.henkilonTunnusNro = henkilonTunnusNro;
+        }
+    
+        
         /**
          * @return rallille seuraava identifioiva tunnusnumero
          * 
          */
         public int rekisteroi() {
-            this.tunnusNro = seuraavaNro;
+            rallinTunnusNro = seuraavaNro;
             seuraavaNro++;
-            return tunnusNro;
+            return rallinTunnusNro;
         }
         
         
@@ -49,7 +65,7 @@ public class Ralli {
          */
         public void vastaaRalli(int nro) {
             
-            htunnusNro = nro;
+            henkilonTunnusNro = nro;
             Random r = new Random();
             int n = r.nextInt(4);
             int sr = r.nextInt(5);
@@ -86,17 +102,20 @@ public class Ralli {
          * Kun halutaan tietää jonkun rallin identifioiva tunnusnumero
          * @return tunnusnro
          */
-        public int getTunnusNro() {
-            return tunnusNro;
+        public int getRallinTunnusNro() {
+            return rallinTunnusNro;
         }
         
+        
         /**
-         * Alustaa henkilön
+         * @return henkilon tunnusnumero
          */
-        public Ralli() {
-            //ei välttämättä tarttis
+        public int getHenkilonTunnusNro() {
+            return henkilonTunnusNro;
         }
         
+  
+        
  
         /**
          * @param tunnusNro id
@@ -122,7 +141,7 @@ public class Ralli {
          * @param tulostettava tietovirta mitä tulostetaan
          */
         public void tulosta(PrintStream tulostettava) {
-            tulostettava.println(String.format("%03d", tunnusNro, 3) + " " + rallinNimi);
+            tulostettava.println(String.format("%03d", rallinTunnusNro, 3) + " " + rallinNimi);
             tulostettava.println("Sijainti: " + sijainti);
             tulostettava.println("Järjestäjäseura: " + jarjestaja);
             tulostettava.println("Osallistujia " + osallistujienMaara + "kpl");
diff --git a/src/RalliJava/Rallit.java b/src/RalliJava/Rallit.java
index fc5fa98..ef36798 100644
--- a/src/RalliJava/Rallit.java
+++ b/src/RalliJava/Rallit.java
@@ -35,7 +35,7 @@ public class Rallit {
         List<Ralli> loydetyt = new ArrayList<Ralli>();
         // Käy rallit läpi ja etsii sieltä ne, mihin kysytty henkilö on osallistunut
         for (Ralli ralli:alkiot) //ITERAATTORI
-            if(ralli.getTunnusNro() == tunnusNro) loydetyt.add(ralli);
+            if(ralli.getHenkilonTunnusNro() == tunnusNro) loydetyt.add(ralli);
         return loydetyt;
     
     }
@@ -80,7 +80,7 @@ public class Rallit {
             
             // Käy listan läpi ja tulostaa halutun (yläällä indeksi) rallin luoduista
             for (Ralli ral : rallit2) {
-                System.out.print(ral.getTunnusNro() + " ");
+                System.out.print(ral.getHenkilonTunnusNro() + " ");
                 ral.tulosta(System.out);
             } 
             
diff --git a/src/RalliJava/Rekisteri.java b/src/RalliJava/Rekisteri.java
index 901afb4..185a45c 100644
--- a/src/RalliJava/Rekisteri.java
+++ b/src/RalliJava/Rekisteri.java
@@ -53,7 +53,7 @@ public class Rekisteri {
      * @return listan näistä ralleista
      */
     public List<Ralli> annaRallit(Henkilo henkilo){
-        return rallit.annaRallit(henkilo.getTunnusNro());
+        return rallit.annaRallit(henkilo.getHenkilonTunnusNro());
     }
     
     
@@ -65,6 +65,7 @@ public class Rekisteri {
         Rekisteri rekisteri = new Rekisteri();
         
         try {
+            //Lisätään henkilöitä
             Henkilo rovis = new Henkilo();
             Henkilo asunmaa = new Henkilo();
             Henkilo elfyn = new Henkilo();
@@ -80,22 +81,22 @@ public class Rekisteri {
             rekisteri.lisaa(asunmaa);
             rekisteri.lisaa(elfyn);
             
-            Rallit rallit = new Rallit();
-            
+            //Lisätään ralleja
+            //Rallit rallit = new Rallit();
             
             Ralli pohjanmaa = new Ralli();
             Ralli kuopio = new Ralli();
             Ralli secto = new Ralli();
             pohjanmaa.rekisteroi();
-            pohjanmaa.vastaaRalli(asunmaa.getTunnusNro());
+            pohjanmaa.vastaaRalli(asunmaa.getHenkilonTunnusNro());
             kuopio.rekisteroi();
-            kuopio.vastaaRalli(rovis.getTunnusNro());
+            kuopio.vastaaRalli(rovis.getHenkilonTunnusNro());
             secto.rekisteroi();
-            secto.vastaaRalli(asunmaa.getTunnusNro());
+            secto.vastaaRalli(asunmaa.getHenkilonTunnusNro());
             
-            rallit.lisaa(pohjanmaa);
-            rallit.lisaa(kuopio);
-            rallit.lisaa(secto);
+            rekisteri.lisaa(pohjanmaa);
+            rekisteri.lisaa(kuopio);
+            rekisteri.lisaa(secto);
             
             pohjanmaa.tulosta(System.out);
             kuopio.tulosta(System.out);
@@ -108,19 +109,19 @@ public class Rekisteri {
                 System.out.println("Henkilö paikassa: " + i);
                 henkilo.tulosta(System.out);
                 
-                List<Ralli> rallit2 = rallit.annaRallit(2);
+                List<Ralli> rallit2 = rekisteri.annaRallit(henkilo);
                 
                 
                 // Käy listan läpi ja tulostaa halutun (yläällä indeksi) rallin luoduista
                 for (Ralli ral : rallit2) {
-                    System.out.print(ral.getTunnusNro() + " ");
+                    System.out.print(ral.getHenkilonTunnusNro() + " ");
                     ral.tulosta(System.out); }}
             
             int lkm = rekisteri.getHenkiloita();
             System.out.println("Henkilöitä on nyt " + lkm + "!");
             
-            } catch (SailoException e) {
-                System.err.println("Liikaa alkioita :("); //kun alkioita enemmän kun MAX sallii
+            } catch (SailoException ex) {
+                System.out.println(ex.getMessage());
             }
         
         
diff --git a/src/application/RalliController.java b/src/application/RalliController.java
index d96cdaf..764c609 100644
--- a/src/application/RalliController.java
+++ b/src/application/RalliController.java
@@ -10,9 +10,11 @@ import javafx.scene.text.Font;
 
 import java.io.PrintStream;
 import java.net.URL;
+import java.util.List;
 import java.util.ResourceBundle;
 
 import RalliJava.Henkilo;
+import RalliJava.Ralli;
 import RalliJava.Rekisteri;
 import RalliJava.SailoException;
 import fi.jyu.mit.fxgui.Dialogs;
@@ -40,30 +42,48 @@ public class RalliController implements Initializable {
         alusta();
     }
     
+    
     /*
-     * Lisää uuden, avaa uuden ikkunan, missä pääsee lisäämään joko uuden rallin tai uuden henkilön
+     * Avaa uuden ikkunan missä voi lisätä uuden henkilön tiedot ja tallentaa ne
      */
-    @FXML private void handleUusi() {
-        //Dialogs.showQuestionDialog("Poisto?", "Poistetaanko?", "Kyllä", "Ei"); //Otsikko, teksti, nappi1, nappi2
-        //ModalController.showModal(RalliController.class.getResource("uudenlisays.fxml"), "Lisää uusi", null, ""); //Modal controller -> ei voida tehdä muuta
-        //TODO: miten toteutus uuden rallin ja uuden henkilön lisäämiselle, pitää varmaan olla eri ikkunat
+    @FXML private void handleUusiHenkilo() {
         uusiHenkilo();
     }
     
     
-    private void uusiHenkilo() {
-        Henkilo uusi = new Henkilo();
-        uusi.rekisteroi(); //TODO rekisteröinti vasta kun käyttäjä tallentaa uuden tiedot
-        uusi.vastaahlo(); //TODO että käyttäjä saa täyttää itse
-        //uusi.tulosta(System.out);
-        try {
-            rekisteri.lisaa(uusi);
-        } catch (SailoException e) { //catch koska määrtelty että rekisteri saattaa heittää poikkeuksen
-            Dialogs.showMessageDialog("Ongelmia uuden luomisessa " + e.getMessage());
-        }
-        hae(uusi.getTunnusNro()); 
+    @FXML private void handleUusiRalli() {
+        //Dialogs.showMessageDialog("Lisää uuden rallin, ei vielä osaa :((");
+        uusiRalli();
+    }
+    
+    /*
+     * Avaa ikkunan, missä pääsee muokkaamaan valitun RALLIN tietoja
+     */
+    @FXML private void handleMuokkaa() {
+        //Dialogs.showMessageDialog("Muokkaa valittua henkilöä/rallia, ei osaa vielä :((");
+        ModalController.showModal(RalliController.class.getResource("muokkausRalli.fxml"), "Muokkaa", null, "");
+        //TODO: täytyy pystyä muokkaamaan myös henkilöitä
+    }
+    
+    
+    
+    /*
+     * 
+     */
+    @FXML private void handleRajaus() {
+        Dialogs.showMessageDialog("Rajaa hakutuloksia, ei osaa vielä :((");
     }
     
+    /*
+     * Poistuu ikkunasta
+     */
+    @FXML private void handlePoistu() {
+        //TODO:tallenna();
+        Platform.exit();
+    }
+
+
+    
     /**
      * @return true
      */
@@ -75,11 +95,47 @@ public class RalliController implements Initializable {
     
 /*================================================================*/
  
-    //private Henkilo henkiloKohdalla;
      private Rekisteri rekisteri;
+     private Henkilo henkiloKohdalla;
      private TextArea areaHenkilo = new TextArea(); //TODO poista lopuksi!!
      
      
+     /**
+      * @param rekisteri mitä käytetään
+      */
+      public void setRekisteri(Rekisteri rekisteri){
+         this.rekisteri = rekisteri;
+         naytaHenkilo();
+      }
+      
+      /*
+       * Näyttää valitun jäsenen tiedot väliaikaisesti
+       * @param rekisteri 
+       */ 
+      private void naytaHenkilo() {
+          henkiloKohdalla = chooserHenkilot.getSelectedObject();
+          
+          if(henkiloKohdalla == null) return; //jos ei oo valittuna ketään, poistutaan
+          
+          areaHenkilo.setText("");  //tyhjennetään entinen näkyviltä
+          try (PrintStream out = TextAreaOutputStream.getTextPrintStream(areaHenkilo)) {
+              
+              out.println("======");
+              henkiloKohdalla.tulosta(out);
+              out.println("======");
+              List<Ralli> rallit = rekisteri.annaRallit(henkiloKohdalla);
+              for (Ralli ral: rallit)
+                      ral.tulosta(out);
+              out.println("======");
+              
+              //tulosta(out, henkiloKohdalla);
+              //henkiloKohdalla.tulosta(out);
+              //List<Ralli> rallit = rekisteri.annaRallit(henkiloKohdalla);
+              //for(Ralli ral: rallit)
+                  //ral.tulosta(out);
+          }
+      }
+     
      /*
       * Alustaa vasemman teksti-ikkunan tyhjäksi
       * asettaa myös kuuntelijan listalle
@@ -92,15 +148,6 @@ public class RalliController implements Initializable {
          chooserHenkilot.addSelectionListener(e -> naytaHenkilo()); // e on lambdalauseke
          //TODO: saa uudet henkilöt näkymään listassa
      }
-     
-    
-    /**
-     * @param rekisteri mitä käytetään
-     */
-     public void setRekisteri(Rekisteri rekisteri){
-        this.rekisteri = rekisteri;
-        //naytaHenkilo();
-     }
     
     
      /*
@@ -113,51 +160,47 @@ public class RalliController implements Initializable {
         int index = 0;
         for(int i = 0; i < rekisteri.getHenkiloita(); i++) {    //käydään läpi henkilöt
             Henkilo henkilo = rekisteri.annaHenkilo(i);         //indeksin perusteella käy läpi
-            if (henkilo.getTunnusNro() == idnro) index = i;     //samalla kun käy läpi henkilöitä, etsii oikeaa indeksiä
+            if (henkilo.getHenkilonTunnusNro() == idnro) index = i;     //samalla kun käy läpi henkilöitä, etsii oikeaa indeksiä
             chooserHenkilot.add(henkilo.getNimi(), henkilo);    // viimeinen kohta linkittää juuri tämän henkilön chooseriin
         }
         chooserHenkilot.setSelectedIndex(index); 
      }
 
     
-    /*
-     * Avaa ikkunan, missä pääsee muokkaamaan valitun henkilön tai rallin tietoja
-     */
-    @FXML private void handleMuokkaa() {
-        //Dialogs.showMessageDialog("Muokkaa valittua henkilöä/rallia, ei osaa vielä :((");
-        ModalController.showModal(RalliController.class.getResource("muokkausRalli.fxml"), "Muokkaa", null, "");
+
+    
+    private void uusiHenkilo() {
+        Henkilo uusi = new Henkilo();
+        uusi.rekisteroi(); //TODO rekisteröinti vasta kun käyttäjä tallentaa uuden tiedot
+        uusi.vastaahlo(); //TODO että käyttäjä saa täyttää itse
+        //uusi.tulosta(System.out);
+        try {
+            rekisteri.lisaa(uusi);
+        } catch (SailoException e) { //catch koska määrtelty että rekisteri saattaa heittää poikkeuksen
+            Dialogs.showMessageDialog("Ongelmia uuden luomisessa " + e.getMessage());
+        }
+        hae(uusi.getHenkilonTunnusNro()); 
     }
     
     
-    /*
-     * Poistuu ikkunasta
-     */
-    @FXML private void handlePoistu() {
-        //TODO:tallenna();
-        Platform.exit();
+    private void uusiRalli() {
+        henkiloKohdalla = chooserHenkilot.getSelectedObject();
+        if (henkiloKohdalla == null) return; // jos ei olla minkään jäsenen kohdalla
+        //Chooserilta voi kysyä minkä henkilön kohdalla ollaan
+        //Henkilo hlovalittuna = chooserHenkilot.getSelectedObject();
+        Ralli ral = new Ralli();
+        ral.rekisteroi();
+        ral.vastaaRalli(henkiloKohdalla.getHenkilonTunnusNro());
+        rekisteri.lisaa(ral);
+        hae(henkiloKohdalla.getHenkilonTunnusNro());
+        //TODO ei lisää rallia mutta ei anna erroria??? 
     }
+    
+    
+
 
     
-    /*
-     * Näyttää valitun jäsenen tiedot väliaikaisesti
-     * @param rekisteri 
-     */ 
-    private void naytaHenkilo() {
-        Henkilo henkiloKohdalla = chooserHenkilot.getSelectedObject();
-        
-        if(henkiloKohdalla == null) return; //jos ei oo valittuna ketään, poistutaan
-        
-        areaHenkilo.setText("");  //tyhjennetään entinen näkyviltä
-        try (PrintStream out = TextAreaOutputStream.getTextPrintStream(areaHenkilo)) {
-            henkiloKohdalla.tulosta(out);
-        }
-    }
+
    
-    
-    /*
-     * 
-     */
-    @FXML private void handleRajaus() {
-        Dialogs.showMessageDialog("Rajaa hakutuloksia, ei osaa vielä :((");
-    }
+
 }
diff --git a/src/application/Sample.fxml b/src/application/Sample.fxml
index 339c4ff..22d0a5f 100644
--- a/src/application/Sample.fxml
+++ b/src/application/Sample.fxml
@@ -44,8 +44,9 @@
             <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
          </BorderPane.margin>
          <children>
-            <Button mnemonicParsing="false" onAction="#handleUusi" text="Lisää uusi" />
-            <Button mnemonicParsing="false" onAction="#handleMuokkaa" text="Muokkaa tietoja" />
+            <Button mnemonicParsing="false" onAction="#handleUusiHenkilo" text="Lisää uusi henkilö" />
+            <Button mnemonicParsing="false" onAction="#handleUusiRalli" text="Ilmoita henkilö ralliin" />
+            <Button mnemonicParsing="false" onAction="#handleMuokkaa" text="Muokkaa henkilötietoja" />
             <Button mnemonicParsing="false" onAction="#handlePoistu" text="Takaisin" />
             <Button mnemonicParsing="false" onAction="#handlePoistu" text="Poistu" />
          </children>
diff --git a/src/application/henkilonLisays.fxml b/src/application/henkilonLisays.fxml
new file mode 100644
index 0000000..7fcfc85
--- /dev/null
+++ b/src/application/henkilonLisays.fxml
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<?import javafx.geometry.Insets?>
+<?import javafx.scene.control.Button?>
+<?import javafx.scene.control.CheckBox?>
+<?import javafx.scene.control.ChoiceBox?>
+<?import javafx.scene.control.DatePicker?>
+<?import javafx.scene.control.Label?>
+<?import javafx.scene.control.Menu?>
+<?import javafx.scene.control.MenuBar?>
+<?import javafx.scene.control.MenuItem?>
+<?import javafx.scene.control.Tab?>
+<?import javafx.scene.control.TabPane?>
+<?import javafx.scene.control.TextField?>
+<?import javafx.scene.layout.AnchorPane?>
+<?import javafx.scene.layout.BorderPane?>
+<?import javafx.scene.layout.ColumnConstraints?>
+<?import javafx.scene.layout.GridPane?>
+<?import javafx.scene.layout.HBox?>
+<?import javafx.scene.layout.RowConstraints?>
+
+<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="402.0" prefWidth="483.0" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fi.jyu.mit.fxgui.ModalController">
+   <center>
+      <TabPane prefHeight="200.0" prefWidth="200.0" tabClosingPolicy="UNAVAILABLE" BorderPane.alignment="CENTER">
+        <tabs>
+          <Tab text="Uusi henkilö">
+            <content>
+              <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
+                     <children>
+                        <GridPane layoutX="206.0" layoutY="29.0">
+                          <columnConstraints>
+                            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
+                            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
+                          </columnConstraints>
+                          <rowConstraints>
+                              <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+                              <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+                            <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+                            <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+                          </rowConstraints>
+                           <children>
+                              <Label text="Nimi" />
+                              <Label text="Syntmäpäivä" GridPane.rowIndex="1" />
+                              <Label text="Seura" GridPane.rowIndex="3" />
+                              <TextField fx:id="henkilonNimi" GridPane.columnIndex="1" />
+                              <DatePicker fx:id="henkilonSyntymaAika" GridPane.columnIndex="1" GridPane.rowIndex="1" />
+                              <ChoiceBox fx:id="henkilonSeura" prefWidth="150.0" GridPane.columnIndex="1" GridPane.rowIndex="3" />
+                              <CheckBox fx:id="onKartturi" mnemonicParsing="false" text="Kartturi" GridPane.columnIndex="1" GridPane.rowIndex="2" />
+                              <CheckBox fx:id="onKuljettaja" mnemonicParsing="false" text="Kuljettaja" GridPane.rowIndex="2" />
+                           </children>
+                        </GridPane>
+                        <GridPane layoutX="135.0" layoutY="164.0">
+                          <columnConstraints>
+                            <ColumnConstraints hgrow="SOMETIMES" maxWidth="124.79998779296875" minWidth="10.0" prefWidth="124.79998779296875" />
+                            <ColumnConstraints hgrow="SOMETIMES" maxWidth="124.00000000000001" minWidth="10.0" prefWidth="103.19995117187501" />
+                              <ColumnConstraints hgrow="SOMETIMES" maxWidth="95.20001220703125" minWidth="10.0" prefWidth="72.800048828125" />
+                          </columnConstraints>
+                          <rowConstraints>
+                            <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+                            <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+                            <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+                          </rowConstraints>
+                           <children>
+                              <Label contentDisplay="BOTTOM" text="Ralli">
+                                 <GridPane.margin>
+                                    <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
+                                 </GridPane.margin>
+                              </Label>
+                              <Label text="Auto" GridPane.columnIndex="1">
+                                 <GridPane.margin>
+                                    <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
+                                 </GridPane.margin>
+                              </Label>
+                              <Label text="Sijoitus" GridPane.columnIndex="2">
+                                 <GridPane.margin>
+                                    <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
+                                 </GridPane.margin>
+                              </Label>
+                              <TextField GridPane.columnIndex="1" GridPane.rowIndex="1">
+                                 <GridPane.margin>
+                                    <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
+                                 </GridPane.margin>
+                              </TextField>
+                              <TextField GridPane.columnIndex="2" GridPane.rowIndex="1">
+                                 <GridPane.margin>
+                                    <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
+                                 </GridPane.margin>
+                              </TextField>
+                              <TextField GridPane.columnIndex="1" GridPane.rowIndex="2">
+                                 <GridPane.margin>
+                                    <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
+                                 </GridPane.margin>
+                              </TextField>
+                              <TextField GridPane.columnIndex="2" GridPane.rowIndex="2">
+                                 <GridPane.margin>
+                                    <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
+                                 </GridPane.margin>
+                              </TextField>
+                              <ChoiceBox prefWidth="150.0" GridPane.rowIndex="1">
+                                 <GridPane.margin>
+                                    <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
+                                 </GridPane.margin>
+                              </ChoiceBox>
+                              <ChoiceBox prefWidth="150.0" GridPane.rowIndex="2">
+                                 <GridPane.margin>
+                                    <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
+                                 </GridPane.margin>
+                              </ChoiceBox>
+                           </children>
+                        </GridPane>
+                        <Label layoutX="150.0" layoutY="276.0" text="Ideointi rallien lisäämiseen vielä kesken..." />
+                     </children>
+                  </AnchorPane>
+            </content>
+          </Tab>
+        </tabs>
+      </TabPane>
+   </center>
+   <top>
+      <MenuBar BorderPane.alignment="CENTER">
+        <menus>
+          <Menu mnemonicParsing="false" text="Tiedosto">
+            <items>
+              <MenuItem mnemonicParsing="false" text="Close" />
+            </items>
+          </Menu>
+          <Menu mnemonicParsing="false" text="Muokkaa">
+            <items>
+              <MenuItem mnemonicParsing="false" text="Delete" />
+            </items>
+          </Menu>
+          <Menu mnemonicParsing="false" text="Apua">
+            <items>
+              <MenuItem mnemonicParsing="false" text="About" />
+            </items>
+          </Menu>
+        </menus>
+      </MenuBar>
+   </top>
+   <bottom>
+      <HBox spacing="10.0" BorderPane.alignment="CENTER">
+         <BorderPane.margin>
+            <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
+         </BorderPane.margin>
+         <children>
+            <Button mnemonicParsing="false" onAction="#handleDefaultCancel" text="Peruuta" />
+            <Button mnemonicParsing="false" onAction="#handleDefaultOK" text="Tallenna" />
+         </children>
+      </HBox>
+   </bottom>
+</BorderPane>
diff --git a/src/application/rallinLisays.fxml b/src/application/rallinLisays.fxml
new file mode 100644
index 0000000..c650f23
--- /dev/null
+++ b/src/application/rallinLisays.fxml
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<?import javafx.geometry.Insets?>
+<?import javafx.scene.control.Button?>
+<?import javafx.scene.control.ChoiceBox?>
+<?import javafx.scene.control.DatePicker?>
+<?import javafx.scene.control.Label?>
+<?import javafx.scene.control.Menu?>
+<?import javafx.scene.control.MenuBar?>
+<?import javafx.scene.control.MenuItem?>
+<?import javafx.scene.control.Tab?>
+<?import javafx.scene.control.TabPane?>
+<?import javafx.scene.control.TextField?>
+<?import javafx.scene.layout.AnchorPane?>
+<?import javafx.scene.layout.BorderPane?>
+<?import javafx.scene.layout.ColumnConstraints?>
+<?import javafx.scene.layout.GridPane?>
+<?import javafx.scene.layout.HBox?>
+<?import javafx.scene.layout.RowConstraints?>
+
+<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="402.0" prefWidth="483.0" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fi.jyu.mit.fxgui.ModalController">
+   <center>
+      <TabPane prefHeight="200.0" prefWidth="200.0" tabClosingPolicy="UNAVAILABLE" BorderPane.alignment="CENTER">
+        <tabs>
+          <Tab text="Uusi ralli">
+            <content>
+              <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
+                     <children>
+                        <GridPane layoutX="46.0" layoutY="33.0">
+                          <columnConstraints>
+                            <ColumnConstraints hgrow="SOMETIMES" maxWidth="123.199951171875" minWidth="10.0" prefWidth="84.0" />
+                            <ColumnConstraints hgrow="SOMETIMES" maxWidth="172.0" minWidth="10.0" prefWidth="151.20001220703125" />
+                              <ColumnConstraints hgrow="SOMETIMES" maxWidth="134.79998779296875" minWidth="10.0" prefWidth="134.79998779296875" />
+                          </columnConstraints>
+                          <rowConstraints>
+                            <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+                            <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+                            <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+                              <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+                              <RowConstraints maxHeight="28.79999389648438" minHeight="0.0" prefHeight="28.00000610351563" vgrow="SOMETIMES" />
+                              <RowConstraints maxHeight="60.80000000000001" minHeight="10.0" prefHeight="32.79999389648438" vgrow="SOMETIMES" />
+                              <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+                          </rowConstraints>
+                           <children>
+                              <Label text="Rallin nimi" GridPane.columnIndex="1" />
+                              <Label text="Paikkakunta" GridPane.columnIndex="1" GridPane.rowIndex="1" />
+                              <Label text="Ajankohta" GridPane.rowIndex="2" />
+                              <TextField GridPane.columnIndex="2" />
+                              <ChoiceBox prefWidth="150.0" GridPane.columnIndex="2" GridPane.rowIndex="1" />
+                              <DatePicker GridPane.columnIndex="1" GridPane.rowIndex="2">
+                                 <GridPane.margin>
+                                    <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
+                                 </GridPane.margin>
+                              </DatePicker>
+                              <DatePicker prefHeight="26.0" prefWidth="128.0" GridPane.columnIndex="2" GridPane.rowIndex="2">
+                                 <GridPane.margin>
+                                    <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
+                                 </GridPane.margin>
+                              </DatePicker>
+                              <TextField GridPane.columnIndex="2" GridPane.rowIndex="3" />
+                              <TextField GridPane.columnIndex="2" GridPane.rowIndex="4" />
+                              <TextField GridPane.columnIndex="2" GridPane.rowIndex="5" />
+                              <TextField GridPane.columnIndex="2" GridPane.rowIndex="6" />
+                              <Label text="Tuloslista" GridPane.columnIndex="1" GridPane.rowIndex="6" />
+                              <Label text="Osallistujalista" GridPane.columnIndex="1" GridPane.rowIndex="5" />
+                              <Label text="Linkki tapahtuman sivuille" GridPane.columnIndex="1" GridPane.rowIndex="4" />
+                              <Label text="Järjestäjä" GridPane.columnIndex="1" GridPane.rowIndex="3" />
+                           </children>
+                           <padding>
+                              <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
+                           </padding>
+                        </GridPane>
+                     </children></AnchorPane>
+            </content>
+          </Tab>
+        </tabs>
+      </TabPane>
+   </center>
+   <top>
+      <MenuBar BorderPane.alignment="CENTER">
+        <menus>
+          <Menu mnemonicParsing="false" text="Tiedosto">
+            <items>
+              <MenuItem mnemonicParsing="false" text="Close" />
+            </items>
+          </Menu>
+          <Menu mnemonicParsing="false" text="Muokkaa">
+            <items>
+              <MenuItem mnemonicParsing="false" text="Delete" />
+            </items>
+          </Menu>
+          <Menu mnemonicParsing="false" text="Apua">
+            <items>
+              <MenuItem mnemonicParsing="false" text="About" />
+            </items>
+          </Menu>
+        </menus>
+      </MenuBar>
+   </top>
+   <bottom>
+      <HBox spacing="10.0" BorderPane.alignment="CENTER">
+         <BorderPane.margin>
+            <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
+         </BorderPane.margin>
+         <children>
+            <Button mnemonicParsing="false" onAction="#handleDefaultCancel" text="Peruuta" />
+            <Button mnemonicParsing="false" onAction="#handleDefaultOK" text="Tallenna" />
+         </children>
+      </HBox>
+   </bottom>
+</BorderPane>
-- 
GitLab