{{/* The first tab of the people page: the tree, and everyone in it. */}} {{define "people_body"}} {{if .Error}}{{end}} {{if .Message}}

{{.Message}}

{{end}} {{if .Pending}}

{{t "users.pending.title"}}

{{range .Pending}}{{end}}
{{t "users.col.email"}}{{t "users.col.name"}}{{t "users.col.signed_up"}}{{t "users.col.approve_into"}}
{{.Email}}{{.Name}}{{ago .CreatedAt}}
{{end}}

{{t "users.tree.title"}}

{{if .HasQuotas}}{{th "users.tree.note_quotas"}}{{else}}{{t "users.tree.note"}}{{end}}

{{if not .Tree}}

{{t "users.empty"}}

{{end}} {{range $org := .Tree}}
{{$org.Name}} {{tn "users.n_teams" (len $org.Teams)}} {{template "scope-members" (dict "Kind" "org" "ID" $org.ID "Name" $org.Name "D" $)}}
{{t "users.rename"}}
{{if not $org.Teams}}
{{end}}
{{range $team := $org.Teams}}
{{$team.Name}} {{tn "users.n_projects" (len $team.Projects)}} {{template "scope-members" (dict "Kind" "team" "ID" $team.ID "Name" $team.Name "D" $)}}
{{t "users.rename"}}
{{if gt (len $.Orgs) 1}}
{{t "users.move"}}
{{end}} {{if not $team.Projects}}
{{end}}
{{range $p := $team.Projects}}
{{$p.Name}} {{t "users.limits_and_use"}} {{tn "users.n_members" $p.Users}} · {{tn "users.n_keys" $p.ActiveKeys}}{{if gt $p.Keys $p.ActiveKeys}} {{t "users.n_revoked" (sub $p.Keys $p.ActiveKeys)}}{{end}}
{{t "users.rename"}}
{{if gt (len $.Teams) 1}}
{{t "users.move_project"}}
{{end}} {{if and (eq $p.Users 0) (eq $p.Keys 0)}}
{{else}}{{t "users.not_removable"}}{{end}}
{{with index $.Members (printf "project:%s" $p.ID)}} {{range .}}{{template "member-row" (dict "U" . "D" $ "Scope" (printf "project:%s" $p.ID) "Open" $p.ID)}}{{end}}
{{t "users.col.member"}}{{t "users.col.state"}}{{t "users.col.last_sign_in"}}
{{else}}

{{t "users.no_members"}}

{{end}} {{template "add-member" (dict "Kind" "project" "ID" $p.ID "D" $ "Open" $p.ID)}} {{with index $.Keys $p.ID}} {{range .}}{{end}}
{{t "users.col.key"}}{{t "users.col.owner"}}{{t "users.col.state"}}{{t "users.col.last_used"}}
{{.Name}} {{.Prefix}} {{or .OwnerEmail (t "users.issued_by_operator")}} {{t (print "users.key_state." .State)}} {{ago .LastUsedAt}} {{if eq .State "active"}}
{{end}}
{{end}}
{{end}} {{/* Folded until wanted: a box open under every team was most of the tree's height and read as something to fill in. */}}
{{t "users.add_project"}}
{{end}}
{{t "users.add_team"}}
{{end}}

{{t "users.accounts"}}

{{if .Accounts}} {{range .Accounts}}{{template "account-row" (dict "U" . "D" $)}}{{end}}
{{t "users.col.person"}}{{t "users.col.state"}}{{t "users.col.member_of"}}{{t "users.col.last_sign_in"}}{{t "users.col.add_to"}}

{{t "users.alone_note"}}

{{else}}

{{t "users.no_accounts"}}

{{end}}

{{th "users.shell_note"}}

{{end}} {{/* The actions every account row carries: suspend or reinstate, remove. */}} {{define "state-actions"}}{{$u := .U}}{{$d := .D}} {{if ne $u.ID $d.AdminID}} {{/* In a menu: two red links on every row made the list look alarmed, and they are the two things done least often. */}}
⋯
{{else}}{{t "users.you"}}{{end}} {{end}} {{/* A person in the list of every account: where they are, and where else they could be. */}} {{define "account-row"}}{{$u := .U}}{{$d := .D}} {{$u.Email}}{{if $u.IsAdmin}} {{t "users.tag.admin"}}{{end}} {{t (print "users.state." $u.State)}} {{range $i, $m := $u.Memberships}}{{if lt $i 2}}{{with $m}}{{.Path}}{{if eq .Role "manager"}} {{t "users.role.manager"}}{{end}} {{if eq (printf "%s" .Scope) "org"}}
{{end}}
{{end}}{{end}} {{else}}{{t "users.on_own"}}{{end}} {{/* Two, then a count: a person in six teams was six chips wrapping the row into a paragraph. The rest are named on hover and in their own scopes' member lists, where taking them out is done. */}} {{if gt (len $u.Memberships) 2}}+{{sub (len $u.Memberships) 2}}{{end}} {{ago $u.LastLoginAt}}
{{template "state-actions" (dict "U" $u "D" $d "Open" "")}} {{end}} {{/* A member in a scope's own list: taking them out of here is the action. */}} {{define "member-row"}}{{$u := .U}}{{$d := .D}} {{$u.Email}}{{if $u.IsAdmin}} {{t "users.tag.admin"}}{{end}} {{if gt (len $u.Memberships) 1}}{{t "users.also_in" (sub (len $u.Memberships) 1)}}{{end}} {{t (print "users.state." $u.State)}} {{ago $u.LastLoginAt}}
{{end}} {{/* Adding a person to a scope, from the scope. */}} {{define "add-member"}}{{$d := .D}}
{{end}} {{/* An org's or team's own members, folded away until asked for. */}} {{define "scope-members"}}{{$d := .D}}{{$k := printf "%s:%s" .Kind .ID}}
{{tn "users.n_members" (len (index $d.Members $k))}}
{{with index $d.Members $k}} {{range .}}{{template "member-row" (dict "U" . "D" $d "Scope" $k "Open" "")}}{{end}}
{{else}}

{{t "users.nobody_in" .Name}}

{{end}} {{template "add-member" (dict "Kind" .Kind "ID" .ID "D" $d "Open" "")}}
{{end}}