commit 18/12/2025
This commit is contained in:
54
html/webpage/assets/js/login.js
Normal file
54
html/webpage/assets/js/login.js
Normal file
@@ -0,0 +1,54 @@
|
||||
function cleartext() {
|
||||
$('#usernametext').val('');
|
||||
$('#passwordtext').val('');
|
||||
}
|
||||
|
||||
function validstring(str) {
|
||||
if (str !== null && str.length > 0) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
$(document).ready(function () {
|
||||
console.log("Login page is ready.");
|
||||
cleartext();
|
||||
$('#loginbtn').off('click').on('click', function () {
|
||||
var username = $('#usernametext').val();
|
||||
var password = $('#passwordtext').val();
|
||||
if (!validstring(username) || !validstring(password)) {
|
||||
alert("Please enter both username and password.");
|
||||
cleartext();
|
||||
return;
|
||||
}
|
||||
fetch('/login.html', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/x-www-form-urlencoded',
|
||||
},
|
||||
body: new URLSearchParams({
|
||||
username: username,
|
||||
password: password
|
||||
})
|
||||
})
|
||||
.then(response => {
|
||||
//console.log("Received response from server : " + response.status + " " + response.statusText+" is redirected: "+response.redirected);
|
||||
if (response.redirected) {
|
||||
//alert("Login successful, will redirect now.");
|
||||
//console.log("Redirecting to: " + response.url);
|
||||
window.location.href = response.url;
|
||||
return;
|
||||
}
|
||||
if (response.status === 400 || response.status === 401) {
|
||||
alert("Login failed");
|
||||
cleartext();
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Error:', error);
|
||||
alert("An error occurred during login.");
|
||||
cleartext();
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
@@ -44,6 +44,77 @@ function fill_messagebanktablebody(vv) {
|
||||
$('#tablesize').text("Table Size: " + vv.length);
|
||||
}
|
||||
|
||||
/**
|
||||
* @typedef {Object} MessageBank
|
||||
* @property {string} Description - Description of the messagebank entry
|
||||
* @property {string} Language - Language code
|
||||
* @property {number} ANN_ID - ANN ID (1-100)
|
||||
* @property {string} Voice_Type - Voice type
|
||||
* @property {string} Message_Detail - Detailed message constructed from categories and phrases
|
||||
* @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 () {
|
||||
@@ -91,22 +162,24 @@ $(document).ready(function () {
|
||||
function refill_messageavailablevariables() {
|
||||
$messageavailablevariables.empty();
|
||||
categories.forEach(cat => {
|
||||
$messageavailablevariables.append(ListItem(`[${cat}]`));
|
||||
if ("Phrase" === cat) return; // skip Phrase category
|
||||
let displayCat = `[${cat}]`;
|
||||
$messageavailablevariables.append(new Option(displayCat, displayCat));
|
||||
});
|
||||
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);
|
||||
|
||||
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 (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));
|
||||
//console.log(JSON.stringify(okdata));
|
||||
okdata.forEach(sb => {
|
||||
if (sb.description && sb.description.length > 0) {
|
||||
$messageavailablevariables.append(ListItem(`${sb.description} [${sb.TAG}]`));
|
||||
$messageavailablevariables.append($('<option>', { value: sb.tag, text: sb.description, title: sb.description }));
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -114,9 +187,9 @@ $(document).ready(function () {
|
||||
//alert("Error loading phrases from soundbank : " + errdata.message);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -196,83 +269,32 @@ $(document).ready(function () {
|
||||
reloadMessageBank(APIURL, () => fill_messagebanktablebody(window.messagebankdata));
|
||||
$btnClear.click(() => {
|
||||
DoClear(APIURL, "Messagebank", (okdata) => {
|
||||
reloadMessageBank(APIURL, () => fill_messagebanktablebody(window.messagebankdata) );
|
||||
reloadMessageBank(APIURL, () => fill_messagebanktablebody(window.messagebankdata));
|
||||
alert("Success clear messagebank : " + okdata.message);
|
||||
}, (errdata) => {
|
||||
alert("Error clear messagebank : " + errdata.message);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
$btnAdd.click(() => {
|
||||
|
||||
$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");
|
||||
$('#closemodalbutton').off('click').on('click', function () {
|
||||
console.log('Close button clicked')
|
||||
$modal.modal('hide');
|
||||
});
|
||||
$('#savemodalbutton').off('click').on('click', function () {
|
||||
console.log('Save button clicked')
|
||||
let mb = GetDataFromModal();
|
||||
if (!mb) {
|
||||
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, () => fill_messagebanktablebody(window.messagebankdata) );
|
||||
reloadMessageBank(APIURL, () => fill_messagebanktablebody(window.messagebankdata));
|
||||
alert("Success add new messagebank : " + okdata.message);
|
||||
}, (errdata) => {
|
||||
alert("Error add new messagebank : " + errdata.message);
|
||||
@@ -280,10 +302,7 @@ $(document).ready(function () {
|
||||
|
||||
$modal.modal('hide');
|
||||
});
|
||||
// event on Click close button
|
||||
$modal.off('click.messagebankclose').on('click.messagebankclose', '#messagebankclose', function () {
|
||||
$modal.modal('hide');
|
||||
});
|
||||
|
||||
});
|
||||
$btnRemove.click(() => {
|
||||
if (window.selectedmessagerow) {
|
||||
@@ -301,7 +320,7 @@ $(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) => {
|
||||
reloadMessageBank(APIURL, () => fill_messagebanktablebody(window.messagebankdata) );
|
||||
reloadMessageBank(APIURL, () => fill_messagebanktablebody(window.messagebankdata));
|
||||
alert("Success delete messagebank : " + okdata.message);
|
||||
}, (errdata) => {
|
||||
alert("Error delete messagebank : " + errdata.message);
|
||||
@@ -336,76 +355,42 @@ $(document).ready(function () {
|
||||
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));
|
||||
});
|
||||
if (mb.message_Detail && mb.message_Detail.length > 0) {
|
||||
if (mb.message_TAGS && mb.message_TAGS.length > 0) {
|
||||
let tags = mb.message_TAGS.split(" ");
|
||||
tags.forEach((tag, idx) => {
|
||||
console.log(`Restoring tag[${idx}]: ${tag}`);
|
||||
let tagLower = tag.toLowerCase();
|
||||
// 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}`);
|
||||
$messageselectedvariables.append($(this).clone());
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 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");
|
||||
$('#savemodalbutton').off('click').on('click', function () {
|
||||
console.log('Save button clicked')
|
||||
let mbUpdate = GetDataFromModal();
|
||||
if (!mbUpdate) {
|
||||
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, () => fill_messagebanktablebody(window.messagebankdata) );
|
||||
reloadMessageBank(APIURL, () => fill_messagebanktablebody(window.messagebankdata));
|
||||
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 () {
|
||||
$('#closemodalbutton').off('click').on('click', function () {
|
||||
console.log('Close button clicked')
|
||||
$modal.modal('hide');
|
||||
});
|
||||
|
||||
@@ -417,7 +402,7 @@ $(document).ready(function () {
|
||||
});
|
||||
$btnImport.click(() => {
|
||||
DoImport(APIURL, (okdata) => {
|
||||
reloadMessageBank(APIURL, () => fill_messagebanktablebody(window.messagebankdata) );
|
||||
reloadMessageBank(APIURL, () => fill_messagebanktablebody(window.messagebankdata));
|
||||
alert("Success import messagebank : " + okdata.message);
|
||||
}, (errdata) => {
|
||||
alert("Error importing messagebank from XLSX : " + errdata.message);
|
||||
|
||||
Reference in New Issue
Block a user