commit 19/01/2026

This commit is contained in:
2026-01-19 11:18:22 +07:00
parent 934e69c646
commit 41f2c96cb4
5 changed files with 178 additions and 95 deletions

View File

@@ -54,67 +54,7 @@ function fill_messagebanktablebody(vv) {
* @property {string} Message_TAGS - Tags associated with the message
*/
/**
* Get data from modal inputs and return as MessageBank object
* @returns {MessageBank} messagebank object or null if validation fails
*/
function GetDataFromModal() {
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 text = $(this).text().trim();
let value = $(this).val().trim();
console.log('selected text:' + text + ', value:' + value);
if (text.length > 0) {
k
if (value.length > 0) {
messagetags += (messagetags.length > 0 ? " " : "") + value;
messagedetail += (messagedetail.length > 0 ? " " : "") + text;
}
}
});
console.log(`Constructed Message_Detail: ${messagedetail}`);
console.log(`Constructed Message_TAGS: ${messagetags}`);
if (description.length === 0) {
alert("Description cannot be empty");
return null;
}
if (!language) {
alert("Language cannot be empty");
return null;
}
if (isNaN(annid) || annid < 1 || annid > 100) {
alert("ANN_ID must be a number between 1 and 100");
return null;
}
if (!voicetype) {
alert("Voice Type cannot be empty");
return null;
}
if (messagedetail.length === 0 || messagetags.length === 0) {
alert("Message haven't been constructed, please add categories and phrases");
return null;
}
let mb = {
Description: description,
Language: language,
ANN_ID: annid,
Voice_Type: voicetype,
Message_Detail: messagedetail,
Message_TAGS: messagetags
};
return mb;
}
$(document).ready(function () {
@@ -158,39 +98,110 @@ $(document).ready(function () {
/**
* Refill messageavailablevariables options from categories[]
* and soundbankdata with category "Phrase" if messagelanguage and messagevoicetype are selected
* @param {Function} cbLoaded - callback function when phrases are loaded
*/
function refill_messageavailablevariables() {
function refill_messageavailablevariables(cbLoaded) {
$messageavailablevariables.empty();
categories.forEach(cat => {
if ("Phrase" === cat) return; // skip Phrase category
if ("Airline_Code" === cat) cat = "Flight_Number"; // revisi 15012026 karena inconsistensi penamaan tag
let displayCat = `[${cat}]`;
$messageavailablevariables.append(new Option(displayCat, displayCat));
$messageavailablevariables.append(new Option(text=displayCat.toUpperCase(), value=displayCat.toUpperCase()));
});
// tambah [ETAD], [BCB] revisi 19012026
$messageavailablevariables.append(new Option(text='[ETAD]', value='[ETAD]'));
$messageavailablevariables.append(new Option(text='[BCB]', value='[BCB]'));
let lang = $messagelanguage.val();
let vt = $messagevoicetype.val();
if (lang && lang.length > 0) {
//console.log("Selected Language:", lang);
if (vt && vt.length > 0) {
//console.log("Selected Voice Type:", vt);
fetchAPI(`SoundBank/GetPhrases/${lang}/${vt}`, "GET", {}, null, (okdata) => {
if (lang && lang.length > 0 && vt && vt.length > 0) {
fetchAPI(`SoundBank/GetPhrases/${lang}/${vt}`, "GET", {}, null, (okdata) => {
if (Array.isArray(okdata) && okdata.length > 0) {
console.log(`Loaded ${okdata.length} phrases from soundbank for language=${lang} and voiceType=${vt}`);
//console.log(JSON.stringify(okdata));
okdata.forEach(sb => {
if (sb.description && sb.description.length > 0) {
$messageavailablevariables.append($('<option>', { value: sb.tag, text: sb.description, title: sb.description }));
$messageavailablevariables.append($('<option>', { value: sb.tag.toUpperCase(), text: sb.description, title: sb.description }));
}
});
if (cbLoaded && typeof cbLoaded === 'function') {
cbLoaded();
}
}
}, (errdata) => {
//alert("Error loading phrases from soundbank : " + errdata.message);
if (cbLoaded && typeof cbLoaded === 'function') {
cbLoaded();
}
});
} else {
if (cbLoaded && typeof cbLoaded === 'function') {
cbLoaded();
}
}
}
/**
* Get data from modal inputs and return as MessageBank object
* @returns {MessageBank} messagebank object or null if validation fails
*/
function GetDataFromModal() {
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 text = $(this).text().trim();
let value = $(this).val().trim();
console.log('selected text:' + text + ', value:' + value);
if (text.length > 0) {
if (value.length > 0) {
messagetags += (messagetags.length > 0 ? " " : "") + value;
messagedetail += (messagedetail.length > 0 ? " " : "") + text;
}
}
});
if (description.length === 0) {
alert("Description cannot be empty");
return null;
}
if (!language) {
alert("Language cannot be empty");
return null;
}
if (isNaN(annid) || annid < 1 || annid > 100) {
alert("ANN_ID must be a number between 1 and 100");
return null;
}
if (!voicetype) {
alert("Voice Type cannot be empty");
return null;
}
if (messagedetail.length === 0 || messagetags.length === 0) {
alert("Message haven't been constructed, please add categories and phrases");
return null;
}
let mb = {
Description: description,
Language: language,
ANN_ID: annid,
Voice_Type: voicetype,
Message_Detail: messagedetail,
Message_TAGS: messagetags
};
console.log("Constructed MessageBank object:", JSON.stringify(mb));
return mb;
}
/**
@@ -198,24 +209,24 @@ $(document).ready(function () {
*/
function clearMessageModal() {
$messageindex.val('').prop('disabled', true);
$messagedescription.val('');
$messagedescription.val('').prop('disabled', false);
// fill messagelanguage options from languages[]
$messagelanguage.empty();
$messagelanguage.empty().prop('disabled', false);
window.languages.forEach(lang => {
$messagelanguage.append(new Option(lang, lang));
});
$messagelanguage.val(null);
$messagelanguage.val(null).prop('disabled', false);
$messagelanguage.on('change', function () {
refill_messageavailablevariables();
});
// set default annid to 1
$messageannid.val(1);
$messageannid.val(1).prop('disabled', false);
// fill messagevoicetype options from voiceTypes[]
$messagevoicetype.empty();
$messagevoicetype.empty().prop('disabled', false);
window.voiceTypes.forEach(vt => {
$messagevoicetype.append(new Option(vt, vt));
});
$messagevoicetype.val(null);
$messagevoicetype.val(null).prop('disabled', false);
$messagevoicetype.on('change', function () {
refill_messageavailablevariables();
});
@@ -282,6 +293,8 @@ $(document).ready(function () {
$modal.modal('show');
clearMessageModal();
$('#closemodalbutton').off('click').on('click', function () {
console.log('Close button clicked')
$modal.modal('hide');
@@ -293,7 +306,7 @@ $(document).ready(function () {
return;
}
// send to server using fetchAPI
fetchAPI(APIURL + "Add", "POST", mb, null, (okdata) => {
fetchAPI(APIURL + "Add", "POST", {}, mb, (okdata) => {
reloadMessageBank(APIURL, () => fill_messagebanktablebody(window.messagebankdata));
alert("Success add new messagebank : " + okdata.message);
}, (errdata) => {
@@ -347,12 +360,13 @@ $(document).ready(function () {
clearMessageModal();
// Fill modal fields with selected messagebank data
$messageindex.val(mb.index).prop('disabled', true);
$messagedescription.val(mb.description);
$messagelanguage.val(mb.language);
$messagevoicetype.val(mb.voice_Type);
$messageannid.val(mb.aNN_ID);
// Edit mode cant change description, language, voicetype, annid
$messagedescription.val(mb.description).prop('disabled', true);
$messagelanguage.val(mb.language).prop('disabled', true);
$messagevoicetype.val(mb.voice_Type).prop('disabled', true);
$messageannid.val(mb.aNN_ID).prop('disabled', true);
// Refill message available variables
refill_messageavailablevariables();
refill_messageavailablevariables(() => {
// Fill messageselectedvariables from message_Detail and message_TAGS
$messageselectedvariables.empty();
if (mb.message_Detail && mb.message_Detail.length > 0) {
@@ -361,18 +375,33 @@ $(document).ready(function () {
tags.forEach((tag, idx) => {
console.log(`Restoring tag[${idx}]: ${tag}`);
let tagLower = tag.toLowerCase();
let isfound = false;
if (tagLower==="[airline_code]") {
tagLower = "[flight_number]";
}
if (tagLower==="[gatenumber]") {
tagLower = "[gate]";
}
// find <option> in messageavailablevariables with value=tag
$messageavailablevariables.find('option').each(function () {
let val = $(this).val().toLowerCase();
console.log(`Available option value: ${val}`);
if (val === tagLower) {
console.log(`Found matching option for tag: ${tag}`);
let valx = $(this).val().toLowerCase();
//console.log(`Available option value: ${valx}`);
if (valx === tagLower) {
isfound = true;
//console.log(`Found matching option for tag: ${tag}`);
$messageselectedvariables.append($(this).clone());
}
});
if (isfound) {
console.log(`Appended tag to selected variables: ${tag}`);
} else {
console.log(`Tag not found in available variables: ${tag}`);
}
});
}
}
});
// Save button event
$('#savemodalbutton').off('click').on('click', function () {
@@ -381,7 +410,7 @@ $(document).ready(function () {
if (!mbUpdate) {
return;
}
fetchAPI(APIURL + "UpdateByIndex/" + mb.index, "PATCH", mbUpdate, null, (okdata) => {
fetchAPI(APIURL + "UpdateByIndex/" + mb.index, "PATCH", {}, mbUpdate, (okdata) => {
reloadMessageBank(APIURL, () => fill_messagebanktablebody(window.messagebankdata));
alert("Success edit messagebank : " + okdata.message);
}, (errdata) => {

View File

@@ -33,7 +33,7 @@ window.scheduledays = []
* List of broadcast zones available
* @type {BroadcastZone[]}
*/
window.BroadcastZoneList ??= [];
window.BroadcastZoneList = [];
/**
* @typedef {Object} MessageBank
@@ -50,7 +50,7 @@ window.BroadcastZoneList ??= [];
* List of Messagebank data loaded from server
* @type {MessageBank[]}
*/
window.messagebankdata ??= [];
window.messagebankdata = [];
/**
* Reload message bank from server
@@ -58,7 +58,7 @@ window.messagebankdata ??= [];
* @param {function|null} cbOK callback on success, default null
*/
function reloadMessageBank(APIURL = "MessageBank/", cbOK = null) {
window.messagebankdata ??= [];
window.messagebankdata = [];
fetchAPI(APIURL + "List", "GET", {}, null, (okdata) => {
//console.log("Message bank data loaded : ", okdata);
if (Array.isArray(okdata)) {