diff --git a/app/src/components/app.rs b/app/src/components/app.rs
index 313e898..7a5c608 100644
--- a/app/src/components/app.rs
+++ b/app/src/components/app.rs
@@ -7,6 +7,7 @@ use crate::{
router::{AppRoute, NavButton},
user_details::UserDetails,
user_table::UserTable,
+ group_table::GroupTable,
},
infra::cookies::get_cookie,
};
@@ -114,6 +115,13 @@ impl Component for App {
{"Create a user"}
},
+ AppRoute::ListGroups => html! {
+
+
+
+ //{"Create a user"}
+
+ },
AppRoute::UserDetails(username) => html! {
diff --git a/app/src/components/group_table.rs b/app/src/components/group_table.rs
new file mode 100644
index 0000000..7c0158b
--- /dev/null
+++ b/app/src/components/group_table.rs
@@ -0,0 +1,159 @@
+use crate::{
+ //components::{
+ // delete_group::DeleteGroup,
+ // router::{AppRoute, Link},
+ //},
+ infra::api::HostService,
+};
+use anyhow::{Error, Result};
+use graphql_client::GraphQLQuery;
+use yew::prelude::*;
+use yew::services::{fetch::FetchTask, ConsoleService};
+
+#[derive(GraphQLQuery)]
+#[graphql(
+ schema_path = "../schema.graphql",
+ query_path = "queries/get_group_list.graphql",
+ response_derives = "Debug",
+ custom_scalars_module = "crate::infra::graphql"
+)]
+pub struct GetGroupList;
+
+use get_group_list::ResponseData;
+
+type Group = get_group_list::GetGroupListGroups;
+
+pub struct GroupTable {
+ link: ComponentLink
,
+ groups: Option>,
+ error: Option,
+ // Used to keep the request alive long enough.
+ _task: Option,
+}
+
+pub enum Msg {
+ ListGroupsResponse(Result),
+ OnGroupDeleted(i64),
+ OnError(Error),
+}
+
+impl GroupTable {
+ fn get_groups(&mut self) {
+ self._task = HostService::graphql_query::(
+ get_group_list::Variables {},
+ self.link.callback(Msg::ListGroupsResponse),
+ "Error trying to fetch groups",
+ )
+ .map_err(|e| {
+ ConsoleService::log(&e.to_string());
+ e
+ })
+ .ok();
+ }
+}
+
+impl Component for GroupTable {
+ type Message = Msg;
+ type Properties = ();
+
+ fn create(_: Self::Properties, link: ComponentLink) -> Self {
+ let mut table = GroupTable {
+ link,
+ _task: None,
+ groups: None,
+ error: None,
+ };
+ table.get_groups();
+ table
+ }
+
+ fn update(&mut self, msg: Self::Message) -> ShouldRender {
+ self.error = None;
+ match self.handle_msg(msg) {
+ Err(e) => {
+ ConsoleService::error(&e.to_string());
+ self.error = Some(e);
+ true
+ }
+ Ok(b) => b,
+ }
+ }
+
+ fn change(&mut self, _: Self::Properties) -> ShouldRender {
+ false
+ }
+
+ fn view(&self) -> Html {
+ html! {
+
+ {self.view_groups()}
+ {self.view_errors()}
+
+ }
+ }
+}
+
+impl GroupTable {
+ fn handle_msg(&mut self, msg: ::Message) -> Result {
+ match msg {
+ Msg::ListGroupsResponse(groups) => {
+ self.groups = Some(groups?.groups.into_iter().collect());
+ Ok(true)
+ }
+ Msg::OnError(e) => Err(e),
+ Msg::OnGroupDeleted(group_id) => {
+ debug_assert!(self.groups.is_some());
+ self.groups.as_mut().unwrap().retain(|u| u.id != group_id);
+ Ok(true)
+ }
+ }
+ }
+
+ fn view_groups(&self) -> Html {
+ let make_table = |groups: &Vec| {
+ html! {
+
+
+
+
+ {"Group ID"} |
+ {"Display name"} |
+ //{"Delete"} |
+
+
+
+ {groups.iter().map(|u| self.view_group(u)).collect::>()}
+
+
+
+ }
+ };
+ match &self.groups {
+ None => html! {{"Loading..."}},
+ Some(groups) => make_table(groups),
+ }
+ }
+
+ fn view_group(&self, group: &Group) -> Html {
+ html! {
+
+ //{&group.id} |
+ {&group.id} |
+ {&group.display_name} |
+ //
+ //
+ // |
+
+ }
+ }
+
+ fn view_errors(&self) -> Html {
+ match &self.error {
+ None => html! {},
+ Some(e) => html! {{"Error: "}{e.to_string()}
},
+ }
+ }
+}
diff --git a/app/src/components/mod.rs b/app/src/components/mod.rs
index e0b7a94..a8c1d6a 100644
--- a/app/src/components/mod.rs
+++ b/app/src/components/mod.rs
@@ -3,6 +3,7 @@ pub mod app;
pub mod change_password;
pub mod create_user;
pub mod delete_user;
+pub mod group_table;
pub mod login;
pub mod logout;
pub mod remove_user_from_group;
diff --git a/app/src/components/router.rs b/app/src/components/router.rs
index 89b04c9..82515a1 100644
--- a/app/src/components/router.rs
+++ b/app/src/components/router.rs
@@ -15,6 +15,8 @@ pub enum AppRoute {
ChangePassword(String),
#[to = "/user/{user_id}"]
UserDetails(String),
+ #[to = "/groups"]
+ ListGroups,
#[to = "/"]
Index,
}