From d75e648970225d8e5038dc950475461e06c7f7a1 Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Sat, 30 May 2026 23:09:07 -0500 Subject: [PATCH] feat(org): add Update Streams settings page in org settings Add "Licenses & Update Streams" tab to org settings sidebar with: - Stream mode: Joomla standard or Custom - Active streams table showing name, suffix, description - Custom streams JSON editor - Saves org-level defaults that repos inherit Ref #265 Co-Authored-By: Claude Opus 4.6 (1M context) --- routers/web/org/update_streams.go | 57 ++++++++++++++++++++ routers/web/web.go | 5 ++ templates/org/settings/navbar.tmpl | 3 ++ templates/org/settings/update_streams.tmpl | 62 ++++++++++++++++++++++ 4 files changed, 127 insertions(+) create mode 100644 routers/web/org/update_streams.go create mode 100644 templates/org/settings/update_streams.tmpl diff --git a/routers/web/org/update_streams.go b/routers/web/org/update_streams.go new file mode 100644 index 0000000000..c4240ed489 --- /dev/null +++ b/routers/web/org/update_streams.go @@ -0,0 +1,57 @@ +// Copyright 2026 Moko Consulting +// 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") +} diff --git a/routers/web/web.go b/routers/web/web.go index d368748520..2a9868596e 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -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) diff --git a/templates/org/settings/navbar.tmpl b/templates/org/settings/navbar.tmpl index 4c06b2cb1b..14d3bec42b 100644 --- a/templates/org/settings/navbar.tmpl +++ b/templates/org/settings/navbar.tmpl @@ -25,6 +25,9 @@ {{ctx.Locale.Tr "packages.title"}} {{end}} + + {{ctx.Locale.Tr "org.settings.update_streams"}} + {{if .EnableActions}}
{{ctx.Locale.Tr "actions.actions"}} diff --git a/templates/org/settings/update_streams.tmpl b/templates/org/settings/update_streams.tmpl new file mode 100644 index 0000000000..f8fd823bba --- /dev/null +++ b/templates/org/settings/update_streams.tmpl @@ -0,0 +1,62 @@ +{{template "org/settings/layout_head" (dict "pageClass" "organization settings")}} +
+

+ {{ctx.Locale.Tr "org.settings.update_streams"}} +

+
+

{{ctx.Locale.Tr "org.settings.update_streams_desc"}}

+
+ {{.CsrfTokenHtml}} + +
+ +
+
+ + +
+
+
+
+ + +
+
+
+ +
+ +

{{ctx.Locale.Tr "org.settings.default_streams_joomla"}}

+ + + + + + + + + + {{range .EffectiveStreams}} + + + + + + {{end}} + +
{{ctx.Locale.Tr "org.settings.stream_name"}}{{ctx.Locale.Tr "org.settings.stream_suffix"}}{{ctx.Locale.Tr "repo.licenses.description"}}
{{.Name}}{{if .Suffix}}{{.Suffix}}{{else}}(no suffix){{end}}{{.Description}}
+
+ +
+ + +

{{ctx.Locale.Tr "org.settings.custom_streams_help"}}

+
+ +
+ +
+
+
+
+{{template "org/settings/layout_footer" .}} -- 2.52.0