feat: create full provider list setup
This commit is contained in:
1 parent
12a980f327
commit
a95e9a1034
8 files changed
+198
-90
No files matched your search
@@ -1,26 +1,69 @@
|
|||||||
|
use leptos::logging::log;
|
||||||
use leptos::prelude::*;
|
use leptos::prelude::*;
|
||||||
|
use crate::common::ValueType;
|
||||||
use crate::components::{NavListInfo, SelectableNavList};
|
use crate::components::{NavListInfo, SelectableNavList};
|
||||||
|
use crate::pages::api::get_all_providers;
|
||||||
|
|
||||||
#[component]
|
#[component]
|
||||||
pub fn AdminProviderPage() -> impl IntoView {
|
pub fn AdminProviderPage() -> impl IntoView {
|
||||||
let selected_items = RwSignal::new(Vec::new());
|
let selected_items = RwSignal::new(Vec::new());
|
||||||
let provider_list = RwSignal::new(vec![
|
let provider_list = RwSignal::new(Vec::new());
|
||||||
NavListInfo {
|
|
||||||
text: vec!["Testing 1".to_string(), 3.to_string(), 500.to_string()],
|
let provider_trigger = Trigger::new();
|
||||||
id: "1".to_string(),
|
let provider_resource = Resource::new(
|
||||||
slug: "1".to_string(),
|
move || provider_trigger.track(),
|
||||||
},
|
async move |_| {
|
||||||
NavListInfo {
|
get_all_providers().await
|
||||||
text: vec!["Testing 2".to_string(), 2.to_string(), 1000.to_string()],
|
|
||||||
id: "2".to_string(),
|
|
||||||
slug: "2".to_string(),
|
|
||||||
}
|
}
|
||||||
]);
|
);
|
||||||
|
|
||||||
|
Effect::new(move || {
|
||||||
|
if let Some(Err(err)) = provider_resource.get() {
|
||||||
|
log!("Found error: {}", err.to_string());
|
||||||
|
}
|
||||||
|
let Some(Ok(list)) = provider_resource.get() else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
|
let members_list = vec![
|
||||||
|
"contact_email".to_string(),
|
||||||
|
"first_name".to_string(),
|
||||||
|
"last_name".to_string(),
|
||||||
|
];
|
||||||
|
|
||||||
|
// Convert the list into a series of NavListInfo
|
||||||
|
let converted = list
|
||||||
|
.into_iter()
|
||||||
|
.map(|info| {
|
||||||
|
let mut text_list = vec![];
|
||||||
|
members_list.iter().for_each(|member| {
|
||||||
|
let val = info.get(member)
|
||||||
|
.unwrap_or(&ValueType::String(None))
|
||||||
|
.as_string()
|
||||||
|
.ok().flatten()
|
||||||
|
.unwrap_or_default();
|
||||||
|
text_list.push(val);
|
||||||
|
});
|
||||||
|
|
||||||
|
let subject = info.get("subject")
|
||||||
|
.unwrap_or(&ValueType::String(None))
|
||||||
|
.to_string();
|
||||||
|
|
||||||
|
NavListInfo {
|
||||||
|
text: text_list,
|
||||||
|
id: subject.clone(),
|
||||||
|
slug: subject,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
provider_list.set(converted);
|
||||||
|
});
|
||||||
|
|
||||||
let headers = vec![
|
let headers = vec![
|
||||||
"Scholarship Name",
|
"Email",
|
||||||
"Number of Awards",
|
"First Name",
|
||||||
"Amount of Awards"
|
"Last Name"
|
||||||
]
|
]
|
||||||
.iter()
|
.iter()
|
||||||
.map(|s| s.to_string())
|
.map(|s| s.to_string())
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
use leptos::prelude::*;
|
||||||
|
use std::collections::HashMap;
|
||||||
|
use crate::common::ValueType;
|
||||||
|
use leptos::logging::log;
|
||||||
|
|
||||||
|
#[cfg(feature = "ssr")]
|
||||||
|
mod server_logic {
|
||||||
|
pub use crate::utils::server::create_dynamo_client;
|
||||||
|
pub use super::super::PROVIDER_CONTACT_TABLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[server]
|
||||||
|
pub async fn get_all_providers() -> Result<Vec<HashMap<String, ValueType>>, ServerFnError> {
|
||||||
|
use server_logic::*;
|
||||||
|
|
||||||
|
// We want to get all provider information from the contacts table.
|
||||||
|
// This will be migrated to the new table structure when it happens.
|
||||||
|
|
||||||
|
let client = create_dynamo_client().await;
|
||||||
|
|
||||||
|
log!("Scanning all provider information from {}", PROVIDER_CONTACT_TABLE);
|
||||||
|
|
||||||
|
client
|
||||||
|
.scan()
|
||||||
|
.table_name(PROVIDER_CONTACT_TABLE)
|
||||||
|
.send()
|
||||||
|
.await
|
||||||
|
.map(|output| {
|
||||||
|
if let Some(items) = output.items {
|
||||||
|
items
|
||||||
|
.into_iter()
|
||||||
|
.map(|item| {
|
||||||
|
item.into_iter().map(|(key, attr)| {
|
||||||
|
let val = ValueType::from(&attr);
|
||||||
|
(key, val)
|
||||||
|
}).collect()
|
||||||
|
})
|
||||||
|
.collect::<Vec<HashMap<String, ValueType>>>()
|
||||||
|
} else {
|
||||||
|
Vec::new()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.map_err(ServerFnError::from)
|
||||||
|
}
|
||||||
@@ -7,6 +7,9 @@ use aws_sdk_dynamodb::error::ProvideErrorMetadata;
|
|||||||
#[cfg(feature = "ssr")]
|
#[cfg(feature = "ssr")]
|
||||||
use leptos::logging::log;
|
use leptos::logging::log;
|
||||||
|
|
||||||
|
#[cfg(feature = "ssr")]
|
||||||
|
use super::COMPARISONS_TABLE;
|
||||||
|
|
||||||
use crate::common::{
|
use crate::common::{
|
||||||
ComparisonData, ComparisonType, MapListComparison, NumberComparison, NumberListComparison,
|
ComparisonData, ComparisonType, MapListComparison, NumberComparison, NumberListComparison,
|
||||||
TextComparison, TextListComparison, ValueType,
|
TextComparison, TextListComparison, ValueType,
|
||||||
@@ -15,8 +18,6 @@ use std::collections::HashMap;
|
|||||||
use leptos::prelude::ServerFnError;
|
use leptos::prelude::ServerFnError;
|
||||||
use leptos::server;
|
use leptos::server;
|
||||||
|
|
||||||
#[cfg(feature = "ssr")]
|
|
||||||
static COMPARISONS_TABLE: &str = "leptos-comparisons";
|
|
||||||
|
|
||||||
/// 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.
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ use leptos::prelude::*;
|
|||||||
use crate::common::DateInfo;
|
use crate::common::DateInfo;
|
||||||
|
|
||||||
#[cfg(feature = "ssr")]
|
#[cfg(feature = "ssr")]
|
||||||
static DATES_TABLE: &str = "leptos-dates";
|
use super::DATES_TABLE;
|
||||||
|
|
||||||
#[cfg(feature = "ssr")]
|
#[cfg(feature = "ssr")]
|
||||||
use aws_sdk_dynamodb::{
|
use aws_sdk_dynamodb::{
|
||||||
|
|||||||
+19
-3
@@ -1,7 +1,23 @@
|
|||||||
mod comparisons;
|
mod comparisons;
|
||||||
pub use comparisons::*;
|
|
||||||
mod scholarships;
|
mod scholarships;
|
||||||
pub use scholarships::*;
|
|
||||||
mod dates;
|
mod dates;
|
||||||
pub use dates::*;
|
mod admin;
|
||||||
|
mod providers;
|
||||||
|
|
||||||
|
pub use comparisons::*;
|
||||||
|
pub use scholarships::*;
|
||||||
|
pub use dates::*;
|
||||||
|
pub use admin::*;
|
||||||
|
pub use providers::*;
|
||||||
|
|
||||||
|
#[cfg(feature = "ssr")]
|
||||||
|
pub static COMPARISONS_TABLE: &str = "leptos-comparisons";
|
||||||
|
|
||||||
|
#[cfg(feature = "ssr")]
|
||||||
|
pub static DATES_TABLE: &str = "leptos-dates";
|
||||||
|
|
||||||
|
#[cfg(feature = "ssr")]
|
||||||
|
pub static SCHOLARSHIPS_TABLE: &str = "leptos-scholarships";
|
||||||
|
|
||||||
|
#[cfg(feature = "ssr")]
|
||||||
|
pub static PROVIDER_CONTACT_TABLE: &str = "leptos-provider-contacts";
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
use leptos::prelude::*;
|
||||||
|
use leptos::logging::log;
|
||||||
|
use std::collections::HashMap;
|
||||||
|
use crate::common::ValueType;
|
||||||
|
|
||||||
|
#[cfg(feature = "ssr")]
|
||||||
|
use crate::utils::server::{create_dynamo_client, into_attr_map};
|
||||||
|
|
||||||
|
#[cfg(feature = "ssr")]
|
||||||
|
static PROVIDER_CONTACT_TABLE: &str = "leptos-provider-contacts";
|
||||||
|
|
||||||
|
#[server]
|
||||||
|
pub async fn get_provider_contact(id: String) -> Result<HashMap<String, ValueType>, ServerFnError> {
|
||||||
|
use aws_sdk_dynamodb::types::AttributeValue;
|
||||||
|
use aws_sdk_dynamodb::error::ProvideErrorMetadata;
|
||||||
|
|
||||||
|
let client = create_dynamo_client().await;
|
||||||
|
|
||||||
|
log!("Getting contact info for provider {}", id);
|
||||||
|
|
||||||
|
match client
|
||||||
|
.get_item()
|
||||||
|
.table_name(PROVIDER_CONTACT_TABLE)
|
||||||
|
.key("subject", AttributeValue::S(id))
|
||||||
|
.send()
|
||||||
|
.await
|
||||||
|
{
|
||||||
|
Ok(output) => {
|
||||||
|
let Some(item) = output.item else {
|
||||||
|
return Ok(HashMap::new());
|
||||||
|
};
|
||||||
|
|
||||||
|
let map = item.iter().map(|(key, val)| {
|
||||||
|
let val_type = ValueType::from(val);
|
||||||
|
|
||||||
|
(key.clone(), val_type)
|
||||||
|
}).collect::<HashMap<String, ValueType>>();
|
||||||
|
|
||||||
|
Ok(map)
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
let msg = err.message().unwrap_or("An unknown error occurred.");
|
||||||
|
Err(ServerFnError::new(msg))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[server]
|
||||||
|
pub async fn put_provider_contact(id: String, contact_info: HashMap<String, ValueType>) -> Result<(), ServerFnError> {
|
||||||
|
use aws_sdk_dynamodb::error::ProvideErrorMetadata;
|
||||||
|
|
||||||
|
let client = create_dynamo_client().await;
|
||||||
|
|
||||||
|
let mut item = into_attr_map(contact_info);
|
||||||
|
item.insert("subject".to_owned(), aws_sdk_dynamodb::types::AttributeValue::S(id));
|
||||||
|
|
||||||
|
match client
|
||||||
|
.put_item()
|
||||||
|
.table_name(PROVIDER_CONTACT_TABLE)
|
||||||
|
.set_item(Some(item))
|
||||||
|
.send()
|
||||||
|
.await
|
||||||
|
{
|
||||||
|
Ok(_) => Ok(()),
|
||||||
|
Err(err) => {
|
||||||
|
let msg = err.message().unwrap_or("An unknown error occurred.");
|
||||||
|
Err(ServerFnError::new(msg))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -18,7 +18,7 @@ use leptos::prelude::ServerFnError;
|
|||||||
use leptos::server;
|
use leptos::server;
|
||||||
|
|
||||||
#[cfg(feature = "ssr")]
|
#[cfg(feature = "ssr")]
|
||||||
static SCHOLARSHIPS_TABLE: &str = "leptos-scholarships";
|
use super::SCHOLARSHIPS_TABLE;
|
||||||
|
|
||||||
#[server(GetScholarshipInfo)]
|
#[server(GetScholarshipInfo)]
|
||||||
pub async fn get_scholarship_info(id: String) -> Result<ExpandableInfo, ServerFnError> {
|
pub async fn get_scholarship_info(id: String) -> Result<ExpandableInfo, ServerFnError> {
|
||||||
|
|||||||
@@ -1,77 +1,11 @@
|
|||||||
#[cfg(feature = "ssr")]
|
use std::collections::HashMap;
|
||||||
use crate::utils::server::{create_dynamo_client, into_attr_map};
|
|
||||||
|
|
||||||
use std::collections::HashMap;
|
|
||||||
use leptos::logging::log;
|
use leptos::logging::log;
|
||||||
use leptos::prelude::*;
|
use leptos::prelude::*;
|
||||||
use leptos_oidc::{AuthLoaded, Authenticated};
|
use leptos_oidc::{AuthLoaded, Authenticated};
|
||||||
use crate::common::ValueType;
|
use crate::components::{Banner, Loading, OutlinedTextField, Panel, Row, TextFieldType, Toast, ToastContext, ValidatedForm};
|
||||||
use crate::components::{Banner, Loading, OutlinedTextField, Panel, Row, TextFieldType, Toast, ToastContext, ToastList, ValidatedForm};
|
|
||||||
use crate::pages::UnauthenticatedPage;
|
use crate::pages::UnauthenticatedPage;
|
||||||
use crate::utils::get_user_claims;
|
use crate::utils::get_user_claims;
|
||||||
|
use super::api::{get_provider_contact, PutProviderContact};
|
||||||
#[cfg(feature = "ssr")]
|
|
||||||
static PROVIDER_CONTACT_TABLE: &str = "leptos-provider-contacts";
|
|
||||||
|
|
||||||
#[server]
|
|
||||||
async fn get_provider_contact(id: String) -> Result<HashMap<String, ValueType>, ServerFnError> {
|
|
||||||
use aws_sdk_dynamodb::types::AttributeValue;
|
|
||||||
use aws_sdk_dynamodb::error::ProvideErrorMetadata;
|
|
||||||
|
|
||||||
let client = create_dynamo_client().await;
|
|
||||||
|
|
||||||
log!("Getting contact info for provider {}", id);
|
|
||||||
|
|
||||||
match client
|
|
||||||
.get_item()
|
|
||||||
.table_name(PROVIDER_CONTACT_TABLE)
|
|
||||||
.key("subject", AttributeValue::S(id))
|
|
||||||
.send()
|
|
||||||
.await
|
|
||||||
{
|
|
||||||
Ok(output) => {
|
|
||||||
let Some(item) = output.item else {
|
|
||||||
return Ok(HashMap::new());
|
|
||||||
};
|
|
||||||
|
|
||||||
let map = item.iter().map(|(key, val)| {
|
|
||||||
let val_type = ValueType::from(val);
|
|
||||||
|
|
||||||
(key.clone(), val_type)
|
|
||||||
}).collect::<HashMap<String, ValueType>>();
|
|
||||||
|
|
||||||
Ok(map)
|
|
||||||
}
|
|
||||||
Err(err) => {
|
|
||||||
let msg = err.message().unwrap_or("An unknown error occurred.");
|
|
||||||
Err(ServerFnError::new(msg))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[server]
|
|
||||||
async fn put_provider_contact(id: String, contact_info: HashMap<String, ValueType>) -> Result<(), ServerFnError> {
|
|
||||||
use aws_sdk_dynamodb::error::ProvideErrorMetadata;
|
|
||||||
|
|
||||||
let client = create_dynamo_client().await;
|
|
||||||
|
|
||||||
let mut item = into_attr_map(contact_info);
|
|
||||||
item.insert("subject".to_owned(), aws_sdk_dynamodb::types::AttributeValue::S(id));
|
|
||||||
|
|
||||||
match client
|
|
||||||
.put_item()
|
|
||||||
.table_name(PROVIDER_CONTACT_TABLE)
|
|
||||||
.set_item(Some(item))
|
|
||||||
.send()
|
|
||||||
.await
|
|
||||||
{
|
|
||||||
Ok(_) => Ok(()),
|
|
||||||
Err(err) => {
|
|
||||||
let msg = err.message().unwrap_or("An unknown error occurred.");
|
|
||||||
Err(ServerFnError::new(msg))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[component]
|
#[component]
|
||||||
pub fn ProviderContactPage() -> impl IntoView {
|
pub fn ProviderContactPage() -> impl IntoView {
|
||||||
|
|||||||
Reference in new issue
Block a user