internal/web/templates/owner.html

136 lines · 7655 bytes

  1{{define "title"}}{{.Owner}} · {{.Site}}{{end}}
  2{{define "content"}}
  3<section class="profilehead">
  4<h1>{{.Owner}} <span class="chip chip-neutral">{{.Kind}}</span></h1>
  5{{if .Profile.Description}}<p class="desc lede">{{.Profile.Description}}</p>{{end}}
  6{{if .Profile.Website}}<p class="meta"><a href="{{.Profile.Website}}" rel="nofollow me">{{.Profile.Website}}</a></p>{{end}}
  7{{if .Profile.Links}}<p class="meta">{{range $i, $l := .Profile.Links}}{{if $i}} · {{end}}<a href="{{$l.URL}}" rel="nofollow me">{{if $l.Label}}{{$l.Label}}{{else}}{{$l.URL}}{{end}}</a>{{end}}</p>{{end}}
  8{{if .Orgs}}<p class="meta">member of {{range .Orgs}}<a class="memberchip" href="/{{.Name}}">{{.Name}}</a> {{end}}</p>{{end}}
  9{{if .Members}}<p class="meta">members {{range .Members}}<a class="memberchip" href="/{{.Name}}">{{.Name}} <span class="role">{{.Role}}</span></a> {{end}}</p>{{end}}
 10{{if and (eq .Kind "org") .Repos}}<p class="meta"><a href="/{{.Owner}}/-/labels">labels</a> · <a href="/{{.Owner}}/-/milestones">milestones</a></p>{{end}}
 11</section>
 12{{/* The repository list is the bare /{owner}, because a profile's job is
 13     to lead to the projects: the About text and the year of squares used
 14     to sit above the list and push it below the fold (#242). */}}
 15<nav class="tabs" aria-label="Profile">
 16  <a {{if eq .Tab "repos"}}aria-current="page" {{end}}href="/{{.Owner}}">Repositories{{if .Repos}} <i>{{len .Repos}}</i>{{end}}</a>
 17  {{if .AboutHTML}}<a {{if eq .Tab "about"}}aria-current="page" {{end}}href="/{{.Owner}}/-/about">About</a>{{end}}
 18  <a {{if eq .Tab "activity"}}aria-current="page" {{end}}href="/{{.Owner}}/-/activity">Activity{{if .ActivityTotal}} <i>{{.ActivityTotal}}</i>{{end}}</a>
 19  {{if or .Snippets .Self}}<a href="/{{.Owner}}/-/snippets">Snippets{{if .Snippets}} <i>{{.Snippets}}</i>{{end}}</a>{{end}}
 20  {{if .CanAdmin}}<a {{if eq .Tab "people"}}aria-current="page" {{end}}href="/{{.Owner}}/-/people">People{{if .Members}} <i>{{len .Members}}</i>{{end}}</a>{{end}}
 21</nav>
 22
 23{{if eq .Tab "repos"}}
 24<ul class="repolist">
 25{{range .Repos}}{{template "reporow" .}}
 26{{else}}<li class="empty">no visible repositories</li>{{end}}
 27</ul>
 28{{end}}
 29
 30{{if eq .Tab "about"}}
 31<section class="readme"><div class="rendered">{{.AboutHTML}}</div></section>
 32{{end}}
 33
 34{{if eq .Tab "activity"}}
 35<section class="activity">
 36<h2>activity <span class="count">{{.ActivityTotal}} in the last year</span></h2>
 37<div class="actgraph-scroll">
 38<div class="actgraph">
 39{{range .Activity}}<div class="actweek">{{if .Month}}<span class="actmonth">{{.Month}}</span>{{end}}{{range .Days}}<span class="actday{{if .Pad}} pad{{else}} l{{.Level}}{{end}}"{{if not .Pad}} title="{{.Count}} on {{.Date}}"{{end}}></span>{{end}}</div>{{end}}
 40</div>
 41</div>
 42<p class="actlegend"><span>Less</span><span class="actday l0"></span><span class="actday l1"></span><span class="actday l2"></span><span class="actday l3"></span><span class="actday l4"></span><span>More</span></p>
 43</section>
 44{{end}}
 45
 46{{if eq .Tab "people"}}{{$org := .Owner}}
 47<h2>people <span class="count">{{len .Members}}</span></h2>
 48{{if .Notice}}<p class="error" role="alert">{{.Notice}}</p>{{end}}
 49<div class="tablewrap"><table class="keys">
 50<tr class="cols"><th scope="col">member</th><th scope="col">role</th><th scope="col"><span class="vh">actions</span></th></tr>
 51{{range .Members}}<tr>
 52  <td><a href="/{{.Name}}">{{.Name}}</a></td>
 53  <td>{{.Role}}</td>
 54  <td class="act"><form method="post" action="/{{$org}}"><input type="hidden" name="field" value="member-remove"><input type="hidden" name="user" value="{{.Name}}"><button type="submit" class="linklike">Remove</button></form></td>
 55</tr>
 56{{end}}</table></div>
 57<details class="editbox">
 58  <summary>Add or change a member</summary>
 59  <form method="post" action="/{{$org}}" class="setform stack">
 60    <input type="hidden" name="field" value="member-add">
 61    <label for="member">Username</label>
 62    <input type="text" id="member" name="user" required>
 63    <label class="none" for="memberrole">Role</label>
 64    <select id="memberrole" name="role">
 65      <option value="member">member</option>
 66      <option value="admin">admin</option>
 67    </select>
 68    <button type="submit" class="btn">Apply</button>
 69  </form>
 70</details>
 71
 72<h2>teams <span class="count">{{len .Teams}}</span></h2>
 73<p class="meta">Teams scope repository access inside the organization: members
 74of a team get its role on every repository it is granted.</p>
 75{{range .Teams}}<details class="difffold" open>
 76  <summary><span class="fpath">{{.Name}}</span>
 77    <span class="fstat">{{len .Members}} member{{if ne (len .Members) 1}}s{{end}} · {{len .Grants}} repo{{if ne (len .Grants) 1}}s{{end}}</span>
 78  </summary>
 79  <div class="teambody">
 80    <p class="meta">members: {{range .Members}}<a class="memberchip" href="/{{.}}">{{.}}</a> {{else}}<span class="none">none yet</span>{{end}}</p>
 81    <p class="meta">repositories: {{range .Grants}}<span class="memberchip"><a href="/{{.RepoPath}}">{{.RepoPath}}</a> <span class="role">{{.Role}}</span></span> {{else}}<span class="none">none yet</span>{{end}}</p>
 82    <form method="post" action="/{{$org}}" class="setform stack">
 83      <input type="hidden" name="team" value="{{.Name}}">
 84      <label class="none" for="tm-{{.Name}}">Members</label>
 85      <input type="text" id="tm-{{.Name}}" name="user" placeholder="usernames, space-separated">
 86      <button type="submit" name="field" value="team-add" class="btn">Add</button>
 87      <button type="submit" name="field" value="team-remove" class="btn">Remove</button>
 88    </form>
 89    <form method="post" action="/{{$org}}" class="setform stack">
 90      <input type="hidden" name="team" value="{{.Name}}">
 91      <label class="none" for="tr-{{.Name}}">Repository</label>
 92      <input type="text" id="tr-{{.Name}}" name="repo" placeholder="owner/name">
 93      <label class="none" for="trr-{{.Name}}">Role</label>
 94      <select id="trr-{{.Name}}" name="role">
 95        <option value="read">read</option>
 96        <option value="write">write</option>
 97        <option value="admin">admin</option>
 98      </select>
 99      <button type="submit" name="field" value="team-grant" class="btn">Grant</button>
