Upgraded Leptos to 0.8. Fixes #1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
use chrono::{Datelike, Local};
|
||||
use leptos::*;
|
||||
use leptos::prelude::*;
|
||||
use crate::backend::data::{ApiResponse, ReservationState, ResSumWithItems};
|
||||
use crate::backend::reservation::{month_chart, reservations_in_month, year_chart, years};
|
||||
use crate::components::modal_box::{DialogOpener, ModalBody, ModalDialog};
|
||||
@@ -11,7 +11,7 @@ use crate::pages::new_reservations::CancelDialog;
|
||||
fn booking_detail(reservation: ReadSignal<ResSumWithItems>, opener: DialogOpener) -> impl IntoView {
|
||||
let menu = MenuOpener::new();
|
||||
let cancel_opener = DialogOpener::new();
|
||||
let menu_visible = create_rw_signal(false);
|
||||
let menu_visible = RwSignal::new(false);
|
||||
view! {
|
||||
<CancelDialog opener=cancel_opener reservation=reservation/>
|
||||
<ModalDialog title="Booking detail" opener=opener>
|
||||
@@ -27,7 +27,7 @@ fn booking_detail(reservation: ReadSignal<ResSumWithItems>, opener: DialogOpener
|
||||
let:item>
|
||||
{item.property.name}": "{item.reservation.from.to_string()}" - "{item.reservation.to.to_string()}<br/>
|
||||
</For>
|
||||
{trl("Customer: ")}{detail.customer.full_name}", "<a href={format!("mailto:{}", detail.customer.email)}>{detail.customer.email}</a>", "{detail.customer.phone}<br/>
|
||||
{trl("Customer: ")}{detail.customer.full_name}", "<a href={format!("mailto:{}", detail.customer.email)}>{detail.customer.email.clone()}</a>", "{detail.customer.phone}<br/>
|
||||
{
|
||||
let note = detail.summary.note.clone();
|
||||
let show = note.is_some() && !note.clone().unwrap().is_empty();
|
||||
@@ -42,7 +42,7 @@ fn booking_detail(reservation: ReadSignal<ResSumWithItems>, opener: DialogOpener
|
||||
}}
|
||||
</p>
|
||||
<Show when=move || menu_visible.get()>
|
||||
<table width="100%">
|
||||
<table style="width: 100%"><tbody>
|
||||
<tr>
|
||||
<td width="100%"></td>
|
||||
<td>
|
||||
@@ -62,7 +62,7 @@ fn booking_detail(reservation: ReadSignal<ResSumWithItems>, opener: DialogOpener
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</tbody></table>
|
||||
</Show>
|
||||
</ModalBody>
|
||||
</ModalDialog>
|
||||
@@ -71,15 +71,15 @@ fn booking_detail(reservation: ReadSignal<ResSumWithItems>, opener: DialogOpener
|
||||
|
||||
#[component]
|
||||
pub fn bookings() -> impl IntoView {
|
||||
let year_chart = create_blocking_resource(||(), |_| year_chart());
|
||||
let years = create_blocking_resource(||(), |_| years());
|
||||
let year = create_rw_signal(Local::now().year());
|
||||
let month = create_rw_signal(Local::now().month());
|
||||
let chart = create_blocking_resource(move || year.get(),move |y| month_chart(y));
|
||||
let year_chart = Resource::new_blocking(||(), |_| year_chart());
|
||||
let years = Resource::new_blocking(||(), |_| years());
|
||||
let year = RwSignal::new(Local::now().year());
|
||||
let month = RwSignal::new(Local::now().month());
|
||||
let chart = Resource::new_blocking(move || year.get(),move |y| month_chart(y));
|
||||
let detail_dlg = DialogOpener::new();
|
||||
let reservations = create_blocking_resource(move || (year.get(), month.get(), detail_dlg.visible()), move |p| reservations_in_month(p.0, p.1));
|
||||
let reservations = Resource::new_blocking(move || (year.get(), month.get(), detail_dlg.visible()), move |p| reservations_in_month(p.0, p.1));
|
||||
let all_months: Vec<u32> = vec![1,2,3,4,5,6,7,8,9,10,11,12];
|
||||
let res_detail = create_rw_signal(ResSumWithItems::default());
|
||||
let res_detail = RwSignal::new(ResSumWithItems::default());
|
||||
|
||||
view! {
|
||||
<h1>{trl("Booking overview")}</h1>
|
||||
@@ -94,7 +94,7 @@ pub fn bookings() -> impl IntoView {
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<Transition fallback=move || view! {<div>"Loading"</div>} >
|
||||
{
|
||||
{move || {
|
||||
years.get().map(|y| match y {
|
||||
Ok(y) => {
|
||||
view! {
|
||||
@@ -106,11 +106,11 @@ pub fn bookings() -> impl IntoView {
|
||||
<option prop:value=move || y prop:selected=move || year.get() == y>{y}</option>
|
||||
</For>
|
||||
</select>
|
||||
}
|
||||
}.into_any()
|
||||
}
|
||||
Err(_) => {view! {<select><option></option></select>}}
|
||||
Err(_) => {view! {<select><option></option></select>}.into_any()}
|
||||
})
|
||||
}
|
||||
}}
|
||||
</Transition>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
@@ -135,30 +135,24 @@ pub fn bookings() -> impl IntoView {
|
||||
<div class="col-md">
|
||||
<div class="card md-3">
|
||||
<Transition fallback=move || view! {<div>"Loading"</div>}>
|
||||
{
|
||||
{move || {
|
||||
chart.get().map(move |c| match c {
|
||||
Ok(c) => { match c {
|
||||
ApiResponse::Data(c) => {view! {<img style="margin: 1em" src={c.clone()} /> }}
|
||||
ApiResponse::Error(_) => {view! {<img src=""/> }} }
|
||||
}
|
||||
Err(_) => { view! {<img src=""/> } }
|
||||
Ok(ApiResponse::Data(c)) => {view! {<img style="margin: 1em" src={c.clone()} /> }.into_any()}
|
||||
_ => { view! {<img src=""/> }.into_any() }
|
||||
})
|
||||
}
|
||||
}}
|
||||
</Transition>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md">
|
||||
<div class="card md-3">
|
||||
<Transition fallback=move || view! {<div>"Loading"</div>}>
|
||||
{
|
||||
{move || {
|
||||
year_chart.get().map(move |c| match c {
|
||||
Ok(c) => { match c {
|
||||
ApiResponse::Data(c) => {view! {<img style="margin: 1em" src={c.clone()} /> }}
|
||||
ApiResponse::Error(_) => {view! {<img src=""/> }} }
|
||||
}
|
||||
Err(_) => { view! {<img src=""/> } }
|
||||
Ok(ApiResponse::Data(c)) => {view! {<img style="margin: 1em" src={c.clone()} /> }.into_any()}
|
||||
_ => { view! {<img src=""/> }.into_any() }
|
||||
})
|
||||
}
|
||||
}}
|
||||
</Transition>
|
||||
</div>
|
||||
</div>
|
||||
@@ -178,7 +172,7 @@ pub fn bookings() -> impl IntoView {
|
||||
<th>{trl("Actions")}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
{
|
||||
{move || {
|
||||
reservations.get().map(|r| match r {
|
||||
Ok(r) => { match r {
|
||||
ApiResponse::Data(r) => {
|
||||
@@ -202,20 +196,20 @@ pub fn bookings() -> impl IntoView {
|
||||
</tr>
|
||||
</For>
|
||||
</tbody>
|
||||
}
|
||||
}.into_any()
|
||||
}
|
||||
ApiResponse::Error(e) => {
|
||||
view! {<tbody class="table-border-bottom-0">
|
||||
<tr><td colspan=5>{trl("Something went wrong")}<br/>{e.to_string()}</td></tr></tbody>}
|
||||
<tr><td colspan=5>{trl("Something went wrong")}<br/>{e.to_string()}</td></tr></tbody>}.into_any()
|
||||
}
|
||||
}
|
||||
}
|
||||
Err(e) => {
|
||||
view! {<tbody class="table-border-bottom-0">
|
||||
<tr><td colspan=5>{trl("Something went wrong")}<br/>{e.to_string()}</td></tr></tbody>}
|
||||
<tr><td colspan=5>{trl("Something went wrong")}<br/>{e.to_string()}</td></tr></tbody>}.into_any()
|
||||
}
|
||||
})
|
||||
}
|
||||
}}
|
||||
</table>
|
||||
</Transition>
|
||||
</div>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use leptos::*;
|
||||
use leptos::prelude::*;
|
||||
use crate::backend::appearance::{DeleteBanner, get_appearance, UpdateAppearance};
|
||||
use crate::backend::data::Appearance;
|
||||
use crate::components::data_form::{DataForm, QuestionDialog};
|
||||
@@ -7,7 +7,7 @@ use crate::locales::trl;
|
||||
|
||||
#[component]
|
||||
fn edit_title(opener: DialogOpener, appearance: ReadSignal<Appearance>) -> impl IntoView {
|
||||
let update = create_server_action::<UpdateAppearance>();
|
||||
let update = ServerAction::<UpdateAppearance>::new();
|
||||
view! {
|
||||
<DataForm opener=opener action=update title="Update title">
|
||||
<input type="hidden" prop:value={move || appearance.get().text.unwrap_or_default()} name="appearance[text]" />
|
||||
@@ -31,7 +31,7 @@ fn edit_title(opener: DialogOpener, appearance: ReadSignal<Appearance>) -> impl
|
||||
|
||||
#[component]
|
||||
fn edit_text(opener: DialogOpener, appearance: ReadSignal<Appearance>) -> impl IntoView {
|
||||
let update = create_server_action::<UpdateAppearance>();
|
||||
let update = ServerAction::<UpdateAppearance>::new();
|
||||
view! {
|
||||
<DataForm opener=opener action=update title="Update text">
|
||||
<input type="hidden" prop:value={move || appearance.get().title.unwrap_or_default()} name="appearance[title]" />
|
||||
@@ -53,7 +53,7 @@ fn edit_text(opener: DialogOpener, appearance: ReadSignal<Appearance>) -> impl I
|
||||
|
||||
#[component]
|
||||
fn delete_banner(opener: DialogOpener) -> impl IntoView {
|
||||
let delete = create_server_action::<DeleteBanner>();
|
||||
let delete = ServerAction::<DeleteBanner>::new();
|
||||
view! {
|
||||
<QuestionDialog opener=opener action=delete title="Delete banner">
|
||||
<div>{trl("Are you sure you want to delete banner?")}</div>
|
||||
@@ -66,8 +66,8 @@ pub fn appearance() -> impl IntoView {
|
||||
let title_edit = DialogOpener::new();
|
||||
let text_edit = DialogOpener::new();
|
||||
let del_dialog = DialogOpener::new();
|
||||
let appearance = create_resource(move || title_edit.visible() || text_edit.visible() || del_dialog.visible(), |_| get_appearance());
|
||||
let app_edit = create_rw_signal(Appearance::default());
|
||||
let appearance = Resource::new(move || title_edit.visible() || text_edit.visible() || del_dialog.visible(), |_| get_appearance());
|
||||
let app_edit = RwSignal::new(Appearance::default());
|
||||
view! {
|
||||
<EditTitle opener=title_edit appearance=app_edit.read_only()/>
|
||||
<EditText opener=text_edit appearance=app_edit.read_only()/>
|
||||
@@ -85,16 +85,17 @@ pub fn appearance() -> impl IntoView {
|
||||
</button>
|
||||
</form><br/>
|
||||
<Transition fallback=move || view! {<p>{trl("Loading...")}</p> }>
|
||||
{
|
||||
{move || {
|
||||
appearance.get().map(|a| match a {
|
||||
Ok(a) => {
|
||||
app_edit.set(a.clone());
|
||||
let app = a.clone();
|
||||
Ok(app) => {
|
||||
app_edit.set(app.clone());
|
||||
let has_banner = app.banner.is_some();
|
||||
let title = app.title.clone().unwrap_or_default();
|
||||
view! {
|
||||
<div>
|
||||
<Show when=move || a.clone().banner.is_some()>
|
||||
<Show when=move || has_banner>
|
||||
<div class="header_banner">
|
||||
<h1 class="header_banner">{app.title.clone().unwrap_or_default()}</h1>
|
||||
<h1 class="header_banner">{title.clone()}</h1>
|
||||
</div>
|
||||
</Show>
|
||||
<div>
|
||||
@@ -111,13 +112,13 @@ pub fn appearance() -> impl IntoView {
|
||||
<i class="bx bx-edit-alt me-1"></i> {trl("Edit text")}</a>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
}.into_any()
|
||||
}
|
||||
Err(e) => {view! {<div><p>{trl("Error loading data")}</p>
|
||||
<p>{e.to_string()}</p></div>
|
||||
}}
|
||||
}.into_any()}
|
||||
})
|
||||
}
|
||||
}}
|
||||
</Transition>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use leptos::*;
|
||||
use leptos::prelude::*;
|
||||
use crate::backend::data::User;
|
||||
use crate::backend::user::{ChangePwd, get_user};
|
||||
use crate::components::data_form::DataForm;
|
||||
@@ -7,8 +7,8 @@ use crate::locales::trl;
|
||||
|
||||
#[component]
|
||||
pub fn change_password(user: ReadSignal<User>, opener: DialogOpener) -> impl IntoView {
|
||||
let change_pwd = create_server_action::<ChangePwd>();
|
||||
let logged_in = create_resource(||(), move |_| get_user());
|
||||
let change_pwd = ServerAction::<ChangePwd>::new();
|
||||
let logged_in = Resource::new(||(), move |_| get_user());
|
||||
|
||||
view! {
|
||||
<DataForm opener=opener action=change_pwd title="Change password">
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
use chrono::Local;
|
||||
use leptos::*;
|
||||
use leptos::prelude::*;
|
||||
use crate::backend::data::ClosingTime;
|
||||
use crate::backend::opening_hours::{get_closing_times, DeleteClosingTime, InsertClosingTime};
|
||||
use crate::components::data_form::{DataForm, QuestionDialog};
|
||||
@@ -8,7 +8,7 @@ use crate::locales::{loc_date, trl};
|
||||
|
||||
#[component]
|
||||
pub fn del_closing_day(closing_time: ReadSignal<ClosingTime>, opener: DialogOpener) -> impl IntoView {
|
||||
let delete = create_server_action::<DeleteClosingTime>();
|
||||
let delete = ServerAction::<DeleteClosingTime>::new();
|
||||
|
||||
view! {
|
||||
<QuestionDialog opener=opener action=delete title="Delete closing days">
|
||||
@@ -20,7 +20,7 @@ pub fn del_closing_day(closing_time: ReadSignal<ClosingTime>, opener: DialogOpen
|
||||
|
||||
#[component]
|
||||
pub fn insert_closing_days(opener: DialogOpener) -> impl IntoView {
|
||||
let insert_day = create_server_action::<InsertClosingTime>();
|
||||
let insert_day = ServerAction::<InsertClosingTime>::new();
|
||||
|
||||
view! {
|
||||
<DataForm opener=opener action=insert_day title="Closing days">
|
||||
@@ -52,8 +52,8 @@ pub fn insert_closing_days(opener: DialogOpener) -> impl IntoView {
|
||||
pub fn closing_days() -> impl IntoView {
|
||||
let delete_dialog = DialogOpener::new();
|
||||
let editor = DialogOpener::new();
|
||||
let times = create_blocking_resource(move || editor.visible() || delete_dialog.visible(), move |_| {get_closing_times()});
|
||||
let time_to_del = create_rw_signal(ClosingTime::default());
|
||||
let times = Resource::new_blocking(move || editor.visible() || delete_dialog.visible(), move |_| {get_closing_times()});
|
||||
let time_to_del = RwSignal::new(ClosingTime::default());
|
||||
view! {
|
||||
<DelClosingDay closing_time=time_to_del.read_only() opener=delete_dialog/>
|
||||
<InsertClosingDays opener=editor/>
|
||||
@@ -78,7 +78,7 @@ pub fn closing_days() -> impl IntoView {
|
||||
e.to_string()
|
||||
};
|
||||
view! {<tbody class="table-border-bottom-0">
|
||||
<tr><td colspan=3>{trl(&err)}</td></tr></tbody>}}
|
||||
<tr><td colspan=3>{trl(&err)}</td></tr></tbody>}.into_any()}
|
||||
Ok(c) => {
|
||||
view! {<tbody class="table-border-bottom-0">
|
||||
<For each=move || c.clone()
|
||||
@@ -100,7 +100,7 @@ pub fn closing_days() -> impl IntoView {
|
||||
</tr>
|
||||
}
|
||||
}/></tbody>
|
||||
}
|
||||
}.into_any()
|
||||
}
|
||||
})
|
||||
}}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use crate::backend::data::Company;
|
||||
use crate::backend::company::UpdateCompany;
|
||||
use crate::components::modal_box::DialogOpener;
|
||||
use leptos::*;
|
||||
use leptos::prelude::*;
|
||||
use crate::components::data_form::DataForm;
|
||||
use crate::locales::trl;
|
||||
|
||||
@@ -10,7 +10,7 @@ pub fn CompanyEdit(
|
||||
company: ReadSignal<Company>,
|
||||
opener: DialogOpener,
|
||||
) -> impl IntoView {
|
||||
let update_company = create_server_action::<UpdateCompany>();
|
||||
let update_company = ServerAction::<UpdateCompany>::new();
|
||||
|
||||
view! {
|
||||
<DataForm opener=opener action=update_company title="Edit company">
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use leptos::*;
|
||||
use leptos::prelude::*;
|
||||
use crate::backend::company::get_company;
|
||||
use crate::backend::data::{ApiResponse, Company};
|
||||
use crate::components::modal_box::DialogOpener;
|
||||
@@ -8,21 +8,21 @@ use crate::pages::company_edit::CompanyEdit;
|
||||
#[component]
|
||||
pub fn CompanyInfo() -> impl IntoView {
|
||||
let editor = DialogOpener::new();
|
||||
let company = create_blocking_resource(move|| editor.visible(), move |_| { get_company() });
|
||||
let (cmp, set_cmp) = create_signal(Company::default());
|
||||
let company = Resource::new_blocking(move|| editor.visible(), move |_| { get_company() });
|
||||
let (cmp, set_cmp) = signal(Company::default());
|
||||
|
||||
view! {
|
||||
<CompanyEdit company={cmp} opener=editor/>
|
||||
<div class="card mb-3">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title"><i class="bx bx-buildings"></i>" "{trl("Company info")}</h5>
|
||||
<p class="card-text">
|
||||
<div class="card-text">
|
||||
<Transition fallback=move || view! {<p>{trl("Loading...")}</p> }>
|
||||
{move || {
|
||||
company.get().map(|c| match c {
|
||||
Err(e) => {view! {<div><p>{trl("Error loading data")}</p>
|
||||
<p>{e.to_string()}</p></div>
|
||||
}}
|
||||
}.into_any()}
|
||||
Ok(c) => {
|
||||
match c {
|
||||
ApiResponse::Data(d) => {set_cmp.update(|cmp| *cmp = d.clone());
|
||||
@@ -30,16 +30,16 @@ pub fn CompanyInfo() -> impl IntoView {
|
||||
<p><b>{d.name}</b></p>
|
||||
<p>{d.street}" "{d.house_number}<br/>
|
||||
{d.zip_code}" "{d.city}
|
||||
</p></div>}
|
||||
</p></div>}.into_any()
|
||||
}
|
||||
ApiResponse::Error(_) => {view! {<div><p>{trl("Error loading data")}</p></div>}}
|
||||
ApiResponse::Error(_) => {view! {<div><p>{trl("Error loading data")}</p></div>}.into_any()}
|
||||
}
|
||||
|
||||
}
|
||||
})
|
||||
}}
|
||||
</Transition>
|
||||
</p>
|
||||
</div>
|
||||
<a href="javascript:void(0)" class="card-link" on:click = move |_| editor.show()>
|
||||
<i class="bx bx-edit-alt fs-4 lh-0"></i></a>
|
||||
</div>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
use leptos::*;
|
||||
use leptos::prelude::*;
|
||||
use crate::backend::customer::get_customers;
|
||||
use crate::backend::data::ApiResponse;
|
||||
use crate::locales::trl;
|
||||
|
||||
#[component]
|
||||
pub fn customers() -> impl IntoView {
|
||||
let customers = create_blocking_resource(||(), |_| get_customers());
|
||||
let customers = Resource::new_blocking(||(), |_| get_customers());
|
||||
|
||||
view! {
|
||||
<h1>{trl("Customers")}</h1>
|
||||
@@ -21,7 +21,7 @@ pub fn customers() -> impl IntoView {
|
||||
<th>{trl("Phone")}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
{
|
||||
{move || {
|
||||
customers.get().map(|c| match c {
|
||||
Ok(c) => {match c {
|
||||
ApiResponse::Data(c) => {
|
||||
@@ -35,20 +35,20 @@ pub fn customers() -> impl IntoView {
|
||||
</tr>
|
||||
</For>
|
||||
</tbody>
|
||||
}
|
||||
}.into_any()
|
||||
}
|
||||
ApiResponse::Error(e) => {
|
||||
view! {<tbody class="table-border-bottom-0">
|
||||
<tr><td colspan=3>{trl("Something went wrong")}<br/>{e.to_string()}</td></tr></tbody>}
|
||||
<tr><td colspan=3>{trl("Something went wrong")}<br/>{e.to_string()}</td></tr></tbody>}.into_any()
|
||||
}
|
||||
}
|
||||
}
|
||||
Err(e) => {
|
||||
view! {<tbody class="table-border-bottom-0">
|
||||
<tr><td colspan=3>{trl("Something went wrong")}<br/>{e.to_string()}</td></tr></tbody>}
|
||||
<tr><td colspan=3>{trl("Something went wrong")}<br/>{e.to_string()}</td></tr></tbody>}.into_any()
|
||||
}
|
||||
})
|
||||
}
|
||||
}}
|
||||
</table>
|
||||
</Transition>
|
||||
</div>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use leptos::*;
|
||||
use leptos::prelude::*;
|
||||
use crate::components::modal_box::DialogOpener;
|
||||
use crate::locales::trl;
|
||||
use crate::pages::new_reservations::NewReservations;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use leptos::*;
|
||||
use leptos::prelude::*;
|
||||
use crate::backend::data::WeekHours;
|
||||
use crate::backend::opening_hours::{DeleteClosingTime, UpdateHours};
|
||||
use crate::components::data_form::{DataForm, QuestionDialog};
|
||||
@@ -7,7 +7,7 @@ use crate::locales::trl;
|
||||
|
||||
#[component]
|
||||
pub fn EditHours(opener: DialogOpener, hours: ReadSignal<WeekHours>) -> impl IntoView {
|
||||
let update_hours = create_server_action::<UpdateHours>();
|
||||
let update_hours = ServerAction::<UpdateHours>::new();
|
||||
|
||||
view! {
|
||||
<DataForm opener=opener action=update_hours title="Edit hours">
|
||||
@@ -31,7 +31,7 @@ pub fn EditHours(opener: DialogOpener, hours: ReadSignal<WeekHours>) -> impl Int
|
||||
|
||||
#[component]
|
||||
pub fn del_closing_days(opener: DialogOpener) -> impl IntoView {
|
||||
let delete = create_server_action::<DeleteClosingTime>();
|
||||
let delete = ServerAction::<DeleteClosingTime>::new();
|
||||
|
||||
view! {
|
||||
<QuestionDialog opener=opener action=delete title="Delete closing days">
|
||||
|
||||
+4
-4
@@ -1,6 +1,6 @@
|
||||
use leptos::*;
|
||||
use leptos::prelude::*;
|
||||
use leptos_meta::*;
|
||||
use leptos_router::ActionForm;
|
||||
use leptos::form::ActionForm;
|
||||
use crate::backend::user::Login;
|
||||
use crate::components::modal_box::DialogOpener;
|
||||
use crate::components::server_err::ServerErr;
|
||||
@@ -8,8 +8,8 @@ use crate::locales::trl;
|
||||
|
||||
#[component]
|
||||
pub fn Login() -> impl IntoView {
|
||||
let login = create_server_action::<Login>();
|
||||
let login_val = login.value();
|
||||
let login = ServerAction::<Login>::new();
|
||||
let login_val = Signal::derive(move || login.value().get());
|
||||
view! {
|
||||
<Link rel="stylesheet" href="/vendor/css/pages/page-auth.css" />
|
||||
<div class="authentication-wrapper authentication-basic container-p-y">
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use leptos::*;
|
||||
use leptos::prelude::*;
|
||||
use crate::backend::data::MessageType;
|
||||
use crate::locales::trl;
|
||||
use crate::pages::mail_view::MailView;
|
||||
|
||||
+10
-10
@@ -1,4 +1,4 @@
|
||||
use leptos::*;
|
||||
use leptos::prelude::*;
|
||||
use crate::backend::data::{Message, MessageType};
|
||||
use crate::backend::mail::{get_message, UpdateMessage};
|
||||
use crate::components::data_form::DataForm;
|
||||
@@ -7,7 +7,7 @@ use crate::locales::trl;
|
||||
|
||||
#[component]
|
||||
fn mail_edit(opener: DialogOpener, mail: ReadSignal<Message>) -> impl IntoView {
|
||||
let update = create_server_action::<UpdateMessage>();
|
||||
let update = ServerAction::<UpdateMessage>::new();
|
||||
|
||||
view! {
|
||||
<DataForm opener=opener title="Edit mail" action=update>
|
||||
@@ -44,17 +44,17 @@ fn mail_edit(opener: DialogOpener, mail: ReadSignal<Message>) -> impl IntoView {
|
||||
#[component]
|
||||
pub fn mail_view(title: &'static str, mail_type: MessageType) -> impl IntoView {
|
||||
let editor = DialogOpener::new();
|
||||
let mail = create_blocking_resource( move || editor.visible(), move |_| get_message(mail_type.clone()));
|
||||
let for_edit = create_rw_signal(Message::default());
|
||||
let mail = Resource::new_blocking( move || editor.visible(), move |_| get_message(mail_type.clone()));
|
||||
let for_edit = RwSignal::new(Message::default());
|
||||
|
||||
view! {
|
||||
<MailEdit opener=editor mail={for_edit.read_only()}/>
|
||||
<div class="card mb-3">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title"><i class="bx bx-buildings"></i>" "{trl(title)}</h5>
|
||||
<p class="card-text">
|
||||
<div class="card-text">
|
||||
<Transition fallback=move || view! {<p>{trl("Loading...")}</p> }>
|
||||
{
|
||||
{move || {
|
||||
mail.get().map(|m| match m {
|
||||
Ok(m) => {
|
||||
for_edit.set(m.clone());
|
||||
@@ -63,16 +63,16 @@ pub fn mail_view(title: &'static str, mail_type: MessageType) -> impl IntoView {
|
||||
<p>{trl("Subject: ")}{m.subject}</p>
|
||||
<p>{m.text}</p>
|
||||
</div>
|
||||
}
|
||||
}.into_any()
|
||||
}
|
||||
Err(_) => {
|
||||
view! {
|
||||
<div>"Error loading data"</div>
|
||||
}
|
||||
}.into_any()
|
||||
}})
|
||||
}
|
||||
}}
|
||||
</Transition>
|
||||
</p>
|
||||
</div>
|
||||
<a href="javascript:void(0)" class="card-link" on:click = move |_| editor.show()>
|
||||
<i class="bx bx-edit-alt fs-4 lh-0"></i></a>
|
||||
</div>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use leptos::*;
|
||||
use leptos::prelude::*;
|
||||
use crate::backend::data::{ApiResponse, Page, ResSumWithItems};
|
||||
use crate::backend::reservation::{Approve, Cancel, get_new_reservations};
|
||||
use crate::components::data_form::QuestionDialog;
|
||||
@@ -10,7 +10,7 @@ use chrono::Datelike;
|
||||
|
||||
#[component]
|
||||
fn approve_dialog(reservation: ReadSignal<ResSumWithItems>, opener: DialogOpener) -> impl IntoView {
|
||||
let approve = create_server_action::<Approve>();
|
||||
let approve = ServerAction::<Approve>::new();
|
||||
|
||||
view! {
|
||||
<QuestionDialog opener=opener action=approve title="Approve booking">
|
||||
@@ -27,7 +27,7 @@ fn approve_dialog(reservation: ReadSignal<ResSumWithItems>, opener: DialogOpener
|
||||
|
||||
#[component]
|
||||
pub fn cancel_dialog(reservation: ReadSignal<ResSumWithItems>, opener: DialogOpener) -> impl IntoView {
|
||||
let cancel = create_server_action::<Cancel>();
|
||||
let cancel = ServerAction::<Cancel>::new();
|
||||
|
||||
view! {
|
||||
<QuestionDialog opener=opener action=cancel title="Cancel booking">
|
||||
@@ -56,13 +56,13 @@ fn create_dialog(opener: DialogOpener) -> impl IntoView {
|
||||
#[component]
|
||||
pub fn new_reservations(app_opener: DialogOpener, cancel_opener: DialogOpener) -> impl IntoView {
|
||||
let create = DialogOpener::new();
|
||||
let page = create_rw_signal(Page::new(5));
|
||||
let first = create_rw_signal(false);
|
||||
let last = create_rw_signal(false);
|
||||
let total_pages = create_rw_signal(0i32);
|
||||
let res = create_blocking_resource(move || (app_opener.visible() || cancel_opener.visible() || create.visible(), page),
|
||||
let page = RwSignal::new(Page::new(5));
|
||||
let first = RwSignal::new(false);
|
||||
let last = RwSignal::new(false);
|
||||
let total_pages = RwSignal::new(0i32);
|
||||
let res = Resource::new_blocking(move || (app_opener.visible() || cancel_opener.visible() || create.visible(), page),
|
||||
move |d| get_new_reservations(d.1.get()));
|
||||
let reservation = create_rw_signal(ResSumWithItems::default());
|
||||
let reservation = RwSignal::new(ResSumWithItems::default());
|
||||
|
||||
view! {
|
||||
<ApproveDialog opener=app_opener reservation=reservation.read_only() />
|
||||
@@ -75,7 +75,7 @@ pub fn new_reservations(app_opener: DialogOpener, cancel_opener: DialogOpener) -
|
||||
{move || {
|
||||
res.get().map(|r| match r {
|
||||
Err(e) => {
|
||||
view! {<div>{trl("Something went wrong")}<br/>{e.to_string()}</div>}}
|
||||
view! {<div>{trl("Something went wrong")}<br/>{e.to_string()}</div>}.into_any()}
|
||||
Ok(r) => { match r {
|
||||
ApiResponse::Data(r) => {
|
||||
first.set(r.is_first());
|
||||
@@ -98,7 +98,7 @@ pub fn new_reservations(app_opener: DialogOpener, cancel_opener: DialogOpener) -
|
||||
let:item>
|
||||
{item.property.name}": "{item.reservation.from.to_string()}" - "{item.reservation.to.to_string()}<br/>
|
||||
</For>
|
||||
{trl("Customer: ")}{data.customer.full_name}", "<a href={format!("mailto:{}", data.customer.email)}>{data.customer.email}</a>", "{data.customer.phone}<br/>
|
||||
{trl("Customer: ")}{data.customer.full_name}", "<a href={format!("mailto:{}", data.customer.email)}>{data.customer.email.clone()}</a>", "{data.customer.phone}<br/>
|
||||
{move || {
|
||||
let note = data.summary.note.clone();
|
||||
let show = note.is_some() && !note.clone().unwrap().is_empty();
|
||||
@@ -109,7 +109,7 @@ pub fn new_reservations(app_opener: DialogOpener, cancel_opener: DialogOpener) -
|
||||
}
|
||||
}}
|
||||
{trl("Price: ")}{data.summary.price.to_string()}<br/>
|
||||
<table width="100%">
|
||||
<table style="width: 100%"><tbody>
|
||||
<tr>
|
||||
<td width="100%"></td>
|
||||
<td>
|
||||
@@ -135,15 +135,15 @@ pub fn new_reservations(app_opener: DialogOpener, cancel_opener: DialogOpener) -
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</tbody></table>
|
||||
<hr/>
|
||||
}
|
||||
}}
|
||||
</For>
|
||||
</div>
|
||||
}
|
||||
}.into_any()
|
||||
}
|
||||
ApiResponse::Error(e) => {view! {<div>{trl(&e)}</div>}}}
|
||||
ApiResponse::Error(e) => {view! {<div>{trl(&e)}</div>}.into_any()}}
|
||||
}
|
||||
})
|
||||
}}
|
||||
|
||||
+11
-11
@@ -1,5 +1,5 @@
|
||||
use chrono::Weekday;
|
||||
use leptos::*;
|
||||
use leptos::prelude::*;
|
||||
use crate::backend::data::{DayHours, WeekHours};
|
||||
use crate::backend::opening_hours::get_hours;
|
||||
use crate::components::modal_box::DialogOpener;
|
||||
@@ -18,8 +18,8 @@ fn show_time(tm: &str) -> impl Fn() -> String {
|
||||
pub fn OpeningHours() -> impl IntoView {
|
||||
let editor = DialogOpener::new();
|
||||
let closing_delete = DialogOpener::new();
|
||||
let hours = create_blocking_resource(move || editor.visible(), move |_| {get_hours()});
|
||||
let hrs = create_rw_signal(WeekHours::default());
|
||||
let hours = Resource::new_blocking(move || editor.visible(), move |_| {get_hours()});
|
||||
let hrs = RwSignal::new(WeekHours::default());
|
||||
|
||||
view! {
|
||||
<EditHours opener=editor hours=hrs.read_only() />
|
||||
@@ -27,16 +27,16 @@ pub fn OpeningHours() -> impl IntoView {
|
||||
<div class="card mb-3">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title"><i class="bx bxs-watch"></i>" "{trl("Opening hours")}</h5>
|
||||
<p class="card-text">
|
||||
<div class="card-text">
|
||||
<Transition fallback=move || view! {<p>{trl("Loading...")}</p> }>
|
||||
{move || {
|
||||
hours.get().map(|h| match h {
|
||||
Ok(h) => {
|
||||
let h = create_rw_signal(h);
|
||||
let d = create_rw_signal((0..7).collect::<Vec<u8>>());
|
||||
let h = RwSignal::new(h);
|
||||
let d = RwSignal::new((0..7).collect::<Vec<u8>>());
|
||||
view! {
|
||||
<div>
|
||||
<table class="table card-table">
|
||||
<table class="table card-table"><tbody>
|
||||
<For each=move || d.get() key=|day| *day
|
||||
children=move |day| {
|
||||
let week_day = Weekday::try_from(day).unwrap_or(Weekday::Mon);
|
||||
@@ -54,17 +54,17 @@ pub fn OpeningHours() -> impl IntoView {
|
||||
}
|
||||
}
|
||||
/>
|
||||
</table>
|
||||
</tbody></table>
|
||||
</div>
|
||||
}
|
||||
}.into_any()
|
||||
}
|
||||
Err(e) => {view! {<div><p>{trl("Error loading data")}</p>
|
||||
<p>{e.to_string()}</p></div>
|
||||
}}
|
||||
}.into_any()}
|
||||
})
|
||||
}}
|
||||
</Transition>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use leptos::*;
|
||||
use leptos::prelude::*;
|
||||
use crate::backend::data::User;
|
||||
use crate::backend::user::{get_user, UpdateProfile};
|
||||
use crate::components::data_form::DataForm;
|
||||
@@ -7,8 +7,8 @@ use crate::locales::trl;
|
||||
|
||||
#[component]
|
||||
pub fn ProfileEdit(user: ReadSignal<User>, opener: DialogOpener) -> impl IntoView {
|
||||
let update_user = create_server_action::<UpdateProfile>();
|
||||
let logged_in = create_resource(||(), move |_| get_user());
|
||||
let update_user = ServerAction::<UpdateProfile>::new();
|
||||
let logged_in = Resource::new(||(), move |_| get_user());
|
||||
|
||||
view! {
|
||||
<DataForm opener=opener action=update_user title="Edit profile">
|
||||
|
||||
+12
-12
@@ -1,4 +1,4 @@
|
||||
use leptos::*;
|
||||
use leptos::prelude::*;
|
||||
use leptos_use::use_media_query;
|
||||
use crate::backend::data::{ApiResponse, ResProperty};
|
||||
use crate::backend::property::get_properties;
|
||||
@@ -11,13 +11,13 @@ use crate::pages::property_edit::PropertyEdit;
|
||||
#[component]
|
||||
pub fn properties() -> impl IntoView {
|
||||
let is_wide = use_media_query("(min-width: 500px)");
|
||||
let properties = create_rw_signal::<Vec<ResProperty>>(vec![]);
|
||||
let prop = create_rw_signal(ResProperty::default());
|
||||
let empty_prop = create_rw_signal(ResProperty::default());
|
||||
let properties = RwSignal::<Vec<ResProperty>>::new(vec![]);
|
||||
let prop = RwSignal::new(ResProperty::default());
|
||||
let empty_prop = RwSignal::new(ResProperty::default());
|
||||
let create_form = DialogOpener::new();
|
||||
let edit_form = DialogOpener::new();
|
||||
let delete_dlg = DialogOpener::new();
|
||||
let props = create_blocking_resource(move || create_form.visible() || edit_form.visible() || delete_dlg.visible(), move |_| get_properties());
|
||||
let props = Resource::new_blocking(move || create_form.visible() || edit_form.visible() || delete_dlg.visible(), move |_| get_properties());
|
||||
|
||||
view! {
|
||||
<PropertyEdit property=prop.read_only() opener=edit_form edit=true/>
|
||||
@@ -31,8 +31,8 @@ pub fn properties() -> impl IntoView {
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{trl("Name")}</th>
|
||||
{move || if is_wide.get() {view! {<th>{trl("Description")}</th>}}
|
||||
else {view! {<th></th>}} }
|
||||
{move || if is_wide.get() {view! {<th>{trl("Description")}</th>}.into_any()}
|
||||
else {view! {<th></th>}.into_any()} }
|
||||
<th>{trl("Price")}</th>
|
||||
<th>{trl("Actions")}</th>
|
||||
</tr>
|
||||
@@ -41,7 +41,7 @@ pub fn properties() -> impl IntoView {
|
||||
props.get().map(|u| match u {
|
||||
Err(e) => {
|
||||
view! {<tbody class="table-border-bottom-0">
|
||||
<tr><td colspan=4>{trl("Something went wrong")}<br/>{e.to_string()}</td></tr></tbody>}}
|
||||
<tr><td colspan=4>{trl("Something went wrong")}<br/>{e.to_string()}</td></tr></tbody>}.into_any()}
|
||||
Ok(u) => {
|
||||
match u {
|
||||
ApiResponse::Data(p) => {
|
||||
@@ -58,8 +58,8 @@ pub fn properties() -> impl IntoView {
|
||||
view! {
|
||||
<tr>
|
||||
<td>{data.name.clone()}</td>
|
||||
{move || if is_wide.get() {view! {<td>{data.description.clone()}</td>}}
|
||||
else {view! {<td></td>}} }
|
||||
{move || if is_wide.get() {view! {<td>{data.description.clone()}</td>}.into_any()}
|
||||
else {view! {<td></td>}.into_any()} }
|
||||
<td>{data.price.to_string()}</td>
|
||||
<td>
|
||||
<div class="dropdown">
|
||||
@@ -87,11 +87,11 @@ pub fn properties() -> impl IntoView {
|
||||
}}
|
||||
</For>
|
||||
</tbody>
|
||||
}
|
||||
}.into_any()
|
||||
},
|
||||
ApiResponse::Error(s) => {
|
||||
view! {<tbody class="table-border-bottom-0">
|
||||
<tr><td colspan=4>{trl(&s)}</td></tr></tbody>}
|
||||
<tr><td colspan=4>{trl(&s)}</td></tr></tbody>}.into_any()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use leptos::*;
|
||||
use leptos::prelude::*;
|
||||
use crate::backend::data::ResProperty;
|
||||
use crate::backend::property::DeleteProperty;
|
||||
use crate::components::data_form::QuestionDialog;
|
||||
@@ -7,7 +7,7 @@ use crate::locales::trl;
|
||||
|
||||
#[component]
|
||||
pub fn property_delete(property: ReadSignal<ResProperty>, opener: DialogOpener) -> impl IntoView {
|
||||
let del_property = create_server_action::<DeleteProperty>();
|
||||
let del_property = ServerAction::<DeleteProperty>::new();
|
||||
|
||||
view! {
|
||||
<QuestionDialog opener=opener action=del_property title="Delete property">
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use leptos::*;
|
||||
use leptos::prelude::*;
|
||||
use crate::backend::data::{ResProperty, SlotType};
|
||||
use crate::backend::property::{CreateProperty, EditProperty};
|
||||
use crate::components::data_form::DataForm;
|
||||
@@ -7,7 +7,7 @@ use crate::locales::trl;
|
||||
|
||||
#[component]
|
||||
fn form_inner(property: ReadSignal<ResProperty>) -> impl IntoView {
|
||||
let active_str = create_rw_signal("false".to_string());
|
||||
let active_str = RwSignal::new("false".to_string());
|
||||
view! {
|
||||
<input type="hidden" prop:value={move || property.get().id()} name="property[id]"/>
|
||||
<div class="row">
|
||||
@@ -79,9 +79,9 @@ fn form_inner(property: ReadSignal<ResProperty>) -> impl IntoView {
|
||||
<input type="hidden" prop:value=active_str name="property[active]"/>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
}.into_any()
|
||||
} else {
|
||||
view! {<div></div>}
|
||||
view! {<div></div>}.into_any()
|
||||
}
|
||||
}
|
||||
}}
|
||||
@@ -89,19 +89,19 @@ fn form_inner(property: ReadSignal<ResProperty>) -> impl IntoView {
|
||||
|
||||
#[component]
|
||||
pub fn property_edit(property: ReadSignal<ResProperty>, edit: bool, opener: DialogOpener) -> impl IntoView {
|
||||
let action_create = create_server_action::<CreateProperty>();
|
||||
let action_edit = create_server_action::<EditProperty>();
|
||||
let action_create = ServerAction::<CreateProperty>::new();
|
||||
let action_edit = ServerAction::<EditProperty>::new();
|
||||
|
||||
view! {
|
||||
{move ||
|
||||
if edit {
|
||||
view! {<DataForm opener=opener action=action_edit title="Edit property">
|
||||
<FormInner property=property/>
|
||||
</DataForm>}}
|
||||
</DataForm>}.into_any()}
|
||||
else {
|
||||
view! {<DataForm opener=opener action=action_create title="Create property">
|
||||
<FormInner property=property/>
|
||||
</DataForm>}}
|
||||
</DataForm>}.into_any()}
|
||||
}
|
||||
}
|
||||
}
|
||||
+31
-29
@@ -1,7 +1,8 @@
|
||||
use chrono::{Duration, Local, NaiveDate, NaiveTime, Timelike};
|
||||
use leptos::*;
|
||||
use leptos::prelude::*;
|
||||
use leptos_captcha::{Captcha, pow_dispatch};
|
||||
use leptos_router::*;
|
||||
use leptos::form::{ActionForm, FromFormData};
|
||||
use leptos::ev::SubmitEvent;
|
||||
use rust_decimal::Decimal;
|
||||
use crate::backend::appearance::get_appearance;
|
||||
use crate::backend::customer::get_remembered;
|
||||
@@ -36,7 +37,7 @@ fn time_selector(
|
||||
match property.slot {
|
||||
SlotType::Quarter => {
|
||||
let mut ret: Vec<TmCheck> = vec![];
|
||||
logging::log!("quarter");
|
||||
leptos::logging::log!("quarter");
|
||||
for n in 0..(h.to() - h.from()).num_minutes() * 4 / 60 {
|
||||
ret.push(TmCheck {
|
||||
from: h.from() + Duration::minutes(n * 15),
|
||||
@@ -47,7 +48,7 @@ fn time_selector(
|
||||
}
|
||||
SlotType::Half => {
|
||||
let mut ret: Vec<TmCheck> = vec![];
|
||||
logging::log!("half");
|
||||
leptos::logging::log!("half");
|
||||
for n in 0..(h.to() - h.from()).num_minutes() * 2 / 60 {
|
||||
ret.push(TmCheck {
|
||||
from: h.from() + Duration::minutes(n * 30),
|
||||
@@ -110,22 +111,22 @@ fn time_selector(
|
||||
|
||||
#[component]
|
||||
pub fn Public() -> impl IntoView {
|
||||
let day = create_rw_signal(NaiveDate::default());
|
||||
let form_data = create_blocking_resource(move || day.get(), move |d| get_public_form_data(d));
|
||||
let slots = create_rw_signal::<Vec<String>>(vec![]);
|
||||
let price = create_rw_signal(Decimal::from(0));
|
||||
let cr_reservation = create_server_action::<CreateReservation>();
|
||||
let day = RwSignal::new(NaiveDate::default());
|
||||
let form_data = Resource::new_blocking(move || day.get(), move |d| get_public_form_data(d));
|
||||
let slots = RwSignal::<Vec<String>>::new(vec![]);
|
||||
let price = RwSignal::new(Decimal::from(0));
|
||||
let cr_reservation = ServerAction::<CreateReservation>::new();
|
||||
let validator = Validator::new();
|
||||
let invalid_dlg = DialogOpener::new();
|
||||
let result_dlg = DialogOpener::new();
|
||||
let result = cr_reservation.value();
|
||||
let is_pending = create_rw_signal(None);
|
||||
let active_str = create_rw_signal("true".to_string());
|
||||
let get_customer = create_blocking_resource(||(), move |_| get_remembered());
|
||||
let appearance = create_blocking_resource(||(), move |_| get_appearance());
|
||||
let customer = create_rw_signal(Customer::default());
|
||||
let result = Signal::derive(move || cr_reservation.value().get());
|
||||
let is_pending = RwSignal::new(None);
|
||||
let active_str = RwSignal::new("true".to_string());
|
||||
let get_customer = Resource::new_blocking(||(), move |_| get_remembered());
|
||||
let appearance = Resource::new_blocking(||(), move |_| get_appearance());
|
||||
let customer = RwSignal::new(Customer::default());
|
||||
|
||||
create_effect(move |_| {
|
||||
Effect::new(move |_| {
|
||||
day.set(Local::now().date_naive());
|
||||
});
|
||||
|
||||
@@ -139,36 +140,37 @@ pub fn Public() -> impl IntoView {
|
||||
captcha_state=is_pending.read_only()/>
|
||||
|
||||
<Transition fallback=move || view! {<p>{trl("Loading...")}</p> }>
|
||||
{
|
||||
{move || {
|
||||
appearance.get().map(|a| match a {
|
||||
Ok(a) => {
|
||||
let app = a.clone();
|
||||
let has_banner = a.banner.is_some();
|
||||
let title = a.title.clone().unwrap_or_default();
|
||||
view! {
|
||||
<div>
|
||||
<Show when=move || a.clone().banner.is_some()>
|
||||
<Show when=move || has_banner>
|
||||
<div class="header_banner">
|
||||
<h1 class="header_banner">{app.title.clone().unwrap_or_default()}</h1>
|
||||
<h1 class="header_banner">{title.clone()}</h1>
|
||||
</div>
|
||||
</Show>
|
||||
<div>
|
||||
<div class="header_banner_text" inner_html={app.text.unwrap_or("".to_string())}>
|
||||
<div class="header_banner_text" inner_html={a.text.unwrap_or("".to_string())}>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
}.into_any()
|
||||
},
|
||||
Err(e) => {view! {<div><p>{trl("Error loading data")}</p>
|
||||
<p>{e.to_string()}</p></div>
|
||||
}}
|
||||
}.into_any()}
|
||||
})
|
||||
}
|
||||
}}
|
||||
</Transition>
|
||||
|
||||
<div class="card-body">
|
||||
<ActionForm
|
||||
on:submit=move |ev| {
|
||||
cr_reservation.set_pending(true);
|
||||
// Capture phase, so the form is validated and the captcha solved before it is dispatched
|
||||
on:submit:capture=move |ev: SubmitEvent| {
|
||||
if let Ok(mut act) = CreateReservation::from_event(&ev) {
|
||||
validator.check(act.entity(), &ev);
|
||||
|
||||
@@ -219,7 +221,7 @@ pub fn Public() -> impl IntoView {
|
||||
});
|
||||
form_data.get().map(|u| match u {
|
||||
Err(e) => {
|
||||
view! {<div>{e.to_string()}</div>}}
|
||||
view! {<div>{e.to_string()}</div>}.into_any()}
|
||||
Ok(u) => {
|
||||
match u {
|
||||
ApiResponse::Data(p) => {
|
||||
@@ -252,10 +254,10 @@ pub fn Public() -> impl IntoView {
|
||||
value={data}/>
|
||||
</For>
|
||||
</div>
|
||||
}
|
||||
}.into_any()
|
||||
},
|
||||
ApiResponse::Error(s) => {
|
||||
view! {<div>{trl(&s)}</div>}
|
||||
view! {<div>{trl(&s)}</div>}.into_any()
|
||||
}
|
||||
}}
|
||||
})
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
use chrono::{Local, NaiveDate};
|
||||
use leptos::*;
|
||||
use leptos::prelude::*;
|
||||
use rust_decimal::Decimal;
|
||||
use crate::backend::data::ApiResponse;
|
||||
use crate::components::modal_box::{DialogOpener, ModalBody, ModalDialog, ModalFooter};
|
||||
@@ -29,7 +29,8 @@ pub fn res_error(opener: DialogOpener, validator: Validator) -> impl IntoView {
|
||||
#[component]
|
||||
pub fn res_saved(
|
||||
opener: DialogOpener,
|
||||
save_result: RwSignal<Option<Result<ApiResponse<NaiveDate>, ServerFnError>>>,
|
||||
#[prop(into)]
|
||||
save_result: Signal<Option<Result<ApiResponse<NaiveDate>, ServerFnError>>>,
|
||||
day: RwSignal<NaiveDate>,
|
||||
price: WriteSignal<Decimal>,
|
||||
slots: WriteSignal<Vec<String>>,
|
||||
@@ -68,7 +69,7 @@ pub fn res_saved(
|
||||
</ModalFooter>
|
||||
</ModalDialog>
|
||||
</div>
|
||||
}
|
||||
}.into_any()
|
||||
},
|
||||
ApiResponse::Error(err) => {
|
||||
view! {
|
||||
@@ -88,7 +89,7 @@ pub fn res_saved(
|
||||
</ModalFooter>
|
||||
</ModalDialog>
|
||||
</div>
|
||||
}
|
||||
}.into_any()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -110,11 +111,11 @@ pub fn res_saved(
|
||||
</ModalFooter>
|
||||
</ModalDialog>
|
||||
</div>
|
||||
}
|
||||
}.into_any()
|
||||
}
|
||||
}
|
||||
} else {
|
||||
view! {<div></div>}
|
||||
view! {<div></div>}.into_any()
|
||||
}
|
||||
}}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use leptos::*;
|
||||
use leptos::prelude::*;
|
||||
use crate::locales::trl;
|
||||
use crate::pages::closing_days::ClosingDays;
|
||||
use crate::pages::company_info::CompanyInfo;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use leptos::*;
|
||||
use leptos::prelude::*;
|
||||
use crate::backend::data::{ApiResponse, ResSumWithItems};
|
||||
use crate::backend::reservation::get_next_reservations;
|
||||
use crate::components::modal_box::DialogOpener;
|
||||
@@ -9,9 +9,9 @@ use crate::pages::new_reservations::CancelDialog;
|
||||
|
||||
#[component]
|
||||
pub fn next_reservations(app_opener: DialogOpener, cancel_opener: DialogOpener) -> impl IntoView {
|
||||
let res = create_blocking_resource( move || app_opener.visible() || cancel_opener.visible(), move |_| get_next_reservations());
|
||||
let res = Resource::new_blocking( move || app_opener.visible() || cancel_opener.visible(), move |_| get_next_reservations());
|
||||
let menu = MenuOpener::new();
|
||||
let reservation = create_rw_signal(ResSumWithItems::default());
|
||||
let reservation = RwSignal::new(ResSumWithItems::default());
|
||||
|
||||
view! {
|
||||
<CancelDialog opener=cancel_opener reservation=reservation.read_only()/>
|
||||
@@ -22,7 +22,7 @@ pub fn next_reservations(app_opener: DialogOpener, cancel_opener: DialogOpener)
|
||||
{move || {
|
||||
res.get().map(|r| match r {
|
||||
Err(e) => {
|
||||
view! {<div>{trl("Something went wrong")}<br/>{e.to_string()}</div>}}
|
||||
view! {<div>{trl("Something went wrong")}<br/>{e.to_string()}</div>}.into_any()}
|
||||
Ok(r) => { match r {
|
||||
ApiResponse::Data(r) => {
|
||||
view! {
|
||||
@@ -40,7 +40,7 @@ pub fn next_reservations(app_opener: DialogOpener, cancel_opener: DialogOpener)
|
||||
let:item>
|
||||
{item.property.name}": "{item.reservation.from.to_string()}" - "{item.reservation.to.to_string()}<br/>
|
||||
</For>
|
||||
{trl("Customer: ")}{data.customer.full_name}", "<a href={format!("mailto:{}", data.customer.email)}>{data.customer.email}</a>", "{data.customer.phone}<br/>
|
||||
{trl("Customer: ")}{data.customer.full_name}", "<a href={format!("mailto:{}", data.customer.email)}>{data.customer.email.clone()}</a>", "{data.customer.phone}<br/>
|
||||
{move || {
|
||||
let note = data.summary.note.clone();
|
||||
let show = note.is_some() && !note.clone().unwrap().is_empty();
|
||||
@@ -51,7 +51,7 @@ pub fn next_reservations(app_opener: DialogOpener, cancel_opener: DialogOpener)
|
||||
}
|
||||
}}
|
||||
{trl("Price: ")}{data.summary.price.to_string()}<br/>
|
||||
<table width="100%">
|
||||
<table style="width: 100%"><tbody>
|
||||
<tr>
|
||||
<td width="100%"></td>
|
||||
<td>
|
||||
@@ -72,15 +72,15 @@ pub fn next_reservations(app_opener: DialogOpener, cancel_opener: DialogOpener)
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</tbody></table>
|
||||
<hr/>
|
||||
}
|
||||
}}
|
||||
</For>
|
||||
</div>
|
||||
}
|
||||
}.into_any()
|
||||
}
|
||||
ApiResponse::Error(e) => {view! {<div>{trl(&e)}</div>}}}
|
||||
ApiResponse::Error(e) => {view! {<div>{trl(&e)}</div>}.into_any()}}
|
||||
}
|
||||
})
|
||||
}}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use leptos::*;
|
||||
use leptos::prelude::*;
|
||||
use crate::backend::data::User;
|
||||
use crate::backend::user::DeleteUser;
|
||||
use crate::components::data_form::QuestionDialog;
|
||||
@@ -7,7 +7,7 @@ use crate::locales::trl;
|
||||
|
||||
#[component]
|
||||
pub fn user_delete(user: ReadSignal<User>, opener: DialogOpener) -> impl IntoView {
|
||||
let del_user = create_server_action::<DeleteUser>();
|
||||
let del_user = ServerAction::<DeleteUser>::new();
|
||||
|
||||
view! {
|
||||
<QuestionDialog opener=opener action=del_user title="Delete user">
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use leptos::*;
|
||||
use leptos::prelude::*;
|
||||
use crate::backend::user::CreateUser;
|
||||
use crate::components::data_form::DataForm;
|
||||
use crate::components::modal_box::DialogOpener;
|
||||
@@ -6,7 +6,7 @@ use crate::locales::trl;
|
||||
|
||||
#[component]
|
||||
pub fn user_edit(opener: DialogOpener) -> impl IntoView {
|
||||
let create_usr = create_server_action::<CreateUser>();
|
||||
let create_usr = ServerAction::<CreateUser>::new();
|
||||
view! {
|
||||
<DataForm opener=opener action=create_usr title="Create user">
|
||||
//<input type="hidden" value={move || company.get().id()} name="company[id]"/>
|
||||
|
||||
+14
-14
@@ -1,4 +1,4 @@
|
||||
use leptos::*;
|
||||
use leptos::prelude::*;
|
||||
use crate::backend::data::{ApiResponse, User};
|
||||
use crate::backend::user::get_users;
|
||||
use crate::components::modal_box::DialogOpener;
|
||||
@@ -16,10 +16,10 @@ pub fn users() -> impl IntoView {
|
||||
let profile_editor = DialogOpener::new();
|
||||
let pwd_dialog = DialogOpener::new();
|
||||
let delete_dialog = DialogOpener::new();
|
||||
let users = create_blocking_resource(
|
||||
let users = Resource::new_blocking(
|
||||
move || editor.visible() || profile_editor.visible() || delete_dialog.visible(), move |_| {get_users()});
|
||||
let (usr, set_usr) = create_signal::<Vec<User>>(vec![]);
|
||||
let (profile, set_profile) = create_signal(User::default());
|
||||
let (usr, set_usr) = signal::<Vec<User>>(vec![]);
|
||||
let (profile, set_profile) = signal(User::default());
|
||||
let is_wide = use_media_query("(min-width: 500px)");
|
||||
|
||||
view! {
|
||||
@@ -35,8 +35,8 @@ pub fn users() -> impl IntoView {
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{trl("Username")}</th>
|
||||
{move || if is_wide.get() {view! {<th>{trl("Full name")}</th>}}
|
||||
else {view! {<th></th>}} }
|
||||
{move || if is_wide.get() {view! {<th>{trl("Full name")}</th>}.into_any()}
|
||||
else {view! {<th></th>}.into_any()} }
|
||||
<th>{trl("Admin")}</th>
|
||||
<th>{trl("Actions")}</th>
|
||||
</tr>
|
||||
@@ -50,7 +50,7 @@ pub fn users() -> impl IntoView {
|
||||
e.to_string()
|
||||
};
|
||||
view! {<tbody class="table-border-bottom-0">
|
||||
<tr><td colspan=4>{trl(&err)}</td></tr></tbody>}}
|
||||
<tr><td colspan=4>{trl(&err)}</td></tr></tbody>}.into_any()}
|
||||
Ok(u) => {
|
||||
match u {
|
||||
ApiResponse::Data(u) => {
|
||||
@@ -66,11 +66,11 @@ pub fn users() -> impl IntoView {
|
||||
let full_name = user.full_name.clone().unwrap_or("".to_string());
|
||||
view! {
|
||||
<tr>
|
||||
<td>{&user.login}</td>
|
||||
{move || if is_wide.get() {view! {<td>{full_name.clone()}</td>}}
|
||||
else {view! {<td></td>}} }
|
||||
<td>{if user.admin {view! {<i class="bx bx-check"></i>}}
|
||||
else {view! {<i></i>}}}</td>
|
||||
<td>{user.login.clone()}</td>
|
||||
{move || if is_wide.get() {view! {<td>{full_name.clone()}</td>}.into_any()}
|
||||
else {view! {<td></td>}.into_any()} }
|
||||
<td>{if user.admin {view! {<i class="bx bx-check"></i>}.into_any()}
|
||||
else {view! {<i></i>}.into_any()}}</td>
|
||||
<td>
|
||||
<div class="dropdown">
|
||||
<button type="button" class="btn p-0 dropdown-toggle hide-arrow"
|
||||
@@ -101,10 +101,10 @@ pub fn users() -> impl IntoView {
|
||||
</tr>
|
||||
}
|
||||
}/></tbody>
|
||||
}
|
||||
}.into_any()
|
||||
}
|
||||
ApiResponse::Error(e) => {view! {<tbody class="table-border-bottom-0">
|
||||
<tr><td colspan=4>{trl(&e)}</td></tr></tbody>}}
|
||||
<tr><td colspan=4>{trl(&e)}</td></tr></tbody>}.into_any()}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user