feat: signal refactor for loaner page
This commit is contained in:
1 parent
073819c6c4
commit
94c2930d2a
2 files changed
+72
-79
No files matched your search
@@ -21,7 +21,6 @@ pub enum TextFieldType {
|
|||||||
|
|
||||||
/// Entry point for validating a text field.
|
/// Entry point for validating a text field.
|
||||||
fn validate(required: bool, value: &str, input_type: &TextFieldType) -> ValidationState {
|
fn validate(required: bool, value: &str, input_type: &TextFieldType) -> ValidationState {
|
||||||
log!("Input information: required: {}, value: \"{}\", input_type: {:?}", required, value, input_type);
|
|
||||||
if required && value.is_empty() {
|
if required && value.is_empty() {
|
||||||
ValidationState::Invalid("This field is required.".to_string())
|
ValidationState::Invalid("This field is required.".to_string())
|
||||||
} else {
|
} else {
|
||||||
@@ -36,7 +35,6 @@ fn validate(required: bool, value: &str, input_type: &TextFieldType) -> Validati
|
|||||||
/// Validates an email address.
|
/// Validates an email address.
|
||||||
fn validate_email(input: &str) -> ValidationState {
|
fn validate_email(input: &str) -> ValidationState {
|
||||||
// TODO Accept more than just Region 15 addresses.
|
// TODO Accept more than just Region 15 addresses.
|
||||||
log!("Validating email: {}", input);
|
|
||||||
let pattern = regex::Regex::new(r"^[a-zA-Z0-9._%+-]+@region15\.org$").expect("Invalid regex pattern");
|
let pattern = regex::Regex::new(r"^[a-zA-Z0-9._%+-]+@region15\.org$").expect("Invalid regex pattern");
|
||||||
|
|
||||||
if pattern.is_match(input) {
|
if pattern.is_match(input) {
|
||||||
@@ -48,7 +46,6 @@ fn validate_email(input: &str) -> ValidationState {
|
|||||||
|
|
||||||
/// Validates a number.
|
/// Validates a number.
|
||||||
fn validate_number(input: &str) -> ValidationState {
|
fn validate_number(input: &str) -> ValidationState {
|
||||||
log!("Validating number: {}", input);
|
|
||||||
if input.parse::<i32>().is_ok() {
|
if input.parse::<i32>().is_ok() {
|
||||||
ValidationState::Valid
|
ValidationState::Valid
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
+72
-76
@@ -5,9 +5,7 @@ use aws_sdk_dynamodb::{Client, error::ProvideErrorMetadata, types::AttributeValu
|
|||||||
use serde_dynamo::{from_item, to_item};
|
use serde_dynamo::{from_item, to_item};
|
||||||
|
|
||||||
use crate::common::{ExpandableInfo, ValueType};
|
use crate::common::{ExpandableInfo, ValueType};
|
||||||
use crate::components::{
|
use crate::components::{ActionButton, Banner, DashboardButton, OutlinedTextField, Panel, Row, Select, TextFieldType, ValidatedForm};
|
||||||
ActionButton, Banner, DashboardButton, OutlinedTextField, Panel, Row, Select,
|
|
||||||
};
|
|
||||||
use chrono::{FixedOffset, TimeZone};
|
use chrono::{FixedOffset, TimeZone};
|
||||||
use leptos::Params;
|
use leptos::Params;
|
||||||
use leptos::either::{Either, EitherOf3};
|
use leptos::either::{Either, EitherOf3};
|
||||||
@@ -247,81 +245,79 @@ pub fn LoanerBorrowForm() -> impl IntoView {
|
|||||||
let create_entry_action = ServerAction::<CreateBorrowEntry>::new();
|
let create_entry_action = ServerAction::<CreateBorrowEntry>::new();
|
||||||
let navigate = use_navigate();
|
let navigate = use_navigate();
|
||||||
|
|
||||||
let temp = ExpandableInfo::new(uuid::Uuid::new_v4().to_string());
|
let data = RwSignal::new(HashMap::new());
|
||||||
let temp_reactive = temp.as_reactive();
|
let elements_disabled = Signal::derive(move || create_entry_action.pending().get());
|
||||||
let elements_disabled = RwSignal::new(false);
|
|
||||||
|
let on_submit = move |_| {
|
||||||
|
create_entry_action.dispatch(CreateBorrowEntry {
|
||||||
|
input: ExpandableInfo {
|
||||||
|
subject: uuid::Uuid::new_v4().to_string(),
|
||||||
|
data: data.get(),
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
view! {
|
view! {
|
||||||
<div class="flex flex-col justify-center gap-2 mb-1 py-3 px-2">
|
<ValidatedForm on_submit=Callback::new(on_submit)>
|
||||||
<h2 class="text-2xl font-bold">"Borrower Information"</h2>
|
<div class="flex flex-col justify-center gap-2 mb-1 py-3 px-2">
|
||||||
<p class="text-lg">"Please fill out the form below."</p>
|
<h2 class="text-2xl font-bold">"Borrower Information"</h2>
|
||||||
</div>
|
<p class="text-lg">"Please fill out the form below."</p>
|
||||||
<Row>
|
</div>
|
||||||
<OutlinedTextField
|
<Row>
|
||||||
label="First Name:"
|
<OutlinedTextField
|
||||||
placeholder="John"
|
label="First Name:"
|
||||||
disabled=elements_disabled
|
placeholder="John"
|
||||||
data_member="first_name"
|
disabled=elements_disabled
|
||||||
data_map=temp_reactive.data
|
data_member="first_name"
|
||||||
/>
|
data_map=data
|
||||||
<OutlinedTextField
|
/>
|
||||||
label="Last Name:"
|
<OutlinedTextField
|
||||||
placeholder="Smith"
|
label="Last Name:"
|
||||||
disabled=elements_disabled
|
placeholder="Smith"
|
||||||
data_member="last_name"
|
disabled=elements_disabled
|
||||||
data_map=temp_reactive.data
|
data_member="last_name"
|
||||||
/>
|
data_map=data
|
||||||
</Row>
|
/>
|
||||||
<Row>
|
</Row>
|
||||||
<OutlinedTextField
|
<Row>
|
||||||
label="Region 15 Email:"
|
<OutlinedTextField
|
||||||
placeholder="example@region15.org"
|
label="Region 15 Email:"
|
||||||
disabled=elements_disabled
|
placeholder="example@region15.org"
|
||||||
data_member="email"
|
disabled=elements_disabled
|
||||||
data_map=temp_reactive.data
|
data_member="email"
|
||||||
/>
|
data_map=data
|
||||||
</Row>
|
input_type=TextFieldType::Email
|
||||||
<Row>
|
/>
|
||||||
<Select
|
</Row>
|
||||||
label="Collateral:"
|
<Row>
|
||||||
value_list=vec![
|
<Select
|
||||||
"Phone".to_string(),
|
label="Collateral:"
|
||||||
"Earbuds/Headphones".to_string(),
|
value_list=vec![
|
||||||
"Keys".to_string(),
|
"Phone".to_string(),
|
||||||
"Wallet".to_string(),
|
"Earbuds/Headphones".to_string(),
|
||||||
"Laptop".to_string(),
|
"Keys".to_string(),
|
||||||
]
|
"Wallet".to_string(),
|
||||||
disabled=elements_disabled
|
"Laptop".to_string(),
|
||||||
data_member="collateral"
|
]
|
||||||
data_map=temp_reactive.data
|
disabled=elements_disabled
|
||||||
/>
|
data_member="collateral"
|
||||||
</Row>
|
data_map=data
|
||||||
<Row>
|
/>
|
||||||
<Select
|
</Row>
|
||||||
label="Loan Taken:"
|
<Row>
|
||||||
value_list=vec![
|
<Select
|
||||||
"Chromebook".to_string(),
|
label="Loan Taken:"
|
||||||
"Charger".to_string(),
|
value_list=vec![
|
||||||
"Headphones".to_string(),
|
"Chromebook".to_string(),
|
||||||
]
|
"Charger".to_string(),
|
||||||
disabled=elements_disabled
|
"Headphones".to_string(),
|
||||||
data_member="loan"
|
]
|
||||||
data_map=temp_reactive.data
|
disabled=elements_disabled
|
||||||
/>
|
data_member="loan"
|
||||||
</Row>
|
data_map=data
|
||||||
<Row>
|
/>
|
||||||
<ActionButton
|
</Row>
|
||||||
on:click=move |_| {
|
</ValidatedForm>
|
||||||
let captured = temp_reactive.capture();
|
|
||||||
log!("Loaner record taken.");
|
|
||||||
log!("{:?}", captured);
|
|
||||||
create_entry_action.dispatch(CreateBorrowEntry {
|
|
||||||
input: captured
|
|
||||||
});
|
|
||||||
navigate("/loaners", Default::default());
|
|
||||||
}
|
|
||||||
>"Submit"</ActionButton>
|
|
||||||
</Row>
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user