new home screen, tutorial fxml file and missing javadoc
This commit is contained in:
parent
e96280cd0c
commit
7920bdff28
|
@ -81,22 +81,37 @@ public class CropDetailController {
|
|||
|
||||
}
|
||||
|
||||
/**
|
||||
* close Window
|
||||
*/
|
||||
@FXML
|
||||
void goBack() {
|
||||
Stage stage = (Stage) imageView.getScene().getWindow();
|
||||
stage.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* open dialog to set area
|
||||
*/
|
||||
@FXML
|
||||
void setArea() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* open dialog to set location
|
||||
*/
|
||||
@FXML
|
||||
void setLocation() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* set labels and image from selected {@link Crop}
|
||||
* set icons for buttons
|
||||
* @param crop {@link Crop} which will be displayed
|
||||
* @throws PlantNotFoundException exception
|
||||
*/
|
||||
public void setPlantFromCrop(Crop crop) throws PlantNotFoundException {
|
||||
this.crop = crop;
|
||||
try {
|
||||
|
|
|
@ -1,5 +1,47 @@
|
|||
package ch.zhaw.gartenverwaltung;
|
||||
|
||||
public class HomeController
|
||||
{
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.fxml.Initializable;
|
||||
import javafx.scene.image.Image;
|
||||
import javafx.scene.image.ImageView;
|
||||
|
||||
import java.net.URL;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
public class HomeController implements Initializable {
|
||||
|
||||
@FXML
|
||||
private ImageView imageViewDavid;
|
||||
|
||||
@FXML
|
||||
private ImageView imageViewElias;
|
||||
|
||||
@FXML
|
||||
private ImageView imageViewGian;
|
||||
|
||||
@FXML
|
||||
private ImageView imageViewPhilippe;
|
||||
|
||||
@FXML
|
||||
private ImageView imageViewRoman;
|
||||
|
||||
@Override
|
||||
public void initialize(URL location, ResourceBundle resources) {
|
||||
setImages(imageViewDavid, "");
|
||||
setImages(imageViewElias, "");
|
||||
setImages(imageViewGian, "");
|
||||
setImages(imageViewRoman, "");
|
||||
setImages(imageViewPhilippe, "");
|
||||
}
|
||||
|
||||
private void setImages(ImageView imageView, String photoName) {
|
||||
Image img;
|
||||
if (photoName.equals("")) {
|
||||
img = new Image(String.valueOf(getClass().getResource("icons/userIcon.png")));
|
||||
} else {
|
||||
img = new Image(String.valueOf(getClass().getResource("icons/" + photoName)));
|
||||
}
|
||||
imageView.setImage(img);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -4,7 +4,6 @@ import ch.zhaw.gartenverwaltung.bootstrap.AfterInject;
|
|||
import ch.zhaw.gartenverwaltung.bootstrap.AppLoader;
|
||||
import ch.zhaw.gartenverwaltung.bootstrap.ChangeViewEvent;
|
||||
import ch.zhaw.gartenverwaltung.bootstrap.Inject;
|
||||
import javafx.event.ActionEvent;
|
||||
import javafx.event.EventHandler;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.scene.control.*;
|
||||
|
@ -41,26 +40,39 @@ public class MainFXMLController {
|
|||
@FXML
|
||||
private Button tutorial_button;
|
||||
|
||||
/**
|
||||
* go to home pane
|
||||
*/
|
||||
@FXML
|
||||
void goToHome() {
|
||||
showPaneAsMainView("Home.fxml");
|
||||
styleChangeButton(home_button);
|
||||
}
|
||||
|
||||
/**
|
||||
* go to my garden pane
|
||||
*/
|
||||
@FXML
|
||||
void goToMyPlants() {
|
||||
showPaneAsMainView("MyGarden.fxml");
|
||||
styleChangeButton(myGarden_button);
|
||||
}
|
||||
|
||||
/**
|
||||
* go to the schedule pane
|
||||
*/
|
||||
@FXML
|
||||
void goToMySchedule() {
|
||||
showPaneAsMainView("MySchedule.fxml");
|
||||
styleChangeButton(mySchedule_button);
|
||||
}
|
||||
|
||||
/**
|
||||
* open dialog of the settings
|
||||
* @throws IOException exception
|
||||
*/
|
||||
@FXML
|
||||
public void openSettings(ActionEvent actionEvent) throws IOException {
|
||||
public void openSettings() throws IOException {
|
||||
Dialog<ButtonType> dialog = new Dialog<>();
|
||||
dialog.setTitle("Settings");
|
||||
dialog.setHeaderText("Settings");
|
||||
|
@ -82,8 +94,11 @@ public class MainFXMLController {
|
|||
}
|
||||
}
|
||||
|
||||
public void goToTutorial(ActionEvent actionEvent) {
|
||||
//showPaneAsMainView("Tutorial.fxml");
|
||||
/**
|
||||
* go to Tutorial pane
|
||||
*/
|
||||
public void goToTutorial() {
|
||||
showPaneAsMainView("Tutorial.fxml");
|
||||
styleChangeButton(tutorial_button);
|
||||
}
|
||||
|
||||
|
@ -109,10 +124,15 @@ public class MainFXMLController {
|
|||
|
||||
private final EventHandler<ChangeViewEvent> changeMainViewHandler = (ChangeViewEvent event) -> showPaneAsMainView(event.view());
|
||||
|
||||
/**
|
||||
* preload all menu bar panes
|
||||
* @throws IOException exception
|
||||
*/
|
||||
private void preloadPanes() throws IOException {
|
||||
appLoader.loadAndCacheFxml("MyGarden.fxml");
|
||||
appLoader.loadAndCacheFxml("MySchedule.fxml");
|
||||
appLoader.loadAndCacheFxml("Plants.fxml");
|
||||
appLoader.loadAndCacheFxml("Tutorial.fxml");
|
||||
}
|
||||
|
||||
private void styleChangeButton(Button button) {
|
||||
|
@ -142,7 +162,7 @@ public class MainFXMLController {
|
|||
}
|
||||
|
||||
/**
|
||||
* adds icon to button
|
||||
* adds icon to given button
|
||||
* @param button the button which get the icon
|
||||
* @param iconFileName file name of icon
|
||||
*/
|
||||
|
|
|
@ -47,6 +47,11 @@ public class MyGardenController {
|
|||
@FXML
|
||||
private Button addPlant_button;
|
||||
|
||||
/**
|
||||
* initialize crop list
|
||||
* add listener for crop list
|
||||
* set icon for button
|
||||
*/
|
||||
@AfterInject
|
||||
@SuppressWarnings("unused")
|
||||
public void init() {
|
||||
|
@ -65,6 +70,9 @@ public class MyGardenController {
|
|||
setIconToButton(addPlant_button, "addIcon.png");
|
||||
}
|
||||
|
||||
/**
|
||||
* redirect to plant fxml file
|
||||
*/
|
||||
@FXML
|
||||
void addPlant() {
|
||||
myGardenRoot.fireEvent(new ChangeViewEvent(ChangeViewEvent.CHANGE_MAIN_VIEW, "Plants.fxml"));
|
||||
|
@ -119,6 +127,11 @@ public class MyGardenController {
|
|||
button.setGraphic(imageView);
|
||||
}
|
||||
|
||||
/**
|
||||
* open detail window of the selected {@link Crop}
|
||||
* @param crop {@link Crop} which is selected
|
||||
* @return {@link EventHandler} for button
|
||||
*/
|
||||
private EventHandler<ActionEvent> getGoToCropDetailEvent(Crop crop) {
|
||||
return (event) -> {
|
||||
try {
|
||||
|
@ -136,6 +149,11 @@ public class MyGardenController {
|
|||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* open alert for deleting the selected {@link Crop}
|
||||
* @param crop {@link Crop} which is selected
|
||||
* @return {@link EventHandler} for button
|
||||
*/
|
||||
private EventHandler<ActionEvent> getDeleteCropEvent(Crop crop) {
|
||||
return (event) -> {
|
||||
try {
|
||||
|
@ -146,9 +164,16 @@ public class MyGardenController {
|
|||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Alert to confirm that the crop can be deleted.
|
||||
* @param crop {@link Crop} which is selected
|
||||
* @throws IOException exception
|
||||
* @throws HardinessZoneNotSetException exception
|
||||
*/
|
||||
private void showConfirmation(Crop crop) throws IOException, HardinessZoneNotSetException {
|
||||
Plant plant = plantList.getPlantById(Settings.getInstance().getCurrentHardinessZone(), crop.getPlantId()).get();
|
||||
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
|
||||
alert.setTitle("Delete Crop");
|
||||
alert.setTitle("Delete" + plant.name());
|
||||
alert.setHeaderText("Are you sure want to delete this Crop?");
|
||||
alert.setContentText("Deleting this crop will remove all associated tasks from your schedule.");
|
||||
|
||||
|
|
|
@ -21,6 +21,11 @@ public class SelectSowDayController {
|
|||
@FXML
|
||||
public ToggleGroup phase_group;
|
||||
|
||||
/**
|
||||
* if sow date radio button was selected return sow date
|
||||
* if sow date was not selected get sow from harvest day and return sow date
|
||||
* @return {@link LocalDate} of the sow date
|
||||
*/
|
||||
public LocalDate retrieveResult() {
|
||||
LocalDate sowDate = datepicker.getValue();
|
||||
if (harvest_radio.isSelected()) {
|
||||
|
@ -53,6 +58,10 @@ public class SelectSowDayController {
|
|||
harvest_radio.setUserData(GrowthPhaseType.HARVEST);
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable save button when date picker is empty
|
||||
* @param saveButton {@link Button} to be disabled
|
||||
*/
|
||||
public void initSaveButton(Button saveButton) {
|
||||
saveButton.disableProperty().bind(datepicker.valueProperty().isNull());
|
||||
}
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
package ch.zhaw.gartenverwaltung;
|
||||
|
||||
|
||||
public class TutorialController {
|
||||
|
||||
}
|
|
@ -2,42 +2,210 @@
|
|||
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.control.ScrollPane?>
|
||||
<?import javafx.scene.image.ImageView?>
|
||||
<?import javafx.scene.layout.AnchorPane?>
|
||||
<?import javafx.scene.layout.HBox?>
|
||||
<?import javafx.scene.layout.Pane?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<?import javafx.scene.text.Font?>
|
||||
|
||||
|
||||
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="729.0" prefWidth="1060.0"
|
||||
xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ch.zhaw.gartenverwaltung.HomeController">
|
||||
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="1091.0" prefWidth="1060.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ch.zhaw.gartenverwaltung.HomeController">
|
||||
<children>
|
||||
<VBox layoutX="75.0" layoutY="73.0" prefHeight="729.0" prefWidth="1060.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<ScrollPane fitToWidth="true" prefHeight="1157.0" prefWidth="1060.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<content>
|
||||
<VBox prefHeight="1091.0" prefWidth="1058.0">
|
||||
<children>
|
||||
<Pane prefHeight="1085.0" prefWidth="1018.0">
|
||||
<children>
|
||||
<VBox prefHeight="1047.0" prefWidth="1019.0">
|
||||
<children>
|
||||
<Label text="Garden Management">
|
||||
<font>
|
||||
<Font size="34.0" />
|
||||
</font>
|
||||
<VBox.margin>
|
||||
<Insets bottom="30.0" />
|
||||
</VBox.margin>
|
||||
</Label>
|
||||
<Label prefHeight="106.0" prefWidth="1040.0" text="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet." wrapText="true" />
|
||||
<Label text="Tutorial">
|
||||
<Label alignment="TOP_LEFT" prefHeight="22.0" prefWidth="1039.0" text="This Application was created to help the user manage his or her garden. For this the Application has many functionalities:" wrapText="true">
|
||||
<font>
|
||||
<Font name="System Bold" size="18.0" />
|
||||
<Font size="14.0" />
|
||||
</font>
|
||||
<VBox.margin>
|
||||
<Insets bottom="10.0" />
|
||||
</VBox.margin>
|
||||
</Label>
|
||||
<Label text="Base Functionalities:">
|
||||
<font>
|
||||
<Font name="System Bold" size="14.0" />
|
||||
</font>
|
||||
</Label>
|
||||
<Pane prefHeight="200.0" prefWidth="200.0">
|
||||
<Label text="- The user can select a plant he wants to cultivate.">
|
||||
<font>
|
||||
<Font size="14.0" />
|
||||
</font>
|
||||
</Label>
|
||||
<Label layoutX="10.0" layoutY="62.0" text="- The user can filter the plants according to seasons, hardiness zone and search query">
|
||||
<font>
|
||||
<Font size="14.0" />
|
||||
</font>
|
||||
</Label>
|
||||
<Label layoutX="10.0" layoutY="62.0" text="- The user can select the harverst or sow date. ">
|
||||
<font>
|
||||
<Font size="14.0" />
|
||||
</font>
|
||||
</Label>
|
||||
<Label layoutX="10.0" layoutY="102.0" text="- The user can get a detailed information of the plant he wants to harvest.">
|
||||
<font>
|
||||
<Font size="14.0" />
|
||||
</font>
|
||||
</Label>
|
||||
<Label layoutX="10.0" layoutY="122.0" text="- The user can get view the task list of the given plant.">
|
||||
<font>
|
||||
<Font size="14.0" />
|
||||
</font>
|
||||
</Label>
|
||||
<Label layoutX="10.0" layoutY="142.0" text="- The user can get the tasks of the next seven days in the scheduler.">
|
||||
<font>
|
||||
<Font size="14.0" />
|
||||
</font>
|
||||
<VBox.margin>
|
||||
<Insets bottom="10.0" />
|
||||
</VBox.margin>
|
||||
</Label>
|
||||
<Label layoutX="10.0" layoutY="42.0" text="Advanced Functionalities:">
|
||||
<font>
|
||||
<Font name="System Bold" size="14.0" />
|
||||
</font>
|
||||
</Label>
|
||||
<Label layoutX="10.0" layoutY="62.0" text="- The user can edit the task list and add custom tasks.">
|
||||
<font>
|
||||
<Font size="14.0" />
|
||||
</font>
|
||||
</Label>
|
||||
<Label layoutX="10.0" layoutY="212.0" text="- The user can set the area (sqare meter) for the plants.">
|
||||
<font>
|
||||
<Font size="14.0" />
|
||||
</font>
|
||||
</Label>
|
||||
<Label layoutX="10.0" layoutY="232.0" text="- The user can set the location (PLZ) for the plants.">
|
||||
<font>
|
||||
<Font size="14.0" />
|
||||
</font>
|
||||
</Label>
|
||||
<Label layoutX="10.0" layoutY="162.0" text="- The user can set the pesticide which will be used, which will create additonal tasks.">
|
||||
<font>
|
||||
<Font size="14.0" />
|
||||
</font>
|
||||
<VBox.margin>
|
||||
<Insets bottom="10.0" />
|
||||
</VBox.margin>
|
||||
</Label>
|
||||
<Label layoutX="10.0" layoutY="192.0" text="Weather Forcast:">
|
||||
<font>
|
||||
<Font name="System Bold" size="14.0" />
|
||||
</font>
|
||||
</Label>
|
||||
<Label layoutX="10.0" layoutY="212.0" text="- According to the location the weather forcast will crate or delete tasks.">
|
||||
<font>
|
||||
<Font size="14.0" />
|
||||
</font>
|
||||
</Label>
|
||||
<Label layoutX="10.0" layoutY="272.0" text="- The user receives notifications that aditional tasks werde created or some tasks were deleted.">
|
||||
<font>
|
||||
<Font size="14.0" />
|
||||
</font>
|
||||
<VBox.margin>
|
||||
<Insets bottom="10.0" />
|
||||
</VBox.margin>
|
||||
</Label>
|
||||
<Label text="Created by:">
|
||||
<font>
|
||||
<Font name="System Bold" size="14.0" />
|
||||
</font>
|
||||
<VBox.margin>
|
||||
<Insets bottom="10.0" />
|
||||
</VBox.margin>
|
||||
</Label>
|
||||
<HBox alignment="CENTER_LEFT" prefHeight="100.0" prefWidth="200.0">
|
||||
<children>
|
||||
<VBox prefHeight="200.0" prefWidth="1040.0">
|
||||
<ImageView fx:id="imageViewElias" fitHeight="100.0" fitWidth="100.0" pickOnBounds="true" preserveRatio="true" HBox.hgrow="NEVER">
|
||||
<HBox.margin>
|
||||
<Insets right="30.0" />
|
||||
</HBox.margin>
|
||||
</ImageView>
|
||||
<Label text="Elias Csomor" />
|
||||
</children>
|
||||
<VBox.margin>
|
||||
<Insets bottom="15.0" />
|
||||
</VBox.margin>
|
||||
</HBox>
|
||||
<HBox alignment="CENTER_LEFT" prefHeight="100.0" prefWidth="200.0">
|
||||
<children>
|
||||
<Label text="Task 1" wrapText="true" />
|
||||
<Label text="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet." wrapText="true" />
|
||||
<ImageView fx:id="imageViewPhilippe" fitHeight="100.0" fitWidth="100.0" pickOnBounds="true" preserveRatio="true" HBox.hgrow="NEVER">
|
||||
<HBox.margin>
|
||||
<Insets right="30.0" />
|
||||
</HBox.margin>
|
||||
</ImageView>
|
||||
<Label text="Philippe Giavarini" />
|
||||
</children>
|
||||
<VBox.margin>
|
||||
<Insets bottom="15.0" />
|
||||
</VBox.margin>
|
||||
</HBox>
|
||||
<HBox alignment="CENTER_LEFT" prefHeight="100.0" prefWidth="200.0">
|
||||
<children>
|
||||
<ImageView fx:id="imageViewDavid" fitHeight="100.0" fitWidth="100.0" pickOnBounds="true" preserveRatio="true" HBox.hgrow="NEVER">
|
||||
<HBox.margin>
|
||||
<Insets right="30.0" />
|
||||
</HBox.margin>
|
||||
</ImageView>
|
||||
<Label text="David Guler" />
|
||||
</children>
|
||||
<VBox.margin>
|
||||
<Insets bottom="15.0" />
|
||||
</VBox.margin>
|
||||
</HBox>
|
||||
<HBox alignment="CENTER_LEFT" prefHeight="100.0" prefWidth="200.0">
|
||||
<children>
|
||||
<ImageView fx:id="imageViewGian" fitHeight="100.0" fitWidth="100.0" pickOnBounds="true" preserveRatio="true" HBox.hgrow="NEVER">
|
||||
<HBox.margin>
|
||||
<Insets right="30.0" />
|
||||
</HBox.margin>
|
||||
</ImageView>
|
||||
<Label text="Gian-Andrea Hutter" />
|
||||
</children>
|
||||
<VBox.margin>
|
||||
<Insets bottom="15.0" />
|
||||
</VBox.margin>
|
||||
</HBox>
|
||||
<HBox alignment="CENTER_LEFT" prefHeight="100.0" prefWidth="200.0">
|
||||
<children>
|
||||
<ImageView fx:id="imageViewRoman" fitHeight="100.0" fitWidth="100.0" pickOnBounds="true" preserveRatio="true" HBox.hgrow="NEVER">
|
||||
<HBox.margin>
|
||||
<Insets right="30.0" />
|
||||
</HBox.margin>
|
||||
</ImageView>
|
||||
<Label text="Roman Schenk" />
|
||||
</children>
|
||||
<VBox.margin>
|
||||
<Insets bottom="15.0" />
|
||||
</VBox.margin>
|
||||
</HBox>
|
||||
</children>
|
||||
</VBox>
|
||||
</children>
|
||||
<VBox.margin>
|
||||
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
|
||||
</VBox.margin>
|
||||
</Pane>
|
||||
</children>
|
||||
<padding>
|
||||
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
|
||||
</padding>
|
||||
</VBox>
|
||||
</content>
|
||||
</ScrollPane>
|
||||
</children>
|
||||
</AnchorPane>
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.layout.AnchorPane?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<?import javafx.scene.text.Font?>
|
||||
|
||||
|
||||
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/17"
|
||||
xmlns:fx="http://javafx.com/fxml/1" fx:controller="ch.zhaw.gartenverwaltung.TutorialController">
|
||||
<children>
|
||||
<VBox layoutX="7.0" layoutY="8.0" prefHeight="200.0" prefWidth="100.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||
<children>
|
||||
<Label text="Tutorial">
|
||||
<font>
|
||||
<Font size="18.0" />
|
||||
</font>
|
||||
</Label>
|
||||
<Label text="To be added" />
|
||||
</children>
|
||||
<padding>
|
||||
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
|
||||
</padding>
|
||||
</VBox>
|
||||
</children>
|
||||
</AnchorPane>
|
Binary file not shown.
After Width: | Height: | Size: 26 KiB |
Loading…
Reference in New Issue