Compare commits

..

No commits in common. "129a26e1a96acfa2ffb7ef7e741a7f223836cbe1" and "6d24687f7bb633d40b634965e49727e5340a293b" have entirely different histories.

8 changed files with 129 additions and 128 deletions

View File

@ -22,7 +22,6 @@ import javafx.scene.control.*;
import javafx.scene.image.Image; import javafx.scene.image.Image;
import javafx.scene.image.ImageView; import javafx.scene.image.ImageView;
import javafx.scene.layout.HBox; import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Priority; import javafx.scene.layout.Priority;
import javafx.stage.Stage; import javafx.stage.Stage;
@ -206,28 +205,22 @@ public class CropDetailController {
} }
private HBox createTaskHBox(Task task) { private HBox createTaskHBox(Task task) {
HBox hBox = new HBox(10); HBox hBox = new HBox();
Label taskName = new Label(task.getName()+": "); Label taskName = new Label(task.getName()+": ");
taskName.setMinWidth(100);
taskName.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
taskName.setStyle("-fx-font-weight: bold"); taskName.setStyle("-fx-font-weight: bold");
Label taskDescription = new Label(task.getDescription()); Label taskDescription = new Label(task.getDescription());
taskDescription.setWrapText(true); taskDescription.setWrapText(true);
taskDescription.setMaxSize(600, Double.MAX_VALUE); taskDescription.setMaxWidth(2000);
Pane puffer = new Pane(); HBox.setHgrow(taskDescription, Priority.ALWAYS);
HBox.setHgrow(puffer, Priority.ALWAYS);
Button edit = new Button(); Button edit = new Button();
Button delete = new Button(); Button delete = new Button();
HBox.setHgrow(edit, Priority.NEVER);
HBox.setHgrow(delete, Priority.NEVER);
setIconToButton(edit, "editIcon.png"); setIconToButton(edit, "editIcon.png");
setIconToButton(delete, "deleteIcon.png"); setIconToButton(delete, "deleteIcon.png");
edit.setOnAction(getEditTaskEvent(task)); edit.setOnAction(getEditTaskEvent(task));
delete.setOnAction(deleteTask(task)); delete.setOnAction(deleteTask(task));
hBox.getChildren().addAll(taskName, taskDescription, puffer, edit, delete); hBox.getChildren().addAll(taskName, taskDescription, edit, delete);
return hBox; return hBox;
} }
@ -236,15 +229,12 @@ public class CropDetailController {
label.setStyle("-fx-font-weight: bold"); label.setStyle("-fx-font-weight: bold");
HBox hBox = new HBox(); HBox hBox = new HBox();
hBox.fillHeightProperty(); hBox.fillHeightProperty();
Label description = new Label(pest.description()); Label label1 = new Label(pest.description());
description.setAlignment(Pos.TOP_LEFT); label1.setAlignment(Pos.TOP_LEFT);
description.setWrapText(true); label1.setWrapText(true);
description.setMaxWidth(600); label1.setMaxWidth(600);
Pane puffer = new Pane();
HBox.setHgrow(puffer, Priority.ALWAYS);
Button button = new Button("Get Counter Measures"); Button button = new Button("Get Counter Measures");
HBox.setHgrow(button, Priority.NEVER); hBox.getChildren().addAll(label, label1, button);
hBox.getChildren().addAll(label, description, puffer, button);
return hBox; return hBox;
} }

View File