100      <button type="submit" name="field" value="team-revoke" class="btn">Revoke</button>
101    </form>
102    <form method="post" action="/{{$org}}" class="setform">
103      <input type="hidden" name="field" value="team-delete">
104      <input type="hidden" name="team" value="{{.Name}}">
105      {{template "confirmfield" .Name}}
106      <button type="submit" class="danger">Delete this team</button>
107    </form>
108  </div>
109</details>
110{{else}}<p class="none">No teams yet.</p>{{end}}
111<details class="editbox">
112  <summary>Create a team</summary>
113  <form method="post" action="/{{$org}}" class="setform">
114    <input type="hidden" name="field" value="team-create">
115    <label for="newteam">Name</label>
116    <input type="text" id="newteam" name="team" required>
117    <button type="submit" class="btn">Create</button>
118  </form>
119</details>
120
121<h2>organization</h2>
122<details class="editbox">
123  <summary>Rename</summary>
124  <form method="post" action="/{{$org}}" class="setform">
125    <input type="hidden" name="field" value="org-rename">
126    <label for="orgrename">New name</label>
127    <input type="text" id="orgrename" name="name" value="{{$org}}" required>
128    <button type="submit" class="btn">Rename</button>
129  </form>
130  <p class="meta">Every clone URL under this organization changes with the name.</p>
131</details>
132<p class="meta">Deleting an organization is a CLI operation, like deleting a
133repository: it wants a typed confirmation rather than a button.</p>
134<pre class="message" tabindex="0">gitbay org delete {{$org}} --yes</pre>
135{{end}}
136{{end}}