use graphql_client::reqwest::post_graphql; use yew::prelude::*; use crate::components; use crate::graphql; use crate::routes::settings::new_user_modal; pub enum Msg { DoneFetching { errors: graphql::Errors, students: Option>, teachers: Option>, }, SwitchTab(UsersTab), OpenModal, CloseModal, } #[derive(Properties, PartialEq, Eq)] pub struct UsersProps { pub token: String, } #[derive(PartialEq, Clone, Debug)] pub enum UsersTab { All, Students, Teachers, } pub struct Users { tab: UsersTab, fetching: bool, errors: graphql::Errors, students: Option>, teachers: Option>, modal_active: bool, } impl Component for Users { type Message = Msg; type Properties = UsersProps; fn create(ctx: &Context) -> Self { let client = graphql::client(Some(&ctx.props().token)).unwrap(); ctx.link().send_future(async move { let students_response = post_graphql::( &client, graphql::URL.as_str(), graphql::queries::users_by_role::students::Variables, ) .await .unwrap(); let teachers_response = post_graphql::( &client, graphql::URL.as_str(), graphql::queries::users_by_role::teachers::Variables, ) .await .unwrap(); let x = [ students_response.errors.map_or_else(|| vec![], |e| e), teachers_response.errors.map_or_else(|| vec![], |e| e), ] .concat(); if x.is_empty() { Msg::DoneFetching { errors: None, students: Some(students_response.data.unwrap().students.unwrap()), teachers: Some(teachers_response.data.unwrap().teachers), } } else { Msg::DoneFetching { errors: graphql::convert(Some(x)), students: None, teachers: None, } } }); Self { tab: UsersTab::All, fetching: true, errors: None, students: None, teachers: None, modal_active: false, } } fn update(&mut self, _ctx: &Context, msg: Self::Message) -> bool { match msg { Msg::DoneFetching { errors, students, teachers, } => { self.fetching = false; self.errors = errors; self.students = students; self.teachers = teachers; true } Msg::SwitchTab(tab) => { if self.tab == tab { false } else { self.tab = tab; true } } Msg::OpenModal => { self.modal_active = true; true } Msg::CloseModal => { self.modal_active = false; true } } } fn view(&self, ctx: &Context) -> Html { html! {
{ "Benutzer" } if self.fetching { } else {
{ match self.tab { UsersTab::All => html! { { for self.students.as_ref().unwrap().iter().map(|s| html! { }) } { for self.teachers.as_ref().unwrap().iter().map(|t| html! { }) }
{ "ID" } { "Nachname" } { "Vorname" } { "Benutzername" } { "Rolle" } { "Externe Rollen-ID" } { "Admin" } { "Gewählt" }
{ &s.user.id } { &s.user.last_name } { &s.user.first_name } { &s.user.username } { match &s.user.role { graphql::queries::users_by_role::students::UserRole::Student => "S", graphql::queries::users_by_role::students::UserRole::Teacher => "T", graphql::queries::users_by_role::students::UserRole::Other(_) => "N/A", } } { &s.id } { if s.user.admin { 1 } else { 0 } } { if s.vote.is_some() { 1 } else { 0 } }
{ &t.user.id } { &t.user.last_name } { &t.user.first_name } { &t.user.username } { match &t.user.role { graphql::queries::users_by_role::teachers::UserRole::Student => "S", graphql::queries::users_by_role::teachers::UserRole::Teacher => "T", graphql::queries::users_by_role::teachers::UserRole::Other(_) => "N/A", } } { &t.id } { if t.user.admin { 1 } else { 0 } } { "N/A" }
}, UsersTab::Students => html! { { for self.students.as_ref().unwrap().iter().map(|s| html! { }) }
{ "ID" } { "Nachname" } { "Vorname" } { "Benutzername" } { "Benutzer-ID" } { "Admin" } { "Gewählt" }
{ &s.id } { &s.user.last_name } { &s.user.first_name } { &s.user.username } { &s.user.id } { if s.user.admin { 1 } else { 0 } } { if s.vote.is_some() { 1 } else { 0 } }
}, UsersTab::Teachers => html! { { for self.teachers.as_ref().unwrap().iter().map(|t| html! { }) }
{ "ID" } { "Nachname" } { "Vorname" } { "Benutzername" } { "Email" } { "Benutzer-ID" } { "Admin" }
{ &t.id } { &t.user.last_name } { &t.user.first_name } { &t.user.username } { match &t.user.role { graphql::queries::users_by_role::teachers::UserRole::Student => "S", graphql::queries::users_by_role::teachers::UserRole::Teacher => "T", graphql::queries::users_by_role::teachers::UserRole::Other(_) => "N/A", } } { &t.user.id } { if t.user.admin { 1 } else { 0 } }
}, } }
}
} } }