commit 09/02/2026

This commit is contained in:
2026-02-09 17:03:50 +07:00
parent eed96ca8c0
commit e18976ace3
9 changed files with 249 additions and 99 deletions

View File

@@ -78,6 +78,7 @@ $(document).ready(function () {
$('#languagebanktablebody').empty();
window.selectedlanguagerow = null;
let $btnClear = $('#btnClear');
let $btndefaultinit = $('#btnDefaultInit');
let $btnAdd = $('#btnAdd');
let $btnRemove = $('#btnRemove');
let $btnEdit = $('#btnEdit');
@@ -86,7 +87,6 @@ $(document).ready(function () {
$btnRemove.prop('disabled', true);
$btnEdit.prop('disabled', true);
let APIURL = "LanguageLink/";
let $findlanguage = $('#findlanguage');
let $modal = $('#languagemodal');
let $langid = $modal.find('#languagelinkindex');
let $langtag = $modal.find('#languagelinktag');
@@ -121,18 +121,6 @@ $(document).ready(function () {
$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);
$btnClear.click(() => {
DoClear(APIURL, "LanguageLink", (okdata) => {
@@ -141,8 +129,18 @@ $(document).ready(function () {
}, (errdata) => {
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(() => {
// show modal with id 'languagemodal'
$modal.modal('show');

View File

@@ -34,7 +34,6 @@ function fill_schedulebanktablebody(vv) {
dtScheduleBank.rows.add(vv);
dtScheduleBank.draw();
$('#schedulebanktable tbody').off('click').on('click', 'tr', function () {
// if no data
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 () {
console.log("schedulebank.js loaded successfully");
$('#schedulebanktablebody').empty();
@@ -134,6 +135,7 @@ $(document).ready(function () {
if (dtScheduleBank === null) {
dtScheduleBank = new DataTable('#schedulebanktable', {
dom: 'Bfrtip',
data: [],
pageLength: 25,
columns: [
@@ -141,15 +143,60 @@ $(document).ready(function () {
{ title: "Description", data: "description" },
{ title: "Day", data: "day" },
{ title: "Time", data: "time" },
{ title: "Sound Path", data: "soundpath" },
{ title: "Message", data: "soundpath" },
{ title: "Repeat", data: "repeat" },
{ title: "Enable", data: "enable" },
{ title: "Broadcast Zones", data: "broadcastZones" },
{ 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');
// text input
@@ -244,38 +291,16 @@ $(document).ready(function () {
if ($(this).is(':checked')) {
$weeklyselect.prop('disabled', false);
$scheduledate.prop('disabled', true);
} else {
$weeklyselect.prop('disabled', true);
}
}
});
$schedulespecialdate.off('change').on('change', function () {
if ($(this).is(':checked')) {
$weeklyselect.prop('disabled', true);
$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);
reloadBroadcastZones();
getLanguages();
@@ -334,10 +359,11 @@ $(document).ready(function () {
BroadcastZones: broadcastZones,
Language: Language
};
console.log("Adding schedule: ", scheduleObj);
fetchAPI(APIURL + "Add", "POST", {}, scheduleObj, (okdata) => {
alert("Success add schedule: " + okdata.message);
reloadTimerBank(APIURL);
alert("Success add schedule: " + okdata.message);
}, (errdata) => {
alert("Error add schedule: " + errdata.message);
});
@@ -363,6 +389,7 @@ $(document).ready(function () {
broadcastZones: window.selectedschedulerow.broadcastZones,
language: window.selectedschedulerow.language
}
if (confirm(`Are you sure to delete schedule [${sr.index}] Description=${sr.description}?`)) {
fetchAPI(APIURL + "DeleteByIndex/" + sr.index, "DELETE", {}, null, (okdata) => {
reloadTimerBank(APIURL);
@@ -387,6 +414,7 @@ $(document).ready(function () {
BroadcastZones: window.selectedschedulerow.broadcastZones,
Language: window.selectedschedulerow.language
}
console.log("Editing schedule: ", sr);
if (confirm(`Are you sure to edit schedule [${sr.index}] Description=${sr.Description}?`)) {
$schedulemodal.modal('show');
clearScheduleModal();
@@ -399,12 +427,18 @@ $(document).ready(function () {
$scheduleminute.val(minute.toString());
$schedulemessage.val(sr.Soundpath).trigger('change');
$schedulerepeat.val(sr.Repeat);
$scheduleenable.prop('checked', sr.Enable.toLowerCase() === 'true');
$scheduleenable.prop('checked', sr.Enable);
$languageselect.val(sr.Language.split(';')).trigger('change');
$schedulezones.val(sr.BroadcastZones.split(';')).trigger('change');
switch (sr.Day) {
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;
case 'Sunday':
case 'Monday':
@@ -413,15 +447,25 @@ $(document).ready(function () {
case 'Thursday':
case 'Friday':
case 'Saturday':
$scheduleweekly.click();
$scheduleweekly.prop('checked', true);
$weeklyselect.val(sr.Day).trigger('change');
$weeklyselect.prop('disabled', false);
$scheduledate.prop('disabled', true);
break;
default:
console.log("Assuming special date for Day: ", sr.Day);
// check if the day is in format dd/mm/yyyy
// and set the special date radio button and date input
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.prop('disabled', false);
$weeklyselect.val(null).trigger('change');
$weeklyselect.prop('disabled', true);
}
}

View File

@@ -37,6 +37,11 @@ dtSoundbank = null;
*/
window.select2data = [];
$btnRemove = null;
$btnEdit = null;
$btnExport = null;
$btnfilecheck = null;
/**
* Reload sound bank from server
* @param {String} APIURL API URL endpoint, default "SoundBank/"
@@ -62,7 +67,18 @@ function reloadSoundBank(APIURL = "SoundBank/") {
*/
function fill_soundbanktablebody(vv) {
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.draw();
@@ -77,8 +93,8 @@ function fill_soundbanktablebody(vv) {
if ($(this).hasClass('row-selected')) {
$(this).removeClass('row-selected').find('td').css('background-color', '');
window.selectedsoundrow = null;
$('#btnRemove').prop('disabled', true);
$('#btnEdit').prop('disabled', true);
$btnRemove.prop('disabled', true);
$btnEdit.prop('disabled', true);
return;
}
@@ -87,8 +103,8 @@ function fill_soundbanktablebody(vv) {
$(this).addClass('row-selected').find('td').css('background-color', '#ffeeba');
window.selectedsoundrow = selected.data();
$('#btnRemove').prop('disabled', false);
$('#btnEdit').prop('disabled', false);
$btnRemove.prop('disabled', false);
$btnEdit.prop('disabled', false);
})
$('#tablesize').text("Table Size: " + vv.length);
@@ -146,7 +162,7 @@ function getFilenameFromPath(path) {
}
fileViewMode = 'all'; // all, valid, invalid
$(document).ready(function () {
console.log("soundbank.js loaded successfully");
@@ -154,9 +170,9 @@ $(document).ready(function () {
window.selectedsoundrow = null;
let $btnClear = $('#btnClear');
let $btnAdd = $('#btnAdd');
let $btnRemove = $('#btnRemove');
let $btnEdit = $('#btnEdit');
let $btnExport = $('#btnExport');
$btnRemove = $('#btnRemove');
$btnEdit = $('#btnEdit');
$btnExport = $('#btnExport');
let $btnImport = $('#btnImport');
$btnRemove.prop('disabled', true);
$btnEdit.prop('disabled', true);
@@ -171,9 +187,11 @@ $(document).ready(function () {
let selected_category = null;
let selected_language = null;
let selected_voicetype = null;
$btnfilecheck = $('#btnFileCheck');
if (dtSoundbank === null) {
dtSoundbank = new DataTable('#soundbanktable', {
dom: 'Bfrtip',
data: [],
pageLength: 25,
columns: [
@@ -184,9 +202,29 @@ $(document).ready(function () {
{ title: "Language", data: "language" },
{ title: "Type", data: "voiceType" },
{ 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);
// $('#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(() => {
DoClear(APIURL, "Soundbank", (okdata) => {
reloadSoundBank(APIURL);
@@ -447,4 +474,37 @@ $(document).ready(function () {
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);
});
});
});

View File

@@ -34,11 +34,12 @@
</div>
<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="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-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-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-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="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="btnImport" type="button">Import</button></div>
</div>
<div class="row">
<div class="col">

View File

@@ -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-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-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-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="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="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 class="row">
<div class="table-responsive">