site-manual-notifier/static/js/control.js

220 lines
7.8 KiB
JavaScript
Raw Normal View History

2020-07-05 06:43:38 +00:00
var loadingNewData = false;
2020-07-05 10:40:39 +00:00
var indexFromWebSocket = false;
2020-07-24 00:07:07 +00:00
var acceptingRemoteSettings = true;
2020-07-05 06:43:38 +00:00
var currentForm = document.getElementById('currentForm');
var currentDisplayIndex = 0;
var nbsp = ' ';
2020-07-05 10:40:39 +00:00
setTimeout(
() => sendThroughWebSocket(JSON.stringify({
type: 'SettingsRequest'
})),
50
);
2020-07-05 06:43:38 +00:00
2020-07-03 07:24:20 +00:00
function handleMessage(message) {
2020-07-05 06:43:38 +00:00
if (message.type == 'MessageBroadcast')
try {
handleBroadcastedMessage(JSON.parse(message.message));
} catch (e) {
console.error(message);
console.error(e);
}
}
function handleBroadcastedMessage(message) {
if (message.type == 'SettingsRequest')
sendThroughWebSocket(JSON.stringify({
type: 'Settings',
settings: getSettings()
}));
2020-07-24 00:07:07 +00:00
else if ((message.type == 'NewSettings') || (message.type == 'Settings' && acceptingRemoteSettings)) {
2020-07-16 03:11:22 +00:00
acceptingRemoteSettings = true;
2020-07-05 06:43:38 +00:00
applyLoadedSettings(message.settings);
2020-07-16 03:11:22 +00:00
acceptingRemoteSettings = false;
2020-07-05 06:43:38 +00:00
}
2020-07-03 07:24:20 +00:00
console.log(message);
2020-07-05 06:43:38 +00:00
}
function downloadTextFile(filename, text) {
var element = document.createElement('a');
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
element.setAttribute('download', filename);
element.style.display = 'none';
document.body.appendChild(element);
element.click();
document.body.removeChild(element);
}
function getSettings() {
var settings = {};
for (var form of Array.from(document.querySelectorAll('form.form')))
for (var keyPair of Array.from((new FormData(form)).entries()))
settings[keyPair[0]] = keyPair[1];
2020-07-24 00:07:07 +00:00
settings.templateParams = getTemplateParameters();
2020-07-05 06:43:38 +00:00
return settings;
}
function saveSettings() {
var token = window.location.hash.substr(1);
downloadTextFile(
2020-07-24 00:07:07 +00:00
`manual-notifier_settings_${token}.json`,
2020-07-05 06:43:38 +00:00
JSON.stringify(getSettings())
);
}
function loadSettings(input) {
var file = input.files[0];
input.value = null;
if (file) {
var fr = new FileReader();
fr.onload = () => {
var text = fr.result;
applyLoadedSettings(JSON.parse(text));
};
fr.readAsText(file);
}
}
2020-07-24 00:07:07 +00:00
function loadBackgroundMedia(input) {
if (!input) {
var backgroundMediaHidden = document.getElementById('backgroundMediaHidden');
backgroundMediaHidden.value = '';
updateMediaPreviewAfterChange();
broadcastChanges();
} else {
var file = input.files[0];
input.value = null;
var fr = new FileReader();
fr.readAsDataURL(file);
fr.onloadend = () => {
var backgroundMediaHidden = document.getElementById('backgroundMediaHidden');
backgroundMediaHidden.value = fr.result;
updateMediaPreviewAfterChange();
broadcastChanges();
};
}
}
function updateMediaPreviewAfterChange() {
var mediaPreview = document.getElementById('mediaPreview');
var backgroundMediaHidden = document.getElementById('backgroundMediaHidden');
var backgroundMediaString = backgroundMediaHidden.value;
mediaPreview.style.backgroundColor = document.getElementById('backgroundColor').value;
if (backgroundMediaString == '') {
mediaPreview.innerHTML = 'No media.';
} else if (backgroundMediaString.startsWith('data:image/')) {
mediaPreview.innerHTML = `<img src="${backgroundMediaString}" style="width: 100%;">`;
} else if (backgroundMediaString.startsWith('data:video/')) {
mediaPreview.innerHTML = `<video src="${backgroundMediaString}" controls playsinline autoplay muted loop style="width: 100%;">`;
} else {
mediaPreview.innerHTML = 'Incompatible type.';
}
}
setTimeout(updateMediaPreviewAfterChange, 100);
2020-07-05 06:43:38 +00:00
function applyLoadedSettings(settings) {
loadingNewData = true;
for (var setting of Object.entries(settings)) {
var key = setting[0];
var value = setting[1];
var field = document.querySelector(`[name="${key}"]`);
if (!!field) {
if (field.type == 'radio' || field.type == 'checkbox') {
2020-07-16 03:11:22 +00:00
field = document.querySelector(`[name="${key}"][value="${value}"]`);
field.checked = true;
2020-07-05 06:43:38 +00:00
} else {
field.value = value;
}
}
}
2020-07-24 00:07:07 +00:00
updateMediaPreviewAfterChange();
2020-07-05 06:43:38 +00:00
loadingNewData = false;
2020-07-16 03:11:22 +00:00
if (!acceptingRemoteSettings)
broadcastChanges(); // only once
2020-07-05 06:43:38 +00:00
}
function broadcastChanges() {
if (!loadingNewData)
sendThroughWebSocket(JSON.stringify({
type: 'NewSettings',
settings: getSettings()
}));
}
var escapeHtml = (unsafe) => (unsafe
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;"));
2020-07-24 00:07:07 +00:00
var form_send = document.getElementById('form_send');
var form_send_fields = document.getElementById('form_send_fields');
2020-07-05 06:43:38 +00:00
2020-07-24 00:07:07 +00:00
function getTemplateParametersFrom(input) {
return input.value.match(/\{.+?\}/g);
2020-07-05 06:43:38 +00:00
}
2020-07-24 00:07:07 +00:00
function getTemplateParameters() {
var params = ['primaryText', 'secondaryText'].map(x => document.getElementById(x)).flatMap(x => getTemplateParametersFrom(x));
return Array.from(new Set(params)).sort();
2020-07-16 03:11:22 +00:00
}
2020-07-24 00:07:07 +00:00
Element.prototype.insertChildAtIndex = function (child, index) {
if (!index) index = 0;
if (index >= this.children.length || index < 0)
this.appendChild(child);
else
this.insertBefore(child, this.children[index]);
}
function updateSendFields() {
var currentTemplateParameters = getTemplateParameters();
var onScreenTemplateParametersSet = new Set(Array.from(document.getElementsByClassName('variable-field')).map(
it => it.id).map(x => x.split('_', 2)[1]).map(x => `{${x}}`));
var currentTemplateParametersSet = new Set(currentTemplateParameters);
var fieldsToRemove = new Set([...onScreenTemplateParametersSet].filter(x => !currentTemplateParametersSet.has(x)));
var fieldsToAdd = new Set([...currentTemplateParametersSet].filter(x => !onScreenTemplateParametersSet.has(x)));
for (let fieldNameLonger of Array.from(fieldsToRemove)) {
let fieldName = fieldNameLonger.substr(1, fieldNameLonger.length - 2);
let fieldId = `variableField_${fieldName}`;
let field = document.getElementById(fieldId);
let parent = field.parentNode;
parent.removeChild(field);
}
for (let fieldNameLonger of Array.from(fieldsToAdd).sort()) {
let fieldName = fieldNameLonger.substr(1, fieldNameLonger.length - 2);
let containerId = `variableField_${fieldName}`;
let fieldId = `${containerId}_field`;
let labelId = `${containerId}_label`;
let container = document.createElement('div');
container.setAttribute('id', containerId);
container.classList.add('variable-field');
form_send_fields.insertChildAtIndex(container, currentTemplateParameters.indexOf(fieldName));
let label = document.createElement('label');
label.setAttribute('id', labelId);
label.setAttribute('for', fieldId);
label.setAttribute('class', 'f6 b db mb1 mt3 sans-serif mid-gray');
label.innerText = fieldName;
let field = document.createElement('input');
field.setAttribute('type', 'text');
field.setAttribute('id', fieldId);
field.setAttribute('name', containerId);
field.setAttribute('class', 'w-100 f5 pv3 ph3 bg-light-gray bn');
field.setAttribute('onkeyup', 'broadcastChanges()');
field.setAttribute('onkeydown', 'broadcastChanges()');
field.setAttribute('onchange', 'broadcastChanges()');
container.appendChild(label);
container.appendChild(field);
}
2020-07-05 06:43:38 +00:00
}
2020-07-24 00:07:07 +00:00
updateSendFields();
function sendToDisplay() {
sendThroughWebSocket(JSON.stringify({
type: 'SendToDisplay',
settings: getSettings()
}));
}