use maud::{html, Markup};
use crate::primitives::{badge, button, card, input, native_select};
#[derive(Clone, Debug, Default)]
pub struct Props {
pub invite_action: String,
pub roles: Vec<String>,
pub members: Vec<Member>,
}
#[derive(Clone, Debug)]
pub struct Member {
pub name: String,
pub email: String,
pub avatar_initials: String,
pub role: String,
pub status: Status,
pub last_active: String,
pub change_role_action: Option<String>,
pub remove_action: Option<String>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Status {
Active,
Pending,
Suspended,
}
pub fn render(props: Props) -> Markup {
html! {
div class="mui-block mui-block--settings mui-block--team" {
(card::render(card::Props {
title: Some("Team".into()),
description: Some(format!("{} {}",
props.members.len(),
if props.members.len() == 1 { "member" } else { "members" })),
children: html! {
form action=(props.invite_action) method="post"
class="mui-block--team__invite" {
(input::render(input::Props {
name: "email".into(),
id: "mui-block-team-invite-email".into(),
input_type: crate::primitives::input::InputType::Email,
placeholder: "teammate@example.com".into(),
required: true,
..Default::default()
}))
(native_select::render(native_select::NativeSelectProps {
name: "role".into(),
id: "mui-block-team-invite-role".into(),
options: props.roles.iter().map(|r| native_select::NativeOption {
value: r.clone(),
label: r.clone(),
disabled: false,
}).collect(),
selected: props.roles.iter().find(|r| r.as_str() == "Member")
.or_else(|| props.roles.first()).cloned(),
placeholder: Some("Role".into()),
disabled: false,
}))
(button::render(button::Props {
label: "Invite".into(),
variant: button::Variant::Primary,
size: button::Size::Md,
button_type: "submit",
..Default::default()
}))
}
div class="mui-block--team__table-wrap" {
table class="mui-block--team__table" {
thead {
tr {
th { "Member" }
th { "Role" }
th { "Status" }
th { "Last active" }
th class="mui-block--team__actions-col" aria-label="Actions" {}
}
}
tbody {
@for m in &props.members {
tr {
td {
div class="mui-block--team__member" {
span class="mui-block--team__avatar" aria-hidden="true" {
(m.avatar_initials)
}
div class="mui-block--team__member-text" {
span class="mui-block--team__member-name" {
(m.name)
}
span class="mui-block--team__member-email" {
(m.email)
}
}
}
}
td {
@match &m.change_role_action {
Some(action) => {
form action=(action) method="post" class="mui-block--team__role-form" {
(native_select::render(native_select::NativeSelectProps {
name: "role".into(),
id: format!("role-{}", m.email),
options: props.roles.iter().map(|r| native_select::NativeOption {
value: r.clone(),
label: r.clone(),
disabled: false,
}).collect(),
selected: Some(m.role.clone()),
placeholder: None,
disabled: false,
}))
}
}
None => {
span class="mui-block--team__role-static" { (m.role) }
}
}
}
td {
@match m.status {
Status::Active => (badge::render(badge::Props {
label: "Active".into(),
variant: badge::Variant::Success,
..Default::default()
})),
Status::Pending => (badge::render(badge::Props {
label: "Pending".into(),
variant: badge::Variant::Warning,
..Default::default()
})),
Status::Suspended => (badge::render(badge::Props {
label: "Suspended".into(),
variant: badge::Variant::Secondary,
..Default::default()
})),
}
}
td class="mui-block--team__last-active" {
(m.last_active)
}
td class="mui-block--team__row-actions" {
@if let Some(url) = &m.remove_action {
form action=(url) method="post" {
(button::render(button::Props {
label: "Remove".into(),
variant: button::Variant::Ghost,
size: button::Size::Sm,
button_type: "submit",
..Default::default()
}))
}
}
}
}
}
}
}
}
},
..Default::default()
}))
}
}
}
pub fn preview() -> Markup {
render(Props {
invite_action: "/settings/team/invite".into(),
roles: vec![
"Owner".into(),
"Admin".into(),
"Member".into(),
"Viewer".into(),
],
members: vec![
Member {
name: "Sofia Davis".into(),
email: "sofia@acme.com".into(),
avatar_initials: "SD".into(),
role: "Owner".into(),
status: Status::Active,
last_active: "2 min ago".into(),
change_role_action: None,
remove_action: None,
},
Member {
name: "Mateo Ortega".into(),
email: "mateo@acme.com".into(),
avatar_initials: "MO".into(),
role: "Admin".into(),
status: Status::Active,
last_active: "14 min ago".into(),
change_role_action: Some("/settings/team/mateo/role".into()),
remove_action: Some("/settings/team/mateo/remove".into()),
},
Member {
name: "Jin-Ho Lee".into(),
email: "jin-ho@acme.com".into(),
avatar_initials: "JL".into(),
role: "Member".into(),
status: Status::Active,
last_active: "Yesterday".into(),
change_role_action: Some("/settings/team/jin-ho/role".into()),
remove_action: Some("/settings/team/jin-ho/remove".into()),
},
Member {
name: "Amira Khan".into(),
email: "amira@acme.com".into(),
avatar_initials: "AK".into(),
role: "Member".into(),
status: Status::Pending,
last_active: "Never".into(),
change_role_action: Some("/settings/team/amira/role".into()),
remove_action: Some("/settings/team/amira/remove".into()),
},
],
})
}