mirror of
https://github.com/go-gitea/gitea.git
synced 2025-07-19 20:05:15 +02:00
feat(runner): finish org runners ui
This commit is contained in:
parent
82c6fc2217
commit
888b4c8313
@ -1,6 +1,7 @@
|
||||
package common
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
@ -60,7 +61,7 @@ func RunnersList(ctx *context.Context, tplName base.TplName, opts bots_model.Fin
|
||||
ctx.HTML(http.StatusOK, tplName)
|
||||
}
|
||||
|
||||
func RunnerDetails(ctx *context.Context, tplName base.TplName, runnerID int64) {
|
||||
func RunnerDetails(ctx *context.Context, tplName base.TplName, runnerID int64, ownerID int64, repoID int64) {
|
||||
runner, err := bots_model.GetRunnerByID(runnerID)
|
||||
if err != nil {
|
||||
ctx.ServerError("GetRunnerByID", err)
|
||||
@ -70,6 +71,11 @@ func RunnerDetails(ctx *context.Context, tplName base.TplName, runnerID int64) {
|
||||
ctx.ServerError("LoadAttributes", err)
|
||||
return
|
||||
}
|
||||
if !runner.Editable(ownerID, repoID) {
|
||||
err = errors.New("no permission to edit this runner")
|
||||
ctx.NotFound("RunnerDetails", err)
|
||||
return
|
||||
}
|
||||
|
||||
ctx.Data["Runner"] = runner
|
||||
|
||||
@ -79,13 +85,18 @@ func RunnerDetails(ctx *context.Context, tplName base.TplName, runnerID int64) {
|
||||
}
|
||||
|
||||
// RunnerDetailsEditPost response for edit runner details
|
||||
func RunnerDetailsEditPost(ctx *context.Context, runnerID int64, redirectTo string) {
|
||||
func RunnerDetailsEditPost(ctx *context.Context, runnerID int64, ownerID int64, repoID int64, redirectTo string) {
|
||||
runner, err := bots_model.GetRunnerByID(runnerID)
|
||||
if err != nil {
|
||||
log.Warn("RunnerDetailsEditPost.GetRunnerByID failed: %v, url: %s", err, ctx.Req.URL)
|
||||
ctx.ServerError("RunnerDetailsEditPost.GetRunnerByID", err)
|
||||
return
|
||||
}
|
||||
if !runner.Editable(ownerID, repoID) {
|
||||
err = errors.New("no permission to edit this runner")
|
||||
ctx.NotFound("RunnerDetailsEditPost.Editable", err)
|
||||
return
|
||||
}
|
||||
|
||||
form := web.GetForm(ctx).(*forms.EditRunnerForm)
|
||||
runner.Description = form.Description
|
||||
|
@ -55,7 +55,7 @@ func EditRunner(ctx *context.Context) {
|
||||
ctx.Data["PageIsAdmin"] = true
|
||||
ctx.Data["PageIsAdminRunners"] = true
|
||||
|
||||
common.RunnerDetails(ctx, tplRunnerEdit, ctx.ParamsInt64(":runnerid"))
|
||||
common.RunnerDetails(ctx, tplRunnerEdit, ctx.ParamsInt64(":runnerid"), 0, 0)
|
||||
}
|
||||
|
||||
// EditRunnerPost response for editing runner
|
||||
@ -63,7 +63,7 @@ func EditRunnerPost(ctx *context.Context) {
|
||||
ctx.Data["Title"] = ctx.Tr("admin.runners.edit")
|
||||
ctx.Data["PageIsAdmin"] = true
|
||||
ctx.Data["PageIsAdminRunners"] = true
|
||||
common.RunnerDetailsEditPost(ctx, ctx.ParamsInt64(":runnerid"),
|
||||
common.RunnerDetailsEditPost(ctx, ctx.ParamsInt64(":runnerid"), 0, 0,
|
||||
setting.AppSubURL+"/admin/runners/"+url.PathEscape(ctx.Params(":runnerid")))
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,8 @@
|
||||
package org
|
||||
|
||||
import (
|
||||
"net/url"
|
||||
|
||||
bots_model "code.gitea.io/gitea/models/bots"
|
||||
"code.gitea.io/gitea/models/db"
|
||||
"code.gitea.io/gitea/modules/context"
|
||||
@ -39,3 +41,24 @@ func ResetRunnerRegistrationToken(ctx *context.Context) {
|
||||
ctx.Org.Organization.ID, 0,
|
||||
ctx.Org.OrgLink+"/settings/runners")
|
||||
}
|
||||
|
||||
// RunnersEdit render runner edit page
|
||||
func RunnersEdit(ctx *context.Context) {
|
||||
ctx.Data["Title"] = ctx.Tr("org.runners.edit")
|
||||
ctx.Data["PageIsOrgSettings"] = true
|
||||
ctx.Data["PageIsOrgSettingsRunners"] = true
|
||||
|
||||
common.RunnerDetails(ctx, tplSettingsRunnersEdit,
|
||||
ctx.ParamsInt64(":runnerid"), ctx.Org.Organization.ID, 0,
|
||||
)
|
||||
}
|
||||
|
||||
// RunnersEditPost response for editing runner
|
||||
func RunnersEditPost(ctx *context.Context) {
|
||||
ctx.Data["Title"] = ctx.Tr("org.runners.edit")
|
||||
ctx.Data["PageIsOrgSettings"] = true
|
||||
ctx.Data["PageIsOrgSettingsRunners"] = true
|
||||
common.RunnerDetailsEditPost(ctx, ctx.ParamsInt64(":runnerid"),
|
||||
ctx.Org.Organization.ID, 0,
|
||||
ctx.Org.OrgLink+"/settings/runners/"+url.PathEscape(ctx.Params(":runnerid")))
|
||||
}
|
||||
|
@ -41,6 +41,8 @@ const (
|
||||
tplSettingsLabels base.TplName = "org/settings/labels"
|
||||
// tplSettingsRunners template path for render runners settings
|
||||
tplSettingsRunners base.TplName = "org/settings/runners"
|
||||
// tplSettingsRunnersEdit template path for render runners edit settings
|
||||
tplSettingsRunnersEdit base.TplName = "org/settings/runners_edit"
|
||||
// tplSettingsSecrets template path for render secrets settings
|
||||
tplSettingsSecrets base.TplName = "org/settings/secrets"
|
||||
)
|
||||
|
@ -793,6 +793,13 @@ func RegisterRoutes(m *web.Route) {
|
||||
m.Post("/initialize", bindIgnErr(forms.InitializeLabelsForm{}), org.InitializeLabels)
|
||||
})
|
||||
|
||||
m.Group("/runners", func() {
|
||||
m.Get("", org.Runners)
|
||||
m.Combo("/{runnerid}").Get(org.RunnersEdit).
|
||||
Post(bindIgnErr(forms.EditRunnerForm{}), org.RunnersEditPost)
|
||||
m.Get("/reset_registration_token", org.ResetRunnerRegistrationToken)
|
||||
})
|
||||
|
||||
m.Group("/secrets", func() {
|
||||
m.Get("", org.Secrets)
|
||||
m.Post("", bindIgnErr(forms.AddSecretForm{}), org.SecretsPost)
|
||||
|
@ -2,84 +2,7 @@
|
||||
<div class="page-content admin runners">
|
||||
{{template "admin/navbar" .}}
|
||||
<div class="ui container">
|
||||
{{template "base/alert" .}}
|
||||
<h4 class="ui top attached header">
|
||||
{{.locale.Tr "admin.runners.runner_title"}} #{{.Runner.ID}} {{.Runner.Name}}
|
||||
</h4>
|
||||
<div class="ui attached segment">
|
||||
<form class="ui form" action="{{.Link}}" method="post">
|
||||
{{template "base/disable_form_autofill"}}
|
||||
{{.CsrfTokenHtml}}
|
||||
<div class="runner-basic-info">
|
||||
<div class="field dib">
|
||||
<label>{{.locale.Tr "admin.runners.status"}}</label>
|
||||
<span class="runner-status-{{.Runner.StatusType}}">{{.Runner.StatusType}}</span>
|
||||
</div>
|
||||
<div class="field dib">
|
||||
<label>{{.locale.Tr "admin.runners.latest_online"}}</label>
|
||||
<span>{{TimeSinceUnix .Runner.LastOnline $.locale}}</span>
|
||||
</div>
|
||||
<div class="field dib">
|
||||
<label>{{.locale.Tr "admin.runners.agent_labels"}}</label>
|
||||
<span>
|
||||
{{range .Runner.AgentLabels}}
|
||||
<span>{{.}}</span>
|
||||
{{end}}
|
||||
</span>
|
||||
</div>
|
||||
<div class="field dib">
|
||||
<label>{{.locale.Tr "admin.runners.owner_type"}}</label>
|
||||
<span>{{.Runner.OwnType}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="ui divider"></div>
|
||||
|
||||
<div class="field">
|
||||
<label for="description">{{.locale.Tr "admin.runners.description"}}</label>
|
||||
<input id="description" name="description" value="{{.Runner.Description}}">
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="custom_labels">{{.locale.Tr "admin.runners.custom_labels"}}</label>
|
||||
<input id="custom_labels" name="custom_labels" value="{{Join .Runner.CustomLabels `,`}}">
|
||||
<p class="help">{{.locale.Tr "admin.runners.custom_labels_helper"}}</p>
|
||||
</div>
|
||||
|
||||
<div class="ui divider"></div>
|
||||
|
||||
<div class="field">
|
||||
<button type="submit" class="ui green button">{{.locale.Tr "admin.runners.update_runner"}}</button>
|
||||
<button type="button" class="ui red button delete-button show-modal" data-modal="#runner-delete-modal">
|
||||
{{.locale.Tr "admin.runners.delete_runner"}}</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<h4 class="ui top attached header">
|
||||
{{.locale.Tr "admin.runners.task_list"}}
|
||||
</h4>
|
||||
<div class="ui attached segment">
|
||||
Comming soon
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="ui small modal" id="runner-delete-modal">
|
||||
<div class="header">
|
||||
{{.locale.Tr "admin.runners.delete_runner_header"}}
|
||||
</div>
|
||||
<div class="content">
|
||||
<div class="ui warning message text left">
|
||||
{{.locale.Tr "admin.runners.delete_runner_notice" | Safe}}
|
||||
</div>
|
||||
<form class="ui form" action="{{.Link}}/delete" method="post">
|
||||
{{.CsrfTokenHtml}}
|
||||
<input type="hidden" name="action" value="delete">
|
||||
<div class="text right actions">
|
||||
<div class="ui cancel button">{{.locale.Tr "settings.cancel"}}</div>
|
||||
<button class="ui red button">{{.locale.Tr "admin.runners.delete_runner_confirm"}}</button>
|
||||
</div>
|
||||
</form>
|
||||
{{template "runners/edit" .}}
|
||||
</div>
|
||||
</div>
|
||||
{{template "base/footer" .}}
|
||||
|
13
templates/org/settings/runners_edit.tmpl
Normal file
13
templates/org/settings/runners_edit.tmpl
Normal file
@ -0,0 +1,13 @@
|
||||
{{template "base/head" .}}
|
||||
<div class="page-content organization settings webhooks">
|
||||
{{template "org/header" .}}
|
||||
<div class="ui container">
|
||||
<div class="ui grid">
|
||||
{{template "org/settings/navbar" .}}
|
||||
<div class="twelve wide column content">
|
||||
{{template "runners/edit" .}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{template "base/footer" .}}
|
@ -1,85 +1,61 @@
|
||||
{{template "base/head" .}}
|
||||
<div class="page-content admin runners">
|
||||
{{template "admin/navbar" .}}
|
||||
<div class="ui container">
|
||||
{{template "base/alert" .}}
|
||||
<h4 class="ui top attached header">
|
||||
{{.locale.Tr "admin.runners.runner_title"}} #{{.Runner.ID}} {{.Runner.Name}}
|
||||
</h4>
|
||||
<div class="ui attached segment">
|
||||
<form class="ui form" action="{{.Link}}" method="post">
|
||||
{{template "base/disable_form_autofill"}}
|
||||
{{.CsrfTokenHtml}}
|
||||
<div class="runner-basic-info">
|
||||
<div class="field dib">
|
||||
<label>{{.locale.Tr "admin.runners.status"}}</label>
|
||||
<span class="runner-status-{{.Runner.StatusType}}">{{.Runner.StatusType}}</span>
|
||||
</div>
|
||||
<div class="field dib">
|
||||
<label>{{.locale.Tr "admin.runners.latest_online"}}</label>
|
||||
<span>{{TimeSinceUnix .Runner.LastOnline $.locale}}</span>
|
||||
</div>
|
||||
<div class="field dib">
|
||||
<label>{{.locale.Tr "admin.runners.agent_labels"}}</label>
|
||||
<span>
|
||||
{{range .Runner.AgentLabels}}
|
||||
<span>{{.}}</span>
|
||||
{{end}}
|
||||
</span>
|
||||
</div>
|
||||
<div class="field dib">
|
||||
<label>{{.locale.Tr "admin.runners.owner_type"}}</label>
|
||||
<span>{{.Runner.OwnType}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="ui divider"></div>
|
||||
|
||||
<div class="field">
|
||||
<label for="description">{{.locale.Tr "admin.runners.description"}}</label>
|
||||
<input id="description" name="description" value="{{.Runner.Description}}">
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="custom_labels">{{.locale.Tr "admin.runners.custom_labels"}}</label>
|
||||
<input id="custom_labels" name="custom_labels" value="{{Join .Runner.CustomLabels `,`}}">
|
||||
<p class="help">{{.locale.Tr "admin.runners.custom_labels_helper"}}</p>
|
||||
</div>
|
||||
|
||||
<div class="ui divider"></div>
|
||||
|
||||
<div class="field">
|
||||
<button type="submit" class="ui green button">{{.locale.Tr "admin.runners.update_runner"}}</button>
|
||||
<button type="button" class="ui red button delete-button show-modal" data-modal="#runner-delete-modal">
|
||||
{{.locale.Tr "admin.runners.delete_runner"}}</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<h4 class="ui top attached header">
|
||||
{{.locale.Tr "admin.runners.task_list"}}
|
||||
</h4>
|
||||
<div class="ui attached segment">
|
||||
Comming soon
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="ui small modal" id="runner-delete-modal">
|
||||
<div class="header">
|
||||
{{.locale.Tr "admin.runners.delete_runner_header"}}
|
||||
</div>
|
||||
<div class="content">
|
||||
<div class="ui warning message text left">
|
||||
{{.locale.Tr "admin.runners.delete_runner_notice" | Safe}}
|
||||
</div>
|
||||
<form class="ui form" action="{{.Link}}/delete" method="post">
|
||||
<div class="runner-container">
|
||||
{{template "base/alert" .}}
|
||||
<h4 class="ui top attached header">
|
||||
{{.locale.Tr "admin.runners.runner_title"}} #{{.Runner.ID}} {{.Runner.Name}}
|
||||
</h4>
|
||||
<div class="ui attached segment">
|
||||
<form class="ui form" action="{{.Link}}" method="post">
|
||||
{{template "base/disable_form_autofill"}}
|
||||
{{.CsrfTokenHtml}}
|
||||
<input type="hidden" name="action" value="delete">
|
||||
<div class="text right actions">
|
||||
<div class="ui cancel button">{{.locale.Tr "settings.cancel"}}</div>
|
||||
<button class="ui red button">{{.locale.Tr "admin.runners.delete_runner_confirm"}}</button>
|
||||
<div class="runner-basic-info">
|
||||
<div class="field dib">
|
||||
<label>{{.locale.Tr "admin.runners.status"}}</label>
|
||||
<span class="runner-status-{{.Runner.StatusType}}">{{.Runner.StatusType}}</span>
|
||||
</div>
|
||||
<div class="field dib">
|
||||
<label>{{.locale.Tr "admin.runners.latest_online"}}</label>
|
||||
<span>{{TimeSinceUnix .Runner.LastOnline $.locale}}</span>
|
||||
</div>
|
||||
<div class="field dib">
|
||||
<label>{{.locale.Tr "admin.runners.agent_labels"}}</label>
|
||||
<span>
|
||||
{{range .Runner.AgentLabels}}
|
||||
<span>{{.}}</span>
|
||||
{{end}}
|
||||
</span>
|
||||
</div>
|
||||
<div class="field dib">
|
||||
<label>{{.locale.Tr "admin.runners.owner_type"}}</label>
|
||||
<span>{{.Runner.OwnType}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="ui divider"></div>
|
||||
|
||||
<div class="field">
|
||||
<label for="description">{{.locale.Tr "admin.runners.description"}}</label>
|
||||
<input id="description" name="description" value="{{.Runner.Description}}">
|
||||
</div>
|
||||
<div class="field">
|
||||
<label for="custom_labels">{{.locale.Tr "admin.runners.custom_labels"}}</label>
|
||||
<input id="custom_labels" name="custom_labels" value="{{Join .Runner.CustomLabels `,`}}">
|
||||
<p class="help">{{.locale.Tr "admin.runners.custom_labels_helper"}}</p>
|
||||
</div>
|
||||
|
||||
<div class="ui divider"></div>
|
||||
|
||||
<div class="field">
|
||||
<button type="submit" class="ui green button">{{.locale.Tr "admin.runners.update_runner"}}</button>
|
||||
<button type="button" class="ui red button delete-button show-modal" data-modal="#runner-delete-modal">
|
||||
{{.locale.Tr "admin.runners.delete_runner"}}</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<h4 class="ui top attached header">
|
||||
{{.locale.Tr "admin.runners.task_list"}}
|
||||
</h4>
|
||||
<div class="ui attached segment">
|
||||
Comming soon
|
||||
</div>
|
||||
</div>
|
||||
{{template "base/footer" .}}
|
||||
|
@ -62,10 +62,17 @@
|
||||
<tr>
|
||||
<td><span class="runner-status-{{.StatusType}}">{{.StatusType}}</span></td>
|
||||
<td>
|
||||
{{if .Editable $.RunnerOnwerID $.RunnerRepoID}}
|
||||
<a href="{{$.Link}}/{{.ID}}" class="tooltip" data-content="{{.Description}}">
|
||||
<span class="runner-id">#{{.ID}}</span>
|
||||
<span class="runner-name">{{.Name}}</span>
|
||||
</a>
|
||||
{{else}}
|
||||
<p class="tooltip" data-content="{{.Description}}">
|
||||
<span class="runner-id">#{{.ID}}</span>
|
||||
<span class="runner-name">{{.Name}}</span>
|
||||
</p>
|
||||
{{end}}
|
||||
</td>
|
||||
<td>{{.OwnType}}</td>
|
||||
<td class="runner-tags">
|
||||
|
@ -1,6 +1,6 @@
|
||||
@import "variables.less";
|
||||
|
||||
.admin.runners {
|
||||
.runner-container {
|
||||
.runner-ops > a {
|
||||
margin-left: 0.5em;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user