Add permission control for service resource

This commit is contained in:
cuigh
2017-11-24 13:03:51 +08:00
parent 8ce6adf478
commit 1f652bb6f3
23 changed files with 577 additions and 96 deletions

View File

@@ -1350,6 +1350,63 @@ var Swirl;
})(Node = Swirl.Node || (Swirl.Node = {}));
})(Swirl || (Swirl = {}));
var Swirl;
(function (Swirl) {
var Perm;
(function (Perm) {
var Dispatcher = Swirl.Core.Dispatcher;
var Modal = Swirl.Core.Modal;
class EditPage {
constructor() {
$("#txt-query").keydown(this.searchUser);
$("#btn-add-user").click(this.addUser);
Dispatcher.bind("#div-users").on("delete-user", this.deleteUser.bind(this));
}
deleteUser(e) {
$(e.target).closest("div.control").remove();
}
searchUser(e) {
if (e.keyCode == 13) {
let query = $.trim($(e.target).val());
if (query.length == 0) {
return;
}
$ajax.post("/system/user/search", { query: query }).encoder("form").json((users) => {
let $panel = $("#nav-users");
$panel.find("label.panel-block").remove();
for (let user of users) {
$panel.append(`<label class="panel-block">
<input type="checkbox" value="${user.id}" data-name="${user.name}"> ${user.name}
</label>`);
}
});
}
}
addUser() {
let users = {};
$("#div-users").find("input").each((i, e) => {
users[$(e).val()] = true;
});
let $panel = $("#nav-users");
$panel.find("input:checked").each((i, e) => {
let $el = $(e);
if (users[$el.val()]) {
return;
}
$("#div-users").append(`<div class="control">
<div class="tags has-addons">
<span class="tag is-info">${$el.data("name")}</span>
<a class="tag is-delete" data-action="delete-user"></a>
<input name="users[]" value="${$el.val()}" type="hidden">
</div>`);
});
Modal.close();
$panel.find("label.panel-block").remove();
}
}
Perm.EditPage = EditPage;
})(Perm = Swirl.Perm || (Swirl.Perm = {}));
})(Swirl || (Swirl = {}));
var Swirl;
(function (Swirl) {
var Registry;
(function (Registry) {
@@ -1762,49 +1819,35 @@ var Swirl;
this.table.on("delete-service", this.deleteService.bind(this))
.on("scale-service", this.scaleService.bind(this))
.on("rollback-service", this.rollbackService.bind(this));
$("#btn-delete").click(this.deleteServices.bind(this));
}
deleteService(e) {
let $tr = $(e.target).closest("tr");
let name = $tr.find("td:eq(1)").text().trim();
let name = $tr.find("td:eq(0)").text().trim();
Modal.confirm(`Are you sure to remove service: <strong>${name}</strong>?`, "Delete service", (dlg, e) => {
$ajax.post("delete", { names: name }).trigger(e.target).encoder("form").json(() => {
$ajax.post(`${name}/delete`, { names: name }).trigger(e.target).encoder("form").json(() => {
$tr.remove();
dlg.close();
});
});
}
deleteServices() {
let names = this.table.selectedKeys();
if (names.length == 0) {
Modal.alert("Please select one or more items.");
return;
}
Modal.confirm(`Are you sure to remove ${names.length} services?`, "Delete services", (dlg, e) => {
$ajax.post("delete", { names: names.join(",") }).trigger(e.target).encoder("form").json(() => {
this.table.selectedRows().remove();
dlg.close();
});
});
}
scaleService(e) {
let $btn = $(e.target).closest("button");
let $tr = $btn.closest("tr");
let data = {
name: $tr.find("td:eq(1)").text().trim(),
name: $tr.find("td:eq(0)").text().trim(),
count: $btn.data("replicas"),
};
Modal.confirm(`<input name="count" value="${data.count}" class="input" placeholder="Replicas">`, "Scale service", (dlg, e) => {
data.count = dlg.find("input[name=count]").val();
$ajax.post("scale", data).trigger(e.target).encoder("form").json(() => {
$ajax.post(`${data.name}/scale`, data).trigger(e.target).encoder("form").json(() => {
location.reload();
});
});
}
rollbackService(e) {
let $btn = $(e.target).closest("button"), $tr = $btn.closest("tr"), name = $tr.find("td:eq(1)").text().trim();
let $btn = $(e.target).closest("button"), $tr = $btn.closest("tr"), name = $tr.find("td:eq(0)").text().trim();
Modal.confirm(`Are you sure to rollback service: <strong>${name}</strong>?`, "Rollback service", (dlg, e) => {
$ajax.post("rollback", { name: name }).trigger(e.target).encoder("form").json(() => {
$ajax.post(`${name}/rollback`, { name: name }).trigger(e.target).encoder("form").json(() => {
dlg.close();
});
});

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,61 @@
///<reference path="../core/core.ts" />
namespace Swirl.Perm {
import Dispatcher = Swirl.Core.Dispatcher;
import Modal = Swirl.Core.Modal;
export class EditPage {
constructor() {
// bind events
$("#txt-query").keydown(this.searchUser);
$("#btn-add-user").click(this.addUser);
Dispatcher.bind("#div-users").on("delete-user", this.deleteUser.bind(this));
}
private deleteUser(e: JQueryEventObject) {
$(e.target).closest("div.control").remove();
}
private searchUser(e: JQueryEventObject) {
if (e.keyCode == 13) {
let query = $.trim($(e.target).val());
if (query.length == 0) {
return;
}
$ajax.post("/system/user/search", {query: query}).encoder("form").json((users: any) => {
let $panel = $("#nav-users");
$panel.find("label.panel-block").remove();
for (let user of users) {
$panel.append(`<label class="panel-block">
<input type="checkbox" value="${user.id}" data-name="${user.name}"> ${user.name}
</label>`);
}
});
}
}
private addUser() {
let users: { [index: string]: boolean } = {};
$("#div-users").find("input").each((i, e) => {
users[$(e).val()] = true;
});
let $panel = $("#nav-users");
$panel.find("input:checked").each((i, e) => {
let $el = $(e);
if (users[$el.val()]) {
return;
}
$("#div-users").append(`<div class="control">
<div class="tags has-addons">
<span class="tag is-info">${$el.data("name")}</span>
<a class="tag is-delete" data-action="delete-user"></a>
<input name="users[]" value="${$el.val()}" type="hidden">
</div>`);
});
Modal.close();
$panel.find("label.panel-block").remove();
}
}
}

View File

@@ -14,45 +14,29 @@ namespace Swirl.Service {
this.table.on("delete-service", this.deleteService.bind(this))
.on("scale-service", this.scaleService.bind(this))
.on("rollback-service", this.rollbackService.bind(this));
$("#btn-delete").click(this.deleteServices.bind(this));
}
private deleteService(e: JQueryEventObject) {
let $tr = $(e.target).closest("tr");
let name = $tr.find("td:eq(1)").text().trim();
let name = $tr.find("td:eq(0)").text().trim();
Modal.confirm(`Are you sure to remove service: <strong>${name}</strong>?`, "Delete service", (dlg, e) => {
$ajax.post("delete", {names: name}).trigger(e.target).encoder("form").json<AjaxResult>(() => {
$ajax.post(`${name}/delete`, {names: name}).trigger(e.target).encoder("form").json<AjaxResult>(() => {
$tr.remove();
dlg.close();
})
});
}
private deleteServices() {
let names = this.table.selectedKeys();
if (names.length == 0) {
Modal.alert("Please select one or more items.");
return;
}
Modal.confirm(`Are you sure to remove ${names.length} services?`, "Delete services", (dlg, e) => {
$ajax.post("delete", {names: names.join(",")}).trigger(e.target).encoder("form").json<AjaxResult>(() => {
this.table.selectedRows().remove();
dlg.close();
})
});
}
private scaleService(e: JQueryEventObject) {
let $btn = $(e.target).closest("button");
let $tr = $btn.closest("tr");
let data = {
name: $tr.find("td:eq(1)").text().trim(),
name: $tr.find("td:eq(0)").text().trim(),
count: $btn.data("replicas"),
};
Modal.confirm(`<input name="count" value="${data.count}" class="input" placeholder="Replicas">`, "Scale service", (dlg, e) => {
data.count = dlg.find("input[name=count]").val();
$ajax.post("scale", data).trigger(e.target).encoder("form").json<AjaxResult>(() => {
$ajax.post(`${data.name}/scale`, data).trigger(e.target).encoder("form").json<AjaxResult>(() => {
location.reload();
})
});
@@ -61,9 +45,9 @@ namespace Swirl.Service {
private rollbackService(e: JQueryEventObject) {
let $btn = $(e.target).closest("button"),
$tr = $btn.closest("tr"),
name = $tr.find("td:eq(1)").text().trim();
name = $tr.find("td:eq(0)").text().trim();
Modal.confirm(`Are you sure to rollback service: <strong>${name}</strong>?`, "Rollback service", (dlg, e) => {
$ajax.post("rollback", {name: name}).trigger(e.target).encoder("form").json<AjaxResult>(() => {
$ajax.post(`${name}/rollback`, {name: name}).trigger(e.target).encoder("form").json<AjaxResult>(() => {
dlg.close();
})
});