Merge branch 'main' into feature/loaner-app
This commit is contained in:
commit
cb235291f7
32 files changed
+118
-20
No files matched your search
+2
-1
@@ -7,7 +7,7 @@ use leptos_router::{
|
||||
};
|
||||
use url::Url;
|
||||
|
||||
use crate::pages::{AboutPage, HomePage, UnauthenticatedPage};
|
||||
use crate::pages::{AboutPage, HomePage, TestPage, UnauthenticatedPage};
|
||||
|
||||
pub fn shell(options: LeptosOptions) -> impl IntoView {
|
||||
view! {
|
||||
@@ -67,6 +67,7 @@ pub fn App() -> impl IntoView {
|
||||
<Routes fallback=|| "Page not found.".into_view()>
|
||||
<Route path=StaticSegment("") view=HomePage/>
|
||||
<Route path=StaticSegment("about") view=AboutPage/>
|
||||
<Route path=StaticSegment("test_page") view=TestPage/>
|
||||
</Routes>
|
||||
</main>
|
||||
</Router>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use crate::common::ValueType;
|
||||
use crate::components::utils::create_unique_id;
|
||||
use leptos::prelude::*;
|
||||
use std::collections::HashMap;
|
||||
use crate::components::utils::create_unique_id;
|
||||
|
||||
#[component]
|
||||
pub fn Checkbox(
|
||||
@@ -12,7 +12,7 @@ pub fn Checkbox(
|
||||
#[prop(default = RwSignal::new(false))] disabled: RwSignal<bool>,
|
||||
) -> impl IntoView {
|
||||
let id = create_unique_id(&name, &value);
|
||||
|
||||
|
||||
view! {
|
||||
<label for=id class="flex items-center">
|
||||
<input
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
use std::collections::HashMap;
|
||||
use leptos::prelude::*;
|
||||
use crate::common::ValueType;
|
||||
use crate::components::utils::create_unique_id;
|
||||
use leptos::prelude::*;
|
||||
use std::collections::HashMap;
|
||||
|
||||
/// # Chip Component
|
||||
///
|
||||
///
|
||||
/// This component defines a single chip for use in the `ChipsList` component. It functions almost
|
||||
/// identically to the `Checkbox` component. It should only be created from within its parent
|
||||
/// `CheckboxList` component.
|
||||
///
|
||||
///
|
||||
/// Example usage:
|
||||
/// ```
|
||||
/// view! {
|
||||
@@ -33,7 +33,7 @@ pub fn Chip(
|
||||
// Generate a unique id - ensure that the value doesn't contain spaces.
|
||||
// Without this id, checkbox/radio inputs can interfere with each other.
|
||||
let id = create_unique_id(&name, &value);
|
||||
|
||||
|
||||
view! {
|
||||
<label for=id>
|
||||
<input
|
||||
@@ -60,10 +60,10 @@ pub fn Chip(
|
||||
}
|
||||
|
||||
/// # Chips List Component
|
||||
///
|
||||
///
|
||||
/// This defines a list of `Chip` components. The list of values is created based on the data from the
|
||||
/// `data_map` prop, which is found using the given `data_member`.
|
||||
///
|
||||
///
|
||||
/// Any values selected from the list are stored within the `data_map` immediately as part of a callback
|
||||
/// passed to the `on_change` prop for each individual `Chip` component.
|
||||
#[component]
|
||||
@@ -95,7 +95,7 @@ pub fn ChipsList(
|
||||
.contains(&ValueType::String(Some(item_name.clone())))
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
let on_change = {
|
||||
let item_name = value.clone();
|
||||
let data_member = data_member.clone();
|
||||
@@ -127,7 +127,7 @@ pub fn ChipsList(
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
view! {
|
||||
<Chip
|
||||
checked=checked_signal
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
use leptos::prelude::*;
|
||||
use leptos_router::hooks::use_navigate;
|
||||
|
||||
/// # Dashboard Button Component
|
||||
///
|
||||
/// This component displays a large panel-like button that redirects a user to a specified page.
|
||||
/// It's best used on a user dashboard, where multiple instances of the button are present.
|
||||
/// It has a title, a description, and icon
|
||||
///
|
||||
/// Example usage:
|
||||
/// ```
|
||||
/// <div class="p-6 space-y-4 max-w-1/3">
|
||||
/// <DashboardButton
|
||||
/// title="Home Page"
|
||||
/// description="Navigate to Home Page"
|
||||
/// icon="square-user.svg"
|
||||
/// path="/"
|
||||
/// />
|
||||
/// </div>
|
||||
/// ```
|
||||
#[component]
|
||||
pub fn DashboardButton(
|
||||
/// The main label displayed on the button.
|
||||
#[prop(into)]
|
||||
title: String,
|
||||
/// A brief explanatory text that describes the destination page.
|
||||
#[prop(into)]
|
||||
description: String,
|
||||
/// The file path or URL of the icon displayed at the top of the button.
|
||||
#[prop(into)]
|
||||
icon: String,
|
||||
/// The route that the user is navigated to when clicking the button.
|
||||
#[prop(into)]
|
||||
path: String,
|
||||
) -> impl IntoView {
|
||||
let navigate = use_navigate();
|
||||
|
||||
let on_click = move |_| navigate(&path, Default::default());
|
||||
|
||||
view! {
|
||||
<button
|
||||
type="button"
|
||||
class="dashboard-button flex items-start gap-3 rounded-lg border-grey-300 p-6
|
||||
hover:bg-gray-100 transition cursor-pointer w-full text-left
|
||||
shadow-[inset_0_0_6px_rgba(0,0,0,0.12)]"
|
||||
on:click=on_click>
|
||||
|
||||
<div class="flex flex-col">
|
||||
<img src={icon.clone()} class="h-8 w-8" alt="icon"/>
|
||||
<h3 class="font-semibold text-base">
|
||||
{title.clone()}
|
||||
</h3>
|
||||
|
||||
<p class="text-sm text-gray-600 pt-6">
|
||||
{description.clone()}
|
||||
</p>
|
||||
|
||||
</div>
|
||||
</button>
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
mod action_button;
|
||||
mod checkbox;
|
||||
mod chips;
|
||||
mod dashboard_button;
|
||||
mod loading;
|
||||
mod multi_entry;
|
||||
mod panel;
|
||||
@@ -7,10 +9,9 @@ mod radio;
|
||||
mod row;
|
||||
mod select;
|
||||
mod text_field;
|
||||
mod chips;
|
||||
mod utils;
|
||||
|
||||
pub use self::{
|
||||
action_button::*, checkbox::*, loading::*, multi_entry::*, panel::*, radio::*, row::*,
|
||||
select::*, text_field::*, chips::*
|
||||
action_button::*, checkbox::*, chips::*, dashboard_button::*, loading::*, multi_entry::*,
|
||||
panel::*, radio::*, row::*, select::*, text_field::*,
|
||||
};
|
||||
@@ -1,7 +1,7 @@
|
||||
use crate::common::ValueType;
|
||||
use crate::components::utils::create_unique_id;
|
||||
use leptos::prelude::*;
|
||||
use std::collections::HashMap;
|
||||
use crate::components::utils::create_unique_id;
|
||||
|
||||
#[component]
|
||||
pub fn Radio(
|
||||
@@ -12,7 +12,7 @@ pub fn Radio(
|
||||
#[prop(default = RwSignal::new(false))] disabled: RwSignal<bool>,
|
||||
) -> impl IntoView {
|
||||
let id = create_unique_id(&name, &value);
|
||||
|
||||
|
||||
view! {
|
||||
<label for=id class="flex items-center">
|
||||
<input
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
/// Creates a unique ID for use in components like the [`CheckboxList`],
|
||||
/// [`RadioList`], and [`ChipsList`].
|
||||
pub fn create_unique_id(name: &String, value: &String) -> String {
|
||||
let value_no_spaces = value.clone().chars()
|
||||
let value_no_spaces = value
|
||||
.clone()
|
||||
.chars()
|
||||
.filter(|c| !c.is_whitespace())
|
||||
.collect::<String>();
|
||||
format!("{}-{}", name.clone(), value_no_spaces)
|
||||
}
|
||||
}
|
||||
+2
-1
@@ -1,6 +1,7 @@
|
||||
mod about_page;
|
||||
mod home_page;
|
||||
mod test_page;
|
||||
mod unauthenticated_page;
|
||||
mod loaner_page;
|
||||
|
||||
pub use self::{about_page::*, home_page::*, unauthenticated_page::*};
|
||||
pub use self::{about_page::*, home_page::*, test_page::*, unauthenticated_page::*};
|
||||
@@ -0,0 +1,28 @@
|
||||
use crate::components::DashboardButton;
|
||||
use leptos::prelude::*;
|
||||
|
||||
#[component]
|
||||
pub fn TestPage() -> impl IntoView {
|
||||
view! {
|
||||
<div class="p-6 space-y-4 max-w-1/3">
|
||||
<DashboardButton
|
||||
title="Home Page"
|
||||
description="Navigate to Home Page"
|
||||
icon="Book.png"
|
||||
path="/"
|
||||
/>
|
||||
<DashboardButton
|
||||
title="Home Page"
|
||||
description="Navigate to Home Page"
|
||||
icon="Calendar.png"
|
||||
path="/"
|
||||
/>
|
||||
<DashboardButton
|
||||
title="Home Page"
|
||||
description="Navigate to Home Page"
|
||||
icon="Edit.png"
|
||||
path="/"
|
||||
/>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user