commit 12/09/2025
This commit is contained in:
@@ -56,6 +56,15 @@
|
||||
* @property {string} text
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} BroadcastZone
|
||||
* @property {number} index
|
||||
* @property {string} description
|
||||
* @property {String} SoundChannel
|
||||
* @property {String} Box
|
||||
* @property {String} Relay
|
||||
*/
|
||||
|
||||
/**
|
||||
* List of Soundbank data loaded from server
|
||||
* @type {SoundBank[]}
|
||||
@@ -106,12 +115,9 @@ let soundbankfiles = [];
|
||||
/**
|
||||
* Select2 data source
|
||||
* See https://select2.org/data-sources/formats
|
||||
* @type {Object}
|
||||
* @property {Select2item[]} results
|
||||
* @type {Select2item[]}
|
||||
*/
|
||||
let select2results = {
|
||||
results: []
|
||||
};
|
||||
let select2data = [];
|
||||
|
||||
/**
|
||||
* List of voice types available
|
||||
@@ -135,6 +141,21 @@ let languages = [];
|
||||
*/
|
||||
let scheduledays = []
|
||||
|
||||
/**
|
||||
* List of broadcast zones available
|
||||
* @type {BroadcastZone[]}
|
||||
*/
|
||||
let BroadcastZoneList = [];
|
||||
|
||||
/**
|
||||
* Create a list item element
|
||||
* @param {String} text Text Content for the list item
|
||||
* @param {String} className Specific class name for the list item
|
||||
* @returns {JQuery<HTMLElement>}
|
||||
*/
|
||||
function ListItem(text, className=""){
|
||||
return $('<li>').addClass(className).text(text);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fill soundbank table body with values
|
||||
@@ -368,9 +389,9 @@ function fetchAPI(endpoint, method, headers = {}, body = null, cbOK, cbError) {
|
||||
|
||||
/**
|
||||
* Reload sound bank from server
|
||||
* @param {String} APIURL API URL endpoint
|
||||
* @param {String} APIURL API URL endpoint, default "SoundBank/"
|
||||
*/
|
||||
function reloadSoundBank(APIURL) {
|
||||
function reloadSoundBank(APIURL = "SoundBank/") {
|
||||
soundbankdata = [];
|
||||
fetchAPI(APIURL + "List", "GET", {}, null, (okdata) => {
|
||||
if (Array.isArray(okdata)) {
|
||||
@@ -385,9 +406,9 @@ function reloadSoundBank(APIURL) {
|
||||
|
||||
/**
|
||||
* Reload message bank from server
|
||||
* @param {string} APIURL API URL endpoint
|
||||
* @param {string} APIURL API URL endpoint, default "MessageBank/"
|
||||
*/
|
||||
function reloadMessageBank(APIURL) {
|
||||
function reloadMessageBank(APIURL = "MessageBank/") {
|
||||
messagebankdata = [];
|
||||
fetchAPI(APIURL + "List", "GET", {}, null, (okdata) => {
|
||||
if (Array.isArray(okdata)) {
|
||||
@@ -402,9 +423,9 @@ function reloadMessageBank(APIURL) {
|
||||
|
||||
/**
|
||||
* Reload language bank from server
|
||||
* @param {string} APIURL API URL endpoint
|
||||
* @param {string} APIURL API URL endpoint, default "LanguageLink/"
|
||||
*/
|
||||
function reloadLanguageBank(APIURL) {
|
||||
function reloadLanguageBank(APIURL = "LanguageLink/") {
|
||||
languagebankdata = [];
|
||||
fetchAPI(APIURL + "List", "GET", {}, null, (okdata) => {
|
||||
if (Array.isArray(okdata)) {
|
||||
@@ -419,9 +440,9 @@ function reloadLanguageBank(APIURL) {
|
||||
|
||||
/**
|
||||
* Reload timer bank from server
|
||||
* @param {string} APIURL API URL endpoint
|
||||
* @param {string} APIURL API URL endpoint, default "ScheduleBank/"
|
||||
*/
|
||||
function reloadTimerBank(APIURL) {
|
||||
function reloadTimerBank(APIURL = "ScheduleBank/") {
|
||||
schedulebankdata = [];
|
||||
fetchAPI(APIURL + "List", "GET", {}, null, (okdata) => {
|
||||
if (Array.isArray(okdata)) {
|
||||
@@ -436,11 +457,11 @@ function reloadTimerBank(APIURL) {
|
||||
|
||||
/**
|
||||
* Reload logs from server with date and filter
|
||||
* @param {String} APIURL API URL endpoint
|
||||
* @param {String} APIURL API URL endpoint , default "Log/"
|
||||
* @param {String} date date in format dd-mm-yyyy
|
||||
* @param {String} filter log filter text
|
||||
*/
|
||||
function reloadLogs(APIURL, date, filter) {
|
||||
function reloadLogs(APIURL = "Log/", date, filter) {
|
||||
const params = new URLSearchParams({
|
||||
date: date,
|
||||
filter: filter
|
||||
@@ -460,22 +481,38 @@ function reloadLogs(APIURL, date, filter) {
|
||||
* Reload soundbank files from server
|
||||
* @param {String} APIURL API URL endpoint (default "SoundBank/")
|
||||
*/
|
||||
function regetSoundbankFiles(APIURL = "SoundBank/") {
|
||||
function reloadSoundbankFiles(APIURL = "SoundBank/") {
|
||||
soundbankfiles = [];
|
||||
fetchAPI(APIURL + "ListFiles", "GET", {}, null, (okdata) => {
|
||||
// okdata is a string contains elements separated by semicolon ;
|
||||
if (Array.isArray(okdata)) {
|
||||
soundbankfiles = okdata.filter(item => item.trim().length > 0);
|
||||
//console.log("Loaded " + soundbankfiles.length + " sound files : " + soundbankfiles.join(", ") );
|
||||
|
||||
// refill select2results
|
||||
select2results.results = soundbankfiles.map((item, index) => ({ id: index + 1, text: item }));
|
||||
} else console.log("regetSoundbankFiles: okdata is not array");
|
||||
// refill select2data
|
||||
select2data = soundbankfiles.map((item, index) => ({ id: index + 1, text: item }));
|
||||
} else console.log("reloadSoundbankFiles: okdata is not array");
|
||||
}, (errdata) => {
|
||||
alert("Error loading soundbank files : " + errdata.message);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reload broadcast zones from server
|
||||
* @param {String} APIURL API URL endpoint (default "BroadcastZones/")
|
||||
*/
|
||||
function reloadBroadcastZones(APIURL = "BroadcastZones/") {
|
||||
BroadcastZoneList = [];
|
||||
fetchAPI(APIURL + "List", "GET", {}, null, (okdata) => {
|
||||
if (Array.isArray(okdata)) {
|
||||
BroadcastZoneList = okdata;
|
||||
fill_broadcastzonetablebody(BroadcastZoneList);
|
||||
} else console.log("reloadBroadcastZones: okdata is not array");
|
||||
}, (errdata) => {
|
||||
alert("Error loading broadcast zones : " + errdata.message);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Reload voice types from server
|
||||
*/
|
||||
@@ -646,7 +683,7 @@ $(document).ready(function () {
|
||||
getCategories();
|
||||
getLanguages();
|
||||
getScheduledDays();
|
||||
regetSoundbankFiles();
|
||||
reloadSoundbankFiles();
|
||||
|
||||
// Initialize WebSocket connection
|
||||
ws = new WebSocket(window.location.pathname + '/ws');
|
||||
@@ -723,11 +760,50 @@ $(document).ready(function () {
|
||||
let $btnEdit = $('#btnEdit');
|
||||
let $btnExport = $('#btnExport');
|
||||
let $btnImport = $('#btnImport');
|
||||
let $modal = $('#soundbankmodal');
|
||||
$btnRemove.prop('disabled', true);
|
||||
$btnEdit.prop('disabled', true);
|
||||
let APIURL = "SoundBank/";
|
||||
let $modal = $('#soundbankmodal');
|
||||
let $modalindex = $modal.find('#modalindex');
|
||||
let $modaldescription = $modal.find('#modaldescription');
|
||||
let $modaltag = $modal.find('#modaltag');
|
||||
let $modalcategory = $modal.find('#modalcategory');
|
||||
let $modallanguage = $modal.find('#modallanguage');
|
||||
let $modalvoicetype = $modal.find('#modalvoicetype');
|
||||
let $modalpath = $modal.find('#modalpath');
|
||||
|
||||
/**
|
||||
* Clear soundbank modal inputs
|
||||
*/
|
||||
function clearSoundbankModal() {
|
||||
$modalindex.val('').prop('disabled', true);
|
||||
$modaldescription.val('');
|
||||
$modaltag.val('');
|
||||
// fill modalcategory options from categories[]
|
||||
$modalcategory.empty();
|
||||
categories.forEach(cat => {
|
||||
$modalcategory.append(new Option(cat, cat));
|
||||
});
|
||||
$modalcategory.val(null);
|
||||
// fill modallanguage options from languages[]
|
||||
$modallanguage.empty();
|
||||
languages.forEach(lang => {
|
||||
$modallanguage.append(new Option(lang, lang));
|
||||
});
|
||||
$modallanguage.val(null);
|
||||
// fill modalvoicetype options from voiceTypes[]
|
||||
$modalvoicetype.empty();
|
||||
voiceTypes.forEach(vt => {
|
||||
$modalvoicetype.append(new Option(vt, vt));
|
||||
});
|
||||
$modalvoicetype.val(null);
|
||||
// fill modalpath options from soundbankfiles[]
|
||||
// TODO read https://jeesite.com/front/jquery-select2/4.0/index.htm
|
||||
console.log("select2data has " + select2data.length + " items");
|
||||
$('#modalpath').select2({
|
||||
data: select2data
|
||||
})
|
||||
}
|
||||
|
||||
reloadSoundBank(APIURL);
|
||||
$('#findsoundbank').on('input', function () {
|
||||
@@ -751,14 +827,12 @@ $(document).ready(function () {
|
||||
|
||||
});
|
||||
$btnAdd.click(() => {
|
||||
$('.js-example-basic-single').select2({
|
||||
placeholder: 'Select a sound file',
|
||||
closeOnSelect: true,
|
||||
data: select2results,
|
||||
});
|
||||
|
||||
$modal.modal('show');
|
||||
clearSoundbankModal();
|
||||
// event on Click save button
|
||||
$modal.off('click.soundbanksave').on('click.soundbanksave', '#soundbanksave', function () {
|
||||
//TODO Add soundbank save process here
|
||||
$modal.modal('hide');
|
||||
});
|
||||
// event on Click close button
|
||||
@@ -805,9 +879,16 @@ $(document).ready(function () {
|
||||
if (confirm(`Are you sure to edit soundbank [${sb.index}] Description=${sb.description} Tag=${sb.tag}?`)) {
|
||||
$modal.modal('show');
|
||||
$modal.off('hidden.bs.modal').on('hidden.bs.modal', function () {
|
||||
const desc = $('#description').val();
|
||||
console.log('Description input value:', desc);
|
||||
// You can use desc here (e.g., send to server)
|
||||
|
||||
// event on Click save button
|
||||
$modal.off('click.soundbanksave').on('click.soundbanksave', '#soundbanksave', function () {
|
||||
//TODO Add soundbank save process here
|
||||
$modal.modal('hide');
|
||||
});
|
||||
// event on Click close button
|
||||
$modal.off('click.soundbankclose').on('click.soundbankclose', '#soundbankclose', function () {
|
||||
$modal.modal('hide');
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -848,6 +929,110 @@ $(document).ready(function () {
|
||||
let APIURL = "MessageBank/";
|
||||
let $findmessage = $('#findmessage');
|
||||
|
||||
// modal for add / edit messagebank
|
||||
let $modal = $('#messagebankmodal');
|
||||
// text input, disabled by default
|
||||
let $messageindex = $modal.find('#messageindex');
|
||||
// text input
|
||||
let $messagedescription = $modal.find('#messagedescription');
|
||||
// select input, options loaded from languages[]
|
||||
let $messagelanguage = $modal.find('#messagelanguage');
|
||||
// number input from 1 to 100
|
||||
let $messageannid = $modal.find('#messageannid');
|
||||
// select input, options loaded from voiceTypes[]
|
||||
let $messagevoicetype = $modal.find('#messagevoicetype');
|
||||
// list <ul> of available categories and phrases
|
||||
let $messageavailablevariables = $modal.find('#messageavailablevariables');
|
||||
// list <ul> of selected categories and phrases
|
||||
let $messageselectedvariables = $modal.find('#messageselectedvariables');
|
||||
// for clearing messageselectedvariables
|
||||
let $btnclearlist = $modal.find('#btnclearlist');
|
||||
// for removing selected item from messageselectedvariables
|
||||
let $btnremovefromlist = $modal.find('#btnremovefromlist');
|
||||
// for adding selected item from messageavailablevariables to messageselectedvariables
|
||||
let $btnaddtolist = $modal.find('#btnaddtolist');
|
||||
|
||||
/**
|
||||
* Refill messageavailablevariables options from categories[]
|
||||
* and soundbankdata with category "Phrase" if messagelanguage and messagevoicetype are selected
|
||||
*/
|
||||
function refill_messageavailablevariables() {
|
||||
$messageavailablevariables.empty();
|
||||
categories.forEach(cat => {
|
||||
$messageavailablevariables.append(ListItem(`{${cat}}`));
|
||||
});
|
||||
if ($messagelanguage.val() && $messagevoicetype.val()) {
|
||||
soundbankdata
|
||||
.filter(sb => sb.language.toLowerCase() === $messagelanguage.val().toLowerCase())
|
||||
.filter(sb => sb.voiceType.toLowerCase() === $messagevoicetype.val().toLowerCase())
|
||||
.filter(sb => sb.category.toLowerCase() === "phrase")
|
||||
.forEach(sb => {
|
||||
$messageavailablevariables.append(ListItem(`[${sb.Description}]`));
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear message modal to default state
|
||||
*/
|
||||
function clearMessageModal() {
|
||||
$messageindex.val('').prop('disabled', true);
|
||||
$messagedescription.val('');
|
||||
// fill messagelanguage options from languages[]
|
||||
$messagelanguage.empty();
|
||||
languages.forEach(lang => {
|
||||
$messagelanguage.append(new Option(lang, lang));
|
||||
});
|
||||
$messagelanguage.val(null);
|
||||
$messagelanguage.on('change', function () {
|
||||
refill_messageavailablevariables();
|
||||
});
|
||||
// set default annid to 1
|
||||
$messageannid.val(1);
|
||||
// fill messagevoicetype options from voiceTypes[]
|
||||
$messagevoicetype.empty();
|
||||
voiceTypes.forEach(vt => {
|
||||
$messagevoicetype.append(new Option(vt, vt));
|
||||
});
|
||||
$messagevoicetype.val(null);
|
||||
$messagevoicetype.on('change', function () {
|
||||
refill_messageavailablevariables();
|
||||
});
|
||||
|
||||
refill_messageavailablevariables();
|
||||
$messageselectedvariables.empty();
|
||||
|
||||
// event on btnclearlist
|
||||
$btnclearlist.off('click').on('click', function () {
|
||||
if ($messageselectedvariables.children().length > 0) {
|
||||
if (confirm("Are you sure want to clear selected variables list?")) {
|
||||
$messageselectedvariables.empty();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// event on btnremovefromlist
|
||||
$btnremovefromlist.off('click').on('click', function () {
|
||||
let $selected = $messageselectedvariables.find('option:selected');
|
||||
if ($selected.length > 0) {
|
||||
$selected.remove();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
// event on btnaddtolist
|
||||
$btnaddtolist.off('click').on('click', function () {
|
||||
let $selected = $messageavailablevariables.find('option:selected');
|
||||
if ($selected.length > 0) {
|
||||
$selected.each(function () {
|
||||
$messageselectedvariables.append($(this).clone());
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
$findmessage.on('input', function () {
|
||||
let searchTerm = $findmessage.val().toLowerCase();
|
||||
if (searchTerm.length > 0) {
|
||||
@@ -872,18 +1057,83 @@ $(document).ready(function () {
|
||||
|
||||
});
|
||||
$btnAdd.click(() => {
|
||||
let $modal = $('#messagebankmodal');
|
||||
$modal.modal('show');
|
||||
$modal.off('click.messagebanksave').on('click.messagebanksave', '#messagebanksave', function () {
|
||||
const index = $('#messageindex').val();
|
||||
const description = $('#messagedescription').val();
|
||||
const language = $('#messagelanguage').val();
|
||||
const ann_id = parseInt($('#messageannid').val());
|
||||
const voice_type = $('#messagevoicetype').val();
|
||||
|
||||
$modal.modal('show');
|
||||
clearMessageModal();
|
||||
|
||||
// event on Click save button
|
||||
$modal.off('click.messagebanksave').on('click.messagebanksave', '#messagebanksave', function () {
|
||||
let description = $messagedescription.val().trim();
|
||||
let language = $messagelanguage.val();
|
||||
let annid = parseInt($messageannid.val());
|
||||
let voicetype = $messagevoicetype.val();
|
||||
let messagedetail = "";
|
||||
let messagetags = "";
|
||||
|
||||
// iterate messageselectedvariables children
|
||||
$messageselectedvariables.children().each(function () {
|
||||
let val = $(this).text().trim();
|
||||
if (val.length > 0) {
|
||||
if (val.startsWith('[') && val.endsWith(']')) {
|
||||
// categories
|
||||
messagetags += (messagetags.length > 0 ? " " : "") + val;
|
||||
messagedetail += (messagedetail.length > 0 ? " " : "") + val;
|
||||
} else {
|
||||
// phrases
|
||||
// find in soundbankdata by description with specified language and voicetype
|
||||
let sb = soundbankdata
|
||||
.filter(sb => sb.language.toLowerCase() === language.toLowerCase())
|
||||
.filter(sb => sb.voiceType.toLowerCase() === voicetype.toLowerCase())
|
||||
.find(sb => sb.Description.toLowerCase() === val.toLowerCase());
|
||||
if (sb) {
|
||||
messagedetail += (messagedetail.length > 0 ? " " : "") + sb.Description;
|
||||
messagetags += (messagetags.length > 0 ? " " : "") + sb.tag;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (description.length === 0) {
|
||||
alert("Description cannot be empty");
|
||||
return;
|
||||
}
|
||||
if (!language) {
|
||||
alert("Language cannot be empty");
|
||||
return;
|
||||
}
|
||||
if (isNaN(annid) || annid < 1 || annid > 100) {
|
||||
alert("ANN_ID must be a number between 1 and 100");
|
||||
return;
|
||||
}
|
||||
if (!voicetype) {
|
||||
alert("Voice Type cannot be empty");
|
||||
return;
|
||||
}
|
||||
if (messagedetail.length === 0 || messagetags.length === 0) {
|
||||
alert("Message haven't been constructed, please add categories and phrases");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
let mb = {
|
||||
Description: description,
|
||||
Language: language,
|
||||
ANN_ID: annid,
|
||||
Voice_Type: voicetype,
|
||||
Message_Detail: messagedetail,
|
||||
Message_TAGS: messagetags
|
||||
};
|
||||
// send to server using fetchAPI
|
||||
fetchAPI(APIURL + "Add", "POST", mb, null, (okdata) => {
|
||||
reloadMessageBank(APIURL);
|
||||
alert("Success add new messagebank : " + okdata.message);
|
||||
}, (errdata) => {
|
||||
alert("Error add new messagebank : " + errdata.message);
|
||||
});
|
||||
|
||||
$modal.modal('hide');
|
||||
});
|
||||
// event on Click close button
|
||||
$modal.off('click.messagebankclose').on('click.messagebankclose', '#messagebankclose', function () {
|
||||
$modal.modal('hide');
|
||||
});
|
||||
@@ -926,7 +1176,103 @@ $(document).ready(function () {
|
||||
message_TAGS: cells.eq(6).text()
|
||||
}
|
||||
if (confirm(`Are you sure to edit messagebank [${mb.index}] Description=${mb.description} ANN_ID=${mb.aNN_ID} Language=${mb.language} Voice_Type=${mb.voice_Type} `)) {
|
||||
//TODO send edit command
|
||||
$modal.modal('show');
|
||||
|
||||
clearMessageModal();
|
||||
// Fill modal fields with selected messagebank data
|
||||
$messageindex.val(mb.index).prop('disabled', true);
|
||||
$messagedescription.val(mb.description);
|
||||
// Fill messagelanguage options and select current
|
||||
$messagelanguage.empty();
|
||||
languages.forEach(lang => {
|
||||
$messagelanguage.append(new Option(lang, lang));
|
||||
});
|
||||
$messagelanguage.val(mb.language);
|
||||
// Fill messagevoicetype options and select current
|
||||
$messagevoicetype.empty();
|
||||
voiceTypes.forEach(vt => {
|
||||
$messagevoicetype.append(new Option(vt, vt));
|
||||
});
|
||||
$messagevoicetype.val(mb.voice_Type);
|
||||
// Set annid
|
||||
$messageannid.val(mb.aNN_ID);
|
||||
// Refill message available variables
|
||||
refill_messageavailablevariables();
|
||||
// Fill messageselectedvariables from message_Detail and message_TAGS
|
||||
$messageselectedvariables.empty();
|
||||
if (mb.message_Detail) {
|
||||
mb.message_Detail.split(' ').forEach(val => {
|
||||
$messageselectedvariables.append(ListItem(val));
|
||||
});
|
||||
}
|
||||
|
||||
// Save button event
|
||||
$modal.off('click.messagebanksave').on('click.messagebanksave', '#messagebanksave', function () {
|
||||
let description = $messagedescription.val().trim();
|
||||
let language = $messagelanguage.val();
|
||||
let annid = parseInt($messageannid.val());
|
||||
let voicetype = $messagevoicetype.val();
|
||||
let messagedetail = "";
|
||||
let messagetags = "";
|
||||
$messageselectedvariables.children().each(function () {
|
||||
let val = $(this).text().trim();
|
||||
if (val.length > 0) {
|
||||
if (val.startsWith('[') && val.endsWith(']')) {
|
||||
messagetags += (messagetags.length > 0 ? " " : "") + val;
|
||||
messagedetail += (messagedetail.length > 0 ? " " : "") + val;
|
||||
} else {
|
||||
let sb = soundbankdata
|
||||
.filter(sb => sb.language.toLowerCase() === language.toLowerCase())
|
||||
.filter(sb => sb.voiceType.toLowerCase() === voicetype.toLowerCase())
|
||||
.find(sb => sb.Description && sb.Description.toLowerCase() === val.toLowerCase());
|
||||
if (sb) {
|
||||
messagedetail += (messagedetail.length > 0 ? " " : "") + sb.Description;
|
||||
messagetags += (messagetags.length > 0 ? " " : "") + sb.tag;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
if (description.length === 0) {
|
||||
alert("Description cannot be empty");
|
||||
return;
|
||||
}
|
||||
if (!language) {
|
||||
alert("Language cannot be empty");
|
||||
return;
|
||||
}
|
||||
if (isNaN(annid) || annid < 1 || annid > 100) {
|
||||
alert("ANN_ID must be a number between 1 and 100");
|
||||
return;
|
||||
}
|
||||
if (!voicetype) {
|
||||
alert("Voice Type cannot be empty");
|
||||
return;
|
||||
}
|
||||
if (messagedetail.length === 0 || messagetags.length === 0) {
|
||||
alert("Message haven't been constructed, please add categories and phrases");
|
||||
return;
|
||||
}
|
||||
let mbUpdate = {
|
||||
Description: description,
|
||||
Language: language,
|
||||
ANN_ID: annid,
|
||||
Voice_Type: voicetype,
|
||||
Message_Detail: messagedetail,
|
||||
Message_TAGS: messagetags
|
||||
};
|
||||
fetchAPI(APIURL + "UpdateByIndex/" + mb.index, "PATCH", mbUpdate, null, (okdata) => {
|
||||
reloadMessageBank(APIURL);
|
||||
alert("Success edit messagebank : " + okdata.message);
|
||||
}, (errdata) => {
|
||||
alert("Error edit messagebank : " + errdata.message);
|
||||
});
|
||||
$modal.modal('hide');
|
||||
});
|
||||
// Close button event
|
||||
$modal.off('click.messagebankclose').on('click.messagebankclose', '#messagebankclose', function () {
|
||||
$modal.modal('hide');
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -1082,7 +1428,7 @@ $(document).ready(function () {
|
||||
language: cells.eq(2).text()
|
||||
}
|
||||
if (confirm(`Are you sure to edit language [${ll.index}] Tag=${ll.tag} Language=${ll.language}?`)) {
|
||||
|
||||
|
||||
clearLanguageModal();
|
||||
$langid.val(ll.index);
|
||||
$langtag.val(ll.tag);
|
||||
@@ -1233,7 +1579,7 @@ $(document).ready(function () {
|
||||
$schedulesaturday.prop('checked', false);
|
||||
$schedulespecialdate.prop('checked', false);
|
||||
$scheduledate.prop('disabled', true).val('');
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1242,7 +1588,10 @@ $(document).ready(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));
|
||||
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;
|
||||
@@ -1250,7 +1599,7 @@ $(document).ready(function () {
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
reloadTimerBank(APIURL);
|
||||
$btnClear.click(() => {
|
||||
DoClear(APIURL, "Timerbank", (okdata) => {
|
||||
@@ -1262,7 +1611,6 @@ $(document).ready(function () {
|
||||
|
||||
});
|
||||
$btnAdd.click(() => {
|
||||
//TODO form add timer
|
||||
$schedulemodal.modal('show');
|
||||
clearScheduleModal();
|
||||
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
<div class="col-4 col-sm-3">
|
||||
<p class="text-add">Language</p>
|
||||
</div>
|
||||
<div class="col" id="modallanguage"><select class="input-add form-select"></select></div>
|
||||
<div class="col"><select id="modallanguage" class="input-add form-select"></select></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-4 col-sm-3">
|
||||
@@ -97,11 +97,11 @@
|
||||
</div>
|
||||
<div class="col"><select id="modalvoicetype" class="input-add form-select"></select></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="row" style="height: 100px;">
|
||||
<div class="col-4 col-sm-3">
|
||||
<p class="text-add">Path</p>
|
||||
</div>
|
||||
<div class="col"><select id="modalpath" class="js-example-basic-single" name="modalpath"></select></div>
|
||||
<div class="col"><select class="w-100 js-example-basic-single" id="modalpath" name="modalpath"></select></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer"><button class="btn btn-round-basic color-edit class25" id="soundbankclose" type="button" data-bs-dismiss="modal">Close</button><button class="btn btn-round-basic color-add class25" id="soundbanksave" type="button">Save</button></div>
|
||||
|
||||
@@ -2,8 +2,8 @@ package content
|
||||
|
||||
@Suppress("unused")
|
||||
enum class Category(name: String) {
|
||||
AirlineCode("Airline_Code"),
|
||||
AirplaneName("Airplane_Name"),
|
||||
Airline_Code("Airline_Code"),
|
||||
Airplane_Name("Airplane_Name"),
|
||||
AlphabetNumeric("AlphabetNumeric"),
|
||||
City("City"),
|
||||
Phrase("Phrase"),
|
||||
|
||||
@@ -7,10 +7,10 @@ package content
|
||||
*/
|
||||
@Suppress("unused")
|
||||
enum class Language(name: String) {
|
||||
Indonesia("INDONESIA"),
|
||||
English("ENGLISH"),
|
||||
Local("LOCAL"),
|
||||
Japanese("JAPANESE"),
|
||||
Chinese("CHINESE"),
|
||||
Arabic("ARABIC");
|
||||
INDONESIA("Indonesia"),
|
||||
ENGLISH("English"),
|
||||
LOCAL("Local"),
|
||||
JAPANESE("Japanese"),
|
||||
CHINESE("Chinese"),
|
||||
ARABIC("Arabic");
|
||||
}
|
||||
@@ -7,7 +7,7 @@ package content
|
||||
*/
|
||||
@Suppress("unused")
|
||||
enum class VoiceType(voicename: String) {
|
||||
Voice1("VOICE_1"),
|
||||
Voice2("VOICE_2"),
|
||||
Voice3("VOICE_3");
|
||||
VOICE_1("VOICE_1"),
|
||||
VOICE_2("VOICE_2"),
|
||||
VOICE_3("VOICE_3");
|
||||
}
|
||||
@@ -15,6 +15,7 @@ import content.ScheduleDay
|
||||
import content.VoiceType
|
||||
import database.LanguageLink
|
||||
import database.MariaDB
|
||||
import database.Messagebank
|
||||
import database.Soundbank
|
||||
import io.javalin.Javalin
|
||||
import io.javalin.apibuilder.ApiBuilder.before
|
||||
@@ -172,7 +173,7 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
|
||||
}
|
||||
path("Category") {
|
||||
get {
|
||||
it.result(objectmapper.writeValueAsString(Category.entries.map { cat -> cat.name }) )
|
||||
it.result(objectmapper.writeValueAsString(Category.entries.map { cat -> cat.name}) )
|
||||
}
|
||||
}
|
||||
path("Language") {
|
||||
@@ -353,7 +354,30 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>, val
|
||||
it.result(MariaDB.ArrayListtoString(db.MessagebankList))
|
||||
}
|
||||
post("Add"){
|
||||
// TODO add new messagebank
|
||||
val json : JsonNode = objectmapper.readTree(it.body())
|
||||
val description = json.get("Description")?.asText() ?: ""
|
||||
val language = json.get("Language")?.asText() ?: ""
|
||||
val ann_id = json.get("ANN_ID")?.asInt()?.toUInt() ?: 0u
|
||||
val voice_type = json.get("Voice_Type")?.asText() ?: ""
|
||||
val message_detail = json.get("Message_Detail")?.asText() ?: ""
|
||||
val message_tags = json.get("Message_TAGS")?.asText() ?: ""
|
||||
if (description.isNotEmpty()){
|
||||
if (language.isNotEmpty() && Language.entries.any{ lang -> lang.name == language }){
|
||||
if (ann_id>0u){
|
||||
if (voice_type.isNotEmpty() && VoiceType.entries.any{ vt -> vt.name == voice_type }){
|
||||
if (message_detail.isNotEmpty()){
|
||||
if (message_tags.isNotEmpty()){
|
||||
val mb = Messagebank(0u, description, language, ann_id, voice_type, message_detail, message_tags)
|
||||
if (db.Add_Messagebank(mb)){
|
||||
db.Resort_Messagebank_by_ANN_ID()
|
||||
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
|
||||
} else it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to add messagebank to database")))
|
||||
} else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Message_TAGS")))
|
||||
} else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Message_Detail")))
|
||||
} else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Voice_Type")))
|
||||
} else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid ANN_ID")))
|
||||
} else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Language")))
|
||||
} else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Description")))
|
||||
}
|
||||
delete("List") {
|
||||
// truncate messagebank table
|
||||
|
||||
Reference in New Issue
Block a user