-
-
+
+
Html {
}
}
}
-
+
}
}
@@ -117,5 +121,5 @@ pub fn navigation_bar() -> Html {
#[derive(PartialEq, Eq, PartialOrd, Ord)]
enum WindowDevice {
Desktop,
- Mobile
-}
\ No newline at end of file
+ Mobile,
+}
diff --git a/src/components/new_widget.rs b/src/components/new_widget.rs
new file mode 100644
index 0000000..d7e4339
--- /dev/null
+++ b/src/components/new_widget.rs
@@ -0,0 +1,34 @@
+use yew::prelude::*;
+use yew_router::prelude::use_navigator;
+
+use crate::{
+ pages::admin::edit::{EditItem, EditType},
+ routes::main_router::Route,
+};
+
+#[function_component(NewThingWidget)]
+pub fn new_thing_widget(props: &NewThingWidgetProps) -> Html {
+ let navigator = use_navigator().unwrap();
+ let onclick = {
+ let edit_item = props.item.clone();
+ let navigator = navigator.clone();
+ Callback::from(move |_| {
+ navigator.push(&Route::AdminEdit {
+ edit_type: EditType::New,
+ edit_item: edit_item.clone(),
+ });
+ })
+ };
+ html! {
+
+
+
+
+
+ }
+}
+
+#[derive(Properties, PartialEq)]
+pub struct NewThingWidgetProps {
+ pub item: EditItem,
+}
diff --git a/src/components/project_card.rs b/src/components/project_card.rs
index 64fc414..85b6a5a 100644
--- a/src/components/project_card.rs
+++ b/src/components/project_card.rs
@@ -1,16 +1,15 @@
-use jl_types::{domain::{media::Media}, dto::project_card::ProjectCardDto};
+use jl_types::{domain::media::Media, dto::project_card::ProjectCardDto};
use thousands::Separable;
use yew::prelude::*;
use yew_router::prelude::use_navigator;
use crate::routes::main_router::Route;
-
#[function_component(ProjectCard)]
pub fn project_card(props: &ProjectCardProps) -> Html {
let navigator = use_navigator().unwrap();
let project_id = props.project.id.clone();
- let project_view_cb = Callback::from(move |_|{
+ let project_view_cb = Callback::from(move |_| {
navigator.push(&Route::Details { project_id });
});
@@ -25,30 +24,35 @@ pub fn project_card(props: &ProjectCardProps) -> Html {
cover_image_url = String::new()
}
- let project_title = format!("{} en {}, {}", props.project.project_type, props.project.district, props.project.city);
-
- let project_price = format!("Desde US${}", match props.project.starts_from {
- Some(price) => {
- let price_separated = price.separate_with_commas();
- if price_separated.contains(".") {
- price_separated
- } else {
- format!("{price_separated}.00")
+ let project_title = format!(
+ "{} en {}, {}",
+ props.project.project_type, props.project.district, props.project.city
+ );
+
+ let project_price = format!(
+ "Desde US${}",
+ match props.project.starts_from {
+ Some(price) => {
+ let price_separated = price.separate_with_commas();
+ if price_separated.contains(".") {
+ price_separated
+ } else {
+ format!("{price_separated}.00")
+ }
}
- },
- None => "0.00".into()
- });
+ None => "0.00".into(),
+ }
+ );
let project_condition = props.project.project_condition.to_string();
let project_est_finish_date = props.project.finish_date.format("%m/%Y");
//let project_location_written;
-
- html!{
+ html! {
-
+
{project_title}
@@ -71,5 +75,5 @@ pub fn project_card(props: &ProjectCardProps) -> Html {
#[derive(Properties, PartialEq, PartialOrd)]
pub struct ProjectCardProps {
- pub project: ProjectCardDto
-}
\ No newline at end of file
+ pub project: ProjectCardDto,
+}
diff --git a/src/components/textfield.rs b/src/components/textfield.rs
index 8dad1ba..2490d84 100644
--- a/src/components/textfield.rs
+++ b/src/components/textfield.rs
@@ -3,7 +3,6 @@ use wasm_bindgen::{JsCast, UnwrapThrowExt};
use web_sys::{HtmlInputElement, HtmlTextAreaElement};
use yew::prelude::*;
-
/// This component is a text
#[function_component(TextField)]
pub fn textfield(props: &TextFieldProps) -> Html {
@@ -11,24 +10,26 @@ pub fn textfield(props: &TextFieldProps) -> Html {
let handle = props.value.clone();
let fieldtype = props.fieldtype.clone();
let onchange = props.onchange.clone();
- Callback::from(move |e: InputEvent| {
- match fieldtype {
- TextFieldType::Input => {
- let value = get_value_from_input_event(e);
- match onchange.clone() {
- Some(onchange) => { onchange.emit(value.clone()); },
- None => {}
- };
- handle.set(value);
- },
- TextFieldType::TextArea => {
- let value = get_value_from_input_event(e);
- match onchange.clone() {
- Some(onchange) => { onchange.emit(value.clone()); },
- None => {}
- };
- handle.set(value);
- },
+ Callback::from(move |e: InputEvent| match fieldtype {
+ TextFieldType::Input => {
+ let value = get_value_from_input_event(e);
+ match onchange.clone() {
+ Some(onchange) => {
+ onchange.emit(value.clone());
+ }
+ None => {}
+ };
+ handle.set(value);
+ }
+ TextFieldType::TextArea => {
+ let value = get_value_from_textarea_event(e);
+ match onchange.clone() {
+ Some(onchange) => {
+ onchange.emit(value.clone());
+ }
+ None => {}
+ };
+ handle.set(value);
}
})
};
@@ -42,7 +43,7 @@ pub fn textfield(props: &TextFieldProps) -> Html {
html! {
}
}
@@ -55,7 +56,7 @@ pub struct TextFieldProps {
pub fieldtype: TextFieldType,
#[prop_or_default]
pub required: bool,
- pub onchange: Option
>
+ pub onchange: Option>,
}
#[derive(PartialEq, Clone, Default)]
@@ -77,4 +78,4 @@ pub fn get_value_from_textarea_event(e: InputEvent) -> String {
let event_target = event.target().unwrap_throw();
let target: HtmlTextAreaElement = event_target.dyn_into().unwrap_throw();
target.value()
-}
\ No newline at end of file
+}
diff --git a/src/constants/mod.rs b/src/constants/mod.rs
index 44f54a4..8dcd172 100644
--- a/src/constants/mod.rs
+++ b/src/constants/mod.rs
@@ -4,4 +4,4 @@ pub const NAVBAR_COL_CONTACTO: &str = "Vende con nosotros";
pub const NAVBAR_COL_AGENTES: &str = "Agentes";
pub const PRIMARY_COLOR: &str = "#41BDD9";
-pub const SECONDARY_COLOR: &str = "#5D6A73";
\ No newline at end of file
+pub const SECONDARY_COLOR: &str = "#5D6A73";
diff --git a/src/pages/admin/agents.rs b/src/pages/admin/agents.rs
index 02a7ef7..3a16b5b 100644
--- a/src/pages/admin/agents.rs
+++ b/src/pages/admin/agents.rs
@@ -1,10 +1,9 @@
use yew::prelude::*;
-use crate::{components::admin_nav_bar::AdminNavigationBar, api::backend::get_all_agents};
+use crate::{api::backend::get_all_agents, components::admin_nav_bar::AdminNavigationBar};
#[function_component(AdminAgents)]
pub fn admin_agents() -> Html {
-
let agents = use_state(|| Vec::new());
use_state(|| {
@@ -13,7 +12,7 @@ pub fn admin_agents() -> Html {
match get_all_agents().await {
Ok(agents) => {
agents_handle.set(agents);
- },
+ }
Err(error) => log::error!("Error retrieving agents from backend. Error: {}", error),
};
});
@@ -29,4 +28,4 @@ pub fn admin_agents() -> Html {
>
}
-}
\ No newline at end of file
+}
diff --git a/src/pages/admin/contacts.rs b/src/pages/admin/contacts.rs
index 5dbff44..e638757 100644
--- a/src/pages/admin/contacts.rs
+++ b/src/pages/admin/contacts.rs
@@ -1,6 +1,6 @@
use yew::prelude::*;
-use crate::{components::admin_nav_bar::AdminNavigationBar, api::backend::get_all_contacts};
+use crate::{api::backend::get_all_contacts, components::admin_nav_bar::AdminNavigationBar};
#[function_component(AdminContacts)]
pub fn admin_contacts() -> Html {
@@ -12,8 +12,10 @@ pub fn admin_contacts() -> Html {
match get_all_contacts().await {
Ok(contacts) => {
contacts_handle.set(contacts);
- },
- Err(error) => log::error!("Error retrieving contacts from backend. Error: {}", error),
+ }
+ Err(error) => {
+ log::error!("Error retrieving contacts from backend. Error: {}", error)
+ }
};
});
});
@@ -23,9 +25,9 @@ pub fn admin_contacts() -> Html {
{"Solicitudes de Contacto"}
-
+
>
}
-}
\ No newline at end of file
+}
diff --git a/src/pages/admin/edit.rs b/src/pages/admin/edit.rs
index 150c25b..3d426f7 100644
--- a/src/pages/admin/edit.rs
+++ b/src/pages/admin/edit.rs
@@ -1,11 +1,26 @@
use std::{fmt::Display, str::FromStr};
-use jl_types::{ domain::{agent::Agent, media::{MediaList}, unit::Unit, project_state::ProjectState, project_condition::ProjectCondition, project_type::ProjectType}, dto::listing::Listing};
+use jl_types::{
+ domain::{
+ agent::Agent, media::MediaList, project_condition::ProjectCondition,
+ project_state::ProjectState, project_type::ProjectType, unit::Unit,
+ },
+ dto::listing::Listing,
+};
use uuid::Uuid;
use yew::prelude::*;
use yew_router::prelude::use_navigator;
-use crate::{components::{admin_nav_bar::AdminNavigationBar, textfield::{TextField, TextFieldType}, dropdown::DropDown, datepicker::DatePicker}, api::backend::{get_project_listing, get_all_agents}};
+use crate::{
+ api::backend::{get_all_agents, get_project_listing},
+ components::{
+ admin_nav_bar::AdminNavigationBar,
+ datepicker::DatePicker,
+ dropdown::DropDown,
+ media_picker::MediaPicker,
+ textfield::{TextField, TextFieldType},
+ },
+};
/// 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)]
@@ -15,34 +30,38 @@ pub fn edit_page(props: &AdminEditPageProps) -> Html {
use_state(|| {
let listing = listing.clone();
match props.edit_item {
- EditItem::Agent => {
-
- },
+ EditItem::Agent => {}
EditItem::Project => {
match props.edit_type {
- EditType::New => {},
+ EditType::New => {}
EditType::Existing(uid) => {
wasm_bindgen_futures::spawn_local(async move {
let listing_result = get_project_listing(&uid).await;
match listing_result {
Ok(listing_persisted) => {
listing.set(Some(listing_persisted));
- },
- Err(error) => log::error!("Error loading listing: {error}")
+ }
+ Err(error) => log::error!("Error loading listing: {error}"),
};
});
- },
+ }
};
- },
- EditItem::Unit(_) => {},
- }});
-
+ }
+ EditItem::Unit(_) => {}
+ }
+ });
+
html! {
<>
-
{ format!("Editar {}", match props.edit_item {
+
{ format!("{} {}",
+ match props.edit_type {
+ EditType::New => "Agregar",
+ EditType::Existing(_) => "Editar",
+ },
+ match props.edit_item {
EditItem::Agent => "Agente",
EditItem::Project => "Proyecto",
EditItem::Unit(_) => "Unidad",
@@ -59,21 +78,21 @@ pub fn edit_page(props: &AdminEditPageProps) -> Html {
>
-
+
}
-
}
#[derive(PartialEq, Clone)]
pub enum EditItem {
Agent,
- Project,
+ Project,
/// Project Uid
Unit(Uuid),
}
#[derive(PartialEq, Clone)]
pub enum EditType {
- New, Existing(Uuid)
+ New,
+ Existing(Uuid),
}
#[derive(Properties, PartialEq)]
@@ -92,7 +111,7 @@ pub struct ProjectFieldsProps {
pub fn generate_fields_for_project(props: &ProjectFieldsProps) -> Html {
let user_typed = use_state(|| false);
let listing_opt = props.listing.clone();
-
+
let location_city = use_state_eq(|| String::new());
let location_district = use_state_eq(|| String::new());
let agent: UseStateHandle