commit 09/02/2026
This commit is contained in:
@@ -78,6 +78,7 @@ $(document).ready(function () {
|
|||||||
$('#languagebanktablebody').empty();
|
$('#languagebanktablebody').empty();
|
||||||
window.selectedlanguagerow = null;
|
window.selectedlanguagerow = null;
|
||||||
let $btnClear = $('#btnClear');
|
let $btnClear = $('#btnClear');
|
||||||
|
let $btndefaultinit = $('#btnDefaultInit');
|
||||||
let $btnAdd = $('#btnAdd');
|
let $btnAdd = $('#btnAdd');
|
||||||
let $btnRemove = $('#btnRemove');
|
let $btnRemove = $('#btnRemove');
|
||||||
let $btnEdit = $('#btnEdit');
|
let $btnEdit = $('#btnEdit');
|
||||||
@@ -86,7 +87,6 @@ $(document).ready(function () {
|
|||||||
$btnRemove.prop('disabled', true);
|
$btnRemove.prop('disabled', true);
|
||||||
$btnEdit.prop('disabled', true);
|
$btnEdit.prop('disabled', true);
|
||||||
let APIURL = "LanguageLink/";
|
let APIURL = "LanguageLink/";
|
||||||
let $findlanguage = $('#findlanguage');
|
|
||||||
let $modal = $('#languagemodal');
|
let $modal = $('#languagemodal');
|
||||||
let $langid = $modal.find('#languagelinkindex');
|
let $langid = $modal.find('#languagelinkindex');
|
||||||
let $langtag = $modal.find('#languagelinktag');
|
let $langtag = $modal.find('#languagelinktag');
|
||||||
@@ -121,18 +121,6 @@ $(document).ready(function () {
|
|||||||
$cbChi.prop('checked', false);
|
$cbChi.prop('checked', false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// $findlanguage.on('input', function () {
|
|
||||||
// let searchTerm = $findlanguage.val().toLowerCase();
|
|
||||||
// if (searchTerm.length > 0) {
|
|
||||||
// window.selectedlanguagerow = null;
|
|
||||||
// let filtered = window.languagebankdata.filter(item => item.tag.toLowerCase().includes(searchTerm) || item.language.toLowerCase().includes(searchTerm));
|
|
||||||
// fill_languagebanktablebody(filtered);
|
|
||||||
// } else {
|
|
||||||
// window.selectedlanguagerow = null;
|
|
||||||
// fill_languagebanktablebody(window.languagebankdata);
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
|
|
||||||
reloadLanguageBank(APIURL);
|
reloadLanguageBank(APIURL);
|
||||||
$btnClear.click(() => {
|
$btnClear.click(() => {
|
||||||
DoClear(APIURL, "LanguageLink", (okdata) => {
|
DoClear(APIURL, "LanguageLink", (okdata) => {
|
||||||
@@ -141,8 +129,18 @@ $(document).ready(function () {
|
|||||||
}, (errdata) => {
|
}, (errdata) => {
|
||||||
alert("Error clear languageLink : " + errdata.message);
|
alert("Error clear languageLink : " + errdata.message);
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
$btndefaultinit.click(() => {
|
||||||
|
if (confirm("Default Init will clear existing data and create default language link data. Cotinue ?")){
|
||||||
|
fetchAPI(APIURL + "DefaultInit", "POST", {}, null, (okdata) => {
|
||||||
|
reloadLanguageBank(APIURL);
|
||||||
|
alert("Success default init languageLink : " + okdata.message);
|
||||||
|
}, (errdata) => {
|
||||||
|
alert("Error default init languageLink : " + errdata.message);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
$btnAdd.click(() => {
|
$btnAdd.click(() => {
|
||||||
// show modal with id 'languagemodal'
|
// show modal with id 'languagemodal'
|
||||||
$modal.modal('show');
|
$modal.modal('show');
|
||||||
|
|||||||
@@ -34,7 +34,6 @@ function fill_schedulebanktablebody(vv) {
|
|||||||
dtScheduleBank.rows.add(vv);
|
dtScheduleBank.rows.add(vv);
|
||||||
dtScheduleBank.draw();
|
dtScheduleBank.draw();
|
||||||
|
|
||||||
|
|
||||||
$('#schedulebanktable tbody').off('click').on('click', 'tr', function () {
|
$('#schedulebanktable tbody').off('click').on('click', 'tr', function () {
|
||||||
// if no data
|
// if no data
|
||||||
if (!dtScheduleBank) return;
|
if (!dtScheduleBank) return;
|
||||||
@@ -118,6 +117,8 @@ function reloadTimerBank(APIURL = "ScheduleBank/") {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dayViewMode = 'all'; // all, everyday, monday, tuesday, wednesday, thursday, friday, saturday, sunday
|
||||||
|
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
console.log("schedulebank.js loaded successfully");
|
console.log("schedulebank.js loaded successfully");
|
||||||
$('#schedulebanktablebody').empty();
|
$('#schedulebanktablebody').empty();
|
||||||
@@ -134,6 +135,7 @@ $(document).ready(function () {
|
|||||||
|
|
||||||
if (dtScheduleBank === null) {
|
if (dtScheduleBank === null) {
|
||||||
dtScheduleBank = new DataTable('#schedulebanktable', {
|
dtScheduleBank = new DataTable('#schedulebanktable', {
|
||||||
|
dom: 'Bfrtip',
|
||||||
data: [],
|
data: [],
|
||||||
pageLength: 25,
|
pageLength: 25,
|
||||||
columns: [
|
columns: [
|
||||||
@@ -141,15 +143,60 @@ $(document).ready(function () {
|
|||||||
{ title: "Description", data: "description" },
|
{ title: "Description", data: "description" },
|
||||||
{ title: "Day", data: "day" },
|
{ title: "Day", data: "day" },
|
||||||
{ title: "Time", data: "time" },
|
{ title: "Time", data: "time" },
|
||||||
{ title: "Sound Path", data: "soundpath" },
|
{ title: "Message", data: "soundpath" },
|
||||||
{ title: "Repeat", data: "repeat" },
|
{ title: "Repeat", data: "repeat" },
|
||||||
{ title: "Enable", data: "enable" },
|
{ title: "Enable", data: "enable" },
|
||||||
{ title: "Broadcast Zones", data: "broadcastZones" },
|
{ title: "Broadcast Zones", data: "broadcastZones" },
|
||||||
{ title: "Language", data: "language" }
|
{ title: "Language", data: "language" }
|
||||||
]
|
],
|
||||||
|
buttons: ['print', 'pdf', {
|
||||||
|
extend: 'collection',
|
||||||
|
text: 'View',
|
||||||
|
className: 'btn btn-outline-secondary',
|
||||||
|
buttons: [
|
||||||
|
{text: 'All', className: 'btn btn-outline-primary', action() { dayViewMode = 'all'; dtScheduleBank.draw(); } },
|
||||||
|
{ text: 'Everyday', className: 'btn btn-outline-primary', action() { dayViewMode = 'everyday'; dtScheduleBank.draw(); } },
|
||||||
|
{ text: 'Monday', className: 'btn btn-outline-primary', action() { dayViewMode = 'monday'; dtScheduleBank.draw(); } },
|
||||||
|
{ text: 'Tuesday', className: 'btn btn-outline-primary', action() { dayViewMode = 'tuesday'; dtScheduleBank.draw(); } },
|
||||||
|
{ text: 'Wednesday', className: 'btn btn-outline-primary', action() { dayViewMode = 'wednesday'; dtScheduleBank.draw(); } },
|
||||||
|
{ text: 'Thursday', className: 'btn btn-outline-primary', action() { dayViewMode = 'thursday'; dtScheduleBank.draw(); } },
|
||||||
|
{ text: 'Friday', className: 'btn btn-outline-primary', action() { dayViewMode = 'friday'; dtScheduleBank.draw(); } },
|
||||||
|
{ text: 'Saturday', className: 'btn btn-outline-primary', action() { dayViewMode = 'saturday'; dtScheduleBank.draw(); } },
|
||||||
|
{ text: 'Sunday', className: 'btn btn-outline-primary', action() { dayViewMode = 'sunday'; dtScheduleBank.draw(); } },
|
||||||
|
{text: 'Special Date', className: 'btn btn-outline-primary', action() { dayViewMode = 'specialdate'; dtScheduleBank.draw(); } }
|
||||||
|
]
|
||||||
|
}]
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$.fn.dataTable.ext.search.push(function (settings, data, dataIndex, rowData) {
|
||||||
|
if (settings.nTable.id !== 'schedulebanktable') return true;
|
||||||
|
switch (dayViewMode) {
|
||||||
|
case 'everyday':
|
||||||
|
return rowData.day.toLowerCase() === 'everyday';
|
||||||
|
case 'monday':
|
||||||
|
return rowData.day.toLowerCase() === 'monday';
|
||||||
|
case 'tuesday':
|
||||||
|
return rowData.day.toLowerCase() === 'tuesday';
|
||||||
|
case 'wednesday':
|
||||||
|
return rowData.day.toLowerCase() === 'wednesday';
|
||||||
|
case 'thursday':
|
||||||
|
return rowData.day.toLowerCase() === 'thursday';
|
||||||
|
case 'friday':
|
||||||
|
return rowData.day.toLowerCase() === 'friday';
|
||||||
|
case 'saturday':
|
||||||
|
return rowData.day.toLowerCase() === 'saturday';
|
||||||
|
case 'sunday':
|
||||||
|
return rowData.day.toLowerCase() === 'sunday';
|
||||||
|
case 'specialdate':
|
||||||
|
// match dd/mm/yyyy format
|
||||||
|
return /^\d{2}\/\d{2}\/\d{4}$/.test(rowData.day);
|
||||||
|
default:
|
||||||
|
// 'all' include in here
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
let $schedulemodal = $('#schedulemodal');
|
let $schedulemodal = $('#schedulemodal');
|
||||||
// text input
|
// text input
|
||||||
@@ -244,38 +291,16 @@ $(document).ready(function () {
|
|||||||
if ($(this).is(':checked')) {
|
if ($(this).is(':checked')) {
|
||||||
$weeklyselect.prop('disabled', false);
|
$weeklyselect.prop('disabled', false);
|
||||||
$scheduledate.prop('disabled', true);
|
$scheduledate.prop('disabled', true);
|
||||||
} else {
|
}
|
||||||
$weeklyselect.prop('disabled', true);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
$schedulespecialdate.off('change').on('change', function () {
|
$schedulespecialdate.off('change').on('change', function () {
|
||||||
if ($(this).is(':checked')) {
|
if ($(this).is(':checked')) {
|
||||||
$weeklyselect.prop('disabled', true);
|
$weeklyselect.prop('disabled', true);
|
||||||
$scheduledate.prop('disabled', false);
|
$scheduledate.prop('disabled', false);
|
||||||
} else {
|
}
|
||||||
$scheduledate.prop('disabled', true);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let $findschedule = $('#findschedule');
|
|
||||||
// $findschedule.off('input').on('input', function () {
|
|
||||||
// let searchTerm = $findschedule.val().toLowerCase();
|
|
||||||
// if (searchTerm.length > 0) {
|
|
||||||
// window.selectedschedulerow = null;
|
|
||||||
// let filtered = window.schedulebankdata.filter(item =>
|
|
||||||
// item.description.toLowerCase().includes(searchTerm)
|
|
||||||
// || item.soundpath.toLowerCase().includes(searchTerm)
|
|
||||||
// || item.broadcastZones.toLowerCase().includes(searchTerm));
|
|
||||||
// fill_schedulebanktablebody(filtered);
|
|
||||||
// } else {
|
|
||||||
// window.selectedschedulerow = null;
|
|
||||||
// fill_schedulebanktablebody(window.schedulebankdata);
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
|
|
||||||
|
|
||||||
reloadTimerBank(APIURL);
|
reloadTimerBank(APIURL);
|
||||||
reloadBroadcastZones();
|
reloadBroadcastZones();
|
||||||
getLanguages();
|
getLanguages();
|
||||||
@@ -334,10 +359,11 @@ $(document).ready(function () {
|
|||||||
BroadcastZones: broadcastZones,
|
BroadcastZones: broadcastZones,
|
||||||
Language: Language
|
Language: Language
|
||||||
};
|
};
|
||||||
|
console.log("Adding schedule: ", scheduleObj);
|
||||||
|
|
||||||
fetchAPI(APIURL + "Add", "POST", {}, scheduleObj, (okdata) => {
|
fetchAPI(APIURL + "Add", "POST", {}, scheduleObj, (okdata) => {
|
||||||
alert("Success add schedule: " + okdata.message);
|
|
||||||
reloadTimerBank(APIURL);
|
reloadTimerBank(APIURL);
|
||||||
|
alert("Success add schedule: " + okdata.message);
|
||||||
}, (errdata) => {
|
}, (errdata) => {
|
||||||
alert("Error add schedule: " + errdata.message);
|
alert("Error add schedule: " + errdata.message);
|
||||||
});
|
});
|
||||||
@@ -363,6 +389,7 @@ $(document).ready(function () {
|
|||||||
broadcastZones: window.selectedschedulerow.broadcastZones,
|
broadcastZones: window.selectedschedulerow.broadcastZones,
|
||||||
language: window.selectedschedulerow.language
|
language: window.selectedschedulerow.language
|
||||||
}
|
}
|
||||||
|
|
||||||
if (confirm(`Are you sure to delete schedule [${sr.index}] Description=${sr.description}?`)) {
|
if (confirm(`Are you sure to delete schedule [${sr.index}] Description=${sr.description}?`)) {
|
||||||
fetchAPI(APIURL + "DeleteByIndex/" + sr.index, "DELETE", {}, null, (okdata) => {
|
fetchAPI(APIURL + "DeleteByIndex/" + sr.index, "DELETE", {}, null, (okdata) => {
|
||||||
reloadTimerBank(APIURL);
|
reloadTimerBank(APIURL);
|
||||||
@@ -387,6 +414,7 @@ $(document).ready(function () {
|
|||||||
BroadcastZones: window.selectedschedulerow.broadcastZones,
|
BroadcastZones: window.selectedschedulerow.broadcastZones,
|
||||||
Language: window.selectedschedulerow.language
|
Language: window.selectedschedulerow.language
|
||||||
}
|
}
|
||||||
|
console.log("Editing schedule: ", sr);
|
||||||
if (confirm(`Are you sure to edit schedule [${sr.index}] Description=${sr.Description}?`)) {
|
if (confirm(`Are you sure to edit schedule [${sr.index}] Description=${sr.Description}?`)) {
|
||||||
$schedulemodal.modal('show');
|
$schedulemodal.modal('show');
|
||||||
clearScheduleModal();
|
clearScheduleModal();
|
||||||
@@ -399,12 +427,18 @@ $(document).ready(function () {
|
|||||||
$scheduleminute.val(minute.toString());
|
$scheduleminute.val(minute.toString());
|
||||||
$schedulemessage.val(sr.Soundpath).trigger('change');
|
$schedulemessage.val(sr.Soundpath).trigger('change');
|
||||||
$schedulerepeat.val(sr.Repeat);
|
$schedulerepeat.val(sr.Repeat);
|
||||||
$scheduleenable.prop('checked', sr.Enable.toLowerCase() === 'true');
|
$scheduleenable.prop('checked', sr.Enable);
|
||||||
$languageselect.val(sr.Language.split(';')).trigger('change');
|
$languageselect.val(sr.Language.split(';')).trigger('change');
|
||||||
$schedulezones.val(sr.BroadcastZones.split(';')).trigger('change');
|
$schedulezones.val(sr.BroadcastZones.split(';')).trigger('change');
|
||||||
switch (sr.Day) {
|
switch (sr.Day) {
|
||||||
case 'Everyday':
|
case 'Everyday':
|
||||||
$scheduleeveryday.click();
|
// make the everyday radio button checked
|
||||||
|
$scheduleeveryday.prop('checked', true);
|
||||||
|
|
||||||
|
$weeklyselect.val(null).trigger('change');
|
||||||
|
$weeklyselect.prop('disabled', true);
|
||||||
|
|
||||||
|
$scheduledate.prop('disabled', true);
|
||||||
break;
|
break;
|
||||||
case 'Sunday':
|
case 'Sunday':
|
||||||
case 'Monday':
|
case 'Monday':
|
||||||
@@ -413,15 +447,25 @@ $(document).ready(function () {
|
|||||||
case 'Thursday':
|
case 'Thursday':
|
||||||
case 'Friday':
|
case 'Friday':
|
||||||
case 'Saturday':
|
case 'Saturday':
|
||||||
$scheduleweekly.click();
|
$scheduleweekly.prop('checked', true);
|
||||||
|
|
||||||
$weeklyselect.val(sr.Day).trigger('change');
|
$weeklyselect.val(sr.Day).trigger('change');
|
||||||
|
$weeklyselect.prop('disabled', false);
|
||||||
|
|
||||||
|
$scheduledate.prop('disabled', true);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
console.log("Assuming special date for Day: ", sr.Day);
|
||||||
// check if the day is in format dd/mm/yyyy
|
// check if the day is in format dd/mm/yyyy
|
||||||
// and set the special date radio button and date input
|
// and set the special date radio button and date input
|
||||||
if (/^\d{2}\/\d{2}\/\d{4}$/.test(sr.Day)) {
|
if (/^\d{2}\/\d{2}\/\d{4}$/.test(sr.Day)) {
|
||||||
$schedulespecialdate.click();
|
$schedulespecialdate.prop('checked', true);
|
||||||
|
|
||||||
$scheduledate.val(Convert_string_to_input_date(sr.Day));
|
$scheduledate.val(Convert_string_to_input_date(sr.Day));
|
||||||
|
$scheduledate.prop('disabled', false);
|
||||||
|
|
||||||
|
$weeklyselect.val(null).trigger('change');
|
||||||
|
$weeklyselect.prop('disabled', true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -37,6 +37,11 @@ dtSoundbank = null;
|
|||||||
*/
|
*/
|
||||||
window.select2data = [];
|
window.select2data = [];
|
||||||
|
|
||||||
|
$btnRemove = null;
|
||||||
|
$btnEdit = null;
|
||||||
|
$btnExport = null;
|
||||||
|
$btnfilecheck = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reload sound bank from server
|
* Reload sound bank from server
|
||||||
* @param {String} APIURL API URL endpoint, default "SoundBank/"
|
* @param {String} APIURL API URL endpoint, default "SoundBank/"
|
||||||
@@ -62,7 +67,18 @@ function reloadSoundBank(APIURL = "SoundBank/") {
|
|||||||
*/
|
*/
|
||||||
function fill_soundbanktablebody(vv) {
|
function fill_soundbanktablebody(vv) {
|
||||||
dtSoundbank.clear();
|
dtSoundbank.clear();
|
||||||
if (!Array.isArray(vv) || vv.length === 0) return;
|
if (!Array.isArray(vv) || vv.length === 0) {
|
||||||
|
// kalau kosong, tidak bisa remove, edit, export dan filecheck
|
||||||
|
$btnRemove.prop('disabled', true);
|
||||||
|
$btnEdit.prop('disabled', true);
|
||||||
|
$btnExport.prop('disabled', true);
|
||||||
|
$btnfilecheck.prop('disabled', true);
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
// kalau ada isi, bisa export dan filecheck, tapi remove dan edit tetap tergantung selection
|
||||||
|
$btnExport.prop('disabled', false);
|
||||||
|
$btnfilecheck.prop('disabled', false);
|
||||||
|
}
|
||||||
dtSoundbank.rows.add(vv);
|
dtSoundbank.rows.add(vv);
|
||||||
dtSoundbank.draw();
|
dtSoundbank.draw();
|
||||||
|
|
||||||
@@ -77,8 +93,8 @@ function fill_soundbanktablebody(vv) {
|
|||||||
if ($(this).hasClass('row-selected')) {
|
if ($(this).hasClass('row-selected')) {
|
||||||
$(this).removeClass('row-selected').find('td').css('background-color', '');
|
$(this).removeClass('row-selected').find('td').css('background-color', '');
|
||||||
window.selectedsoundrow = null;
|
window.selectedsoundrow = null;
|
||||||
$('#btnRemove').prop('disabled', true);
|
$btnRemove.prop('disabled', true);
|
||||||
$('#btnEdit').prop('disabled', true);
|
$btnEdit.prop('disabled', true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,8 +103,8 @@ function fill_soundbanktablebody(vv) {
|
|||||||
|
|
||||||
$(this).addClass('row-selected').find('td').css('background-color', '#ffeeba');
|
$(this).addClass('row-selected').find('td').css('background-color', '#ffeeba');
|
||||||
window.selectedsoundrow = selected.data();
|
window.selectedsoundrow = selected.data();
|
||||||
$('#btnRemove').prop('disabled', false);
|
$btnRemove.prop('disabled', false);
|
||||||
$('#btnEdit').prop('disabled', false);
|
$btnEdit.prop('disabled', false);
|
||||||
})
|
})
|
||||||
|
|
||||||
$('#tablesize').text("Table Size: " + vv.length);
|
$('#tablesize').text("Table Size: " + vv.length);
|
||||||
@@ -146,7 +162,7 @@ function getFilenameFromPath(path) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fileViewMode = 'all'; // all, valid, invalid
|
||||||
|
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
console.log("soundbank.js loaded successfully");
|
console.log("soundbank.js loaded successfully");
|
||||||
@@ -154,9 +170,9 @@ $(document).ready(function () {
|
|||||||
window.selectedsoundrow = null;
|
window.selectedsoundrow = null;
|
||||||
let $btnClear = $('#btnClear');
|
let $btnClear = $('#btnClear');
|
||||||
let $btnAdd = $('#btnAdd');
|
let $btnAdd = $('#btnAdd');
|
||||||
let $btnRemove = $('#btnRemove');
|
$btnRemove = $('#btnRemove');
|
||||||
let $btnEdit = $('#btnEdit');
|
$btnEdit = $('#btnEdit');
|
||||||
let $btnExport = $('#btnExport');
|
$btnExport = $('#btnExport');
|
||||||
let $btnImport = $('#btnImport');
|
let $btnImport = $('#btnImport');
|
||||||
$btnRemove.prop('disabled', true);
|
$btnRemove.prop('disabled', true);
|
||||||
$btnEdit.prop('disabled', true);
|
$btnEdit.prop('disabled', true);
|
||||||
@@ -171,9 +187,11 @@ $(document).ready(function () {
|
|||||||
let selected_category = null;
|
let selected_category = null;
|
||||||
let selected_language = null;
|
let selected_language = null;
|
||||||
let selected_voicetype = null;
|
let selected_voicetype = null;
|
||||||
|
$btnfilecheck = $('#btnFileCheck');
|
||||||
|
|
||||||
if (dtSoundbank === null) {
|
if (dtSoundbank === null) {
|
||||||
dtSoundbank = new DataTable('#soundbanktable', {
|
dtSoundbank = new DataTable('#soundbanktable', {
|
||||||
|
dom: 'Bfrtip',
|
||||||
data: [],
|
data: [],
|
||||||
pageLength: 25,
|
pageLength: 25,
|
||||||
columns: [
|
columns: [
|
||||||
@@ -184,9 +202,29 @@ $(document).ready(function () {
|
|||||||
{ title: "Language", data: "language" },
|
{ title: "Language", data: "language" },
|
||||||
{ title: "Type", data: "voiceType" },
|
{ title: "Type", data: "voiceType" },
|
||||||
{ title: "Filename", data: "path" }
|
{ title: "Filename", data: "path" }
|
||||||
]
|
],
|
||||||
|
rowCallback: function (row, data) {
|
||||||
|
row.classList.toggle('table-danger', !!data.filemissing);
|
||||||
|
},
|
||||||
|
buttons: ['print', 'pdf', {
|
||||||
|
extend: 'collection',
|
||||||
|
text: 'View',
|
||||||
|
className: 'btn btn-outline-secondary',
|
||||||
|
buttons: [
|
||||||
|
{ text: 'All Files', className: 'btn btn-outline-primary', action() { fileViewMode = 'all'; dtSoundbank.draw(); } },
|
||||||
|
{ text: 'Valid Files', className: 'btn btn-outline-success', action() { fileViewMode = 'valid'; dtSoundbank.draw(); } },
|
||||||
|
{ text: 'Invalid Files', className: 'btn btn-outline-danger', action() { fileViewMode = 'invalid'; dtSoundbank.draw(); } }
|
||||||
|
]
|
||||||
|
}]
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
$.fn.dataTable.ext.search.push(function (settings, data, dataIndex, rowData) {
|
||||||
|
if (settings.nTable.id !== 'soundbanktable') return true;
|
||||||
|
const isInvalid = !!rowData.filemissing;
|
||||||
|
if (fileViewMode === 'invalid') return isInvalid;
|
||||||
|
if (fileViewMode === 'valid') return !isInvalid;
|
||||||
|
return true;
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -219,17 +257,6 @@ $(document).ready(function () {
|
|||||||
}
|
}
|
||||||
|
|
||||||
reloadSoundBank(APIURL);
|
reloadSoundBank(APIURL);
|
||||||
// $('#findsoundbank').on('input', function () {
|
|
||||||
// let searchTerm = $(this).val().trim().toLowerCase();
|
|
||||||
// if (searchTerm.length > 0) {
|
|
||||||
// window.selectedsoundrow = null;
|
|
||||||
// let filtered = window.soundbankdata.filter(item => item.description.toLowerCase().includes(searchTerm) || item.tag.toLowerCase().includes(searchTerm) || item.path.toLowerCase().includes(searchTerm));
|
|
||||||
// fill_soundbanktablebody(filtered);
|
|
||||||
// } else {
|
|
||||||
// window.selectedsoundrow = null;
|
|
||||||
// fill_soundbanktablebody(window.soundbankdata);
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
$btnClear.click(() => {
|
$btnClear.click(() => {
|
||||||
DoClear(APIURL, "Soundbank", (okdata) => {
|
DoClear(APIURL, "Soundbank", (okdata) => {
|
||||||
reloadSoundBank(APIURL);
|
reloadSoundBank(APIURL);
|
||||||
@@ -447,4 +474,37 @@ $(document).ready(function () {
|
|||||||
alert("Error importing soundbank from XLSX : " + errdata.message);
|
alert("Error importing soundbank from XLSX : " + errdata.message);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
$btnfilecheck.click(() => {
|
||||||
|
fetchAPI(APIURL + "FileCheck", "GET", {}, null, (okdata) => {
|
||||||
|
console.log(okdata);
|
||||||
|
let invalidList = Array.isArray(okdata.invalidfile) ? okdata.invalidfile : [];
|
||||||
|
let validList = Array.isArray(okdata.validfile) ? okdata.validfile : [];
|
||||||
|
const invalidSet = new Set(invalidList.map(f => f.path));
|
||||||
|
dtSoundbank.rows().every(function () {
|
||||||
|
const d = this.data();
|
||||||
|
d.filemissing = invalidSet.has(d.path);
|
||||||
|
this.data(d); // update row data
|
||||||
|
});
|
||||||
|
|
||||||
|
dtSoundbank.draw(false);
|
||||||
|
console.log(`File Check completed. ${validList.length} valid files, ${invalidList.length} invalid files.`);
|
||||||
|
if (validList.length === 0) {
|
||||||
|
if (invalidList.length === 0) {
|
||||||
|
alert("No soundbank files found on server.");
|
||||||
|
} else {
|
||||||
|
alert(`File Check completed. All ${invalidList.length} soundbank files are missing on server.`);
|
||||||
|
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (invalidList.length === 0) {
|
||||||
|
alert(`File Check completed. All ${validList.length} soundbank files are present on server.`);
|
||||||
|
} else {
|
||||||
|
alert(`File Check completed. ${validList.length} soundbank files are present, ${invalidList.length} soundbank files are missing on server.`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}, (errdata) => {
|
||||||
|
alert("Error checking soundbank files : " + errdata.message);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
@@ -34,11 +34,12 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<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="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="btnDefaultInit" type="button">Initialize Default</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>
|
<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>
|
||||||
<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-remove" id="btnRemove" type="button">Remove</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-remove" id="btnRemove" type="button">Remove</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-edit" id="btnEdit" type="button">Edit</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-edit" id="btnEdit" type="button">Edit</button></div>
|
||||||
<div class="col-6 col-sm-6 col-md-6 col-lg-2 col-xl-2"><button class="btn w-100 pad-button btn-round-basic color-import" id="btnExport" type="button">Export</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-import" id="btnExport" type="button">Export</button></div>
|
||||||
<div class="col-6 col-sm-6 col-md-6 col-lg-2 col-xl-2"><button class="btn w-100 pad-button btn-round-basic color-import" id="btnImport" type="button">Import</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-import" id="btnImport" type="button">Import</button></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
|
|||||||
@@ -42,8 +42,9 @@
|
|||||||
<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>
|
<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>
|
||||||
<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-remove" id="btnRemove" type="button">Remove</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-remove" id="btnRemove" type="button">Remove</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-edit" id="btnEdit" type="button">Edit</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-edit" id="btnEdit" type="button">Edit</button></div>
|
||||||
<div class="col-6 col-sm-6 col-md-6 col-lg-2 col-xl-2"><button class="btn w-100 pad-button btn-round-basic color-import" id="btnExport" type="button">Export</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-import" id="btnExport" type="button">Export</button></div>
|
||||||
<div class="col-6 col-sm-6 col-md-6 col-lg-2 col-xl-2"><button class="btn w-100 pad-button btn-round-basic color-import" id="btnImport" type="button">Import</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-import" id="btnImport" type="button">Import</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-import" id="btnFileCheck" type="button">File Check</button></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="table-responsive">
|
<div class="table-responsive">
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ lateinit var audioPlayer: AudioPlayer
|
|||||||
val StreamerOutputs: MutableMap<String, BarixConnection> = HashMap()
|
val StreamerOutputs: MutableMap<String, BarixConnection> = HashMap()
|
||||||
lateinit var udpreceiver: UDPReceiver
|
lateinit var udpreceiver: UDPReceiver
|
||||||
lateinit var tcpreceiver: TCPReceiver
|
lateinit var tcpreceiver: TCPReceiver
|
||||||
const val version = "0.0.28 (04/02/2026)"
|
const val version = "0.0.29 (09/02/2026)"
|
||||||
// AAS 64 channels
|
// AAS 64 channels
|
||||||
const val max_channel = 64
|
const val max_channel = 64
|
||||||
|
|
||||||
@@ -129,6 +129,12 @@ fun main(args: Array<String>) {
|
|||||||
if ("--bypass-dongle" == str.lowercase()){
|
if ("--bypass-dongle" == str.lowercase()){
|
||||||
sdx.BypassDongle = true
|
sdx.BypassDongle = true
|
||||||
}
|
}
|
||||||
|
if (str.startsWith("--default-soundbank=")){
|
||||||
|
val defaultsb = str.substringAfter("=")
|
||||||
|
val lang = Language.entries.find { it.value.equals(defaultsb, ignoreCase = true) }
|
||||||
|
Language.DEFAULT = lang ?: Language.INDONESIA
|
||||||
|
Logger.info { "Default soundbank language set to ${Language.DEFAULT.value} from command line argument" }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -5,22 +5,22 @@ package content
|
|||||||
*
|
*
|
||||||
* @property name The name of the language, as in Soundbank Database
|
* @property name The name of the language, as in Soundbank Database
|
||||||
*/
|
*/
|
||||||
@Suppress("unused")
|
enum class Language(val value: String, val googletts: String) {
|
||||||
enum class Language(name: String) {
|
INDONESIA(value="INDONESIA", googletts="id-ID"),
|
||||||
INDONESIA("INDONESIA"),
|
ENGLISH(value="ENGLISH", googletts="en-US"),
|
||||||
ENGLISH("ENGLISH"),
|
LOCAL(value="LOCAL", googletts=""),
|
||||||
LOCAL("LOCAL"),
|
JAPANESE(value="JAPANESE", googletts="ja-JP"),
|
||||||
JAPANESE("JAPANESE"),
|
CHINESE(value="CHINESE", googletts="zh-CN"),
|
||||||
CHINESE("CHINESE"),
|
ARABIC(value="ARABIC", googletts="ar-SA");
|
||||||
ARABIC("ARABIC"),
|
|
||||||
DEFAULT(INDONESIA.name); // default language
|
|
||||||
|
|
||||||
companion object{
|
companion object{
|
||||||
|
var DEFAULT: Language = INDONESIA
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default language link string
|
* Default language link string
|
||||||
*/
|
*/
|
||||||
fun DefaultLanguageLink() : String {
|
fun DefaultLanguageLink() : String {
|
||||||
return DEFAULT.name+";"+ENGLISH.name
|
return DEFAULT.value+";"+ENGLISH.value
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -28,12 +28,12 @@ enum class Language(name: String) {
|
|||||||
*/
|
*/
|
||||||
fun LanguageOrder() : List<String> {
|
fun LanguageOrder() : List<String> {
|
||||||
return listOf(
|
return listOf(
|
||||||
INDONESIA.name,
|
INDONESIA.value,
|
||||||
LOCAL.name,
|
LOCAL.value,
|
||||||
ENGLISH.name,
|
ENGLISH.value,
|
||||||
CHINESE.name,
|
CHINESE.value,
|
||||||
JAPANESE.name,
|
JAPANESE.value,
|
||||||
ARABIC.name
|
ARABIC.value
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
fun from_GoogleTTSLanguage(lang: google.GoogleTTSLanguage) : Language {
|
fun from_GoogleTTSLanguage(lang: google.GoogleTTSLanguage) : Language {
|
||||||
@@ -45,15 +45,9 @@ enum class Language(name: String) {
|
|||||||
google.GoogleTTSLanguage.Arabic -> ARABIC
|
google.GoogleTTSLanguage.Arabic -> ARABIC
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fun from_GoogleTTSLanguage(code: String) : Language {
|
|
||||||
return when(code) {
|
fun from_GoogleTTSLanguage(code: String) : Language? {
|
||||||
"id-ID" -> INDONESIA
|
return entries.find { it.googletts == code }
|
||||||
"en-US" -> ENGLISH
|
|
||||||
"ja-JP" -> JAPANESE
|
|
||||||
"zh-CN" -> CHINESE
|
|
||||||
"ar-SA" -> ARABIC
|
|
||||||
else -> INDONESIA
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5,6 +5,7 @@ import database.data.Soundbank
|
|||||||
import database.dbFunctions
|
import database.dbFunctions
|
||||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook
|
||||||
import org.tinylog.Logger
|
import org.tinylog.Logger
|
||||||
|
import java.io.File
|
||||||
import java.sql.Connection
|
import java.sql.Connection
|
||||||
import java.util.function.Consumer
|
import java.util.function.Consumer
|
||||||
|
|
||||||
@@ -236,6 +237,11 @@ class Table_Soundbank(connection: Connection) : dbFunctions<Soundbank>("soundban
|
|||||||
.sorted()
|
.sorted()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find City by TAG
|
||||||
|
* @param tag the city tag to search for
|
||||||
|
* @return a list of Soundbank entries matching the city tag
|
||||||
|
*/
|
||||||
fun Find_City_By_TAG(tag: String) : List<Soundbank> {
|
fun Find_City_By_TAG(tag: String) : List<Soundbank> {
|
||||||
return List
|
return List
|
||||||
.filter {it.Category.equals(Category.City.name,true) }
|
.filter {it.Category.equals(Category.City.name,true) }
|
||||||
@@ -243,6 +249,11 @@ class Table_Soundbank(connection: Connection) : dbFunctions<Soundbank>("soundban
|
|||||||
.distinctBy { it.TAG }
|
.distinctBy { it.TAG }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find Airline Name by TAG
|
||||||
|
* @param tag the airline code tag to search for
|
||||||
|
* @return a list of Soundbank entries matching the airline code tag
|
||||||
|
*/
|
||||||
fun Find_AirlineName_By_TAG(tag: String) : List<Soundbank> {
|
fun Find_AirlineName_By_TAG(tag: String) : List<Soundbank> {
|
||||||
return List
|
return List
|
||||||
.filter {it.Category.equals(Category.Airplane_Name.name,true) }
|
.filter {it.Category.equals(Category.Airplane_Name.name,true) }
|
||||||
@@ -305,4 +316,34 @@ class Table_Soundbank(connection: Connection) : dbFunctions<Soundbank>("soundban
|
|||||||
.distinctBy { it.TAG }
|
.distinctBy { it.TAG }
|
||||||
.sortedBy { it.TAG }
|
.sortedBy { it.TAG }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class FileCheckResult{
|
||||||
|
var validfile = arrayListOf<Soundbank>()
|
||||||
|
var invalidfile = arrayListOf<Soundbank>()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check Soundbank path files existence
|
||||||
|
* @param cb callback with FileCheckResult containing valid and invalid files
|
||||||
|
*/
|
||||||
|
fun FileCheck(cb: Consumer<FileCheckResult>){
|
||||||
|
val result = FileCheckResult()
|
||||||
|
// file wav must at least 10 kb
|
||||||
|
val validfilesize = 10 * 1024; // 10 KB
|
||||||
|
|
||||||
|
for (sb in List){
|
||||||
|
if (sb.Path.isBlank()) {
|
||||||
|
result.invalidfile.add(sb)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
val file = File(sb.Path)
|
||||||
|
if (file.isFile && file.length() >= validfilesize) {
|
||||||
|
// file size should at leat 10 kb
|
||||||
|
result.validfile.add(sb)
|
||||||
|
} else {
|
||||||
|
result.invalidfile.add(sb)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cb.accept(result)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -243,7 +243,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
|||||||
val aa = js.get("autoadd")?.asText("add") ?: "add"
|
val aa = js.get("autoadd")?.asText("add") ?: "add"
|
||||||
Logger.info { "Starting TTS Soundbank Generation, VoiceType=$voicetype, Language" }
|
Logger.info { "Starting TTS Soundbank Generation, VoiceType=$voicetype, Language" }
|
||||||
ttsjob.GenerateSoundbank(
|
ttsjob.GenerateSoundbank(
|
||||||
voicetype, Language.from_GoogleTTSLanguage(languagecode),
|
voicetype, Language.from_GoogleTTSLanguage(languagecode)!!,
|
||||||
VoiceType.fromString(databasesource),
|
VoiceType.fromString(databasesource),
|
||||||
VoiceType.fromString(targetas), fileoperation.fromString(fop),
|
VoiceType.fromString(targetas), fileoperation.fromString(fop),
|
||||||
autoadd.fromString(aa)
|
autoadd.fromString(aa)
|
||||||
@@ -621,6 +621,11 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
path("SoundBank") {
|
path("SoundBank") {
|
||||||
|
get("FileCheck"){ ctx ->
|
||||||
|
db.soundDB.FileCheck { result ->
|
||||||
|
ctx.result(objectmapper.writeValueAsString(result))
|
||||||
|
}
|
||||||
|
}
|
||||||
get("List") { ctx ->
|
get("List") { ctx ->
|
||||||
db.soundDB.Get({
|
db.soundDB.Get({
|
||||||
ctx.result(MariaDB.ArrayListtoString(db.soundDB.List))
|
ctx.result(MariaDB.ArrayListtoString(db.soundDB.List))
|
||||||
@@ -1070,7 +1075,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
|
|||||||
db.languageDB.Add(newvalue)
|
db.languageDB.Add(newvalue)
|
||||||
}
|
}
|
||||||
db.languageDB.Resort()
|
db.languageDB.Resort()
|
||||||
|
ctx.result(objectmapper.writeValueAsString(resultMessage("OK")))
|
||||||
}
|
}
|
||||||
post("Add") {
|
post("Add") {
|
||||||
// Parse JSON from request body
|
// Parse JSON from request body
|
||||||
|
|||||||
Reference in New Issue
Block a user