mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-09 23:15:49 +01:00
(refs #241)Add validation for create / edit group form.
This commit is contained in:
@@ -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.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
@@ -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>
|
||||||
Reference in New Issue
Block a user