mirror of
https://github.com/drakkan/sftpgo.git
synced 2025-12-08 15:28:05 +03:00
Feature: Clone existing user via web admin (#259)
UI based cloning of an existing user. The "add user" screen is prepopulated with existing user data. Resolves drakkan/sftpgo#225
This commit is contained in:
21
httpd/web.go
21
httpd/web.go
@@ -678,7 +678,26 @@ func handleGetWebUsers(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func handleWebAddUserGet(w http.ResponseWriter, r *http.Request) {
|
func handleWebAddUserGet(w http.ResponseWriter, r *http.Request) {
|
||||||
renderAddUserPage(w, dataprovider.User{Status: 1}, "")
|
if r.URL.Query().Get("cloneFromId") != "" {
|
||||||
|
id, err := strconv.ParseInt(r.URL.Query().Get("cloneFromId"), 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
renderBadRequestPage(w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
user, err := dataprovider.GetUserByID(id)
|
||||||
|
if err == nil {
|
||||||
|
user.ID = 0
|
||||||
|
user.Username = ""
|
||||||
|
renderAddUserPage(w, user, "")
|
||||||
|
} else if _, ok := err.(*dataprovider.RecordNotFoundError); ok {
|
||||||
|
renderNotFoundPage(w, err)
|
||||||
|
} else {
|
||||||
|
renderInternalServerErrorPage(w, err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
user := dataprovider.User{Status: 1}
|
||||||
|
renderAddUserPage(w, user, "")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleWebUpdateUserGet(w http.ResponseWriter, r *http.Request) {
|
func handleWebUpdateUserGet(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|||||||
@@ -147,6 +147,16 @@
|
|||||||
enabled: false
|
enabled: false
|
||||||
};
|
};
|
||||||
|
|
||||||
|
$.fn.dataTable.ext.buttons.clone = {
|
||||||
|
text: 'Clone',
|
||||||
|
action: function (e, dt, node, config) {
|
||||||
|
var userID = dt.row({ selected: true }).data()[0];
|
||||||
|
var path = '{{.UserURL}}' + "?cloneFromId=" + userID;
|
||||||
|
window.location.href = path;
|
||||||
|
},
|
||||||
|
enabled: false
|
||||||
|
};
|
||||||
|
|
||||||
$.fn.dataTable.ext.buttons.delete = {
|
$.fn.dataTable.ext.buttons.delete = {
|
||||||
text: 'Delete',
|
text: 'Delete',
|
||||||
action: function (e, dt, node, config) {
|
action: function (e, dt, node, config) {
|
||||||
@@ -212,7 +222,7 @@
|
|||||||
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
||||||
select: true,
|
select: true,
|
||||||
buttons: [
|
buttons: [
|
||||||
'add', 'edit', 'delete', 'quota_scan'
|
'add', 'edit', 'clone', 'delete', 'quota_scan'
|
||||||
],
|
],
|
||||||
"columnDefs": [
|
"columnDefs": [
|
||||||
{
|
{
|
||||||
@@ -230,6 +240,7 @@
|
|||||||
table.button(1).enable(selectedRows == 1);
|
table.button(1).enable(selectedRows == 1);
|
||||||
table.button(2).enable(selectedRows == 1);
|
table.button(2).enable(selectedRows == 1);
|
||||||
table.button(3).enable(selectedRows == 1);
|
table.button(3).enable(selectedRows == 1);
|
||||||
|
table.button(4).enable(selectedRows == 1);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
Reference in New Issue
Block a user