Implement provider scholarship edit form #33
No files matched your search
+3
-4
@@ -1,10 +1,9 @@
|
|||||||
use leptos::logging::log;
|
use crate::pages::{AboutPage, HomePage, LoanerPage, ProviderPortal, ScholarshipInfoPage, TestPage};
|
||||||
|
use leptos::leptos_dom::log;
|
||||||
use leptos::prelude::*;
|
use leptos::prelude::*;
|
||||||
use leptos_meta::{MetaTags, Stylesheet, Title, provide_meta_context};
|
use leptos_meta::{MetaTags, Stylesheet, Title, provide_meta_context};
|
||||||
use leptos_oidc::{Auth, AuthParameters, AuthSignal, Challenge};
|
use leptos_oidc::{Auth, AuthParameters, AuthSignal, Challenge};
|
||||||
use leptos_router::{components::{Route, Router, Routes}, path};
|
use leptos_router::{components::{Route, Router, Routes, ParentRoute}, path};
|
||||||
use leptos_router::components::ParentRoute;
|
|
||||||
use crate::pages::{AboutPage, ComparisonTestPage, HomePage, LoanerPage, ScholarshipInfoPage, TestPage};
|
|
||||||
|
|
||||||
pub fn shell(options: LeptosOptions) -> impl IntoView {
|
pub fn shell(options: LeptosOptions) -> impl IntoView {
|
||||||
view! {
|
view! {
|
||||||
|
|||||||
@@ -42,8 +42,13 @@ impl ComparisonData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn compare(&self, student_data: &ExpandableInfo) -> Result<bool, String> {
|
pub fn compare(&self, student_data: &ExpandableInfo) -> Result<bool, String> {
|
||||||
let value = student_data.data.get(&self.member)
|
let value = student_data.data.get(&self.member).expect(
|
||||||
.expect(format!("Couldn't find member {:?}, current student data: {:?}", self.member, student_data).as_str());
|
format!(
|
||||||
|
"Couldn't find member {:?}, current student data: {:?}",
|
||||||
|
self.member, student_data
|
||||||
|
)
|
||||||
|
.as_str(),
|
||||||
|
);
|
||||||
self.comparison.evaluate(value, &self.target_value)
|
self.comparison.evaluate(value, &self.target_value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -73,8 +78,8 @@ impl Comparison for ComparisonType {
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use crate::common::comparison::test_utils::create_student_data;
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
use crate::common::comparison::test_utils::create_student_data;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_student_data() {
|
fn test_student_data() {
|
||||||
|
|||||||
@@ -288,10 +288,12 @@ impl Comparison for MapListComparison {
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use super::super::test_utils::create_map_list_helper;
|
||||||
use super::*;
|
use super::*;
|
||||||
use super::super::test_utils::{create_map_list_helper};
|
use crate::common::ComparisonType;
|
||||||
use crate::common::{ComparisonType};
|
use crate::common::comparison::test_utils::{
|
||||||
use crate::common::comparison::test_utils::{create_empty_lists, create_number_list, create_text_list};
|
create_empty_lists, create_number_list, create_text_list,
|
||||||
|
};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn map_list_flatten_to_text_list() {
|
fn map_list_flatten_to_text_list() {
|
||||||
@@ -441,9 +443,7 @@ mod tests {
|
|||||||
fn text_list_empty() {
|
fn text_list_empty() {
|
||||||
let none_list = ValueType::List(None);
|
let none_list = ValueType::List(None);
|
||||||
let empty_list = ValueType::List(Some(vec![]));
|
let empty_list = ValueType::List(Some(vec![]));
|
||||||
let long_list = ValueType::List(Some(vec![
|
let long_list = ValueType::List(Some(vec![ValueType::String(None)]));
|
||||||
ValueType::String(None),
|
|
||||||
]));
|
|
||||||
|
|
||||||
let empty_comp = ComparisonType::TextList(TextListComparison::IsEmpty);
|
let empty_comp = ComparisonType::TextList(TextListComparison::IsEmpty);
|
||||||
let not_empty_comp = ComparisonType::TextList(TextListComparison::IsNotEmpty);
|
let not_empty_comp = ComparisonType::TextList(TextListComparison::IsNotEmpty);
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ pub use self::{base::*, lists::*, number::*, text::*, traits::*};
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test_utils {
|
mod test_utils {
|
||||||
use std::collections::HashMap;
|
|
||||||
use crate::common::{ExpandableInfo, ValueType};
|
use crate::common::{ExpandableInfo, ValueType};
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
pub fn create_student_data() -> ExpandableInfo {
|
pub fn create_student_data() -> ExpandableInfo {
|
||||||
let map = create_map_helper(
|
let map = create_map_helper(
|
||||||
@@ -40,19 +40,16 @@ mod test_utils {
|
|||||||
ValueType::String(Some(10.to_string())),
|
ValueType::String(Some(10.to_string())),
|
||||||
])),
|
])),
|
||||||
ValueType::String(Some("N/A".to_string())),
|
ValueType::String(Some("N/A".to_string())),
|
||||||
]
|
],
|
||||||
))),
|
))),
|
||||||
ValueType::Map(Some(create_map_helper(
|
ValueType::Map(Some(create_map_helper(
|
||||||
vec![
|
vec!["activity_name".to_string(), "total_hours".to_string()],
|
||||||
"activity_name".to_string(),
|
|
||||||
"total_hours".to_string(),
|
|
||||||
],
|
|
||||||
vec![
|
vec![
|
||||||
ValueType::String(Some("Raking".to_string())),
|
ValueType::String(Some("Raking".to_string())),
|
||||||
ValueType::Number(Some(30.to_string())),
|
ValueType::Number(Some(30.to_string())),
|
||||||
]
|
],
|
||||||
))),
|
))),
|
||||||
]
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut info = ExpandableInfo::new("test");
|
let mut info = ExpandableInfo::new("test");
|
||||||
@@ -61,9 +58,11 @@ mod test_utils {
|
|||||||
info
|
info
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn create_map_helper(keys: Vec<String>, values: Vec<ValueType>) -> HashMap<String, ValueType> {
|
pub fn create_map_helper(
|
||||||
keys
|
keys: Vec<String>,
|
||||||
.iter()
|
values: Vec<ValueType>,
|
||||||
|
) -> HashMap<String, ValueType> {
|
||||||
|
keys.iter()
|
||||||
.cloned()
|
.cloned()
|
||||||
.zip(values.iter().cloned())
|
.zip(values.iter().cloned())
|
||||||
.collect::<HashMap<String, ValueType>>()
|
.collect::<HashMap<String, ValueType>>()
|
||||||
@@ -76,7 +75,7 @@ mod test_utils {
|
|||||||
"last_name".to_string(),
|
"last_name".to_string(),
|
||||||
"gender".to_string(),
|
"gender".to_string(),
|
||||||
"sat_score".to_string(),
|
"sat_score".to_string(),
|
||||||
"grades_participated".to_string()
|
"grades_participated".to_string(),
|
||||||
],
|
],
|
||||||
vec![
|
vec![
|
||||||
ValueType::String(Some("John".to_string())),
|
ValueType::String(Some("John".to_string())),
|
||||||
@@ -85,8 +84,8 @@ mod test_utils {
|
|||||||
ValueType::Number(Some(1200.to_string())),
|
ValueType::Number(Some(1200.to_string())),
|
||||||
ValueType::List(Some(vec![
|
ValueType::List(Some(vec![
|
||||||
ValueType::String(Some("9".to_string())),
|
ValueType::String(Some("9".to_string())),
|
||||||
ValueType::String(Some("10".to_string()))
|
ValueType::String(Some("10".to_string())),
|
||||||
]))
|
])),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -96,7 +95,7 @@ mod test_utils {
|
|||||||
"last_name".to_string(),
|
"last_name".to_string(),
|
||||||
"gender".to_string(),
|
"gender".to_string(),
|
||||||
"sat_score".to_string(),
|
"sat_score".to_string(),
|
||||||
"grades_participated".to_string()
|
"grades_participated".to_string(),
|
||||||
],
|
],
|
||||||
vec![
|
vec![
|
||||||
ValueType::String(Some("Jane".to_string())),
|
ValueType::String(Some("Jane".to_string())),
|
||||||
@@ -105,8 +104,8 @@ mod test_utils {
|
|||||||
ValueType::Number(Some(1000.to_string())),
|
ValueType::Number(Some(1000.to_string())),
|
||||||
ValueType::List(Some(vec![
|
ValueType::List(Some(vec![
|
||||||
ValueType::String(Some("11".to_string())),
|
ValueType::String(Some("11".to_string())),
|
||||||
ValueType::String(Some("12".to_string()))
|
ValueType::String(Some("12".to_string())),
|
||||||
]))
|
])),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,9 +1,9 @@
|
|||||||
mod comparison;
|
mod comparison;
|
||||||
mod expandable_info;
|
mod expandable_info;
|
||||||
|
mod form_params;
|
||||||
mod form_schema;
|
mod form_schema;
|
||||||
mod user;
|
mod user;
|
||||||
mod value_type;
|
mod value_type;
|
||||||
mod form_params;
|
|
||||||
mod submit_status;
|
mod submit_status;
|
||||||
|
|
||||||
pub use self::{comparison::*, expandable_info::*, form_schema::*, user::*, value_type::*, form_params::*, submit_status::*};
|
pub use self::{comparison::*, expandable_info::*, form_schema::*, user::*, value_type::*, form_params::*, submit_status::*};
|
||||||
@@ -74,7 +74,8 @@ pub fn MultiEntry(
|
|||||||
#[prop()]
|
#[prop()]
|
||||||
data_map: RwSignal<HashMap<String, ValueType>>,
|
data_map: RwSignal<HashMap<String, ValueType>>,
|
||||||
/// Currently unused.
|
/// Currently unused.
|
||||||
#[prop(optional, into)] name_member: String,
|
#[prop(optional, into)]
|
||||||
|
name_member: String,
|
||||||
/// The type and order of the inputs for each `Entry` component within this `MultiEntry` component.
|
/// The type and order of the inputs for each `Entry` component within this `MultiEntry` component.
|
||||||
#[prop(optional)]
|
#[prop(optional)]
|
||||||
schema: Vec<InputType>,
|
schema: Vec<InputType>,
|
||||||
|
|||||||
@@ -2,184 +2,185 @@
|
|||||||
use crate::pages::utils::server_utils::create_dynamo_client;
|
use crate::pages::utils::server_utils::create_dynamo_client;
|
||||||
|
|
||||||
#[cfg(feature = "ssr")]
|
#[cfg(feature = "ssr")]
|
||||||
use aws_sdk_dynamodb::{
|
use aws_sdk_dynamodb::error::ProvideErrorMetadata;
|
||||||
error::ProvideErrorMetadata,
|
|
||||||
};
|
|
||||||
|
|
||||||
|
use crate::common::{
|
||||||
|
ComparisonData, ComparisonType, MapListComparison, NumberComparison, NumberListComparison,
|
||||||
|
TextComparison, TextListComparison, ValueType,
|
||||||
|
};
|
||||||
use leptos::leptos_dom::log;
|
use leptos::leptos_dom::log;
|
||||||
use leptos::prelude::ServerFnError;
|
use leptos::prelude::ServerFnError;
|
||||||
use leptos::server;
|
use leptos::server;
|
||||||
use crate::common::{ComparisonData, ComparisonType, MapListComparison, NumberComparison, NumberListComparison, TextComparison, TextListComparison, ValueType};
|
|
||||||
|
|
||||||
/// Helper function to create all sports comparisons. Only used to create initial
|
/// Helper function to create all sports comparisons. Only used to create initial
|
||||||
/// comparison data, and should be removed upon completion of a comparison editor page.
|
/// comparison data, and should be removed upon completion of a comparison editor page.
|
||||||
fn create_sports_comparisons() -> Vec<ComparisonData> {
|
fn create_sports_comparisons() -> Vec<ComparisonData> {
|
||||||
vec! [
|
vec![
|
||||||
ComparisonData::new(
|
ComparisonData::new(
|
||||||
"sports_football",
|
"sports_football",
|
||||||
"sports_participation",
|
"sports_participation",
|
||||||
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
||||||
"sport_name".to_string(),
|
"sport_name".to_string(),
|
||||||
Box::new(TextListComparison::Contains)
|
Box::new(TextListComparison::Contains),
|
||||||
)),
|
)),
|
||||||
ValueType::String(Some("Football".to_string())),
|
ValueType::String(Some("Football".to_string())),
|
||||||
"Sports Participation",
|
"Sports Participation",
|
||||||
"Football"
|
"Football",
|
||||||
),
|
),
|
||||||
ComparisonData::new(
|
ComparisonData::new(
|
||||||
"sports_soccer",
|
"sports_soccer",
|
||||||
"sports_participation",
|
"sports_participation",
|
||||||
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
||||||
"sport_name".to_string(),
|
"sport_name".to_string(),
|
||||||
Box::new(TextListComparison::Contains)
|
Box::new(TextListComparison::Contains),
|
||||||
)),
|
)),
|
||||||
ValueType::String(Some("Soccer".to_string())),
|
ValueType::String(Some("Soccer".to_string())),
|
||||||
"Sports Participation",
|
"Sports Participation",
|
||||||
"Soccer"
|
"Soccer",
|
||||||
),
|
),
|
||||||
ComparisonData::new(
|
ComparisonData::new(
|
||||||
"sports_cheerleading",
|
"sports_cheerleading",
|
||||||
"sports_participation",
|
"sports_participation",
|
||||||
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
||||||
"sport_name".to_string(),
|
"sport_name".to_string(),
|
||||||
Box::new(TextListComparison::Contains)
|
Box::new(TextListComparison::Contains),
|
||||||
)),
|
)),
|
||||||
ValueType::String(Some("Cheerleading".to_string())),
|
ValueType::String(Some("Cheerleading".to_string())),
|
||||||
"Sports Participation",
|
"Sports Participation",
|
||||||
"Cheerleading"
|
"Cheerleading",
|
||||||
),
|
),
|
||||||
ComparisonData::new(
|
ComparisonData::new(
|
||||||
"sports_field_hockey",
|
"sports_field_hockey",
|
||||||
"sports_participation",
|
"sports_participation",
|
||||||
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
||||||
"sport_name".to_string(),
|
"sport_name".to_string(),
|
||||||
Box::new(TextListComparison::Contains)
|
Box::new(TextListComparison::Contains),
|
||||||
)),
|
)),
|
||||||
ValueType::String(Some("Field Hockey".to_string())),
|
ValueType::String(Some("Field Hockey".to_string())),
|
||||||
"Sports Participation",
|
"Sports Participation",
|
||||||
"Field Hockey"
|
"Field Hockey",
|
||||||
),
|
),
|
||||||
ComparisonData::new(
|
ComparisonData::new(
|
||||||
"sports_swimming",
|
"sports_swimming",
|
||||||
"sports_participation",
|
"sports_participation",
|
||||||
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
||||||
"sport_name".to_string(),
|
"sport_name".to_string(),
|
||||||
Box::new(TextListComparison::Contains)
|
Box::new(TextListComparison::Contains),
|
||||||
)),
|
)),
|
||||||
ValueType::String(Some("Swimming".to_string())),
|
ValueType::String(Some("Swimming".to_string())),
|
||||||
"Sports Participation",
|
"Sports Participation",
|
||||||
"Swimming"
|
"Swimming",
|
||||||
),
|
),
|
||||||
ComparisonData::new(
|
ComparisonData::new(
|
||||||
"sports_golf",
|
"sports_golf",
|
||||||
"sports_participation",
|
"sports_participation",
|
||||||
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
||||||
"sport_name".to_string(),
|
"sport_name".to_string(),
|
||||||
Box::new(TextListComparison::Contains)
|
Box::new(TextListComparison::Contains),
|
||||||
)),
|
)),
|
||||||
ValueType::String(Some("Golf".to_string())),
|
ValueType::String(Some("Golf".to_string())),
|
||||||
"Sports Participation",
|
"Sports Participation",
|
||||||
"Golf"
|
"Golf",
|
||||||
),
|
),
|
||||||
ComparisonData::new(
|
ComparisonData::new(
|
||||||
"sports_basketball",
|
"sports_basketball",
|
||||||
"sports_participation",
|
"sports_participation",
|
||||||
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
||||||
"sport_name".to_string(),
|
"sport_name".to_string(),
|
||||||
Box::new(TextListComparison::Contains)
|
Box::new(TextListComparison::Contains),
|
||||||
)),
|
)),
|
||||||
ValueType::String(Some("Basketball".to_string())),
|
ValueType::String(Some("Basketball".to_string())),
|
||||||
"Sports Participation",
|
"Sports Participation",
|
||||||
"Basketball"
|
"Basketball",
|
||||||
),
|
),
|
||||||
ComparisonData::new(
|
ComparisonData::new(
|
||||||
"sports_track",
|
"sports_track",
|
||||||
"sports_participation",
|
"sports_participation",
|
||||||
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
||||||
"sport_name".to_string(),
|
"sport_name".to_string(),
|
||||||
Box::new(TextListComparison::Contains)
|
Box::new(TextListComparison::Contains),
|
||||||
)),
|
)),
|
||||||
ValueType::String(Some("Track".to_string())),
|
ValueType::String(Some("Track".to_string())),
|
||||||
"Sports Participation",
|
"Sports Participation",
|
||||||
"Track"
|
"Track",
|
||||||
),
|
),
|
||||||
ComparisonData::new(
|
ComparisonData::new(
|
||||||
"sports_gymnastics",
|
"sports_gymnastics",
|
||||||
"sports_participation",
|
"sports_participation",
|
||||||
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
||||||
"sport_name".to_string(),
|
"sport_name".to_string(),
|
||||||
Box::new(TextListComparison::Contains)
|
Box::new(TextListComparison::Contains),
|
||||||
)),
|
)),
|
||||||
ValueType::String(Some("Gymnastics".to_string())),
|
ValueType::String(Some("Gymnastics".to_string())),
|
||||||
"Sports Participation",
|
"Sports Participation",
|
||||||
"Gymnastics"
|
"Gymnastics",
|
||||||
),
|
),
|
||||||
ComparisonData::new(
|
ComparisonData::new(
|
||||||
"sports_ice_hockey",
|
"sports_ice_hockey",
|
||||||
"sports_participation",
|
"sports_participation",
|
||||||
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
||||||
"sport_name".to_string(),
|
"sport_name".to_string(),
|
||||||
Box::new(TextListComparison::Contains)
|
Box::new(TextListComparison::Contains),
|
||||||
)),
|
)),
|
||||||
ValueType::String(Some("Ice Hockey".to_string())),
|
ValueType::String(Some("Ice Hockey".to_string())),
|
||||||
"Sports Participation",
|
"Sports Participation",
|
||||||
"Ice Hockey"
|
"Ice Hockey",
|
||||||
),
|
),
|
||||||
ComparisonData::new(
|
ComparisonData::new(
|
||||||
"sports_ski",
|
"sports_ski",
|
||||||
"sports_participation",
|
"sports_participation",
|
||||||
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
||||||
"sport_name".to_string(),
|
"sport_name".to_string(),
|
||||||
Box::new(TextListComparison::Contains)
|
Box::new(TextListComparison::Contains),
|
||||||
)),
|
)),
|
||||||
ValueType::String(Some("Ski".to_string())),
|
ValueType::String(Some("Ski".to_string())),
|
||||||
"Sports Participation",
|
"Sports Participation",
|
||||||
"Ski"
|
"Ski",
|
||||||
),
|
),
|
||||||
ComparisonData::new(
|
ComparisonData::new(
|
||||||
"sports_wrestling",
|
"sports_wrestling",
|
||||||
"sports_participation",
|
"sports_participation",
|
||||||
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
||||||
"sport_name".to_string(),
|
"sport_name".to_string(),
|
||||||
Box::new(TextListComparison::Contains)
|
Box::new(TextListComparison::Contains),
|
||||||
)),
|
)),
|
||||||
ValueType::String(Some("Wrestling".to_string())),
|
ValueType::String(Some("Wrestling".to_string())),
|
||||||
"Sports Participation",
|
"Sports Participation",
|
||||||
"Wrestling"
|
"Wrestling",
|
||||||
),
|
),
|
||||||
ComparisonData::new(
|
ComparisonData::new(
|
||||||
"sports_lacrosse",
|
"sports_lacrosse",
|
||||||
"sports_participation",
|
"sports_participation",
|
||||||
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
||||||
"sport_name".to_string(),
|
"sport_name".to_string(),
|
||||||
Box::new(TextListComparison::Contains)
|
Box::new(TextListComparison::Contains),
|
||||||
)),
|
)),
|
||||||
ValueType::String(Some("Lacrosse".to_string())),
|
ValueType::String(Some("Lacrosse".to_string())),
|
||||||
"Sports Participation",
|
"Sports Participation",
|
||||||
"Lacrosse"
|
"Lacrosse",
|
||||||
),
|
),
|
||||||
ComparisonData::new(
|
ComparisonData::new(
|
||||||
"sports_softball",
|
"sports_softball",
|
||||||
"sports_participation",
|
"sports_participation",
|
||||||
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
||||||
"sport_name".to_string(),
|
"sport_name".to_string(),
|
||||||
Box::new(TextListComparison::Contains)
|
Box::new(TextListComparison::Contains),
|
||||||
)),
|
)),
|
||||||
ValueType::String(Some("Softball".to_string())),
|
ValueType::String(Some("Softball".to_string())),
|
||||||
"Sports Participation",
|
"Sports Participation",
|
||||||
"Softball"
|
"Softball",
|
||||||
),
|
),
|
||||||
ComparisonData::new(
|
ComparisonData::new(
|
||||||
"sports_tennis",
|
"sports_tennis",
|
||||||
"sports_participation",
|
"sports_participation",
|
||||||
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
ComparisonType::MapList(MapListComparison::FlattenToTextList(
|
||||||
"sport_name".to_string(),
|
"sport_name".to_string(),
|
||||||
Box::new(TextListComparison::Contains)
|
Box::new(TextListComparison::Contains),
|
||||||
)),
|
)),
|
||||||
ValueType::String(Some("Tennis".to_string())),
|
ValueType::String(Some("Tennis".to_string())),
|
||||||
"Sports Participation",
|
"Sports Participation",
|
||||||
"Tennis"
|
"Tennis",
|
||||||
)
|
),
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -195,7 +196,7 @@ pub async fn create_test_comparisons() -> Result<(), ServerFnError> {
|
|||||||
ComparisonType::Number(NumberComparison::GreaterThanOrEqual),
|
ComparisonType::Number(NumberComparison::GreaterThanOrEqual),
|
||||||
ValueType::Number(Some(650.to_string())),
|
ValueType::Number(Some(650.to_string())),
|
||||||
"Academic Information",
|
"Academic Information",
|
||||||
"Math SAT Score > 650"
|
"Math SAT Score > 650",
|
||||||
);
|
);
|
||||||
|
|
||||||
let service_hours_25 = ComparisonData::new(
|
let service_hours_25 = ComparisonData::new(
|
||||||
@@ -203,13 +204,13 @@ pub async fn create_test_comparisons() -> Result<(), ServerFnError> {
|
|||||||
"community_involvement",
|
"community_involvement",
|
||||||
ComparisonType::MapList(MapListComparison::FlattenToNumberList(
|
ComparisonType::MapList(MapListComparison::FlattenToNumberList(
|
||||||
"service_hours".to_string(),
|
"service_hours".to_string(),
|
||||||
Box::new(NumberListComparison::Sum(
|
Box::new(NumberListComparison::Sum(Box::new(
|
||||||
Box::new(NumberComparison::GreaterThanOrEqual)
|
NumberComparison::GreaterThanOrEqual,
|
||||||
))
|
))),
|
||||||
)),
|
)),
|
||||||
ValueType::Number(Some(25.to_string())),
|
ValueType::Number(Some(25.to_string())),
|
||||||
"Community Involvement",
|
"Community Involvement",
|
||||||
"25 service hours"
|
"25 service hours",
|
||||||
);
|
);
|
||||||
|
|
||||||
let service_hours_20 = ComparisonData::new(
|
let service_hours_20 = ComparisonData::new(
|
||||||
@@ -217,13 +218,13 @@ pub async fn create_test_comparisons() -> Result<(), ServerFnError> {
|
|||||||
"community_involvement",
|
"community_involvement",
|
||||||
ComparisonType::MapList(MapListComparison::FlattenToNumberList(
|
ComparisonType::MapList(MapListComparison::FlattenToNumberList(
|
||||||
"service_hours".to_string(),
|
"service_hours".to_string(),
|
||||||
Box::new(NumberListComparison::Sum(
|
Box::new(NumberListComparison::Sum(Box::new(
|
||||||
Box::new(NumberComparison::GreaterThanOrEqual)
|
NumberComparison::GreaterThanOrEqual,
|
||||||
))
|
))),
|
||||||
)),
|
)),
|
||||||
ValueType::Number(Some(20.to_string())),
|
ValueType::Number(Some(20.to_string())),
|
||||||
"Community Involvement",
|
"Community Involvement",
|
||||||
"20 service hours"
|
"20 service hours",
|
||||||
);
|
);
|
||||||
|
|
||||||
let service_hours_30 = ComparisonData::new(
|
let service_hours_30 = ComparisonData::new(
|
||||||
@@ -231,13 +232,13 @@ pub async fn create_test_comparisons() -> Result<(), ServerFnError> {
|
|||||||
"community_involvement",
|
"community_involvement",
|
||||||
ComparisonType::MapList(MapListComparison::FlattenToNumberList(
|
ComparisonType::MapList(MapListComparison::FlattenToNumberList(
|
||||||
"service_hours".to_string(),
|
"service_hours".to_string(),
|
||||||
Box::new(NumberListComparison::Sum(
|
Box::new(NumberListComparison::Sum(Box::new(
|
||||||
Box::new(NumberComparison::GreaterThanOrEqual)
|
NumberComparison::GreaterThanOrEqual,
|
||||||
))
|
))),
|
||||||
)),
|
)),
|
||||||
ValueType::Number(Some(30.to_string())),
|
ValueType::Number(Some(30.to_string())),
|
||||||
"Community Involvement",
|
"Community Involvement",
|
||||||
"30 service hours"
|
"30 service hours",
|
||||||
);
|
);
|
||||||
|
|
||||||
let residency_southbury = ComparisonData::new(
|
let residency_southbury = ComparisonData::new(
|
||||||
@@ -246,7 +247,7 @@ pub async fn create_test_comparisons() -> Result<(), ServerFnError> {
|
|||||||
ComparisonType::Text(TextComparison::Matches),
|
ComparisonType::Text(TextComparison::Matches),
|
||||||
ValueType::String(Some("Southbury".to_string())),
|
ValueType::String(Some("Southbury".to_string())),
|
||||||
"Residency",
|
"Residency",
|
||||||
"Southbury"
|
"Southbury",
|
||||||
);
|
);
|
||||||
|
|
||||||
let residency_middlebury = ComparisonData::new(
|
let residency_middlebury = ComparisonData::new(
|
||||||
@@ -255,7 +256,7 @@ pub async fn create_test_comparisons() -> Result<(), ServerFnError> {
|
|||||||
ComparisonType::Text(TextComparison::Matches),
|
ComparisonType::Text(TextComparison::Matches),
|
||||||
ValueType::String(Some("Middlebury".to_string())),
|
ValueType::String(Some("Middlebury".to_string())),
|
||||||
"Residency",
|
"Residency",
|
||||||
"Middlebury"
|
"Middlebury",
|
||||||
);
|
);
|
||||||
|
|
||||||
let attended_bas = ComparisonData::new(
|
let attended_bas = ComparisonData::new(
|
||||||
@@ -264,7 +265,7 @@ pub async fn create_test_comparisons() -> Result<(), ServerFnError> {
|
|||||||
ComparisonType::Text(TextComparison::Matches),
|
ComparisonType::Text(TextComparison::Matches),
|
||||||
ValueType::String(Some("Yes".to_string())),
|
ValueType::String(Some("Yes".to_string())),
|
||||||
"Miscellaneous",
|
"Miscellaneous",
|
||||||
"Attended BAS"
|
"Attended BAS",
|
||||||
);
|
);
|
||||||
|
|
||||||
let midd_south = ComparisonData::new(
|
let midd_south = ComparisonData::new(
|
||||||
@@ -273,7 +274,7 @@ pub async fn create_test_comparisons() -> Result<(), ServerFnError> {
|
|||||||
ComparisonType::Text(TextComparison::Matches),
|
ComparisonType::Text(TextComparison::Matches),
|
||||||
ValueType::String(Some("Yes".to_string())),
|
ValueType::String(Some("Yes".to_string())),
|
||||||
"Miscellaneous",
|
"Miscellaneous",
|
||||||
"Member of Midd-South Church"
|
"Member of Midd-South Church",
|
||||||
);
|
);
|
||||||
|
|
||||||
let family_military = ComparisonData::new(
|
let family_military = ComparisonData::new(
|
||||||
@@ -282,7 +283,7 @@ pub async fn create_test_comparisons() -> Result<(), ServerFnError> {
|
|||||||
ComparisonType::Text(TextComparison::Matches),
|
ComparisonType::Text(TextComparison::Matches),
|
||||||
ValueType::String(Some("Yes".to_string())),
|
ValueType::String(Some("Yes".to_string())),
|
||||||
"Miscellaneous",
|
"Miscellaneous",
|
||||||
"Family with Military Service"
|
"Family with Military Service",
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut sports_comps = create_sports_comparisons();
|
let mut sports_comps = create_sports_comparisons();
|
||||||
@@ -312,7 +313,7 @@ pub async fn create_test_comparisons() -> Result<(), ServerFnError> {
|
|||||||
.await
|
.await
|
||||||
{
|
{
|
||||||
let msg = err.message().unwrap_or("An unknown error occurred");
|
let msg = err.message().unwrap_or("An unknown error occurred");
|
||||||
return Err(ServerFnError::new(msg))
|
return Err(ServerFnError::new(msg));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -340,7 +341,7 @@ pub async fn get_comparison_info() -> Result<Vec<ComparisonData>, ServerFnError>
|
|||||||
} else {
|
} else {
|
||||||
Ok(vec![])
|
Ok(vec![])
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
let msg = err.message().unwrap_or("An unknown error occurred");
|
let msg = err.message().unwrap_or("An unknown error occurred");
|
||||||
Err(ServerFnError::new(msg))
|
Err(ServerFnError::new(msg))
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
use leptos::either::Either;
|
use super::UnauthenticatedPage;
|
||||||
use super::home_page::get_submission;
|
use super::home_page::get_submission;
|
||||||
use super::{UnauthenticatedPage};
|
|
||||||
use crate::common::{
|
use crate::common::{
|
||||||
ComparisonData, ExpandableInfo, ValueType,
|
ComparisonData, ExpandableInfo, ValueType,
|
||||||
};
|
};
|
||||||
use crate::components::{ActionButton, Loading, Panel, Row};
|
use crate::components::{ActionButton, Loading, Panel, Row};
|
||||||
|
use leptos::either::Either;
|
||||||
use leptos::leptos_dom::logging::console_log;
|
use leptos::leptos_dom::logging::console_log;
|
||||||
use leptos::logging::log;
|
use leptos::logging::log;
|
||||||
use leptos::prelude::*;
|
use leptos::prelude::*;
|
||||||
@@ -22,15 +22,13 @@ pub fn ComparisonTestPage() -> impl IntoView {
|
|||||||
// we don't lose access to it in the future, should we need it again.
|
// we don't lose access to it in the future, should we need it again.
|
||||||
let student_resource: Resource<ExpandableInfo> = Resource::new(
|
let student_resource: Resource<ExpandableInfo> = Resource::new(
|
||||||
move || user_claims.get().map(|claim| claim.claims.subject.clone()),
|
move || user_claims.get().map(|claim| claim.claims.subject.clone()),
|
||||||
async
|
async |opt_username| match opt_username {
|
||||||
| opt_username
|
Some(subject) => get_submission(subject.clone()).await.unwrap_or_else(|e| {
|
||||||
| match opt_username {
|
console_log(e.to_string().as_str());
|
||||||
Some(subject) => get_submission(subject.clone()).await.unwrap_or_else(|e| {
|
ExpandableInfo::new(subject)
|
||||||
console_log(e.to_string().as_str());
|
}),
|
||||||
ExpandableInfo::new(subject)
|
None => ExpandableInfo::new("".to_owned()),
|
||||||
}),
|
},
|
||||||
None => ExpandableInfo::new("".to_owned()),
|
|
||||||
},
|
|
||||||
);
|
);
|
||||||
|
|
||||||
let scholarship_resource: Resource<Vec<ExpandableInfo>> = Resource::new(
|
let scholarship_resource: Resource<Vec<ExpandableInfo>> = Resource::new(
|
||||||
@@ -40,7 +38,7 @@ pub fn ComparisonTestPage() -> impl IntoView {
|
|||||||
log!("An error occurred: {:?}", e);
|
log!("An error occurred: {:?}", e);
|
||||||
Vec::new()
|
Vec::new()
|
||||||
})
|
})
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
let comparison_resource: Resource<Vec<ComparisonData>> = Resource::new(
|
let comparison_resource: Resource<Vec<ComparisonData>> = Resource::new(
|
||||||
@@ -50,7 +48,7 @@ pub fn ComparisonTestPage() -> impl IntoView {
|
|||||||
log!("An error occurred: {:?}", e);
|
log!("An error occurred: {:?}", e);
|
||||||
Vec::new()
|
Vec::new()
|
||||||
})
|
})
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
view! {
|
view! {
|
||||||
|
|||||||
@@ -9,11 +9,11 @@ use std::process::{Command, Stdio};
|
|||||||
#[cfg(feature = "ssr")]
|
#[cfg(feature = "ssr")]
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
|
|
||||||
use crate::common::ExpandableInfo;
|
use crate::common::{ExpandableInfo, UserClaims};
|
||||||
use crate::pages::UnauthenticatedPage;
|
use crate::pages::UnauthenticatedPage;
|
||||||
use crate::components::{
|
use crate::components::{
|
||||||
ActionButton, CheckboxList, Loading, MultiEntry, OutlinedTextField, Panel, RadioList, Row,
|
ActionButton, CheckboxList, Loading, MultiEntry, OutlinedTextField, Panel, RadioList, Row,
|
||||||
Select
|
Select,
|
||||||
};
|
};
|
||||||
use crate::input;
|
use crate::input;
|
||||||
use leptos::leptos_dom::logging::console_log;
|
use leptos::leptos_dom::logging::console_log;
|
||||||
@@ -126,16 +126,14 @@ pub async fn create_example_pdf() -> Result<Vec<u8>, ServerFnError> {
|
|||||||
let mut command = Command::new("typst");
|
let mut command = Command::new("typst");
|
||||||
command
|
command
|
||||||
.arg("compile")
|
.arg("compile")
|
||||||
.arg("-") // Use stdin as input
|
.arg("-") // Use stdin as input
|
||||||
.arg("-") // Write output to stdout
|
.arg("-") // Write output to stdout
|
||||||
.stdin(Stdio::piped())
|
.stdin(Stdio::piped())
|
||||||
.stdout(Stdio::piped());
|
.stdout(Stdio::piped());
|
||||||
|
|
||||||
let mut process = command.spawn()?;
|
let mut process = command.spawn()?;
|
||||||
|
|
||||||
process.stdin
|
process.stdin.take().unwrap().write(template.as_bytes())?;
|
||||||
.take().unwrap()
|
|
||||||
.write(template.as_bytes())?;
|
|
||||||
|
|
||||||
let output = process.wait_with_output()?;
|
let output = process.wait_with_output()?;
|
||||||
let pdf_bytes = output.stdout;
|
let pdf_bytes = output.stdout;
|
||||||
|
|||||||
+75
-42
@@ -4,23 +4,25 @@ use aws_sdk_dynamodb::{Client, error::ProvideErrorMetadata, types::AttributeValu
|
|||||||
#[cfg(feature = "ssr")]
|
#[cfg(feature = "ssr")]
|
||||||
use serde_dynamo::{from_item, to_item};
|
use serde_dynamo::{from_item, to_item};
|
||||||
|
|
||||||
use leptos::either::{Either, EitherOf3};
|
|
||||||
use leptos::prelude::*;
|
|
||||||
use serde::{Deserialize, Serialize};
|
|
||||||
use leptos::logging::log;
|
|
||||||
use leptos_router::params::Params;
|
|
||||||
use leptos_router::hooks::{use_navigate, use_params};
|
|
||||||
use leptos::Params;
|
|
||||||
use traits::{AsReactive, ReactiveCapture};
|
|
||||||
use crate::common::{ExpandableInfo, ValueType};
|
use crate::common::{ExpandableInfo, ValueType};
|
||||||
use crate::components::{ActionButton, Banner, DashboardButton, OutlinedTextField, Panel, Row, Select};
|
use crate::components::{
|
||||||
use std::collections::HashMap;
|
ActionButton, Banner, DashboardButton, OutlinedTextField, Panel, Row, Select,
|
||||||
|
};
|
||||||
use chrono::{FixedOffset, TimeZone};
|
use chrono::{FixedOffset, TimeZone};
|
||||||
|
use leptos::Params;
|
||||||
|
use leptos::either::{Either, EitherOf3};
|
||||||
use leptos::html::Dialog;
|
use leptos::html::Dialog;
|
||||||
|
use leptos::logging::log;
|
||||||
|
use leptos::prelude::*;
|
||||||
|
use leptos_router::hooks::{use_navigate, use_params};
|
||||||
|
use leptos_router::params::Params;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use std::collections::HashMap;
|
||||||
|
use traits::{AsReactive, ReactiveCapture};
|
||||||
|
|
||||||
#[derive(Params, PartialEq)]
|
#[derive(Params, PartialEq)]
|
||||||
struct LoanerParams {
|
struct LoanerParams {
|
||||||
form_name: Option<String>
|
form_name: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone)]
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||||
@@ -39,7 +41,8 @@ struct LoanerReturnOutput {
|
|||||||
async fn get_loaners_return_list() -> Result<Vec<LoanerReturnOutput>, ServerFnError> {
|
async fn get_loaners_return_list() -> Result<Vec<LoanerReturnOutput>, ServerFnError> {
|
||||||
// We want to query the database for all loaners, but we only want the name and
|
// We want to query the database for all loaners, but we only want the name and
|
||||||
// date of borrowing. This will be cheaper than querying the entire table.
|
// date of borrowing. This will be cheaper than querying the entire table.
|
||||||
let dbclient = Client::new(&aws_config::load_defaults(aws_config::BehaviorVersion::latest()).await);
|
let dbclient =
|
||||||
|
Client::new(&aws_config::load_defaults(aws_config::BehaviorVersion::latest()).await);
|
||||||
|
|
||||||
log!("Getting loaners from database.");
|
log!("Getting loaners from database.");
|
||||||
|
|
||||||
@@ -48,34 +51,57 @@ async fn get_loaners_return_list() -> Result<Vec<LoanerReturnOutput>, ServerFnEr
|
|||||||
.table_name("loaner-info")
|
.table_name("loaner-info")
|
||||||
.projection_expression("subject, first_name, last_name, date_taken")
|
.projection_expression("subject, first_name, last_name, date_taken")
|
||||||
.send()
|
.send()
|
||||||
.await {
|
.await
|
||||||
|
{
|
||||||
Ok(output) => {
|
Ok(output) => {
|
||||||
if let Some(items) = output.items {
|
if let Some(items) = output.items {
|
||||||
Ok(items.into_iter().map(|item| {
|
Ok(items
|
||||||
let expandable: ExpandableInfo = from_item(item).unwrap();
|
.into_iter()
|
||||||
// This set of function calls is ridiculous, we need to make a better way to do this.
|
.map(|item| {
|
||||||
LoanerReturnOutput {
|
let expandable: ExpandableInfo = from_item(item).unwrap();
|
||||||
first_name: expandable.data.get("first_name").unwrap().as_string().unwrap_or_default().unwrap_or_default(),
|
// This set of function calls is ridiculous, we need to make a better way to do this.
|
||||||
last_name: expandable.data.get("last_name").unwrap().as_string().unwrap_or_default().unwrap_or_default(),
|
LoanerReturnOutput {
|
||||||
date: expandable.data.get("date_taken").unwrap().as_string().unwrap_or_default().unwrap_or_default(),
|
first_name: expandable
|
||||||
subject: expandable.subject
|
.data
|
||||||
}
|
.get("first_name")
|
||||||
}).collect())
|
.unwrap()
|
||||||
|
.as_string()
|
||||||
|
.unwrap_or_default()
|
||||||
|
.unwrap_or_default(),
|
||||||
|
last_name: expandable
|
||||||
|
.data
|
||||||
|
.get("last_name")
|
||||||
|
.unwrap()
|
||||||
|
.as_string()
|
||||||
|
.unwrap_or_default()
|
||||||
|
.unwrap_or_default(),
|
||||||
|
date: expandable
|
||||||
|
.data
|
||||||
|
.get("date_taken")
|
||||||
|
.unwrap()
|
||||||
|
.as_string()
|
||||||
|
.unwrap_or_default()
|
||||||
|
.unwrap_or_default(),
|
||||||
|
subject: expandable.subject,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect())
|
||||||
} else {
|
} else {
|
||||||
Ok(vec![])
|
Ok(vec![])
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
log!("{:?}", err);
|
log!("{:?}", err);
|
||||||
let msg = err.message().unwrap_or("Unknown error");
|
let msg = err.message().unwrap_or("Unknown error");
|
||||||
Err(ServerFnError::new(msg))
|
Err(ServerFnError::new(msg))
|
||||||
},
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[server]
|
#[server]
|
||||||
async fn check_in_loaner(student: LoanerReturnOutput) -> Result<(), ServerFnError> {
|
async fn check_in_loaner(student: LoanerReturnOutput) -> Result<(), ServerFnError> {
|
||||||
let dbclient = Client::new(&aws_config::load_defaults(aws_config::BehaviorVersion::latest()).await);
|
let dbclient =
|
||||||
|
Client::new(&aws_config::load_defaults(aws_config::BehaviorVersion::latest()).await);
|
||||||
|
|
||||||
match dbclient
|
match dbclient
|
||||||
.delete_item()
|
.delete_item()
|
||||||
@@ -96,13 +122,17 @@ async fn check_in_loaner(student: LoanerReturnOutput) -> Result<(), ServerFnErro
|
|||||||
#[server]
|
#[server]
|
||||||
async fn create_borrow_entry(input: ExpandableInfo) -> Result<(), ServerFnError> {
|
async fn create_borrow_entry(input: ExpandableInfo) -> Result<(), ServerFnError> {
|
||||||
let mut input = input;
|
let mut input = input;
|
||||||
let dbclient = Client::new(&aws_config::load_defaults(aws_config::BehaviorVersion::latest()).await);
|
let dbclient =
|
||||||
|
Client::new(&aws_config::load_defaults(aws_config::BehaviorVersion::latest()).await);
|
||||||
|
|
||||||
let current_time = chrono::Utc::now().format("%H:%M, %m/%d/%Y").to_string();
|
let current_time = chrono::Utc::now().format("%H:%M, %m/%d/%Y").to_string();
|
||||||
log!("Creating entry with timestamp {}", current_time);
|
log!("Creating entry with timestamp {}", current_time);
|
||||||
|
|
||||||
// Add the timestamp to the data map as a string and then push it to the database.
|
// Add the timestamp to the data map as a string and then push it to the database.
|
||||||
input.data.insert("date_taken".to_string(), ValueType::String(Some(current_time.clone())));
|
input.data.insert(
|
||||||
|
"date_taken".to_string(),
|
||||||
|
ValueType::String(Some(current_time.clone())),
|
||||||
|
);
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let item: serde_dynamo::Item = to_item(&input)?;
|
let item: serde_dynamo::Item = to_item(&input)?;
|
||||||
@@ -122,8 +152,8 @@ async fn create_borrow_entry(input: ExpandableInfo) -> Result<(), ServerFnError>
|
|||||||
// Retry database writes until we have a good subject ID.
|
// Retry database writes until we have a good subject ID.
|
||||||
log!("Failed conditional check, forcing new subject ID.");
|
log!("Failed conditional check, forcing new subject ID.");
|
||||||
input.subject = uuid::Uuid::new_v4().to_string();
|
input.subject = uuid::Uuid::new_v4().to_string();
|
||||||
continue
|
continue;
|
||||||
},
|
}
|
||||||
_ => {
|
_ => {
|
||||||
let msg = err.message().unwrap_or("An unknown error occurred.");
|
let msg = err.message().unwrap_or("An unknown error occurred.");
|
||||||
return Err(ServerFnError::new(msg));
|
return Err(ServerFnError::new(msg));
|
||||||
@@ -165,19 +195,18 @@ pub fn LoanerPage() -> impl IntoView {
|
|||||||
// Check URL params. Depending on what string is visible here, we'll display a different form.
|
// Check URL params. Depending on what string is visible here, we'll display a different form.
|
||||||
let params = use_params::<LoanerParams>();
|
let params = use_params::<LoanerParams>();
|
||||||
let form_passed = move || {
|
let form_passed = move || {
|
||||||
params.read()
|
params
|
||||||
|
.read()
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.ok()
|
.ok()
|
||||||
.and_then(|params| params.form_name.clone())
|
.and_then(|params| params.form_name.clone())
|
||||||
.unwrap_or_default()
|
.unwrap_or_default()
|
||||||
};
|
};
|
||||||
|
|
||||||
let form_view = move || {
|
let form_view = move || match form_passed().as_str() {
|
||||||
match form_passed().as_str() {
|
"borrowing" => EitherOf3::A(LoanerBorrowForm),
|
||||||
"borrowing" => EitherOf3::A(LoanerBorrowForm),
|
"returning" => EitherOf3::B(LoanerReturnForm),
|
||||||
"returning" => EitherOf3::B(LoanerReturnForm),
|
_ => EitherOf3::C("Choose something from the left.".into_view()),
|
||||||
_ => EitherOf3::C("Choose something from the left.".into_view())
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// We'll create the page here - the sidebar contains all the buttons, while the form
|
// We'll create the page here - the sidebar contains all the buttons, while the form
|
||||||
@@ -307,10 +336,12 @@ pub fn LoanerReturnForm() -> impl IntoView {
|
|||||||
let return_list_refresh = RwSignal::new(0);
|
let return_list_refresh = RwSignal::new(0);
|
||||||
let return_list_resource: Resource<Vec<LoanerReturnOutput>> = Resource::new(
|
let return_list_resource: Resource<Vec<LoanerReturnOutput>> = Resource::new(
|
||||||
move || return_list_refresh.get(),
|
move || return_list_refresh.get(),
|
||||||
async |_| get_loaners_return_list().await.unwrap_or_else(|e| {
|
async |_| {
|
||||||
log!("There was an error getting the loaner list: {}", e);
|
get_loaners_return_list().await.unwrap_or_else(|e| {
|
||||||
vec![]
|
log!("There was an error getting the loaner list: {}", e);
|
||||||
})
|
vec![]
|
||||||
|
})
|
||||||
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
let dialog_ref = NodeRef::<Dialog>::new();
|
let dialog_ref = NodeRef::<Dialog>::new();
|
||||||
@@ -334,7 +365,9 @@ pub fn LoanerReturnForm() -> impl IntoView {
|
|||||||
let dialog_check_in = move |_| {
|
let dialog_check_in = move |_| {
|
||||||
chosen_student.with(|opt_student| {
|
chosen_student.with(|opt_student| {
|
||||||
if let Some(student) = opt_student.as_ref() {
|
if let Some(student) = opt_student.as_ref() {
|
||||||
check_in_action.dispatch(CheckInLoaner { student: student.clone() });
|
check_in_action.dispatch(CheckInLoaner {
|
||||||
|
student: student.clone(),
|
||||||
|
});
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|||||||
+5
-5
@@ -1,15 +1,15 @@
|
|||||||
mod about_page;
|
mod about_page;
|
||||||
|
mod api;
|
||||||
mod comparison_test;
|
mod comparison_test;
|
||||||
mod home_page;
|
mod home_page;
|
||||||
|
mod loaner_page;
|
||||||
mod provider_portal;
|
mod provider_portal;
|
||||||
|
mod scholarship_info;
|
||||||
mod test_page;
|
mod test_page;
|
||||||
mod unauthenticated_page;
|
mod unauthenticated_page;
|
||||||
mod scholarship_info;
|
|
||||||
mod utils;
|
mod utils;
|
||||||
mod api;
|
|
||||||
mod loaner_page;
|
|
||||||
|
|
||||||
pub use self::{
|
pub use self::{
|
||||||
about_page::*, home_page::*, provider_portal::*, test_page::*, unauthenticated_page::*,
|
about_page::*, comparison_test::*, home_page::*, loaner_page::*, provider_portal::*,
|
||||||
loaner_page::*, comparison_test::*, scholarship_info::*,
|
test_page::*, unauthenticated_page::*, scholarship_info::*
|
||||||
};
|
};
|
||||||
@@ -1 +1,42 @@
|
|||||||
|
use crate::components::{Banner, DashboardButton};
|
||||||
|
use leptos::prelude::*;
|
||||||
|
|
||||||
|
#[component]
|
||||||
|
pub fn ProviderPortal() -> impl IntoView {
|
||||||
|
view! {
|
||||||
|
<Banner
|
||||||
|
title="Provider Dashboard"
|
||||||
|
logo="PHS_Stacked_Acronym.png"
|
||||||
|
path="/"
|
||||||
|
/>
|
||||||
|
<div class="mx-auto px-6">
|
||||||
|
<div class="container mx-auto px-6 py-8 space-y-8">
|
||||||
|
<div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
|
||||||
|
<section class="space-y-4">
|
||||||
|
<DashboardButton
|
||||||
|
title="Profile"
|
||||||
|
description="Edit user profile"
|
||||||
|
icon="/Person_Black.png"
|
||||||
|
path="/"
|
||||||
|
/>
|
||||||
|
<DashboardButton
|
||||||
|
title="Create Scholarship"
|
||||||
|
description="Navigate to Scholarship Creation Page"
|
||||||
|
icon="/Create_Black.png"
|
||||||
|
path="/"
|
||||||
|
/>
|
||||||
|
<DashboardButton
|
||||||
|
title="Applicants"
|
||||||
|
description="View Scholarship Applicants"
|
||||||
|
icon="/Form_Black.png"
|
||||||
|
path="/"
|
||||||
|
/>
|
||||||
|
</section>
|
||||||
|
<section class="space-y-4">
|
||||||
|
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
use leptos::logging::log;
|
|
||||||
use crate::components::ActionButton;
|
use crate::components::ActionButton;
|
||||||
|
use leptos::logging::log;
|
||||||
use leptos::prelude::*;
|
use leptos::prelude::*;
|
||||||
use leptos_oidc::AuthSignal;
|
use leptos_oidc::AuthSignal;
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user