Update index.js
Neue Import- und Export-Funktion, Bereinigung Code
This commit is contained in:
parent
930180bcf1
commit
b386573108
1 changed files with 141 additions and 29 deletions
128
index.js
128
index.js
|
|
@ -16,6 +16,47 @@ document.addEventListener('DOMContentLoaded', function () {
|
||||||
let sleepTimerTimeout = null;
|
let sleepTimerTimeout = null;
|
||||||
let sleepTimerEndTime = null;
|
let sleepTimerEndTime = null;
|
||||||
|
|
||||||
|
// Benutzerdefiniertes Modal für Alerts und Bestätigungen
|
||||||
|
function showAlert(title, message) {
|
||||||
|
const modal = document.getElementById("custom-modal");
|
||||||
|
const titleElement = document.getElementById("custom-modal-title");
|
||||||
|
const messageElement = document.getElementById("custom-modal-message");
|
||||||
|
const cancelButton = document.getElementById("custom-modal-cancel");
|
||||||
|
|
||||||
|
titleElement.textContent = title;
|
||||||
|
messageElement.textContent = message;
|
||||||
|
cancelButton.classList.add("hidden");
|
||||||
|
|
||||||
|
modal.classList.remove("hidden");
|
||||||
|
|
||||||
|
document.getElementById("custom-modal-ok").onclick = function() {
|
||||||
|
modal.classList.add("hidden");
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function showConfirm(title, message, callback) {
|
||||||
|
const modal = document.getElementById("custom-modal");
|
||||||
|
const titleElement = document.getElementById("custom-modal-title");
|
||||||
|
const messageElement = document.getElementById("custom-modal-message");
|
||||||
|
const cancelButton = document.getElementById("custom-modal-cancel");
|
||||||
|
|
||||||
|
titleElement.textContent = title;
|
||||||
|
messageElement.textContent = message;
|
||||||
|
cancelButton.classList.remove("hidden");
|
||||||
|
|
||||||
|
modal.classList.remove("hidden");
|
||||||
|
|
||||||
|
document.getElementById("custom-modal-ok").onclick = function() {
|
||||||
|
modal.classList.add("hidden");
|
||||||
|
callback(true);
|
||||||
|
};
|
||||||
|
|
||||||
|
cancelButton.onclick = function() {
|
||||||
|
modal.classList.add("hidden");
|
||||||
|
callback(false);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
initializeFooter();
|
initializeFooter();
|
||||||
loadPresets();
|
loadPresets();
|
||||||
initializeEventListeners();
|
initializeEventListeners();
|
||||||
|
|
@ -44,7 +85,7 @@ document.addEventListener('DOMContentLoaded', function () {
|
||||||
presets = await response.json();
|
presets = await response.json();
|
||||||
localStorage.setItem('presets', JSON.stringify(presets));
|
localStorage.setItem('presets', JSON.stringify(presets));
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
alert('Fehler beim Laden der Presets: ' + error.message);
|
showAlert("Fehler", 'Fehler beim Laden der Presets: ' + error.message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
displayPresets(presets);
|
displayPresets(presets);
|
||||||
|
|
@ -136,7 +177,7 @@ document.addEventListener('DOMContentLoaded', function () {
|
||||||
const remainingTime = Math.max(0, Math.ceil((sleepTimerEndTime - Date.now()) / 60000));
|
const remainingTime = Math.max(0, Math.ceil((sleepTimerEndTime - Date.now()) / 60000));
|
||||||
openSleepTimerModalButton.innerHTML = `<i class="fas fa-hourglass-half"></i> ${remainingTime} Minuten`;
|
openSleepTimerModalButton.innerHTML = `<i class="fas fa-hourglass-half"></i> ${remainingTime} Minuten`;
|
||||||
if (remainingTime > 0) {
|
if (remainingTime > 0) {
|
||||||
setTimeout(updateSleepTimerButton, 60000); // Update every minute
|
setTimeout(updateSleepTimerButton, 60000);
|
||||||
} else {
|
} else {
|
||||||
openSleepTimerModalButton.textContent = 'Sleep Timer';
|
openSleepTimerModalButton.textContent = 'Sleep Timer';
|
||||||
sleepTimerEndTime = null;
|
sleepTimerEndTime = null;
|
||||||
|
|
@ -184,6 +225,7 @@ document.addEventListener('DOMContentLoaded', function () {
|
||||||
presetModal.classList.remove('hidden');
|
presetModal.classList.remove('hidden');
|
||||||
presetModal.style.display = 'block';
|
presetModal.style.display = 'block';
|
||||||
renderPresets();
|
renderPresets();
|
||||||
|
generateExportCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
window.closeModal = function() {
|
window.closeModal = function() {
|
||||||
|
|
@ -194,19 +236,27 @@ document.addEventListener('DOMContentLoaded', function () {
|
||||||
window.addPreset = function() {
|
window.addPreset = function() {
|
||||||
presets.push({ name: 'Neuer Sender', url: '' });
|
presets.push({ name: 'Neuer Sender', url: '' });
|
||||||
renderPresets();
|
renderPresets();
|
||||||
|
generateExportCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
window.changeName = function(index, newName) {
|
window.changeName = function(index, newName) {
|
||||||
presets[index].name = newName;
|
presets[index].name = newName;
|
||||||
|
generateExportCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
window.changeURL = function(index, newURL) {
|
window.changeURL = function(index, newURL) {
|
||||||
presets[index].url = newURL;
|
presets[index].url = newURL;
|
||||||
|
generateExportCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
window.deletePreset = function(index) {
|
window.deletePreset = function(index) {
|
||||||
|
showConfirm("Löschen", "Möchtest du diesen Sender wirklich löschen?", function(confirmed) {
|
||||||
|
if (confirmed) {
|
||||||
presets.splice(index, 1);
|
presets.splice(index, 1);
|
||||||
renderPresets();
|
renderPresets();
|
||||||
|
generateExportCode();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
window.saveAndClose = function() {
|
window.saveAndClose = function() {
|
||||||
|
|
@ -226,10 +276,47 @@ document.addEventListener('DOMContentLoaded', function () {
|
||||||
onEnd: function (evt) {
|
onEnd: function (evt) {
|
||||||
const newOrder = Array.from(tableBody.children).map(row => parseInt(row.getAttribute('data-index')));
|
const newOrder = Array.from(tableBody.children).map(row => parseInt(row.getAttribute('data-index')));
|
||||||
presets = newOrder.map(index => presets[index]);
|
presets = newOrder.map(index => presets[index]);
|
||||||
|
generateExportCode();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --- NEUE EXPORT/IMPORT-FUNKTIONEN ---
|
||||||
|
window.generateExportCode = function() {
|
||||||
|
try {
|
||||||
|
const jsonString = JSON.stringify(presets);
|
||||||
|
const base64String = btoa(unescape(encodeURIComponent(jsonString)));
|
||||||
|
const exportField = document.getElementById('export-string-field');
|
||||||
|
if (exportField) exportField.value = base64String;
|
||||||
|
} catch (e) {
|
||||||
|
console.error("Export-Fehler:", e);
|
||||||
|
showAlert("Fehler", "Export-Fehler: " + e.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Export nach Base64-Code
|
||||||
|
window.copyExportCode = function() {
|
||||||
|
const field = document.getElementById('export-string-field');
|
||||||
|
field.select();
|
||||||
|
field.setSelectionRange(0, 99999);
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (navigator.clipboard) {
|
||||||
|
navigator.clipboard.writeText(field.value)
|
||||||
|
.catch(err => {
|
||||||
|
console.error("Kopieren mit Clipboard-API fehlgeschlagen:", err);
|
||||||
|
document.execCommand('copy');
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
document.execCommand('copy');
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error("Kopieren fehlgeschlagen:", err);
|
||||||
|
showAlert("Fehler", "Kopieren fehlgeschlagen. Bitte manuell kopieren: " + field.value);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Export nach JSON-Datei
|
||||||
window.exportPreset = function() {
|
window.exportPreset = function() {
|
||||||
const presetsJSON = JSON.stringify(presets, null, 2);
|
const presetsJSON = JSON.stringify(presets, null, 2);
|
||||||
const blob = new Blob([presetsJSON], { type: 'application/json' });
|
const blob = new Blob([presetsJSON], { type: 'application/json' });
|
||||||
|
|
@ -241,9 +328,35 @@ document.addEventListener('DOMContentLoaded', function () {
|
||||||
a.click();
|
a.click();
|
||||||
document.body.removeChild(a);
|
document.body.removeChild(a);
|
||||||
URL.revokeObjectURL(url);
|
URL.revokeObjectURL(url);
|
||||||
}
|
};
|
||||||
|
|
||||||
|
// Import aus Base64-Code mit Warnung
|
||||||
|
window.importFromString = function() {
|
||||||
|
const field = document.getElementById('import-string-field');
|
||||||
|
const code = field.value.trim();
|
||||||
|
if (!code) return showAlert("Fehler", "Bitte Code einfügen.");
|
||||||
|
|
||||||
|
showConfirm("Vorsicht", "Es werden alle bestehenden Sender überschrieben. Möchtest du fortfahren?", function(confirmed) {
|
||||||
|
if (!confirmed) return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const data = JSON.parse(decodeURIComponent(escape(atob(code))));
|
||||||
|
if (Array.isArray(data)) {
|
||||||
|
presets = data;
|
||||||
|
savePresets();
|
||||||
|
location.reload();
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
showAlert("Fehler", "Code ungültig!");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// Import aus JSON-Datei mit Warnung
|
||||||
window.importPreset = function() {
|
window.importPreset = function() {
|
||||||
|
showConfirm("Vorsicht", "Es werden alle bestehenden Sender überschrieben. Möchtest du fortfahren?", function(confirmed) {
|
||||||
|
if (!confirmed) return;
|
||||||
|
|
||||||
const input = document.createElement('input');
|
const input = document.createElement('input');
|
||||||
input.type = 'file';
|
input.type = 'file';
|
||||||
input.accept = 'application/json';
|
input.accept = 'application/json';
|
||||||
|
|
@ -255,17 +368,16 @@ document.addEventListener('DOMContentLoaded', function () {
|
||||||
try {
|
try {
|
||||||
const importedPresets = JSON.parse(e.target.result);
|
const importedPresets = JSON.parse(e.target.result);
|
||||||
presets = importedPresets;
|
presets = importedPresets;
|
||||||
localStorage.setItem('presets', JSON.stringify(presets));
|
savePresets();
|
||||||
renderPresets();
|
|
||||||
displayPresets(presets);
|
|
||||||
location.reload();
|
location.reload();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
alert('Fehler beim Importieren der Presets: Ungültige Datei.');
|
showAlert("Fehler", 'Fehler beim Importieren der Presets: Ungültige Datei.');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
reader.readAsText(file);
|
reader.readAsText(file);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
input.click();
|
input.click();
|
||||||
}
|
});
|
||||||
|
};
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue