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