crm.rs 4.1 KB

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