feat(org): Update Streams settings page + package edit/delete #290

Merged
jmiller merged 1 commits from feat/repo-update-settings into dev 2026-05-31 04:09:36 +00:00
4 changed files with 127 additions and 0 deletions
+57
View File
@@ -0,0 +1,57 @@
// Copyright 2026 Moko Consulting <hello@mokoconsulting.tech>
// SPDX-License-Identifier: GPL-3.0-or-later
package org
import (
"net/http"
"git.mokoconsulting.tech/MokoConsulting/MokoGitea/models/licenses"
"git.mokoconsulting.tech/MokoConsulting/MokoGitea/modules/templates"
"git.mokoconsulting.tech/MokoConsulting/MokoGitea/services/context"
)
const tplSettingsUpdateStreams templates.TplName = "org/settings/update_streams"
// SettingsUpdateStreams shows the org-level update stream settings.
func SettingsUpdateStreams(ctx *context.Context) {
ctx.Data["Title"] = ctx.Tr("org.settings.update_streams")
ctx.Data["PageIsOrgSettings"] = true
ctx.Data["PageIsSettingsUpdateStreams"] = true
orgID := ctx.Org.Organization.ID
cfg, err := licenses.GetOrgConfig(ctx, orgID)
if err != nil {
ctx.ServerError("GetOrgConfig", err)
return
}
ctx.Data["StreamConfig"] = cfg
ctx.Data["EffectiveStreams"] = cfg.GetActiveStreams()
ctx.HTML(http.StatusOK, tplSettingsUpdateStreams)
}
// SettingsUpdateStreamsPost saves the org-level update stream settings.
func SettingsUpdateStreamsPost(ctx *context.Context) {
orgID := ctx.Org.Organization.ID
cfg := &licenses.UpdateStreamConfig{
OwnerID: orgID,
RepoID: 0,
StreamMode: ctx.FormString("stream_mode"),
CustomStreams: ctx.FormString("custom_streams"),
}
if cfg.StreamMode == "" {
cfg.StreamMode = "joomla"
}
if err := licenses.SaveConfig(ctx, cfg); err != nil {
ctx.ServerError("SaveConfig", err)
return
}
ctx.Flash.Success(ctx.Tr("org.settings.update_streams_saved"))
ctx.Redirect(ctx.Org.OrgLink + "/settings/update-streams")
}
+5
View File
@@ -1057,6 +1057,11 @@ func registerWebRoutes(m *web.Router, webAuth *AuthMiddleware) {
m.Get("", org.BlockedUsers)
m.Post("", web.Bind(forms.BlockUserForm{}), org.BlockedUsersPost)
})
m.Group("/update-streams", func() {
m.Get("", org.SettingsUpdateStreams)
m.Post("", org.SettingsUpdateStreamsPost)
})
}, ctxDataSet("EnableOAuth2", setting.OAuth2.Enabled, "EnablePackages", setting.Packages.Enabled, "PageIsOrgSettings", true))
}, context.OrgAssignment(context.OrgAssignmentOptions{RequireOwner: true}))
}, reqSignIn)
+3
View File
@@ -25,6 +25,9 @@
{{ctx.Locale.Tr "packages.title"}}
</a>
{{end}}
<a class="{{if .PageIsSettingsUpdateStreams}}active {{end}}item" href="{{.OrgLink}}/settings/update-streams">
{{ctx.Locale.Tr "org.settings.update_streams"}}
</a>
{{if .EnableActions}}
<details class="item toggleable-item" {{if or .PageIsOrgSettingsActionsGeneral .PageIsSharedSettingsRunners .PageIsSharedSettingsSecrets .PageIsSharedSettingsVariables}}open{{end}}>
<summary>{{ctx.Locale.Tr "actions.actions"}}</summary>
@@ -0,0 +1,62 @@
{{template "org/settings/layout_head" (dict "pageClass" "organization settings")}}
<div class="org-setting-content">
<h4 class="ui top attached header">
{{ctx.Locale.Tr "org.settings.update_streams"}}
</h4>
<div class="ui attached segment">
<p>{{ctx.Locale.Tr "org.settings.update_streams_desc"}}</p>
<form class="ui form" method="post" action="{{.OrgLink}}/settings/update-streams">
{{.CsrfTokenHtml}}
<div class="grouped fields">
<label>{{ctx.Locale.Tr "org.settings.stream_mode"}}</label>
<div class="field">
<div class="ui radio checkbox">
<input name="stream_mode" type="radio" value="joomla" {{if or (eq .StreamConfig.StreamMode "") (eq .StreamConfig.StreamMode "joomla")}}checked{{end}}>
<label>{{ctx.Locale.Tr "org.settings.stream_mode_joomla"}}</label>
</div>
</div>
<div class="field">
<div class="ui radio checkbox">
<input name="stream_mode" type="radio" value="custom" {{if eq .StreamConfig.StreamMode "custom"}}checked{{end}}>
<label>{{ctx.Locale.Tr "org.settings.stream_mode_custom"}}</label>
</div>
</div>
</div>
<div class="field">
<label>{{ctx.Locale.Tr "org.settings.default_streams"}}</label>
<p class="help">{{ctx.Locale.Tr "org.settings.default_streams_joomla"}}</p>
<table class="ui small table">
<thead>
<tr>
<th>{{ctx.Locale.Tr "org.settings.stream_name"}}</th>
<th>{{ctx.Locale.Tr "org.settings.stream_suffix"}}</th>
<th>{{ctx.Locale.Tr "repo.licenses.description"}}</th>
</tr>
</thead>
<tbody>
{{range .EffectiveStreams}}
<tr>
<td><code>{{.Name}}</code></td>
<td>{{if .Suffix}}<code>{{.Suffix}}</code>{{else}}<em>(no suffix)</em>{{end}}</td>
<td>{{.Description}}</td>
</tr>
{{end}}
</tbody>
</table>
</div>
<div class="field">
<label>{{ctx.Locale.Tr "org.settings.custom_streams"}}</label>
<textarea name="custom_streams" rows="6" placeholder='[{"name":"lts","suffix":"-lts","description":"Long-term support"}]'>{{.StreamConfig.CustomStreams}}</textarea>
<p class="help">{{ctx.Locale.Tr "org.settings.custom_streams_help"}}</p>
</div>
<div class="field">
<button class="ui primary button">{{ctx.Locale.Tr "save"}}</button>
</div>
</form>
</div>
</div>
{{template "org/settings/layout_footer" .}}