diff --git a/src/download-beta/build/index.html b/src/download-beta/build/index.html new file mode 100644 index 00000000..136cd151 --- /dev/null +++ b/src/download-beta/build/index.html @@ -0,0 +1,56 @@ + + +
+Your custom build is in progress. This page will update automatically.
+ +xattr -d com.apple.quarantine
+
+ Failed to load packages. The build server may be unavailable.
'; + }); +}); + +document.addEventListener('DOMContentLoaded', function() { + // auto-detect platform + var detected = detectPlatform(); + var platformEl = document.getElementById('platform'); + if (platformEl) { + platformEl.value = detected[0] + '-' + detected[1]; + } + updatePage(); + + var downloadButtonHtml = document.getElementById('download').innerHTML; + + // filter + document.getElementById('filter').addEventListener('input', function() { + var q = this.value.trim().toLowerCase(); + var count = 0; + document.querySelectorAll('.package').forEach(function(el) { + if (!q) { el.style.display = ''; return; } + var corpus = el.textContent.toLowerCase(); + if (corpus.indexOf(q) === -1) { + el.style.display = 'none'; + } else { + el.style.display = ''; + count++; + } + }); + this.classList.toggle('found', q && count > 0); + this.classList.toggle('not-found', q && count === 0); + if (!q) { this.classList.remove('found', 'not-found'); } + }); + + // platform change + document.getElementById('platform').addEventListener('change', updatePage); + + // package selection + document.getElementById('optional-packages').addEventListener('click', function(e) { + var pkg = e.target.closest('.package'); + if (!pkg) return; + // don't toggle if clicking a link or input + if (e.target.closest('a') || e.target.closest('input')) return; + pkg.classList.toggle('selected'); + updatePage(); + + // update URL + var newUrl = new URL(window.location.href); + var currentSelected = newUrl.searchParams.getAll('package'); + newUrl.searchParams.delete('package'); + var pkgPath = pkg.querySelector('.package-link').textContent.trim(); + if (pkg.classList.contains('selected')) { + if (!currentSelected.includes(pkgPath)) { + currentSelected.push(pkgPath); + } + } else { + var pos = currentSelected.indexOf(pkgPath); + if (pos >= 0) currentSelected.splice(pos, 1); + } + currentSelected.forEach(function(s) { newUrl.searchParams.append('package', s); }); + history.replaceState({}, document.title, newUrl.toString()); + }); + + // download button + document.getElementById('download').addEventListener('click', function(e) { + e.preventDefault(); + var btn = document.getElementById('download'); + if (btn.classList.contains('disabled')) return; + + btn.classList.add('disabled'); + btn.innerHTML = ' Starting build...'; + + // disable fields + document.querySelectorAll('.download-bar select, #optional-packages input').forEach(function(el) { + el.disabled = true; + }); + + var qs = getBuildParams(); + + fetch('/api/build?' + qs.toString(), { method: 'POST' }) + .then(function(r) { return r.json(); }) + .then(function(json) { + if (json.error) { + alert(json.error.message || 'Build request failed'); + enableFields(btn, downloadButtonHtml); + return; + } + var result = json.result; + if (result.status === 'complete') { + // already cached -- go straight to download + window.location.href = '/api/build/' + result.key + '/download'; + enableFields(btn, downloadButtonHtml); + return; + } + // navigate to build progress page + window.location.href = '/download-beta/build/?key=' + result.key; + }) + .catch(function(err) { + alert('Failed to start build: ' + err.message); + enableFields(btn, downloadButtonHtml); + }); + }); + + function enableFields(btn, originalHtml) { + btn.classList.remove('disabled'); + btn.innerHTML = originalHtml; + document.querySelectorAll('.download-bar select, #optional-packages input').forEach(function(el) { + el.disabled = false; + }); + } +}); + +function updatePage() { + var count = document.querySelectorAll('.package.selected').length; + var el = document.getElementById('package-count'); + if (el) el.textContent = count; + + // show/hide darwin warning + var platformVal = document.getElementById('platform').value || ''; + var darwinWarn = document.getElementById('darwin-warning'); + if (darwinWarn) darwinWarn.style.display = platformVal.indexOf('darwin') === 0 ? '' : 'none'; +}