multi dataset
This commit is contained in:
@@ -92,6 +92,7 @@ const adminPanelHTML = `<!DOCTYPE html>
|
||||
|
||||
<div class="tabs">
|
||||
<button class="tab active" data-tab="clients" onclick="showTab('clients')">Clients</button>
|
||||
<button class="tab" data-tab="datasets" onclick="showTab('datasets')">Datasets</button>
|
||||
<button class="tab" data-tab="snapshots" onclick="showTab('snapshots')">Snapshots</button>
|
||||
<button class="tab" data-tab="admins" onclick="showTab('admins')">Admins</button>
|
||||
</div>
|
||||
@@ -121,6 +122,32 @@ const adminPanelHTML = `<!DOCTYPE html>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="datasets-tab" class="hidden">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h3>Datasets</h3>
|
||||
<select id="dataset-client-filter" onchange="loadDatasets()">
|
||||
<option value="">All Clients</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Client</th>
|
||||
<th>Dataset Name</th>
|
||||
<th>Storage Type</th>
|
||||
<th>Status</th>
|
||||
<th>Snapshots</th>
|
||||
<th>Actions</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="datasets-table"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="snapshots-tab" class="hidden">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
@@ -134,9 +161,11 @@ const adminPanelHTML = `<!DOCTYPE html>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Client</th>
|
||||
<th>Dataset</th>
|
||||
<th>Snapshot ID</th>
|
||||
<th>Timestamp</th>
|
||||
<th>Size</th>
|
||||
<th>Storage</th>
|
||||
<th>Type</th>
|
||||
<th>Actions</th>
|
||||
</tr>
|
||||
@@ -474,6 +503,76 @@ const adminPanelHTML = `<!DOCTYPE html>
|
||||
}
|
||||
}
|
||||
|
||||
// Load datasets
|
||||
async function loadDatasets() {
|
||||
const clientId = document.getElementById('dataset-client-filter').value;
|
||||
const url = '/admin/datasets' + (clientId ? '?client_id=' + clientId : '');
|
||||
|
||||
try {
|
||||
const res = await fetch(url);
|
||||
const datasets = await res.json();
|
||||
|
||||
const tbody = document.getElementById('datasets-table');
|
||||
tbody.innerHTML = datasets.map(d =>
|
||||
'<tr>' +
|
||||
'<td>' + d.client_id + '</td>' +
|
||||
'<td><strong>' + d.dataset_name + '</strong></td>' +
|
||||
'<td><span class="badge badge-info">' + d.storage_type + '</span></td>' +
|
||||
'<td>' + (d.enabled ? '<span class="badge badge-success">Enabled</span>' : '<span class="badge badge-danger">Disabled</span>') + '</td>' +
|
||||
'<td>' + (d.snapshot_count || 0) + '</td>' +
|
||||
'<td>' +
|
||||
'<button class="btn btn-sm ' + (d.enabled ? 'btn-danger' : 'btn-success') + '" onclick="toggleDataset(' + d.id + ', ' + !d.enabled + ')">' + (d.enabled ? 'Disable' : 'Enable') + '</button>' +
|
||||
'<button class="btn btn-sm btn-danger" onclick="deleteDataset(' + d.id + ', \'' + d.dataset_name + '\')">Delete</button>' +
|
||||
'</td>' +
|
||||
'</tr>'
|
||||
).join('');
|
||||
|
||||
// Update client filter if not set
|
||||
if (!clientId) {
|
||||
const clientsRes = await fetch('/admin/clients');
|
||||
const clients = await clientsRes.json();
|
||||
const filter = document.getElementById('dataset-client-filter');
|
||||
filter.innerHTML = '<option value="">All Clients</option>' +
|
||||
clients.map(c => '<option value="' + c.client_id + '">' + c.client_id + '</option>').join('');
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('Failed to load datasets:', e);
|
||||
}
|
||||
}
|
||||
|
||||
// Toggle dataset enabled/disabled
|
||||
async function toggleDataset(id, enabled) {
|
||||
try {
|
||||
const res = await fetch('/admin/datasets/' + id, {
|
||||
method: 'PUT',
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
body: JSON.stringify({enabled: enabled})
|
||||
});
|
||||
if (res.ok) {
|
||||
loadDatasets();
|
||||
} else {
|
||||
alert('Failed to update dataset');
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('Failed to toggle dataset:', e);
|
||||
}
|
||||
}
|
||||
|
||||
// Delete dataset
|
||||
async function deleteDataset(id, name) {
|
||||
if (!confirm('Delete dataset ' + name + '?')) return;
|
||||
try {
|
||||
const res = await fetch('/admin/datasets/' + id, {method: 'DELETE'});
|
||||
if (res.ok) {
|
||||
loadDatasets();
|
||||
} else {
|
||||
alert('Failed to delete dataset');
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('Failed to delete dataset:', e);
|
||||
}
|
||||
}
|
||||
|
||||
// Load snapshots
|
||||
async function loadSnapshots() {
|
||||
const clientId = document.getElementById('snapshot-client-filter').value;
|
||||
@@ -488,12 +587,14 @@ const adminPanelHTML = `<!DOCTYPE html>
|
||||
const sizeGB = (s.size_bytes / (1024*1024*1024)).toFixed(2);
|
||||
return '<tr>' +
|
||||
'<td>' + s.client_id + '</td>' +
|
||||
'<td>' + (s.dataset_name || '-') + '</td>' +
|
||||
'<td>' + s.snapshot_id + '</td>' +
|
||||
'<td>' + new Date(s.timestamp).toLocaleString() + '</td>' +
|
||||
'<td>' + sizeGB + ' GB</td>' +
|
||||
'<td><span class="badge ' + (s.storage_type === 's3' ? 'badge-info' : 'badge-warning') + '">' + s.storage_type + '</span></td>' +
|
||||
'<td>' +
|
||||
(s.incremental ? '<span class="badge badge-info">Incremental</span>' : '<span class="badge badge-success">Full</span>') +
|
||||
(s.compressed ? ' <span class="badge badge-info">Compressed</span>' : '') +
|
||||
(s.incremental ? '<span class="badge badge-info">Inc</span>' : '<span class="badge badge-success">Full</span>') +
|
||||
(s.compressed ? ' <span class="badge badge-info">LZ4</span>' : '') +
|
||||
'</td>' +
|
||||
'<td><button class="btn btn-sm btn-danger" onclick="deleteSnapshot(\'' + s.client_id + '\', \'' + s.snapshot_id + '\')">Delete</button></td>' +
|
||||
'</tr>';
|
||||
@@ -534,12 +635,14 @@ const adminPanelHTML = `<!DOCTYPE html>
|
||||
document.querySelector('.tab[data-tab="' + tab + '"]').classList.add('active');
|
||||
|
||||
document.getElementById('clients-tab').classList.add('hidden');
|
||||
document.getElementById('datasets-tab').classList.add('hidden');
|
||||
document.getElementById('snapshots-tab').classList.add('hidden');
|
||||
document.getElementById('admins-tab').classList.add('hidden');
|
||||
document.getElementById(tab + '-tab').classList.remove('hidden');
|
||||
|
||||
if (tab === 'snapshots') loadSnapshots();
|
||||
if (tab === 'admins') loadAdmins();
|
||||
if (tab === 'datasets') loadDatasets();
|
||||
}
|
||||
|
||||
// Modal functions
|
||||
|
||||
Reference in New Issue
Block a user