commit 01/10/2025

This commit is contained in:
2025-10-01 13:57:20 +07:00
parent 54775641bb
commit c55db5e4f7
23 changed files with 895 additions and 517 deletions

View File

@@ -60,3 +60,20 @@
align-items: center; align-items: center;
} }
.pad-relay {
padding-left: 1.5rem;
padding-top: 0.5rem;
}
.pad-time {
margin: 0.7rem auto;
}
.pad-day {
margin-top: 0.5rem;
}
.class100 {
width: 100% !important;
}

View File

@@ -1,5 +1,6 @@
body { body {
background-color: #f8f9fd; background-color: #f8f9fd;
/*background-color: #edf1fb;*/
overflow-x: hidden; overflow-x: hidden;
width: 100%; width: 100%;
} }
@@ -13,8 +14,9 @@ body {
} }
.search { .search {
display: flex; /*display: flex;*/
align-items: center; /*align-items: center;*/
margin-top: -0.2rem;
} }
.text-header { .text-header {
@@ -188,3 +190,68 @@ nav-item:focus {
border: none; border: none;
} }
.pad-card {
padding-top: 1rem;
}
.pad-search {
padding-top: 0.5rem;
}
.pad-row-search {
margin-bottom: 0.7rem;
}
.bg-heading1 {
background-color: #c6d8ee;
color: #2d3578;
}
.bg-heading2 {
background-color: #dce5f4;
color: #2d3578;
}
.bg-heading3 {
background-color: #e9ecf8;
color: #2d3578;
}
.accordion-item {
/*background: rgba(255, 255, 255, 0.55);*/
/*backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);*/
/*border-radius: 16px;*/
/*box-shadow: 8px 8px 16px rgba(0, 0, 0, 0.12), -8px -8px 16px rgba(255, 255, 255, 0.6);*/
/*transition: all 0.3s ease;*/
}
.accordion-item.active {
/*background: rgba(45, 53, 120, 0.15);*/
/*box-shadow: inset 4px 4px 10px rgba(45, 53, 120, 0.25), inset -4px -4px 10px rgba(255, 255, 255, 0.8);*/
}
.bg-accordion {
border: white 2px;
/*border-radius: 10px;*/
background: #f8f9fd;
}
.card-channel {
border-radius: 12px;
background: #ffffff;
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
transition: transform 0.2s ease, box-shadow 0.2s ease;
border: #ffffff solid 2px !important;
/*padding-left: 2px;*/
/*padding-right: 5px;*/
padding-top: 12px;
padding-bottom: 12px;
}
.pad-accordion {
border-radius: 40px;
border: white solid 3px;
}

View File

@@ -11,13 +11,13 @@
* List of broadcast zones available * List of broadcast zones available
* @type {BroadcastZone[]} * @type {BroadcastZone[]}
*/ */
let BroadcastZoneList = []; window.BroadcastZoneList ??= [];
/** /**
* Currently selected broadcast zone row in the table * Currently selected broadcast zone row in the table
* @type {JQuery<HTMLElement>|null} * @type {JQuery<HTMLElement>|null}
*/ */
let selectedBroadcastZoneRow = null; window.selectedBroadcastZoneRow = null;
/** /**
* Fill broadcast zone table body with values * Fill broadcast zone table body with values
@@ -31,23 +31,23 @@ function fill_broadcastzonetablebody(vv) {
<td>${item.index}</td> <td>${item.index}</td>
<td>${item.description}</td> <td>${item.description}</td>
<td>${item.soundChannel}</td> <td>${item.soundChannel}</td>
<td>${item.box}</td> <td>${item.id}</td>
<td>${item.relay}</td> <td>${item.bp}</td>
</tr>`; </tr>`;
$('#broadcastzonetablebody').append(row); $('#broadcastzonetablebody').append(row);
let $addedrow = $('#broadcastzonetablebody tr:last'); let $addedrow = $('#broadcastzonetablebody tr:last');
$addedrow.click(function () { $addedrow.click(function () {
if (selectedBroadcastZoneRow) { if (window.selectedBroadcastZoneRow) {
selectedBroadcastZoneRow.find('td').css('background-color', ''); window.selectedBroadcastZoneRow.find('td').css('background-color', '');
if (selectedBroadcastZoneRow.is($(this))) { if (window.selectedBroadcastZoneRow.is($(this))) {
selectedBroadcastZoneRow = null; window.selectedBroadcastZoneRow = null;
$('#btnRemove').prop('disabled', true); $('#btnRemove').prop('disabled', true);
$('#btnEdit').prop('disabled', true); $('#btnEdit').prop('disabled', true);
return; return;
} }
} }
$(this).find('td').css('background-color', '#ffeeba'); $(this).find('td').css('background-color', '#ffeeba');
selectedBroadcastZoneRow = $(this); window.selectedBroadcastZoneRow = $(this);
$('#btnRemove').prop('disabled', false); $('#btnRemove').prop('disabled', false);
$('#btnEdit').prop('disabled', false); $('#btnEdit').prop('disabled', false);
}); });
@@ -60,12 +60,12 @@ function fill_broadcastzonetablebody(vv) {
* @param {String} APIURL API URL endpoint (default "BroadcastZones/") * @param {String} APIURL API URL endpoint (default "BroadcastZones/")
*/ */
function reloadBroadcastZones(APIURL = "BroadcastZones/") { function reloadBroadcastZones(APIURL = "BroadcastZones/") {
BroadcastZoneList = []; window.BroadcastZoneList = [];
fetchAPI(APIURL + "List", "GET", {}, null, (okdata) => { fetchAPI(APIURL + "List", "GET", {}, null, (okdata) => {
if (Array.isArray(okdata)) { if (Array.isArray(okdata)) {
//console.log("reloadBroadcastZones : ", okdata) //console.log("reloadBroadcastZones : ", okdata)
BroadcastZoneList = okdata; window.BroadcastZoneList.push(...okdata);
fill_broadcastzonetablebody(BroadcastZoneList); fill_broadcastzonetablebody(window.BroadcastZoneList);
} else console.log("reloadBroadcastZones: okdata is not array"); } else console.log("reloadBroadcastZones: okdata is not array");
}, (errdata) => { }, (errdata) => {
alert("Error loading broadcast zones : " + errdata.message); alert("Error loading broadcast zones : " + errdata.message);
@@ -74,7 +74,7 @@ function reloadBroadcastZones(APIURL = "BroadcastZones/") {
$(document).ready(function () { $(document).ready(function () {
console.log("broadcastzones.js loaded successfully"); console.log("broadcastzones.js loaded successfully");
selectedBroadcastZoneRow = null; window.selectedBroadcastZoneRow = null;
let $btnClear = $('#btnClear'); let $btnClear = $('#btnClear');
let $btnAdd = $('#btnAdd'); let $btnAdd = $('#btnAdd');
let $btnEdit = $('#btnEdit'); let $btnEdit = $('#btnEdit');
@@ -98,12 +98,12 @@ $(document).ready(function () {
$findzone.on('input', function () { $findzone.on('input', function () {
let searchTerm = $findzone.val().trim().toLowerCase(); let searchTerm = $findzone.val().trim().toLowerCase();
if (searchTerm.length > 0) { if (searchTerm.length > 0) {
selectedBroadcastZoneRow = null; window.selectedBroadcastZoneRow = null;
let filtered = broadcastzonedata.filter(item => item.description.toLowerCase().includes(searchTerm) || item.box.toLowerCase().includes(searchTerm) || item.soundChannel.toLowerCase().includes(searchTerm) || item.relay.toLowerCase().includes(searchTerm)); let filtered = window.BroadcastZoneList.filter(item => item.description.toLowerCase().includes(searchTerm) || item.id.toLowerCase().includes(searchTerm) || item.soundChannel.toLowerCase().includes(searchTerm) || item.bp.toLowerCase().includes(searchTerm));
fill_broadcastzonetablebody(filtered); fill_broadcastzonetablebody(filtered);
} else { } else {
selectedBroadcastZoneRow = null; window.selectedBroadcastZoneRow = null;
fill_broadcastzonetablebody(broadcastzonedata); fill_broadcastzonetablebody(window.BroadcastZoneList);
} }
}); });
@@ -204,8 +204,8 @@ $(document).ready(function () {
}); });
$btnRemove.click(() => { $btnRemove.click(() => {
if (selectedBroadcastZoneRow) { if (window.selectedBroadcastZoneRow) {
let cells = selectedBroadcastZoneRow.find('td'); let cells = window.selectedBroadcastZoneRow.find('td');
/** @type {BroadcastZone} */ /** @type {BroadcastZone} */
let bz = { let bz = {
index: cells.eq(0).text(), index: cells.eq(0).text(),
@@ -226,8 +226,8 @@ $(document).ready(function () {
}); });
$btnEdit.click(() => { $btnEdit.click(() => {
if (selectedBroadcastZoneRow) { if (window.selectedBroadcastZoneRow) {
let cells = selectedBroadcastZoneRow.find('td'); let cells = window.selectedBroadcastZoneRow.find('td');
/** @type {BroadcastZone} */ /** @type {BroadcastZone} */
let bz = { let bz = {
index: cells.eq(0).text(), index: cells.eq(0).text(),
@@ -236,15 +236,15 @@ $(document).ready(function () {
Box: cells.eq(3).text(), Box: cells.eq(3).text(),
Relay: cells.eq(4).text() Relay: cells.eq(4).text()
}; };
if (confirm(`Are you sure to edit broadcast zone [${bz.index}] Description=${bz.description} SoundChannel=${bz.SoundChannel} Box=${bz.Box} Relay=${bz.Relay}?`)) { if (confirm(`Are you sure to edit broadcast zone [${bz.index}] Description=${bz.description} SoundChannel=${bz.SoundChannel} Box=${bz.id} Relay=${bz.bp}?`)) {
$broadcastzonemodal.modal('show'); $broadcastzonemodal.modal('show');
clearBroadcastZoneModal(); clearBroadcastZoneModal();
$broadcastzoneindex.val(bz.index); $broadcastzoneindex.val(bz.index);
$broadcastzonedescription.val(bz.description); $broadcastzonedescription.val(bz.description);
$broadcastzonesoundchannel.val(bz.SoundChannel); $broadcastzonesoundchannel.val(bz.SoundChannel);
$broadcastzonebox.val(bz.Box); $broadcastzonebox.val(bz.id);
if (bz.Relay) { if (bz.bp) {
bz.Relay.split(';').forEach(relayId => { bz.bp.split(';').forEach(relayId => {
let id = parseInt(relayId, 10); let id = parseInt(relayId, 10);
cbRelay(id).prop('checked', true); cbRelay(id).prop('checked', true);
}); });

View File

@@ -9,12 +9,12 @@
/** List of Languagebank data loaded from server /** List of Languagebank data loaded from server
* @type {LanguageBank[]} * @type {LanguageBank[]}
*/ */
let languagebankdata = []; window.languagebankdata = [];
/** /**
* Currently selected languagebank row in the table * Currently selected languagebank row in the table
* @type {JQuery<HTMLElement>|null} * @type {JQuery<HTMLElement>|null}
*/ */
let selectedlanguagerow = null; window.selectedlanguagerow = null;
/** /**
* Fill languagebank table body with values * Fill languagebank table body with values
@@ -32,17 +32,17 @@ function fill_languagebanktablebody(vv) {
$('#languagebanktablebody').append(row); $('#languagebanktablebody').append(row);
let $addedrow = $('#languagebanktablebody tr:last'); let $addedrow = $('#languagebanktablebody tr:last');
$addedrow.click(function () { $addedrow.click(function () {
if (selectedlanguagerow) { if (window.selectedlanguagerow) {
selectedlanguagerow.find('td').css('background-color', ''); window.selectedlanguagerow.find('td').css('background-color', '');
if (selectedlanguagerow.is($(this))) { if (window.selectedlanguagerow.is($(this))) {
selectedlanguagerow = null; window.selectedlanguagerow = null;
$('#btnRemove').prop('disabled', true); $('#btnRemove').prop('disabled', true);
$('#btnEdit').prop('disabled', true); $('#btnEdit').prop('disabled', true);
return; return;
} }
} }
$addedrow.find('td').css('background-color', '#ffeeba'); $addedrow.find('td').css('background-color', '#ffeeba');
selectedlanguagerow = $addedrow; window.selectedlanguagerow = $addedrow;
$('#btnRemove').prop('disabled', false); $('#btnRemove').prop('disabled', false);
$('#btnEdit').prop('disabled', false); $('#btnEdit').prop('disabled', false);
}); });
@@ -55,12 +55,12 @@ function fill_languagebanktablebody(vv) {
* @param {string} APIURL API URL endpoint, default "LanguageLink/" * @param {string} APIURL API URL endpoint, default "LanguageLink/"
*/ */
function reloadLanguageBank(APIURL = "LanguageLink/") { function reloadLanguageBank(APIURL = "LanguageLink/") {
languagebankdata = []; window.languagebankdata = [];
fetchAPI(APIURL + "List", "GET", {}, null, (okdata) => { fetchAPI(APIURL + "List", "GET", {}, null, (okdata) => {
if (Array.isArray(okdata)) { if (Array.isArray(okdata)) {
languagebankdata = okdata; window.languagebankdata.push(...okdata);
selectedlanguagerow = null; window.selectedlanguagerow = null;
fill_languagebanktablebody(languagebankdata); fill_languagebanktablebody(window.languagebankdata);
} }
}, (errdata) => { }, (errdata) => {
alert("Error loading languagebank : " + errdata.message); alert("Error loading languagebank : " + errdata.message);
@@ -71,7 +71,7 @@ $(document).ready(function () {
console.log('languagebank.js loaded'); console.log('languagebank.js loaded');
$('#languagebanktablebody').empty(); $('#languagebanktablebody').empty();
selectedlanguagerow = null; window.selectedlanguagerow = null;
let $btnClear = $('#btnClear'); let $btnClear = $('#btnClear');
let $btnAdd = $('#btnAdd'); let $btnAdd = $('#btnAdd');
let $btnRemove = $('#btnRemove'); let $btnRemove = $('#btnRemove');
@@ -106,12 +106,12 @@ $(document).ready(function () {
$findlanguage.on('input', function () { $findlanguage.on('input', function () {
let searchTerm = $findlanguage.val().toLowerCase(); let searchTerm = $findlanguage.val().toLowerCase();
if (searchTerm.length > 0) { if (searchTerm.length > 0) {
selectedlanguagerow = null; window.selectedlanguagerow = null;
let filtered = languagebankdata.filter(item => item.tag.toLowerCase().includes(searchTerm) || item.language.toLowerCase().includes(searchTerm)); let filtered = window.languagebankdata.filter(item => item.tag.toLowerCase().includes(searchTerm) || item.language.toLowerCase().includes(searchTerm));
fill_languagebanktablebody(filtered); fill_languagebanktablebody(filtered);
} else { } else {
selectedlanguagerow = null; window.selectedlanguagerow = null;
fill_languagebanktablebody(languagebankdata); fill_languagebanktablebody(window.languagebankdata);
} }
}); });
@@ -171,8 +171,8 @@ $(document).ready(function () {
}); });
}); });
$btnRemove.click(() => { $btnRemove.click(() => {
if (selectedlanguagerow) { if (window.selectedlanguagerow) {
let cells = selectedlanguagerow.find('td'); let cells = window.selectedlanguagerow.find('td');
/** @type {Language} */ /** @type {Language} */
let ll = { let ll = {
index: cells.eq(0).text(), index: cells.eq(0).text(),
@@ -190,8 +190,8 @@ $(document).ready(function () {
} }
}); });
$btnEdit.click(() => { $btnEdit.click(() => {
if (selectedlanguagerow) { if (window.selectedlanguagerow) {
let cells = selectedlanguagerow.find('td'); let cells = window.selectedlanguagerow.find('td');
/** @type {Language} */ /** @type {Language} */
let ll = { let ll = {
index: cells.eq(0).text(), index: cells.eq(0).text(),

View File

@@ -10,7 +10,7 @@
/** List of Log data loaded from server /** List of Log data loaded from server
* @type {Log[]} * @type {Log[]}
*/ */
let logdata = []; window.logdata = [];
/** /**
* Fill log table body with values * Fill log table body with values
@@ -18,9 +18,11 @@ let logdata = [];
*/ */
function fill_logtablebody(vv) { function fill_logtablebody(vv) {
$('#logtablebody').empty(); $('#logtablebody').empty();
if (!Array.isArray(vv) || vv.length === 0) {
$('#btnExport').prop('disabled', true); $('#btnExport').prop('disabled', true);
$('#searchfilter').prop('disabled', true); return;
if (!Array.isArray(vv) || vv.length === 0) return; }
vv.forEach(item => { vv.forEach(item => {
const row = `<tr> const row = `<tr>
<td>${item.index}</td> <td>${item.index}</td>
@@ -33,7 +35,6 @@ function fill_logtablebody(vv) {
}); });
$('#tablesize').text("Table Size: " + vv.length); $('#tablesize').text("Table Size: " + vv.length);
$('#btnExport').prop('disabled', false); $('#btnExport').prop('disabled', false);
$('#searchfilter').prop('disabled', false);
} }
/** /**
@@ -47,10 +48,11 @@ function reloadLogs(APIURL = "Log/", date, filter) {
date: date, date: date,
filter: filter filter: filter
}) })
window.logdata = [];
fetchAPI(APIURL + "List?" + params.toString(), "GET", {}, null, (okdata) => { fetchAPI(APIURL + "List?" + params.toString(), "GET", {}, null, (okdata) => {
if (Array.isArray(okdata)) { if (Array.isArray(okdata)) {
logdata = okdata; window.logdata.push(...okdata);
fill_logtablebody(okdata); fill_logtablebody(window.logdata);
} }
}, (errdata) => { }, (errdata) => {
alert("Error loading logs : " + errdata.message); alert("Error loading logs : " + errdata.message);
@@ -59,26 +61,22 @@ function reloadLogs(APIURL = "Log/", date, filter) {
$(document).ready(function () { $(document).ready(function () {
console.log("log.js ready"); console.log("log.js ready");
const $logdate = $('#logdate');
const $searchfilter = $('#searchfilter');
const $logtable = $('#logtablebody')
const $btnExport = $('#btnExport');
let selectedlogdate = ""; let selectedlogdate = "";
let logfilter = ""; let logfilter = "";
let APIURL = "Log/"; let APIURL = "Log/";
$logtable.empty(); $('#logtablebody').empty();
if (!$logdate.val()) { if (!$('#logdate').val()) {
const today = new Date(); const today = new Date();
const dd = String(today.getDate()).padStart(2, '0'); const dd = String(today.getDate()).padStart(2, '0');
const mm = String(today.getMonth() + 1).padStart(2, '0'); const mm = String(today.getMonth() + 1).padStart(2, '0');
const yyyy = today.getFullYear(); const yyyy = today.getFullYear();
$logdate.val(`${yyyy}-${mm}-${dd}`); $('#logdate').val(`${yyyy}-${mm}-${dd}`);
selectedlogdate = `${dd}-${mm}-${yyyy}`; selectedlogdate = `${dd}-${mm}-${yyyy}`;
reloadLogs(APIURL, selectedlogdate, logfilter); reloadLogs(APIURL, selectedlogdate, logfilter);
} }
$logdate.off('change').on('change', function () { $('#logdate').off('change').on('change', function () {
const selected = $(this).val(); const selected = $(this).val();
if (selected) { if (selected) {
const [year, month, day] = selected.split('-'); const [year, month, day] = selected.split('-');
@@ -87,11 +85,11 @@ $(document).ready(function () {
} }
}); });
$searchfilter.off('input').on('input', function () { $('#searchfilter').off('input').on('input', function () {
logfilter = $(this).val(); logfilter = $(this).val();
reloadLogs(APIURL, selectedlogdate, logfilter); reloadLogs(APIURL, selectedlogdate, logfilter);
}); });
$btnExport.off('click').on('click', function () { $('#btnExport').off('click').on('click', function () {
DoExport(APIURL, "log.xlsx", { date: selectedlogdate, filter: logfilter }); DoExport(APIURL, "log.xlsx", { date: selectedlogdate, filter: logfilter });
}); });
}); });

View File

@@ -13,12 +13,12 @@
* List of Messagebank data loaded from server * List of Messagebank data loaded from server
* @type {MessageBank[]} * @type {MessageBank[]}
*/ */
let messagebankdata = []; window.messagebankdata ??= [];
/** /**
* Currently selected messagebank row in the table * Currently selected messagebank row in the table
* @type {JQuery<HTMLElement>|null} * @type {JQuery<HTMLElement>|null}
*/ */
let selectedmessagerow = null; window.selectedmessagerow = null;
/** /**
* Fill messagebank table body with values * Fill messagebank table body with values
@@ -40,17 +40,17 @@ function fill_messagebanktablebody(vv) {
$('#messagebanktablebody').append(row); $('#messagebanktablebody').append(row);
let $addedrow = $('#messagebanktablebody tr:last'); let $addedrow = $('#messagebanktablebody tr:last');
$addedrow.click(function () { $addedrow.click(function () {
if (selectedmessagerow) { if (window.selectedmessagerow) {
selectedmessagerow.find('td').css('background-color', ''); window.selectedmessagerow.find('td').css('background-color', '');
if (selectedmessagerow.is($(this))) { if (window.selectedmessagerow.is($(this))) {
selectedmessagerow = null; window.selectedmessagerow = null;
$('#btnRemove').prop('disabled', true); $('#btnRemove').prop('disabled', true);
$('#btnEdit').prop('disabled', true); $('#btnEdit').prop('disabled', true);
return; return;
} }
} }
$addedrow.find('td').css('background-color', '#ffeeba'); $addedrow.find('td').css('background-color', '#ffeeba');
selectedmessagerow = $addedrow; window.selectedmessagerow = $addedrow;
$('#btnRemove').prop('disabled', false); $('#btnRemove').prop('disabled', false);
$('#btnEdit').prop('disabled', false); $('#btnEdit').prop('disabled', false);
}); });
@@ -64,12 +64,12 @@ function fill_messagebanktablebody(vv) {
* @param {string} APIURL API URL endpoint, default "MessageBank/" * @param {string} APIURL API URL endpoint, default "MessageBank/"
*/ */
function reloadMessageBank(APIURL = "MessageBank/") { function reloadMessageBank(APIURL = "MessageBank/") {
messagebankdata = []; window.messagebankdata ??= [];
fetchAPI(APIURL + "List", "GET", {}, null, (okdata) => { fetchAPI(APIURL + "List", "GET", {}, null, (okdata) => {
if (Array.isArray(okdata)) { if (Array.isArray(okdata)) {
messagebankdata = okdata; window.messagebankdata.push(...okdata);
selectedmessagerow = null; window.selectedmessagerow = null;
fill_messagebanktablebody(messagebankdata); fill_messagebanktablebody(window.messagebankdata);
} }
}, (errdata) => { }, (errdata) => {
alert("Error loading messagebank : " + errdata.message); alert("Error loading messagebank : " + errdata.message);
@@ -79,7 +79,7 @@ function reloadMessageBank(APIURL = "MessageBank/") {
$(document).ready(function () { $(document).ready(function () {
console.log("messagebank.js loaded"); console.log("messagebank.js loaded");
$('#messagebanktablebody').empty(); $('#messagebanktablebody').empty();
selectedmessagerow = null; window.selectedmessagerow = null;
let $btnClear = $('#btnClear'); let $btnClear = $('#btnClear');
let $btnAdd = $('#btnAdd'); let $btnAdd = $('#btnAdd');
let $btnRemove = $('#btnRemove'); let $btnRemove = $('#btnRemove');
@@ -198,12 +198,12 @@ $(document).ready(function () {
$findmessage.on('input', function () { $findmessage.on('input', function () {
let searchTerm = $findmessage.val().toLowerCase(); let searchTerm = $findmessage.val().toLowerCase();
if (searchTerm.length > 0) { if (searchTerm.length > 0) {
selectedmessagerow = null; window.selectedmessagerow = null;
let filtered = messagebankdata.filter(item => item.description.toLowerCase().includes(searchTerm) || item.message_Detail.toLowerCase().includes(searchTerm) || item.message_TAGS.toLowerCase().includes(searchTerm)); let filtered = window.messagebankdata.filter(item => item.description.toLowerCase().includes(searchTerm) || item.message_Detail.toLowerCase().includes(searchTerm) || item.message_TAGS.toLowerCase().includes(searchTerm));
fill_messagebanktablebody(filtered); fill_messagebanktablebody(filtered);
} else { } else {
selectedmessagerow = null; window.selectedmessagerow = null;
fill_messagebanktablebody(messagebankdata); fill_messagebanktablebody(window.messagebankdata);
} }
}); });
@@ -301,8 +301,8 @@ $(document).ready(function () {
}); });
}); });
$btnRemove.click(() => { $btnRemove.click(() => {
if (selectedmessagerow) { if (window.selectedmessagerow) {
let cells = selectedmessagerow.find('td'); let cells = window.selectedmessagerow.find('td');
/** @type {MessageBank} */ /** @type {MessageBank} */
let mb = { let mb = {
index: cells.eq(0).text(), index: cells.eq(0).text(),
@@ -325,8 +325,8 @@ $(document).ready(function () {
} }
}); });
$btnEdit.click(() => { $btnEdit.click(() => {
if (selectedmessagerow) { if (window.selectedmessagerow) {
let cells = selectedmessagerow.find('td'); let cells = window.selectedmessagerow.find('td');
/** @type {MessageBank} */ /** @type {MessageBank} */
let mb = { let mb = {
index: cells.eq(0).text(), index: cells.eq(0).text(),

View File

@@ -14,12 +14,12 @@
/** List of Schedulebank data loaded from server /** List of Schedulebank data loaded from server
* @type {ScheduleBank[]} * @type {ScheduleBank[]}
*/ */
let schedulebankdata = []; window.schedulebankdata = [];
/** /**
* Currently selected schedulebank row in the table * Currently selected schedulebank row in the table
* @type {JQuery<HTMLElement>|null} * @type {JQuery<HTMLElement>|null}
*/ */
let selectedschedulerow = null; window.selectedschedulerow = null;
/** /**
* Fill schedulebank table body with values * Fill schedulebank table body with values
@@ -66,12 +66,12 @@ function fill_schedulebanktablebody(vv) {
* @param {string} APIURL API URL endpoint, default "ScheduleBank/" * @param {string} APIURL API URL endpoint, default "ScheduleBank/"
*/ */
function reloadTimerBank(APIURL = "ScheduleBank/") { function reloadTimerBank(APIURL = "ScheduleBank/") {
schedulebankdata = []; window.schedulebankdata = [];
fetchAPI(APIURL + "List", "GET", {}, null, (okdata) => { fetchAPI(APIURL + "List", "GET", {}, null, (okdata) => {
if (Array.isArray(okdata)) { if (Array.isArray(okdata)) {
schedulebankdata = okdata; window.schedulebankdata.push(...okdata);
selectedschedulerow = null; selectedschedulerow = null;
fill_schedulebanktablebody(schedulebankdata); fill_schedulebanktablebody(window.schedulebankdata);
} }
}, (errdata) => { }, (errdata) => {
alert("Error loading schedulebank : " + errdata.message); alert("Error loading schedulebank : " + errdata.message);
@@ -158,15 +158,15 @@ $(document).ready(function () {
$findschedule.on('input', function () { $findschedule.on('input', function () {
let searchTerm = $findschedule.val().toLowerCase(); let searchTerm = $findschedule.val().toLowerCase();
if (searchTerm.length > 0) { if (searchTerm.length > 0) {
selectedtimerow = null; window.selectedschedulerow = null;
let filtered = schedulebankdata.filter(item => let filtered = window.schedulebankdata.filter(item =>
item.description.toLowerCase().includes(searchTerm) item.description.toLowerCase().includes(searchTerm)
|| item.soundpath.toLowerCase().includes(searchTerm) || item.soundpath.toLowerCase().includes(searchTerm)
|| item.broadcastZones.toLowerCase().includes(searchTerm)); || item.broadcastZones.toLowerCase().includes(searchTerm));
fill_schedulebanktablebody(filtered); fill_schedulebanktablebody(filtered);
} else { } else {
selectedtimerow = null; window.selectedschedulerow = null;
fill_schedulebanktablebody(schedulebankdata); fill_schedulebanktablebody(window.schedulebankdata);
} }
}); });
@@ -246,8 +246,8 @@ $(document).ready(function () {
}); });
}); });
$btnRemove.click(() => { $btnRemove.click(() => {
if (selectedtimerow) { if (window.selectedschedulerow) {
let cells = selectedtimerow.find('td'); let cells = window.selectedschedulerow.find('td');
/** @type {ScheduleBank} */ /** @type {ScheduleBank} */
let sr = { let sr = {
index: cells.eq(0).text(), index: cells.eq(0).text(),
@@ -271,8 +271,8 @@ $(document).ready(function () {
} }
}); });
$btnEdit.click(() => { $btnEdit.click(() => {
if (selectedtimerow) { if (window.selectedschedulerow) {
let cells = selectedtimerow.find('td'); let cells = window.selectedschedulerow.find('td');
/** @type {ScheduleBank} */ /** @type {ScheduleBank} */
let sr = { let sr = {
index: cells.eq(0).text(), index: cells.eq(0).text(),

View File

@@ -2,23 +2,23 @@
* List of voice types available * List of voice types available
* @type {string[]} * @type {string[]}
*/ */
let voiceTypes = []; window.voiceTypes = [];
/** /**
* List of categories available * List of categories available
* @type {string[]} * @type {string[]}
*/ */
let categories = []; window.categories = [];
/** /**
* List of languages available * List of languages available
* @type {string[]} * @type {string[]}
*/ */
let languages = []; window.languages = [];
/** /**
* List of scheduled days available * List of scheduled days available
* @type {string[]} * @type {string[]}
*/ */
let scheduledays = [] window.scheduledays = []
/** /**
* Create a list item element * Create a list item element
@@ -34,7 +34,7 @@ function ListItem(text, className = "") {
* WebSocket connection * WebSocket connection
* @type {WebSocket} * @type {WebSocket}
*/ */
let ws = null; window.ws = null;
/** /**
* Send a command to the WebSocket server. * Send a command to the WebSocket server.
@@ -42,8 +42,8 @@ let ws = null;
* @param {String} data data to send * @param {String} data data to send
*/ */
function sendCommand(command, data) { function sendCommand(command, data) {
if (ws.readyState === WebSocket.OPEN) { if (window.ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify({ command, data })); window.ws.send(JSON.stringify({ command, data }));
} }
} }
@@ -118,11 +118,11 @@ function fetchImg(url, cbOK, cbError) {
* Reload voice types from server * Reload voice types from server
*/ */
function getVoiceTypes() { function getVoiceTypes() {
voiceTypes = []; window.voiceTypes = [];
fetchAPI("VoiceType", "GET", {}, null, (okdata) => { fetchAPI("VoiceType", "GET", {}, null, (okdata) => {
// okdata is a string contains elements separated by semicolon ; // okdata is a string contains elements separated by semicolon ;
if (Array.isArray(okdata)) { if (Array.isArray(okdata)) {
voiceTypes = okdata.filter(item => item.trim().length > 0); window.voiceTypes = okdata.filter(item => item.trim().length > 0);
//console.log("Loaded " + voiceTypes.length + " voice types : " + voiceTypes.join(", ")); //console.log("Loaded " + voiceTypes.length + " voice types : " + voiceTypes.join(", "));
} else console.log("getVoiceTypes: okdata is not array"); } else console.log("getVoiceTypes: okdata is not array");
}, (errdata) => { }, (errdata) => {
@@ -134,11 +134,11 @@ function getVoiceTypes() {
* Reload categories from server * Reload categories from server
*/ */
function getCategories() { function getCategories() {
categories = []; window.categories = [];
fetchAPI("Category", "GET", {}, null, (okdata) => { fetchAPI("Category", "GET", {}, null, (okdata) => {
// okdata is a string contains elements separated by semicolon ; // okdata is a string contains elements separated by semicolon ;
if (Array.isArray(okdata)) { if (Array.isArray(okdata)) {
categories = okdata.filter(item => item.trim().length > 0); window.categories = okdata.filter(item => item.trim().length > 0);
//console.log("Loaded " + categories.length + " categories : " + categories.join(", ")); //console.log("Loaded " + categories.length + " categories : " + categories.join(", "));
} else console.log("getCategories: okdata is not array"); } else console.log("getCategories: okdata is not array");
}, (errdata) => { }, (errdata) => {
@@ -150,11 +150,11 @@ function getCategories() {
* Reload languages from server * Reload languages from server
*/ */
function getLanguages() { function getLanguages() {
languages = []; window.languages = [];
fetchAPI("Language", "GET", {}, null, (okdata) => { fetchAPI("Language", "GET", {}, null, (okdata) => {
// okdata is a string contains elements separated by semicolon ; // okdata is a string contains elements separated by semicolon ;
if (Array.isArray(okdata)) { if (Array.isArray(okdata)) {
languages = okdata.filter(item => item.trim().length > 0); window.languages = okdata.filter(item => item.trim().length > 0);
//console.log("Loaded " + languages.length + " languages : " + languages.join(", ") ); //console.log("Loaded " + languages.length + " languages : " + languages.join(", ") );
} else console.log("getLanguages: okdata is not array"); } else console.log("getLanguages: okdata is not array");
}, (errdata) => { }, (errdata) => {
@@ -166,11 +166,11 @@ function getLanguages() {
* Reload scheduled days from server * Reload scheduled days from server
*/ */
function getScheduledDays() { function getScheduledDays() {
scheduledays = []; window.scheduledays = [];
fetchAPI("ScheduleDay", "GET", {}, null, (okdata) => { fetchAPI("ScheduleDay", "GET", {}, null, (okdata) => {
// okdata is a string contains elements separated by semicolon ; // okdata is a string contains elements separated by semicolon ;
if (Array.isArray(okdata)) { if (Array.isArray(okdata)) {
scheduledays = okdata.filter(item => item.trim().length > 0); window.scheduledays = okdata.filter(item => item.trim().length > 0);
//console.log("Loaded " + scheduledays.length + " scheduled days : " + scheduledays.join(", ") ); //console.log("Loaded " + scheduledays.length + " scheduled days : " + scheduledays.join(", ") );
} else console.log("getScheduledDays: okdata is not array"); } else console.log("getScheduledDays: okdata is not array");
}, (errdata) => { }, (errdata) => {
@@ -273,43 +273,36 @@ function DoImport(APIURL, cbOK, cbError) {
fileInput.remove(); fileInput.remove();
} }
let $onlineindicator = null;
let $cpustatus = null;
let $ramstatus = null;
let $diskstatus = null;
let $networkstatus = null;
let $datetimetext = null;
let greencircle = null; window.greencircle = null;
let redcircle = null; window.redcircle = null;
/** /**
* App entry point * App entry point
*/ */
$(document).ready(function () { $(document).ready(function () {
document.title = "Automatic Announcement System" document.title = "Automatic Announcement System"
fetchImg('green_circle.png', (url) => { greencircle = url; }, (err) => { console.error("Error loading green_circle.png : ", err); }); if (window.greencircle === null){
fetchImg('red_circle.png', (url) => { redcircle = url; }, (err) => { console.error("Error loading red_circle.png : ", err); }); fetchImg('green_circle.png', (url) => { window.greencircle = url; }, (err) => { console.error("Error loading green_circle.png : ", err); });
}
if (window.redcircle === null){
fetchImg('red_circle.png', (url) => { window.redcircle = url; }, (err) => { console.error("Error loading red_circle.png : ", err); });
}
const wsURL = window.location.pathname + '/ws' const wsURL = window.location.pathname + '/ws'
if (chrome && chrome.runtime && chrome.runtime.lastError) { if (chrome && chrome.runtime && chrome.runtime.lastError) {
alert("Runtime error: " + chrome.runtime.lastError.message); alert("Runtime error: " + chrome.runtime.lastError.message);
return; return;
} }
$onlineindicator = $('#onlineindicator');
$cpustatus = $('#cpustatus');
$ramstatus = $('#ramstatus');
$diskstatus = $('#diskstatus');
$networkstatus = $('#networkstatus');
$datetimetext = $('#datetimetext');
// reset status indicators // reset status indicators
function resetStatusIndicators() { function resetStatusIndicators() {
$onlineindicator.attr('src', redcircle); $('#onlineindicator').attr('src', window.redcircle);
$cpustatus.text("CPU : N/A"); $('#cpustatus').text("CPU : N/A");
$ramstatus.text("RAM : N/A"); $('#ramstatus').text("RAM : N/A");
$diskstatus.text("Disk : N/A"); $('#diskstatus').text("Disk : N/A");
$networkstatus.text("Network : N/A"); $('#networkstatus').text("Network : N/A");
$datetimetext.text("Date/Time : N/A"); $('#datetimetext').text("Date/Time : N/A");
} }
@@ -321,44 +314,47 @@ $(document).ready(function () {
// Initialize WebSocket connection // Initialize WebSocket connection
ws = new WebSocket(wsURL); window.ws = new WebSocket(wsURL);
ws.onopen = () => { window.ws.onopen = () => {
console.log('WebSocket connection established'); console.log('WebSocket connection established');
$onlineindicator.attr('src', greencircle); $('#onlineindicator').attr('src', window.greencircle);
}; };
ws.onmessage = (event) => { window.ws.onmessage = (event) => {
if ($('#onlineindicator').attr('src') !== window.greencircle) {
$('#onlineindicator').attr('src', window.greencircle);
}
let rep = JSON.parse(event.data); let rep = JSON.parse(event.data);
let cmd = rep.reply let cmd = rep.reply
let data = rep.data; let data = rep.data;
if (cmd && cmd.length > 0) { if (cmd && cmd.length > 0) {
switch (cmd) { switch (cmd) {
case "getCPUStatus": case "getCPUStatus":
$cpustatus.text("CPU : " + data) $('#cpustatus').text("CPU : " + data)
break; break;
case "getMemoryStatus": case "getMemoryStatus":
$ramstatus.text("RAM : " + data) $('#ramstatus').text("RAM : " + data)
break; break;
case "getDiskStatus": case "getDiskStatus":
$diskstatus.text("Disk : " + data) $('#diskstatus').text("Disk : " + data)
break; break;
case "getNetworkStatus": case "getNetworkStatus":
$networkstatus.text("Network : " + data) $('#networkstatus').text("Network : " + data)
break; break;
case "getSystemTime": case "getSystemTime":
$datetimetext.text(data) $('#datetimetext').text(data)
break; break;
} }
} }
}; };
ws.onclose = () => { window.ws.onclose = () => {
console.log('WebSocket connection closed'); console.log('WebSocket connection closed');
resetStatusIndicators(); resetStatusIndicators();
}; };
// ws.onerror = (error) => { // window.ws.onerror = (error) => {
// console.error('WebSocket error:', error); // console.error('WebSocket error:', error);
// }; // };
@@ -457,6 +453,18 @@ $(document).ready(function () {
} }
}); });
}) })
$('#usermanagement').click(() => {
sidemenu.hide();
$('#content').load('usermanagement.html', function (response, status, xhr) {
if (status === "success") {
console.log("User Management content loaded successfully");
// pindah ke usermanagement.js
} else {
console.error("Error loading user management content:", xhr.status, xhr.statusText);
}
});
});
$('#settinglink').click(() => { $('#settinglink').click(() => {
sidemenu.hide(); sidemenu.hide();
$('#content').load('setting.html', function (response, status, xhr) { $('#content').load('setting.html', function (response, status, xhr) {

View File

@@ -19,38 +19,38 @@
* List of Soundbank data loaded from server * List of Soundbank data loaded from server
* @type {SoundBank[]} * @type {SoundBank[]}
*/ */
let soundbankdata = []; window.soundbankdata = [];
/** /**
* Currently selected soundbank row in the table * Currently selected soundbank row in the table
* @type {JQuery<HTMLElement>|null} * @type {JQuery<HTMLElement>|null}
*/ */
let selectedsoundrow = null; window.selectedsoundrow = null;
/** /**
* List of sound files in the soundbank directory, that ends with .wav or .mp3 * List of sound files in the soundbank directory, that ends with .wav or .mp3
* @type {string[]} * @type {string[]}
*/ */
let soundbankfiles = []; window.soundbankfiles = [];
/** /**
* Select2 data source * Select2 data source
* See https://select2.org/data-sources/formats * See https://select2.org/data-sources/formats
* @type {Select2item[]} * @type {Select2item[]}
*/ */
let select2data = []; window.select2data = [];
/** /**
* Reload sound bank from server * Reload sound bank from server
* @param {String} APIURL API URL endpoint, default "SoundBank/" * @param {String} APIURL API URL endpoint, default "SoundBank/"
*/ */
function reloadSoundBank(APIURL = "SoundBank/") { function reloadSoundBank(APIURL = "SoundBank/") {
soundbankdata = []; window.soundbankdata = [];
fetchAPI(APIURL + "List", "GET", {}, null, (okdata) => { fetchAPI(APIURL + "List", "GET", {}, null, (okdata) => {
if (Array.isArray(okdata)) { if (Array.isArray(okdata)) {
soundbankdata = okdata; window.soundbankdata.push(...okdata);
selectedsoundrow = null; window.selectedsoundrow = null;
fill_soundbanktablebody(soundbankdata); fill_soundbanktablebody(window.soundbankdata);
} }
}, (errdata) => { }, (errdata) => {
alert("Error loading soundbank : " + errdata.message); alert("Error loading soundbank : " + errdata.message);
@@ -77,17 +77,17 @@ function fill_soundbanktablebody(vv) {
$('#soundbanktablebody').append(row); $('#soundbanktablebody').append(row);
let $addedrow = $('#soundbanktablebody tr:last'); let $addedrow = $('#soundbanktablebody tr:last');
$addedrow.on('click', function () { $addedrow.on('click', function () {
if (selectedsoundrow) { if (window.selectedsoundrow) {
selectedsoundrow.find('td').css('background-color', ''); window.selectedsoundrow.find('td').css('background-color', '');
if (selectedsoundrow.is($(this))) { if (window.selectedsoundrow.is($(this))) {
selectedsoundrow = null; window.selectedsoundrow = null;
$('#btnRemove').prop('disabled', true); $('#btnRemove').prop('disabled', true);
$('#btnEdit').prop('disabled', true); $('#btnEdit').prop('disabled', true);
return; return;
} }
} }
$(this).find('td').css('background-color', '#ffeeba'); $(this).find('td').css('background-color', '#ffeeba');
selectedsoundrow = $(this); window.selectedsoundrow = $(this);
$('#btnRemove').prop('disabled', false); $('#btnRemove').prop('disabled', false);
$('#btnEdit').prop('disabled', false); $('#btnEdit').prop('disabled', false);
}); });
@@ -103,13 +103,13 @@ function fill_soundbanktablebody(vv) {
* @param {String} APIURL API URL endpoint (default "SoundBank/") * @param {String} APIURL API URL endpoint (default "SoundBank/")
*/ */
function reloadSoundbankFiles(APIURL = "SoundBank/") { function reloadSoundbankFiles(APIURL = "SoundBank/") {
soundbankfiles = []; window.soundbankfiles = [];
fetchAPI(APIURL + "ListFiles", "GET", {}, null, (okdata) => { fetchAPI(APIURL + "ListFiles", "GET", {}, null, (okdata) => {
// okdata is a string contains elements separated by semicolon ; // okdata is a string contains elements separated by semicolon ;
if (Array.isArray(okdata)) { if (Array.isArray(okdata)) {
soundbankfiles = okdata.filter(item => item.trim().length > 0); window.soundbankfiles = okdata.filter(item => item.trim().length > 0);
// refill select2data // refill select2data
select2data = soundbankfiles.map((item, index) => ({ id: index + 1, text: item })); window.select2data = window.soundbankfiles.map((item, index) => ({ id: index + 1, text: item }));
} else console.log("reloadSoundbankFiles: okdata is not array"); } else console.log("reloadSoundbankFiles: okdata is not array");
}, (errdata) => { }, (errdata) => {
alert("Error loading soundbank files : " + errdata.message); alert("Error loading soundbank files : " + errdata.message);
@@ -120,7 +120,7 @@ $(document).ready(function () {
console.log("soundbank.js loaded successfully"); console.log("soundbank.js loaded successfully");
reloadSoundbankFiles(); reloadSoundbankFiles();
$('#soundbanktablebody').empty(); $('#soundbanktablebody').empty();
selectedsoundrow = null; window.selectedsoundrow = null;
let $btnClear = $('#btnClear'); let $btnClear = $('#btnClear');
let $btnAdd = $('#btnAdd'); let $btnAdd = $('#btnAdd');
let $btnRemove = $('#btnRemove'); let $btnRemove = $('#btnRemove');
@@ -166,9 +166,9 @@ $(document).ready(function () {
$modalvoicetype.val(null); $modalvoicetype.val(null);
// fill modalpath options from soundbankfiles[] // fill modalpath options from soundbankfiles[]
// TODO read https://jeesite.com/front/jquery-select2/4.0/index.htm // TODO read https://jeesite.com/front/jquery-select2/4.0/index.htm
console.log("select2data has " + select2data.length + " items"); console.log("window.select2data has " + window.select2data.length + " items");
$('#modalpath').select2({ $('#modalpath').select2({
data: select2data data: window.select2data
}) })
} }
@@ -176,12 +176,12 @@ $(document).ready(function () {
$('#findsoundbank').on('input', function () { $('#findsoundbank').on('input', function () {
let searchTerm = $(this).val().trim().toLowerCase(); let searchTerm = $(this).val().trim().toLowerCase();
if (searchTerm.length > 0) { if (searchTerm.length > 0) {
selectedsoundrow = null; window.selectedsoundrow = null;
let filtered = soundbankdata.filter(item => item.description.toLowerCase().includes(searchTerm) || item.tag.toLowerCase().includes(searchTerm) || item.path.toLowerCase().includes(searchTerm)); let filtered = window.soundbankdata.filter(item => item.description.toLowerCase().includes(searchTerm) || item.tag.toLowerCase().includes(searchTerm) || item.path.toLowerCase().includes(searchTerm));
fill_soundbanktablebody(filtered); fill_soundbanktablebody(filtered);
} else { } else {
selectedsoundrow = null; window.selectedsoundrow = null;
fill_soundbanktablebody(soundbankdata); fill_soundbanktablebody(window.soundbankdata);
} }
}); });
$btnClear.click(() => { $btnClear.click(() => {
@@ -208,8 +208,8 @@ $(document).ready(function () {
}); });
}); });
$btnRemove.click(() => { $btnRemove.click(() => {
if (selectedsoundrow) { if (window.selectedsoundrow) {
let cells = selectedsoundrow.find('td'); let cells = window.selectedsoundrow.find('td');
/** @type {SoundBank} */ /** @type {SoundBank} */
let sb = { let sb = {
index: cells.eq(0).text(), index: cells.eq(0).text(),
@@ -231,8 +231,8 @@ $(document).ready(function () {
} }
}); });
$btnEdit.click(() => { $btnEdit.click(() => {
if (selectedsoundrow) { if (window.selectedsoundrow) {
let cells = selectedsoundrow.find('td'); let cells = window.selectedsoundrow.find('td');
/** @type {SoundBank} */ /** @type {SoundBank} */
let sb = { let sb = {
index: cells.eq(0).text(), index: cells.eq(0).text(),

View File

@@ -8,20 +8,21 @@
/** /**
* @type {SoundChannel[]} * @type {SoundChannel[]}
*/ */
let soundChannels = []; window.soundChannels = [];
// Currently selected sound channel row in the table // Currently selected sound channel row in the table
let selectedSoundChannel = null; window.selectedSoundChannel = null;
/** /**
* Fills the sound channel table body with the provided data. * Fills the sound channel table body with the provided data.
* @param {SoundChannel[]} vv Sound channel data to populate the table. * @param {SoundChannel[]} vv Sound channel data to populate the table.
*/ */
function fill_soundchanneltablebody(vv) { function fill_soundchanneltablebody(vv) {
const $tbody = $('#soundchanneltablebody'); let $tbody = $('#soundchanneltablebody');
const $btnEditSoundChannel = $('#btnEditSoundChannel'); let $btnEditSoundChannel = $('#btnEditSoundChannel');
const $tablesizeSoundChannel = $('#tablesizeSoundChannel'); let $tablesizeSoundChannel = $('#tablesizeSoundChannel');
$tbody.empty(); $tbody.empty();
$tablesizeSoundChannel.text('Table Length : N/A'); $tablesizeSoundChannel.text('Table Length : N/A');
if (!Array.isArray(vv) || vv.length === 0) return; if (!Array.isArray(vv) || vv.length === 0) return;
@@ -55,12 +56,12 @@ function fill_soundchanneltablebody(vv) {
* @param {String} APIURL API URL endpoint (default "SoundChannel/") * @param {String} APIURL API URL endpoint (default "SoundChannel/")
*/ */
function reloadSoundChannel(APIURL = "SoundChannel/") { function reloadSoundChannel(APIURL = "SoundChannel/") {
SoundChannelList = []; window.soundChannels = [];
fetchAPI(APIURL + "List", "GET", {}, null, (okdata) => { fetchAPI(APIURL + "List", "GET", {}, null, (okdata) => {
if (Array.isArray(okdata)) { if (Array.isArray(okdata)) {
//console.log("reloadSoundChannel : ", okdata) //console.log("reloadSoundChannel : ", okdata)
SoundChannelList = okdata; window.soundChannels.push(...okdata);
fill_soundchanneltablebody(SoundChannelList); fill_soundchanneltablebody(window.soundChannels);
} else console.log("reloadSoundChannel: okdata is not array"); } else console.log("reloadSoundChannel: okdata is not array");
}, (errdata) => { }, (errdata) => {
alert("Error loading sound channels : " + errdata.message); alert("Error loading sound channels : " + errdata.message);
@@ -85,12 +86,14 @@ $(document).ready(function () {
$findsoundchannel.on('input', function () { $findsoundchannel.on('input', function () {
let searchTerm = $(this).val().toLowerCase(); let searchTerm = $(this).val().toLowerCase();
if (searchTerm.length==0){ if (searchTerm.length==0){
fill_soundchanneltablebody(SoundChannelList); window.selectedSoundChannel = null;
fill_soundchanneltablebody(window.soundChannels);
} else { } else {
let filteredChannels = SoundChannelList.filter(channel => window.selectedSoundChannel = null;
channel.index.toString().includes(searchTerm) || let filteredChannels = window.soundChannels.filter(xx =>
channel.description.toLowerCase().includes(searchTerm) || xx.index.toString().includes(searchTerm) ||
channel.ip.toLowerCase().includes(searchTerm) xx.channel.toLowerCase().includes(searchTerm) ||
xx.ip.toLowerCase().includes(searchTerm)
); );
fill_soundchanneltablebody(filteredChannels); fill_soundchanneltablebody(filteredChannels);
} }

View File

@@ -0,0 +1,128 @@
/**
* @typedef {Object} UserDB
* @property {number} index Index number
* @property {string} username Username
* @property {string} password Password (plain)
* @property {string} location Location
* @property {string} soundbank_tags Soundbank variable tags separated by semicolon ;
* @property {string} messagebank_ann_id Messagebank announcement ID separated by semicolon ;
* @property {string} broadcastzones Broadcast zones separated by semicolon ;
*/
/** List of UserDB data loaded from server
* @type {UserDB[]}
*/
window.userdb = [];
/**
* Currently selected user row in table
* @type {JQuery<HTMLElement>|null}
*/
window.selecteduserrow = null;
/**
* Fill user table body with values
* @param {UserDB[]} vv values to fill
*/
function fill_usertablebody(vv) {
$('#usertablebody').empty();
if (!Array.isArray(vv) || vv.length === 0) {
$('#btnExport').prop('disabled', true);
return;
}
vv.forEach(item => {
const row = `<tr>
<td>${item.index}</td>
<td>${item.datenya}</td>
<td>${item.timenya}</td>
<td>${item.machine}</td>
<td>${item.description}</td>
</tr>`;
$('#usertablebody').append(row);
let $addedrow = $('#usertablebody tr:last');
$addedrow.on('click', function () {
if (window.selecteduserrow) {
window.selecteduserrow.find('td').css('background-color', '');
if (window.selecteduserrow.is($(this))) {
window.selecteduserrow = null;
$('#btnRemove').prop('disabled', true);
$('#btnEdit').prop('disabled', true);
return;
}
}
$(this).find('td').css('background-color', '#ffeeba');
window.selecteduserrow = $(this);
$('#btnRemove').prop('disabled', false);
$('#btnEdit').prop('disabled', false);
});
});
$('#tablesize').text("Table Size: " + vv.length);
$('#btnExport').prop('disabled', false);
}
/**
* Reload UserDB from server with date and filter
* @param {String} APIURL API URL endpoint , default "User/"
*/
function reloaduserDB(APIURL = "User/") {
window.userdb = [];
fetchAPI(APIURL + "List", "GET", {}, null, (okdata) => {
if (Array.isArray(okdata)) {
window.userdb.push(...okdata);
fill_usertablebody(window.userdb);
}
}, (errdata) => {
alert("Error loading user database : " + errdata.message);
});
}
$(document).ready(function () {
console.log("usermanagement.js ready");
let $usertablebody = $('#usertablebody');
let $finduser = $('#finduser');
let $btnClear = $('#btnClear');
let $btnAdd = $('#btnAdd');
let $btnRemove = $('#btnRemove');
let $btnEdit = $('#btnEdit');
let $btnExport = $('#btnExport');
let $btnImport = $('#btnImport');
let APIURL = "User/";
// add / edit modal elements
let $addmodal = $('#addmodal');
let $modalindex = $('#modalindex');
let $modalusername = $('#modalusername');
let $modalpassword = $('#modalpassword');
let $modalverifypassword = $('#modalverifypassword');
let $modalsoundbank = $('#modalsoundbank');
let $modalmessagebank = $('#modalmessagebank');
let $modalbroadcastzones = $('#modalbroadcastzones');
let $btnShowSoundbankModal = $('#btnShowSoundbankModal');
let $btnShowMessagebankModal = $('#btnShowMessagebankModal');
let $btnShowBroaadcastZoneModal = $('#btnShowBroaadcastZoneModal');
let $usermanagementsave = $('#usermanagementsave');
let $usermanagementclose = $('#usermanagementclose');
// soundbank selection modal elements
let $soundbankmodal = $('#soundbankmodal');
let $soundbankselection = $('#soundbankselection');
let $soundbankselectionsave = $('#soundbankselectionsave');
let $soundbankselectionclose = $('#soundbankselectionclose');
// broadcast zone selection modal elements
let $broadcastzonemodal = $('#broadcastzonemodal');
let $broadcastzoneselection = $('#broadcastzoneselection');
let $broadcastzoneselectionsave = $('#broadcastzoneselectionsave');
let $broadcastzoneselectionclose = $('#broadcastzoneselectionclose');
// messagebank selection modal elements
let $messagebankmodal = $('#messagebankmodal');
let $messagebankselection = $('#messagebankselection');
let $messagebankselectionsave = $('#messagebankselectionsave');
let $messagebankselectionclose = $('#messagebankselectionclose');
$usertablebody.empty();
$finduser.on('input', function () {
});
});

View File

@@ -4,7 +4,7 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<title>AAS_NewGen_03Sept25</title> <title>AAS_NewGen_30Sept25</title>
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css"> <link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
<link rel="stylesheet" href="assets/css/styles.css"> <link rel="stylesheet" href="assets/css/styles.css">
@@ -24,34 +24,34 @@
</div> </div>
<div class="modal-body"> <div class="modal-body">
<div class="row"> <div class="row">
<div class="col-4 col-sm-3"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Index</p> <p class="text-add">Index</p>
</div> </div>
<div class="col"><input class="w-25 form-control input-add" type="text" id="broadcastzoneindex" placeholder="index"></div> <div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8"><input class="w-25 form-control input-add" type="text" id="broadcastzoneindex" placeholder="index"></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-4 col-sm-3"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Description</p> <p class="text-add">Description</p>
</div> </div>
<div class="col"><input type="text" id="broadcastzonedescription" class="form-control input-add" placeholder="description"></div> <div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8"><input type="text" id="broadcastzonedescription" class="form-control input-add" placeholder="description"></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-4 col-sm-3"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Sound Channel</p> <p class="text-add">Sound Channel</p>
</div> </div>
<div class="col"><select id="broadcastzonesoundchannel" class="form-control input-add" placeholder="sound channel"></select></div> <div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8"><select id="broadcastzonesoundchannel" class="form-control input-add" placeholder="sound channel"></select></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-4 col-sm-3"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Box</p> <p class="text-add">Box</p>
</div> </div>
<div class="col"><input type="text" id="broadcastzonebox" class="form-control input-add" placeholder="Box ID"></div> <div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8"><input type="text" id="broadcastzonebox" class="form-control input-add" placeholder="Box ID"></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-4 col-sm-3"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Relay</p> <p class="text-add">Relay</p>
</div> </div>
<div class="col"> <div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8 pad-relay">
<div class="row"> <div class="row">
<div class="col-3"> <div class="col-3">
<div class="row"> <div class="row">
@@ -167,9 +167,9 @@
</div> </div>
<div class="row"> <div class="row">
<div class="accordion" role="tablist" id="accordion-1"> <div class="accordion" role="tablist" id="accordion-1">
<div class="accordion-item"> <div class="accordion-item pad-accordion">
<h2 class="accordion-header" role="tab"><button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#accordion-1 .item-1" aria-expanded="true" aria-controls="accordion-1 .item-1">Sound Channel</button></h2> <h2 class="accordion-header" role="tab"><button class="accordion-button collapsed bg-heading1" type="button" data-bs-toggle="collapse" data-bs-target="#accordion-1 .item-1" aria-expanded="false" aria-controls="accordion-1 .item-1">Sound Channel</button></h2>
<div class="accordion-collapse collapse show item-1" role="tabpanel" data-bs-parent="#accordion-1"> <div class="accordion-collapse collapse item-1" role="tabpanel" data-bs-parent="#accordion-1">
<div class="accordion-body"> <div class="accordion-body">
<div class="row"> <div class="row">
<div class="col-md-7 col-lg-7 col-xl-7"></div> <div class="col-md-7 col-lg-7 col-xl-7"></div>
@@ -178,11 +178,11 @@
</div> </div>
<div class="col-10 col-sm-10 col-md-3 col-lg-3 col-xl-3"><input class="w-100 form-control" type="text" id="findsoundchannel" placeholder="Search keyword" name="findsoundbank"></div> <div class="col-10 col-sm-10 col-md-3 col-lg-3 col-xl-3"><input class="w-100 form-control" type="text" id="findsoundchannel" placeholder="Search keyword" name="findsoundbank"></div>
</div> </div>
<div class="row"> <div class="row pad-search">
<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="btnReinitializeSoundChannel" type="button">Re-Initialize</button></div> <div class="col-6 col-sm-6 col-md-3 col-lg-3 col-xl-3"><button class="btn w-100 pad-button btn-round-basic color-add" id="btnReinitializeSoundChannel" type="button">Re-Initialize</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="btnEditSoundChannel" type="button">Edit</button></div> <div class="col-6 col-sm-6 col-md-3 col-lg-3 col-xl-3"><button class="btn w-100 pad-button btn-round-basic color-edit" id="btnEditSoundChannel" 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="btnExportSoundChannel" type="button">Export</button></div> <div class="col-6 col-md-3 col-lg-3 col-xl-3 col-sm--6"><button class="btn w-100 pad-button btn-round-basic color-import" id="btnExportSoundChannel" 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="btnImportSoundChannel" type="button">Import</button></div> <div class="col-6 col-sm-6 col-md-3 col-lg-3 col-xl-3"><button class="btn w-100 pad-button btn-round-basic color-import" id="btnImportSoundChannel" type="button">Import</button></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col"> <div class="col">
@@ -206,9 +206,9 @@
</div> </div>
</div> </div>
</div> </div>
<div class="accordion-item"> <div class="accordion-item pad-accordion">
<h2 class="accordion-header" role="tab"><button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#accordion-1 .item-2" aria-expanded="false" aria-controls="accordion-1 .item-2">Broadcast Zones</button></h2> <h2 class="accordion-header" role="tab"><button class="accordion-button bg-heading2" type="button" data-bs-toggle="collapse" data-bs-target="#accordion-1 .item-2" aria-expanded="true" aria-controls="accordion-1 .item-2">Broadcast Zones</button></h2>
<div class="accordion-collapse collapse item-2" role="tabpanel" data-bs-parent="#accordion-1"> <div class="accordion-collapse collapse show item-2" role="tabpanel" data-bs-parent="#accordion-1">
<div class="accordion-body"> <div class="accordion-body">
<div class="row"> <div class="row">
<div class="col-md-7 col-lg-7 col-xl-7"></div> <div class="col-md-7 col-lg-7 col-xl-7"></div>
@@ -217,7 +217,7 @@
</div> </div>
<div class="col-10 col-sm-10 col-md-3 col-lg-3 col-xl-3"><input class="w-100 form-control" type="text" id="findzone" placeholder="Search keyword" name="findsoundbank"></div> <div class="col-10 col-sm-10 col-md-3 col-lg-3 col-xl-3"><input class="w-100 form-control" type="text" id="findzone" placeholder="Search keyword" name="findsoundbank"></div>
</div> </div>
<div class="row"> <div class="row pad-search">
<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="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="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-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-remove" id="btnRemove" type="button">Remove</button></div>
@@ -238,8 +238,8 @@
<th class="col-sm-1">No</th> <th class="col-sm-1">No</th>
<th class="col-sm-2">Description</th> <th class="col-sm-2">Description</th>
<th class="col-sm-2">SoundChannel</th> <th class="col-sm-2">SoundChannel</th>
<th class="col-sm-2">Box</th> <th class="col-sm-2">ID</th>
<th class="col">Relay</th> <th class="col">BP</th>
</tr> </tr>
</thead> </thead>
<tbody id="broadcastzonetablebody"></tbody> <tbody id="broadcastzonetablebody"></tbody>
@@ -259,25 +259,25 @@
</div> </div>
<div class="modal-body"> <div class="modal-body">
<div class="row"> <div class="row">
<div class="col-4"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p>Index</p> <p class="text-add">Index</p>
</div> </div>
<div class="col"><input class="w-25" type="text" id="soundchannelindex" readonly="" placeholder="index"></div> <div class="col-8 col-sm-8 col-md-8 col-xl-8 co-lg-8"><input class="w-25 form-control input-add" type="text" id="soundchannelindex" readonly="" placeholder="index"></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-4"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p>Description</p> <p class="text-add">Description</p>
</div> </div>
<div class="col"><input class="w-100" type="text" id="soundchanneldescription" placeholder="Description"></div> <div class="col-8 col-sm-8 col-md-8 col-xl-8 co-lg-8"><input class="w-100 form-control input-add" type="text" id="soundchanneldescription" placeholder="Description"></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-4"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p>IP Address</p> <p class="text-add">IP Address</p>
</div> </div>
<div class="col"><input class="w-100" type="text" id="soundchannelip" placeholder="IP Address"></div> <div class="col-8 col-sm-8 col-md-8 col-xl-8 co-lg-8"><input class="w-100 form-control input-add" type="text" id="soundchannelip" placeholder="IP Address"></div>
</div> </div>
</div> </div>
<div class="modal-footer"><button class="btn btn-light" id="soundchannelclose" type="button" data-bs-dismiss="modal">Close</button><button class="btn btn-primary" id="soundchannelsave" type="button">Save</button></div> <div class="modal-footer"><button class="btn btn-round-basic color-edit class25" id="soundchannelclose" type="button" data-bs-dismiss="modal">Close</button><button class="btn btn-round-basic color-add class25" id="soundchannelsave" type="button">Save</button></div>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -60,6 +60,10 @@
<path d="M19,7H9C7.9,7,7,7.9,7,9v10c0,1.1,0.9,2,2,2h10c1.1,0,2-0.9,2-2V9C21,7.9,20.1,7,19,7z M19,9v2H9V9H19z M13,15v-2h2v2H13z M15,17v2h-2v-2H15z M11,15H9v-2h2V15z M17,13h2v2h-2V13z M9,17h2v2H9V17z M17,19v-2h2v2H17z M6,17H5c-1.1,0-2-0.9-2-2V5 c0-1.1,0.9-2,2-2h10c1.1,0,2,0.9,2,2v1h-2V5H5v10h1V17z"></path> <path d="M19,7H9C7.9,7,7,7.9,7,9v10c0,1.1,0.9,2,2,2h10c1.1,0,2-0.9,2-2V9C21,7.9,20.1,7,19,7z M19,9v2H9V9H19z M13,15v-2h2v2H13z M15,17v2h-2v-2H15z M11,15H9v-2h2V15z M17,13h2v2h-2V13z M9,17h2v2H9V17z M17,19v-2h2v2H17z M6,17H5c-1.1,0-2-0.9-2-2V5 c0-1.1,0.9-2,2-2h10c1.1,0,2,0.9,2,2v1h-2V5H5v10h1V17z"></path>
</g> </g>
</svg>&nbsp; &nbsp;Log</a></li> </svg>&nbsp; &nbsp;Log</a></li>
<li class="nav-item"><a class="nav-link link-body-emphasis text-menu" id="usermanagement" href="#"><svg xmlns="http://www.w3.org/2000/svg" height="1em" viewBox="0 0 24 24" width="1em" fill="currentColor" class="me-2 icon-menu" style="font-size: 20px;">
<path d="M0 0h24v24H0z" fill="none"></path>
<path d="M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5C6.34 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z"></path>
</svg>&nbsp;User Management</a></li>
<li class="nav-item"><a class="nav-link link-body-emphasis text-menu" id="settinglink" href="#"><svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="1em" viewBox="0 0 24 24" width="1em" fill="currentColor" class="me-2 icon-menu" style="font-size: 20px;"> <li class="nav-item"><a class="nav-link link-body-emphasis text-menu" id="settinglink" href="#"><svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="1em" viewBox="0 0 24 24" width="1em" fill="currentColor" class="me-2 icon-menu" style="font-size: 20px;">
<g> <g>
<path d="M0,0h24v24H0V0z" fill="none"></path> <path d="M0,0h24v24H0V0z" fill="none"></path>

View File

@@ -4,7 +4,7 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<title>AAS_NewGen_03Sept25</title> <title>AAS_NewGen_30Sept25</title>
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css"> <link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
<link rel="stylesheet" href="assets/css/styles.css"> <link rel="stylesheet" href="assets/css/styles.css">
@@ -16,7 +16,7 @@
<h2 style="text-align: center;">Language Link</h2> <h2 style="text-align: center;">Language Link</h2>
</div> </div>
</div> </div>
<div class="row"> <div class="row pad-row-search">
<div class="col-md-7 col-lg-7 col-xl-7"></div> <div class="col-md-7 col-lg-7 col-xl-7"></div>
<div class="col-2 col-sm-2 col-md-2 col-lg-2 col-xl-2 search"> <div class="col-2 col-sm-2 col-md-2 col-lg-2 col-xl-2 search">
<p class="text-add">Search</p> <p class="text-add">Search</p>
@@ -58,22 +58,22 @@
</div> </div>
<div class="modal-body"> <div class="modal-body">
<div class="row"> <div class="row">
<div class="col-4 col-sm-3"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Index</p> <p class="text-add">Index</p>
</div> </div>
<div class="col"><input class="w-25 form-control input-add" type="text" id="languagelinkindex" readonly=""></div> <div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8"><input class="w-25 form-control input-add" type="text" id="languagelinkindex" readonly=""></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-4 col-sm-3"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Tag</p> <p class="text-add">Tag</p>
</div> </div>
<div class="col"><input type="text" id="languagelinktag" class="form-control input-add"></div> <div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8"><input type="text" id="languagelinktag" class="form-control input-add"></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-4 col-sm-3"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Language</p> <p class="text-add">Language</p>
</div> </div>
<div class="col text-add"> <div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8 text-add">
<div class="form-check"><input class="form-check-input" type="checkbox" id="langId" name="languages[]" value="id"><label class="form-check-label" for="langId">Indonesia</label></div> <div class="form-check"><input class="form-check-input" type="checkbox" id="langId" name="languages[]" value="id"><label class="form-check-label" for="langId">Indonesia</label></div>
<div class="form-check"><input class="form-check-input" type="checkbox" id="langLocal" name="languages[]" value="id"><label class="form-check-label" for="langId-1">Local</label></div> <div class="form-check"><input class="form-check-input" type="checkbox" id="langLocal" name="languages[]" value="id"><label class="form-check-label" for="langId-1">Local</label></div>
<div class="form-check"><input class="form-check-input" type="checkbox" id="langEn" name="languages[]" value="en"><label class="form-check-label" for="langEn">English</label></div> <div class="form-check"><input class="form-check-input" type="checkbox" id="langEn" name="languages[]" value="en"><label class="form-check-label" for="langEn">English</label></div>

View File

@@ -4,7 +4,7 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<title>AAS_NewGen_03Sept25</title> <title>AAS_NewGen_30Sept25</title>
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css"> <link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
<link rel="stylesheet" href="assets/css/styles.css"> <link rel="stylesheet" href="assets/css/styles.css">
@@ -17,15 +17,16 @@
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-6 col-sm col-md-2 col-lg-2 col-xl-2"> <div class="col-4 col-sm-4 col-md-2 col-lg-2 col-xl-2">
<p class="text-add">Select Log Date</p> <p class="text-add">Select Log Date</p>
</div> </div>
<div class="col-6 col-sm col-md-2 col-lg-2 col-xl-2"><input id="logdate" class="form-control" type="date"></div> <div class="col-4 col-sm-4 col-md-2 col-lg-2 col-xl-2"><input id="logdate" class="form-control" type="date"></div>
<div class="col-md-4 col-lg-4 col-xl-4"><button class="btn btn-primary w-100 h-100" id="btnExport" type="button">Export</button></div> <div class="col-4 col-sm-4 col-md-2 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 col-md-2 col-lg-2 col-xl-2"> <div class="col-md-2 col-lg-2 col-xl-2"></div>
<div class="col-4 col-sm-4 col-md-2 col-lg-2 col-xl-2">
<p class="text-add">Search</p> <p class="text-add">Search</p>
</div> </div>
<div class="col-6 col-sm col-md-2 col-lg-2 col-xl-2"><input type="text" id="searchfilter" class="form-control" placeholder="Search Filter"></div> <div class="col-4 col-sm-4 col-md-2 col-lg-2 col-xl-2"><input type="text" id="searchfilter" class="form-control" placeholder="Search Filter"></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col"> <div class="col">

View File

@@ -4,7 +4,7 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<title>AAS_NewGen_03Sept25</title> <title>AAS_NewGen_30Sept25</title>
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css"> <link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
<link rel="stylesheet" href="assets/css/styles.css"> <link rel="stylesheet" href="assets/css/styles.css">
@@ -16,12 +16,12 @@
<h2 style="text-align: center;">Message Bank</h2> <h2 style="text-align: center;">Message Bank</h2>
</div> </div>
</div> </div>
<div class="row"> <div class="row pad-row-search">
<div class="col-md-7 col-lg-7 col-xl-7"></div> <div class="col-md-7 col-lg-7 col-xl-7"></div>
<div class="col-2 col-sm-2 col-md-2 col-lg-2 col-xl-2 search"> <div class="col-2 col-sm-2 col-md-2 col-lg-2 col-xl-2">
<p class="text-add">Search</p> <p class="text-add">Search</p>
</div> </div>
<div class="col-10 col-sm-10 col-md-3 col-lg-3 col-xl-3"><input class="w-100 form-control" type="text" id="findmessage" placeholder="Search keyword" name="findsoundbank"></div> <div class="col-10 col-sm-10 col-md-3 col-lg-3 col-xl-3"><input class="w-100 form-control pad-search" type="text" id="findmessage" placeholder="Search keyword" name="findsoundbank"></div>
</div> </div>
<div class="row"> <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="btnClear" type="button">Clear</button></div>
@@ -62,22 +62,22 @@
</div> </div>
<div class="modal-body"> <div class="modal-body">
<div class="row"> <div class="row">
<div class="col-4 col-sm-3"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Index</p> <p class="text-add">Index</p>
</div> </div>
<div class="col"><input class="w-25 input-add form-control" type="text" id="messageindex" placeholder="Index" readonly=""></div> <div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8"><input class="w-25 input-add form-control" type="text" id="messageindex" placeholder="Index" readonly=""></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-4 col-sm-3"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Description</p> <p class="text-add">Description</p>
</div> </div>
<div class="col"><input type="text" id="messagedescription" class="input-add form-control" placeholder="Description"></div> <div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8"><input type="text" id="messagedescription" class="input-add form-control" placeholder="Description"></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-4 col-sm-3"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Language</p> <p class="text-add">Language</p>
</div> </div>
<div class="col"><select id="messagelanguage" class="input-add form-control"> <div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8"><select id="messagelanguage" class="input-add form-control">
<option value="INDONESIA">Indonesia</option> <option value="INDONESIA">Indonesia</option>
<option value="LOCAL">Local</option> <option value="LOCAL">Local</option>
<option value="ENGLISH">English</option> <option value="ENGLISH">English</option>
@@ -87,16 +87,16 @@
</select></div> </select></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-4 col-sm-3"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">ANN ID</p> <p class="text-add">ANN ID</p>
</div> </div>
<div class="col"><input type="number" id="messageannid" class="input-add form-control" min="1" max="100" value="1" step="1" placeholder="Announcement ID"></div> <div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8"><input type="number" id="messageannid" class="input-add form-control" min="1" max="100" value="1" step="1" placeholder="Announcement ID"></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-4 col-sm-3"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Voice Type</p> <p class="text-add">Voice Type</p>
</div> </div>
<div class="col"><select id="messagevoicetype" class="input-add form-control"> <div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8"><select id="messagevoicetype" class="input-add form-control">
<option value="VOICE_1">Voice 1</option> <option value="VOICE_1">Voice 1</option>
<option value="VOICE_2">Voice 2</option> <option value="VOICE_2">Voice 2</option>
<option value="VOICE_3">Voice 3</option> <option value="VOICE_3">Voice 3</option>

File diff suppressed because it is too large Load Diff

View File

@@ -4,7 +4,7 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<title>AAS_NewGen_03Sept25</title> <title>AAS_NewGen_30Sept25</title>
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css"> <link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
<link rel="stylesheet" href="assets/css/styles.css"> <link rel="stylesheet" href="assets/css/styles.css">

View File

@@ -4,7 +4,7 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<title>AAS_NewGen_03Sept25</title> <title>AAS_NewGen_30Sept25</title>
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css"> <link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
<link rel="stylesheet" href="assets/css/styles.css"> <link rel="stylesheet" href="assets/css/styles.css">
@@ -62,46 +62,46 @@
</div> </div>
<div class="modal-body"> <div class="modal-body">
<div class="row"> <div class="row">
<div class="col-4 col-sm-3"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Index</p> <p class="text-add">Index</p>
</div> </div>
<div class="col"><input class="w-25 input-add form-control" type="text" id="modalindex" readonly=""></div> <div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8"><input class="w-25 input-add form-control" type="text" id="modalindex" readonly=""></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-4 col-sm-3"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Description</p> <p class="text-add">Description</p>
</div> </div>
<div class="col"><input type="text" id="modaldescription" class="form-control input-add"></div> <div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8"><input type="text" id="modaldescription" class="form-control input-add"></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-4 col-sm-3"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">TAG</p> <p class="text-add">TAG</p>
</div> </div>
<div class="col"><input type="text" id="modaltag" class="form-control input-add"></div> <div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8"><input type="text" id="modaltag" class="form-control input-add"></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-4 col-sm-3"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Category</p> <p class="text-add">Category</p>
</div> </div>
<div class="col"><select id="modalcategory" class="input-add form-select"></select></div> <div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8"><select id="modalcategory" class="input-add form-select"></select></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-4 col-sm-3"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Language</p> <p class="text-add">Language</p>
</div> </div>
<div class="col"><select id="modallanguage" class="input-add form-select"></select></div> <div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8"><select id="modallanguage" class="input-add form-select"></select></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-4 col-sm-3"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Voice Type</p> <p class="text-add">Voice Type</p>
</div> </div>
<div class="col"><select id="modalvoicetype" class="input-add form-select"></select></div> <div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8"><select id="modalvoicetype" class="input-add form-select"></select></div>
</div> </div>
<div class="row" style="height: 100px;"> <div class="row" style="height: 100px;">
<div class="col-4 col-sm-3"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Path</p> <p class="text-add">Path</p>
</div> </div>
<div class="col"><select class="w-100 js-example-basic-single" id="modalpath" name="modalpath"></select></div> <div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8"><select class="w-100 js-example-basic-single input-add form-select" id="modalpath" name="modalpath"></select></div>
</div> </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> <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>

View File

@@ -4,7 +4,7 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<title>AAS_NewGen_03Sept25</title> <title>AAS_NewGen_30Sept25</title>
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css"> <link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
<link rel="stylesheet" href="assets/css/styles.css"> <link rel="stylesheet" href="assets/css/styles.css">
@@ -12,13 +12,13 @@
<body> <body>
<div class="card" id="streamercard"> <div class="card" id="streamercard">
<div class="card-body"> <div class="card-body card-channel">
<h4 class="card-title" id="streamertitle">Channel 01</h4> <h4 class="card-title" id="streamertitle">Channel 01</h4>
<div class="row"> <div class="row">
<div class="col-8"> <div class="col-12 col-sm-12 col-md-12 col-lg-6 col-xl-6 col-xxl-6">
<h6 class="text-muted mb-2" id="streamerip">IP :&nbsp;192.168.10.10</h6> <h6 class="text-muted mb-2" id="streamerip">IP :&nbsp;192.168.10.10</h6>
</div> </div>
<div class="col"> <div class="col-12 col-sm-12 col-md-12 col-lg-6 col-xl-6 col-xxl-6">
<h6 class="text-muted mb-2" id="streamerbuffer">Free : 64KB</h6> <h6 class="text-muted mb-2" id="streamerbuffer">Free : 64KB</h6>
</div> </div>
</div> </div>

View File

@@ -4,7 +4,7 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<title>AAS_NewGen_03Sept25</title> <title>AAS_NewGen_30Sept25</title>
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css"> <link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
<link rel="stylesheet" href="assets/css/styles.css"> <link rel="stylesheet" href="assets/css/styles.css">
@@ -16,7 +16,7 @@
<h2 style="text-align: center;">Schedule Bank</h2> <h2 style="text-align: center;">Schedule Bank</h2>
</div> </div>
</div> </div>
<div class="row"> <div class="row pad-row-search">
<div class="col-md-7 col-lg-7 col-xl-7"></div> <div class="col-md-7 col-lg-7 col-xl-7"></div>
<div class="col-2 col-sm-2 col-md-2 col-lg-2 col-xl-2 search"> <div class="col-2 col-sm-2 col-md-2 col-lg-2 col-xl-2 search">
<p class="text-add">Search</p> <p class="text-add">Search</p>
@@ -63,110 +63,110 @@
</div> </div>
<div class="modal-body"> <div class="modal-body">
<div class="row"> <div class="row">
<div class="col-4 col-sm-3"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Index</p> <p class="text-add">Index</p>
</div> </div>
<div class="col"><input class="w-25 input-add form-control" type="text" id="scheduleid" readonly=""></div> <div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8"><input class="w-25 input-add form-control" type="text" id="scheduleid" readonly=""></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-4 col-sm-3"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Description</p> <p class="text-add">Description</p>
</div> </div>
<div class="col"><input type="text" id="scheduledescription" class="input-add form-control"></div> <div class="col"><input type="text" id="scheduledescription" class="input-add form-control"></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-4 col-sm-3"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Day</p> <p class="text-add">Day</p>
</div> </div>
<div class="col"> <div class="col">
<div class="row"> <div class="row pad-day">
<div class="col"> <div class="col">
<div class="form-check"><input class="form-check-input" type="radio" id="scheduleeveryday" name="dayselection" value="Everyday"><label class="form-check-label" for="formCheck-1">Everyday</label></div> <div class="form-check"><input class="form-check-input" type="radio" id="scheduleeveryday" name="dayselection" value="Everyday"><label class="form-check-label" for="formCheck-1">Everyday</label></div>
</div> </div>
</div> </div>
<div class="row"> <div class="row pad-day">
<div class="col"> <div class="col">
<div class="form-check"><input class="form-check-input" type="radio" id="schedulesunday" name="dayselection" value="Sunday"><label class="form-check-label" for="formCheck-8">Sunday</label></div> <div class="form-check"><input class="form-check-input" type="radio" id="schedulesunday" name="dayselection" value="Sunday"><label class="form-check-label" for="formCheck-8">Sunday</label></div>
</div> </div>
</div> </div>
<div class="row"> <div class="row pad-day">
<div class="col"> <div class="col">
<div class="form-check"><input class="form-check-input" type="radio" id="schedulemonday" name="dayselection" value="Monday"><label class="form-check-label" for="formCheck-7">Monday</label></div> <div class="form-check"><input class="form-check-input" type="radio" id="schedulemonday" name="dayselection" value="Monday"><label class="form-check-label" for="formCheck-7">Monday</label></div>
</div> </div>
</div> </div>
<div class="row"> <div class="row pad-day">
<div class="col"> <div class="col">
<div class="form-check"><input class="form-check-input" type="radio" id="scheduletuesday" name="dayselection" value="Tuesday"><label class="form-check-label" for="formCheck-6">Tuesday</label></div> <div class="form-check"><input class="form-check-input" type="radio" id="scheduletuesday" name="dayselection" value="Tuesday"><label class="form-check-label" for="formCheck-6">Tuesday</label></div>
</div> </div>
</div> </div>
<div class="row"> <div class="row pad-day">
<div class="col"> <div class="col">
<div class="form-check"><input class="form-check-input" type="radio" id="schedulewednesday" name="dayselection" value="Wednesday"><label class="form-check-label" for="formCheck-5">Wednesday</label></div> <div class="form-check"><input class="form-check-input" type="radio" id="schedulewednesday" name="dayselection" value="Wednesday"><label class="form-check-label" for="formCheck-5">Wednesday</label></div>
</div> </div>
</div> </div>
<div class="row"> <div class="row pad-day">
<div class="col"> <div class="col">
<div class="form-check"><input class="form-check-input" type="radio" id="schedulethursday" name="dayselection" value="Thursday"><label class="form-check-label" for="formCheck-4">Thursday</label></div> <div class="form-check"><input class="form-check-input" type="radio" id="schedulethursday" name="dayselection" value="Thursday"><label class="form-check-label" for="formCheck-4">Thursday</label></div>
</div> </div>
</div> </div>
<div class="row"> <div class="row pad-day">
<div class="col"> <div class="col">
<div class="form-check"><input class="form-check-input" type="radio" id="schedulefriday" name="dayselection" value="Friday"><label class="form-check-label" for="formCheck-3">Friday</label></div> <div class="form-check"><input class="form-check-input" type="radio" id="schedulefriday" name="dayselection" value="Friday"><label class="form-check-label" for="formCheck-3">Friday</label></div>
</div> </div>
</div> </div>
<div class="row"> <div class="row pad-day">
<div class="col"> <div class="col">
<div class="form-check"><input class="form-check-input" type="radio" id="schedulesaturday" name="dayselection" value="Saturday"><label class="form-check-label" for="formCheck-2">Saturday</label></div> <div class="form-check"><input class="form-check-input" type="radio" id="schedulesaturday" name="dayselection" value="Saturday"><label class="form-check-label" for="formCheck-2">Saturday</label></div>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col"> <div class="col-7 col-sm-7 col-md-7 col-lg-6 col-xl-6 pad-day">
<div class="form-check"><input class="form-check-input" type="radio" id="schedulespecialdate" name="dayselection"><label class="form-check-label" for="formCheck-9">Special Date</label></div> <div class="form-check"><input class="form-check-input" type="radio" id="schedulespecialdate" name="dayselection"><label class="form-check-label" for="formCheck-9">Special Date</label></div>
</div> </div>
<div class="col"><input id="scheduledate" type="date"></div> <div class="col-sm-5 col-md-5 col-lg-6 col-xl-6"><input id="scheduledate" class="form-control" type="date"></div>
</div> </div>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-4 col-sm-3"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Time</p> <p class="text-add">Time</p>
</div> </div>
<div class="col"> <div class="col">
<div class="row w-100 h-100"> <div class="row w-100 h-100">
<div class="col-3"><input class="w-100 h-100" type="number" id="schedulehour" value="0" min="0" max="23" step="1"></div> <div class="col-4 col-sm-4 col-md-4 col-lg-3 col-xl-3"><input type="number" id="schedulehour" class="input-add form-control class100" value="0" min="0" max="23" step="1"></div>
<div class="col-1"> <div class="col-2 col-sm-2 col-md-2 col-lg-3 col-xl-3">
<p class="w-100 h-100">(H)</p> <p class="pad-time">(H)</p>
</div> </div>
<div class="col-3"><input class="w-100 h-100" type="number" id="scheduleminute" value="0" min="0" max="59" step="1"></div> <div class="col-4 col-sm-4 col-md-4 col-lg-3 col-xl-3"><input class="w-100 input-add form-control" type="number" id="scheduleminute" value="0" min="0" max="59" step="1"></div>
<div class="col-1"> <div class="col-2 col-sm-2 col-md-2 col-lg-3 col-xl-3">
<p class="w-100 h-100">(M)</p> <p class="pad-time">(M)</p>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-4 col-sm-3"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Sound Path</p> <p class="text-add">Sound Path</p>
</div> </div>
<div class="col"><input type="text" id="schedulesoundpath" class="input-add form-control"></div> <div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8"><input type="text" id="schedulesoundpath" class="input-add form-control"></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-4 col-sm-3"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Repeat</p> <p class="text-add">Repeat</p>
</div> </div>
<div class="col"><input class="w-25 form-select input-add" type="number" id="schedulerepeat" min="0" max="5" step="1" value="0"></div> <div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8"><input class="w-25 form-select input-add" type="number" id="schedulerepeat" min="0" max="5" step="1" value="0"></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-4 col-sm-3"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Enable</p> <p class="text-add">Enable</p>
</div> </div>
<div class="col"><input type="checkbox" id="scheduleenable" class="form-check-input form-check text-add" checked=""></div> <div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8"><input type="checkbox" id="scheduleenable" class="form-check-input form-check text-add" checked=""></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-4 col-sm-3"> <div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Broadcast Zones</p> <p class="text-add">Broadcast Zones</p>
</div> </div>
<div class="col border p-2" id="schedulezones"></div> <div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8 border" id="schedulezones"></div>
</div> </div>
</div> </div>
<div class="modal-footer"><button class="btn btn-round-basic color-edit class25" id="scheduleclose" type="button" data-bs-dismiss="modal">Close</button><button class="btn btn-round-basic class25 color-add" id="schedulesave" type="button">Save</button></div> <div class="modal-footer"><button class="btn btn-round-basic color-edit class25" id="scheduleclose" type="button" data-bs-dismiss="modal">Close</button><button class="btn btn-round-basic class25 color-add" id="schedulesave" type="button">Save</button></div>

View File

@@ -0,0 +1,153 @@
<!DOCTYPE html>
<html data-bs-theme="light" lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<title>AAS_NewGen_30Sept25</title>
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
<link rel="stylesheet" href="assets/css/styles.css">
</head>
<body class="bg-body">
<div class="row">
<div class="col w-100 h-100 pad-header">
<h2 style="text-align: center;">User Management</h2>
</div>
</div>
<div class="row">
<div class="col-md-7 col-lg-7 col-xl-7"></div>
<div class="col-2 col-sm-2 col-md-2 col-lg-2 col-xl-2 search">
<p class="text-add">Search</p>
</div>
<div class="col-10 col-sm-10 col-md-3 col-lg-3 col-xl-3"><input class="w-100 form-control" type="text" id="finduser" placeholder="Search keyword" name="findsoundbank"></div>
</div>
<div class="row">
<div class="col">
<p id="tablesize" class="text-add" style="text-align: center;">Table Length : N/A</p>
</div>
</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="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>
<div class="row">
<div class="table-responsive">
<table class="table">
<thead>
<tr>
<th class="col-sm-1">No</th>
<th class="col-sm-1">Username</th>
<th class="col-sm-1">Location</th>
<th class="col">Soundbank</th>
<th class="col-sm-2">Messagebank</th>
<th class="col-sm-2">Broadcast Zones</th>
</tr>
</thead>
<tbody id="usertablebody"></tbody>
</table>
</div>
</div>
<div class="modal fade border-0" role="dialog" tabindex="-1" id="addmodal">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header show">
<h4 class="modal-title align-content-center">Add / Edit User</h4>
</div>
<div class="modal-body">
<div class="row">
<div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Index</p>
</div>
<div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8"><input class="w-25 input-add form-control" type="text" id="modalindex" readonly=""></div>
</div>
<div class="row">
<div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Username</p>
</div>
<div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8"><input type="text" id="modalusername" class="form-control input-add"></div>
</div>
<div class="row">
<div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Password</p>
</div>
<div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8"><input type="password" id="modalpassword" class="form-control input-add"></div>
</div>
<div class="row">
<div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Verify Password</p>
</div>
<div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8"><input type="password" id="modalverifypassword" class="input-add form-control"></div>
</div>
<div class="row">
<div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Sound Bank</p>
</div>
<div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8"><input type="text" id="modalsoundbank" class="input-add"><button class="btn btn-primary" id="btnShowSoundbankModal" type="button">Select</button></div>
</div>
<div class="row">
<div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Message Bank</p>
</div>
<div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8"><input type="text" id="modalmessagebank" class="input-add"><button class="btn btn-primary" id="btnShowMessagebankModal" type="button">Select</button></div>
</div>
<div class="row" style="height: 100px;">
<div class="col-4 col-sm-4 col-md-4 col-lg-4 col-xl-4">
<p class="text-add">Broadcast Zones</p>
</div>
<div class="col-8 col-sm-8 col-md-8 col-lg-8 col-xl-8"><input type="text" id="modalbroadcastzones" class="input-add" name="modalpath"><button class="btn btn-primary" id="btnShowBroaadcastZoneModal" type="button">Select</button></div>
</div>
</div>
<div class="modal-footer"><button class="btn btn-round-basic color-edit class25" id="usermanagementclose" type="button" data-bs-dismiss="modal">Close</button><button class="btn btn-round-basic color-add class25" id="usermanagementsave" type="button">Save</button></div>
</div>
</div>
</div>
<div class="modal fade" role="dialog" tabindex="-1" id="soundbankmodal">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Sound Bank Selection</h4>
</div>
<div class="modal-body">
<p>(mon, ganti list checkbox, dengan id=soundbankselection</p>
</div>
<div class="modal-footer"><button class="btn btn-light" id="soundbankselectionclose" type="button" data-bs-dismiss="modal">Close</button><button class="btn btn-primary" id="soundbankselectionsave" type="button">Save</button></div>
</div>
</div>
</div>
<div class="modal fade" role="dialog" tabindex="-1" id="broadcastzonemodal">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Broadcast Zones Selection</h4>
</div>
<div class="modal-body">
<p>(mon, ganti list checkbox, dengan id=broadcastzoneselection</p>
</div>
<div class="modal-footer"><button class="btn btn-light" id="broadcastzoneselectionclose" type="button" data-bs-dismiss="modal">Close</button><button class="btn btn-primary" id="broadcastzoneselectionsave" type="button">Save</button></div>
</div>
</div>
</div>
<div class="modal fade" role="dialog" tabindex="-1" id="messagebankmodal">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Message Bank Selection</h4>
</div>
<div class="modal-body">
<p>(mon, ganti list checkbox, dengan id=messagebankselection</p>
</div>
<div class="modal-footer"><button class="btn btn-light" id="messagebankselectionclose" type="button" data-bs-dismiss="modal">Close</button><button class="btn btn-primary" id="messagebankselectionsave" type="button">Save</button></div>
</div>
</div>
</div>
<script src="assets/bootstrap/js/bootstrap.min.js"></script>
<script src="assets/js/usermanagement.js"></script>
</body>
</html>

View File

@@ -16,7 +16,6 @@ import content.Language
import content.ScheduleDay import content.ScheduleDay
import content.VoiceType import content.VoiceType
import database.BroadcastZones import database.BroadcastZones
import database.BroadcastZonesHtml
import database.LanguageLink import database.LanguageLink
import database.MariaDB import database.MariaDB
import database.Messagebank import database.Messagebank
@@ -831,17 +830,17 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
path("BroadcastZones"){ path("BroadcastZones"){
get("List") { get("List") {
// TODO : temporary, convert BroadcastZones to BroadcastZonesHtml, karena harus revisi javascript di Bootstrap Studio // TODO : temporary, convert BroadcastZones to BroadcastZonesHtml, karena harus revisi javascript di Bootstrap Studio
val newlist: ArrayList<BroadcastZonesHtml> = db.broadcastDB.List.map { xx -> // val newlist: ArrayList<BroadcastZonesHtml> = db.broadcastDB.List.map { xx ->
BroadcastZonesHtml( // BroadcastZonesHtml(
xx.index, // xx.index,
xx.description, // xx.description,
xx.SoundChannel, // xx.SoundChannel,
xx.id, // xx.id,
xx.bp // xx.bp
) // )
} as ArrayList<BroadcastZonesHtml> // } as ArrayList<BroadcastZonesHtml>
it.result(MariaDB.ArrayListtoString(newlist)) it.result(MariaDB.ArrayListtoString(db.broadcastDB.List))
} }
delete("List"){ delete("List"){
// truncate broadcast zones table // truncate broadcast zones table