diff --git a/.idea/deviceManager.xml b/.idea/deviceManager.xml index 91f9558..eebfe8e 100644 --- a/.idea/deviceManager.xml +++ b/.idea/deviceManager.xml @@ -5,7 +5,7 @@ diff --git a/config.properties b/config.properties index d5a804e..02d4505 100644 --- a/config.properties +++ b/config.properties @@ -1,11 +1,12 @@ #Configuration file -#Fri Oct 24 10:57:19 WIB 2025 +#Mon Oct 27 15:51:50 WIB 2025 database.host=localhost database.name=aas database.password=admin database.port=3306 database.user=admin -remark.FLD=Gate Change [4] +default.voice.type=VOICE_1 +remark.FLD=Arrival [9] remark.GBD=Second Call [2] remark.GFC=Last Call [3] remark.GOP=First Call [1] diff --git a/html/webpage/assets/css/bss-overrides.css b/html/webpage/assets/css/bss-overrides.css index e4c6b12..f977d16 100644 --- a/html/webpage/assets/css/bss-overrides.css +++ b/html/webpage/assets/css/bss-overrides.css @@ -46,6 +46,10 @@ margin-top: 0!important; } +.mt-3 { + margin-top: 1rem!important; +} + .me-2 { margin-right: .5rem!important; } diff --git a/html/webpage/assets/css/styles.css b/html/webpage/assets/css/styles.css index 0f45c33..3fc979b 100644 --- a/html/webpage/assets/css/styles.css +++ b/html/webpage/assets/css/styles.css @@ -128,6 +128,66 @@ body { width: 25%; } +.class30 { + width: 30%; +} + +.class35 { + width: 35%; +} + +.class40 { + width: 40%; +} + +.class45 { + width: 45%; +} + +.class50 { + width: 50%; +} + +.class55 { + width: 55%; +} + +.class60 { + width: 60%; +} + +.class65 { + width: 65%; +} + +.class70 { + width: 70%; +} + +.class75 { + width: 75%; +} + +.class80 { + width: 80%; +} + +.class85 { + width: 85%; +} + +.class90 { + width: 90%; +} + +.class95 { + width: 95%; +} + +.class100 { + width: 100%; +} + .card-login { background-color: white; box-shadow: rgba(0, 0, 0, 0.15) 0px 15px 25px, rgba(0, 0, 0, 0.05) 0px 5px 10px; @@ -302,8 +362,8 @@ table { border: 2px dashed #ccc; border-radius: 20px; width: 400px; - height: 200px; - display: flex; + height: 310px; + /*display: flex;*/ justify-content: center; align-items: center; font-family: sans-serif; @@ -318,3 +378,58 @@ table { color: #0d6efd; } +#table_user_management { + table-layout: fixed; + width: 100%; +} + +#table_user_management th, #table_user_management td { + text-overflow: ellipsis; + white-space: normal !important; + word-wrap: break-word; + overflow-wrap: anywhere; +} + +.pad-result { + padding-left: 1rem; + padding-right: 1rem; + border-radius: 8px; +} + +.pad-icon-menu { + margin-top: -0.3rem; +} + +.div-file-list { + height: 20vh; + overflow-y: auto; + overflow-x: hidden; + padding: 10px; + /*border: dashed;*/ +} + +.pad-select { + margin-top: 0.3rem; +} + +.div-label-drop { + display: flex; + text-align: center; + justify-content: center; + padding-top: 2rem; + /*padding-bottom: 1.5rem;*/ +} + +.pad-drop { + padding-top: 1rem; +} + +.div-search { + padding: 0.5rem; +} + +.hr-dashed { + border: none; + border-bottom: 1px dashed #000000; +} + diff --git a/html/webpage/assets/js/filemanagement.js b/html/webpage/assets/js/filemanagement.js new file mode 100644 index 0000000..3deab66 --- /dev/null +++ b/html/webpage/assets/js/filemanagement.js @@ -0,0 +1,293 @@ + +/** + * Load setting language dropdown + */ +function load_setting_language() { + $("#setting_language").empty().off('change'); + + getLanguages(() => { + window.languages.forEach((lang) => { + let $option = $("").attr("value", lang).text(lang); + $("#setting_language").append($option); + }); + $("#setting_language").on('change', function () { + change_droparea_enable(); + }); + }); +} + +/** + * Load setting category dropdown + */ +function load_setting_category() { + $("#setting_category").empty().off('change'); + getCategories(() => { + window.categories.forEach((cat) => { + let $option = $("").attr("value", cat).text(cat); + $("#setting_category").append($option); + }); + $("#setting_category").on('change', function () { + change_droparea_enable(); + }); + }); +} + +/** + * Load setting voice dropdown + */ +function load_setting_voice() { + $("#setting_voice").empty().off('change'); + getVoiceTypes(() => { + window.voiceTypes.forEach((voice) => { + let $option = $("").attr("value", voice).text(voice); + $("#setting_voice").append($option); + }); + $("#setting_voice").on('change', function () { + change_droparea_enable(); + }); + }); +} + +/** + * Get soundbank files from server based on category, language, and voice + * @param {String} category + * @param {String} language + * @param {String} voice + */ +function getSoundBankFiles(category, language, voice) { + let URL = `FileManager/ListSoundbank/${language}/${voice}/${category}`; + fetchAPI(URL, "GET", {}, null, (okdata) => { + $("#file-list").empty(); + if (Array.isArray(okdata) && okdata.length > 0) { + okdata.forEach((file) => { + // get only the file name from the full path + let fileName = file.split(/[/\\]/).pop(); + let $li = $("
  • ").text(fileName); + $("#file-list").append($li); + }); + } + }, (errdata) => { + alert("Error getting soundbank files : " + errdata.message); + }); +} + +/** + * Enable or disable drop area based on selections + */ +function change_droparea_enable() { + let selected_category = $("#setting_category").val(); + let selected_language = $("#setting_language").val(); + let selected_voice = $("#setting_voice").val(); + $("#file-list").empty(); + $("#searchfilelist").val(""); + $("#searchfilelist").off('input').on('input', function () { + let searchTerm = $(this).val().toLowerCase(); + $("#file-list li").each(function () { + let fileName = $(this).text().toLowerCase(); + if (fileName.includes(searchTerm)) { + $(this).show(); + } else { + $(this).hide(); + } + }); + }); + console.log(`Selected Category: ${selected_category}, Language: ${selected_language}, Voice: ${selected_voice}`); + if (selected_category && selected_language && selected_voice) { + $("#drop-area").removeClass("disabled"); + getSoundBankFiles(selected_category, selected_language, selected_voice); + } else { + $("#drop-area").addClass("disabled"); + + } +} + + +/** + * Get Soundbank path from server + */ +function get_soundbank_path() { + $("#setting_path").val(""); + fetchAPI("Settings/SoundbankDirectory", "GET", {}, null, (okdata) => { + if (okdata.message && okdata.message.trim().length > 0) { + let path = okdata.message.trim(); + //console.log("Soundbank path retrieved: " + path); + $("#setting_path").val(path); + } + }, (errdata) => { + alert("Error getting soundbank path : " + errdata.message); + }); +} + +function download(path, filename) { + let downloadurl = `/api/FileManager/${path}`; + let reqdata = { filename: filename }; + fetch(downloadurl, { + method: 'POST', + headers: {}, + body: JSON.stringify(reqdata) + }) + .then(response => { + if (!response.ok) { + throw new Error("Network response was not ok"); + } + return response.blob(); + }) + .then(blob => { + const url = window.URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = filename; + document.body.appendChild(a); + a.click(); + a.remove(); + window.URL.revokeObjectURL(url); + }) + .catch(errdata => { + alert("Error downloading paging result file: " + errdata.message); + }); +} + +function get_pagingresult_files() { + const url = `FileManager/PagingResultList`; + $("#tbody_resultpaging").empty(); + fetchAPI(url, "GET", {}, null, (okdata) => { + if (Array.isArray(okdata) && okdata.length > 0) { + console.log("Paging result files: ", JSON.stringify(okdata)); + okdata.forEach((file) => { + let filename = file.split(/[/\\]/).pop(); + let $tr = $(""); + let $tdtitle = $("").text(filename); + // add button inside td to download the file + let $btndownload = $("").text("Download").addClass("btn btn-primary"); + $btndownload.on('click', function () { + download("DownloadPagingResultFile", filename); + }); + + let $tdbutton = $("").append($btndownload).addClass("text-center"); + $tr.append($tdtitle); + $tr.append($tdbutton); + $("#tbody_resultpaging").append($tr); + }); + } + }, (errdata) => { + alert("Error getting paging result files : " + errdata.message); + }); +} + +function get_soundbankresult_files() { + const url = `FileManager/SoundbankResultList`; + $("#tbody_resultsoundbank").empty(); + fetchAPI(url, "GET", {}, null, (okdata) => { + if (Array.isArray(okdata) && okdata.length > 0) { + console.log("Soundbank result files: ", JSON.stringify(okdata)); + okdata.forEach((file) => { + let filename = file.split(/[/\\]/).pop(); + let $tr = $(""); + let $tdtitle = $("").text(filename); + // add button inside td to download the file + let $btndownload = $("").text("Download").addClass("btn btn-primary"); + let $tdbutton = $("").append($btndownload).addClass("text-center"); + $btndownload.on('click', function () { + download("DownloadSoundbankResultFile", filename); + }); + $tr.append($tdtitle); + $tr.append($tdbutton); + $("#tbody_resultsoundbank").append($tr); + }); + } + }, (errdata) => { + alert("Error getting soundbank result files : " + errdata.message); + }); +} + + + +$(document).ready(function () { + console.log("filemanagement.js xx loaded"); + load_setting_category(); + load_setting_language(); + load_setting_voice(); + get_soundbank_path(); + setTimeout(() => { + change_droparea_enable(); + }, 1000); + get_pagingresult_files(); + get_soundbankresult_files(); + $("#save_directory").off('click').on('click', function () { + let new_path = $("#setting_path").val(); + if (new_path && new_path.trim().length > 0) { + fetchAPI("Settings/SoundbankDirectory", "POST", {}, { directory: new_path }, (okdata) => { + alert("Soundbank directory path saved successfully."); + }, (errdata) => { + alert("Error saving soundbank directory path : " + errdata.message); + }); + } else { + alert("Please enter a valid soundbank directory path."); + } + }); + $("#drop-area").on('dragover', function (e) { + e.preventDefault(); + e.stopPropagation(); + $(this).addClass('dragover'); + }).on('dragleave', function (e) { + e.preventDefault(); + e.stopPropagation(); + $(this).removeClass('dragover'); + }).on('drop', function (e) { + e.preventDefault(); + e.stopPropagation(); + $(this).removeClass('dragover'); + if ($(this).hasClass('disabled')) { + alert("Please select Category, Language, and Voice Type before uploading files."); + return; + } + let lang = $("#setting_language").val().trim(); + let category = $("#setting_category").val().trim(); + let voice = $("#setting_voice").val().trim(); + let files = e.originalEvent.dataTransfer.files; + if (lang && lang.length > 0) { + if (category && category.length > 0) { + if (voice && voice.length > 0) { + if (files.length > 0) { + // check if each file have type audio/wav , size more than 0, and name ends with .wav + let allValid = true; + for (let i = 0; i < files.length; i++) { + let file = files[i]; + if (file.type !== 'audio/wav' && !file.name.toLowerCase().endsWith('.wav')) { + allValid = false; + } + if (file.size <= 0) { + allValid = false; + } + } + if (allValid) { + if (confirm(`Are you sure want to upload ${files.length} file(s) to the soundbank directory for Category: ${$("#setting_category").val()}, Language: ${$("#setting_language").val()}, Voice Type: ${$("#setting_voice").val()}?`)) { + let url = `api/Settings/UploadSoundbank/${lang}/${voice}/${category}`; + const formdata = new FormData(); + for (let i = 0; i < files.length; i++) { + formdata.append('files', files[i]); + } + try { + fetch(url, { + method: 'POST', + body: formdata + }) + .then(response => response.json()) + .then(okdata => { + console.log("Upload result: ", JSON.stringify(okdata)); + }) + .catch(errdata => { + alert("Error uploading files to soundbank directory : " + errdata.message); + }); + } catch (err) { + alert("Error preparing file upload: " + err.message); + } + } + } else alert("Please upload only valid WAV audio files. Type must be audio/wav and size must be more than 0 bytes."); + } else alert("No files detected for upload."); + } else alert("Please select Voice Type before uploading files."); + } else alert("Please select Category before uploading files."); + } else alert("Please select Language before uploading files."); + + }); +}); \ No newline at end of file diff --git a/html/webpage/assets/js/script.js b/html/webpage/assets/js/script.js index aa0b862..90e42a7 100644 --- a/html/webpage/assets/js/script.js +++ b/html/webpage/assets/js/script.js @@ -444,8 +444,15 @@ $(document).ready(function () { let json = JSON.parse(data); if (Array.isArray(json) && json.length > 0) { json.forEach((net) => { - if (result.length > 0) result += "\n" + if (net){ + if (net.displayName && net.displayName.length>0){ + if (net.ipV4addr && Array.isArray(net.ipV4addr) && net.ipV4addr.length>0){ + if (result.length > 0) result += "\n" result += `${net.displayName} (${net.ipV4addr.join(";")}) TX:${(net.txSpeed / 1024).toFixed(1)} KB/s RX:${(net.rxSpeed / 1024).toFixed(1)} KB/s` + } + } + } + }) } else result = "N/A"; $('#networkstatus').text(result) @@ -585,6 +592,15 @@ $(document).ready(function () { } }); }) + $('#filemanagement').click(() => { + sidemenu.hide(); + $('#content').load('filemanagement.html', function (response, status, xhr) { + if (status === "success") { + console.log("File Management content loaded successfully"); + // pindah ke filemanagement.js + } + }); + }); $('#logoutlink').click(() => { //window.location.href = "login.html" fetch("/logout", {method: 'GET'}) diff --git a/html/webpage/assets/js/setting.js b/html/webpage/assets/js/setting.js index 1dd1577..afa3aa3 100644 --- a/html/webpage/assets/js/setting.js +++ b/html/webpage/assets/js/setting.js @@ -1,82 +1,7 @@ -/** - * Load setting language dropdown - */ -function load_setting_language() { - $("#setting_language").empty().off('change'); - getLanguages(() => { - window.languages.forEach((lang) => { - let $option = $("").attr("value", lang).text(lang); - $("#setting_language").append($option); - }); - $("#setting_language").on('change', function () { - change_droparea_enable(); - }); - }); -} -/** - * Load setting category dropdown - */ -function load_setting_category() { - $("#setting_category").empty().off('change'); - getCategories(() => { - window.categories.forEach((cat) => { - let $option = $("").attr("value", cat).text(cat); - $("#setting_category").append($option); - }); - $("#setting_category").on('change', function () { - change_droparea_enable(); - }); - }); -} -/** - * Load setting voice dropdown - */ -function load_setting_voice() { - $("#setting_voice").empty().off('change'); - getVoiceTypes(() => { - window.voiceTypes.forEach((voice) => { - let $option = $("").attr("value", voice).text(voice); - $("#setting_voice").append($option); - }); - $("#setting_voice").on('change', function () { - change_droparea_enable(); - }); - }); -} - -/** - * Get Soundbank path from server - */ -function get_soundbank_path() { - $("#setting_path").val(""); - fetchAPI("Settings/SoundbankDirectory", "GET", {}, null, (okdata) => { - if (okdata.message && okdata.message.trim().length > 0) { - let path = okdata.message.trim(); - //console.log("Soundbank path retrieved: " + path); - $("#setting_path").val(path); - } - }, (errdata) => { - alert("Error getting soundbank path : " + errdata.message); - }); -} - -/** - * Enable or disable drop area based on selections - */ -function change_droparea_enable() { - let selected_category = $("#setting_category").val(); - let selected_language = $("#setting_language").val(); - let selected_voice = $("#setting_voice").val(); - if (selected_category && selected_language && selected_voice) { - $("#drop-area").removeClass("disabled"); - } else { - $("#drop-area").addClass("disabled"); - } -} /** * Load message bank data into selection dropdowns @@ -90,9 +15,7 @@ function load_messagebank(cbOK = null) { // get messagebank data from server, which contains [FLIGHT_NUMBER] let messageData = [...new Set(window.messagebankdata.filter(mb => mb.message_Detail.includes('[FLIGHT_NUMBER]')).map(mb => `${mb.description} [${mb.aNN_ID}]`))]; - //console.log("Message bank data with [FLIGHT_NUMBER]: ", messageData); messageData.forEach((item) => { - //console.log("Adding option: " + item); $("#input_GOP").append($("").attr("value", item).text(item)); $("#input_GBD").append($("").attr("value", item).text(item)); $("#input_GFC").append($("").attr("value", item).text(item)); @@ -105,51 +28,41 @@ function load_messagebank(cbOK = null) { function load_remark_selection() { fetchAPI("Settings/FISCode", "GET", {}, null, (okdata) => { - //console.log("FIS codes retrieved: ", JSON.stringify(okdata)); $("#input_GOP").val(okdata.gop) $("#input_GBD").val(okdata.gbd); $("#input_GFC").val(okdata.gfc); $("#input_FLD").val(okdata.fld); + $("#input_defaultvoice").val(okdata.defaultvoice); }, (errdata) => { alert("Error getting FIS codes : " + errdata.message); }); } +function load_default_voice(){ + $("#input_defaultvoice").empty(); + window.voiceTypes.forEach((voice) => { + $("#input_defaultvoice").append($("").attr("value", voice).text(voice)); + }); +} + $(document).ready(function () { console.log("setting.js loaded"); - - - $("#save_directory").off('click').on('click', function () { - let new_path = $("#setting_path").val(); - if (new_path && new_path.trim().length > 0) { - fetchAPI("Settings/SoundbankDirectory", "POST", {}, { directory: new_path }, (okdata) => { - alert("Soundbank directory path saved successfully."); - }, (errdata) => { - alert("Error saving soundbank directory path : " + errdata.message); - }); - } else { - alert("Please enter a valid soundbank directory path."); - } - }); - - - get_soundbank_path(); - load_setting_category(); - load_setting_language(); - load_setting_voice(); + load_default_voice(); load_messagebank(() => load_remark_selection()); $("#fiscodesave").off('click').on('click', function () { let gop = $("#input_GOP").val(); let gbd = $("#input_GBD").val(); let gfc = $("#input_GFC").val(); let fld = $("#input_FLD").val(); - if (gop && gbd && gfc && fld) { + let voice = $("#input_defaultvoice").val(); + if (gop && gbd && gfc && fld && voice) { let data = { GOP: gop, GBD: gbd, GFC: gfc, - FLD: fld + FLD: fld, + defaultvoice: voice }; fetchAPI("Settings/FISCode", "POST", {}, data, (okdata) => { alert("FIS codes saved successfully."); @@ -157,75 +70,11 @@ $(document).ready(function () { alert("Error saving FIS codes : " + errdata.message); }); } else { - alert("Please select all FIS codes (GOP, GBD, GFC, FLD) before saving."); + alert("Please select all FIS codes (GOP, GBD, GFC, FLD) and Default Voice before saving."); } }); - $("#drop-area").on('dragover', function (e) { - e.preventDefault(); - e.stopPropagation(); - $(this).addClass('dragover'); - }).on('dragleave', function (e) { - e.preventDefault(); - e.stopPropagation(); - $(this).removeClass('dragover'); - }).on('drop', function (e) { - e.preventDefault(); - e.stopPropagation(); - $(this).removeClass('dragover'); - if ($(this).hasClass('disabled')) { - alert("Please select Category, Language, and Voice Type before uploading files."); - return; - } - let lang = $("#setting_language").val().trim(); - let category = $("#setting_category").val().trim(); - let voice = $("#setting_voice").val().trim(); - let files = e.originalEvent.dataTransfer.files; - if (lang && lang.length > 0) { - if (category && category.length > 0) { - if (voice && voice.length > 0) { - if (files.length > 0) { - // check if each file have type audio/wav , size more than 0, and name ends with .wav - let allValid = true; - for (let i = 0; i < files.length; i++) { - let file = files[i]; - if (file.type !== 'audio/wav' && !file.name.toLowerCase().endsWith('.wav')) { - allValid = false; - } - if (file.size <= 0) { - allValid = false; - } - } - if (allValid) { - if (confirm(`Are you sure want to upload ${files.length} file(s) to the soundbank directory for Category: ${$("#setting_category").val()}, Language: ${$("#setting_language").val()}, Voice Type: ${$("#setting_voice").val()}?`)) { - let url = `api/Settings/UploadSoundbank/${lang}/${voice}/${category}`; - const formdata = new FormData(); - for (let i = 0; i < files.length; i++) { - formdata.append('files', files[i]); - } - try{ - fetch(url, { - method: 'POST', - body: formdata - }) - .then(response => response.json()) - .then(okdata => { - console.log("Upload result: ", JSON.stringify(okdata)); - }) - .catch(errdata => { - alert("Error uploading files to soundbank directory : " + errdata.message); - }); - } catch(err){ - alert("Error preparing file upload: " + err.message); - } - } - } else alert("Please upload only valid WAV audio files. Type must be audio/wav and size must be more than 0 bytes."); - } else alert("No files detected for upload."); - } else alert("Please select Voice Type before uploading files."); - } else alert("Please select Category before uploading files."); - } else alert("Please select Language before uploading files."); - - }); + }); \ No newline at end of file diff --git a/html/webpage/broadcastzones.html b/html/webpage/broadcastzones.html index ef34350..57f3239 100644 --- a/html/webpage/broadcastzones.html +++ b/html/webpage/broadcastzones.html @@ -4,7 +4,7 @@ - AAS_NewGen_17OKT25 + AAS_NewGen_27OKT25 diff --git a/html/webpage/filemanagement.html b/html/webpage/filemanagement.html new file mode 100644 index 0000000..8c1f2f0 --- /dev/null +++ b/html/webpage/filemanagement.html @@ -0,0 +1,127 @@ + + + + + + + AAS_NewGen_27OKT25 + + + + + + + +
    +
    +

    File Management

    +
    +
    +
    +
    +
    +
    +

    Upload Soundbank

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +

    List Files : 

    +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +

      Soundbank Result

      +
      +
      + + + + + + + + + + + + + +
      File NameAction
      Result Soundbank 001
      +
      +
      +
      +

      Paging Result

      +
      +
      + + + + + + + + + + + + + +
      File NameAction
      Result Paging 001
      +
      +
      + + + + + + \ No newline at end of file diff --git a/html/webpage/home.html b/html/webpage/home.html index d9d349e..4c63b1e 100644 --- a/html/webpage/home.html +++ b/html/webpage/home.html @@ -34,7 +34,7 @@ - - - - - +