Ken Schaefer
2 years ago
8 changed files with 259 additions and 14 deletions
@ -1,13 +0,0 @@ |
|||||||
<?php |
|
||||||
if(isset($_POST['searchterm'])) |
|
||||||
{ |
|
||||||
echo htmlspecialchars($_POST['searchterm'], ENT_QUOTES); |
|
||||||
} |
|
||||||
?> |
|
||||||
|
|
||||||
<form action="" method="post"> |
|
||||||
User name: <input type="text" name="name"><br> |
|
||||||
Password: <input type="password" name="password"><br> |
|
||||||
|
|
||||||
<input type="submit" value="Search"> |
|
||||||
</form> |
|
@ -0,0 +1,40 @@ |
|||||||
|
body { |
||||||
|
background-color: #f2f2f2; |
||||||
|
font-family: 'Roboto', sans-serif; |
||||||
|
} |
||||||
|
form { |
||||||
|
border-radius: 5px; |
||||||
|
background-color: #8d8c8c; |
||||||
|
margin: 20px; |
||||||
|
padding: 20px; |
||||||
|
} |
||||||
|
input { |
||||||
|
border-radius: 4px; |
||||||
|
box-sizing: border-box; |
||||||
|
display: block; |
||||||
|
margin: 8px 0; |
||||||
|
padding: 12px 20px; |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
input [type=submit] { |
||||||
|
border-color: blueviolet; |
||||||
|
border-radius: 4px; |
||||||
|
box-sizing: border-box; |
||||||
|
margin: 8px 0; |
||||||
|
padding: 12px 20px; |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
select { |
||||||
|
border-radius: 4px; |
||||||
|
box-sizing: border-box; |
||||||
|
margin: 8px 0; |
||||||
|
padding: 12px 20px; |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
textarea { |
||||||
|
border-radius: 4px; |
||||||
|
box-sizing: border-box; |
||||||
|
margin: 8px 0; |
||||||
|
padding: 12px 20px; |
||||||
|
width: 100%; |
||||||
|
} |
@ -0,0 +1,88 @@ |
|||||||
|
<?php |
||||||
|
$name = ''; |
||||||
|
$password = ''; |
||||||
|
$color = ''; |
||||||
|
$languages = array(); |
||||||
|
$comments = ''; |
||||||
|
|
||||||
|
if (isset($_POST['submit'])) { |
||||||
|
//echo htmlspecialchars($_POST['searchterm'], ENT_QUOTES); |
||||||
|
|
||||||
|
$ok = true; |
||||||
|
if (isset($_POST['submit'])) { |
||||||
|
if (!isset($_POST['name']) || empty($_POST['name'])) { |
||||||
|
die('Name is required'); |
||||||
|
} else { |
||||||
|
$name = $_POST['name']; |
||||||
|
} |
||||||
|
|
||||||
|
if (!isset($_POST['password']) || empty($_POST['password'])) { |
||||||
|
$ok = false; |
||||||
|
} else { |
||||||
|
$password = $_POST['password']; |
||||||
|
} |
||||||
|
if (isset($_POST['password'])) $password = $_POST['password']; |
||||||
|
if (isset($_POST['color'])) $color = $_POST['color']; |
||||||
|
if (isset($_POST['languages'])) $languages = $_POST['languages']; |
||||||
|
if (isset($_POST['comments'])) $comments = $_POST['comments']; |
||||||
|
} |
||||||
|
|
||||||
|
if ($ok) { |
||||||
|
printf('User name: %s<br>', htmlspecialchars($name, ENT_QUOTES)); |
||||||
|
printf('Password: %s<br>', htmlspecialchars($password, ENT_QUOTES)); |
||||||
|
printf('Favorite Color: %s<br>', htmlspecialchars($color, ENT_QUOTES)); |
||||||
|
printf('Languages Spoken: %s<br>', htmlspecialchars(implode(', ', $languages), ENT_QUOTES)); |
||||||
|
printf('Comments: %s<br>', htmlspecialchars($comments, ENT_QUOTES)); |
||||||
|
} |
||||||
|
} |
||||||
|
?> |
||||||
|
|
||||||
|
<!DOCTYPE html> |
||||||
|
<html lang="en"> |
||||||
|
|
||||||
|
<head> |
||||||
|
<meta charset="UTF-8"> |
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
||||||
|
<title>Document</title> |
||||||
|
|
||||||
|
<link rel="stylesheet" href="form.css"> |
||||||
|
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com"> |
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> |
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@100&display=swap" rel="stylesheet"> |
||||||
|
</head> |
||||||
|
|
||||||
|
<body> |
||||||
|
<form action="" method="post"> |
||||||
|
<label for="name">User name</label> |
||||||
|
<input type="text" name="name" value="<?php echo htmlspecialchars($name, ENT_QUOTES); ?>">
|
||||||
|
|
||||||
|
<label for="password">Password</label> |
||||||
|
<input type="password" name="password"> |
||||||
|
|
||||||
|
<label for="color">Favorite Color</label> |
||||||
|
<select name="color" id="color"> |
||||||
|
<option value="">Please select...</option> |
||||||
|
<option value="#f00">Red</option> |
||||||
|
<option value="#0f0">Green</option> |
||||||
|
<option value="#00f">Blue</option> |
||||||
|
</select> |
||||||
|
|
||||||
|
<label for="languages">Languages Spoken</label> |
||||||
|
<select name="languages[]" id="languages" multiple="multiple"> |
||||||
|
<option value="en">English</option> |
||||||
|
<option value="fr">French</option> |
||||||
|
<option value="de">German</option> |
||||||
|
</select> |
||||||
|
|
||||||
|
<label for="comments">Comments</label> |
||||||
|
<textarea name="comments" id="comments" cols="30" rows="10"> |
||||||
|
<?php echo htmlspecialchars($comments, ENT_QUOTES); ?> |
||||||
|
</textarea> |
||||||
|
|
||||||
|
<input type="submit" name="submit" value="Register"> |
||||||
|
</form> |
||||||
|
</body> |
||||||
|
|
||||||
|
</html> |
@ -0,0 +1,26 @@ |
|||||||
|
.new-expense__controls { |
||||||
|
display: flex; |
||||||
|
flex-wrap: wrap; |
||||||
|
gap: 1rem; |
||||||
|
margin-bottom: 1rem; |
||||||
|
text-align: left; |
||||||
|
} |
||||||
|
|
||||||
|
.new-expense__control label { |
||||||
|
font-weight: bold; |
||||||
|
margin-bottom: 0.5rem; |
||||||
|
display: block; |
||||||
|
} |
||||||
|
|
||||||
|
.new-expense__control input { |
||||||
|
font: inherit; |
||||||
|
padding: 0.5rem; |
||||||
|
border-radius: 6px; |
||||||
|
border: 1px solid #ccc; |
||||||
|
width: 20rem; |
||||||
|
max-width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
.new-expense__actions { |
||||||
|
text-align: right; |
||||||
|
} |
@ -0,0 +1,41 @@ |
|||||||
|
import React, {useState} from "react"; |
||||||
|
|
||||||
|
import "./ExpenseForm.css"; |
||||||
|
|
||||||
|
const ExpenseForm = (props) => { |
||||||
|
const [enteredTitle, setEnteredTitle] = useState(''); |
||||||
|
const [enteredAmount, setEnteredAmount] = useState(''); |
||||||
|
const [enteredDate, setEnteredDate] = useState(''); |
||||||
|
|
||||||
|
const titleChangeHandler = (event) => { |
||||||
|
setEnteredTitle(event.target.value); |
||||||
|
}; |
||||||
|
const amountChangeHandler = (event) => { |
||||||
|
setEnteredAmount(event.target.value); |
||||||
|
}; |
||||||
|
const dateChangeHandler = (event) => { |
||||||
|
setEnteredDate(event.target.value); |
||||||
|
}; |
||||||
|
|
||||||
|
return <form> |
||||||
|
<div className="new-expense__controls"> |
||||||
|
<div className="new-expense__control"> |
||||||
|
<label>Title</label> |
||||||
|
<input type="text" onChange={titleChangeHandler} /> |
||||||
|
</div> |
||||||
|
<div className="new-expense__control"> |
||||||
|
<label>Amount</label> |
||||||
|
<input type="number" min="0.01" step="0.01" onChange={amountChangeHandler} /> |
||||||
|
</div> |
||||||
|
<div className="new-expense__control"> |
||||||
|
<label>Date</label> |
||||||
|
<input type="date" min="2019-01-01" max="2022-12-31" onChange={dateChangeHandler} /> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div className="new-expense__actions"> |
||||||
|
<button type="submit">Add Expense</button> |
||||||
|
</div> |
||||||
|
</form> |
||||||
|
} |
||||||
|
|
||||||
|
export default ExpenseForm; |
@ -0,0 +1,38 @@ |
|||||||
|
.new-expense { |
||||||
|
background-color: #a892ee; |
||||||
|
padding: 1rem; |
||||||
|
margin: 2rem auto; |
||||||
|
width: 50rem; |
||||||
|
max-width: 95%; |
||||||
|
border-radius: 12px; |
||||||
|
text-align: center; |
||||||
|
box-shadow: 0 1px 8px rgba(0, 0, 0, 0.25); |
||||||
|
} |
||||||
|
|
||||||
|
.new-expense button { |
||||||
|
font: inherit; |
||||||
|
cursor: pointer; |
||||||
|
padding: 1rem 2rem; |
||||||
|
border: 1px solid #40005d; |
||||||
|
background-color: #40005d; |
||||||
|
color: white; |
||||||
|
border-radius: 12px; |
||||||
|
margin-right: 1rem; |
||||||
|
} |
||||||
|
|
||||||
|
.new-expense button:hover, |
||||||
|
.new-expense button:active { |
||||||
|
background-color: #510674; |
||||||
|
border-color: #510674; |
||||||
|
} |
||||||
|
|
||||||
|
.new-expense button.alternative { |
||||||
|
color: #220131; |
||||||
|
border-color: transparent; |
||||||
|
background-color: transparent; |
||||||
|
} |
||||||
|
|
||||||
|
.new-expense button.alternative:hover, |
||||||
|
.new-expense button.alternative:active { |
||||||
|
background-color: #ddb3f8; |
||||||
|
} |
@ -0,0 +1,22 @@ |
|||||||
|
import React from "react"; |
||||||
|
|
||||||
|
import ExpenseForm from "./ExpenseForm"; |
||||||
|
import './NewExpense.css'; |
||||||
|
|
||||||
|
const NewExpense = (props) => { |
||||||
|
const saveExpenseDataHandler = (enteredExpenseData) => { |
||||||
|
const expenseData = { |
||||||
|
...enteredExpenseData, |
||||||
|
id: Math.random().toString(), |
||||||
|
}; |
||||||
|
props.onAddExpense(expenseData); |
||||||
|
}; |
||||||
|
|
||||||
|
return ( |
||||||
|
<div className="new-expense"> |
||||||
|
<ExpenseForm onSaveExpenseData={saveExpenseDataHandler} /> |
||||||
|
</div> |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
export default NewExpense; |
Loading…
Reference in new issue