1
0

crm2.rs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /*
  2. Tiny CRM: A port of the Yew CRM example to Dioxus.
  3. */
  4. use dioxus_core as dioxus;
  5. use dioxus_core::prelude::*;
  6. use dioxus_core_macro::*;
  7. use dioxus_hooks::*;
  8. use dioxus_html as dioxus_elements;
  9. fn main() {
  10. // Setup logging
  11. wasm_logger::init(wasm_logger::Config::new(log::Level::Debug));
  12. console_error_panic_hook::set_once();
  13. dioxus_web::launch(App)
  14. }
  15. enum Scene {
  16. ClientsList,
  17. NewClientForm,
  18. Settings,
  19. }
  20. #[derive(Clone, Debug, Default)]
  21. pub struct Client {
  22. pub first_name: String,
  23. pub last_name: String,
  24. pub description: String,
  25. }
  26. static App: Component = |cx| {
  27. let scene = use_state(&cx, || Scene::ClientsList);
  28. let clients = use_ref(&cx, || vec![] as Vec<Client>);
  29. let firstname = use_state(&cx, || String::new());
  30. let lastname = use_state(&cx, || String::new());
  31. let description = use_state(&cx, || String::new());
  32. let scene = match *scene {
  33. Scene::ClientsList => {
  34. rsx!(cx, div { class: "crm"
  35. h2 { "List of clients" margin_bottom: "10px" }
  36. div { class: "clients" margin_left: "10px"
  37. {clients.read().iter().map(|client| rsx!(
  38. div { class: "client" style: "margin-bottom: 50px"
  39. p { "First Name: {client.first_name}" }
  40. p { "Last Name: {client.last_name}" }
  41. p {"Description: {client.description}"}
  42. })
  43. )}
  44. }
  45. button { class: "pure-button pure-button-primary" onclick: move |_| scene.set(Scene::NewClientForm), "Add New" }
  46. button { class: "pure-button" onclick: move |_| scene.set(Scene::Settings), "Settings" }
  47. })
  48. }
  49. Scene::NewClientForm => {
  50. let add_new = move |_| {
  51. clients.write().push(Client {
  52. description: (*description).clone(),
  53. first_name: (*firstname).clone(),
  54. last_name: (*lastname).clone(),
  55. });
  56. description.set(String::new());
  57. firstname.set(String::new());
  58. lastname.set(String::new());
  59. };
  60. rsx!(cx, div { class: "crm"
  61. h2 {"Add new client" margin_bottom: "10px" }
  62. form { class: "pure-form"
  63. input { class: "new-client firstname" placeholder: "First name" value: "{firstname}"
  64. oninput: move |evt| firstname.set(evt.value.clone())
  65. }
  66. input { class: "new-client lastname" placeholder: "Last name" value: "{lastname}"
  67. oninput: move |evt| lastname.set(evt.value.clone())
  68. }
  69. textarea { class: "new-client description" placeholder: "Description" value: "{description}"
  70. oninput: move |evt| description.set(evt.value.clone())
  71. }
  72. }
  73. button { class: "pure-button pure-button-primary", onclick: {add_new}, "Add New" }
  74. button { class: "pure-button", onclick: move |_| scene.set(Scene::ClientsList), "Go Back" }
  75. })
  76. }
  77. Scene::Settings => {
  78. rsx!(cx, div {
  79. h2 { "Settings" margin_bottom: "10px" }
  80. button {
  81. background: "rgb(202, 60, 60)"
  82. class: "pure-button pure-button-primary"
  83. onclick: move |_| {
  84. clients.write().clear();
  85. scene.set(Scene::ClientsList);
  86. },
  87. "Remove all clients"
  88. }
  89. button {
  90. class: "pure-button pure-button-primary"
  91. onclick: move |_| scene.set(Scene::ClientsList),
  92. "Go Back"
  93. }
  94. })
  95. }
  96. };
  97. rsx!(cx, body {
  98. link {
  99. rel: "stylesheet"
  100. href: "https://unpkg.com/purecss@2.0.6/build/pure-min.css"
  101. integrity: "sha384-Uu6IeWbM+gzNVXJcM9XV3SohHtmWE+3VGi496jvgX1jyvDTXfdK+rfZc8C1Aehk5"
  102. crossorigin: "anonymous"
  103. }
  104. margin_left: "35%"
  105. h1 {"Dioxus CRM Example"}
  106. {scene}
  107. })
  108. };