Added the ability to view all members

This commit is contained in:
xeovalyte 2024-09-20 21:36:48 +02:00
parent ba7b6399e1
commit 122b420541
Signed by: xeovalyte
SSH Key Fingerprint: SHA256:kSQDrQDmKzljJzfGYcd3m9RqHi4h8rSwkZ3sQ9kBURo
6 changed files with 114 additions and 6 deletions

View File

@ -774,6 +774,12 @@ html {
--tw-bg-opacity: 1;
background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));
}
.table-zebra tr.hover:hover,
.table-zebra tr.hover:nth-child(even):hover {
--tw-bg-opacity: 1;
background-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));
}
}
.btn {
@ -1353,6 +1359,11 @@ input.tab:checked + .tab-content,
background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));
}
.table-zebra tbody tr:nth-child(even) :where(.table-pin-cols tr th) {
--tw-bg-opacity: 1;
background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));
}
.btm-nav > *.disabled,
.btm-nav > *[disabled] {
pointer-events: none;
@ -2075,6 +2086,13 @@ input.tab:checked + .tab-content,
background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));
}
.table-zebra tr.active,
.table-zebra tr.active:nth-child(even),
.table-zebra-zebra tbody tr:nth-child(even) {
--tw-bg-opacity: 1;
background-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));
}
.table :where(thead tr, tbody tr:not(:last-child), tbody tr:first-child:last-child) {
border-bottom-width: 1px;
--tw-border-opacity: 1;
@ -2389,6 +2407,10 @@ input.tab:checked + .tab-content,
width: 100%;
}
.max-w-4xl {
max-width: 56rem;
}
.max-w-lg {
max-width: 32rem;
}
@ -2445,6 +2467,10 @@ input.tab:checked + .tab-content,
overflow: auto;
}
.overflow-x-auto {
overflow-x: auto;
}
.overflow-y-auto {
overflow-y: auto;
}
@ -2496,6 +2522,11 @@ input.tab:checked + .tab-content,
line-height: 2rem;
}
.text-lg {
font-size: 1.125rem;
line-height: 1.75rem;
}
.text-xl {
font-size: 1.25rem;
line-height: 1.75rem;
@ -2523,3 +2554,7 @@ input.tab:checked + .tab-content,
.filter {
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
}
.hover\:cursor-pointer:hover {
cursor: pointer;
}

View File

@ -1 +1,70 @@
pub mod migration;
use dioxus::prelude::*;
use crate::util::model::member::Member;
pub fn Members() -> Element {
let members = use_resource(fetch_members);
rsx! {
div {
class: "flex justify-center",
div {
class: "max-w-4xl w-full",
h2 { class: "font-bold text-lg", "Leden" },
match &*members.read_unchecked() {
Some(Ok(res)) => rsx! {
div {
class: "overflow-x-auto",
table {
class: "table table-zebra table-pin-rows",
thead {
tr {
th { "Relatiecode" }
th { "Naam" }
th { "Registratiecode" }
}
}
tbody {
for member in res {
MemberRow { member: member.clone() }
}
}
}
}
},
Some(Err(_)) => rsx! { div { "Error while loading members" } },
None => rsx! { div { "Loading..." } },
}
}
}
}
}
#[derive(Props, Clone, PartialEq)]
struct MemberRowProps {
member: Member,
}
fn MemberRow(props: MemberRowProps) -> Element {
let registration_token = props
.member
.registration_token
.unwrap_or("None".to_string());
rsx! {
tr {
class: "hover hover:cursor-pointer",
th { "{props.member.id}" }
td { "{props.member.name.full}" }
td { "{registration_token}" }
}
}
}
#[server]
async fn fetch_members() -> Result<Vec<Member>, ServerFnError> {
let members = Member::fetch_all().await?;
Ok(members)
}

View File

@ -35,5 +35,6 @@ pub fn Global() -> Element {
#[server]
async fn get_user_from_cookie() -> Result<(), ServerFnError> {
Err(ServerFnError::new("Not authenticated"))
// Err(ServerFnError::new("Not authenticated"))
Ok(())
}

View File

@ -68,7 +68,7 @@ fn Login() -> Element {
div {
class: "card-actions mt-8",
button {
class: "btn btn-wide btn-primary",
class: "btn btn-primary",
"Inloggen"
}
}

View File

@ -8,6 +8,7 @@ use tracing::Level;
// Use routes
use components::admin::members::migration::Migration;
use components::admin::members::Members;
use components::agenda::Agenda;
use components::home::Home;
use components::layout::Global;
@ -25,6 +26,8 @@ pub enum Route {
News {},
#[route("/settings")]
Settings {},
#[route("/admin/members")]
Members {},
#[route("/admin/members/migration")]
Migration {},
}

View File

@ -3,7 +3,7 @@ use crate::util::surrealdb::DB;
use super::{Member, MembersMigration};
use once_cell::sync::Lazy;
use std::collections::{BTreeSet, HashMap};
use std::collections::HashMap;
use tokio::sync::Mutex;
// Create a store for saving information when migrating to a new members list
@ -168,7 +168,7 @@ impl MembersMigration {
hours: new_member_clone.hours,
groups: current_member.groups,
diploma: new_member_clone.diploma,
registration_token: current_member.diploma,
registration_token: current_member.registration_token,
})
} else {
// Remove member
@ -178,7 +178,6 @@ impl MembersMigration {
for new_member in new_members_list {
// Insert new member
// TODO Generate registration token
if !current_members_map.contains_key(&new_member.id) {
inserted_members.push(new_member);
}
@ -229,9 +228,10 @@ impl MembersMigration {
for member in members_migration.inserted.clone() {
// TODO add hours and diploma support
query = query
+ format!(
"CREATE member:{} SET name.first = \"{}\", name.full = \"{}\", hours = {:?}, groups = {:?};",
"CREATE member:{} SET name.first = \"{}\", name.full = \"{}\", hours = {:?}, groups = {:?}, registration_token = rand::string(16);",
member.id, member.name.first, member.name.full, member.hours, member.groups
)
.as_str();