Browse Source

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
Jochen Munz 4 years ago
parent
commit
bc397002d4
2 changed files with 32 additions and 2 deletions
  1. 20 1
      httpd/web.go
  2. 12 1
      templates/users.html

+ 20 - 1
httpd/web.go

@@ -678,7 +678,26 @@ func handleGetWebUsers(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) {

+ 12 - 1
templates/users.html

@@ -147,6 +147,16 @@
             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 = {
             text: 'Delete',
             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>>",
             select: true,
             buttons: [
-                'add', 'edit', 'delete', 'quota_scan'
+                'add', 'edit', 'clone', 'delete', 'quota_scan'
             ],
             "columnDefs": [
                 {
@@ -230,6 +240,7 @@
             table.button(1).enable(selectedRows == 1);
             table.button(2).enable(selectedRows == 1);
             table.button(3).enable(selectedRows == 1);
+            table.button(4).enable(selectedRows == 1);
         });
     });
 </script>