From 2ff8bb855ede08796a7ab1769089fc58d30de169 Mon Sep 17 00:00:00 2001 From: Nicolas Merget Date: Mon, 15 Dec 2025 21:52:48 +0100 Subject: [PATCH] fix: issue with release-selector --- docs/css/release-selector.css | 36 +++-- docs/javascripts/release-selector.js | 197 ++++++++++++++++++++++----- 2 files changed, 183 insertions(+), 50 deletions(-) diff --git a/docs/css/release-selector.css b/docs/css/release-selector.css index 7fe5dc9..393281d 100644 --- a/docs/css/release-selector.css +++ b/docs/css/release-selector.css @@ -57,12 +57,21 @@ .release-group { margin-bottom: 1.5rem; - border: 1px solid var(--md-default-fg-color--lightest); + border: 1px solid var(--md-default-fg-color--lightest) !important; border-radius: 6px; overflow: hidden; + padding: 0 !important; } -.release-group h4 { +.release-group > summary:before { + content: none; +} +.release-group > summary:after { + left: 0.725rem !important; + top: 1.125rem !important; +} + +.release-group summary { margin: 0; padding: 0.75rem 1rem; background: var(--md-default-fg-color--lightest); @@ -71,6 +80,12 @@ display: flex; align-items: center; gap: 0.5rem; + cursor: pointer; + font-weight: 500; +} + +.release-group summary:hover { + background: var(--md-primary-fg-color--light); } .prerelease-badge { @@ -122,7 +137,6 @@ } .download-details { - margin-left: auto; font-size: 0.85rem; opacity: 0.7; } @@ -139,28 +153,22 @@ .selector-row { flex-direction: column; } - + .selector-group { min-width: unset; } - - .release-group h4 { - flex-direction: column; - align-items: flex-start; - gap: 0.25rem; - } - + .release-date { margin-left: 0; } - + .download-link { flex-direction: column; align-items: flex-start; gap: 0.5rem; } - + .download-details { margin-left: 0; } -} \ No newline at end of file +} diff --git a/docs/javascripts/release-selector.js b/docs/javascripts/release-selector.js index b03cab5..6217663 100644 --- a/docs/javascripts/release-selector.js +++ b/docs/javascripts/release-selector.js @@ -10,20 +10,23 @@ class ReleaseSelector { macos: "macOS", android: "Android", ios: "iOS", - "web-nothreads": "Web (No Threads)", - web: "Web", + "web-no": "Web (No Threads)", + "web-yes": "Web (With Threads)", }; this.engines = { v8: "V8", "qjs-ng": "QuickJS NG", + browser: "Browser", }; this.targets = { editor: "Editor", - "template-release": "Release Template", - "template-debug": "Debug Template", + template_release: "Release Template", + template_debug: "Debug Template", }; + + this.versions = ["4.4", "4.5"]; } async init() { @@ -58,13 +61,17 @@ class ReleaseSelector { const target = Object.keys(this.targets).find((key) => asset.name.includes(key), ); + const godotVersion = this.versions.find((key) => + asset.name.includes(key), + ); this.assets.push({ name: asset.name, downloadUrl: asset.browser_download_url, - os: os, - target: target, - jsEngine: jsEngine, + os, + target, + jsEngine, + godotVersion, releaseTag: release.tag_name, releaseDate: release.published_at, isPrerelease: release.prerelease, @@ -93,6 +100,7 @@ class ReleaseSelector { const osOptions = this.getUniqueValues("os"); const targetOptions = this.getUniqueValues("target"); const jsEngineOptions = this.getUniqueValues("jsEngine"); + const versionOptions = this.getUniqueValues("godotVersion"); container.innerHTML = `
@@ -101,24 +109,55 @@ class ReleaseSelector {
+
+ +
+ +
@@ -146,8 +185,7 @@ class ReleaseSelector { formatTargetName(target) { return ( - this.targets[target] || - target.replace(/-/g, " ").replace(/\b\w/g, (l) => l.toUpperCase()) + this.targets[target] || this.targets[target.replace("-", "_")] || target ); } @@ -155,26 +193,44 @@ class ReleaseSelector { const osSelect = document.getElementById("os-select"); const targetSelect = document.getElementById("target-select"); const engineSelect = document.getElementById("engine-select"); + const versionSelect = document.getElementById("version-select"); const prereleaseCheckbox = document.getElementById("include-prerelease"); if (osSelect) { osSelect.addEventListener("change", () => { this.updateTargetOptions(); + this.updateEngineOptions(); + this.updateVersionOptions(); this.updateResults(); }); } - [targetSelect, engineSelect, prereleaseCheckbox].forEach( - (element) => { - if (element) { - element.addEventListener("change", () => this.updateResults()); - } - }, - ); + if (targetSelect) { + targetSelect.addEventListener("change", () => { + this.updateEngineOptions(); + this.updateVersionOptions(); + this.updateResults(); + }); + } + + if (engineSelect) { + engineSelect.addEventListener("change", () => { + this.updateVersionOptions(); + this.updateResults(); + }); + } + + [versionSelect, prereleaseCheckbox].forEach((element) => { + if (element) { + element.addEventListener("change", () => this.updateResults()); + } + }); // Set default values if (osSelect) osSelect.value = this.detectOS(); this.updateTargetOptions(); + this.updateEngineOptions(); + this.updateVersionOptions(); if (targetSelect) targetSelect.value = "editor"; if (engineSelect) engineSelect.value = "v8"; @@ -192,30 +248,100 @@ class ReleaseSelector { updateTargetOptions() { const osSelect = document.getElementById("os-select"); const targetSelect = document.getElementById("target-select"); - + if (!osSelect || !targetSelect) return; - + const selectedOS = osSelect.value; const currentTarget = targetSelect.value; - + const availableTargets = this.getUniqueValues("target", { os: selectedOS }); - + targetSelect.innerHTML = ` - - ${availableTargets.map((target) => ``).join("")} + + ${availableTargets + .filter((target) => target) + .map( + (target) => + ``, + ) + .join("")} `; - + // Restore selection if still available if (availableTargets.includes(currentTarget)) { targetSelect.value = currentTarget; } } + updateEngineOptions() { + const osSelect = document.getElementById("os-select"); + const targetSelect = document.getElementById("target-select"); + const engineSelect = document.getElementById("engine-select"); + + if (!engineSelect) return; + + const filters = { + os: osSelect?.value || "", + target: targetSelect?.value || "", + }; + const currentEngine = engineSelect.value; + + const availableEngines = this.getUniqueValues("jsEngine", filters); + + engineSelect.innerHTML = ` + + ${availableEngines + .filter((engine) => engine) + .map( + (engine) => + ``, + ) + .join("")} + `; + + // Restore selection if still available + if (availableEngines.includes(currentEngine)) { + engineSelect.value = currentEngine; + } + } + + updateVersionOptions() { + const osSelect = document.getElementById("os-select"); + const targetSelect = document.getElementById("target-select"); + const engineSelect = document.getElementById("engine-select"); + const versionSelect = document.getElementById("version-select"); + + if (!versionSelect) return; + + const filters = { + os: osSelect?.value || "", + target: targetSelect?.value || "", + jsEngine: engineSelect?.value || "", + }; + const currentVersion = versionSelect.value; + + const availableVersions = this.getUniqueValues("godotVersion", filters); + + versionSelect.innerHTML = ` + + ${availableVersions + .filter((version) => version) + .map((version) => ``) + .join("")} + `; + + // Restore selection if still available + if (availableVersions.includes(currentVersion)) { + versionSelect.value = currentVersion; + } + } + updateResults() { const filters = { os: document.getElementById("os-select")?.value || "", target: document.getElementById("target-select")?.value || "", jsEngine: document.getElementById("engine-select")?.value || "", + godotVersion: document.getElementById("version-select")?.value || "", }; const includePrerelease = @@ -256,31 +382,30 @@ class ReleaseSelector { } const html = sortedReleases - .map((releaseTag) => { + .map((releaseTag, index) => { const assets = groupedAssets[releaseTag]; const release = this.releases.find((r) => r.tag_name === releaseTag); return ` -
-

+
+ ${releaseTag} ${release.prerelease ? 'Pre-release' : ""} ${new Date(release.published_at).toLocaleDateString()} -

+ -
+ `; }) .join("");