From f672ab5ba1112fc6caa820e26160a458973af947 Mon Sep 17 00:00:00 2001 From: Jean du Plessis Date: Mon, 8 Dec 2025 19:28:21 +0200 Subject: [PATCH 1/3] Fix 404 page organization and filtering issues - Filter hidden versions (v2.0-preview no longer appears) - Sort versions by semver in descending order (newest first) - Add section headers to separate documentation versions from other resources - Include master version with descriptive note - Add "Latest" badge to current latest version - Fix grammar: "looking at one of the following sections:" - Add note about archived versions available in GitHub repository tags Fixes #1030 Signed-off-by: Jean du Plessis --- themes/geekboot/layouts/404.html | 65 ++++++++++++++++++++++++++++---- 1 file changed, 57 insertions(+), 8 deletions(-) diff --git a/themes/geekboot/layouts/404.html b/themes/geekboot/layouts/404.html index 4b2b32064..411b92d7a 100644 --- a/themes/geekboot/layouts/404.html +++ b/themes/geekboot/layouts/404.html @@ -34,17 +34,66 @@

Page not found

The page you're looking for couldn't be found.

Only currently maintained versions of Crossplane are documented. Try - looking one of the following sections- + looking at one of the following sections:

+ {{ $versionList := slice }} + {{ $majordict := dict }} + {{ $majorlist := slice }} + {{ $sorted_list := slice }} + + {{/* Collect all versions and parse semver for sorting */}} {{ range .Site.Sections }} - {{ if and (.Page.Params.version) (ne .Page.Params.version "0") (ne .Page.Params.version "master") }} - v{{ .Page.Params.version }}
- {{ else }} - {{ if (eq .Page.Params.version "master") }} - {{ else }} - {{ .Title }}
+ {{/* Skip versions marked as hidden */}} + {{ if not .Page.Params.hidden }} + {{ if eq .Page.Params.version "master" }} + {{$sorted_list = $sorted_list | append "master" }} + {{ else if and (.Page.Params.version) (ne .Page.Params.version "0") }} + {{ $splitver := split .Page.Params.version "." }} + {{ if eq (len $splitver) 2 }} + {{ $verlist := (index $majordict (index $splitver 0)) }} + {{ $verlist = $verlist | append (index $splitver 1) }} + {{ $majordict = merge $majordict (dict (index $splitver 0) $verlist) }} + {{ $majorlist = $majorlist | append (index $splitver 0) }} + {{ end }} + {{ end }} + {{ end }} + {{ end }} + + {{/* Sort versions by semver (descending) and prepend to sorted_list */}} + {{ $semver_sorted := slice }} + {{ range sort ($majorlist | uniq) "value" "desc" }} + {{ $majorver := . }} + {{ range sort (index $majordict .) "value" "desc" }} + {{$semver_sorted = $semver_sorted | append (printf "%s.%s" $majorver .) }} + {{ end }} + {{ end }} + {{/* Prepend semver sorted versions before master */}} + {{ $sorted_list = $semver_sorted | append $sorted_list }} + + Documentation Versions:
+ {{ range $sorted_list }} + {{ $versionPage := $.Site.GetPage (printf "v%s" .) | default ($.Site.GetPage .) }} + {{ with $versionPage }} + {{ if ne .Page.Params.version "master" }}v{{ end }}{{ .Page.Params.version }} + {{ if eq .Page.Params.version $.Site.Params.latest }} + Latest + {{ end }} + {{ if eq .Page.Params.version "master" }} + (unreleased upcoming version) + {{ end }} +
+ {{ end }} + {{ end }} + +
+

Looking for an older version? Archived versions are available as tags in the GitHub repository (e.g., v1.19-archive, v1.18-archive).

+ +
+ Other Resources:
+ {{ range .Site.Sections }} + {{ if and (not .Page.Params.hidden) (eq .Page.Params.version "0") }} + {{ .Title }}
{{ end }} - {{ end }} {{ end }} From 2eb38f5f32839bd1d93f1d23fed13e919baf3c39 Mon Sep 17 00:00:00 2001 From: Jean du Plessis Date: Mon, 8 Dec 2025 20:23:40 +0200 Subject: [PATCH 2/3] Refactor version sorting logic into shared utility partial Extract duplicated semver sorting logic from 404.html and version-dropdown-menu.html into a reusable utility partial at utils/sorted-versions.html. This eliminates 61 lines of duplicated code and establishes a single source of truth for version filtering and sorting logic. Benefits: - Reduces code duplication across templates - Improves maintainability (changes in one place) - Follows established project pattern for utility partials - Ensures consistency between 404 page and version dropdown Signed-off-by: Jean du Plessis --- themes/geekboot/layouts/404.html | 34 +------------------ .../partials/utils/sorted-versions.html | 34 +++++++++++++++++++ .../partials/version-dropdown-menu.html | 30 +--------------- 3 files changed, 36 insertions(+), 62 deletions(-) create mode 100644 themes/geekboot/layouts/partials/utils/sorted-versions.html diff --git a/themes/geekboot/layouts/404.html b/themes/geekboot/layouts/404.html index 411b92d7a..27ed141e9 100644 --- a/themes/geekboot/layouts/404.html +++ b/themes/geekboot/layouts/404.html @@ -36,39 +36,7 @@

