PR with too many features #58

Merged
BobdaFett merged 56 commits from feat/admin-page into main 2026-02-10 14:31:49 +00:00
5 changed files with 295 additions and 269 deletions
Showing only changes of commit caec4fb017 - Show all commits

No files matched your search

+69 -64
View File
@@ -1,5 +1,5 @@
use leptos::prelude::*; use leptos::prelude::*;
use crate::components::{OutlinedTextField, Select, TextFieldType, ValidatedForm}; use crate::components::{Loading, OutlinedTextField, Select, TextFieldType, ValidatedForm};
use crate::pages::student::form_setup::use_student_form; use crate::pages::student::form_setup::use_student_form;
#[component] #[component]
@@ -12,68 +12,73 @@ pub fn StudentDemographicsPage() -> impl IntoView {
let controller = use_student_form("demographics"); let controller = use_student_form("demographics");
view! { view! {
<div class="flex flex-1" /> <Show
<div class="flex flex-col flex-2 mt-6"> when=move || controller.data_resource.get().is_some()
<ValidatedForm title="Student Demographic Form" on_submit=controller.submit_action> fallback=Loading
// Inputs here. >
<OutlinedTextField <div class="flex flex-1" />
label="First Name:" <div class="flex flex-col flex-2 mt-6">
data_map=controller.data_map <ValidatedForm title="Student Demographic Form" on_submit=controller.submit_action>
data_member="first_name" // Inputs here.
placeholder="John" <OutlinedTextField
input_type=TextFieldType::Text label="First Name:"
required=true data_map=controller.data_map
/> data_member="first_name"
<OutlinedTextField placeholder="John"
label="Last Name:" input_type=TextFieldType::Text
data_map=controller.data_map required=true
data_member="last_name" />
placeholder="Smith" <OutlinedTextField
input_type=TextFieldType::Text label="Last Name:"
required=true data_map=controller.data_map
/> data_member="last_name"
// There must be a date of birth selection field here. placeholder="Smith"
<OutlinedTextField input_type=TextFieldType::Text
label="Student ID Number:" required=true
data_map=controller.data_map />
data_member="id_number" // There must be a date of birth selection field here.
placeholder="Your 7 digit number..." <OutlinedTextField
input_type=TextFieldType::Number label="Student ID Number:"
required=true data_map=controller.data_map
/> data_member="id_number"
<OutlinedTextField placeholder="Your 7 digit number..."
label="Preferred Email:" input_type=TextFieldType::Number
data_map=controller.data_map required=true
data_member="email" />
placeholder="me@example.com" <OutlinedTextField
input_type=TextFieldType::Email(vec!["*".to_string()]) label="Preferred Email:"
required=true data_map=controller.data_map
/> data_member="email"
<OutlinedTextField placeholder="me@example.com"
label="Preferred Phone Number:" input_type=TextFieldType::Email(vec!["*".to_string()])
data_map=controller.data_map required=true
data_member="phone_number" />
placeholder="000-000-0000" <OutlinedTextField
input_type=TextFieldType::Text label="Preferred Phone Number:"
required=true data_map=controller.data_map
/> data_member="phone_number"
<OutlinedTextField placeholder="000-000-0000"
label="Street Address:" input_type=TextFieldType::Text
data_map=controller.data_map required=true
data_member="street_address" />
placeholder="234 Judd Rd" <OutlinedTextField
input_type=TextFieldType::Text label="Street Address:"
required=true data_map=controller.data_map
/> data_member="street_address"
<Select placeholder="234 Judd Rd"
label="Town:" input_type=TextFieldType::Text
value_list=vec!["Southbury".to_string(), "Middlebury".to_string()] required=true
data_map=controller.data_map />
data_member="town" <Select
required=true label="Town:"
/> value_list=vec!["Southbury".to_string(), "Middlebury".to_string()]
</ValidatedForm> data_map=controller.data_map
</div> data_member="town"
<div class="flex flex-1" /> required=true
/>
</ValidatedForm>
</div>
<div class="flex flex-1" />
</Show>
} }
} }
+36 -31
View File
@@ -1,5 +1,5 @@
use leptos::prelude::*; use leptos::prelude::*;
use crate::components::{MultiEntry, OutlinedTextField, TextFieldType, ValidatedForm}; use crate::components::{Loading, MultiEntry, OutlinedTextField, TextFieldType, ValidatedForm};
use crate::input; use crate::input;
use crate::pages::student::form_setup::use_student_form; use crate::pages::student::form_setup::use_student_form;
@@ -8,35 +8,40 @@ pub fn StudentExtracurricularsPage() -> impl IntoView {
let controller = use_student_form("demographics"); let controller = use_student_form("demographics");
view! { view! {
<div class="flex flex-1" /> <Show
<div class="flex flex-col flex-2 mt-6"> when=move || controller.data_resource.get().is_some()
<ValidatedForm title="Extracurricular Information" on_submit=controller.submit_action> fallback=Loading
// Inputs here. >
<OutlinedTextField <div class="flex flex-1" />
label="Total number of service hours:" <div class="flex flex-col flex-2 mt-6">
data_map=controller.data_map <ValidatedForm title="Extracurricular Information" on_submit=controller.submit_action>
data_member="service_hours" // Inputs here.
placeholder="Any number..." <OutlinedTextField
input_type=TextFieldType::Number label="Total number of service hours:"
required=true data_map=controller.data_map
/> data_member="service_hours"
<MultiEntry placeholder="Any number..."
label="Extracurricular Activities:" input_type=TextFieldType::Number
description="Leave blank if not applicable." required=true
data_map=controller.data_map />
data_member="extracurricular" <MultiEntry
schema=vec![ label="Extracurricular Activities:"
input!(Text, "activity_name", "Activity Name:", true, "Some activity..."), description="Leave blank if not applicable."
input!(Number, "num_hours", "Number of hours completed:", true, "40"), data_map=controller.data_map
input!(Number, "num_weeks", "Number of weeks participated:", true, "3"), data_member="extracurricular"
input!(Text, "special_involvement", "Any special involvement:", false, ""), schema=vec![
input!( input!(Text, "activity_name", "Activity Name:", true, "Some activity..."),
Checkbox, "grades", "Grades Participated:", true, ["9th", "10th", "11th", "12th"] input!(Number, "num_hours", "Number of hours completed:", true, "40"),
), input!(Number, "num_weeks", "Number of weeks participated:", true, "3"),
] input!(Text, "special_involvement", "Any special involvement:", false, ""),
/> input!(
</ValidatedForm> Checkbox, "grades", "Grades Participated:", true, ["9th", "10th", "11th", "12th"]
</div> ),
<div class="flex flex-1" /> ]
/>
</ValidatedForm>
</div>
<div class="flex flex-1" />
</Show>
} }
} }
+98 -93
View File
@@ -1,5 +1,5 @@
use leptos::prelude::*; use leptos::prelude::*;
use crate::components::{OutlinedTextField, TextFieldType, ValidatedForm}; use crate::components::{Loading, OutlinedTextField, TextFieldType, ValidatedForm};
use crate::pages::student::form_setup::use_student_form; use crate::pages::student::form_setup::use_student_form;
#[component] #[component]
@@ -7,97 +7,102 @@ pub fn StudentFamilyPage() -> impl IntoView {
let controller = use_student_form("family"); let controller = use_student_form("family");
view! { view! {
<div class="flex flex-1" /> <Show
<div class="flex flex-col flex-2 mt-6"> when=move || controller.data_resource.get().is_some()
<ValidatedForm title="Family Information" on_submit=controller.submit_action> fallback=Loading
// Inputs here. >
<OutlinedTextField <div class="flex flex-1" />
label="Total number of children in family:" <div class="flex flex-col flex-2 mt-6">
data_map=controller.data_map <ValidatedForm title="Family Information" on_submit=controller.submit_action>
data_member="num_children" // Inputs here.
placeholder="Any number..." <OutlinedTextField
input_type=TextFieldType::Number label="Total number of children in family:"
required=true data_map=controller.data_map
/> data_member="num_children"
<OutlinedTextField placeholder="Any number..."
label="Total number of children currently attending college:" input_type=TextFieldType::Number
data_map=controller.data_map required=true
data_member="num_children_college" />
placeholder="Any number..." <OutlinedTextField
input_type=TextFieldType::Number label="Total number of children currently attending college:"
required=true data_map=controller.data_map
/> data_member="num_children_college"
<OutlinedTextField placeholder="Any number..."
label="Parent/Guardian 1 Name:" input_type=TextFieldType::Number
data_map=controller.data_map required=true
data_member="parent_one_name" />
placeholder="John Smith" <OutlinedTextField
input_type=TextFieldType::Text label="Parent/Guardian 1 Name:"
required=true data_map=controller.data_map
/> data_member="parent_one_name"
// TODO Could this be a select dropdown? placeholder="John Smith"
<OutlinedTextField input_type=TextFieldType::Text
label="Parent/Guardian 1 Relationship:" required=true
data_map=controller.data_map />
data_member="parent_one_relationship" // TODO Could this be a select dropdown?
placeholder="Mother/Father" <OutlinedTextField
input_type=TextFieldType::Text label="Parent/Guardian 1 Relationship:"
required=true data_map=controller.data_map
/> data_member="parent_one_relationship"
// TODO Get a better example placeholder="Mother/Father"
<OutlinedTextField input_type=TextFieldType::Text
label="Parent/Guardian 1 Occupation:" required=true
data_map=controller.data_map />
data_member="parent_one_occupation" // TODO Get a better example
placeholder="Milkman" <OutlinedTextField
input_type=TextFieldType::Text label="Parent/Guardian 1 Occupation:"
required=true data_map=controller.data_map
/> data_member="parent_one_occupation"
<OutlinedTextField placeholder="Milkman"
label="Parent/Guardian 1 Employer:" input_type=TextFieldType::Text
data_map=controller.data_map required=true
data_member="parent_one_employer" />
placeholder="Example Employer" <OutlinedTextField
input_type=TextFieldType::Text label="Parent/Guardian 1 Employer:"
required=true data_map=controller.data_map
/> data_member="parent_one_employer"
placeholder="Example Employer"
<OutlinedTextField input_type=TextFieldType::Text
label="Parent/Guardian 2 Name:" required=true
data_map=controller.data_map />
data_member="parent_one_name"
placeholder="John Smith" <OutlinedTextField
input_type=TextFieldType::Text label="Parent/Guardian 2 Name:"
required=false data_map=controller.data_map
/> data_member="parent_two_name"
// TODO Could this be a select dropdown? placeholder="John Smith"
<OutlinedTextField input_type=TextFieldType::Text
label="Parent/Guardian 2 Relationship:" required=false
data_map=controller.data_map />
data_member="parent_one_relationship" // TODO Could this be a select dropdown?
placeholder="Mother/Father" <OutlinedTextField
input_type=TextFieldType::Text label="Parent/Guardian 2 Relationship:"
required=false data_map=controller.data_map
/> data_member="parent_two_relationship"
// TODO Get a better example placeholder="Mother/Father"
<OutlinedTextField input_type=TextFieldType::Text
label="Parent/Guardian 2 Occupation:" required=false
data_map=controller.data_map />
data_member="parent_one_occupation" // TODO Get a better example
placeholder="Milkman" <OutlinedTextField
input_type=TextFieldType::Text label="Parent/Guardian 2 Occupation:"
required=false data_map=controller.data_map
/> data_member="parent_two_occupation"
<OutlinedTextField placeholder="Milkman"
label="Parent/Guardian 2 Employer:" input_type=TextFieldType::Text
data_map=controller.data_map required=false
data_member="parent_one_employer" />
placeholder="Example Employer" <OutlinedTextField
input_type=TextFieldType::Text label="Parent/Guardian 2 Employer:"
required=false data_map=controller.data_map
/> data_member="parent_two_employer"
</ValidatedForm> placeholder="Example Employer"
</div> input_type=TextFieldType::Text
<div class="flex flex-1" /> required=false
/>
</ValidatedForm>
</div>
<div class="flex flex-1" />
</Show>
} }
} }
+65 -60
View File
@@ -1,5 +1,5 @@
use leptos::prelude::*; use leptos::prelude::*;
use crate::components::{OutlinedTextField, Select, TextFieldType, ValidatedForm}; use crate::components::{Loading, OutlinedTextField, Select, TextFieldType, ValidatedForm};
use crate::pages::student::form_setup::use_student_form; use crate::pages::student::form_setup::use_student_form;
#[component] #[component]
@@ -10,64 +10,69 @@ pub fn StudentUniversityPage() -> impl IntoView {
// major, study field, intended career, college_acceptance // major, study field, intended career, college_acceptance
view! { view! {
<div class="flex flex-1" /> <Show
<div class="flex flex-col flex-2 mt-6"> when=move || controller.data_resource.get().is_some()
<ValidatedForm title="University Information" on_submit=controller.submit_action> fallback=Loading
// Inputs here. >
<OutlinedTextField <div class="flex flex-1" />
label="University Name:" <div class="flex flex-col flex-2 mt-6">
data_map=controller.data_map <ValidatedForm title="University Information" on_submit=controller.submit_action>
data_member="college_name" // Inputs here.
placeholder="University of Example" <OutlinedTextField
input_type=TextFieldType::Number label="University Name:"
required=true data_map=controller.data_map
/> data_member="college_name"
<OutlinedTextField placeholder="University of Example"
label="University Street Address:" input_type=TextFieldType::Text
data_map=controller.data_map required=true
data_member="college_city" />
placeholder="123 Example Rd" <OutlinedTextField
input_type=TextFieldType::Text label="University Street Address:"
required=true data_map=controller.data_map
/> data_member="college_city"
// TODO Make this a select dropdown. placeholder="123 Example Rd"
<OutlinedTextField input_type=TextFieldType::Text
label="University State:" required=true
data_map=controller.data_map />
data_member="college_state" // TODO Make this a select dropdown.
placeholder="The State of Panic" <OutlinedTextField
input_type=TextFieldType::Text label="University State:"
required=true data_map=controller.data_map
/> data_member="college_state"
<OutlinedTextField placeholder="The State of Panic"
label="University ZIP:" input_type=TextFieldType::Text
data_map=controller.data_map required=true
data_member="college_zip" />
placeholder="12345" <OutlinedTextField
input_type=TextFieldType::Number label="University ZIP:"
required=true data_map=controller.data_map
/> data_member="college_zip"
<Select placeholder="12345"
label="Have you been sent an acceptance to the university?" input_type=TextFieldType::Text
data_map=controller.data_map required=true
data_member="college_acceptance" />
required=true <Select
value_list=vec![ label="Have you been sent an acceptance to the university?"
"Yes".to_string(), data_map=controller.data_map
"No".to_string() data_member="college_acceptance"
] required=true
/> value_list=vec![
// TODO Make this a select dropdown. "Yes".to_string(),
<OutlinedTextField "No".to_string()
label="Chosen Major:" ]
data_map=controller.data_map />
data_member="major" // TODO Make this a select dropdown.
placeholder="Computer Science" <OutlinedTextField
input_type=TextFieldType::Text label="Chosen Major:"
required=true data_map=controller.data_map
/> data_member="major"
</ValidatedForm> placeholder="Computer Science"
</div> input_type=TextFieldType::Text
<div class="flex flex-1" /> required=true
/>
</ValidatedForm>
</div>
<div class="flex flex-1" />
</Show>
} }
} }
+27 -21
View File
@@ -1,31 +1,37 @@
use std::collections::HashMap; use std::collections::HashMap;
use leptos::prelude::*; use leptos::prelude::*;
use crate::components::{MultiEntry, ValidatedForm}; use crate::components::{Loading, MultiEntry, ValidatedForm};
use crate::input; use crate::input;
use crate::pages::student::form_setup::use_student_form;
#[component] #[component]
pub fn StudentWorkExperiencePage() -> impl IntoView { pub fn StudentWorkExperiencePage() -> impl IntoView {
let data_map = RwSignal::new(HashMap::new()); let controller = use_student_form("workexp");
view! { view! {
<div class="flex flex-1" /> <Show
<div class="flex flex-col flex-2 mt-6"> when=move || controller.data_resource.get().is_some()
<ValidatedForm title="Student Work Experience" on_submit=move || {}> fallback=Loading
<MultiEntry >
label="Work Experience:" <div class="flex flex-1" />
description="Leave blank if not applicable." <div class="flex flex-col flex-2 mt-6">
data_map=data_map <ValidatedForm title="Student Work Experience" on_submit=controller.submit_action>
data_member="extracurricular" <MultiEntry
schema=vec![ label="Work Experience:"
input!(Text, "job_title", "Job Title:", true, "Waiter, Cashier, etc..."), description="Leave blank if not applicable."
input!(Text, "employer", "Employer:", true, "Your employer's name..."), data_map=controller.data_map
input!(Number, "start_date", "Start date:", true, "40"), data_member="extracurricular"
input!(Number, "end_date", "End date:", true, "3"), schema=vec![
input!(Number, "num_hours", "Number of hours completed:", true, "120"), input!(Text, "job_title", "Job Title:", true, "Waiter, Cashier, etc..."),
] input!(Text, "employer", "Employer:", true, "Your employer's name..."),
/> input!(Number, "start_date", "Start date:", true, "40"),
</ValidatedForm> input!(Number, "end_date", "End date:", true, "3"),
</div> input!(Number, "num_hours", "Number of hours completed:", true, "120"),
<div class="flex flex-1" /> ]
/>
</ValidatedForm>
</div>
<div class="flex flex-1" />
</Show>
} }
} }