(refs #241)Add validation for create / edit group form.

This commit is contained in:
takezoe
2014-03-04 10:23:44 +09:00
parent e3fd564efd
commit 21f7888f55
3 changed files with 72 additions and 51 deletions

View File

@@ -41,23 +41,23 @@ trait CreateControllerBase extends AccountManagementControllerBase {
)(ForkRepositoryForm.apply) )(ForkRepositoryForm.apply)
case class NewGroupForm(groupName: String, url: Option[String], fileId: Option[String], case class NewGroupForm(groupName: String, url: Option[String], fileId: Option[String],
memberNames: Option[String]) members: String)
case class EditGroupForm(groupName: String, url: Option[String], fileId: Option[String], case class EditGroupForm(groupName: String, url: Option[String], fileId: Option[String],
memberNames: Option[String], clearImage: Boolean, isRemoved: Boolean) members: String, clearImage: Boolean, isRemoved: Boolean)
val newGroupForm = mapping( val newGroupForm = mapping(
"groupName" -> trim(label("Group name" ,text(required, maxlength(100), identifier, uniqueUserName))), "groupName" -> trim(label("Group name" ,text(required, maxlength(100), identifier, uniqueUserName))),
"url" -> trim(label("URL" ,optional(text(maxlength(200))))), "url" -> trim(label("URL" ,optional(text(maxlength(200))))),
"fileId" -> trim(label("File ID" ,optional(text()))), "fileId" -> trim(label("File ID" ,optional(text()))),
"memberNames" -> trim(label("Member Names" ,optional(text()))) "members" -> trim(label("Members" ,text(required, members)))
)(NewGroupForm.apply) )(NewGroupForm.apply)
val editGroupForm = mapping( val editGroupForm = mapping(
"groupName" -> trim(label("Group name" ,text(required, maxlength(100), identifier))), "groupName" -> trim(label("Group name" ,text(required, maxlength(100), identifier))),
"url" -> trim(label("URL" ,optional(text(maxlength(200))))), "url" -> trim(label("URL" ,optional(text(maxlength(200))))),
"fileId" -> trim(label("File ID" ,optional(text()))), "fileId" -> trim(label("File ID" ,optional(text()))),
"memberNames" -> trim(label("Member Names" ,optional(text()))), "members" -> trim(label("Members" ,text(required, members))),
"clearImage" -> trim(label("Clear image" ,boolean())), "clearImage" -> trim(label("Clear image" ,boolean())),
"removed" -> trim(label("Disable" ,boolean())) "removed" -> trim(label("Disable" ,boolean()))
)(EditGroupForm.apply) )(EditGroupForm.apply)
@@ -197,16 +197,16 @@ trait CreateControllerBase extends AccountManagementControllerBase {
}) })
get("/groups/new")(usersOnly { get("/groups/new")(usersOnly {
html.group(None, Nil) html.group(None, List((context.loginAccount.get.userName, true)))
}) })
post("/groups/new", newGroupForm)(usersOnly { form => post("/groups/new", newGroupForm)(usersOnly { form =>
createGroup(form.groupName, form.url) createGroup(form.groupName, form.url)
updateGroupMembers(form.groupName, form.memberNames.map(_.split(",").map { updateGroupMembers(form.groupName, form.members.split(",").map {
_.split(":") match { _.split(":") match {
case Array(userName, isManager) => (userName, isManager.toBoolean) case Array(userName, isManager) => (userName, isManager.toBoolean)
} }
}.toList).getOrElse(Nil)) }.toList)
updateImage(form.groupName, form.fileId, false) updateImage(form.groupName, form.fileId, false)
redirect(s"/${form.groupName}") redirect(s"/${form.groupName}")
}) })
@@ -218,11 +218,11 @@ trait CreateControllerBase extends AccountManagementControllerBase {
}) })
post("/:groupName/_edit", editGroupForm)(managersOnly { form => post("/:groupName/_edit", editGroupForm)(managersOnly { form =>
defining(params("groupName"), form.memberNames.map(_.split(",").map { defining(params("groupName"), form.members.split(",").map {
_.split(":") match { _.split(":") match {
case Array(userName, isManager) => (userName, isManager.toBoolean) case Array(userName, isManager) => (userName, isManager.toBoolean)
} }
}.toList).getOrElse(Nil)){ case (groupName, members) => }.toList){ case (groupName, members) =>
getAccountByUserName(groupName, true).map { account => getAccountByUserName(groupName, true).map { account =>
updateGroup(groupName, form.url, form.isRemoved) updateGroup(groupName, form.url, form.isRemoved)
@@ -276,4 +276,13 @@ trait CreateControllerBase extends AccountManagementControllerBase {
} }
} }
private def members: Constraint = new Constraint(){
override def validate(name: String, value: String, messages: Messages): Option[String] = {
if(value.split(",").exists {
_.split(":") match { case Array(userName, isManager) => isManager.toBoolean }
}) None else Some("Must select one manager at least.")
}
}
} }

View File

@@ -34,9 +34,10 @@
<div class="span5"> <div class="span5">
<fieldset> <fieldset>
<label class="strong">Members</label> <label class="strong">Members</label>
<ul id="members" class="collaborator"> <ul id="member-list" class="collaborator">
@members.map { case (userName, isManager) => @members.map { case (userName, isManager) =>
<li data-name="@userName"> <li data-name="@userName">
<input type="checkbox" class="is_manager" id="is_manager_@userName" @if(isManager){checked}/>
<a href="@path/@url(userName)">@userName</a> <a href="@path/@url(userName)">@userName</a>
<a href="#" class="remove">(remove)</a> <a href="#" class="remove">(remove)</a>
</li> </li>
@@ -44,9 +45,9 @@
</ul> </ul>
@helper.html.account("memberName", 200) @helper.html.account("memberName", 200)
<input type="button" class="btn" value="Add" id="addMember"/> <input type="button" class="btn" value="Add" id="addMember"/>
<input type="hidden" id="memberNames" name="memberNames" value="@members.mkString(",")"/> <input type="hidden" id="members" name="members" value="@members.map(x => x._1 + ":" + x._2).mkString(",")"/>
<div> <div>
<span class="error" id="error-memberName"></span> <span class="error" id="error-members"></span>
</div> </div>
</fieldset> </fieldset>
</div> </div>
@@ -70,7 +71,7 @@ $(function(){
} }
// check duplication // check duplication
var exists = $('#members li').filter(function(){ var exists = $('#member-list li').filter(function(){
return $(this).data('name') == userName; return $(this).data('name') == userName;
}).length > 0; }).length > 0;
if(exists){ if(exists){
@@ -84,18 +85,16 @@ $(function(){
}, function(data, status){ }, function(data, status){
if(data == 'true'){ if(data == 'true'){
// add member // add member
$('#members').append($('<li>') $('#member-list').append($('<li>')
.data('name', userName) .data('name', userName)
.append($('<input type="checkbox" class="is_manager">').attr('id', 'is_manager_' + userName))
.append($('<a>').attr('href', '@path/' + userName).text(userName)) .append($('<a>').attr('href', '@path/' + userName).text(userName))
.append(' ') .append(' ')
.append($('<a>').attr('href', '#').addClass('remove').text('(remove)'))); .append($('<a>').attr('href', '#').addClass('remove').text('(remove)')));
$('#memberName').val(''); $('#members').val('');
// update hidden value // update hidden value
var userNames = $('#members li').map(function(i, e){ updateMembers();
return $(e).data('name');
}).get().join(',');
$('#memberNames').val(userNames);
} else { } else {
$('#error-memberName').text('User does not exist.'); $('#error-memberName').text('User does not exist.');
} }
@@ -105,12 +104,9 @@ $(function(){
$(document).on('click', '.remove', function(){ $(document).on('click', '.remove', function(){
// remove member // remove member
$(this).parent().remove(); $(this).parent().remove();
// update hidden value // update hidden value
var userNames = $('#members li').map(function(i, e){ updateMembers();
return $(e).data('name'); $('#members').val(members);
}).get().join(',');
$('#memberNames').val(userNames);
}); });
// Don't submit form by ENTER key // Don't submit form by ENTER key
@@ -118,5 +114,17 @@ $(function(){
console.log(e.keyCode); console.log(e.keyCode);
return !(e.keyCode == 13); return !(e.keyCode == 13);
}); });
$('.is_manager').change(function(){
updateMembers();
});
function updateMembers(){
var members = $('#member-list li').map(function(i, e){
var userName = $(e).data('name');
return userName + ':' + $('#is_manager_' + userName).prop('checked');
}).get().join(',');
$('#members').val(members);
}
}); });
</script> </script>

View File

@@ -34,10 +34,10 @@
<div class="span5"> <div class="span5">
<fieldset> <fieldset>
<label class="strong">Members</label> <label class="strong">Members</label>
<ul id="members" class="collaborator"> <ul id="member-list" class="collaborator">
@members.map { case (userName, isManager) => @members.map { case (userName, isManager) =>
<li data-name="@userName"> <li data-name="@userName">
<input type="checkbox" id="is_manager_@userName" @if(isManager){checked}/> <input type="checkbox" class="is_manager" id="is_manager_@userName" @if(isManager){checked}/>
<a href="@path/@url(userName)">@userName</a> <a href="@path/@url(userName)">@userName</a>
<a href="#" class="remove">(remove)</a> <a href="#" class="remove">(remove)</a>
</li> </li>
@@ -45,9 +45,9 @@
</ul> </ul>
@helper.html.account("memberName", 200) @helper.html.account("memberName", 200)
<input type="button" class="btn" value="Add" id="addMember"/> <input type="button" class="btn" value="Add" id="addMember"/>
<input type="hidden" id="memberNames" name="memberNames" value="@members.mkString(",")"/> <input type="hidden" id="members" name="members" value="@members.map(x => x._1 + ":" + x._2).mkString(",")"/>
<div> <div>
<span class="error" id="error-memberName"></span> <span class="error" id="error-members"></span>
</div> </div>
</fieldset> </fieldset>
</div> </div>
@@ -70,7 +70,7 @@ $(function(){
} }
// check duplication // check duplication
var exists = $('#members li').filter(function(){ var exists = $('#member-list li').filter(function(){
return $(this).data('name') == userName; return $(this).data('name') == userName;
}).length > 0; }).length > 0;
if(exists){ if(exists){
@@ -84,20 +84,16 @@ $(function(){
}, function(data, status){ }, function(data, status){
if(data == 'true'){ if(data == 'true'){
// add member // add member
$('#members').append($('<li>') $('#member-list').append($('<li>')
.data('name', userName) .data('name', userName)
.append($('<input type="checkbox">').attr('id', 'is_manager_' + userName)) .append($('<input type="checkbox" class="is_manager">').attr('id', 'is_manager_' + userName))
.append($('<a>').attr('href', '@path/' + userName).text(userName)) .append($('<a>').attr('href', '@path/' + userName).text(userName))
.append(' ') .append(' ')
.append($('<a>').attr('href', '#').addClass('remove').text('(remove)'))); .append($('<a>').attr('href', '#').addClass('remove').text('(remove)')));
$('#memberName').val(''); $('#members').val('');
// update hidden value // update hidden value
var userNames = $('#members li').map(function(i, e){ updateMembers();
var userName = $(e).data('name');
return userName + ':' + $('#is_manager_' + userName).prop('checked');
}).get().join(',');
$('#memberNames').val(userNames);
} else { } else {
$('#error-memberName').text('User does not exist.'); $('#error-memberName').text('User does not exist.');
} }
@@ -107,13 +103,9 @@ $(function(){
$(document).on('click', '.remove', function(){ $(document).on('click', '.remove', function(){
// remove member // remove member
$(this).parent().remove(); $(this).parent().remove();
// update hidden value // update hidden value
var userNames = $('#members li').map(function(i, e){ updateMembers();
var userName = $(e).data('name'); $('#members').val(members);
return userName + ':' + $('#is_manager_' + userName).prop('checked');
}).get().join(',');
$('#memberNames').val(userNames);
}); });
// Don't submit form by ENTER key // Don't submit form by ENTER key
@@ -121,5 +113,17 @@ $(function(){
console.log(e.keyCode); console.log(e.keyCode);
return !(e.keyCode == 13); return !(e.keyCode == 13);
}); });
$('.is_manager').change(function(){
updateMembers();
});
function updateMembers(){
var members = $('#member-list li').map(function(i, e){
var userName = $(e).data('name');
return userName + ':' + $('#is_manager_' + userName).prop('checked');
}).get().join(',');
$('#members').val(members);
}
}); });
</script> </script>