commit 11/09/2025
This commit is contained in:
@@ -323,7 +323,7 @@ let ws = null;
|
||||
function sendCommand(command, data) {
|
||||
if (ws.readyState === WebSocket.OPEN) {
|
||||
ws.send(JSON.stringify({ command, data }));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -356,12 +356,12 @@ function fetchAPI(endpoint, method, headers = {}, body = null, cbOK, cbError) {
|
||||
}
|
||||
return response.json();
|
||||
})
|
||||
.then(data => {
|
||||
.then(data => {
|
||||
//console.log("fetchAPI: received data", data);
|
||||
cbOK(data);
|
||||
})
|
||||
.catch(error => {
|
||||
// console.error('There was a problem with the fetch operation:', error);
|
||||
// console.error('There was a problem with the fetch operation:', error);
|
||||
cbError(error);
|
||||
});
|
||||
}
|
||||
@@ -379,7 +379,7 @@ function reloadSoundBank(APIURL) {
|
||||
fill_soundbanktablebody(soundbankdata);
|
||||
}
|
||||
}, (errdata) => {
|
||||
alert("Error loading soundbank: " + errdata.message);
|
||||
alert("Error loading soundbank : " + errdata.message);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -396,7 +396,7 @@ function reloadMessageBank(APIURL) {
|
||||
fill_messagebanktablebody(messagebankdata);
|
||||
}
|
||||
}, (errdata) => {
|
||||
alert("Error loading messagebank: " + errdata.message);
|
||||
alert("Error loading messagebank : " + errdata.message);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -413,7 +413,7 @@ function reloadLanguageBank(APIURL) {
|
||||
fill_languagebanktablebody(languagebankdata);
|
||||
}
|
||||
}, (errdata) => {
|
||||
alert("Error loading languagebank: " + errdata.message);
|
||||
alert("Error loading languagebank : " + errdata.message);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -425,12 +425,12 @@ function reloadTimerBank(APIURL) {
|
||||
schedulebankdata = [];
|
||||
fetchAPI(APIURL + "List", "GET", {}, null, (okdata) => {
|
||||
if (Array.isArray(okdata)) {
|
||||
schedulebankdata = okdata.data;
|
||||
schedulebankdata = okdata;
|
||||
selectedschedulerow = null;
|
||||
fill_schedulebanktablebody(schedulebankdata);
|
||||
}
|
||||
}, (errdata) => {
|
||||
alert("Error loading schedulebank: " + errdata.message);
|
||||
alert("Error loading schedulebank : " + errdata.message);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -447,9 +447,12 @@ function reloadLogs(APIURL, date, filter) {
|
||||
})
|
||||
fetchAPI(APIURL + "List?" + params.toString(), "GET", {}, null, (okdata) => {
|
||||
//console.log("Logs data received", okdata);
|
||||
fill_logtablebody(okdata);
|
||||
if (Array.isArray(okdata)) {
|
||||
logdata = okdata;
|
||||
fill_logtablebody(okdata);
|
||||
}
|
||||
}, (errdata) => {
|
||||
alert("Error loading logs: " + errdata.message);
|
||||
alert("Error loading logs : " + errdata.message);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -469,7 +472,7 @@ function regetSoundbankFiles(APIURL = "SoundBank/") {
|
||||
select2results.results = soundbankfiles.map((item, index) => ({ id: index + 1, text: item }));
|
||||
} else console.log("regetSoundbankFiles: okdata is not array");
|
||||
}, (errdata) => {
|
||||
alert("Error loading soundbank files: " + errdata.message);
|
||||
alert("Error loading soundbank files : " + errdata.message);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -485,7 +488,7 @@ function getVoiceTypes() {
|
||||
//console.log("Loaded " + voiceTypes.length + " voice types : " + voiceTypes.join(", "));
|
||||
} else console.log("getVoiceTypes: okdata is not array");
|
||||
}, (errdata) => {
|
||||
alert("Error loading voice types: " + errdata.message);
|
||||
alert("Error loading voice types : " + errdata.message);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -501,7 +504,7 @@ function getCategories() {
|
||||
//console.log("Loaded " + categories.length + " categories : " + categories.join(", "));
|
||||
} else console.log("getCategories: okdata is not array");
|
||||
}, (errdata) => {
|
||||
alert("Error loading categories: " + errdata.message);
|
||||
alert("Error loading categories : " + errdata.message);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -517,7 +520,7 @@ function getLanguages() {
|
||||
//console.log("Loaded " + languages.length + " languages : " + languages.join(", ") );
|
||||
} else console.log("getLanguages: okdata is not array");
|
||||
}, (errdata) => {
|
||||
alert("Error loading languages: " + errdata.message);
|
||||
alert("Error loading languages : " + errdata.message);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -533,7 +536,7 @@ function getScheduledDays() {
|
||||
//console.log("Loaded " + scheduledays.length + " scheduled days : " + scheduledays.join(", ") );
|
||||
} else console.log("getScheduledDays: okdata is not array");
|
||||
}, (errdata) => {
|
||||
alert("Error loading scheduled days: " + errdata.message);
|
||||
alert("Error loading scheduled days : " + errdata.message);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -729,7 +732,8 @@ $(document).ready(function () {
|
||||
reloadSoundBank(APIURL);
|
||||
$('#findsoundbank').on('input', function () {
|
||||
let searchTerm = $(this).val().trim().toLowerCase();
|
||||
if (searchTerm.length>0){
|
||||
if (searchTerm.length > 0) {
|
||||
selectedsoundrow = null;
|
||||
let filtered = soundbankdata.filter(item => item.description.toLowerCase().includes(searchTerm) || item.tag.toLowerCase().includes(searchTerm) || item.path.toLowerCase().includes(searchTerm));
|
||||
fill_soundbanktablebody(filtered);
|
||||
} else {
|
||||
@@ -739,14 +743,12 @@ $(document).ready(function () {
|
||||
});
|
||||
$btnClear.click(() => {
|
||||
DoClear(APIURL, "Soundbank", (okdata) => {
|
||||
alert("Success clear soundbank" + okdata.message);
|
||||
soundbankdata = []
|
||||
selectedsoundrow = null;
|
||||
fill_soundbanktablebody(soundbankdata);
|
||||
reloadSoundBank(APIURL);
|
||||
alert("Success clear soundbank : " + okdata.message);
|
||||
}, (errdata) => {
|
||||
alert("Error clear soundbank: " + errdata.message);
|
||||
alert("Error clear soundbank : " + errdata.message);
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
$btnAdd.click(() => {
|
||||
$('.js-example-basic-single').select2({
|
||||
@@ -779,12 +781,10 @@ $(document).ready(function () {
|
||||
}
|
||||
if (confirm(`Are you sure to delete soundbank [${sb.index}] Description=${sb.description} Tag=${sb.tag}?`)) {
|
||||
fetchAPI(APIURL + "DeleteByIndex/" + sb.index, "DELETE", {}, null, (okdata) => {
|
||||
alert("Success delete soundbank" + okdata.message);
|
||||
soundbankdata = soundbankdata.filter(item => item.index !== sb.index);
|
||||
selectedsoundrow = null;
|
||||
fill_soundbanktablebody(soundbankdata);
|
||||
reloadSoundBank(APIURL);
|
||||
alert("Success delete soundbank : " + okdata.message);
|
||||
}, (errdata) => {
|
||||
alert("Error delete soundbank: " + errdata.message);
|
||||
alert("Error delete soundbank : " + errdata.message);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -813,17 +813,18 @@ $(document).ready(function () {
|
||||
}
|
||||
});
|
||||
$btnExport.click(() => {
|
||||
DoExport(APIURL, "soundbank.xlsx",{});
|
||||
DoExport(APIURL, "soundbank.xlsx", {});
|
||||
});
|
||||
$btnImport.click(() => {
|
||||
DoImport(APIURL, (okdata) => {
|
||||
reloadSoundBank(APIURL);
|
||||
alert("Success import soundbank : " + okdata.message);
|
||||
}, (errdata) => {
|
||||
alert("Error importing soundbank from XLSX: " + errdata.message);
|
||||
alert("Error importing soundbank from XLSX : " + errdata.message);
|
||||
});
|
||||
});
|
||||
} else {
|
||||
console.error("Error loading soundbank content:", xhr.status, xhr.statusText);
|
||||
console.error("Error loading soundbank content : ", xhr.status, xhr.statusText);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -845,19 +846,30 @@ $(document).ready(function () {
|
||||
$btnRemove.prop('disabled', true);
|
||||
$btnEdit.prop('disabled', true);
|
||||
let APIURL = "MessageBank/";
|
||||
let $findmessage = $('#findmessage');
|
||||
|
||||
$findmessage.on('input', function () {
|
||||
let searchTerm = $findmessage.val().toLowerCase();
|
||||
if (searchTerm.length > 0) {
|
||||
selectedmessagerow = null;
|
||||
let filtered = messagebankdata.filter(item => item.description.toLowerCase().includes(searchTerm) || item.message_Detail.toLowerCase().includes(searchTerm) || item.message_TAGS.toLowerCase().includes(searchTerm));
|
||||
fill_messagebanktablebody(filtered);
|
||||
} else {
|
||||
selectedmessagerow = null;
|
||||
fill_messagebanktablebody(messagebankdata);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
reloadMessageBank(APIURL);
|
||||
$btnClear.click(() => {
|
||||
DoClear(APIURL, "Messagebank", (okdata) => {
|
||||
alert("Success clear messagebank" + okdata.message);
|
||||
messagebankdata = []
|
||||
selectedmessagerow = null;
|
||||
fill_messagebanktablebody(messagebankdata);
|
||||
reloadMessageBank(APIURL);
|
||||
alert("Success clear messagebank : " + okdata.message);
|
||||
}, (errdata) => {
|
||||
alert("Error clear messagebank: " + errdata.message);
|
||||
alert("Error clear messagebank : " + errdata.message);
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
$btnAdd.click(() => {
|
||||
let $modal = $('#messagebankmodal');
|
||||
@@ -892,12 +904,10 @@ $(document).ready(function () {
|
||||
|
||||
if (confirm(`Are you sure to delete messagebank [${mb.index}] Description=${mb.description}? ANN_ID=${mb.aNN_ID} Language=${mb.language} Voice_Type=${mb.voice_Type} `)) {
|
||||
fetchAPI(APIURL + "DeleteByIndex/" + mb.index, "DELETE", {}, null, (okdata) => {
|
||||
alert("Success delete messagebank" + okdata.message);
|
||||
messagebankdata = messagebankdata.filter(item => item.index !== mb.index);
|
||||
selectedmessagerow = null;
|
||||
fill_messagebanktablebody(messagebankdata);
|
||||
reloadMessageBank(APIURL);
|
||||
alert("Success delete messagebank : " + okdata.message);
|
||||
}, (errdata) => {
|
||||
alert("Error delete messagebank: " + errdata.message);
|
||||
alert("Error delete messagebank : " + errdata.message);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -921,17 +931,18 @@ $(document).ready(function () {
|
||||
}
|
||||
});
|
||||
$btnExport.click(() => {
|
||||
DoExport(APIURL, "messagebank.xlsx",{});
|
||||
DoExport(APIURL, "messagebank.xlsx", {});
|
||||
});
|
||||
$btnImport.click(() => {
|
||||
DoImport(APIURL, (okdata) => {
|
||||
reloadMessageBank(APIURL);
|
||||
alert("Success import messagebank : " + okdata.message);
|
||||
}, (errdata) => {
|
||||
alert("Error importing messagebank from XLSX: " + errdata.message);
|
||||
alert("Error importing messagebank from XLSX : " + errdata.message);
|
||||
});
|
||||
});
|
||||
} else {
|
||||
console.error("Error loading messagebank content:", xhr.status, xhr.statusText);
|
||||
console.error("Error loading messagebank content : ", xhr.status, xhr.statusText);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -953,33 +964,54 @@ $(document).ready(function () {
|
||||
$btnRemove.prop('disabled', true);
|
||||
$btnEdit.prop('disabled', true);
|
||||
let APIURL = "LanguageLink/";
|
||||
|
||||
let $findlanguage = $('#findlanguage');
|
||||
let $modal = $('#languagemodal');
|
||||
let $langid = $modal.find('#languagelinkindex');
|
||||
let $langtag = $modal.find('#languagelinktag');
|
||||
let $cbInd = $modal.find('#langId');
|
||||
let $cbLocal = $modal.find('#langLocal');
|
||||
let $cbEn = $modal.find('#langEn');
|
||||
let $cbArb = $modal.find('#langArb');
|
||||
let $cbJap = $modal.find('#langJap');
|
||||
let $cbChi = $modal.find('#langChi');
|
||||
|
||||
function clearLanguageModal() {
|
||||
$langid.prop('disabled', true).val('');
|
||||
$langtag.val('');
|
||||
$cbInd.prop('checked', false);
|
||||
$cbLocal.prop('checked', false);
|
||||
$cbEn.prop('checked', false);
|
||||
$cbArb.prop('checked', false);
|
||||
$cbJap.prop('checked', false);
|
||||
$cbChi.prop('checked', false);
|
||||
}
|
||||
|
||||
$findlanguage.on('input', function () {
|
||||
let searchTerm = $findlanguage.val().toLowerCase();
|
||||
if (searchTerm.length > 0) {
|
||||
selectedlanguagerow = null;
|
||||
let filtered = languagebankdata.filter(item => item.tag.toLowerCase().includes(searchTerm) || item.language.toLowerCase().includes(searchTerm));
|
||||
fill_languagebanktablebody(filtered);
|
||||
} else {
|
||||
selectedlanguagerow = null;
|
||||
fill_languagebanktablebody(languagebankdata);
|
||||
}
|
||||
});
|
||||
|
||||
reloadLanguageBank(APIURL);
|
||||
$btnClear.click(() => {
|
||||
DoClear(APIURL, "LanguageLink", (okdata) => {
|
||||
alert("Success clear languageLink" + okdata.message);
|
||||
languagebankdata = []
|
||||
selectedlanguagerow = null;
|
||||
fill_languagebanktablebody(languagebankdata);
|
||||
reloadLanguageBank(APIURL);
|
||||
alert("Success clear languageLink : " + okdata.message);
|
||||
}, (errdata) => {
|
||||
alert("Error clear languagebank: " + errdata.message);
|
||||
alert("Error clear languageLink : " + errdata.message);
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
$btnAdd.click(() => {
|
||||
// show modal with id 'languagemodal'
|
||||
let $modal = $('#languagemodal');
|
||||
$modal.modal('show');
|
||||
let $langtag = $modal.find('#languagelinktag');
|
||||
let $cbInd = $modal.find('#langId');
|
||||
let $cbLocal = $modal.find('#langLocal');
|
||||
let $cbEn = $modal.find('#langEn');
|
||||
let $cbArb = $modal.find('#langArb');
|
||||
let $cbJap = $modal.find('#langJap');
|
||||
let $cbChi = $modal.find('#langChi');
|
||||
clearLanguageModal();
|
||||
|
||||
// save button click event
|
||||
$modal.off('click.languagelinksave').on('click.languagelinksave', '#languagelinksave', function () {
|
||||
@@ -1007,10 +1039,10 @@ $(document).ready(function () {
|
||||
language: langString
|
||||
}
|
||||
fetchAPI(APIURL + "Add", "POST", {}, ll, (okdata) => {
|
||||
alert("Success add language" + okdata.message);
|
||||
alert("Success add language : " + okdata.message);
|
||||
reloadLanguageBank(APIURL);
|
||||
}, (errdata) => {
|
||||
alert("Error add language: " + errdata.message);
|
||||
alert("Error add language : " + errdata.message);
|
||||
});
|
||||
$modal.modal('hide');
|
||||
|
||||
@@ -1032,12 +1064,10 @@ $(document).ready(function () {
|
||||
}
|
||||
if (confirm(`Are you sure to delete language [${ll.index}] Tag=${ll.tag} Language=${ll.language}?`)) {
|
||||
fetchAPI(APIURL + "DeleteByIndex/" + ll.index, "DELETE", {}, null, (okdata) => {
|
||||
alert("Success delete language" + okdata.message);
|
||||
languagebankdata = languagebankdata.filter(item => item.index !== ll.index);
|
||||
selectedlanguagerow = null;
|
||||
fill_languagebanktablebody(languagebankdata);
|
||||
reloadLanguageBank(APIURL);
|
||||
alert("Success delete language : " + okdata.message);
|
||||
}, (errdata) => {
|
||||
alert("Error delete language: " + errdata.message);
|
||||
alert("Error delete language : " + errdata.message);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1052,15 +1082,8 @@ $(document).ready(function () {
|
||||
language: cells.eq(2).text()
|
||||
}
|
||||
if (confirm(`Are you sure to edit language [${ll.index}] Tag=${ll.tag} Language=${ll.language}?`)) {
|
||||
let $modal = $('#languagemodal');
|
||||
let $cbInd = $modal.find('#langId');
|
||||
let $cbLocal = $modal.find('#langLocal');
|
||||
let $cbEn = $modal.find('#langEn');
|
||||
let $cbArb = $modal.find('#langArb');
|
||||
let $cbJap = $modal.find('#langJap');
|
||||
let $cbChi = $modal.find('#langChi');
|
||||
let $langtag = $modal.find('#languagelinktag');
|
||||
let $langid = $modal.find('#languagelinkindex');
|
||||
|
||||
clearLanguageModal();
|
||||
$langid.val(ll.index);
|
||||
$langtag.val(ll.tag);
|
||||
let langs = ll.language.toUpperCase().split(';');
|
||||
@@ -1099,10 +1122,10 @@ $(document).ready(function () {
|
||||
ll.tag = tag;
|
||||
ll.language = langString;
|
||||
fetchAPI(APIURL + "UpdateByIndex/" + ll.index, "PATCH", {}, ll, (okdata) => {
|
||||
alert("Success edit language" + okdata.message);
|
||||
reloadLanguageBank(APIURL);
|
||||
alert("Success edit language : " + okdata.message);
|
||||
}, (errdata) => {
|
||||
alert("Error edit language: " + errdata.message);
|
||||
alert("Error edit language : " + errdata.message);
|
||||
});
|
||||
|
||||
$modal.modal('hide');
|
||||
@@ -1117,19 +1140,20 @@ $(document).ready(function () {
|
||||
}
|
||||
});
|
||||
$btnExport.click(() => {
|
||||
DoExport(APIURL, "languagebank.xlsx",{});
|
||||
DoExport(APIURL, "languagebank.xlsx", {});
|
||||
|
||||
});
|
||||
$btnImport.click(() => {
|
||||
DoImport(APIURL, (okdata) => {
|
||||
reloadLanguageBank(APIURL);
|
||||
alert("Success import languagebank : " + okdata.message);
|
||||
}, (errdata) => {
|
||||
alert("Error importing languagebank from XLSX: " + errdata.message);
|
||||
alert("Error importing languagebank from XLSX : " + errdata.message);
|
||||
});
|
||||
|
||||
});
|
||||
} else {
|
||||
console.error("Error loading language content:", xhr.status, xhr.statusText);
|
||||
console.error("Error loading language content : ", xhr.status, xhr.statusText);
|
||||
}
|
||||
});
|
||||
})
|
||||
@@ -1151,21 +1175,156 @@ $(document).ready(function () {
|
||||
$btnRemove.prop('disabled', true);
|
||||
let APIURL = "ScheduleBank/";
|
||||
|
||||
let $schedulemodal = $('#schedulemodal');
|
||||
// text input
|
||||
let $scheduleid = $schedulemodal.find('#scheduleid');
|
||||
// text input
|
||||
let $scheduledescription = $schedulemodal.find('#scheduledescription');
|
||||
// number input 0-23
|
||||
let $schedulehour = $schedulemodal.find('#schedulehour');
|
||||
// number input 0-59
|
||||
let $scheduleminute = $schedulemodal.find('#scheduleminute');
|
||||
// text input
|
||||
let $schedulesoundpath = $schedulemodal.find('#schedulesoundpath');
|
||||
// number input 0-5
|
||||
let $schedulerepeat = $schedulemodal.find('#schedulerepeat');
|
||||
// checkbox
|
||||
let $scheduleenable = $schedulemodal.find('#scheduleenable');
|
||||
// div for list of checkboxes
|
||||
let $schedulezones = $schedulemodal.find('#schedulezones');
|
||||
// radio button for everyday
|
||||
let $scheduleeveryday = $schedulemodal.find('#scheduleeveryday');
|
||||
// radio button for weekdays
|
||||
let $schedulesunday = $schedulemodal.find('#schedulesunday');
|
||||
let $schedulemonday = $schedulemodal.find('#schedulemonday');
|
||||
let $scheduletuesday = $schedulemodal.find('#scheduletuesday');
|
||||
let $schedulewednesday = $schedulemodal.find('#schedulewednesday');
|
||||
let $schedulethursday = $schedulemodal.find('#schedulethursday');
|
||||
let $schedulefriday = $schedulemodal.find('#schedulefriday');
|
||||
let $schedulesaturday = $schedulemodal.find('#schedulesaturday');
|
||||
// radio button for specific date
|
||||
let $schedulespecialdate = $schedulemodal.find('#schedulespecialdate');
|
||||
// date input
|
||||
let $scheduledate = $schedulemodal.find('#scheduledate');
|
||||
|
||||
$schedulespecialdate.on('change', function () {
|
||||
if ($(this).is(':checked')) {
|
||||
$scheduledate.prop('disabled', false);
|
||||
} else {
|
||||
$scheduledate.prop('disabled', true);
|
||||
}
|
||||
});
|
||||
|
||||
function clearScheduleModal() {
|
||||
$scheduleid.prop('disabled', true).val('');
|
||||
$scheduledescription.val('');
|
||||
$schedulehour.val('0');
|
||||
$scheduleminute.val('0');
|
||||
$schedulesoundpath.val('');
|
||||
$schedulerepeat.val('0');
|
||||
$scheduleenable.prop('checked', true);
|
||||
$scheduleeveryday.prop('checked', false);
|
||||
$schedulesunday.prop('checked', false);
|
||||
$schedulemonday.prop('checked', false);
|
||||
$scheduletuesday.prop('checked', false);
|
||||
$schedulewednesday.prop('checked', false);
|
||||
$schedulethursday.prop('checked', false);
|
||||
$schedulefriday.prop('checked', false);
|
||||
$schedulesaturday.prop('checked', false);
|
||||
$schedulespecialdate.prop('checked', false);
|
||||
$scheduledate.prop('disabled', true).val('');
|
||||
|
||||
|
||||
}
|
||||
|
||||
let $findschedule = $('#findschedule');
|
||||
$findschedule.on('input', function () {
|
||||
let searchTerm = $findschedule.val().toLowerCase();
|
||||
if (searchTerm.length > 0) {
|
||||
selectedtimerow = null;
|
||||
let filtered = schedulebankdata.filter(item => item.description.toLowerCase().includes(searchTerm) || item.soundpath.toLowerCase().includes(searchTerm) || item.broadcastZones.toLowerCase().includes(searchTerm));
|
||||
fill_schedulebanktablebody(filtered);
|
||||
} else {
|
||||
selectedtimerow = null;
|
||||
fill_schedulebanktablebody(schedulebankdata);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
reloadTimerBank(APIURL);
|
||||
$btnClear.click(() => {
|
||||
DoClear(APIURL, "Timerbank", (okdata) => {
|
||||
alert("Success clear schedulebank" + okdata.message);
|
||||
schedulebankdata = []
|
||||
selectedschedulerow = null;
|
||||
fill_schedulebanktablebody(schedulebankdata);
|
||||
reloadTimerBank(APIURL);
|
||||
alert("Success clear schedulebank : " + okdata.message);
|
||||
}, (errdata) => {
|
||||
alert("Error clear schedulebank: " + errdata.message);
|
||||
alert("Error clear schedulebank : " + errdata.message);
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
$btnAdd.click(() => {
|
||||
//TODO form add timer
|
||||
$schedulemodal.modal('show');
|
||||
clearScheduleModal();
|
||||
|
||||
$schedulemodal.off('click.scheduleclose').on('click.scheduleclose', '#scheduleclose', function () {
|
||||
$schedulemodal.modal('hide');
|
||||
});
|
||||
$schedulemodal.off('click.schedulesave').on('click.schedulesave', '#schedulesave', function () {
|
||||
// Gather form values
|
||||
const Description = $scheduledescription.val();
|
||||
const Soundpath = $schedulesoundpath.val();
|
||||
const Repeat = parseInt($schedulerepeat.val(), 10);
|
||||
const Enable = $scheduleenable.is(':checked');
|
||||
// Collect selected days
|
||||
let Day = "";
|
||||
if ($scheduleeveryday.is(':checked')) {
|
||||
Day = "Everyday";
|
||||
} else if ($schedulespecialdate.is(':checked')) {
|
||||
Day = $scheduledate.val();
|
||||
} else {
|
||||
|
||||
if ($schedulesunday.is(':checked')) Day = "Sunday";
|
||||
if ($schedulemonday.is(':checked')) Day = "Monday";
|
||||
if ($scheduletuesday.is(':checked')) Day = "Tuesday";
|
||||
if ($schedulewednesday.is(':checked')) Day = "Wednesday";
|
||||
if ($schedulethursday.is(':checked')) Day = "Thursday";
|
||||
if ($schedulefriday.is(':checked')) Day = "Friday";
|
||||
if ($schedulesaturday.is(':checked')) Day = "Saturday";
|
||||
}
|
||||
// Broadcast zones (assuming comma-separated string)
|
||||
const BroadcastZones = $schedulezones.val();
|
||||
|
||||
// Validate required fields
|
||||
if (!Description || !Soundpath || Day === "") {
|
||||
alert("Description, sound path, and day are required.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Format time as HH:mm
|
||||
const hour = parseInt($schedulehour.val(), 10);
|
||||
const minute = parseInt($scheduleminute.val(), 10);
|
||||
const Time = `${hour.toString().padStart(2, '0')}:${minute.toString().padStart(2, '0')}`;
|
||||
|
||||
// Prepare object
|
||||
const scheduleObj = {
|
||||
Description,
|
||||
Day,
|
||||
Time,
|
||||
Soundpath,
|
||||
Repeat,
|
||||
Enable,
|
||||
BroadcastZones
|
||||
};
|
||||
|
||||
fetchAPI(APIURL + "Add", "POST", {}, scheduleObj, (okdata) => {
|
||||
alert("Success add schedule: " + okdata.message);
|
||||
reloadTimerBank(APIURL);
|
||||
}, (errdata) => {
|
||||
alert("Error add schedule: " + errdata.message);
|
||||
});
|
||||
|
||||
$schedulemodal.modal('hide');
|
||||
});
|
||||
});
|
||||
$btnRemove.click(() => {
|
||||
if (selectedtimerow) {
|
||||
@@ -1184,12 +1343,10 @@ $(document).ready(function () {
|
||||
}
|
||||
if (confirm(`Are you sure to delete schedule [${sr.index}] Description=${sr.description}?`)) {
|
||||
fetchAPI(APIURL + "DeleteByIndex/" + sr.index, "DELETE", {}, null, (okdata) => {
|
||||
alert("Success delete schedule" + okdata.message);
|
||||
schedulebankdata = schedulebankdata.filter(item => item.index !== sr.index);
|
||||
selectedtimerow = null;
|
||||
fill_schedulebanktablebody(schedulebankdata);
|
||||
reloadTimerBank(APIURL);
|
||||
alert("Success delete schedule : " + okdata.message);
|
||||
}, (errdata) => {
|
||||
alert("Error delete schedule: " + errdata.message);
|
||||
alert("Error delete schedule : " + errdata.message);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1210,22 +1367,124 @@ $(document).ready(function () {
|
||||
language: cells.eq(8).text()
|
||||
}
|
||||
if (confirm(`Are you sure to edit schedule [${sr.index}] Description=${sr.description}?`)) {
|
||||
//TODO send edit command
|
||||
$schedulemodal.modal('show');
|
||||
// fill the form with existing data
|
||||
$scheduleid.val(sr.index);
|
||||
$scheduledescription.val(sr.description);
|
||||
let [hour, minute] = sr.time.split(':').map(num => parseInt(num, 10));
|
||||
$schedulehour.val(hour.toString());
|
||||
$scheduleminute.val(minute.toString());
|
||||
$schedulesoundpath.val(sr.soundpath);
|
||||
$schedulerepeat.val(sr.repeat.toString());
|
||||
$scheduleenable.prop('checked', sr.enable.toLowerCase() === 'true');
|
||||
switch (sr.day) {
|
||||
case 'Everyday':
|
||||
$scheduleeveryday.click();
|
||||
break;
|
||||
case 'Sunday':
|
||||
$schedulesunday.click();
|
||||
break;
|
||||
case 'Monday':
|
||||
$schedulemonday.click();
|
||||
break;
|
||||
case 'Tuesday':
|
||||
$scheduletuesday.click();
|
||||
break;
|
||||
case 'Wednesday':
|
||||
$schedulewednesday.click();
|
||||
break;
|
||||
case 'Thursday':
|
||||
$schedulethursday.click();
|
||||
break;
|
||||
case 'Friday':
|
||||
$schedulefriday.click();
|
||||
break;
|
||||
case 'Saturday':
|
||||
$schedulesaturday.click();
|
||||
break;
|
||||
default:
|
||||
// check if the day is in format dd/mm/yyyy
|
||||
// and set the special date radio button and date input
|
||||
if (/^\d{2}\/\d{2}\/\d{4}$/.test(sr.day)) {
|
||||
$schedulespecialdate.click();
|
||||
$scheduledate.val(sr.day);
|
||||
}
|
||||
}
|
||||
|
||||
$schedulemodal.off('click.scheduleclose').on('click.scheduleclose', '#scheduleclose', function () {
|
||||
$schedulemodal.modal('hide');
|
||||
});
|
||||
$schedulemodal.off('click.schedulesave').on('click.schedulesave', '#schedulesave', function () {
|
||||
// Gather form values
|
||||
const Description = $scheduledescription.val();
|
||||
const Soundpath = $schedulesoundpath.val();
|
||||
const Repeat = parseInt($schedulerepeat.val(), 10);
|
||||
const Enable = $scheduleenable.is(':checked');
|
||||
// Collect selected days
|
||||
let Day = "";
|
||||
if ($scheduleeveryday.is(':checked')) {
|
||||
Day = "Everyday";
|
||||
} else if ($schedulespecialdate.is(':checked')) {
|
||||
Day = $scheduledate.val();
|
||||
} else {
|
||||
if ($schedulesunday.is(':checked')) Day = "Sunday";
|
||||
if ($schedulemonday.is(':checked')) Day = "Monday";
|
||||
if ($scheduletuesday.is(':checked')) Day = "Tuesday";
|
||||
if ($schedulewednesday.is(':checked')) Day = "Wednesday";
|
||||
if ($schedulethursday.is(':checked')) Day = "Thursday";
|
||||
if ($schedulefriday.is(':checked')) Day = "Friday";
|
||||
if ($schedulesaturday.is(':checked')) Day = "Saturday";
|
||||
}
|
||||
// Broadcast zones (assuming comma-separated string)
|
||||
const BroadcastZones = $schedulezones.val();
|
||||
|
||||
// Validate required fields
|
||||
if (!Description || !Soundpath || Day === "") {
|
||||
alert("Description, sound path, and day are required.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Format time as HH:mm
|
||||
const hour = parseInt($schedulehour.val(), 10);
|
||||
const minute = parseInt($scheduleminute.val(), 10);
|
||||
const Time = `${hour.toString().padStart(2, '0')}:${minute.toString().padStart(2, '0')}`;
|
||||
|
||||
// Prepare object
|
||||
const scheduleObj = {
|
||||
Description,
|
||||
Day,
|
||||
Time,
|
||||
Soundpath,
|
||||
Repeat,
|
||||
Enable,
|
||||
BroadcastZones
|
||||
};
|
||||
|
||||
fetchAPI(APIURL + "UpdateByIndex/" + sr.index, "PATCH", {}, scheduleObj, (okdata) => {
|
||||
alert("Success edit schedule: " + okdata.message);
|
||||
reloadTimerBank(APIURL);
|
||||
}, (errdata) => {
|
||||
alert("Error edit schedule: " + errdata.message);
|
||||
});
|
||||
|
||||
$schedulemodal.modal('hide');
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
$btnExport.click(() => {
|
||||
DoExport(APIURL, "schedulebank.xlsx",{});
|
||||
DoExport(APIURL, "schedulebank.xlsx", {});
|
||||
});
|
||||
$btnImport.click(() => {
|
||||
DoImport(APIURL, (okdata) => {
|
||||
reloadTimerBank(APIURL);
|
||||
alert("Success import schedulebank from XLSX : " + okdata.message);
|
||||
}, (errdata) => {
|
||||
alert("Error importing schedulebank from XLSX: " + errdata.message);
|
||||
alert("Error importing schedulebank from XLSX : " + errdata.message);
|
||||
});
|
||||
});
|
||||
} else {
|
||||
console.error("Error loading timer content:", xhr.status, xhr.statusText);
|
||||
console.error("Error loading timer content : ", xhr.status, xhr.statusText);
|
||||
}
|
||||
});
|
||||
})
|
||||
@@ -1267,7 +1526,7 @@ $(document).ready(function () {
|
||||
reloadLogs(APIURL, selectedlogdate, logfilter);
|
||||
});
|
||||
$btnExport.off('click').on('click', function () {
|
||||
DoExport(APIURL, "log.xlsx",{date:selectedlogdate,filter:logfilter});
|
||||
DoExport(APIURL, "log.xlsx", { date: selectedlogdate, filter: logfilter });
|
||||
});
|
||||
|
||||
} else {
|
||||
|
||||
@@ -16,6 +16,13 @@
|
||||
<h2 style="text-align: center;">Language Link</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-7 col-lg-7 col-xl-7"></div>
|
||||
<div class="col-2 col-sm-2 col-md-2 col-lg-2 col-xl-2 search">
|
||||
<p class="text-add">Search</p>
|
||||
</div>
|
||||
<div class="col-10 col-sm-10 col-md-3 col-lg-3 col-xl-3"><input class="w-100 form-control" type="text" id="findlanguage" placeholder="Search keyword" name="findsoundbank"></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-3 col-sm-3 col-md-3 col-lg-2 col-xl-2"><button class="btn w-100 pad-button btn-round-basic color-add" id="btnClear" type="button">Clear</button></div>
|
||||
<div class="col-3 col-sm-3 col-md-3 col-lg-2 col-xl-2"><button class="btn w-100 pad-button btn-round-basic color-add" id="btnAdd" type="button">Add</button></div>
|
||||
|
||||
@@ -16,6 +16,13 @@
|
||||
<h2 style="text-align: center;">Message Bank</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-7 col-lg-7 col-xl-7"></div>
|
||||
<div class="col-2 col-sm-2 col-md-2 col-lg-2 col-xl-2 search">
|
||||
<p class="text-add">Search</p>
|
||||
</div>
|
||||
<div class="col-10 col-sm-10 col-md-3 col-lg-3 col-xl-3"><input class="w-100 form-control" type="text" id="findmessage" placeholder="Search keyword" name="findsoundbank"></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-3 col-sm-3 col-md-3 col-lg-2 col-xl-2"><button class="btn w-100 pad-button btn-round-basic color-add" id="btnClear" type="button">Clear</button></div>
|
||||
<div class="col-3 col-sm-3 col-md-3 col-lg-2 col-xl-2"><button class="btn w-100 pad-button btn-round-basic color-add" id="btnAdd" type="button">Add</button></div>
|
||||
|
||||
@@ -16,6 +16,13 @@
|
||||
<h2 style="text-align: center;">Schedule Bank</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-7 col-lg-7 col-xl-7"></div>
|
||||
<div class="col-2 col-sm-2 col-md-2 col-lg-2 col-xl-2 search">
|
||||
<p class="text-add">Search</p>
|
||||
</div>
|
||||
<div class="col-10 col-sm-10 col-md-3 col-lg-3 col-xl-3"><input class="w-100 form-control" type="text" id="findschedule" placeholder="Search keyword" name="findsoundbank"></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-3 col-sm-3 col-md-3 col-lg-2 col-xl-2"><button class="btn w-100 pad-button btn-round-basic color-add" id="btnClear" type="button">Clear</button></div>
|
||||
<div class="col-3 col-sm-3 col-md-3 col-lg-2 col-xl-2"><button class="btn w-100 pad-button btn-round-basic color-add" id="btnAdd" type="button">Add</button></div>
|
||||
@@ -59,58 +66,110 @@
|
||||
<div class="col-4 col-sm-3">
|
||||
<p class="text-add">Index</p>
|
||||
</div>
|
||||
<div class="col"><input type="text" class="input-add form-control"></div>
|
||||
<div class="col"><input type="text" id="scheduleid" class="input-add form-control" disabled=""></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-4 col-sm-3">
|
||||
<p class="text-add">Description</p>
|
||||
</div>
|
||||
<div class="col"><input type="text" class="input-add form-control"></div>
|
||||
<div class="col"><input type="text" id="scheduledescription" class="input-add form-control"></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-4 col-sm-3">
|
||||
<p class="text-add">Day</p>
|
||||
</div>
|
||||
<div class="col"><input type="text" class="input-add form-control"></div>
|
||||
<div class="col">
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<div class="form-check"><input class="form-check-input" type="radio" id="scheduleeveryday" name="dayselection" value="Everyday"><label class="form-check-label" for="formCheck-1">Everyday</label></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<div class="form-check"><input class="form-check-input" type="radio" id="schedulesunday" name="dayselection" value="Sunday"><label class="form-check-label" for="formCheck-8">Sunday</label></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<div class="form-check"><input class="form-check-input" type="radio" id="schedulemonday" name="dayselection" value="Monday"><label class="form-check-label" for="formCheck-7">Monday</label></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<div class="form-check"><input class="form-check-input" type="radio" id="scheduletuesday" name="dayselection" value="Tuesday"><label class="form-check-label" for="formCheck-6">Tuesday</label></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<div class="form-check"><input class="form-check-input" type="radio" id="schedulewednesday" name="dayselection" value="Wednesday"><label class="form-check-label" for="formCheck-5">Wednesday</label></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<div class="form-check"><input class="form-check-input" type="radio" id="schedulethursday" name="dayselection" value="Thursday"><label class="form-check-label" for="formCheck-4">Thursday</label></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<div class="form-check"><input class="form-check-input" type="radio" id="schedulefriday" name="dayselection" value="Friday"><label class="form-check-label" for="formCheck-3">Friday</label></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<div class="form-check"><input class="form-check-input" type="radio" id="schedulesaturday" name="dayselection" value="Saturday"><label class="form-check-label" for="formCheck-2">Saturday</label></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<div class="form-check"><input class="form-check-input" type="radio" id="schedulespecialdate" name="dayselection"><label class="form-check-label" for="formCheck-9">Special Date</label></div>
|
||||
</div>
|
||||
<div class="col"><input id="scheduledate" type="date"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-4 col-sm-3">
|
||||
<p class="text-add">Time</p>
|
||||
</div>
|
||||
<div class="col"><input type="text" class="input-add form-control"></div>
|
||||
<div class="col">
|
||||
<div class="row w-100 h-100">
|
||||
<div class="col-3"><input class="w-100 h-100" type="number" id="schedulehour" value="0" min="0" max="23" step="1"></div>
|
||||
<div class="col-1">
|
||||
<p class="w-100 h-100">(H)</p>
|
||||
</div>
|
||||
<div class="col-3"><input class="w-100 h-100" type="number" id="scheduleminute" value="0" min="0" max="59" step="1"></div>
|
||||
<div class="col-1">
|
||||
<p class="w-100 h-100">(M)</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-4 col-sm-3">
|
||||
<p class="text-add">Sound Path</p>
|
||||
</div>
|
||||
<div class="col"><input type="text" class="input-add form-control"></div>
|
||||
<div class="col"><input type="text" id="schedulesoundpath" class="input-add form-control"></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-4 col-sm-3">
|
||||
<p class="text-add">Repeat</p>
|
||||
</div>
|
||||
<div class="col"><input class="w-25 form-select input-add" type="number" min="1" max="5" step="1" value="1"></div>
|
||||
<div class="col"><input class="w-25 form-select input-add" type="number" id="schedulerepeat" min="0" max="5" step="1" value="0"></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-4 col-sm-3">
|
||||
<p class="text-add">Enable</p>
|
||||
</div>
|
||||
<div class="col"><input type="checkbox" class="form-check-input form-check text-add" checked=""></div>
|
||||
<div class="col"><input type="checkbox" id="scheduleenable" class="form-check-input form-check text-add" checked=""></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-4 col-sm-3">
|
||||
<p class="text-add">Broadcast Zones</p>
|
||||
</div>
|
||||
<div class="col">
|
||||
<ul class="list-group">
|
||||
<li class="list-group-item"><span>List Group Item 1</span></li>
|
||||
<li class="list-group-item"><span>List Group Item 2</span></li>
|
||||
<li class="list-group-item"><span>List Group Item 3</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col border p-2" id="schedulezones"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer"><button class="btn btn-round-basic color-edit class25" type="button" data-bs-dismiss="modal">Close</button><button class="btn btn-round-basic class25 color-add" type="button">Save</button></div>
|
||||
<div class="modal-footer"><button class="btn btn-round-basic color-edit class25" id="scheduleclose" type="button" data-bs-dismiss="modal">Close</button><button class="btn btn-round-basic class25 color-add" id="schedulesave" type="button">Save</button></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user