admin interface: Introduce seperate instance page

This commit is contained in:
Tom Wiesing 2023-02-03 14:11:52 +01:00
parent a420155c7c
commit 34d1f557a0
No known key found for this signature in database
7 changed files with 83 additions and 50 deletions

View file

@ -85,6 +85,12 @@ func (admin *Admin) HandleRoute(ctx context.Context, route string) (handler http
router.Handler(http.MethodGet, route, index) router.Handler(http.MethodGet, route, index)
} }
// add a handler for the instances page
{
instances := admin.instances(ctx)
router.Handler(http.MethodGet, route+"instance/", instances)
}
// add a handler for the user page // add a handler for the user page
{ {
users := admin.users(ctx) users := admin.users(ctx)

View file

@ -35,6 +35,7 @@ func (admin *Admin) components(ctx context.Context) http.Handler {
admin.Dependencies.Templating, admin.Dependencies.Templating,
templating.Crumbs( templating.Crumbs(
component.MenuItem{Title: "Admin", Path: "/admin/"}, component.MenuItem{Title: "Admin", Path: "/admin/"},
component.MenuItem{Title: "Instances", Path: "/admin/instance/"},
component.MenuItem{Title: "Components", Path: "/admin/components/"}, component.MenuItem{Title: "Components", Path: "/admin/components/"},
), ),
templating.Title("Components"), templating.Title("Components"),
@ -51,6 +52,7 @@ func (admin *Admin) ingredients(ctx context.Context) http.Handler {
admin.Dependencies.Templating, admin.Dependencies.Templating,
templating.Crumbs( templating.Crumbs(
component.MenuItem{Title: "Admin", Path: "/admin/"}, component.MenuItem{Title: "Admin", Path: "/admin/"},
component.MenuItem{Title: "Instances", Path: "/admin/instance/"},
component.DummyMenuItem, component.DummyMenuItem,
component.DummyMenuItem, component.DummyMenuItem,
), ),
@ -68,8 +70,8 @@ func (admin *Admin) ingredients(ctx context.Context) http.Handler {
return ac, nil, err return ac, nil, err
} }
funcs = []templating.FlagFunc{ funcs = []templating.FlagFunc{
templating.ReplaceCrumb(1, component.MenuItem{Title: "Instance", Path: template.URL("/admin/instance/" + slug)}), templating.ReplaceCrumb(2, component.MenuItem{Title: "Instance", Path: template.URL("/admin/instance/" + slug)}),
templating.ReplaceCrumb(2, component.MenuItem{Title: "Ingredients", Path: template.URL("/admin/instance/" + slug + "/ingredients/")}), templating.ReplaceCrumb(3, component.MenuItem{Title: "Ingredients", Path: template.URL("/admin/instance/" + slug + "/ingredients/")}),
templating.Title(instance.Name() + " - Ingredients"), templating.Title(instance.Name() + " - Ingredients"),
} }

View file

@ -46,6 +46,7 @@ func (admin *Admin) grants(ctx context.Context) http.Handler {
admin.Dependencies.Templating, admin.Dependencies.Templating,
templating.Crumbs( templating.Crumbs(
component.MenuItem{Title: "Admin", Path: "/admin/"}, component.MenuItem{Title: "Admin", Path: "/admin/"},
component.MenuItem{Title: "Instances", Path: "/admin/instance/"},
component.DummyMenuItem, component.DummyMenuItem,
component.DummyMenuItem, component.DummyMenuItem,
), ),
@ -136,8 +137,8 @@ func (gc *grantsContext) use(r *http.Request, slug string, admin *Admin) (funcs
// replace the functions // replace the functions
funcs = []templating.FlagFunc{ funcs = []templating.FlagFunc{
templating.ReplaceCrumb(1, component.MenuItem{Title: "Instance", Path: template.URL("/admin/instance/" + slug)}), templating.ReplaceCrumb(2, component.MenuItem{Title: "Instance", Path: template.URL("/admin/instance/" + slug)}),
templating.ReplaceCrumb(2, component.MenuItem{Title: "Grants", Path: template.URL("/admin/instance/" + slug + "/grants/")}), templating.ReplaceCrumb(3, component.MenuItem{Title: "Grants", Path: template.URL("/admin/instance/" + slug + "/grants/")}),
templating.Title(gc.Instance.Slug + " - Grants"), templating.Title(gc.Instance.Slug + " - Grants"),
} }
return funcs, nil return funcs, nil

View file

@ -208,48 +208,3 @@
</tbody> </tbody>
</table> </table>
</div> </div>
<div class="pure-u-1">
<h2 id="instances">Instances</h2>
<table class="pure-table pure-table-bordered padding">
<thead>
<tr>
<th>Total</th>
<th>Running</th>
<th>Stopped</th>
</tr>
</thead>
<tbody>
<tr>
<td>
{{ .TotalCount }}
</td>
<td>
{{ .RunningCount }}
</td>
<td>
{{ .StoppedCount }}
</td>
</tr>
</tbody>
</table>
<span class="hspace"></span>
</div>
{{range .Instances}}
<div class="pure-u-1 pure-u-xl-1-3">
<div class="wisski {{ if .Running }}running{{ else }}stopped{{ end }}">
<h3>
{{.Slug}}
{{ if not .Running }}&nbsp;<small>not running</small>{{ end }}
</h3>
<p>
<a href="{{.URL}}" target="_blank" rel="noopener noreferrer">{{.URL}}</a><br>
<a class="pure-button" href="/admin/instance/{{.Slug}}">Details</a>
</p>
</div>
</div>
{{end}}

View file

@ -0,0 +1,43 @@
<div class="pure-u-1">
<table class="pure-table pure-table-bordered padding">
<thead>
<tr>
<th>Total</th>
<th>Running</th>
<th>Stopped</th>
</tr>
</thead>
<tbody>
<tr>
<td>
{{ .TotalCount }}
</td>
<td>
{{ .RunningCount }}
</td>
<td>
{{ .StoppedCount }}
</td>
</tr>
</tbody>
</table>
<span class="hspace"></span>
</div>
{{range .Instances}}
<div class="pure-u-1 pure-u-xl-2-3">
<div class="wisski {{ if .Running }}running{{ else }}stopped{{ end }}">
<h3>
{{.Slug}}
{{ if not .Running }}&nbsp;<small>not running</small>{{ end }}
</h3>
<p>
<a href="{{.URL}}" target="_blank" rel="noopener noreferrer">{{.URL}}</a><br>
<a class="pure-button" href="/admin/instance/{{.Slug}}">Details</a>
</p>
</div>
</div>
{{end}}

View file

@ -87,6 +87,15 @@ var indexTemplate = templating.Parse[indexContext](
templating.Assets(assets.AssetsAdmin), templating.Assets(assets.AssetsAdmin),
) )
//go:embed "html/instances.html"
var instancesHTML []byte
var instancesTemplate = templating.Parse[indexContext](
"instances.html", instancesHTML, nil,
templating.Title("Instances"),
templating.Assets(assets.AssetsAdmin),
)
type indexContext struct { type indexContext struct {
templating.RuntimeFlags templating.RuntimeFlags
@ -102,10 +111,26 @@ func (admin *Admin) index(ctx context.Context) http.Handler {
), ),
templating.Actions( templating.Actions(
component.MenuItem{Title: "Users", Path: "/admin/users/"}, component.MenuItem{Title: "Users", Path: "/admin/users/"},
component.MenuItem{Title: "Instances", Path: "/admin/instance/"},
component.MenuItem{Title: "Components", Path: "/admin/components/", Priority: component.SmallButton}, component.MenuItem{Title: "Components", Path: "/admin/components/", Priority: component.SmallButton},
), ),
) )
return tpl.HTMLHandler(func(r *http.Request) (idx indexContext, err error) {
idx.Distillery, idx.Instances, err = admin.Status(r.Context(), false)
return
})
}
func (admin *Admin) instances(ctx context.Context) http.Handler {
tpl := instancesTemplate.Prepare(
admin.Dependencies.Templating,
templating.Crumbs(
component.MenuItem{Title: "Admin", Path: "/admin/"},
component.MenuItem{Title: "Instances", Path: "/admin/instance/"},
),
)
return tpl.HTMLHandler(func(r *http.Request) (idx indexContext, err error) { return tpl.HTMLHandler(func(r *http.Request) (idx indexContext, err error) {
idx.Distillery, idx.Instances, err = admin.Status(r.Context(), true) idx.Distillery, idx.Instances, err = admin.Status(r.Context(), true)
return return

View file

@ -36,6 +36,7 @@ func (admin *Admin) instance(ctx context.Context) http.Handler {
admin.Dependencies.Templating, admin.Dependencies.Templating,
templating.Crumbs( templating.Crumbs(
component.MenuItem{Title: "Admin", Path: "/admin/"}, component.MenuItem{Title: "Admin", Path: "/admin/"},
component.MenuItem{Title: "Instances", Path: "/admin/instance/"},
component.DummyMenuItem, component.DummyMenuItem,
), ),
templating.Actions( templating.Actions(
@ -64,7 +65,7 @@ func (admin *Admin) instance(ctx context.Context) http.Handler {
} }
funcs = []templating.FlagFunc{ funcs = []templating.FlagFunc{
templating.ReplaceCrumb(1, component.MenuItem{Title: "Instance", Path: template.URL("/admin/instance/" + slug)}), templating.ReplaceCrumb(2, component.MenuItem{Title: "Instance", Path: template.URL("/admin/instance/" + slug)}),
templating.ReplaceAction(0, component.MenuItem{Title: "Grants", Path: template.URL("/admin/grants/" + slug)}), templating.ReplaceAction(0, component.MenuItem{Title: "Grants", Path: template.URL("/admin/grants/" + slug)}),
templating.ReplaceAction(1, component.MenuItem{Title: "Ingredients", Path: template.URL("/admin/ingredients/" + slug), Priority: component.SmallButton}), templating.ReplaceAction(1, component.MenuItem{Title: "Ingredients", Path: template.URL("/admin/ingredients/" + slug), Priority: component.SmallButton}),