From 4e32224330deec2e991b0731e233b0d880c8c140 Mon Sep 17 00:00:00 2001 From: logikonline Date: Mon, 16 Mar 2026 23:50:12 -0400 Subject: [PATCH] refactor(pages): move comparison config to dedicated settings page Extract comparison table configuration from Content page to new Comparison settings page. Content page now only has enable/disable toggle with link to full config. New page includes dynamic UI for managing groups and features with add/remove buttons. Improves UX by separating complex comparison config from other content settings. Adds navigation tab and route for /settings/pages/comparison. --- options/locale/locale_en-US.json | 12 ++ routers/web/repo/setting/pages.go | 41 ++++-- routers/web/web.go | 1 + templates/repo/settings/pages_comparison.tmpl | 125 ++++++++++++++++++ templates/repo/settings/pages_content.tmpl | 111 +--------------- templates/repo/settings/pages_nav.tmpl | 3 + 6 files changed, 172 insertions(+), 121 deletions(-) create mode 100644 templates/repo/settings/pages_comparison.tmpl diff --git a/options/locale/locale_en-US.json b/options/locale/locale_en-US.json index 0dbf1915ba..95cce59648 100644 --- a/options/locale/locale_en-US.json +++ b/options/locale/locale_en-US.json @@ -4557,6 +4557,18 @@ "repo.settings.pages.gallery_max_images": "Maximum Images to Show", "repo.settings.pages.gallery_columns": "Grid Columns", "repo.settings.pages.gallery_help_link": "Upload and manage gallery images in Settings > Gallery.", + "repo.settings.pages.comparison": "Comparison", + "repo.settings.pages.comparison_section": "Comparison Section", + "repo.settings.pages.comparison_enabled_desc": "Show a feature comparison table on the landing page", + "repo.settings.pages.comparison_headline": "Headline", + "repo.settings.pages.comparison_subheadline": "Subheadline", + "repo.settings.pages.comparison_columns": "Comparison Columns", + "repo.settings.pages.comparison_columns_help": "Define three columns for your comparison table (e.g., your product vs. two competitors, or three tiers).", + "repo.settings.pages.comparison_highlight": "Highlight", + "repo.settings.pages.comparison_features": "Features & Groups", + "repo.settings.pages.comparison_features_help": "Organize features into optional groups. For each cell, enter \"true\" for a checkmark, \"false\" for an X, or any text.", + "repo.settings.pages.comparison_group_name": "Group Name", + "repo.settings.pages.comparison_help_link": "Configure comparison columns and features in Settings > Landing Pages > Comparison.", "repo.settings.pages.ai_generate": "AI Content Generator", "repo.settings.pages.ai_generate_desc": "Automatically generate landing page content (headline, features, stats, CTAs) from your repository's README and metadata using AI.", "repo.settings.pages.ai_generate_button": "Generate Content with AI", diff --git a/routers/web/repo/setting/pages.go b/routers/web/repo/setting/pages.go index ead87d663c..eebb4337aa 100644 --- a/routers/web/repo/setting/pages.go +++ b/routers/web/repo/setting/pages.go @@ -26,15 +26,16 @@ import ( ) const ( - tplRepoSettingsPages templates.TplName = "repo/settings/pages" - tplRepoSettingsPagesBrand templates.TplName = "repo/settings/pages_brand" - tplRepoSettingsPagesHero templates.TplName = "repo/settings/pages_hero" - tplRepoSettingsPagesContent templates.TplName = "repo/settings/pages_content" - tplRepoSettingsPagesSocial templates.TplName = "repo/settings/pages_social" - tplRepoSettingsPagesPricing templates.TplName = "repo/settings/pages_pricing" - tplRepoSettingsPagesFooter templates.TplName = "repo/settings/pages_footer" - tplRepoSettingsPagesTheme templates.TplName = "repo/settings/pages_theme" - tplRepoSettingsPagesLanguages templates.TplName = "repo/settings/pages_languages" + tplRepoSettingsPages templates.TplName = "repo/settings/pages" + tplRepoSettingsPagesBrand templates.TplName = "repo/settings/pages_brand" + tplRepoSettingsPagesHero templates.TplName = "repo/settings/pages_hero" + tplRepoSettingsPagesContent templates.TplName = "repo/settings/pages_content" + tplRepoSettingsPagesComparison templates.TplName = "repo/settings/pages_comparison" + tplRepoSettingsPagesSocial templates.TplName = "repo/settings/pages_social" + tplRepoSettingsPagesPricing templates.TplName = "repo/settings/pages_pricing" + tplRepoSettingsPagesFooter templates.TplName = "repo/settings/pages_footer" + tplRepoSettingsPagesTheme templates.TplName = "repo/settings/pages_theme" + tplRepoSettingsPagesLanguages templates.TplName = "repo/settings/pages_languages" ) // getPagesLandingConfig loads the landing page configuration @@ -499,8 +500,26 @@ func PagesContentPost(ctx *context.Context) { } config.Features = append(config.Features, pages_module.FeatureConfig{Title: title, Description: desc, Icon: icon, ImageURL: imageURL}) } - // Comparison section + // Comparison enabled toggle (full config is on /settings/pages/comparison) config.Comparison.Enabled = ctx.FormBool("comparison_enabled") + if err := savePagesLandingConfig(ctx, config); err != nil { + ctx.ServerError("SavePagesConfig", err) + return + } + ctx.Flash.Success(ctx.Tr("repo.settings.pages.saved")) + ctx.Redirect(ctx.Repo.Repository.Link() + "/settings/pages/content") +} + +func PagesComparison(ctx *context.Context) { + ctx.Data["Title"] = ctx.Tr("repo.settings.pages.comparison") + ctx.Data["PageIsSettingsPages"] = true + ctx.Data["PageIsSettingsPagesComparison"] = true + setCommonPagesData(ctx) + ctx.HTML(http.StatusOK, tplRepoSettingsPagesComparison) +} + +func PagesComparisonPost(ctx *context.Context) { + config := getPagesLandingConfig(ctx) config.Comparison.Headline = ctx.FormString("comparison_headline") config.Comparison.Subheadline = ctx.FormString("comparison_subheadline") config.Comparison.Columns = make([]pages_module.ComparisonColumnConfig, 3) @@ -535,7 +554,7 @@ func PagesContentPost(ctx *context.Context) { return } ctx.Flash.Success(ctx.Tr("repo.settings.pages.saved")) - ctx.Redirect(ctx.Repo.Repository.Link() + "/settings/pages/content") + ctx.Redirect(ctx.Repo.Repository.Link() + "/settings/pages/comparison") } func PagesSocial(ctx *context.Context) { diff --git a/routers/web/web.go b/routers/web/web.go index 60a4ad5c10..420f47cb4f 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -1341,6 +1341,7 @@ func registerWebRoutes(m *web.Router) { m.Post("/hero/upload_image", repo_setting.PagesHeroUploadImage) m.Post("/hero/delete_image", repo_setting.PagesHeroDeleteImage) m.Combo("/content").Get(repo_setting.PagesContent).Post(repo_setting.PagesContentPost) + m.Combo("/comparison").Get(repo_setting.PagesComparison).Post(repo_setting.PagesComparisonPost) m.Combo("/social").Get(repo_setting.PagesSocial).Post(repo_setting.PagesSocialPost) m.Combo("/pricing").Get(repo_setting.PagesPricing).Post(repo_setting.PagesPricingPost) m.Combo("/footer").Get(repo_setting.PagesFooter).Post(repo_setting.PagesFooterPost) diff --git a/templates/repo/settings/pages_comparison.tmpl b/templates/repo/settings/pages_comparison.tmpl new file mode 100644 index 0000000000..22b20e8363 --- /dev/null +++ b/templates/repo/settings/pages_comparison.tmpl @@ -0,0 +1,125 @@ +{{template "repo/settings/layout_head" (dict "ctxData" . "pageClass" "repository settings pages")}} +
+

