diff --git a/css/admin-start.css b/css/admin-start.css index 8a2d905..fa9d9d3 100644 --- a/css/admin-start.css +++ b/css/admin-start.css @@ -6,7 +6,7 @@ gap: 50px; width: 100%; - height: 50vh; + min-height: 50vh; } .admin-start-welcome-message { font-size: 18px; diff --git a/css/body.css b/css/body.css index c600ae2..b7b4fb7 100644 --- a/css/body.css +++ b/css/body.css @@ -14,6 +14,7 @@ body { .admin-page-container { padding-top: 40px; padding-left: 200px; + padding-bottom: 20vh; display: flex; flex-direction: column; justify-content: center; diff --git a/css/components/datepicker.css b/css/components/datepicker.css new file mode 100644 index 0000000..2c637cd --- /dev/null +++ b/css/components/datepicker.css @@ -0,0 +1,8 @@ +.datepicker { + height: 50px; + background-color: white; + border: solid 0.5px #d8d8d8; + + width: 100%; + text-indent: 10px; +} \ No newline at end of file diff --git a/css/components/textfield.css b/css/components/textfield.css index 60ce415..3218f18 100644 --- a/css/components/textfield.css +++ b/css/components/textfield.css @@ -41,4 +41,4 @@ width: 100%; padding: 10px; -} \ No newline at end of file +} diff --git a/css/edit.css b/css/edit.css index 5cb5526..20f46d1 100644 --- a/css/edit.css +++ b/css/edit.css @@ -30,4 +30,24 @@ width: 100%; text-indent: 10px; +} +.admin-edit-submit-button { + width: 100%; + height: 60px; + margin-top: 20px; + border-radius: 5px; + + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + + background-color: #02114A; + color: white; + + font-family: Source Sans Pro; + font-size: 17px; +} +.admin-edit-submit-button:hover { + cursor: pointer; } \ No newline at end of file diff --git a/index.html b/index.html index 938bf21..4e0dea7 100644 --- a/index.html +++ b/index.html @@ -29,6 +29,7 @@ + diff --git a/src/components/datepicker.rs b/src/components/datepicker.rs new file mode 100644 index 0000000..d86f341 --- /dev/null +++ b/src/components/datepicker.rs @@ -0,0 +1,54 @@ +use std::str::FromStr; + +use chrono::{NaiveDate}; +use yew::prelude::*; + +use crate::components::textfield::get_value_from_input_event; + +/// The input type date field in html will always guarantee a valid date string. +#[function_component(DatePicker)] +pub fn datepicker(props: &DatePickerProps) -> Html { + let date_handle = props.value.clone(); + let optional_cb = props.onchange.clone(); + let cb = Callback::from(move |e: InputEvent| { + match parse_date(get_value_from_input_event(e)) { + Ok(date) => { + match optional_cb.clone() { + Some(callback) => callback.emit(Some(date.clone())), + None => {}, + }; + date_handle.set(Some(date)); + }, + Err(_) => {}, + }; + }); + let date_handle = props.value.clone(); + html! { +
+
{props.label.clone()}
+ date.to_string(), + None => NaiveDate::default().to_string() + }}/> +
+ } +} + +#[derive(PartialEq, Clone, Properties)] +pub struct DatePickerProps { + pub label: String, + pub value: UseStateHandle>, + #[prop_or_default] + pub required: bool, + pub onchange: Option>> +} + +pub fn parse_date(date_str: String) -> Result { + match NaiveDate::from_str(&date_str) { + Ok(date) => Ok(date), + Err(error) => { + log::error!("Falied to parse Date in DatePicker: {error}"); + Err(()) + }, + } +} \ No newline at end of file diff --git a/src/components/mod.rs b/src/components/mod.rs index aef93dc..d9182ee 100644 --- a/src/components/mod.rs +++ b/src/components/mod.rs @@ -8,4 +8,5 @@ pub mod agent_card; pub mod admin_nav_bar; pub mod admin_project; pub mod textfield; -pub mod dropdown; \ No newline at end of file +pub mod dropdown; +pub mod datepicker; \ No newline at end of file diff --git a/src/pages/admin/edit.rs b/src/pages/admin/edit.rs index 848a4b0..150c25b 100644 --- a/src/pages/admin/edit.rs +++ b/src/pages/admin/edit.rs @@ -5,7 +5,7 @@ use uuid::Uuid; use yew::prelude::*; use yew_router::prelude::use_navigator; -use crate::{components::{admin_nav_bar::AdminNavigationBar, textfield::{TextField, TextFieldType}, dropdown::DropDown}, api::backend::{get_project_listing, get_all_agents}}; +use crate::{components::{admin_nav_bar::AdminNavigationBar, textfield::{TextField, TextFieldType}, dropdown::DropDown, datepicker::DatePicker}, api::backend::{get_project_listing, get_all_agents}}; /// All of the editing actions of the admin panel will lead to here. This should take an id of anything. A unit, a project, an agent. And its corresponding ID. #[function_component(AdminEditPage)] @@ -99,12 +99,12 @@ pub fn generate_fields_for_project(props: &ProjectFieldsProps) -> Html { let project_state = use_state_eq(|| None); let project_condition = use_state_eq(|| None); let project_type = use_state_eq(|| None); - let project_description = use_state_eq(|| "".to_string()); - let project_admin_tag: UseStateHandle = use_state_eq(|| listing_opt.clone().unwrap_or_default().project.admin_tag.unwrap_or(String::new())); - let project_finish_date = use_state_eq(|| listing_opt.clone().unwrap_or_default().project.finish_date); - let project_floors = use_state_eq(|| listing_opt.clone().unwrap_or_default().project.floors.to_string()); - let media: UseStateHandle = use_state_eq(|| listing_opt.clone().unwrap_or_default().project.media); - let units: UseStateHandle> = use_state_eq(|| listing_opt.clone().unwrap_or_default().units); + let project_description = use_state_eq(|| String::new()); + let project_admin_tag: UseStateHandle = use_state_eq(|| String::new()); + let project_finish_date = use_state_eq(|| None); + let project_floors = use_state_eq(|| String::new()); + let media: UseStateHandle = use_state_eq(|| MediaList { media_list: Vec::new() }); + let units: UseStateHandle> = use_state_eq(|| Vec::new()); let ontype_cb = { let user_typed = user_typed.clone(); @@ -136,7 +136,6 @@ pub fn generate_fields_for_project(props: &ProjectFieldsProps) -> Html { user_typed.set(true); }) }; - let all_agents = use_state(|| Vec::new()); @@ -184,6 +183,10 @@ pub fn generate_fields_for_project(props: &ProjectFieldsProps) -> Html { }, None => String::new(), }); + project_finish_date.set(match listing_opt.clone() { + Some(listing) => Some(listing.project.finish_date.date()), + None => None, + }); } html! { @@ -228,9 +231,13 @@ pub fn generate_fields_for_project(props: &ProjectFieldsProps) -> Html { } } - + + - + +
+ {"Actualizar"} +
} } diff --git a/src/pages/search.rs b/src/pages/search.rs index 6186959..aea608e 100644 --- a/src/pages/search.rs +++ b/src/pages/search.rs @@ -16,8 +16,6 @@ pub fn search_page() -> Html { let page_counter: UseStateHandle = use_state(|| 1); let finished_loading = use_state(|| false); let project_state_filter_handle = use_state_eq(|| ProjectState::InConstruction); - - let filters: Vec = Vec::new(); // All code to execute on first render and never again use_state(|| {