A massive, unorganized PR. #44

Merged
BobdaFett merged 15 commits from feature/categorize-chips into main 2026-01-13 09:50:27 +00:00
Showing only changes of commit 865410b6f2 - Show all commits
+222 -201
View File
@@ -40,20 +40,13 @@ pub fn ScholarshipInfoPage() -> impl IntoView {
// Remember that we only want to show the page after we've got authentication information // Remember that we only want to show the page after we've got authentication information
// and if there's data for us to use. // and if there's data for us to use.
view! { view! {
<Banner <Banner title="R15 Scholarships" logo="/PHS_Stacked_Acronym.png" path="/" />
title="R15 Scholarships"
logo="/PHS_Stacked_Acronym.png"
path="/"
/>
<ToastList> <ToastList>
<AuthLoaded fallback=Loading> <AuthLoaded fallback=Loading>
<Authenticated unauthenticated=UnauthenticatedPage> <Authenticated unauthenticated=UnauthenticatedPage>
<div class="flex flex-row align-top items-start"> <div class="flex flex-row align-top items-start">
<div class="flex flex-col flex-1" /> <div class="flex flex-col flex-1" />
<ScholarshipList <ScholarshipList refresh_token=list_refresh on_delete=on_delete />
refresh_token=list_refresh
on_delete=on_delete
/>
<Transition fallback=Loading> <Transition fallback=Loading>
<ScholarshipForm <ScholarshipForm
scholarship_id=scholarship_id scholarship_id=scholarship_id
@@ -183,37 +176,41 @@ fn ScholarshipList(
}); });
view! { view! {
<dialog <dialog node_ref=delete_dialog_ref class="m-auto p-2">
node_ref=delete_dialog_ref
class="m-auto p-2"
>
<h2 class="text-2xl font-bold">"Confirm Deletion"</h2> <h2 class="text-2xl font-bold">"Confirm Deletion"</h2>
<p> <p>
"Are you sure you want to delete " "Are you sure you want to delete "
{move || { {move || {
pending_delete.get().map(|s| { pending_delete
s.data.get("name").unwrap_or(&ValueType::String(None)) .get()
.as_string() .map(|s| {
.unwrap_or_default() s.data
.unwrap_or("<no name found>".to_string()) .get("name")
}) .unwrap_or(&ValueType::String(None))
}} .as_string()
"?" .unwrap_or_default()
.unwrap_or("<no name found>".to_string())
})
}} "?"
</p> </p>
<ActionButton <ActionButton
on:click=move |_| { on:click=move |_| {
let subject = pending_delete.get().map(|s| s.subject.clone()).unwrap_or_default(); let subject = pending_delete
.get()
.map(|s| s.subject.clone())
.unwrap_or_default();
log!("Deleting scholarship with subject {}", subject); log!("Deleting scholarship with subject {}", subject);
delete_action.dispatch(DeleteProviderScholarship { delete_action
scholarship_id: subject, .dispatch(DeleteProviderScholarship {
provider_id: provider_id.get().unwrap_or_default() scholarship_id: subject,
}); provider_id: provider_id.get().unwrap_or_default(),
});
} }
disabled=modal_disabled disabled=modal_disabled
>"Confirm"</ActionButton> >
<ActionButton "Confirm"
on:click=move |_| pending_delete.set(None) </ActionButton>
>"Cancel"</ActionButton> <ActionButton on:click=move |_| pending_delete.set(None)>"Cancel"</ActionButton>
</dialog> </dialog>
<div class="w-75"> <div class="w-75">
<Panel> <Panel>
@@ -223,31 +220,42 @@ fn ScholarshipList(
<Transition fallback=Loading> <Transition fallback=Loading>
<div class="flex flex-col gap-2"> <div class="flex flex-col gap-2">
{move || { {move || {
scholarships.get().map(|result| { scholarships
match result { .get()
Ok(list) => { .map(|result| {
let views = list.iter().map(|entry| { match result {
view! { Ok(list) => {
<ScholarshipListEntry scholarship=entry.clone() let views = list
on_delete=Callback::new(on_item_delete)/> .iter()
} .map(|entry| {
}); view! {
Either::Left(views.collect_view()) <ScholarshipListEntry
scholarship=entry.clone()
on_delete=Callback::new(on_item_delete)
/>
}
});
Either::Left(views.collect_view())
}
Err(err) => {
Either::Right(
view! {
<div>
<p>"Failed to load scholarship list: "{err.to_string()}</p>
</div>
},
)
}
} }
Err(err) => { })
Either::Right(view! { .collect_view()
<div>
<p>"Failed to load scholarship list: "{err.to_string()}</p>
</div>
})
}
}
}).collect_view()
}} }}
</div> </div>
<div> <div>
<div class="p-2 bg-red-800 rounded-md text-center text-white hover:bg-red-900 transition-all cursor-pointer" <div
on:click=create_on_click> class="p-2 bg-red-800 rounded-md text-center text-white hover:bg-red-900 transition-all cursor-pointer"
on:click=create_on_click
>
"Create New" "Create New"
</div> </div>
</div> </div>
@@ -307,13 +315,15 @@ fn ScholarshipListEntry(
<span>{name}</span> <span>{name}</span>
</div> </div>
<div class="flex flex-row"> <div class="flex flex-row">
<div class="p-2 flex-1 bg-red-800 border-r border-white rounded-bl-md text-white text-center <div
class="p-2 flex-1 bg-red-800 border-r border-white rounded-bl-md text-white text-center
hover:bg-red-900 cursor-pointer transition-all" hover:bg-red-900 cursor-pointer transition-all"
on:click=edit_click on:click=edit_click
> >
"Edit" "Edit"
</div> </div>
<div class="p-2 flex-1 bg-red-800 border-l border-white rounded-br-md text-white text-center <div
class="p-2 flex-1 bg-red-800 border-l border-white rounded-br-md text-white text-center
hover:bg-red-900 cursor-pointer transition-all" hover:bg-red-900 cursor-pointer transition-all"
on:click=move |_| on_delete.run(scholarship.clone()) on:click=move |_| on_delete.run(scholarship.clone())
> >
@@ -490,166 +500,177 @@ fn ScholarshipForm(
<Panel> <Panel>
<Show <Show
when=move || scholarship_id.get().is_some() when=move || scholarship_id.get().is_some()
fallback=|| view! { <p>"Choose a scholarship from the right, or create a new one."</p> } fallback=|| {
view! { <p>"Choose a scholarship from the right, or create a new one."</p> }
}
> >
<Suspense fallback=Loading> <Suspense fallback=Loading>
<ValidatedForm on_submit=Callback::new(on_submit)> <ValidatedForm on_submit=Callback::new(
on_submit,
)>
{move || { {move || {
scholarship_info.get() scholarship_info
.get()
.map(|res_scholarship| { .map(|res_scholarship| {
match res_scholarship { match res_scholarship {
Ok(_) => { Ok(_) => {
Either::Left(view! { Either::Left(
<Row> view! {
<h1 class="text-3xl font-bold"> <Row>
"Scholarship Info Form (test)" <h1 class="text-3xl font-bold">
</h1> "Scholarship Info Form (test)"
</Row> </h1>
<Row> </Row>
<OutlinedTextField <Row>
label="Scholarship Name" <OutlinedTextField
placeholder="Example Scholarship Name" label="Scholarship Name"
disabled=elements_disabled placeholder="Example Scholarship Name"
data_member="name" disabled=elements_disabled
data_map=form_data data_member="name"
/> data_map=form_data
</Row> />
<Row> </Row>
<OutlinedTextField <Row>
label="Amount per award: (if multiple, enter the highest value)" <OutlinedTextField
placeholder="Enter an amount..." label="Amount per award: (if multiple, enter the highest value)"
disabled=elements_disabled placeholder="Enter an amount..."
data_member="amount_per_award" disabled=elements_disabled
data_map=form_data data_member="amount_per_award"
input_type=TextFieldType::Number data_map=form_data
/> input_type=TextFieldType::Number
</Row> />
<Row> </Row>
<OutlinedTextField <Row>
label="Total number of awards:" <OutlinedTextField
placeholder="Enter an amount..." label="Total number of awards:"
disabled=elements_disabled placeholder="Enter an amount..."
data_member="num_awards" disabled=elements_disabled
data_map=form_data data_member="num_awards"
input_type=TextFieldType::Number data_map=form_data
/> input_type=TextFieldType::Number
</Row> />
<Row> </Row>
<OutlinedTextField <Row>
label="Total amount of all award(s): (estimates are acceptable)" <OutlinedTextField
placeholder="Enter an amount..." label="Total amount of all award(s): (estimates are acceptable)"
disabled=elements_disabled placeholder="Enter an amount..."
data_member="total_awards" disabled=elements_disabled
data_map=form_data data_member="total_awards"
input_type=TextFieldType::Number data_map=form_data
/> input_type=TextFieldType::Number
</Row> />
<Row> </Row>
<RadioList <Row>
data_member="fafsa_required" <RadioList
data_map=form_data data_member="fafsa_required"
items=vec!["Yes".to_string(), "No".to_string()] data_map=form_data
disabled=elements_disabled items=vec!["Yes".to_string(), "No".to_string()]
label="Do you require student FAFSA information?" disabled=elements_disabled
/> label="Do you require student FAFSA information?"
</Row> />
<Row> </Row>
<RadioList <Row>
data_member="transcript_required" <RadioList
data_map=form_data data_member="transcript_required"
items=vec!["Yes".to_string(), "No".to_string()] data_map=form_data
disabled=elements_disabled items=vec!["Yes".to_string(), "No".to_string()]
label="Do you require a student transcript?" disabled=elements_disabled
/> label="Do you require a student transcript?"
</Row> />
<Row> </Row>
<RadioList <Row>
data_member="award_to" <RadioList
data_map=form_data data_member="award_to"
items=vec!["School".to_string(), "Student".to_string()] data_map=form_data
disabled=elements_disabled items=vec!["School".to_string(), "Student".to_string()]
label="Will the award be made to the school or the student?" disabled=elements_disabled
/> label="Will the award be made to the school or the student?"
</Row> />
<Row> </Row>
<RadioList <Row>
data_member="essay_required" <RadioList
data_map=form_data data_member="essay_required"
items=vec!["Yes".to_string(), "No".to_string()] data_map=form_data
disabled=elements_disabled items=vec!["Yes".to_string(), "No".to_string()]
label="Do you require a student essay?" disabled=elements_disabled
/> label="Do you require a student essay?"
</Row> />
<Row> </Row>
<RadioList <Row>
data_member="essay_prompt" <RadioList
data_map=form_data data_member="essay_prompt"
items=vec!["Test 1", "Test 2", "Test 3"].iter().map(|s| s.to_string()).collect() data_map=form_data
disabled=elements_disabled items=vec!["Test 1", "Test 2", "Test 3"]
label="If so, select a prompt from the list below." .iter()
/> .map(|s| s.to_string())
</Row> .collect()
<Row> disabled=elements_disabled
<ChipsList label="If so, select a prompt from the list below."
label="GPA Requirements" />
data_member="gpa" </Row>
data_map=chips_data <Row>
values=gpa_ids <ChipsList
displayed_text=gpa_text label="GPA Requirements"
/> data_member="gpa"
</Row> data_map=chips_data
<Row> values=gpa_ids
<ChipsList displayed_text=gpa_text
label="Sports Participation" />
data_member="sports_participation" </Row>
data_map=chips_data <Row>
values=sports_ids <ChipsList
displayed_text=sports_text label="Sports Participation"
/> data_member="sports_participation"
</Row> data_map=chips_data
<Row> values=sports_ids
<ChipsList displayed_text=sports_text
label="Community Service" />
data_member="community_service" </Row>
data_map=chips_data <Row>
values=comm_ids <ChipsList
displayed_text=comm_text label="Community Service"
/> data_member="community_service"
</Row> data_map=chips_data
<Row> values=comm_ids
<ChipsList displayed_text=comm_text
label="Residency" />
data_member="residency" </Row>
data_map=chips_data <Row>
values=res_ids <ChipsList
displayed_text=res_text label="Residency"
/> data_member="residency"
</Row> data_map=chips_data
<Row> values=res_ids
<ChipsList displayed_text=res_text
label="Additional Eligibility Factors" />
data_member="misc" </Row>
data_map=chips_data <Row>
values=misc_ids <ChipsList
displayed_text=misc_text label="Additional Eligibility Factors"
/> data_member="misc"
</Row> data_map=chips_data
}) values=misc_ids
displayed_text=misc_text
/>
</Row>
},
)
} }
Err(err) => { Err(err) => {
Either::Right(view! { Either::Right(
<p>"Error while getting scholarship: "{err.to_string()}</p> view! {
}) <p>"Error while getting scholarship: "{err.to_string()}</p>
},
)
} }
} }
}).collect_view() })
.collect_view()
}} }}
</ValidatedForm> </ValidatedForm>
<ActionButton <ActionButton on:click=move |_| {
on:click=move |_| { create_comps.dispatch(CreateTestComparisons {});
create_comps.dispatch(CreateTestComparisons {}); }>"Create Comparisons"</ActionButton>
}
>"Create Comparisons"</ActionButton>
</Suspense> </Suspense>
</Show> </Show>
</Panel> </Panel>