{{ctx.Locale.Tr "repo.settings.pages.comparison"}}

+
+
+ {{.CsrfTokenHtml}} +
+ + +
+
+ + +
+
{{ctx.Locale.Tr "repo.settings.pages.comparison_columns"}}
+

{{ctx.Locale.Tr "repo.settings.pages.comparison_columns_help"}}

+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+
{{ctx.Locale.Tr "repo.settings.pages.comparison_features"}}
+

{{ctx.Locale.Tr "repo.settings.pages.comparison_features_help"}}

+
+ {{if .Config.Comparison.Groups}} + {{range $g, $group := .Config.Comparison.Groups}} +
+
+ + +
+
+ {{range $f, $feat := $group.Features}} +
+
+
+
+
+
+ {{end}} +
+ +
+ {{end}} + {{else}} +
+
+ + +
+
+
+
+
+
+
+
+
+ +
+ {{end}} +
+ +
+ +
+
+
+
+ +{{template "repo/settings/layout_footer" .}} diff --git a/templates/repo/settings/pages_content.tmpl b/templates/repo/settings/pages_content.tmpl index b174053132..95b3811b58 100644 --- a/templates/repo/settings/pages_content.tmpl +++ b/templates/repo/settings/pages_content.tmpl @@ -123,90 +123,7 @@ -
- - -
-
- - -
-
{{ctx.Locale.Tr "repo.settings.pages.comparison_columns"}}
-

