UNPKG

reldens

Version:
200 lines (183 loc) 7.67 kB
/** * * Reldens - Install * */ const DB_CLIENTS_MAP = { 'prisma': [ {value: 'mysql', label: 'MySQL'}, {value: 'postgresql', label: 'PostgreSQL (manual)'}, {value: 'sqlite', label: 'SQLite (manual)'}, {value: 'sqlserver', label: 'SQL Server (manual)'}, {value: 'mongodb', label: 'MongoDB (manual)'}, {value: 'cockroachdb', label: 'CockroachDB (manual)'} ], 'objection-js': [ {value: 'mysql', label: 'MySQL (native)'}, {value: 'mysql2', label: 'MySQL2 (recommended)'}, {value: 'pg', label: 'PostgreSQL (manual)'}, {value: 'sqlite3', label: 'SQLite3 (manual)'}, {value: 'better-sqlite3', label: 'Better-SQLite3 (manual)'}, {value: 'mssql', label: 'SQL Server (manual)'}, {value: 'oracledb', label: 'Oracle DB (manual)'}, {value: 'cockroachdb', label: 'CockroachDB (manual)'} ], 'mikro-orm': [ {value: 'mysql', label: 'MySQL'}, {value: 'mariadb', label: 'MariaDB (manual)'}, {value: 'postgresql', label: 'PostgreSQL (manual)'}, {value: 'sqlite', label: 'SQLite (manual)'}, {value: 'mongodb', label: 'MongoDB (manual)'}, {value: 'mssql', label: 'SQL Server (manual)'}, {value: 'better-sqlite3', label: 'Better-SQLite3 (manual)'} ] }; window.addEventListener('load', () => { const expanders = [ {key: 'app-use-https', filterClass: 'https-filter'}, {key: 'app-use-monitor', filterClass: 'monitor-filter'}, {key: 'app-secure-monitor', filterClass: 'secure-monitor-filter'}, {key: 'mailer-enable', filterClass: 'mailer-filter'}, {key: 'firebase-enable', filterClass: 'firebase-filter'} ]; function toggleExpander(isChecked, expander) { const display = isChecked ? 'flex' : 'none'; const elements = document.getElementsByClassName(expander.filterClass); for (let element of elements) { element.style.display = display; } } for(let expander of expanders){ let expanderElement = document.getElementById(expander.key); expanderElement.addEventListener('click', (event) => { toggleExpander(event?.currentTarget?.checked, expander); if('app-use-monitor' === expander.key && event?.currentTarget?.checked){ let secureMonitorElement = document.getElementById('app-secure-monitor'); if(secureMonitorElement){ toggleExpander(secureMonitorElement.checked, {key: 'app-secure-monitor', filterClass: 'secure-monitor-filter'}); } } }); toggleExpander(expanderElement.checked, expander); } let useMonitorElement = document.getElementById('app-use-monitor'); let secureMonitorElement = document.getElementById('app-secure-monitor'); if(useMonitorElement?.checked && secureMonitorElement){ toggleExpander(secureMonitorElement.checked, {key: 'app-secure-monitor', filterClass: 'secure-monitor-filter'}); } let dangerSpans = document.querySelectorAll('span.danger'); for(let dangerSpan of dangerSpans){ dangerSpan.addEventListener('click', () => { let ulElement = dangerSpan.querySelector('ul'); if(ulElement){ ulElement.classList.toggle('expanded'); } }); } let urlParams = new URL(window.location.href).searchParams; if('1' === urlParams.get('success')){ document.querySelector('.forms-container').style.display = 'none'; let newLink = document.createElement('a'); newLink.href = '/?ready=1'; newLink.target = '_blank'; newLink.innerHTML = 'Installation successful, click here to open your game!'; newLink.classList.add('installation-successful'); document.querySelector('.content').append(newLink); } function showInstallError(code) { let errorElement = document.querySelector('.'+code); if(!errorElement){ let responseError = document.querySelector('.response-error'); if(responseError){ responseError.textContent = 'Installation failed with error: '+code; } return; } errorElement.classList.add('active'); } let errorCode = (urlParams.get('error') || '').toString(); if('' !== errorCode){ showInstallError(errorCode); } function updateClientOptions(driverValue, currentClient) { let clientSelect = document.getElementById('db-client'); if(!clientSelect){ return; } clientSelect.innerHTML = ''; let clients = DB_CLIENTS_MAP[driverValue] || DB_CLIENTS_MAP['prisma']; for(let client of clients){ let option = document.createElement('option'); option.value = client.value; option.text = client.label; if(currentClient && client.value === currentClient){ option.selected = true; } clientSelect.appendChild(option); } if(!currentClient){ let defaultClient = 'objection-js' === driverValue ? 'mysql2' : 'mysql'; for(let i = 0; i < clientSelect.options.length; i++){ if(clientSelect.options[i].value === defaultClient){ clientSelect.selectedIndex = i; break; } } } } let storageDriverSelect = document.getElementById('db-storage-driver'); if(storageDriverSelect){ let currentClient = document.getElementById('db-client')?.value || ''; updateClientOptions(storageDriverSelect.value, currentClient); storageDriverSelect.addEventListener('change', (event) => { updateClientOptions(event.target.value, null); }); } let statusIntervalId = null; let lastStatusMessage = ''; function startStatusPolling() { if(statusIntervalId){ return; } statusIntervalId = setInterval(() => { fetch('/install-status.json?t='+Date.now()) .then(response => { if(!response.ok){ return null; } return response.json(); }) .then(data => { if(!data || !data.message){ return; } if(data.message === lastStatusMessage){ return; } lastStatusMessage = data.message; let statusContainer = document.querySelector('.install-status-message'); if(statusContainer){ statusContainer.textContent = data.message; } }) .catch(() => { }); }, 2000); } document.getElementById('install-form').addEventListener('submit', () => { let loadingWrapper = document.querySelector('.loading-status-wrapper'); if(loadingWrapper){ loadingWrapper.classList.remove('hidden'); } let installButton = document.getElementById('install-submit-button'); if(installButton){ installButton.classList.add('disabled'); installButton.disabled = true; } startStatusPolling(); }); });