update
This commit is contained in:
@@ -36,6 +36,10 @@ let consoleContainer;
|
||||
let debugStylesInjected = false;
|
||||
let consolePatched = false;
|
||||
const consoleBuffer = [];
|
||||
let adminTablesAllSelect;
|
||||
let adminTablesSelectedSelect;
|
||||
let adminTablesAddBtn;
|
||||
let adminTablesRemoveBtn;
|
||||
|
||||
ensureConsoleCapture();
|
||||
|
||||
@@ -61,6 +65,10 @@ export function initAccountPage() {
|
||||
userForm = document.getElementById('userForm');
|
||||
senderTable = document.getElementById('senderTable');
|
||||
senderForm = document.getElementById('senderForm');
|
||||
adminTablesAllSelect = document.getElementById('adminBridgeTablesAll');
|
||||
adminTablesSelectedSelect = document.getElementById('adminBridgeTablesSelected');
|
||||
adminTablesAddBtn = document.getElementById('adminBridgeTablesAdd');
|
||||
adminTablesRemoveBtn = document.getElementById('adminBridgeTablesRemove');
|
||||
|
||||
document.getElementById('btn-user-add')?.addEventListener('click', () => openUserForm());
|
||||
document.getElementById('userFormCancel')?.addEventListener('click', () => closeUserForm());
|
||||
@@ -98,6 +106,18 @@ export function initAccountPage() {
|
||||
});
|
||||
}
|
||||
|
||||
adminTablesAddBtn?.addEventListener('click', () => {
|
||||
addAdminTables(getSelectedOptions(adminTablesAllSelect));
|
||||
});
|
||||
adminTablesRemoveBtn?.addEventListener('click', () => {
|
||||
removeAdminTables(getSelectedOptions(adminTablesSelectedSelect));
|
||||
});
|
||||
|
||||
window.addEventListener('bridge-setup-updated', (ev) => {
|
||||
const setup = ev?.detail || {};
|
||||
refreshAdminTables(setup.tables || [], state.settings.bridge_tables || []);
|
||||
});
|
||||
|
||||
switchTab(state.currentTab);
|
||||
loadAccountData();
|
||||
updateRoleVisibility();
|
||||
@@ -244,6 +264,7 @@ function fillSettingsForm(settings) {
|
||||
settingsForm.sender_token.value = settings.sender_token || '';
|
||||
settingsForm.external_api_token.value = settings.external_api_token || '';
|
||||
state.rotate = { bridge: false, sender: false, external: false };
|
||||
refreshAdminTables(settings.bridge_setup?.tables || [], settings.bridge_tables || []);
|
||||
}
|
||||
|
||||
async function submitProfileForm(ev) {
|
||||
@@ -281,11 +302,13 @@ async function submitPasswordForm(ev) {
|
||||
|
||||
async function submitSettingsForm(ev) {
|
||||
ev.preventDefault();
|
||||
const bridgeTables = normalizeTableList(state.settings.bridge_tables || []);
|
||||
const data = {
|
||||
bridge_url: settingsForm.bridge_url.value.trim(),
|
||||
bridge_token: settingsForm.bridge_token.value.trim(),
|
||||
sender_token: settingsForm.sender_token.value.trim(),
|
||||
external_api_token: settingsForm.external_api_token.value.trim(),
|
||||
bridge_tables: bridgeTables,
|
||||
rotate_bridge_token: state.rotate.bridge ? 1 : 0,
|
||||
rotate_sender_token: state.rotate.sender ? 1 : 0,
|
||||
rotate_external_token: state.rotate.external ? 1 : 0,
|
||||
@@ -322,6 +345,83 @@ async function downloadFile(type) {
|
||||
}
|
||||
}
|
||||
|
||||
function normalizeTableList(input) {
|
||||
const items = Array.isArray(input) ? input : (typeof input === 'string' ? input.split(/[\s,]+/) : []);
|
||||
const result = [];
|
||||
const seen = new Set();
|
||||
items.forEach(entry => {
|
||||
const name = String(entry || '').trim();
|
||||
if (name && !seen.has(name)) {
|
||||
seen.add(name);
|
||||
result.push(name);
|
||||
}
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
function refreshAdminTables(availableTables, selectedTables) {
|
||||
const whitelist = normalizeTableList(availableTables);
|
||||
let selected = normalizeTableList(selectedTables);
|
||||
if (!selected.length) {
|
||||
selected = whitelist.slice();
|
||||
}
|
||||
if (whitelist.length) {
|
||||
selected = selected.filter(name => whitelist.includes(name));
|
||||
}
|
||||
state.settings.bridge_tables = selected;
|
||||
state.settings.bridge_setup = state.settings.bridge_setup || {};
|
||||
state.settings.bridge_setup.tables = whitelist;
|
||||
updateAdminTableSelects(whitelist, selected);
|
||||
}
|
||||
|
||||
function updateAdminTableSelects(availableTables, selectedTables) {
|
||||
const selectedSet = new Set(selectedTables);
|
||||
const available = availableTables.filter(name => !selectedSet.has(name));
|
||||
renderSelect(adminTablesAllSelect, available, 'Keine Tabellen freigegeben.');
|
||||
renderSelect(adminTablesSelectedSelect, selectedTables, 'Noch keine Tabellen ausgewaehlt.');
|
||||
}
|
||||
|
||||
function renderSelect(selectEl, list, emptyLabel) {
|
||||
if (!selectEl) return;
|
||||
selectEl.innerHTML = '';
|
||||
if (!list.length) {
|
||||
const opt = document.createElement('option');
|
||||
opt.textContent = emptyLabel;
|
||||
opt.disabled = true;
|
||||
selectEl.appendChild(opt);
|
||||
return;
|
||||
}
|
||||
list.forEach(name => {
|
||||
const opt = document.createElement('option');
|
||||
opt.value = name;
|
||||
opt.textContent = name;
|
||||
selectEl.appendChild(opt);
|
||||
});
|
||||
}
|
||||
|
||||
function getSelectedOptions(selectEl) {
|
||||
if (!selectEl) return [];
|
||||
return Array.from(selectEl.selectedOptions || []).map(opt => opt.value);
|
||||
}
|
||||
|
||||
function addAdminTables(list) {
|
||||
const whitelist = normalizeTableList(state.settings.bridge_setup?.tables || []);
|
||||
if (!whitelist.length) return;
|
||||
const selected = normalizeTableList(state.settings.bridge_tables || []);
|
||||
const merged = normalizeTableList([...selected, ...list]).filter(name => whitelist.includes(name));
|
||||
state.settings.bridge_tables = merged;
|
||||
updateAdminTableSelects(whitelist, merged);
|
||||
}
|
||||
|
||||
function removeAdminTables(list) {
|
||||
const whitelist = normalizeTableList(state.settings.bridge_setup?.tables || []);
|
||||
if (!whitelist.length) return;
|
||||
const removeSet = new Set(list);
|
||||
const next = normalizeTableList(state.settings.bridge_tables || []).filter(name => !removeSet.has(name));
|
||||
state.settings.bridge_tables = next;
|
||||
updateAdminTableSelects(whitelist, next);
|
||||
}
|
||||
|
||||
async function loadUsers() {
|
||||
try {
|
||||
const res = await apiAction('account.users.list', { method: 'GET' });
|
||||
|
||||
Reference in New Issue
Block a user