diff --git a/server/endpoints.js b/server/endpoints.js index 5aa80d0..fe69323 100644 --- a/server/endpoints.js +++ b/server/endpoints.js @@ -34,28 +34,7 @@ router.get('/', (req, res) => { const noPlugins = req.query.noPlugins === 'true'; if (configExists() === false) { - let serialPorts; - - SerialPort.list().then((deviceList) => { - serialPorts = deviceList.map(port => ({ - path: port.path, - friendlyName: port.friendlyName, - })); - - parseAudioDevice((result) => { - res.render('wizard', { // Magical utility wizard - isAdminAuthenticated: true, - videoDevices: result.audioDevices, - audioDevices: result.videoDevices, - serialPorts: serialPorts, - tunerProfiles: tunerProfiles.map((profile) => ({ - id: profile.id, - label: profile.label, - detailsHtml: helpers.parseMarkdown(profile.details || '') - })) - }); - }); - }); + res.status(500).send("not configured"); } else { res.render('index', { isAdminAuthenticated: helpers.isAdmin(req), @@ -90,36 +69,6 @@ router.get('/403', (req, res) => { router.get('/audioonly', (req, res) => res.render('audioonly')) -router.get('/wizard', (req, res) => { - let serialPorts; - - if(!helpers.isAdmin(req)) { - res.render('login'); - return; - } - - SerialPort.list().then((deviceList) => { - serialPorts = deviceList.map(port => ({ - path: port.path, - friendlyName: port.friendlyName, - })); - - parseAudioDevice((result) => { - res.render('wizard', { - isAdminAuthenticated: helpers.isAdmin(req), - videoDevices: result.audioDevices, - audioDevices: result.videoDevices, - serialPorts: serialPorts, - tunerProfiles: tunerProfiles.map((profile) => ({ - id: profile.id, - label: profile.label, - detailsHtml: helpers.parseMarkdown(profile.details || '') - })) - }); - }); - }) -}) - router.get('/setup', (req, res) => { let serialPorts; function loadConfig() { diff --git a/views/wizard.ejs b/views/wizard.ejs deleted file mode 100644 index 6d7c724..0000000 --- a/views/wizard.ejs +++ /dev/null @@ -1,215 +0,0 @@ - - - - Wizard - FM-DX Webserver - - - - - - - - - - -
-
-
-
- -

[SETUP WIZARD]

-
-
-
1
-
2
-
3
-
4
-
5
-
- -
- -
-

Basic settings

-

Welcome to the setup wizard! Let's set up some basic things.

- -

Webserver connection

-

Leave the IP at 0.0.0.0 unless you explicitly know you have to change it.
DO NOT enter your public IP here.

-
- <%- include('_components', {component: 'text', cssClass: 'w-150 br-15', placeholder: '0.0.0.0', label: 'Webserver IP', id: 'webserver-webserverIp'}) %> - <%- include('_components', {component: 'text', cssClass: 'w-100 br-15', placeholder: '8080', label: 'Webserver port', id: 'webserver-webserverPort'}) %>
-
-
- - - - - - - - - - - - - -
- - -
-
-
-

Feel free to contact us on Discord for community support.

-
-
-
- - - - - - - - diff --git a/web/js/confighandler.js b/web/js/confighandler.js deleted file mode 100644 index 526fdb5..0000000 --- a/web/js/confighandler.js +++ /dev/null @@ -1,133 +0,0 @@ -let configData = {}; // Store the original data structure globally - -$(document).ready(function() { - fetchConfig(); -}); - -function submitConfig() { - updateConfigData(configData); - if ($("#password-adminPass").val().length < 1) { - alert('You need to fill in the admin password before continuing further.'); - return; - } - - $.ajax({ - url: './saveData', - type: 'POST', - contentType: 'application/json', - data: JSON.stringify(configData), - success: function (message) { - sendToast('success', 'Data saved!', message, true, true); - setTimeout(function () { - location.reload(true); - }, 1500); - }, - error: function (error) { - console.error(error); - } - }); -} - -function fetchConfig() { - $.getJSON("./getData") - .done(data => { - configData = data; - populateFields(configData); - initVolumeSlider(); - initConnectionToggle(); - }) - .fail(error => console.error("Error fetching data:", error.message)); -} - -function populateFields(data, prefix = "") { - $.each(data, (key, value) => { - if (value === null) value = ""; // Convert null to an empty string - - let id = `${prefix}${prefix ? "-" : ""}${key}`; - const $element = $(`#${id}`); - - if (key === "plugins" && $element.is('select[multiple]')) { - if (Array.isArray(value)) { - $element.find('option').each(function() { - const $option = $(this); - const dataName = $option.data('name'); - if (value.includes(dataName)) $option.prop('selected', true); - else $option.prop('selected', false); - }); - - $element.trigger('change'); - } - return; - } - - if (typeof value === "object" && value !== null) { - if (Array.isArray(value)) { - value.forEach((item, index) => { - const arrayId = `${id}-${index + 1}`; - const $arrayElement = $(`#${arrayId}`); - - if ($arrayElement.length) $arrayElement.val(item); - else console.log(`Element with id ${arrayId} not found`); - }); - return; - } else { - populateFields(value, id); - return; - } - } - - if (!$element.length) { - console.log(`Element with id ${id} not found`); - return; - } - - if (typeof value === "boolean") { - $element.prop("checked", value); - } else if ($element.is('input[type="text"]') && $element.closest('.dropdown').length) { - const $dropdownOption = $element.siblings('ul.options').find(`li[data-value="${value}"]`); - $element.val($dropdownOption.length ? $dropdownOption.text() : value); - $element.attr('data-value', value); - } else $element.val(value); - }); -} - -function safeId(str) { - return str.replace(/[^a-zA-Z0-9_-]/g, "_"); -} - -function updateConfigData(data, prefix = "") { - $.each(data, (key, value) => { - let id = `${prefix}${prefix ? "-" : ""}${safeId(key)}`; - const $element = $(`#${id}`); - - if (key === "presets") { - data[key] = []; - let index = 1; - while (true) { - const $presetElement = $(`#${prefix}${prefix ? "-" : ""}${key}-${index}`); - if ($presetElement.length) { - data[key].push($presetElement.val() || null); // Allow null if necessary - index++; - } else break; - } - return; - } - - if (key === "plugins") { - data[key] = []; - const $selectedOptions = $element.find('option:selected'); - $selectedOptions.each(function() { - const dataName = $(this).attr('data-name'); - if (dataName) data[key].push(dataName); - }); - return; - } - - if (typeof value === "object" && value !== null && !Array.isArray(value)) return updateConfigData(value, id); - - if ($element.length) { - const newValue = $element.attr("data-value") ?? $element.val() ?? null; - data[key] = typeof value === "boolean" ? $element.is(":checked") : newValue; - } - }); -} diff --git a/web/js/setup.js b/web/js/setup.js index cb96cf4..51c4721 100644 --- a/web/js/setup.js +++ b/web/js/setup.js @@ -4,214 +4,9 @@ var tilesURL=' https://tile.openstreetmap.org/{z}/{x}/{y}.png'; var mapAttrib='© OpenStreetMap'; $(document).ready(function() { - mapCreate(); loadConsoleLogs(); - - showPanelFromHash(); - initNav(); - initBanlist(); - - checkTunnelServers(); - setInterval(checkTunnelServers, 10000); }); -function mapCreate() { - if (!(typeof map == "object")) { - map = L.map('map', { - center: [40, 0], - zoom: 3, - worldCopyJump: true - }); - } else map.setZoom(3).panTo([40, 0]); - - L.tileLayer(tilesURL, { - attribution: mapAttrib, - maxZoom: 19 - }).addTo(map); - - // Check for initial lat/lon values - const latVal = parseFloat($('#identification-lat').val()); - const lonVal = parseFloat($('#identification-lon').val()); - - if (!isNaN(latVal) && !isNaN(lonVal)) { - const initialLatLng = L.latLng(latVal, lonVal); - pin = L.marker(initialLatLng, { riseOnHover: true, draggable: true }).addTo(map); - map.setView(initialLatLng, 8); // Optional: Zoom in closer to the pin - - pin.on('dragend', function(ev) { - $('#identification-lat').val(ev.target.getLatLng().lat.toFixed(6)); - $('#identification-lon').val(ev.target.getLatLng().lng.toFixed(6)); - }); - } - - map.on('click', function(ev) { - $('#identification-lat').val(ev.latlng.lat.toFixed(6)); - $('#identification-lon').val(ev.latlng.lng.toFixed(6)); - - if (typeof pin == "object") { - pin.setLatLng(ev.latlng.wrap()); - } else { - pin = L.marker(ev.latlng.wrap(), { riseOnHover: true, draggable: true }).addTo(map); - pin.on('dragend', function(ev) { - $('#identification-lat').val(ev.target.getLatLng().lat.toFixed(6)); - $('#identification-lon').val(ev.target.getLatLng().lng.toFixed(6)); - }); - } - }); - - mapReload(); -} - -function mapReload() { - setTimeout(function () { - map.invalidateSize(); - }, 200); -} - -function showPanelFromHash() { - var panelId = window.location.hash.substring(1) || 'dashboard'; - - $('.tab-content').hide(); - $('#' + panelId).show(); - - $('.nav li').removeClass('active'); - $('.nav li[data-panel="' + panelId + '"]').addClass('active'); -} - -function initNav() { - $('.nav li').click(function() { - $('.nav li').removeClass('active'); - $(this).addClass('active'); - var panelId = $(this).data('panel'); - window.location.hash = panelId; - $('.tab-content').hide(); - $('#' + panelId).show(); - - panelId == 'identification' ? mapReload() : null; - }); - - $('[role="tab"]').on('keydown', function(event) { - if (event.key === 'Enter') { - $(this).find('a').click(); - } - }); -} - -function initBanlist() { - $('.banlist-add').on('click', function(e) { - e.preventDefault(); - - const ipAddress = $('#banlist-add-ip').val(); - const reason = $('#banlist-add-reason').val(); - - $.ajax({ - url: '/addToBanlist', - method: 'GET', - data: { ip: ipAddress, reason: reason }, - success: function(response) { - // Refresh the page if the request was successful - if (response.success) location.reload(); - else console.error('Failed to add to banlist'); - }, - error: function() { - console.error('Error occurred during the request'); - } - }); -}); - -$('.banlist-remove').on('click', function(e) { - e.preventDefault(); - - const ipAddress = $(this).closest('tr').find('td').first().text(); - - $.ajax({ - url: '/removeFromBanlist', - method: 'GET', - data: { ip: ipAddress }, - success: function(response) { - if (response.success) { - location.reload(); - } else { - console.error('Failed to remove from banlist'); - } - }, - error: function() { - console.error('Error occurred during the request'); - } - }); -}); -} - -function toggleNav() { - const navOpen = $("#navigation").css('margin-left') === '0px'; - const isMobile = window.innerWidth <= 768; - - if (navOpen) { - if (isMobile) { - // Do nothing to .admin-wrapper on mobile (since we're overlaying) - $(".admin-wrapper").css({ - 'margin-left': '32px', - 'width': '100%' // Reset content to full width on close - }); - $("#navigation").css('margin-left', 'calc(64px - 100vw)'); - } else { - // On desktop, adjust the content margin and width - $(".admin-wrapper").css({ - 'margin-left': '64px', - 'width': 'calc(100% - 64px)' - }); - $("#navigation").css('margin-left', '-356px'); - } - $(".sidenav-close").html(''); - } else { - $("#navigation").css('margin-left', '0'); - if (isMobile) { - $(".admin-wrapper").css({ - 'margin-left': '0', // Keep content in place when sidenav is open - 'width': '100%' // Keep content at full width - }); - } else { - // On desktop, push the content - $(".admin-wrapper").css({ - 'margin-left': '420px', - 'width': 'calc(100% - 420px)' - }); - } - $(".sidenav-close").html(''); - } -} - -function initVolumeSlider() { - const $volumeInput = $('#audio-startupVolume'); - const $percentageValue = $('#volume-percentage-value'); - - const updateDisplay = () => { - $percentageValue.text(($volumeInput.val() * 100).toFixed(0) + '%'); - }; - - updateDisplay(); - $volumeInput.on('change', updateDisplay); -} - -function initConnectionToggle() { - const connectionToggle = $('#xdrd-wirelessConnection'); - const tunerUSB = $('#tuner-usb'); - const tunerWireless = $('#tuner-wireless'); - - function toggleType() { - if (connectionToggle.is(":checked")) { - tunerUSB.hide(); - tunerWireless.show(); - } else { - tunerWireless.hide(); - tunerUSB.show(); - } - } - - toggleType(); - connectionToggle.change(toggleType); -} - function stripAnsi(str) { return str.replace(/\u001b\[\d+m/g, ''); } @@ -247,30 +42,3 @@ async function loadConsoleLogs() { }); $("#console-output").length ? $("#console-output").scrollTop($("#console-output")[0].scrollHeight) : null; } - -function checkTunnelServers() { - $.ajax({ - url: '/tunnelservers', - method: 'GET', - success: function(servers) { - const $options = $('#tunnel-regionselect ul.options'); - const $input = $('#tunnel-region'); - const selectedValue = $input.val(); // currently selected value (label or value?) - - servers.forEach(server => { - const $li = $options.find(`li[data-value="${server.value}"]`); - - if ($li.length) { - $li.text(server.label); - - // If this li is the currently selected one, update input text too - // Note: input.val() holds the label, so match by label is safer - if ($li.text() === selectedValue || server.value === selectedValue) $input.val(server.label); - } - }); - }, - error: function() { - console.error('Failed to load server latency data'); - } - }); -} diff --git a/web/js/wizard.js b/web/js/wizard.js index 28ec6fd..7c871bf 100644 --- a/web/js/wizard.js +++ b/web/js/wizard.js @@ -15,8 +15,6 @@ function updateWizardContent() { $('.btn-prev').toggle(visibleStepIndex !== 0); $('.btn-next').text(visibleStepIndex === 4 ? 'Save' : 'Next'); - - visibleStepIndex === 3 && mapReload(); // What is this? Javascript? } function navigateStep(isNext) {