UI: Split runner edit page with capabilities panel on right
Some checks failed
Build and Release / Create Release (push) Has been skipped
Build and Release / Unit Tests (push) Successful in 2m1s
Build and Release / Integration Tests (PostgreSQL) (push) Successful in 2m22s
Build and Release / Lint (push) Failing after 2m48s
Build and Release / Build Binaries (amd64, darwin) (push) Has been skipped
Build and Release / Build Binaries (amd64, linux) (push) Has been skipped
Build and Release / Build Binaries (amd64, windows) (push) Has been skipped
Build and Release / Build Binaries (arm64, darwin) (push) Has been skipped
Build and Release / Build Binaries (arm64, linux) (push) Has been skipped

- Two-column layout: basic info left, capabilities right
- Task list remains full-width below
- Vertical layout for capabilities (better for future expansion)
- Shows Docker availability status
This commit is contained in:
GitCaddy 2026-01-11 07:22:13 +00:00
parent 5ca3661c33
commit 469551095b

View File

@ -3,97 +3,122 @@
{{ctx.Locale.Tr "actions.runners.runner_title"}} {{.Runner.ID}} {{.Runner.Name}}
</h4>
<div class="ui attached segment">
<form class="ui form" method="post">
{{template "base/disable_form_autofill"}}
<div class="runner-basic-info">
<div class="field tw-inline-block tw-mr-4">
<label>{{ctx.Locale.Tr "actions.runners.status"}}</label>
<span class="ui {{if .Runner.IsOnline}}green{{else}}basic{{end}} label">{{.Runner.StatusLocaleName ctx.Locale}}</span>
</div>
<div class="field tw-inline-block tw-mr-4">
<label>{{ctx.Locale.Tr "actions.runners.last_online"}}</label>
<span>{{if .Runner.LastOnline}}{{DateUtils.TimeSince .Runner.LastOnline}}{{else}}{{ctx.Locale.Tr "never"}}{{end}}</span>
</div>
<div class="field tw-inline-block tw-mr-4">
<label>{{ctx.Locale.Tr "actions.runners.labels"}}</label>
<span>
{{range .Runner.AgentLabels}}
<span class="ui label">{{.}}</span>
{{end}}
</span>
</div>
<div class="field tw-inline-block tw-mr-4">
<label>{{ctx.Locale.Tr "actions.runners.owner_type"}}</label>
<span data-tooltip-content="{{.Runner.BelongsToOwnerName}}">{{.Runner.BelongsToOwnerType.LocaleString ctx.Locale}}</span>
</div>
<div class="ui two column stackable grid">
<!-- Left Column: Basic Info & Controls -->
<div class="column">
<form class="ui form" method="post">
{{template "base/disable_form_autofill"}}
<div class="runner-basic-info">
<div class="field">
<label>{{ctx.Locale.Tr "actions.runners.status"}}</label>
<span class="ui {{if .Runner.IsOnline}}green{{else}}basic{{end}} label">{{.Runner.StatusLocaleName ctx.Locale}}</span>
</div>
<div class="field">
<label>{{ctx.Locale.Tr "actions.runners.last_online"}}</label>
<span>{{if .Runner.LastOnline}}{{DateUtils.TimeSince .Runner.LastOnline}}{{else}}{{ctx.Locale.Tr "never"}}{{end}}</span>
</div>
<div class="field">
<label>{{ctx.Locale.Tr "actions.runners.labels"}}</label>
<span>
{{range .Runner.AgentLabels}}
<span class="ui label">{{.}}</span>
{{end}}
</span>
</div>
<div class="field">
<label>{{ctx.Locale.Tr "actions.runners.owner_type"}}</label>
<span data-tooltip-content="{{.Runner.BelongsToOwnerName}}">{{.Runner.BelongsToOwnerType.LocaleString ctx.Locale}}</span>
</div>
</div>
<div class="divider"></div>
<div class="field">
<label for="description">{{ctx.Locale.Tr "actions.runners.description"}}</label>
<input id="description" name="description" value="{{.Runner.Description}}">
</div>
<div class="divider"></div>
<div class="field">
<button class="ui primary button" data-url="{{.Link}}">{{ctx.Locale.Tr "actions.runners.update_runner"}}</button>
<button class="ui red button delete-button" data-url="{{.Link}}/delete" data-modal="#runner-delete-modal">
{{ctx.Locale.Tr "actions.runners.delete_runner"}}</button>
</div>
</form>
</div>
{{if .Runner.CapabilitiesJSON}}
<div class="divider"></div>
<div class="field">
<label>{{ctx.Locale.Tr "actions.runners.capabilities"}}</label>
<!-- Right Column: Capabilities -->
<div class="column">
{{if .Runner.CapabilitiesJSON}}
<div class="ui segment runner-capabilities">
<h5 class="ui header">{{ctx.Locale.Tr "actions.runners.capabilities"}}</h5>
{{if .RunnerCapabilities}}
<div class="tw-flex tw-flex-wrap tw-gap-4">
{{if .RunnerCapabilities.OS}}
<div class="tw-inline-block tw-mr-4">
<strong>{{ctx.Locale.Tr "actions.runners.capabilities.os"}}:</strong>
<span class="ui label">{{.RunnerCapabilities.OS}}/{{.RunnerCapabilities.Arch}}</span>
</div>
{{end}}
{{if .RunnerCapabilities.OS}}
<div class="field tw-mb-3">
<label>{{ctx.Locale.Tr "actions.runners.capabilities.os"}}</label>
<span class="ui label">{{.RunnerCapabilities.OS}}/{{.RunnerCapabilities.Arch}}</span>
</div>
{{end}}
<div class="field tw-mb-3">
<label>{{ctx.Locale.Tr "actions.runners.capabilities.docker"}}</label>
{{if .RunnerCapabilities.Docker}}
<div class="tw-inline-block tw-mr-4">
<strong>{{ctx.Locale.Tr "actions.runners.capabilities.docker"}}:</strong>
<span class="ui green label">{{svg "octicon-check" 14}} {{ctx.Locale.Tr "actions.runners.capabilities.available"}}</span>
</div>
<span class="ui green label">{{svg "octicon-check" 14}} {{ctx.Locale.Tr "actions.runners.capabilities.available"}}</span>
{{else}}
<span class="ui basic label">{{svg "octicon-x" 14}} Not available</span>
{{end}}
{{if .RunnerCapabilities.Shell}}
<div class="tw-inline-block tw-mr-4">
<strong>{{ctx.Locale.Tr "actions.runners.capabilities.shells"}}:</strong>
</div>
{{if .RunnerCapabilities.Shell}}
<div class="field tw-mb-3">
<label>{{ctx.Locale.Tr "actions.runners.capabilities.shells"}}</label>
<div>
{{range .RunnerCapabilities.Shell}}
<span class="ui label">{{.}}</span>
{{end}}
</div>
{{end}}
</div>
{{end}}
{{if .RunnerCapabilities.Tools}}
<div class="tw-mt-2">
<strong>{{ctx.Locale.Tr "actions.runners.capabilities.tools"}}:</strong>
<div class="tw-flex tw-flex-wrap tw-gap-2 tw-mt-1">
<div class="field tw-mb-3">
<label>{{ctx.Locale.Tr "actions.runners.capabilities.tools"}}</label>
<div class="tw-flex tw-flex-wrap tw-gap-1">
{{range $tool, $versions := .RunnerCapabilities.Tools}}
<span class="ui label">{{$tool}} {{range $versions}}{{.}} {{end}}</span>
<span class="ui small label">{{$tool}} {{range $versions}}{{.}} {{end}}</span>
{{end}}
</div>
</div>
{{end}}
{{if .RunnerCapabilities.Disk}}
<div class="tw-mt-3">
<strong>{{ctx.Locale.Tr "actions.runners.capabilities.disk"}}:</strong>
<div class="tw-mt-1">
{{$diskUsed := .RunnerCapabilities.Disk.UsedPercent}}
{{$diskFreeGB := DivideFloat64 (Int64ToFloat64 .RunnerCapabilities.Disk.Free) 1073741824.0}}
{{$diskTotalGB := DivideFloat64 (Int64ToFloat64 .RunnerCapabilities.Disk.Total) 1073741824.0}}
{{$diskUsedInt := printf "%.0f" $diskUsed}}
<div class="ui small progress {{if ge $diskUsed 95.0}}red{{else if ge $diskUsed 85.0}}yellow{{else}}green{{end}}" data-percent="{{$diskUsedInt}}">
<div class="bar" style="width: {{$diskUsedInt}}%;">
<div class="progress">{{printf "%.1f" $diskUsed}}%</div>
</div>
</div>
<div class="tw-text-sm tw-text-secondary tw-mt-1">
{{printf "%.1f" $diskFreeGB}} GB {{ctx.Locale.Tr "actions.runners.capabilities.disk_free"}} / {{printf "%.1f" $diskTotalGB}} GB {{ctx.Locale.Tr "actions.runners.capabilities.disk_total"}}
{{if ge $diskUsed 95.0}}
<span class="ui red text tw-ml-2">{{svg "octicon-alert" 14}} {{ctx.Locale.Tr "actions.runners.capabilities.disk_critical"}}</span>
{{else if ge $diskUsed 85.0}}
<span class="ui yellow text tw-ml-2">{{svg "octicon-alert" 14}} {{ctx.Locale.Tr "actions.runners.capabilities.disk_warning"}}</span>
{{end}}
<div class="field tw-mb-3">
<label>{{ctx.Locale.Tr "actions.runners.capabilities.disk"}}</label>
{{$diskUsed := .RunnerCapabilities.Disk.UsedPercent}}
{{$diskFreeGB := DivideFloat64 (Int64ToFloat64 .RunnerCapabilities.Disk.Free) 1073741824.0}}
{{$diskTotalGB := DivideFloat64 (Int64ToFloat64 .RunnerCapabilities.Disk.Total) 1073741824.0}}
{{$diskUsedInt := printf "%.0f" $diskUsed}}
<div class="ui small progress {{if ge $diskUsed 95.0}}red{{else if ge $diskUsed 85.0}}yellow{{else}}green{{end}}" data-percent="{{$diskUsedInt}}" style="margin-bottom: 0.5em;">
<div class="bar" style="width: {{$diskUsedInt}}%;">
<div class="progress">{{printf "%.1f" $diskUsed}}%</div>
</div>
</div>
<div class="tw-text-sm tw-text-secondary">
{{printf "%.1f" $diskFreeGB}} GB free / {{printf "%.1f" $diskTotalGB}} GB total
{{if ge $diskUsed 95.0}}
<span class="ui red text tw-ml-2">{{svg "octicon-alert" 14}}</span>
{{else if ge $diskUsed 85.0}}
<span class="ui yellow text tw-ml-2">{{svg "octicon-alert" 14}}</span>
{{end}}
</div>
</div>
{{end}}
{{if .RunnerCapabilities.Limitations}}
<div class="tw-mt-2">
<strong>{{ctx.Locale.Tr "actions.runners.capabilities.limitations"}}:</strong>
<ul class="tw-mt-1 tw-ml-4">
<div class="field tw-mb-3">
<label>{{ctx.Locale.Tr "actions.runners.capabilities.limitations"}}</label>
<ul class="tw-mt-1 tw-ml-4 tw-text-sm">
{{range .RunnerCapabilities.Limitations}}
<li>{{.}}</li>
{{end}}
@ -104,24 +129,14 @@
<pre class="tw-text-sm"><code>{{.Runner.CapabilitiesJSON}}</code></pre>
{{end}}
</div>
{{else}}
<div class="ui segment">
<h5 class="ui header">{{ctx.Locale.Tr "actions.runners.capabilities"}}</h5>
<p class="tw-text-secondary">No capabilities reported</p>
</div>
{{end}}
</div>
{{end}}
<div class="divider"></div>
<div class="field">
<label for="description">{{ctx.Locale.Tr "actions.runners.description"}}</label>
<input id="description" name="description" value="{{.Runner.Description}}">
</div>
<div class="divider"></div>
<div class="field">
<button class="ui primary button" data-url="{{.Link}}">{{ctx.Locale.Tr "actions.runners.update_runner"}}</button>
<button class="ui red button delete-button" data-url="{{.Link}}/delete" data-modal="#runner-delete-modal">
{{ctx.Locale.Tr "actions.runners.delete_runner"}}</button>
</div>
</form>
</div>
</div>
<h4 class="ui top attached header">