mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-06 05:25:50 +01:00
(refs #8)Start to implement group management.
This commit is contained in:
@@ -60,9 +60,10 @@ trait RepositorySettingsControllerBase extends ControllerBase with FlashMapSuppo
|
|||||||
/**
|
/**
|
||||||
* JSON API for collaborator completion.
|
* JSON API for collaborator completion.
|
||||||
*/
|
*/
|
||||||
|
// TODO Merge with UserManagementController
|
||||||
get("/:owner/:repository/settings/collaborators/proposals")(usersOnly {
|
get("/:owner/:repository/settings/collaborators/proposals")(usersOnly {
|
||||||
contentType = formats("json")
|
contentType = formats("json")
|
||||||
org.json4s.jackson.Serialization.write(Map("options" -> getAllUsers.map(_.userName).toArray))
|
org.json4s.jackson.Serialization.write(Map("options" -> getAllUsers.filter(!_.isGroupAccount).map(_.userName).toArray))
|
||||||
})
|
})
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -69,4 +69,17 @@ trait UserManagementControllerBase extends AccountManagementControllerBase {
|
|||||||
} getOrElse NotFound
|
} getOrElse NotFound
|
||||||
})
|
})
|
||||||
|
|
||||||
|
get("/admin/users/_newgroup"){
|
||||||
|
admin.users.html.group(None)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* JSON API for collaborator completion.
|
||||||
|
*/
|
||||||
|
// TODO Merge with RepositorySettingsController
|
||||||
|
get("/admin/users/_members"){
|
||||||
|
contentType = formats("json")
|
||||||
|
org.json4s.jackson.Serialization.write(Map("options" -> getAllUsers.filter(!_.isGroupAccount).map(_.userName).toArray))
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -12,7 +12,8 @@ object Accounts extends Table[Account]("ACCOUNT") {
|
|||||||
def updatedDate = column[java.util.Date]("UPDATED_DATE")
|
def updatedDate = column[java.util.Date]("UPDATED_DATE")
|
||||||
def lastLoginDate = column[java.util.Date]("LAST_LOGIN_DATE")
|
def lastLoginDate = column[java.util.Date]("LAST_LOGIN_DATE")
|
||||||
def image = column[String]("IMAGE")
|
def image = column[String]("IMAGE")
|
||||||
def * = userName ~ mailAddress ~ password ~ isAdmin ~ url.? ~ registeredDate ~ updatedDate ~ lastLoginDate.? ~ image.? <> (Account, Account.unapply _)
|
def groupAccount = column[Boolean]("GROUP_ACCOUNT")
|
||||||
|
def * = userName ~ mailAddress ~ password ~ isAdmin ~ url.? ~ registeredDate ~ updatedDate ~ lastLoginDate.? ~ image.? ~ groupAccount <> (Account, Account.unapply _)
|
||||||
}
|
}
|
||||||
|
|
||||||
case class Account(
|
case class Account(
|
||||||
@@ -24,5 +25,6 @@ case class Account(
|
|||||||
registeredDate: java.util.Date,
|
registeredDate: java.util.Date,
|
||||||
updatedDate: java.util.Date,
|
updatedDate: java.util.Date,
|
||||||
lastLoginDate: Option[java.util.Date],
|
lastLoginDate: Option[java.util.Date],
|
||||||
image: Option[String]
|
image: Option[String],
|
||||||
|
isGroupAccount: Boolean
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -24,7 +24,8 @@ trait AccountService {
|
|||||||
registeredDate = currentDate,
|
registeredDate = currentDate,
|
||||||
updatedDate = currentDate,
|
updatedDate = currentDate,
|
||||||
lastLoginDate = None,
|
lastLoginDate = None,
|
||||||
image = None)
|
image = None,
|
||||||
|
isGroupAccount = false)
|
||||||
|
|
||||||
def updateAccount(account: Account): Unit =
|
def updateAccount(account: Account): Unit =
|
||||||
Accounts
|
Accounts
|
||||||
|
|||||||
60
src/main/twirl/admin/users/group.scala.html
Normal file
60
src/main/twirl/admin/users/group.scala.html
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
@(account: Option[model.Account])(implicit context: app.Context)
|
||||||
|
@import context._
|
||||||
|
@import view.helpers._
|
||||||
|
@html.main(if(account.isEmpty) "New User" else "Update User"){
|
||||||
|
@admin.html.menu("users"){
|
||||||
|
<form method="POST" action="@if(account.isEmpty){@path/admin/users/_new} else {@path/admin/users/@account.get.userName/_edit}" validate="true">
|
||||||
|
<div class="row-fluid">
|
||||||
|
<div class="span5">
|
||||||
|
<fieldset>
|
||||||
|
<label for="userName"><strong>Group name</strong></label>
|
||||||
|
<input type="text" name="userName" id="userName" value="@account.map(_.userName)"@if(account.isDefined){ readonly}/>
|
||||||
|
<span id="error-userName" class="error"></span>
|
||||||
|
</fieldset>
|
||||||
|
<fieldset>
|
||||||
|
<label for="avatar"><strong>Image (Optional)</strong></label>
|
||||||
|
@helper.html.uploadavatar(account)
|
||||||
|
</fieldset>
|
||||||
|
</div>
|
||||||
|
<div class="span7">
|
||||||
|
<fieldset>
|
||||||
|
<label><strong>Members</strong></label>
|
||||||
|
<ul id="members" class="collaborator">
|
||||||
|
</ul>
|
||||||
|
<input type="text" id="memberName" style="width: 300px; margin-bottom: 0px;"/>
|
||||||
|
<input type="button" class="btn" value="Add" id="addMember">
|
||||||
|
</fieldset>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<fieldset class="margin">
|
||||||
|
<input type="submit" class="btn btn-success" value="@if(account.isEmpty){Create Group} else {Update Group}"/>
|
||||||
|
<a href="@path/admin/users" class="btn">Cancel</a>
|
||||||
|
</fieldset>
|
||||||
|
</form>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
<script>
|
||||||
|
$(function(){
|
||||||
|
$('#memberName').typeahead({
|
||||||
|
source: function (query, process) {
|
||||||
|
return $.get('@path/admin/users/_members', { query: query },
|
||||||
|
function (data) {
|
||||||
|
return process(data.options);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#addMember').click(function(){
|
||||||
|
var userName = $('#memberName').val();
|
||||||
|
$('#members').append($('<li>')
|
||||||
|
.append($('<a>').attr('href', '#').text(userName))
|
||||||
|
.append(' ')
|
||||||
|
.append($('<a>').attr('href', '#').addClass('remove').text('(remove)')));
|
||||||
|
$('#memberName').val('');
|
||||||
|
});
|
||||||
|
|
||||||
|
$(document).on('click', '.remove', function(){
|
||||||
|
$(this).parent().remove();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
@@ -5,6 +5,7 @@
|
|||||||
@admin.html.menu("users"){
|
@admin.html.menu("users"){
|
||||||
<div style="text-align: right; margin-bottom: 4px;">
|
<div style="text-align: right; margin-bottom: 4px;">
|
||||||
<a href="@path/admin/users/_new" class="btn">New User</a>
|
<a href="@path/admin/users/_new" class="btn">New User</a>
|
||||||
|
<a href="@path/admin/users/_newgroup" class="btn">New Group</a>
|
||||||
</div>
|
</div>
|
||||||
<table class="table table-bordered table-hover">
|
<table class="table table-bordered table-hover">
|
||||||
@users.map { account =>
|
@users.map { account =>
|
||||||
|
|||||||
@@ -23,12 +23,14 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
<script>
|
<script>
|
||||||
$('#userName').typeahead({
|
$(function(){
|
||||||
source: function (query, process) {
|
$('#userName').typeahead({
|
||||||
return $.get('@url(repository)/settings/collaborators/proposals', { query: query },
|
source: function (query, process) {
|
||||||
function (data) {
|
return $.get('@url(repository)/settings/collaborators/proposals', { query: query },
|
||||||
return process(data.options);
|
function (data) {
|
||||||
});
|
return process(data.options);
|
||||||
}
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
Reference in New Issue
Block a user