Page not found

Only currently maintained versions of Crossplane are documented. Try looking at one of the following sections:

- {{ $versionList := slice }} - {{ $majordict := dict }} - {{ $majorlist := slice }} - {{ $sorted_list := slice }} - - {{/* Collect all versions and parse semver for sorting */}} - {{ range .Site.Sections }} - {{/* Skip versions marked as hidden */}} - {{ if not .Page.Params.hidden }} - {{ if eq .Page.Params.version "master" }} - {{$sorted_list = $sorted_list | append "master" }} - {{ else if and (.Page.Params.version) (ne .Page.Params.version "0") }} - {{ $splitver := split .Page.Params.version "." }} - {{ if eq (len $splitver) 2 }} - {{ $verlist := (index $majordict (index $splitver 0)) }} - {{ $verlist = $verlist | append (index $splitver 1) }} - {{ $majordict = merge $majordict (dict (index $splitver 0) $verlist) }} - {{ $majorlist = $majorlist | append (index $splitver 0) }} - {{ end }} - {{ end }} - {{ end }} - {{ end }} - - {{/* Sort versions by semver (descending) and prepend to sorted_list */}} - {{ $semver_sorted := slice }} - {{ range sort ($majorlist | uniq) "value" "desc" }} - {{ $majorver := . }} - {{ range sort (index $majordict .) "value" "desc" }} - {{$semver_sorted = $semver_sorted | append (printf "%s.%s" $majorver .) }} - {{ end }} - {{ end }} - {{/* Prepend semver sorted versions before master */}} - {{ $sorted_list = $semver_sorted | append $sorted_list }} + {{ $sorted_list := partial "utils/sorted-versions" . }} Documentation Versions:
{{ range $sorted_list }} diff --git a/themes/geekboot/layouts/partials/utils/sorted-versions.html b/themes/geekboot/layouts/partials/utils/sorted-versions.html new file mode 100644 index 000000000..3da21b60e --- /dev/null +++ b/themes/geekboot/layouts/partials/utils/sorted-versions.html @@ -0,0 +1,34 @@ +{{ $majordict := dict }} +{{ $majorlist := slice }} +{{ $sorted_list := slice }} + +{{/* Collect all versions and parse semver for sorting */}} +{{ range .Site.Sections }} + {{/* Skip versions marked as hidden */}} + {{ if not .Page.Params.hidden }} + {{ if eq .Page.Params.version "master" }} + {{$sorted_list = $sorted_list | append "master" }} + {{ else if and (.Page.Params.version) (ne .Page.Params.version "0") }} + {{ $splitver := split .Page.Params.version "." }} + {{ if eq (len $splitver) 2 }} + {{ $verlist := (index $majordict (index $splitver 0)) }} + {{ $verlist = $verlist | append (index $splitver 1) }} + {{ $majordict = merge $majordict (dict (index $splitver 0) $verlist) }} + {{ $majorlist = $majorlist | append (index $splitver 0) }} + {{ end }} + {{ end }} + {{ end }} +{{ end }} + +{{/* Sort versions by semver (descending) and prepend to sorted_list */}} +{{ $semver_sorted := slice }} +{{ range sort ($majorlist | uniq) "value" "desc" }} + {{ $majorver := . }} + {{ range sort (index $majordict .) "value" "desc" }} + {{$semver_sorted = $semver_sorted | append (printf "%s.%s" $majorver .) }} + {{ end }} +{{ end }} +{{/* Prepend semver sorted versions before master */}} +{{ $sorted_list = $semver_sorted | append $sorted_list }} + +{{ return $sorted_list }} diff --git a/themes/geekboot/layouts/partials/version-dropdown-menu.html b/themes/geekboot/layouts/partials/version-dropdown-menu.html index 168a516b4..6fa1b7272 100644 --- a/themes/geekboot/layouts/partials/version-dropdown-menu.html +++ b/themes/geekboot/layouts/partials/version-dropdown-menu.html @@ -1,34 +1,6 @@ -{{ $versionList := slice }} -{{ $majordict := dict }} -{{ $majorlist := slice }} -{{ $sorted_list := slice }} +{{ $sorted_list := partial "utils/sorted-versions" . }} {{ $cur_ver := .Page.Params.version | default .Site.Params.latest }} - -{{ range .Site.Sections }} - {{/* Skip versions marked as hidden */}} - {{ if not .Page.Params.hidden }} - {{ if eq .Page.Params.version "master" }} - {{$sorted_list = $sorted_list | append "master" }} - {{ else if ne .Page.Params.version nil }} - {{ $splitver := split .Page.Params.version "." }} - {{ if eq (len $splitver) 2 }} - {{ $verlist := (index $majordict (index $splitver 0)) }} - {{ $verlist = $verlist | append (index $splitver 1) }} - {{ $majordict = merge $majordict (dict (index $splitver 0) $verlist) }} - {{ $majorlist = $majorlist | append (index $splitver 0) }} - {{ end }} - {{ end }} - {{ end }} -{{ end }} - -{{ range sort ($majorlist | uniq) "value" "desc" }} - {{ $majorver := . }} - {{ range sort (index $majordict .) "value" "desc" }} - {{$sorted_list = $sorted_list | append (printf "%s.%s" $majorver .) }} - {{ end }} -{{ end }} -