1 changed files with 627 additions and 0 deletions
@ -0,0 +1,627 @@ |
|||||
|
static const char mgtWebsite[] PROGMEM = "<!DOCTYPE html>\ |
||||
|
<html lang=\"de\">\ |
||||
|
<head>\ |
||||
|
<title>ESPuino-Konfiguration</title>\ |
||||
|
<meta charset=\"utf-8\">\ |
||||
|
<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\ |
||||
|
<link rel=\"stylesheet\" href=\"https://ts-cs.de/tonuino/css/bootstrap.min.css\">\ |
||||
|
<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/themes/default/style.min.css\"/>\ |
||||
|
<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.1/css/all.min.css\"/>\ |
||||
|
<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.css\"/>\ |
||||
|
<script src=\"https://ts-cs.de/tonuino/js/jquery.min.js\"></script>\ |
||||
|
<script src=\"https://code.jquery.com/ui/1.12.0/jquery-ui.min.js\"></script>\ |
||||
|
<script src=\"https://ts-cs.de/tonuino/js/popper.min.js\"></script>\ |
||||
|
<script src=\"https://ts-cs.de/tonuino/js/bootstrap.min.js\"></script>\ |
||||
|
<script src=\"https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/jstree.min.js\"></script>\ |
||||
|
<script src=\"https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.js\"></script>\ |
||||
|
<style type=\"text/css\">\ |
||||
|
.filetree {\ |
||||
|
border: 1px solid black;\ |
||||
|
height: 200px;\ |
||||
|
margin: 0em 0em 1em 0em;\ |
||||
|
overflow-y: scroll;\ |
||||
|
}\ |
||||
|
\ |
||||
|
.fa-sync:hover {\ |
||||
|
color: #666666;\ |
||||
|
}\ |
||||
|
\ |
||||
|
.clickForRefresh {\ |
||||
|
text-align: center;\ |
||||
|
color: gray;\ |
||||
|
cursor: pointer;\ |
||||
|
margin-top: 5em;\ |
||||
|
}\ |
||||
|
\ |
||||
|
.clickForRefresh:hover {\ |
||||
|
color: darkgray;\ |
||||
|
}\ |
||||
|
\ |
||||
|
.filetree-container {\ |
||||
|
position: relative;\ |
||||
|
}\ |
||||
|
\ |
||||
|
.indexing-progress {\ |
||||
|
width: 100%;\ |
||||
|
height: 100%;\ |
||||
|
position: absolute;\ |
||||
|
top: 0;\ |
||||
|
left: 0;\ |
||||
|
opacity: 0.7;\ |
||||
|
display: none;\ |
||||
|
}\ |
||||
|
\ |
||||
|
.refreshAction{\ |
||||
|
text-align: right;\ |
||||
|
font-size: 0.8em;\ |
||||
|
}\ |
||||
|
.overlay {\ |
||||
|
z-index: 9;\ |
||||
|
opacity: 0.8;\ |
||||
|
background: #1a1919;\ |
||||
|
height: 200px;\ |
||||
|
display: none;\ |
||||
|
width: 32em;\ |
||||
|
}\ |
||||
|
</style>\ |
||||
|
</head>\ |
||||
|
<body>\ |
||||
|
<nav class=\"navbar navbar-expand-sm bg-primary navbar-dark\">\ |
||||
|
<button class=\"navbar-toggler\" type=\"button\" data-toggle=\"collapse\" data-target=\"#navbarSupportedContent\"\ |
||||
|
aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\ |
||||
|
<span class=\"navbar-toggler-icon\"></span>\ |
||||
|
</button>\ |
||||
|
<a class=\"navbar-brand\">\ |
||||
|
<img src=\"https://raw.githubusercontent.com/biologist79/Tonuino-ESP32-I2S/master/html/tonuino_logo.png\"\ |
||||
|
width=\"30\" height=\"30\" class=\"d-inline-block align-top\" alt=\"\"/>\ |
||||
|
Tonuino\ |
||||
|
</a>\ |
||||
|
<div class=\"collapse navbar-collapse\" id=\"collapsibleNavbar\">\ |
||||
|
<ul class=\"navbar-nav mr-auto\">\ |
||||
|
<li class=\"nav-item\">\ |
||||
|
<a class=\"nav-link\" href=\"#wifiConfig\">WLAN</a>\ |
||||
|
</li>\ |
||||
|
<li class=\"nav-item\">\ |
||||
|
<a class=\"nav-link\" href=\"#rfidMusicTags\">RFID-Zuweisungen</a>\ |
||||
|
</li>\ |
||||
|
<li class=\"nav-item\">\ |
||||
|
<a class=\"nav-link\" href=\"#rfidModTags\">RFID-Modifikationen</a>\ |
||||
|
</li>\ |
||||
|
<li class=\"nav-item\">\ |
||||
|
<a class=\"nav-link\" href=\"#mqttConfig\">MQTT</a>\ |
||||
|
</li>\ |
||||
|
<li class=\"nav-item\">\ |
||||
|
<a class=\"nav-link\" href=\"#ftpConfig\">FTP</a>\ |
||||
|
</li>\ |
||||
|
<li class=\"nav-item\">\ |
||||
|
<a class=\"nav-link\" href=\"#generalConfig\">Allgemein</a>\ |
||||
|
</li>\ |
||||
|
<li class=\"nav-item\">\ |
||||
|
<a class=\"nav-link\" href=\"#importNvs\">NVS-Importer</a>\ |
||||
|
</li>\ |
||||
|
<li class=\"nav-item\">\ |
||||
|
<a class=\"nav-link\" href=\"/restart\" style=\"color: orange\">Neustart Tonuino</a>\ |
||||
|
</li>\ |
||||
|
</ul>\ |
||||
|
</div>\ |
||||
|
</nav>\ |
||||
|
<br/>\ |
||||
|
<div class=\"container\" id=\"wifiConfig\">\ |
||||
|
<h2>WLAN-Konfiguration</h2>\ |
||||
|
<form action=\"#wifiConfig\" method=\"POST\" onsubmit=\"wifiConfig('wifiConfig'); return false\">\ |
||||
|
<div class=\"form-group col-md-6\">\ |
||||
|
<label for=\"ssid\">WLAN-Name (SSID):</label>\ |
||||
|
<input type=\"text\" class=\"form-control\" id=\"ssid\" placeholder=\"SSID\" name=\"ssid\" required>\ |
||||
|
<div class=\"invalid-feedback\">\ |
||||
|
Bitte SSID des WLANs eintragen.\ |
||||
|
</div>\ |
||||
|
<label for=\"pwd\">Passwort:</label>\ |
||||
|
<input type=\"password\" class=\"form-control\" id=\"pwd\" placeholder=\"Passwort\" name=\"pwd\" required>\ |
||||
|
<label for=\"hostname\">Tonuino-Name (Hostname):</label>\ |
||||
|
<input type=\"text\" class=\"form-control\" id=\"hostname\" placeholder=\"tonuino\" name=\"hostname\"\ |
||||
|
value=\"%HOSTNAME%\" pattern=\"^[^-\\.]{2,32}\" required>\ |
||||
|
</div>\ |
||||
|
<button type=\"reset\" class=\"btn btn-secondary\">Reset</button>\ |
||||
|
<button type=\"submit\" class=\"btn btn-primary\">Absenden</button>\ |
||||
|
</form>\ |
||||
|
<div class=\"messages col-md-6 my-2\"></div>\ |
||||
|
</div>\ |
||||
|
<div class=\"container my-5\" id=\"rfidMusicTags\">\ |
||||
|
<h2>RFID-Zuweisungen</h2>\ |
||||
|
<form action=\"#rfidMusicTags\" method=\"POST\" onsubmit=\"rfidAssign('rfidMusicTags'); return false\">\ |
||||
|
<div class=\"form-group col-md-6\">\ |
||||
|
<label for=\"rfidIdMusic\">RFID-Chip-Nummer (12-stellig)</label>\ |
||||
|
<input type=\"text\" class=\"form-control\" id=\"rfidIdMusic\" maxlength=\"12\" pattern=\"[0-9]{12}\"\ |
||||
|
placeholder=\"%RFID_TAG_ID%\" name=\"rfidIdMusic\" required>\ |
||||
|
<label for=\"fileOrUrl\">Datei, Verzeichnis oder URL (^ und # als Zeichen nicht erlaubt)</label>\ |
||||
|
<input type=\"text\" class=\"form-control\" id=\"fileOrUrl\" maxlength=\"255\" placeholder=\"z.B. /mp3/Hoerspiele/Yakari/Yakari_und_seine_Freunde.mp3\" pattern=\"^[^\\^#]+$\" name=\"fileOrUrl\" required>\ |
||||
|
<div class=\"filetree-container\">\ |
||||
|
<div id=\"filebrowser\">\ |
||||
|
<div class=\"filetree demo\" id=\"filetree\"></div>\ |
||||
|
<div class=\"refreshAction\">\ |
||||
|
<span id=\"refreshAction\" style=\"cursor: pointer;\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"Datei Liste aktualisieren.\"><i class=\"fas fa-sync fa-1x\"></i> Dateien suchen</span>\ |
||||
|
</div>\ |
||||
|
</div>\ |
||||
|
<div id=\"indexing-progress\" class=\"indexing-progress overlay\">\ |
||||
|
<div style=\"text-align: center; color:white; margin-top:2em;\">\ |
||||
|
<p><i class=\"fas fa-sync fa-spin fa-2x\"></i> <br><br> Der Prozess kann mehrere Minuten dauern...</p>\ |
||||
|
</div>\ |
||||
|
</div>\ |
||||
|
</div>\ |
||||
|
<label for=\"playMode\">Abspielmodus</label>\ |
||||
|
<select class=\"form-control\" id=\"playMode\" name=\"playMode\">\ |
||||
|
<option class=\"option-file\" value=\"1\">Einzelner Titel</option>\ |
||||
|
<option class=\"option-file\" value=\"2\">Einzelner Titel (Endlosschleife)</option>\ |
||||
|
<option class=\"option-folder\" value=\"3\">Hörbuch</option>\ |
||||
|
<option class=\"option-folder\" value=\"4\">Hörbuch (Endlosschleife)</option>\ |
||||
|
<option class=\"option-folder\" value=\"5\">Alle Titel eines Verzeichnis (sortiert)</option>\ |
||||
|
<option class=\"option-folder\" value=\"6\">Alle Titel eines Verzeichnis (zufällig)</option>\ |
||||
|
<option class=\"option-folder\" value=\"7\">Alle Titel eines Verzeichnis (sortiert, Endlosschleife)</option>\ |
||||
|
<option class=\"option-folder\" value=\"9\">Alle Titel eines Verzeichnis (zufällig, Endlosschleife)</option>\ |
||||
|
<option class=\"option-stream\" value=\"8\">Webradio</option>\ |
||||
|
</select>\ |
||||
|
</div>\ |
||||
|
<button type=\"reset\" class=\"btn btn-secondary\">Reset</button>\ |
||||
|
<button type=\"submit\" class=\"btn btn-primary\">Absenden</button>\ |
||||
|
</form>\ |
||||
|
<div class=\"messages col-md-6 my-2\"></div>\ |
||||
|
</div>\ |
||||
|
<div class=\"container my-5\" id=\"rfidModTags\">\ |
||||
|
<h2>RFID-Modifkationen</h2>\ |
||||
|
<form class=\"needs-validation\" action=\"#rfidModTags\" method=\"POST\" onsubmit=\"rfidMods('rfidModTags'); return false\">\ |
||||
|
<div class=\"form-group col-md-6\">\ |
||||
|
<label for=\"rfidIdMod\">RFID-Chip-Nummer (12-stellig)</label>\ |
||||
|
<input type=\"text\" class=\"form-control\" id=\"rfidIdMod\" maxlength=\"12\" pattern=\"[0-9]{12}\"\ |
||||
|
placeholder=\"%RFID_TAG_ID%\" name=\"rfidIdMod\" required>\ |
||||
|
<div class=\"invalid-feedback\">\ |
||||
|
Bitte eine 12-stellige Zahl eingeben.\ |
||||
|
</div>\ |
||||
|
<label for=\"modId\">Abspielmodus</label>\ |
||||
|
<select class=\"form-control\" id=\"modId\" name=\"modId\">\ |
||||
|
<option value=\"100\">Tastensperre</option>\ |
||||
|
<option value=\"101\">Schlafen nach 15 Minuten</option>\ |
||||
|
<option value=\"102\">Schlafen nach 30 Minuten</option>\ |
||||
|
<option value=\"103\">Schlafen nach 1 Stunde</option>\ |
||||
|
<option value=\"104\">Schlafen nach 2 Stunden</option>\ |
||||
|
<option value=\"105\">Schlafen nach Ende des Titels</option>\ |
||||
|
<option value=\"106\">Schlafen nach Ende der Playlist</option>\ |
||||
|
<option value=\"107\">Schlafen nach fünf Titeln</option>\ |
||||
|
<option value=\"110\">Wiederhole Playlist (endlos)</option>\ |
||||
|
<option value=\"111\">Wiederhole Titel (endlos)</option>\ |
||||
|
<option value=\"112\">Dimme LEDs (Nachtmodus)</option>\ |
||||
|
<option value=\"130\">Aktiviere/deaktive WLAN</option>\ |
||||
|
</select>\ |
||||
|
</div>\ |
||||
|
<button type=\"reset\" class=\"btn btn-secondary\">Reset</button>\ |
||||
|
<button type=\"submit\" class=\"btn btn-primary\">Absenden</button>\ |
||||
|
</form>\ |
||||
|
<div class=\"messages col-md-6 my-2\"></div>\ |
||||
|
</div>\ |
||||
|
<div class=\"container my-5\" id=\"mqttConfig\">\ |
||||
|
<h2>MQTT-Konfiguration</h2>\ |
||||
|
<form class=\"needs-validation\" action=\"#mqttConfig\" method=\"POST\"\ |
||||
|
onsubmit=\"mqttSettings('mqttConfig'); return false\">\ |
||||
|
<div class=\"form-check col-md-6\">\ |
||||
|
<input class=\"form-check-input\" type=\"checkbox\" value=\"1\" id=\"mqttEnable\" name=\"mqttEnable\" %MQTT_ENABLE%>\ |
||||
|
<label class=\"form-check-label\" for=\"mqttEnable\">\ |
||||
|
MQTT aktivieren\ |
||||
|
</label>\ |
||||
|
</div>\ |
||||
|
<div class=\"form-group my-2 col-md-6\">\ |
||||
|
<label for=\"mqttServer\">MQTT-Server</label>\ |
||||
|
<input type=\"text\" class=\"form-control\" id=\"mqttServer\" minlength=\"7\" maxlength=\"%MQTT_SERVER_LENGTH%\"\ |
||||
|
placeholder=\"z.B. 192.168.2.89\" name=\"mqttServer\" value=\"%MQTT_SERVER%\">\ |
||||
|
<label for=\"mqttUser\">MQTT-Benutzername (optional):</label>\ |
||||
|
<input type=\"text\" class=\"form-control\" id=\"mqttUser\" maxlength=\"%MQTT_USER_LENGTH%\"\ |
||||
|
placeholder=\"Benutzername\" name=\"mqttUser\" value=\"%MQTT_USER%\">\ |
||||
|
<label for=\"mqttPwd\">Passwort (optional):</label>\ |
||||
|
<input type=\"password\" class=\"form-control\" id=\"mqttPwd\" maxlength=\"%MQTT_PWD_LENGTH%\"\ |
||||
|
placeholder=\"Passwort\" name=\"mqttPwd\" value=\"%MQTT_PWD%\">\ |
||||
|
</div>\ |
||||
|
<button type=\"reset\" class=\"btn btn-secondary\">Reset</button>\ |
||||
|
<button type=\"submit\" class=\"btn btn-primary\">Absenden</button>\ |
||||
|
</form>\ |
||||
|
<div class=\"messages col-md-6 my-2\"></div>\ |
||||
|
</div>\ |
||||
|
<div class=\"container\" id=\"ftpConfig\">\ |
||||
|
<h2>FTP-Konfiguration</h2>\ |
||||
|
<form action=\"#ftpConfig\" method=\"POST\" onsubmit=\"ftpSettings('ftpConfig'); return false\">\ |
||||
|
<div class=\"form-group col-md-6\">\ |
||||
|
<label for=\"ftpUser\">FTP-Benutzername:</label>\ |
||||
|
<input type=\"text\" class=\"form-control\" id=\"ftpUser\" maxlength=\"%FTP_USER_LENGTH%\"\ |
||||
|
placeholder=\"Benutzername\" name=\"ftpUser\" value=\"%FTP_USER%\" required>\ |
||||
|
<label for=\"pwd\">Passwort:</label>\ |
||||
|
<input type=\"password\" class=\"form-control\" id=\"ftpPwd\" maxlength=\"%FTP_PWD_LENGTH%\" placeholder=\"Passwort\"\ |
||||
|
name=\"ftpPwd\" value=\"%FTP_PWD%\" required>\ |
||||
|
</div>\ |
||||
|
<button type=\"reset\" class=\"btn btn-secondary\">Reset</button>\ |
||||
|
<button type=\"submit\" class=\"btn btn-primary\">Absenden</button>\ |
||||
|
</form>\ |
||||
|
<div class=\"messages col-md-6 my-2\"></div>\ |
||||
|
</div>\ |
||||
|
<div class=\"container my-5\" id=\"generalConfig\">\ |
||||
|
<h2>Allgemeine Konfiguration</h2>\ |
||||
|
<form action=\"#generalConfig\" method=\"POST\" onsubmit=\"genSettings('generalConfig'); return false\">\ |
||||
|
<div class=\"form-group col-md-6\">\ |
||||
|
<label for=\"initialVolume\">Lautstärke nach dem Einschalten</label>\ |
||||
|
<input type=\"number\" min=\"1\" max=\"21\" class=\"form-control\" id=\"initialVolume\" name=\"initialVolume\"\ |
||||
|
value=\"%INIT_VOLUME%\" required>\ |
||||
|
<label for=\"maxVolumeSpeaker\">Maximale Lautstärke (Lautsprecher)</label>\ |
||||
|
<input type=\"number\" min=\"1\" max=\"21\" class=\"form-control\" id=\"maxVolumeSpeaker\" name=\"maxVolumeSpeaker\"\ |
||||
|
value=\"%MAX_VOLUME_SPEAKER%\" required>\ |
||||
|
<label for=\"maxVolumeHeadphone\">Maximale Lautstärke (Kopfhörer)</label>\ |
||||
|
<input type=\"number\" min=\"1\" max=\"21\" class=\"form-control\" id=\"maxVolumeHeadphone\" name=\"maxVolumeHeadphone\"\ |
||||
|
value=\"%MAX_VOLUME_HEADPHONE%\" required>\ |
||||
|
</div>\ |
||||
|
<div class=\"form-group col-md-6\">\ |
||||
|
<label for=\"initBrightness\">Neopixel-Helligkeit nach dem Einschalten</label>\ |
||||
|
<input type=\"number\" min=\"0\" max=\"255\" class=\"form-control\" id=\"initBrightness\" name=\"initBrightness\"\ |
||||
|
value=\"%INIT_LED_BRIGHTNESS%\" required>\ |
||||
|
<label for=\"nightBrightness\">Neopixel-Helligkeit im Nachtmodus</label>\ |
||||
|
<input type=\"number\" min=\"0\" max=\"255\" class=\"form-control\" id=\"nightBrightness\" name=\"nightBrightness\"\ |
||||
|
value=\"%NIGHT_LED_BRIGHTNESS%\" required>\ |
||||
|
</div>\ |
||||
|
<div class=\"form-group col-md-6\">\ |
||||
|
<label for=\"inactivityTime\">Deep-Sleep nach Inaktivität (Minuten)</label>\ |
||||
|
<input type=\"number\" min=\"1\" max=\"1440\" class=\"form-control\" id=\"inactivityTime\" name=\"inactivityTime\"\ |
||||
|
value=\"%MAX_INACTIVITY%\" required>\ |
||||
|
</div>\ |
||||
|
<div class=\"form-group col-md-6\">\ |
||||
|
<label for=\"warningLowVoltage\">(Optional) Spannungsgrenze (Batterie), ab der Warnung auf Neopixel angezeigt\ |
||||
|
wird (z.B. 3.4)</label>\ |
||||
|
<input type=\"text\" class=\"form-control\" id=\"warningLowVoltage\" name=\"warningLowVoltage\"\ |
||||
|
value=\"%WARNING_LOW_VOLTAGE%\" pattern=\"^\\d{1,2}(\\.\\d{1,3})?\" required>\ |
||||
|
</div>\ |
||||
|
<div class=\"form-group col-md-6\">\ |
||||
|
<label for=\"voltageIndicatorLow\">(Optional) Unterer Akkuspannungslevel (Batterie) für Neopixel-Anzeige (z.B.\ |
||||
|
3.1)</label>\ |
||||
|
<input type=\"text\" class=\"form-control\" id=\"voltageIndicatorLow\" name=\"voltageIndicatorLow\"\ |
||||
|
value=\"%VOLTAGE_INDICATOR_LOW%\" pattern=\"^\\d{1,2}(\\.\\d{1,3})?\" required>\ |
||||
|
</div>\ |
||||
|
<div class=\"form-group col-md-6\">\ |
||||
|
<label for=\"voltageIndicatorHigh\">(Optional) Oberer Akkuspannungslevel (Batterie) für Neopixel-Anzeige (z.B.\ |
||||
|
4.2)</label>\ |
||||
|
<input type=\"text\" class=\"form-control\" id=\"voltageIndicatorHigh\" name=\"voltageIndicatorHigh\"\ |
||||
|
value=\"%VOLTAGE_INDICATOR_HIGH%\" pattern=\"^\\d{1,2}(\\.\\d{1,3})?\" required>\ |
||||
|
</div>\ |
||||
|
<div class=\"form-group col-md-6\">\ |
||||
|
<label for=\"voltageCheckInterval\">(Optional) Häufigkeit der Spannungsmessung (Batterie) in Minuten</label>\ |
||||
|
<input type=\"number\" min=\"1\" max=\"180\" class=\"form-control\" id=\"voltageCheckInterval\"\ |
||||
|
name=\"voltageCheckInterval\" value=\"%VOLTAGE_CHECK_INTERVAL%\" required>\ |
||||
|
</div>\ |
||||
|
<button type=\"reset\" class=\"btn btn-secondary\">Reset</button>\ |
||||
|
<button type=\"submit\" class=\"btn btn-primary\">Absenden</button>\ |
||||
|
</form>\ |
||||
|
<div class=\"messages col-md-6 my-2\"></div>\ |
||||
|
</div>\ |
||||
|
<div class=\"container my-5\" id=\"importNvs\">\ |
||||
|
<h2>NVS-Importer</h2>\ |
||||
|
<form action=\"/upload\" enctype=\"multipart/form-data\" method=\"POST\">\ |
||||
|
<div class=\"form-group\">\ |
||||
|
<label for=\"nvsUpload\">Hier kann eine Backup-Datei importiert werden.</label>\ |
||||
|
<input type=\"file\" class=\"form-control-file\" id=\"nvsUpload\" name=\"nvsUpload\" accept=\".txt\">\ |
||||
|
</div>\ |
||||
|
<button type=\"submit\" class=\"btn btn-primary\">Absenden</button>\ |
||||
|
</form>\ |
||||
|
<div class=\"messages col-md-6 my-2\"></div>\ |
||||
|
</div>\ |
||||
|
<script type=\"text/javascript\">\ |
||||
|
var DEBUG = false;\ |
||||
|
var lastIdclicked = '';\ |
||||
|
var host = $(location).attr('hostname');\ |
||||
|
\ |
||||
|
if (DEBUG) {\ |
||||
|
host = \"192.168.178.112\";\ |
||||
|
}\ |
||||
|
\ |
||||
|
toastr.options = {\ |
||||
|
\"closeButton\": false,\ |
||||
|
\"debug\": false,\ |
||||
|
\"newestOnTop\": false,\ |
||||
|
\"progressBar\": false,\ |
||||
|
\"positionClass\": \"toast-top-right\",\ |
||||
|
\"preventDuplicates\": false,\ |
||||
|
\"onclick\": null,\ |
||||
|
\"showDuration\": \"300\",\ |
||||
|
\"hideDuration\": \"1000\",\ |
||||
|
\"timeOut\": \"5000\",\ |
||||
|
\"extendedTimeOut\": \"1000\",\ |
||||
|
\"showEasing\": \"swing\",\ |
||||
|
\"hideEasing\": \"linear\",\ |
||||
|
\"showMethod\": \"fadeIn\",\ |
||||
|
\"hideMethod\": \"fadeOut\"\ |
||||
|
};\ |
||||
|
\ |
||||
|
function postRendering(event, data) {\ |
||||
|
Object.keys(data.instance._model.data).forEach(function (key, index) {\ |
||||
|
\ |
||||
|
var cur = data.instance.get_node(data.instance._model.data[key]);\ |
||||
|
var lastFolder = cur['id'].split('/').filter(function (el) {\ |
||||
|
return el.trim().length > 0;\ |
||||
|
}).pop();\ |
||||
|
if ((/\\.(mp3|MP3|ogg|wav|WAV|OGG|wma|WMA|acc|ACC|flac|FLAC)$/i).test(lastFolder)) {\ |
||||
|
data.instance.set_type(data.instance._model.data[key], 'audio');\ |
||||
|
} else {\ |
||||
|
if (data.instance._model.data[key]['type'] == \"file\") {\ |
||||
|
data.instance.disable_node(data.instance._model.data[key]);\ |
||||
|
}\ |
||||
|
}\ |
||||
|
data.instance.rename_node(data.instance._model.data[key], lastFolder);\ |
||||
|
});\ |
||||
|
}\ |
||||
|
\ |
||||
|
function renderFileTree() {\ |
||||
|
\ |
||||
|
var filesURI = \"/files\";\ |
||||
|
if (DEBUG) {\ |
||||
|
filesURI = \"http://\" + host + \"/files\";\ |
||||
|
}\ |
||||
|
$('#filetree').jstree({\ |
||||
|
'core': {\ |
||||
|
'check_callback': true,\ |
||||
|
'data': {\ |
||||
|
url: filesURI,\ |
||||
|
error: function (XMLHttpRequest, textStatus, errorThrown) {\ |
||||
|
$('#j1_loading').hide();\ |
||||
|
$(\"#refreshAction\").hide();\ |
||||
|
$('#filetree').html(\"<div class='clickForRefresh' ><i class='fas fa-sync fa-1x'><span id='#clickForRefresh' > Dateien suchen.</span></div>\");\ |
||||
|
$('#filetree').on(\"click\", function () {\ |
||||
|
refreshFileList();\ |
||||
|
});\ |
||||
|
toastr.error(\"Die Verzeichnis Liste konnte nicht geladen werden.\");\ |
||||
|
}\ |
||||
|
},\ |
||||
|
\ |
||||
|
},\ |
||||
|
'types': {\ |
||||
|
'folder': {\ |
||||
|
'icon': \"fa fa-folder\"\ |
||||
|
},\ |
||||
|
'file': {\ |
||||
|
'icon': \"fa fa-file\"\ |
||||
|
},\ |
||||
|
'audio': {\ |
||||
|
'icon': \"fa fa-file-audio\"\ |
||||
|
},\ |
||||
|
'default': {\ |
||||
|
'icon': \"fa fa-folder\"\ |
||||
|
}\ |
||||
|
},\ |
||||
|
'plugins': [\"themes\", \"types\"]\ |
||||
|
}).bind('loaded.jstree', function (event, data) {\ |
||||
|
postRendering(event, data);\ |
||||
|
if ((data.instance._model.data['#']['children'].length == 0)) {\ |
||||
|
toastr.info(\"Der SD Karten Index muss erzeugt werden.\");\ |
||||
|
}\ |
||||
|
}).bind('refresh.jstree', function (event, data) {\ |
||||
|
postRendering(event, data);\ |
||||
|
});\ |
||||
|
}\ |
||||
|
\ |
||||
|
$('#filetree').on('select_node.jstree', function (e, data) {\ |
||||
|
$('input[name=fileOrUrl]').val(data.node.id);\ |
||||
|
\ |
||||
|
if (data.node.type == \"folder\") {\ |
||||
|
$('.option-folder').show();\ |
||||
|
$('.option-file').hide();\ |
||||
|
$('#playMode option').removeAttr('selected').filter('[value=3]').attr('selected', true);\ |
||||
|
}\ |
||||
|
\ |
||||
|
if (data.node.type == \"audio\") {\ |
||||
|
$('.option-file').show();\ |
||||
|
$('.option-folder').hide();\ |
||||
|
$('#playMode option').removeAttr('selected').filter('[value=1]').attr('selected', true);\ |
||||
|
}\ |
||||
|
});\ |
||||
|
\ |
||||
|
$('#refreshAction').on(\"click\", function () {\ |
||||
|
refreshFileList();\ |
||||
|
$(\"#indexing-progress\").show();\ |
||||
|
$(\"#refreshAction\").hide();\ |
||||
|
});\ |
||||
|
\ |
||||
|
$('#playMode').on(\"change\", function () {\ |
||||
|
if (this.value == 8) {\ |
||||
|
$('#filebrowser').slideUp();\ |
||||
|
} else {\ |
||||
|
$('#filebrowser').slideDown();\ |
||||
|
}\ |
||||
|
});\ |
||||
|
\ |
||||
|
var socket = undefined;\ |
||||
|
\ |
||||
|
function connect() {\ |
||||
|
socket = new WebSocket(\"ws://\" + host + \"/ws\");\ |
||||
|
\ |
||||
|
socket.onopen = function () {\ |
||||
|
setInterval(ping, 15000);\ |
||||
|
};\ |
||||
|
\ |
||||
|
socket.onclose = function (e) {\ |
||||
|
console.log('Socket is closed. Reconnect will be attempted in 1 second.', e.reason);\ |
||||
|
toastr.error('Die Websocket Verbindung wurde vom Tonuino unterbrochen.');\ |
||||
|
socket = null;\ |
||||
|
\ |
||||
|
setTimeout(function () {\ |
||||
|
connect();\ |
||||
|
}, 5000);\ |
||||
|
};\ |
||||
|
\ |
||||
|
socket.onerror = function (err) {\ |
||||
|
console.error('Socket encountered error: ', err.message, 'Closing socket');\ |
||||
|
toastr.error('Es gab einen Fehler bei der Websocket Verbindung');\ |
||||
|
socket.close();\ |
||||
|
};\ |
||||
|
\ |
||||
|
socket.onmessage = function(event) {\ |
||||
|
console.log(event.data);\ |
||||
|
var socketMsg = JSON.parse(event.data);\ |
||||
|
if (socketMsg.rfidId != null) {\ |
||||
|
document.getElementById('rfidIdMod').value = socketMsg.rfidId;\ |
||||
|
document.getElementById('rfidIdMusic').value = socketMsg.rfidId;\ |
||||
|
toastr.info(\"RFID Tag mit \"+ socketMsg.rfidId + \" erkannt.\" );\ |
||||
|
\ |
||||
|
$(\"#rfidIdMusic\").effect(\"highlight\", {color:\"#abf5af\"}, 3000);\ |
||||
|
$(\"#rfidIdMod\").effect(\"highlight\", {color:\"#abf5af\"}, 3000);\ |
||||
|
\ |
||||
|
} if (socketMsg.status != null) {\ |
||||
|
if (socketMsg.status == 'ok') {\ |
||||
|
toastr.success(\"Aktion erfolgreich ausgeführt.\" );\ |
||||
|
$('#overlay').style.display = \"none\";\ |
||||
|
} else {\ |
||||
|
toastr.error(\"Es ist ein Fehler aufgetreten.\" );\ |
||||
|
}\ |
||||
|
} if (socketMsg.pong != null) {\ |
||||
|
if (socketMsg.pong == 'pong') {\ |
||||
|
pong();\ |
||||
|
}\ |
||||
|
} if (\"refreshFileList\" in socketMsg){\ |
||||
|
toastr.info(\"Die Datei Liste wurde neu erzeugt!\");\ |
||||
|
$('#filetree').jstree(true).refresh();\ |
||||
|
$(\"#indexing-progress\").hide();\ |
||||
|
$(\"#refreshAction\").show();\ |
||||
|
}\ |
||||
|
if (\"indexingState\" in socketMsg){\ |
||||
|
console.log(socketMsg.indexingState);\ |
||||
|
}\ |
||||
|
};\ |
||||
|
}\ |
||||
|
\ |
||||
|
function ping() {\ |
||||
|
var myObj = {\ |
||||
|
\"ping\": {\ |
||||
|
ping: 'ping'\ |
||||
|
}\ |
||||
|
};\ |
||||
|
var myJSON = JSON.stringify(myObj);\ |
||||
|
socket.send(myJSON);\ |
||||
|
tm = setTimeout(function () {\ |
||||
|
toastr.warning('Die Verbindung zum Tonuino ist unterbrochen! Bitte Seite neu laden.');\ |
||||
|
}, 5000);\ |
||||
|
}\ |
||||
|
\ |
||||
|
function pong() {\ |
||||
|
clearTimeout(tm);\ |
||||
|
}\ |
||||
|
\ |
||||
|
function refreshFileList(clickedId) {\ |
||||
|
lastIdclicked = clickedId;\ |
||||
|
var myObj = {\ |
||||
|
\"refreshFileList\": true\ |
||||
|
};\ |
||||
|
var myJSON = JSON.stringify(myObj);\ |
||||
|
$(\"#refreshAction\").hide();\ |
||||
|
socket.send(myJSON);\ |
||||
|
$(\"#indexing-progress\").show();\ |
||||
|
$(\"#refreshAction\").hide();\ |
||||
|
};\ |
||||
|
\ |
||||
|
function genSettings(clickedId) {\ |
||||
|
lastIdclicked = clickedId;\ |
||||
|
var myObj = {\ |
||||
|
\"general\": {\ |
||||
|
iVol: document.getElementById('initialVolume').value,\ |
||||
|
mVolSpeaker: document.getElementById('maxVolumeSpeaker').value,\ |
||||
|
mVolHeadphone: document.getElementById('maxVolumeHeadphone').value,\ |
||||
|
iBright: document.getElementById('initBrightness').value,\ |
||||
|
nBright: document.getElementById('nightBrightness').value,\ |
||||
|
iTime: document.getElementById('inactivityTime').value,\ |
||||
|
vWarning: document.getElementById('warningLowVoltage').value,\ |
||||
|
vIndLow: document.getElementById('voltageIndicatorLow').value,\ |
||||
|
vIndHi: document.getElementById('voltageIndicatorHigh').value,\ |
||||
|
vInt: document.getElementById('voltageCheckInterval').value\ |
||||
|
}\ |
||||
|
};\ |
||||
|
var myJSON = JSON.stringify(myObj);\ |
||||
|
socket.send(myJSON);\ |
||||
|
}\ |
||||
|
\ |
||||
|
function ftpSettings(clickedId) {\ |
||||
|
lastIdclicked = clickedId;\ |
||||
|
var myObj = {\ |
||||
|
\"ftp\": {\ |
||||
|
ftpUser: document.getElementById('ftpUser').value,\ |
||||
|
ftpPwd: document.getElementById('ftpPwd').value\ |
||||
|
}\ |
||||
|
};\ |
||||
|
var myJSON = JSON.stringify(myObj);\ |
||||
|
socket.send(myJSON);\ |
||||
|
}\ |
||||
|
\ |
||||
|
function mqttSettings(clickedId) {\ |
||||
|
lastIdclicked = clickedId;\ |
||||
|
var val;\ |
||||
|
if (document.getElementById('mqttEnable').checked) {\ |
||||
|
val = document.getElementById('mqttEnable').value;\ |
||||
|
} else {\ |
||||
|
val = 0;\ |
||||
|
}\ |
||||
|
var myObj = {\ |
||||
|
\"mqtt\": {\ |
||||
|
mqttEnable: val,\ |
||||
|
mqttServer: document.getElementById('mqttServer').value,\ |
||||
|
mqttUser: document.getElementById('mqttUser').value,\ |
||||
|
mqttPwd: document.getElementById('mqttPwd').value\ |
||||
|
}\ |
||||
|
};\ |
||||
|
var myJSON = JSON.stringify(myObj);\ |
||||
|
socket.send(myJSON);\ |
||||
|
}\ |
||||
|
\ |
||||
|
function rfidMods(clickedId) {\ |
||||
|
lastIdclicked = clickedId;\ |
||||
|
var myObj = {\ |
||||
|
\"rfidMod\": {\ |
||||
|
rfidIdMod: document.getElementById('rfidIdMod').value,\ |
||||
|
modId: document.getElementById('modId').value\ |
||||
|
}\ |
||||
|
};\ |
||||
|
var myJSON = JSON.stringify(myObj);\ |
||||
|
socket.send(myJSON);\ |
||||
|
}\ |
||||
|
\ |
||||
|
function removeTrSlash(str) {\ |
||||
|
if (str.substr(-1) === '/') {\ |
||||
|
return str.substr(0, str.length - 1);\ |
||||
|
}\ |
||||
|
return str;\ |
||||
|
}\ |
||||
|
\ |
||||
|
function rfidAssign(clickedId) {\ |
||||
|
lastIdclicked = clickedId;\ |
||||
|
var myObj = {\ |
||||
|
\"rfidAssign\": {\ |
||||
|
rfidIdMusic: document.getElementById('rfidIdMusic').value,\ |
||||
|
fileOrUrl: removeTrSlash(document.getElementById('fileOrUrl').value),\ |
||||
|
playMode: document.getElementById('playMode').value\ |
||||
|
}\ |
||||
|
};\ |
||||
|
var myJSON = JSON.stringify(myObj);\ |
||||
|
socket.send(myJSON);\ |
||||
|
}\ |
||||
|
\ |
||||
|
function wifiConfig(clickedId) {\ |
||||
|
lastIdclicked = clickedId;\ |
||||
|
var myObj = {\ |
||||
|
\"wifiConfig\": {\ |
||||
|
ssid: document.getElementById('ssid').value,\ |
||||
|
pwd: document.getElementById('pwd').value,\ |
||||
|
hostname: document.getElementById('hostname').value\ |
||||
|
}\ |
||||
|
};\ |
||||
|
var myJSON = JSON.stringify(myObj);\ |
||||
|
socket.send(myJSON);\ |
||||
|
}\ |
||||
|
\ |
||||
|
$(document).ready(function () {\ |
||||
|
connect();\ |
||||
|
renderFileTree();\ |
||||
|
\ |
||||
|
$(function () {\ |
||||
|
$('[data-toggle=\"tooltip\"]').tooltip();\ |
||||
|
});\ |
||||
|
});\ |
||||
|
</script>\ |
||||
|
</body>\ |
||||
|
</html>\ |
||||
|
"; |
Write
Preview
Loading…
Cancel
Save
Reference in new issue