123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- //! Tiny CRM: A port of the Yew CRM example to Dioxus.
- use dioxus::prelude::*;
- use dioxus_router::prelude::*;
- fn main() {
- dioxus_desktop::launch(App);
- }
- #[derive(Routable, Clone)]
- #[rustfmt::skip]
- enum Route {
- #[route("/")]
- ClientList {},
- #[route("/new")]
- ClientAdd {},
- #[route("/settings")]
- Settings {},
- }
- #[derive(Clone, Debug, Default)]
- pub struct Client {
- pub first_name: String,
- pub last_name: String,
- pub description: String,
- }
- type ClientContext = Vec<Client>;
- #[component]
- fn App(cx: Scope) -> Element {
- use_shared_state_provider::<ClientContext>(cx, Default::default);
- render! {
- link {
- rel: "stylesheet",
- href: "https://unpkg.com/purecss@2.0.6/build/pure-min.css",
- integrity: "sha384-Uu6IeWbM+gzNVXJcM9XV3SohHtmWE+3VGi496jvgX1jyvDTXfdK+rfZc8C1Aehk5",
- crossorigin: "anonymous",
- }
- style { "
- .red {{
- background-color: rgb(202, 60, 60) !important;
- }}
- " }
- h1 { "Dioxus CRM Example" }
- Router::<Route> {}
- }
- }
- #[component]
- fn ClientList(cx: Scope) -> Element {
- let clients = use_shared_state::<ClientContext>(cx).unwrap();
- cx.render(rsx! {
- h2 { "List of Clients" }
- Link {
- to: Route::ClientAdd {},
- class: "pure-button pure-button-primary",
- "Add Client"
- }
- Link {
- to: Route::Settings {},
- class: "pure-button",
- "Settings"
- }
- clients.read().iter().map(|client| rsx! {
- div {
- class: "client",
- style: "margin-bottom: 50px",
- p { "Name: {client.first_name} {client.last_name}" }
- p { "Description: {client.description}" }
- }
- })
- })
- }
- #[component]
- fn ClientAdd(cx: Scope) -> Element {
- let clients = use_shared_state::<ClientContext>(cx).unwrap();
- let first_name = use_state(cx, String::new);
- let last_name = use_state(cx, String::new);
- let description = use_state(cx, String::new);
- cx.render(rsx! {
- h2 { "Add new Client" }
- form {
- class: "pure-form pure-form-aligned",
- onsubmit: move |_| {
- let mut clients = clients.write();
- clients.push(Client {
- first_name: first_name.to_string(),
- last_name: last_name.to_string(),
- description: description.to_string(),
- });
- dioxus_router::router().push(Route::ClientList {});
- },
- fieldset {
- div {
- class: "pure-control-group",
- label {
- "for": "first_name",
- "First Name"
- }
- input {
- id: "first_name",
- "type": "text",
- placeholder: "First Name…",
- required: "",
- value: "{first_name}",
- oninput: move |e| first_name.set(e.value.clone())
- }
- }
- div {
- class: "pure-control-group",
- label {
- "for": "last_name",
- "Last Name"
- }
- input {
- id: "last_name",
- "type": "text",
- placeholder: "Last Name…",
- required: "",
- value: "{last_name}",
- oninput: move |e| last_name.set(e.value.clone())
- }
- }
- div {
- class: "pure-control-group",
- label {
- "for": "description",
- "Description"
- }
- textarea {
- id: "description",
- placeholder: "Description…",
- value: "{description}",
- oninput: move |e| description.set(e.value.clone())
- }
- }
- div {
- class: "pure-controls",
- button {
- "type": "submit",
- class: "pure-button pure-button-primary",
- "Save"
- }
- Link {
- to: Route::ClientList {},
- class: "pure-button pure-button-primary red",
- "Cancel"
- }
- }
- }
- }
- })
- }
- #[component]
- fn Settings(cx: Scope) -> Element {
- let clients = use_shared_state::<ClientContext>(cx).unwrap();
- cx.render(rsx! {
- h2 { "Settings" }
- button {
- class: "pure-button pure-button-primary red",
- onclick: move |_| {
- let mut clients = clients.write();
- clients.clear();
- },
- "Remove all Clients"
- }
- Link {
- to: Route::ClientList {},
- class: "pure-button",
- "Go back"
- }
- })
- }
|