<table id="repo-files-table" class="ui single line table"> <thead> <tr class="commit-list"> <th> {{if .LatestCommitUser}} {{ctx.AvatarUtils .LatestCommitUser 24}} {{if .LatestCommitUser.FullName}} <a href="{{AppSubUrl}}/{{.LatestCommitUser.Name}}"><strong>{{.LatestCommitUser.FullName}}</strong></a> {{else}} <a href="{{AppSubUrl}}/{{.LatestCommitUser.Name}}"><strong>{{if .LatestCommit.Author}}{{.LatestCommit.Author.Name}}{{else}}{{.LatestCommitUser.Name}}{{end}}</strong></a> {{end}} {{else}} {{if .LatestCommit.Author}} {{ctx.AvatarUtils.AvatarByEmail .LatestCommit.Author.Email .LatestCommit.Author.Name 24}} <strong>{{.LatestCommit.Author.Name}}</strong> {{end}} {{end}} </th> <th>{{ $commitLink:= printf "%s/commit/%s" .RepoLink .LatestCommit.ID }} {{template "repo/commit_statuses" dict "Status" .LatestCommitStatus "Statuses" .LatestCommitStatuses "root" $}} <span class="grey commit-summary" title="{{.LatestCommit.Summary}}"><span class="message-wrapper">{{RenderCommitMessageLinkSubject .LatestCommit.Message $.RepoLink $commitLink $.Repository.ComposeMetas}}</span> {{if IsMultilineCommitMessage .LatestCommit.Message}} <button class="basic compact mini ui icon button commit-button"><i class="ellipsis horizontal icon"></i></button> <pre class="commit-body" style="display: none;">{{RenderCommitBody .LatestCommit.Message $.RepoLink $.Repository.ComposeMetas}}</pre> {{end}} </span> </th> <th id="total"></th> <th class="text grey right age">{{if .LatestCommit.Author}}{{TimeSince .LatestCommit.Author.When $.Lang}}{{end}}</th> </tr> </thead> <tbody> {{if .HasParentPath}} <tr class="has-parent"> <td colspan="3">{{svg "octicon-reply"}}<a href="{{$.BranchLink}}{{.ParentPath}}">..</a></td> </tr> {{end}} {{range $item := .Files}} {{$entry := $item.Entry}} {{$commit := $item.Commit}} {{$subModuleFile := $item.SubModuleFile}} <tr> <td class="name four wide"> <span class="truncate"> {{if $entry.IsSubModule}} {{svg "octicon-file-submodule"}} {{$refURL := $subModuleFile.RefURL AppUrl $.Repository.FullName $.SSHDomain}} {{if $refURL}} <a href="{{$refURL}}">{{$entry.Name}}</a><span class="at">@</span><a href="{{$refURL}}/commit/{{$subModuleFile.RefID}}">{{ShortSha $subModuleFile.RefID}}</a> {{else}} {{$entry.Name}}<span class="at">@</span>{{ShortSha $subModuleFile.RefID}} {{end}} {{else}} {{if $entry.IsDir}} {{$subJumpablePathName := $entry.GetSubJumpablePathName}} {{svg "octicon-file-directory-fill"}} <a class="muted" href="{{$.TreeLink}}/{{PathEscapeSegments $subJumpablePathName}}" title="{{$subJumpablePathName}}"> {{$subJumpablePathFields := StringUtils.Split $subJumpablePathName "/"}} {{$subJumpablePathFieldLast := (Eval (len $subJumpablePathFields) "-" 1)}} {{if eq $subJumpablePathFieldLast 0}} {{$subJumpablePathName}} {{else}} {{$subJumpablePathPrefixes := slice $subJumpablePathFields 0 $subJumpablePathFieldLast}} <span class="text light-2">{{StringUtils.Join $subJumpablePathPrefixes "/"}}</span>/{{index $subJumpablePathFields $subJumpablePathFieldLast}} {{end}} </a> {{else}} {{svg (printf "octicon-%s" (EntryIcon $entry))}} <a href="{{$.TreeLink}}/{{$entry.Name}}" title="{{$entry.Name}}">{{$entry.Name}}</a> {{end}} {{end}} </span> </td> <td class="message five wide"> <span class="truncate"> <a href="{{$.RepoLink}}/commit/{{$commit.ID}}" title="{{$commit.Summary}}">{{$commit.Summary | RenderEmoji}}</a> </span> </td> <td class="message four wide center centered"> <span style="display: none;" class="ui basic label" id="{{$entry.Name}}"> </span> </td> <td class="text right age three wide">{{TimeSince $commit.Committer.When $.Lang}}</td> </tr> {{end}} </tbody> </table> {{if .ReadmeExist}} {{template "repo/view_file" .}} {{end}} <script> if (!("{{.Name}}" === "tutors" || "{{.Name}}" === "template")) { fetch(COURSES_URL + "/courses/{{$.Repository.Owner.Name}}/{{$.Repository.Name}}/exercises", { referrerPolicy: "origin", credentials: "include", redirect: 'follow' }).then(res => { if (!res.ok) { if (res.status === 401) { const form = document.createElement("form") form.action = "/user/logout" form.method = "POST" document.body.appendChild(form); form.submit() } } else { res.text().then(res => { let json = JSON.parse(res) let total = document.getElementById("total") total.innerText = json["total"] + " / " + json["max_total"] + " (" + json["percentage"] + "%)" for (let [name, info] of Object.entries(json["exercises"])) { let el = document.getElementById(name) if (el !== null) { if (info["finished"]) { if (info["points"] !== null) { el.innerText = info["points"].toString() + " / " + info["max_points"].toString() el.classList.add("black") } else { el.innerText = "grading in process" el.classList.add("black") } } else { el.innerText = info["message"] if (info["important_message"]) { el.classList.add("red") } } el.style.removeProperty("display") } } }) } }).catch(_ => { {{if .IsAdmin}} {{else}} const form = document.createElement("form") form.action = "/user/logout" form.method = "POST" document.body.appendChild(form); form.submit() {{end}} }) } </script>