From 798f1a3a5ae60c48bf4a8127e2058366b270021e Mon Sep 17 00:00:00 2001 From: oppiliappan Date: Thu, 19 Jun 2025 17:55:29 +0100 Subject: [PATCH] appview: add page for single workflow Signed-off-by: oppiliappan --- appview/pages/pages.go | 13 +++++ .../templates/repo/pipelines/workflow.html | 52 +++++++++++++++++++ appview/pipelines/pipelines.go | 51 ++++++++++++++++++ 3 files changed, 116 insertions(+) create mode 100644 appview/pages/templates/repo/pipelines/workflow.html diff --git a/appview/pages/pages.go b/appview/pages/pages.go index 16912af3..cecad95d 100644 --- a/appview/pages/pages.go +++ b/appview/pages/pages.go @@ -963,6 +963,19 @@ func (p *Pages) Pipelines(w io.Writer, params PipelinesParams) error { return p.executeRepo("repo/pipelines/pipelines", w, params) } +type WorkflowParams struct { + LoggedInUser *oauth.User + RepoInfo repoinfo.RepoInfo + Pipeline db.Pipeline + Workflow string + Active string +} + +func (p *Pages) Workflow(w io.Writer, params WorkflowParams) error { + params.Active = "pipelines" + return p.executeRepo("repo/pipelines/workflow", w, params) +} + func (p *Pages) Static() http.Handler { if p.dev { return http.StripPrefix("/static/", http.FileServer(http.Dir("appview/pages/static"))) diff --git a/appview/pages/templates/repo/pipelines/workflow.html b/appview/pages/templates/repo/pipelines/workflow.html new file mode 100644 index 00000000..ddc0ee84 --- /dev/null +++ b/appview/pages/templates/repo/pipelines/workflow.html @@ -0,0 +1,52 @@ +{{ define "title" }} {{ .Workflow }} · pipeline {{ .Pipeline.Id }} · {{ .RepoInfo.FullName }}{{ end }} + +{{ define "extrameta" }} + {{ $title := "pipelines"}} + {{ $url := printf "https://tangled.sh/%s/pipelines" .RepoInfo.FullName }} + {{ template "repo/fragments/og" (dict "RepoInfo" .RepoInfo "Title" $title "Url" $url) }} +{{ end }} + +{{ define "repoContent" }} +
+
+ {{ block "sidebar" . }} {{ end }} +
+
+ {{ block "logs" . }} {{ end }} +
+
+{{ end }} + +{{ define "repoAfter" }} +{{ end }} + +{{ define "sidebar" }} + {{ $active := .Workflow }} + {{ with .Pipeline }} +
+ {{ range $name, $all := .Statuses }} +
+ {{ $lastStatus := $all.Latest }} + {{ $kind := $lastStatus.Status.String }} + + {{ $t := .TimeTaken }} + {{ $time := "" }} + {{ if $t }} + {{ $time = durationFmt $t }} + {{ else }} + {{ $time = printf "%s ago" (shortTimeFmt $.Created) }} + {{ end }} + +
+ {{ template "repo/pipelines/fragments/workflowSymbol" $all }} + {{ $name }} +
+ +
+ {{ end }} +
+ {{ end }} +{{ end }} diff --git a/appview/pipelines/pipelines.go b/appview/pipelines/pipelines.go index 95794509..58c7a591 100644 --- a/appview/pipelines/pipelines.go +++ b/appview/pipelines/pipelines.go @@ -86,3 +86,54 @@ func (p *Pipelines) Index(w http.ResponseWriter, r *http.Request) { Pipelines: ps, }) } + +func (p *Pipelines) Workflow(w http.ResponseWriter, r *http.Request) { + user := p.oauth.GetUser(r) + l := p.Logger.With("handler", "Workflow") + + f, err := p.repoResolver.Resolve(r) + if err != nil { + l.Error("failed to get repo and knot", "err", err) + return + } + + repoInfo := f.RepoInfo(user) + + pipelineId := chi.URLParam(r, "pipeline") + if pipelineId == "" { + l.Error("empty pipeline ID") + return + } + + workflow := chi.URLParam(r, "workflow") + if pipelineId == "" { + l.Error("empty workflow name") + return + } + + ps, err := db.GetPipelineStatuses( + p.db, + db.FilterEq("repo_owner", repoInfo.OwnerDid), + db.FilterEq("repo_name", repoInfo.Name), + db.FilterEq("knot", repoInfo.Knot), + db.FilterEq("id", pipelineId), + ) + if err != nil { + l.Error("failed to query db", "err", err) + return + } + + if len(ps) != 1 { + l.Error("invalid number of pipelines", "len", len(ps)) + return + } + + singlePipeline := ps[0] + + p.pages.Workflow(w, pages.WorkflowParams{ + LoggedInUser: user, + RepoInfo: repoInfo, + Pipeline: singlePipeline, + Workflow: workflow, + }) +} -- 2.51.2