@ -9,14 +9,11 @@ import ch.zhaw.gartenverwaltung.models.GardenSchedule;
import ch.zhaw.gartenverwaltung.types.Crop; import ch.zhaw.gartenverwaltung.types.Crop;
import ch.zhaw.gartenverwaltung.types.Plant; import ch.zhaw.gartenverwaltung.types.Plant;
import ch.zhaw.gartenverwaltung.types.Task; import ch.zhaw.gartenverwaltung.types.Task;
import javafx.beans.property.ListProperty;
import javafx.beans.property.SimpleListProperty;
import javafx.collections.FXCollections;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.scene.control.*; import javafx.scene.control.Label;
import javafx.scene.layout.HBox; import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.layout.Pane; import javafx.scene.layout.Pane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox; import javafx.scene.layout.VBox;
import java.io.IOException; import java.io.IOException;
@ -27,7 +24,6 @@ import java.util.logging.Logger;
public class MyScheduleController { public class MyScheduleController {
private static final Logger LOG = Logger.getLogger(MyScheduleController.class.getName()); private static final Logger LOG = Logger.getLogger(MyScheduleController.class.getName());
private final ListProperty<List<Task>> taskListProperty = new SimpleListProperty<>(FXCollections.observableArrayList());
private Crop selectedCrop = null; private Crop selectedCrop = null;
@ -39,7 +35,46 @@ public class MyScheduleController {
private PlantList plantList; private PlantList plantList;
@FXML @FXML
private ListView<List<Task>> week_listView; private Label day1_label;
@FXML
private Pane day1_pane;
@FXML
private Label day2_label;
@FXML
private Pane day2_pane;
@FXML
private Label day3_label;
@FXML
private Pane day3_pane;
@FXML
private Label day4_label;
@FXML
private Pane day4_pane;
@FXML
private Label day5_label;
@FXML
private Pane day5_pane;
@FXML
private Label day6_label;
@FXML
private Pane day6_pane;
@FXML
private Label day7_label;
@FXML
private Pane day7_pane;
@FXML @FXML
private Label information_label; private Label information_label;
@ -50,11 +85,10 @@ public class MyScheduleController {
@AfterInject @AfterInject
@SuppressWarnings("unused") @SuppressWarnings("unused")
public void init() { public void init() {
setCellFactoryCropListView(); setCellFactoryListView();
setCellFactoryTaskListView();
scheduledPlants_listview.itemsProperty().bind(garden.getPlantedCrops()); scheduledPlants_listview.itemsProperty().bind(garden.getPlantedCrops());
week_listView.itemsProperty().bind(taskListProperty);
lookForSelectedListEntries(); lookForSelectedListEntries();
setDayLabels();
information_label.setText(""); information_label.setText("");
try { try {
loadTaskList(); loadTaskList();
@ -74,7 +108,18 @@ public class MyScheduleController {
}); });
} }
private void setCellFactoryCropListView() { private void setDayLabels() {
LocalDate today = LocalDate.now();
day1_label.setText(today.getDayOfWeek().toString());
day2_label.setText(today.plusDays(1).getDayOfWeek().toString());
day3_label.setText(today.plusDays(2).getDayOfWeek().toString());
day4_label.setText(today.plusDays(3).getDayOfWeek().toString());
day5_label.setText(today.plusDays(4).getDayOfWeek().toString());
day6_label.setText(today.plusDays(5).getDayOfWeek().toString());
day7_label.setText(today.plusDays(6).getDayOfWeek().toString());
}
private void setCellFactoryListView() {
scheduledPlants_listview.setCellFactory(param -> new ListCell<>() { scheduledPlants_listview.setCellFactory(param -> new ListCell<>() {
@Override @Override
protected void updateItem(Crop crop, boolean empty) { protected void updateItem(Crop crop, boolean empty) {
@ -96,23 +141,6 @@ public class MyScheduleController {
}); });
} }
private void setCellFactoryTaskListView() {
week_listView.setCellFactory(param -> new ListCell<>() {
@Override
protected void updateItem(List<Task> taskList, boolean empty) {
super.updateItem(taskList, empty);
if (empty || taskList == null) {
setGraphic(null);
setText(null);
} else {
setText("");
setGraphic(weekTaskVBox(taskList, this.getIndex()));
}
}
});
}
private void loadTaskList() throws IOException { private void loadTaskList() throws IOException {
List<List<Task>> taskLists; List<List<Task>> taskLists;
if (selectedCrop != null) { if (selectedCrop != null) {
@ -120,66 +148,25 @@ public class MyScheduleController {
} else { } else {
taskLists = gardenSchedule.getTasksUpcomingWeek(); taskLists = gardenSchedule.getTasksUpcomingWeek();
} }
taskListProperty.clear(); if (!taskLists.isEmpty()) {
taskListProperty.addAll(taskLists); viewTaskListOfDay(day1_pane, taskLists.get(0));
} viewTaskListOfDay(day2_pane, taskLists.get(1));
viewTaskListOfDay(day3_pane, taskLists.get(2));
private VBox weekTaskVBox(List<Task> tasks, int dayIndex) { viewTaskListOfDay(day4_pane, taskLists.get(3));
VBox vBox = new VBox(10); viewTaskListOfDay(day5_pane, taskLists.get(4));
LocalDate today = LocalDate.now(); viewTaskListOfDay(day6_pane, taskLists.get(5));
Label weekDay = new Label(today.plusDays(dayIndex).getDayOfWeek().toString()); viewTaskListOfDay(day7_pane, taskLists.get(6));
weekDay.setStyle("-fx-font-weight: bold; -fx-underline: true");
vBox.getChildren().add(weekDay);
for (Task task : tasks) {
HBox hBox = new HBox(10);
Label taskName = new Label(task.getName() + ":");
taskName.setStyle("-fx-font-weight: bold");
taskName.setMinWidth(100);
taskName.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
hBox.getChildren().addAll(taskName);
HBox hBoxDescription = new HBox();
Label taskDescription = new Label(task.getDescription());
taskDescription.setWrapText(true);
taskDescription.setMaxSize(600, Double.MAX_VALUE);
Pane puffer = new Pane();
HBox.setHgrow(puffer, Priority.ALWAYS);
CheckBox checkBox = new CheckBox("Task completed?");
checkBox.selectedProperty().addListener((observable, oldValue, newValue) -> {
if (newValue) {
showConfirmation(task, checkBox);
}
});
HBox.setHgrow(checkBox, Priority.NEVER);
hBoxDescription.getChildren().addAll(taskDescription, puffer, checkBox);
vBox.getChildren().addAll(hBox, hBoxDescription);
} }
return vBox;
} }
/** private void viewTaskListOfDay(Pane pane, List<Task> tasks) {
* Alert to confirm that task has been completed. //ToDo update pane with task list
* @param task {@link Task} which is selected VBox vBox = new VBox();
*/ for (Task task : tasks) {
private void showConfirmation(Task task, CheckBox checkBox) { Label label = new Label(task.getDescription());
Alert alert = new Alert(Alert.AlertType.CONFIRMATION); vBox.getChildren().add(label);
alert.setTitle("Task Completed?"); }
alert.setHeaderText("Are you sure you have completed this task?"); pane.getChildren().add(vBox);
alert.setContentText("Confirming that you have completed the task will remove it from the schedule.");
alert.showAndWait()
.ifPresent(buttonType -> {
if (buttonType == ButtonType.OK) {
task.done();
try {
loadTaskList();
} catch (IOException e) {
e.printStackTrace();
}
} else {
checkBox.setSelected(false);
}
});
} }

View File

@ -151,7 +151,6 @@ public class GardenSchedule {
if (date.equals(checkDate) && !date.isAfter(task.getEndDate().orElse(LocalDate.MIN))) { if (date.equals(checkDate) && !date.isAfter(task.getEndDate().orElse(LocalDate.MIN))) {
dayTaskList.get(finalI).add(task); dayTaskList.get(finalI).add(task);
} }
if (task.getInterval().orElse(0) == 0) break;
checkDate = checkDate.plusDays(task.getInterval().orElse(0)); checkDate = checkDate.plusDays(task.getInterval().orElse(0));
} while (task.getInterval().isPresent() && checkDate.isBefore(LocalDate.now().plusDays(listLength))); } while (task.getInterval().isPresent() && checkDate.isBefore(LocalDate.now().plusDays(listLength)));
}); });

View File

@ -18,7 +18,6 @@ public class Task {
private LocalDate nextExecution; private LocalDate nextExecution;
private LocalDate nextNotification; private LocalDate nextNotification;
private long cropId; private long cropId;
private boolean done;
/** /**
* default constructor * default constructor
@ -70,7 +69,7 @@ public class Task {
} }
public void done(){ public void done(){
if(interval != null && interval != 0 && !nextExecution.plusDays(interval).isAfter(endDate)){ if(interval != null && !nextExecution.plusDays(interval).isAfter(endDate)){
nextExecution = nextExecution.plusDays(interval); nextExecution = nextExecution.plusDays(interval);
} else { } else {
nextExecution = null; nextExecution = null;

View File

@ -107,7 +107,7 @@
<Insets right="60.0" /> <Insets right="60.0" />
</HBox.margin> </HBox.margin>
</Label> </Label>
<Label fx:id="area_label" minWidth="-Infinity" prefWidth="50.0" text="Label"> <Label fx:id="area_label" text="Label">
<HBox.margin> <HBox.margin>
<Insets right="10.0" /> <Insets right="10.0" />
</HBox.margin> </HBox.margin>
@ -125,7 +125,7 @@
<Insets right="40.0" /> <Insets right="40.0" />
</HBox.margin> </HBox.margin>
</Label> </Label>
<Label fx:id="location_label" minHeight="-Infinity" prefWidth="50.0" text="Label"> <Label fx:id="location_label" text="Label">
<HBox.margin> <HBox.margin>
<Insets right="10.0" /> <Insets right="10.0" />
</HBox.margin> </HBox.margin>

View File

@ -1,15 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?> <?import javafx.scene.control.Label?>
<?import javafx.scene.control.ListView?> <?import javafx.scene.control.ListView?>
<?import javafx.scene.layout.AnchorPane?> <?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.HBox?> <?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.Pane?> <?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.layout.VBox?> <?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?> <?import javafx.scene.text.Font?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="572.0" prefWidth="867.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ch.zhaw.gartenverwaltung.MyScheduleController">
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="572.0" prefWidth="867.0"
xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ch.zhaw.gartenverwaltung.MyScheduleController">
<children> <children>
<Label layoutX="14.0" layoutY="14.0" text="MySchedule"> <Label layoutX="14.0" layoutY="14.0" text="MySchedule">
<font> <font>
@ -18,18 +22,41 @@
</Label> </Label>
<HBox layoutY="31.0" prefHeight="541.0" prefWidth="867.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="50.0"> <HBox layoutY="31.0" prefHeight="541.0" prefWidth="867.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="50.0">
<children> <children>
<ListView fx:id="scheduledPlants_listview" maxWidth="1.7976931348623157E308" prefHeight="522.0" prefWidth="271.0" HBox.hgrow="NEVER"> <ListView fx:id="scheduledPlants_listview" maxWidth="1.7976931348623157E308" prefHeight="522.0" prefWidth="365.0" HBox.hgrow="NEVER" />
<HBox.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</HBox.margin></ListView>
<VBox maxWidth="1.7976931348623157E308" prefHeight="537.0" prefWidth="650.0" HBox.hgrow="ALWAYS"> <VBox maxWidth="1.7976931348623157E308" prefHeight="537.0" prefWidth="650.0" HBox.hgrow="ALWAYS">
<children> <children>
<ListView fx:id="week_listView" maxWidth="1.7976931348623157E308" prefHeight="200.0" prefWidth="200.0" VBox.vgrow="ALWAYS"> <GridPane alignment="CENTER_LEFT" gridLinesVisible="true" maxWidth="1.7976931348623157E308" prefHeight="403.0" prefWidth="575.0" VBox.vgrow="ALWAYS">
<VBox.margin> <columnConstraints>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" /> <ColumnConstraints fillWidth="false" hgrow="NEVER" maxWidth="278.0" minWidth="100.0" prefWidth="173.0" />
</VBox.margin> <ColumnConstraints hgrow="ALWAYS" maxWidth="1.7976931348623157E308" minWidth="10.0" prefWidth="402.0" />
</ListView> </columnConstraints>
<Pane prefHeight="131.0" prefWidth="593.0" VBox.vgrow="NEVER"> <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 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 fx:id="day1_label" alignment="CENTER" prefHeight="32.0" prefWidth="173.0" text="Label" />
<Label fx:id="day2_label" alignment="CENTER" prefHeight="29.0" prefWidth="173.0" text="Label" GridPane.rowIndex="1" />
<Label fx:id="day3_label" alignment="CENTER" prefHeight="32.0" prefWidth="172.0" text="Label" GridPane.rowIndex="2" />
<Label fx:id="day4_label" alignment="CENTER" prefHeight="35.0" prefWidth="173.0" text="Label" GridPane.rowIndex="3" />
<Label fx:id="day5_label" alignment="CENTER" prefHeight="31.0" prefWidth="173.0" text="Label" GridPane.rowIndex="4" />
<Label fx:id="day6_label" alignment="CENTER" prefHeight="31.0" prefWidth="173.0" text="Label" GridPane.rowIndex="5" />
<Label fx:id="day7_label" alignment="CENTER" prefHeight="35.0" prefWidth="173.0" text="Label" GridPane.rowIndex="6" />
<Pane fx:id="day1_pane" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" />
<Pane fx:id="day2_pane" maxWidth="1.7976931348623157E308" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="1" />
<Pane fx:id="day3_pane" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="2" />
<Pane fx:id="day4_pane" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="3" />
<Pane fx:id="day5_pane" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="4" />
<Pane fx:id="day6_pane" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="5" />
<Pane fx:id="day7_pane" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="6" />
</children>
</GridPane>
<Pane prefHeight="119.0" prefWidth="575.0" VBox.vgrow="NEVER">
<children> <children>
<Label alignment="TOP_LEFT" layoutX="14.0" layoutY="14.0" prefHeight="17.0" prefWidth="550.0" text="Importants Information:" wrapText="true"> <Label alignment="TOP_LEFT" layoutX="14.0" layoutY="14.0" prefHeight="17.0" prefWidth="550.0" text="Importants Information:" wrapText="true">
<font> <font>
@ -38,9 +65,6 @@
</Label> </Label>
<Label fx:id="information_label" alignment="TOP_LEFT" layoutX="14.0" layoutY="31.0" maxWidth="1.7976931348623157E308" prefHeight="82.0" prefWidth="550.0" text="Label" wrapText="true" /> <Label fx:id="information_label" alignment="TOP_LEFT" layoutX="14.0" layoutY="31.0" maxWidth="1.7976931348623157E308" prefHeight="82.0" prefWidth="550.0" text="Label" wrapText="true" />
</children> </children>
<VBox.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</VBox.margin>
</Pane> </Pane>
</children> </children>
</VBox> </VBox>

View File

@ -9,7 +9,9 @@
<?import javafx.scene.layout.HBox?> <?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?> <?import javafx.scene.layout.VBox?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="259.0" prefWidth="390.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ch.zhaw.gartenverwaltung.TaskFormularController">
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="259.0" prefWidth="390.0" xmlns="http://javafx.com/javafx/17"
xmlns:fx="http://javafx.com/fxml/1" fx:controller="ch.zhaw.gartenverwaltung.TaskFormularController">
<children> <children>
<VBox layoutX="14.0" layoutY="14.0" prefHeight="272.0" prefWidth="390.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> <VBox layoutX="14.0" layoutY="14.0" prefHeight="272.0" prefWidth="390.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<padding> <padding>
@ -25,7 +27,7 @@
<HBox prefHeight="77.0" prefWidth="350.0"> <HBox prefHeight="77.0" prefWidth="350.0">
<children> <children>
<Label maxWidth="1.7976931348623157E308" text="Description:" HBox.hgrow="ALWAYS" /> <Label maxWidth="1.7976931348623157E308" text="Description:" HBox.hgrow="ALWAYS" />
<TextArea fx:id="description_area" prefHeight="73.0" prefWidth="206.0" promptText="Description" wrapText="true" /> <TextArea fx:id="description_area" prefHeight="73.0" prefWidth="206.0" promptText="Description" />
</children> </children>
</HBox> </HBox>
<HBox alignment="CENTER_LEFT" layoutX="30.0" layoutY="30.0" prefHeight="35.0" prefWidth="560.0"> <HBox alignment="CENTER_LEFT" layoutX="30.0" layoutY="30.0" prefHeight="35.0" prefWidth="560.0">

View File

@ -300,7 +300,7 @@
"relativeStartDate": 0, "relativeStartDate": 0,
"relativeEndDate": 10, "relativeEndDate": 10,
"description": "When the plants are 20 cm tall, begin hilling the potatoes by gently mounding the soil from the center of your rows around the stems of the plant. Mound up the soil around the plant until just the top few leaves show above the soil. Two weeks later, hill up the soil again when the plants grow another 20 cm.", "description": "When the plants are 20 cm tall, begin hilling the potatoes by gently mounding the soil from the center of your rows around the stems of the plant. Mound up the soil around the plant until just the top few leaves show above the soil. Two weeks later, hill up the soil again when the plants grow another 20 cm.",
"interval": 1 "interval": 3
} }
] ]
}, },