{{ctx.Locale.Tr "repo.settings.pages.comparison_columns_help"}}

-
-
- - -
-
- - -
-
-
-
- - -
-
- - -
-
-
-
- - -
-
- - -
-
-
-
-
{{ctx.Locale.Tr "repo.settings.pages.comparison_features"}}
-

{{ctx.Locale.Tr "repo.settings.pages.comparison_features_help"}}

-
- {{if .Config.Comparison.Groups}} - {{range $g, $group := .Config.Comparison.Groups}} -
-
- - -
-
- {{range $f, $feat := $group.Features}} -
-
-
-
-
-
- {{end}} -
- -
- {{end}} - {{else}} -
-
- - -
-
-
-
-
-
-
-
-
- -
- {{end}} -
- +

{{ctx.Locale.Tr "repo.settings.pages.comparison_help_link"}}

{{ctx.Locale.Tr "repo.settings.pages.stats"}}
@@ -413,31 +330,5 @@ featCount++; } - let compGroupCount = {{len .Config.Comparison.Groups}}; - let compFeatCounts = {}; - {{range $g, $group := .Config.Comparison.Groups}} - compFeatCounts[{{$g}}] = {{len $group.Features}}; - {{end}} - if (compGroupCount === 0) { compGroupCount = 1; compFeatCounts[0] = 1; } - - function addComparisonFeature(g) { - if (!compFeatCounts[g]) compFeatCounts[g] = 0; - const f = compFeatCounts[g]; - const container = document.querySelector(`.comparison-features[data-group="${g}"]`); - container.insertAdjacentHTML('beforeend', - `
` - ); - compFeatCounts[g]++; - } - - function addComparisonGroup() { - const g = compGroupCount; - compFeatCounts[g] = 1; - const container = document.getElementById('comparison-groups-container'); - container.insertAdjacentHTML('beforeend', - `
` - ); - compGroupCount++; - } {{template "repo/settings/layout_footer" .}} diff --git a/templates/repo/settings/pages_nav.tmpl b/templates/repo/settings/pages_nav.tmpl index 1bae72548c..67b21f8928 100644 --- a/templates/repo/settings/pages_nav.tmpl +++ b/templates/repo/settings/pages_nav.tmpl @@ -12,6 +12,9 @@ {{ctx.Locale.Tr "repo.settings.pages.content"}} + + {{ctx.Locale.Tr "repo.settings.pages.comparison"}} + {{ctx.Locale.Tr "repo.settings.pages.social"}}