crm.rs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /*
  2. Tiny CRM: A port of the Yew CRM example to Dioxus.
  3. */
  4. use dioxus::prelude::*;
  5. fn main() {
  6. dioxus::web::launch(App, |c| c);
  7. }
  8. enum Scene {
  9. ClientsList,
  10. NewClientForm,
  11. Settings,
  12. }
  13. #[derive(Clone, Debug, Default)]
  14. pub struct Client {
  15. pub first_name: String,
  16. pub last_name: String,
  17. pub description: String,
  18. }
  19. static App: FC<()> = |cx, _| {
  20. let scene = use_state(cx, || Scene::ClientsList);
  21. let clients = use_ref(cx, || vec![] as Vec<Client>);
  22. let firstname = use_state(cx, || String::new());
  23. let lastname = use_state(cx, || String::new());
  24. let description = use_state(cx, || String::new());
  25. match *scene {
  26. Scene::ClientsList => {
  27. rsx!(cx, div { class: "crm"
  28. h1 { "List of clients" }
  29. div { class: "clients" {clients.read().iter().map(|client| rsx!(
  30. div { class: "client" style: "margin-bottom: 50px"
  31. p { "First Name: {client.first_name}" }
  32. p { "Last Name: {client.last_name}" }
  33. p {"Description: {client.description}"}
  34. }))}
  35. }
  36. button { onclick: move |_| scene.set(Scene::NewClientForm), "Add New" }
  37. button { onclick: move |_| scene.set(Scene::Settings), "Settings" }
  38. })
  39. }
  40. Scene::NewClientForm => {
  41. rsx!(cx, div { class: "crm"
  42. h1 {"Add new client"}
  43. div { class: "names"
  44. input { class: "new-client firstname" placeholder: "First name"
  45. onchange: move |e| firstname.set(e.value())
  46. }
  47. input { class: "new-client lastname" placeholder: "Last name"
  48. onchange: move |e| lastname.set(e.value())
  49. }
  50. textarea { class: "new-client description" placeholder: "Description"
  51. onchange: move |e| description.set(e.value())
  52. }
  53. }
  54. button { disabled: "false", onclick: move |_| clients.write().push(Client {
  55. description: (*description).clone(),
  56. first_name: (*firstname).clone(),
  57. last_name: (*lastname).clone(),
  58. }), "Add New" }
  59. button { onclick: move |_| scene.set(Scene::ClientsList), "Go Back" }
  60. })
  61. }
  62. Scene::Settings => {
  63. rsx!(cx, div {
  64. h1 {"Settings"}
  65. button { onclick: move |_| clients.write().clear() "Remove all clients" }
  66. button { onclick: move |_| scene.set(Scene::ClientsList), "Go Back" }
  67. })
  68. }
  69. }
  70. };