Skip to content

Commit

Permalink
edit vhosts
Browse files Browse the repository at this point in the history
  • Loading branch information
baelter committed Jun 12, 2018
1 parent 42d785d commit cf30cae
Show file tree
Hide file tree
Showing 11 changed files with 232 additions and 15 deletions.
2 changes: 1 addition & 1 deletion static/channels.html
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ <h2>
<script src="/js/overview.js"></script>
<script src="/js/table.js"></script>
<script>
avalanchemq.table.renderTable("/api/channels", ["name"], 5000, function (tr, item) {
avalanchemq.table.renderTable("table", "/api/channels", ["name"], 5000, function (tr, item) {
var mode = "";
mode += item.confirm ? " C" : "";
avalanchemq.table.renderCell(tr, 0, item.name);
Expand Down
2 changes: 1 addition & 1 deletion static/connections.html
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ <h2>
<script src="/js/overview.js"></script>
<script src="/js/table.js"></script>
<script>
avalanchemq.table.renderTable("/api/connections", ["name"], 5000, function (tr, item) {
avalanchemq.table.renderTable("table", "/api/connections", ["name"], 5000, function (tr, item) {
avalanchemq.table.renderCell(tr, 0, item.vhost);
avalanchemq.table.renderCell(tr, 1, item.name);
avalanchemq.table.renderCell(tr, 2, item.user);
Expand Down
2 changes: 1 addition & 1 deletion static/exchanges.html
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ <h2>
<script src="/js/overview.js"></script>
<script src="/js/table.js"></script>
<script>
avalanchemq.table.renderTable("/api/exchanges", ["vhost", "name"], 5000, function (tr, item) {
avalanchemq.table.renderTable("table", "/api/exchanges", ["vhost", "name"], 5000, function (tr, item) {
var features = "";
features += item.durable ? " D" : "";
features += item.auto_delete ? " AD" : "";
Expand Down
5 changes: 5 additions & 0 deletions static/js/overview.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@

function update() {
avalanchemq.http.request("GET", url).then(function (response) {
try {
localStorage.setItem("/api/overview", JSON.stringify(response));
} catch (e) {
console.error("Saving localStorage", e);
}
render(response);
});
}
Expand Down
12 changes: 6 additions & 6 deletions static/js/table.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
window.avalanchemq = window.avalanchemq || {};
let avalanchemq = window.avalanchemq;

function renderTable(url, keyColumns, interval, renderRow) {
function renderTable(id, url, keyColumns, interval, renderRow) {
let sortKey = "";
let reverseOrder = false;
let raw = localStorage.getItem(url);
Expand All @@ -18,7 +18,7 @@
}

function makeHeadersSortable() {
document.querySelectorAll("#table th[data-sort-key]").forEach(function (cell) {
document.querySelectorAll("#" + id + " th[data-sort-key]").forEach(function (cell) {
cell.addEventListener("click", function (e) {
// let column = e.target.cellIndex;
// let newSortColumn = e.target.textContent.toLowerCase();
Expand All @@ -30,7 +30,7 @@
reverseOrder = false;
}
clearInterval(updateTimer);
let t = document.getElementById("table").tBodies[0];
let t = document.getElementById(id).tBodies[0];
clearRows(t);
let raw = localStorage.getItem(url);
updateTable(raw);
Expand All @@ -45,7 +45,7 @@
}

function fetchAndUpdate() {
let tableError = document.getElementById("table-error");
let tableError = document.getElementById(id + "-error");
return avalanchemq.http.request("GET", url).then(function (response) {
tableError.textContent = "";
try {
Expand All @@ -69,8 +69,8 @@
return;
}
data.sort(byColumn);
document.getElementById("table-count").textContent = data.length;
let t = document.getElementById("table").tBodies[0];
document.getElementById(id + "-count").textContent = data.length;
let t = document.getElementById(id).tBodies[0];
for (let i = 0; i < data.length; i++) {
let item = data[i];
let foundIndex = findIndex(t.rows, i, item);
Expand Down
29 changes: 29 additions & 0 deletions static/js/users.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
(function () {
window.avalanchemq = window.avalanchemq || {};
let avalanchemq = window.avalanchemq;

function fetch(cb) {
let url = "/api/users";
let raw = localStorage.getItem(url);
if (raw) {
var users = JSON.parse(raw);
cb(users);
}
avalanchemq.http.request("GET", url).then(function (users) {
try {
localStorage.setItem("/api/users", JSON.stringify(users));
} catch (e) {
console.error("Saving localStorage", e);
}
cb(users);
}).catch(function (e) {
console.error(e.message);
});
}

Object.assign(window.avalanchemq, {
users: {
fetch
}
});
})();
2 changes: 1 addition & 1 deletion static/queues.html
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ <h2>

avalanchemq.vhosts.fetch(addVhostOptions);

avalanchemq.table.renderTable("/api/queues", ["vhost", "name"], 5000, function (tr, item) {
avalanchemq.table.renderTable("table", "/api/queues", ["vhost", "name"], 5000, function (tr, item) {
var features = "";
features += item.durable ? " D" : "";
features += item.auto_delete ? " AD" : "";
Expand Down
2 changes: 1 addition & 1 deletion static/user.html
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ <h2>
.catch(e => console.error.apply(console, e))

const permissionsUrl = "/api/users/" + urlEncodedUsername + "/permissions"
avalanchemq.table.renderTable(permissionsUrl, [], 0, (tr, item) => {
avalanchemq.table.renderTable("table", permissionsUrl, [], 0, (tr, item) => {
let btn = document.createElement("button")
btn.innerHTML = "Clear"
btn.onclick = function (evt) {
Expand Down
4 changes: 2 additions & 2 deletions static/users.html
Original file line number Diff line number Diff line change
Expand Up @@ -71,11 +71,11 @@ <h2>
<script src="/js/table.js"></script>
<script>
avalanchemq.http.request("GET", "/api/permissions").then(permissions => {
avalanchemq.table.renderTable("/api/users", ["name", "tags"], 0, (tr, item) => {
avalanchemq.table.renderTable("table", "/api/users", ["name", "tags"], 0, (tr, item) => {
let hasPassword = item.password_hash.length ? "●" : "";
let vhosts = permissions.filter(p => p.user == item.name).map(p => p.vhost).join(", ")
let userLink = document.createElement("a")
userLink.href = "/user?name=" + item.name
userLink.href = "/user?name=" + encodeURIComponent(item.name)
userLink.textContent = item.name
avalanchemq.table.renderCell(tr, 0, userLink)
avalanchemq.table.renderCell(tr, 1, item.tags)
Expand Down
170 changes: 170 additions & 0 deletions static/vhost.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>Virtual host | AvalancheMQ</title>
<link href="/main.css" rel="stylesheet">
<meta name="google" content="notranslate">
</head>
<body>
<div class="container">
<header>
<h1>
AvalancheMQ
<small id="version"></small>
</h1>
<div id="user-info">
<span>👤:&nbsp;</span>
<span id="username"></span>
<span id="vhost"></span>
</div>
</header>
<ul id="menu">
<li><a href="/">Overview</a></li>
<li><a href="/connections">Connections</a></li>
<li><a href="/channels">Channels</a></li>
<li><a href="/queues">Queues</a></li>
<li><a href="/exchanges">Exchanges</a></li>
<li><a href="/users">Users</a></li>
<li><a href="/vhosts">Virtual Hosts</a></li>
</ul>
<h2>
Virtual host:
<small id="vhost2"></small>
</h2>
<h2>
Message stats
</h2>
<table id="msg-table" class="table">
<thead>
<tr>
<th>Ready</th>
<th>Unacked</th>
<th>Total</th>
</tr>
</thead>
<tbody>
<td id="ready"></td>
<td id="unacked"></td>
<td id="total"></td>
</tbody>
</table>
<div id="table-error"></div>
<h2>
Permissions
<small id="table-count"></small>
</h2>
<table id="table" class="table">
<thead>
<tr>
<th>User</th>
<th>Configure regexp</th>
<th>Write regexp</th>
<th>Read regexp</th>
<th></th>
</tr>
</thead>
<tbody></tbody>
</table>
<form method="put" id="setPermission">
<fieldset>
<legend>Set permission</legend>
<label>
User
<select name="user" required></select>
</label>
<label>
Configure regexp
<input type="text" name="configure" required value=".*">
</label>
<label>
Write regexp
<input type="text" name="write" required value=".*">
</label>
<label>
Read regexp
<input type="text" name="read" required value=".*">
</label>
<button type="submit">Set permission</button>
</fieldset>
</form>
<form method="delete" id="deleteVhost">
<fieldset>
<legend>Delete vhost</legend>
<button type="submit">Delete</button>
</fieldset>
</form>
</div>
<script src="/js/auth.js"></script>
<script src="/js/http.js"></script>
<script src="/js/overview.js"></script>
<script src="/js/users.js"></script>
<script src="/js/table.js"></script>
<script>
const vhost = new URLSearchParams(window.location.search).get("name")
document.title = vhost + " | AvalancheMQ"
document.querySelector("#vhost2").textContent = vhost
const urlEncodedVhost = encodeURIComponent(vhost)

const vhostUrl = "/api/vhosts/" + urlEncodedVhost
avalanchemq.http.request("GET", vhostUrl).then(item => {
document.getElementById("ready").textContent = item.messages_ready
document.getElementById("unacked").textContent = item.messages_unacknowledged
document.getElementById("total").textContent = item.messages
})

const permissionsUrl = "/api/vhosts/" + urlEncodedVhost + "/permissions"
avalanchemq.table.renderTable("table", permissionsUrl, [], 0, (tr, item) => {
let btn = document.createElement("button")
btn.innerHTML = "Clear"
btn.onclick = function (evt) {
let url = "/api/permissions/" + urlEncodedVhost + "/" + encodeURIComponent(item.user)
avalanchemq.http.request("DELETE", url)
.then(() => window.location.reload())
.catch(e => console.error.apply(console, e))
}
let userLink = document.createElement("a")
userLink.href = "/user?name=" + encodeURIComponent(item.user)
userLink.textContent = item.user
avalanchemq.table.renderCell(tr, 0, userLink)
avalanchemq.table.renderCell(tr, 1, item.configure)
avalanchemq.table.renderCell(tr, 2, item.write)
avalanchemq.table.renderCell(tr, 3, item.read)
avalanchemq.table.renderCell(tr, 4, btn)
})

function addUserOptions(users) {
let select = document.forms["setPermission"].elements["user"]
while (select.options.length) select.remove(0)
for (let i = 0; i < users.length; i++) {
let opt = document.createElement("option")
opt.text = users[i].name
select.add(opt)
}
}

avalanchemq.users.fetch(addUserOptions);

document.querySelector("#setPermission").addEventListener("submit", function (evt) {
evt.preventDefault();
let data = new FormData(this)
let url = "/api/permissions/" + urlEncodedVhost + "/" + encodeURIComponent(data.get("user"))
body = {
configure: data.get("configure"),
write: data.get("write"),
read: data.get("read")
}
avalanchemq.http.request("PUT", url, body)
.then(() => window.location.reload())
.catch(e => console.error.apply(console, e))
})

document.querySelector("#deleteVhost").addEventListener("submit", function (evt) {
evt.preventDefault();
let url = "/api/vhosts/" + urlEncodedVhost
avalanchemq.http.request("DELETE", url)
.then(() => window.location = "/vhosts")
.catch(e => console.error.apply(console, e))
})
</script>
</body>
</html>
17 changes: 15 additions & 2 deletions static/vhosts.html
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,23 @@ <h2>
<script src="/js/overview.js"></script>
<script src="/js/table.js"></script>
<script>
avalanchemq.table.renderTable("/api/vhosts", ["name", "ready", "unacked", "total"], 0, (tr, item) => {
avalanchemq.table.renderTable("table", "/api/vhosts", ["name", "ready", "unacked", "total"], 5000, (tr, item) => {
const urlEncodedVhost = encodeURIComponent(item.name)
const permissionsUrl = "/api/vhosts/" + urlEncodedVhost + "/permissions"
avalanchemq.http.request("GET", permissionsUrl).then(permissions => {
const permissionsPromise = new Promise(function(resolve, reject) {
const raw = localStorage.getItem(permissionsUrl)

if (raw) {
resolve(JSON.parse(raw))
} else {
avalanchemq.http.request("GET", permissionsUrl).then(permissions => {
localStorage.setItem(permissionsUrl, JSON.stringify(permissions))
resolve(permissions)
}).catch(e => reject(e))
}
})

permissionsPromise.then(permissions => {
const userList = permissions.filter(p => p.vhost == item.name).map(p => p.user).join(", ")
const vhostLink = document.createElement("a")
vhostLink.href = "/vhost?name=" + urlEncodedVhost
Expand Down

0 comments on commit cf30cae

Please sign in to comment.