Compare commits
3 Commits
4bc951b162
...
2cc99c5cca
Author | SHA1 | Date | |
---|---|---|---|
2cc99c5cca | |||
|
0a15189a66 | ||
|
3fbca319ba |
124
.idea/uiDesigner.xml
Normal file
124
.idea/uiDesigner.xml
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="Palette2">
|
||||||
|
<group name="Swing">
|
||||||
|
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
|
||||||
|
</item>
|
||||||
|
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
|
||||||
|
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
|
||||||
|
<initial-values>
|
||||||
|
<property name="text" value="Button" />
|
||||||
|
</initial-values>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
|
||||||
|
<initial-values>
|
||||||
|
<property name="text" value="RadioButton" />
|
||||||
|
</initial-values>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
|
||||||
|
<initial-values>
|
||||||
|
<property name="text" value="CheckBox" />
|
||||||
|
</initial-values>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
|
||||||
|
<initial-values>
|
||||||
|
<property name="text" value="Label" />
|
||||||
|
</initial-values>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||||
|
<preferred-size width="150" height="-1" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||||
|
<preferred-size width="150" height="-1" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||||
|
<preferred-size width="150" height="-1" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||||
|
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||||
|
<preferred-size width="150" height="50" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||||
|
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||||
|
<preferred-size width="150" height="50" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||||
|
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||||
|
<preferred-size width="150" height="50" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||||
|
<preferred-size width="150" height="50" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
|
||||||
|
<preferred-size width="150" height="50" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||||
|
<preferred-size width="150" height="50" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
|
||||||
|
<preferred-size width="200" height="200" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
|
||||||
|
<preferred-size width="200" height="200" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
|
||||||
|
<preferred-size width="-1" height="20" />
|
||||||
|
</default-constraints>
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
|
||||||
|
</item>
|
||||||
|
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||||
|
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
|
||||||
|
</item>
|
||||||
|
</group>
|
||||||
|
</component>
|
||||||
|
</project>
|
@ -0,0 +1,116 @@
|
|||||||
|
package de.subway_surfers.vpr_app;
|
||||||
|
|
||||||
|
import javafx.collections.ListChangeListener;
|
||||||
|
import javafx.event.ActionEvent;
|
||||||
|
import javafx.fxml.FXML;
|
||||||
|
import javafx.scene.control.*;
|
||||||
|
import javafx.scene.layout.Background;
|
||||||
|
import javafx.scene.layout.GridPane;
|
||||||
|
import javafx.scene.layout.HBox;
|
||||||
|
import javafx.scene.layout.VBox;
|
||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class AccounterstellungMitarbeiter {
|
||||||
|
|
||||||
|
private @FXML Label status;
|
||||||
|
private @FXML Label einmalpw;
|
||||||
|
private @FXML HBox kindanzeige;
|
||||||
|
private @FXML GridPane kindDaten;
|
||||||
|
private @FXML RadioButton typMitarbeiter;
|
||||||
|
private @FXML RadioButton typEltern;
|
||||||
|
private ToggleGroup accountTyp;
|
||||||
|
|
||||||
|
public void initialize() {
|
||||||
|
accountTyp = new ToggleGroup();
|
||||||
|
accountTyp.getToggles().add(typEltern);
|
||||||
|
accountTyp.getToggles().add(typMitarbeiter);
|
||||||
|
einmalpw.setText(einmalPwGenerieren());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onZurueck(ActionEvent actionEvent) {
|
||||||
|
VerwaltungApplication.sceneWechseln("hauptmenue_mitarbeiter-view.fxml");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onAbmelden(ActionEvent actionEvent) {
|
||||||
|
VerwaltungApplication.abmelden();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onTypMitarbeiter(ActionEvent actionEvent) {
|
||||||
|
kindDaten.getChildren().clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onTypEltern(ActionEvent actionEvent) {
|
||||||
|
Label ueberschrift = new Label();
|
||||||
|
ueberschrift.setText("Daten des Kindes:");
|
||||||
|
kindDaten.addRow(0);
|
||||||
|
kindDaten.addColumn(0);
|
||||||
|
kindDaten.addRow(1);
|
||||||
|
kindDaten.add(ueberschrift,0,0);
|
||||||
|
|
||||||
|
kindDaten.addRow(1);
|
||||||
|
Label name = new Label("Name:");
|
||||||
|
kindDaten.add(name, 0, 1);
|
||||||
|
TextField nameEingabe = new TextField();
|
||||||
|
kindDaten.add(nameEingabe, 1, 1);
|
||||||
|
|
||||||
|
kindDaten.addRow(2);
|
||||||
|
Label geburtstag = new Label("Geburtstag: ");
|
||||||
|
kindDaten.add(geburtstag, 0, 2);
|
||||||
|
DatePicker geburtstagEingabe = new DatePicker();
|
||||||
|
geburtstagEingabe.setEditable(false);
|
||||||
|
kindDaten.add(geburtstagEingabe, 1, 2);
|
||||||
|
|
||||||
|
kindDaten.addRow(3);
|
||||||
|
Button hinzufuegen = new Button("hinzufügen");
|
||||||
|
kindDaten.add(hinzufuegen, 1, 3);
|
||||||
|
|
||||||
|
kindDaten.addRow(4);
|
||||||
|
hinzufuegen.setOnAction(e -> {
|
||||||
|
Button neues = new Button(nameEingabe.getText());
|
||||||
|
|
||||||
|
boolean nameGueltig = false;
|
||||||
|
boolean gebGueltig = false;
|
||||||
|
|
||||||
|
if (!nameEingabe.getText().equals("")) {
|
||||||
|
nameGueltig = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!geburtstagEingabe.getEditor().getText().equals("")) {
|
||||||
|
gebGueltig = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nameGueltig && gebGueltig) {
|
||||||
|
kindanzeige.getChildren().add(neues);
|
||||||
|
neues.setOnAction(a -> {
|
||||||
|
((HBox) neues.getParent()).getChildren().remove(neues);
|
||||||
|
});
|
||||||
|
nameEingabe.setText("");
|
||||||
|
geburtstagEingabe.getEditor().setText("");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private String einmalPwGenerieren() {
|
||||||
|
final int pwLaenge = 8;
|
||||||
|
String pw = "";
|
||||||
|
Random zufall = new Random();
|
||||||
|
for (int i = 0; i < pwLaenge; i++) {
|
||||||
|
pw += (char)zufall.nextInt('A', 'Z' + 1);
|
||||||
|
}
|
||||||
|
return pw;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean eingabenGueltig() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onSpeichern(ActionEvent actionEvent) {
|
||||||
|
if (eingabenGueltig()) {
|
||||||
|
status.setText("Daten Erfolgreich gespeichert");
|
||||||
|
einmalpw.setText(einmalPwGenerieren());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -3,7 +3,13 @@ package de.subway_surfers.vpr_app;
|
|||||||
import javafx.event.ActionEvent;
|
import javafx.event.ActionEvent;
|
||||||
|
|
||||||
public class HauptmenueMitarbeiterView {
|
public class HauptmenueMitarbeiterView {
|
||||||
|
|
||||||
public void onAbmelden(ActionEvent actionEvent) {
|
public void onAbmelden(ActionEvent actionEvent) {
|
||||||
VerwaltungApplication.sceneWechseln("login-view.fxml");
|
VerwaltungApplication.abmelden();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void onAccountAnlegen(ActionEvent actionEvent) {
|
||||||
|
VerwaltungApplication.sceneWechseln("accounterstellung_mitarbeiter.fxml");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -105,7 +105,10 @@ public class VerwaltungApplication extends Application {
|
|||||||
|
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void abmelden() {
|
||||||
|
sceneWechseln("login-view.fxml");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
|
@ -0,0 +1,59 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<?import java.lang.*?>
|
||||||
|
<?import java.util.*?>
|
||||||
|
<?import javafx.scene.*?>
|
||||||
|
<?import javafx.scene.control.*?>
|
||||||
|
<?import javafx.scene.layout.*?>
|
||||||
|
|
||||||
|
<BorderPane xmlns="http://javafx.com/javafx"
|
||||||
|
xmlns:fx="http://javafx.com/fxml"
|
||||||
|
fx:controller="de.subway_surfers.vpr_app.AccounterstellungMitarbeiter"
|
||||||
|
prefHeight="400.0" prefWidth="600.0"
|
||||||
|
stylesheets="@layout.css">
|
||||||
|
|
||||||
|
<top>
|
||||||
|
<BorderPane styleClass="kopfzeile">
|
||||||
|
<left>
|
||||||
|
<Button text="Zurück" onAction="#onZurueck"/>
|
||||||
|
</left>
|
||||||
|
<right>
|
||||||
|
<Button text="Abmelden" onAction="#onAbmelden"/>
|
||||||
|
</right>
|
||||||
|
</BorderPane>
|
||||||
|
</top>
|
||||||
|
<center>
|
||||||
|
<BorderPane styleClass="main">
|
||||||
|
<left>
|
||||||
|
<VBox styleClass="accounterstellung_links">
|
||||||
|
<GridPane styleClass="accounterstellung_daten">
|
||||||
|
<Label text="Accountname:" GridPane.rowIndex="0" GridPane.columnIndex="0"/>
|
||||||
|
<TextField GridPane.rowIndex="0" GridPane.columnIndex="1"/>
|
||||||
|
<Label text="E-Mail:" GridPane.rowIndex="1" GridPane.columnIndex="0"/>
|
||||||
|
<TextField GridPane.rowIndex="1" GridPane.columnIndex="1"/>
|
||||||
|
<RadioButton fx:id="typMitarbeiter" onAction="#onTypMitarbeiter" text="Mitarbeiter" GridPane.rowIndex="2" GridPane.columnIndex="0"/>
|
||||||
|
<RadioButton fx:id="typEltern" onAction="#onTypEltern" text="Eltern" GridPane.rowIndex="2" GridPane.columnIndex="1"/>
|
||||||
|
</GridPane>
|
||||||
|
<GridPane fx:id="kindDaten" styleClass="accounterstellung_daten"/>
|
||||||
|
<HBox fx:id="kindanzeige"/>
|
||||||
|
</VBox>
|
||||||
|
</left>
|
||||||
|
<right>
|
||||||
|
<HBox>
|
||||||
|
<Label text="Einmalpasswort: "/>
|
||||||
|
<Label fx:id="einmalpw"/>
|
||||||
|
</HBox>
|
||||||
|
</right>
|
||||||
|
</BorderPane>
|
||||||
|
</center>
|
||||||
|
<bottom>
|
||||||
|
<BorderPane>
|
||||||
|
<right>
|
||||||
|
<HBox styleClass="button-untenrechts">
|
||||||
|
<Label fx:id="status"/>
|
||||||
|
<Button text="Speichern" onAction="#onSpeichern"/>
|
||||||
|
</HBox>
|
||||||
|
</right>
|
||||||
|
</BorderPane>
|
||||||
|
</bottom>
|
||||||
|
</BorderPane>
|
@ -27,7 +27,7 @@
|
|||||||
<Button text="Alle Bestellungen anzeigen"/>
|
<Button text="Alle Bestellungen anzeigen"/>
|
||||||
<Button text="Rechnungen herunterladen"/>
|
<Button text="Rechnungen herunterladen"/>
|
||||||
<Button text="Daten importieren/Exportieren"/>
|
<Button text="Daten importieren/Exportieren"/>
|
||||||
<Button text="Account anlegen"/>
|
<Button text="Account anlegen" onAction="#onAccountAnlegen"/>
|
||||||
</VBox>
|
</VBox>
|
||||||
</left>
|
</left>
|
||||||
<right>
|
<right>
|
||||||
@ -43,9 +43,4 @@
|
|||||||
</right>
|
</right>
|
||||||
</BorderPane>
|
</BorderPane>
|
||||||
</center>
|
</center>
|
||||||
<right>
|
|
||||||
<TilePane>
|
|
||||||
|
|
||||||
</TilePane>
|
|
||||||
</right>
|
|
||||||
</BorderPane>
|
</BorderPane>
|
||||||
|
@ -3,6 +3,9 @@
|
|||||||
-fx-font-size: 15;
|
-fx-font-size: 15;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
-fx-font-size: 15;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
.kopfzeile{
|
.kopfzeile{
|
||||||
@ -49,7 +52,7 @@
|
|||||||
-fx-pref-width: 200;
|
-fx-pref-width: 200;
|
||||||
}
|
}
|
||||||
|
|
||||||
.login_btn_anmelden {
|
.button-untenrechts {
|
||||||
-fx-padding: 20;
|
-fx-padding: 20;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -61,3 +64,21 @@
|
|||||||
-fx-font-size: 30;
|
-fx-font-size: 30;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.text-field {
|
||||||
|
-fx-pref-width: 225;
|
||||||
|
-fx-pref-height: 32;
|
||||||
|
}
|
||||||
|
|
||||||
|
.accounterstellung_daten {
|
||||||
|
-fx-vgap: 10;
|
||||||
|
-fx-hgap: 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
.accounterstellung_links {
|
||||||
|
-fx-spacing: 20;
|
||||||
|
}
|
||||||
|
|
||||||
|
.falscheEingabe {
|
||||||
|
-fx-background-color: #FFDCDC;
|
||||||
|
-fx-text-fill: #FFDCDC;
|
||||||
|
}
|
@ -30,7 +30,7 @@
|
|||||||
<bottom>
|
<bottom>
|
||||||
<BorderPane>
|
<BorderPane>
|
||||||
<right>
|
<right>
|
||||||
<VBox styleClass="login_btn_anmelden">
|
<VBox styleClass="button-untenrechts">
|
||||||
<Button text="Anmelden" onAction="#onAnmeldenClick"/>
|
<Button text="Anmelden" onAction="#onAnmeldenClick"/>
|
||||||
</VBox>
|
</VBox>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user