diff --git a/src/main/scala/app/IndexController.scala b/src/main/scala/app/IndexController.scala index f827492..d18b3d3 100644 --- a/src/main/scala/app/IndexController.scala +++ b/src/main/scala/app/IndexController.scala @@ -30,7 +30,7 @@ get("/_user/proposals")(usersOnly { contentType = formats("json") org.json4s.jackson.Serialization.write( - Map("options" -> getAllUsers.filter(!_.isGroupAccount).map(_.userName).toArray) + Map("options" -> getAllUsers().filter(!_.isGroupAccount).map(_.userName).toArray) ) }) diff --git a/src/main/scala/app/UserManagementController.scala b/src/main/scala/app/UserManagementController.scala index 2a44cb9..9cf3005 100644 --- a/src/main/scala/app/UserManagementController.scala +++ b/src/main/scala/app/UserManagementController.scala @@ -17,8 +17,8 @@ url: Option[String], fileId: Option[String]) case class EditUserForm(userName: String, password: Option[String], fullName: String, - mailAddress: String, isAdmin: Boolean, - url: Option[String], fileId: Option[String], clearImage: Boolean) + mailAddress: String, isAdmin: Boolean, url: Option[String], + fileId: Option[String], clearImage: Boolean, isRemoved: Boolean) case class NewGroupForm(groupName: String, url: Option[String], fileId: Option[String], memberNames: Option[String]) @@ -27,47 +27,50 @@ memberNames: Option[String], clearImage: Boolean) val newUserForm = mapping( - "userName" -> trim(label("Username" , text(required, maxlength(100), identifier, uniqueUserName))), - "password" -> trim(label("Password" , text(required, maxlength(20)))), - "fullName" -> trim(label("Full Name" , text(required, maxlength(100)))), - "mailAddress" -> trim(label("Mail Address" , text(required, maxlength(100), uniqueMailAddress()))), - "isAdmin" -> trim(label("User Type" , boolean())), - "url" -> trim(label("URL" , optional(text(maxlength(200))))), - "fileId" -> trim(label("File ID" , optional(text()))) + "userName" -> trim(label("Username" ,text(required, maxlength(100), identifier, uniqueUserName))), + "password" -> trim(label("Password" ,text(required, maxlength(20)))), + "fullName" -> trim(label("Full Name" ,text(required, maxlength(100)))), + "mailAddress" -> trim(label("Mail Address" ,text(required, maxlength(100), uniqueMailAddress()))), + "isAdmin" -> trim(label("User Type" ,boolean())), + "url" -> trim(label("URL" ,optional(text(maxlength(200))))), + "fileId" -> trim(label("File ID" ,optional(text()))) )(NewUserForm.apply) val editUserForm = mapping( - "userName" -> trim(label("Username" , text(required, maxlength(100), identifier))), - "password" -> trim(label("Password" , optional(text(maxlength(20))))), - "fullName" -> trim(label("Full Name" , text(required, maxlength(100)))), - "mailAddress" -> trim(label("Mail Address" , text(required, maxlength(100), uniqueMailAddress("userName")))), - "isAdmin" -> trim(label("User Type" , boolean())), - "url" -> trim(label("URL" , optional(text(maxlength(200))))), - "fileId" -> trim(label("File ID" , optional(text()))), - "clearImage" -> trim(label("Clear image" , boolean())) + "userName" -> trim(label("Username" ,text(required, maxlength(100), identifier))), + "password" -> trim(label("Password" ,optional(text(maxlength(20))))), + "fullName" -> trim(label("Full Name" ,text(required, maxlength(100)))), + "mailAddress" -> trim(label("Mail Address" ,text(required, maxlength(100), uniqueMailAddress("userName")))), + "isAdmin" -> trim(label("User Type" ,boolean())), + "url" -> trim(label("URL" ,optional(text(maxlength(200))))), + "fileId" -> trim(label("File ID" ,optional(text()))), + "clearImage" -> trim(label("Clear image" ,boolean())), + "removed" -> trim(label("Disable" ,boolean())) )(EditUserForm.apply) val newGroupForm = mapping( - "groupName" -> trim(label("Group name" , text(required, maxlength(100), identifier, uniqueUserName))), - "url" -> trim(label("URL" , optional(text(maxlength(200))))), - "fileId" -> trim(label("File ID" , optional(text()))), - "memberNames" -> trim(label("Member Names" , optional(text()))) + "groupName" -> trim(label("Group name" ,text(required, maxlength(100), identifier, uniqueUserName))), + "url" -> trim(label("URL" ,optional(text(maxlength(200))))), + "fileId" -> trim(label("File ID" ,optional(text()))), + "memberNames" -> trim(label("Member Names" ,optional(text()))) )(NewGroupForm.apply) val editGroupForm = mapping( - "groupName" -> trim(label("Group name" , text(required, maxlength(100), identifier))), - "url" -> trim(label("URL" , optional(text(maxlength(200))))), - "fileId" -> trim(label("File ID" , optional(text()))), - "memberNames" -> trim(label("Member Names" , optional(text()))), - "clearImage" -> trim(label("Clear image" , boolean())) + "groupName" -> trim(label("Group name" ,text(required, maxlength(100), identifier))), + "url" -> trim(label("URL" ,optional(text(maxlength(200))))), + "fileId" -> trim(label("File ID" ,optional(text()))), + "memberNames" -> trim(label("Member Names" ,optional(text()))), + "clearImage" -> trim(label("Clear image" ,boolean())) )(EditGroupForm.apply) get("/admin/users")(adminOnly { - val users = getAllUsers() + val includeRemoved = params.get("includeRemoved").map(_.toBoolean).getOrElse(false) + val users = getAllUsers(includeRemoved) + val members = users.collect { case account if(account.isGroupAccount) => account.userName -> getGroupMembers(account.userName) }.toMap - admin.users.html.list(users, members) + admin.users.html.list(users, members, includeRemoved) }) get("/admin/users/_newuser")(adminOnly { @@ -93,7 +96,8 @@ fullName = form.fullName, mailAddress = form.mailAddress, isAdmin = form.isAdmin, - url = form.url)) + url = form.url, + isRemoved = form.isRemoved)) updateImage(userName, form.fileId, form.clearImage) redirect("/admin/users") diff --git a/src/main/scala/service/AccountService.scala b/src/main/scala/service/AccountService.scala index ca36c6e..ecc4206 100644 --- a/src/main/scala/service/AccountService.scala +++ b/src/main/scala/service/AccountService.scala @@ -57,7 +57,12 @@ def getAccountByMailAddress(mailAddress: String): Option[Account] = Query(Accounts) filter(_.mailAddress is mailAddress.bind) firstOption - def getAllUsers(): List[Account] = Query(Accounts) sortBy(_.userName) list + def getAllUsers(includeRemoved: Boolean = true): List[Account] = + if(includeRemoved){ + Query(Accounts) sortBy(_.userName) list + } else { + Query(Accounts) filter (_.removed is false.bind) sortBy(_.userName) list + } def createAccount(userName: String, password: String, fullName: String, mailAddress: String, isAdmin: Boolean, url: Option[String]): Unit = Accounts insert Account( @@ -77,7 +82,7 @@ def updateAccount(account: Account): Unit = Accounts .filter { a => a.userName is account.userName.bind } - .map { a => a.password ~ a.fullName ~ a.mailAddress ~ a.isAdmin ~ a.url.? ~ a.registeredDate ~ a.updatedDate ~ a.lastLoginDate.? } + .map { a => a.password ~ a.fullName ~ a.mailAddress ~ a.isAdmin ~ a.url.? ~ a.registeredDate ~ a.updatedDate ~ a.lastLoginDate.? ~ a.removed } .update ( account.password, account.fullName, @@ -86,7 +91,8 @@ account.url, account.registeredDate, currentDate, - account.lastLoginDate) + account.lastLoginDate, + account.isRemoved) def updateAvatarImage(userName: String, image: Option[String]): Unit = Accounts.filter(_.userName is userName.bind).map(_.image.?).update(image) diff --git a/src/main/twirl/admin/users/list.scala.html b/src/main/twirl/admin/users/list.scala.html index df75de3..942f6ee 100644 --- a/src/main/twirl/admin/users/list.scala.html +++ b/src/main/twirl/admin/users/list.scala.html @@ -1,16 +1,20 @@ -@(users: List[model.Account], members: Map[String, List[String]])(implicit context: app.Context) +@(users: List[model.Account], members: Map[String, List[String]], includeRemoved: Boolean)(implicit context: app.Context) @import context._ @import view.helpers._ @html.main("Manage Users"){ @admin.html.menu("users"){ -
+
New User New Group
+ @users.map { account => -
+
@if(account.isGroupAccount){ Edit @@ -57,4 +61,11 @@ }
} -} \ No newline at end of file +} + \ No newline at end of file diff --git a/src/main/twirl/admin/users/user.scala.html b/src/main/twirl/admin/users/user.scala.html index b49d710..3a2430c 100644 --- a/src/main/twirl/admin/users/user.scala.html +++ b/src/main/twirl/admin/users/user.scala.html @@ -11,6 +11,12 @@
+ @if(account.isDefined){ + + } @if(account.map(_.password.nonEmpty).getOrElse(true)){