Priorities now have a description that appears as a standard HTML

tooltip across the app.
This commit is contained in:
Istvan Meszaros
2017-06-07 17:19:54 +02:00
parent 889e94a494
commit 4fa28e9040
9 changed files with 34 additions and 22 deletions

View File

@@ -5,6 +5,7 @@
<column name="REPOSITORY_NAME" type="varchar(100)" nullable="false"/>
<column name="PRIORITY_ID" type="int" nullable="false" autoIncrement="true" unique="true"/>
<column name="PRIORITY_NAME" type="varchar(100)" nullable="false"/>
<column name="DESCRIPTION" type="varchar(255)" nullable="false"/>
<column name="ORDERING" type="int" nullable="false"/>
<column name="COLOR" type="char(6)" nullable="false"/>
</createTable>

View File

@@ -16,10 +16,11 @@ trait PrioritiesControllerBase extends ControllerBase {
self: PrioritiesService with IssuesService with RepositoryService
with ReferrerAuthenticator with WritableUsersAuthenticator =>
case class PriorityForm(priorityName: String, color: String)
case class PriorityForm(priorityName: String, description: String, color: String)
val priorityForm = mapping(
"priorityName" -> trim(label("Priority name", text(required, priorityName, uniquePriorityName, maxlength(100)))),
"description" -> trim(label("Description", text(required, maxlength(255)))),
"priorityColor" -> trim(label("Color", text(required, color)))
)(PriorityForm.apply)
@@ -37,7 +38,7 @@ trait PrioritiesControllerBase extends ControllerBase {
})
ajaxPost("/:owner/:repository/issues/priorities/new", priorityForm)(writableUsersOnly { (form, repository) =>
val priorityId = createPriority(repository.owner, repository.name, form.priorityName, form.color.substring(1))
val priorityId = createPriority(repository.owner, repository.name, form.priorityName, form.description, form.color.substring(1))
html.priority(
getPriority(repository.owner, repository.name, priorityId).get,
countIssueGroupByPriorities(repository.owner, repository.name, IssuesService.IssueSearchCondition(), Map.empty),
@@ -52,7 +53,7 @@ trait PrioritiesControllerBase extends ControllerBase {
})
ajaxPost("/:owner/:repository/issues/priorities/:priorityId/edit", priorityForm)(writableUsersOnly { (form, repository) =>
updatePriority(repository.owner, repository.name, params("priorityId").toInt, form.priorityName, form.color.substring(1))
updatePriority(repository.owner, repository.name, params("priorityId").toInt, form.priorityName, form.description, form.color.substring(1))
html.priority(
getPriority(repository.owner, repository.name, params("priorityId").toInt).get,
countIssueGroupByPriorities(repository.owner, repository.name, IssuesService.IssueSearchCondition(), Map.empty),

View File

@@ -8,9 +8,10 @@ trait PriorityComponent extends TemplateComponent { self: Profile =>
class Priorities(tag: Tag) extends Table[Priority](tag, "PRIORITY") with PriorityTemplate {
override val priorityId = column[Int]("PRIORITY_ID", O AutoInc)
override val priorityName = column[String]("PRIORITY_NAME")
val description = column[String]("DESCRIPTION")
val ordering = column[Int]("ORDERING")
val color = column[String]("COLOR")
def * = (userName, repositoryName, priorityId, priorityName, ordering, color) <> (Priority.tupled, Priority.unapply)
def * = (userName, repositoryName, priorityId, priorityName, description, ordering, color) <> (Priority.tupled, Priority.unapply)
def byPrimaryKey(owner: String, repository: String, priorityId: Int) = byPriority(owner, repository, priorityId)
def byPrimaryKey(userName: Rep[String], repositoryName: Rep[String], priorityId: Rep[Int]) = byPriority(userName, repositoryName, priorityId)
@@ -22,6 +23,7 @@ case class Priority (
repositoryName: String,
priorityId: Int = 0,
priorityName: String,
description: String,
ordering: Int = 0,
color: String){

View File

@@ -15,7 +15,7 @@ trait PrioritiesService {
def getPriority(owner: String, repository: String, priorityName: String)(implicit s: Session): Option[Priority] =
Priorities.filter(_.byPriority(owner, repository, priorityName)).firstOption
def createPriority(owner: String, repository: String, priorityName: String, color: String)(implicit s: Session): Int = {
def createPriority(owner: String, repository: String, priorityName: String, description: String, color: String)(implicit s: Session): Int = {
val ordering = Priorities.filter(_.byRepository(owner, repository))
.list
.map(p => p.ordering)
@@ -27,16 +27,17 @@ trait PrioritiesService {
userName = owner,
repositoryName = repository,
priorityName = priorityName,
description = description,
ordering = ordering,
color = color
)
}
def updatePriority(owner: String, repository: String, priorityId: Int, priorityName: String, color: String)
def updatePriority(owner: String, repository: String, priorityId: Int, priorityName: String, description: String, color: String)
(implicit s: Session): Unit =
Priorities.filter(_.byPrimaryKey(owner, repository, priorityId))
.map(t => (t.priorityName, t.color))
.update(priorityName, color)
.map(t => (t.priorityName, t.description, t.color))
.update(priorityName, description, color)
def reorderPriorities(owner: String, repository: String, order: Map[Int, Int])
(implicit s: Session): Unit = {

View File

@@ -78,8 +78,8 @@ trait RepositoryCreationService {
}
def insertDefaultPriorities(userName: String, repositoryName: String)(implicit s: Session): Unit = {
createPriority(userName, repositoryName, "high", "fc2929")
createPriority(userName, repositoryName, "medium", "fcc629")
createPriority(userName, repositoryName, "low", "acacac")
createPriority(userName, repositoryName, "high", "high", "fc2929")
createPriority(userName, repositoryName, "medium", "medium", "fcc629")
createPriority(userName, repositoryName, "low", "low", "acacac")
}
}

View File

@@ -42,7 +42,7 @@
<li><a href="javascript:void(0);" class="priority" data-id=""><i class="octicon octicon-x"></i> Clear priority</a></li>
@priorities.map { priority =>
<li>
<a href="javascript:void(0);" class="priority" data-id="@priority.priorityId" data-name="@priority.priorityName" data-color="#@priority.color" data-font-color="#@priority.fontColor">
<a href="javascript:void(0);" class="priority" data-id="@priority.priorityId" data-name="@priority.priorityName" data-color="#@priority.color" data-font-color="#@priority.fontColor" title="@priority.description">
@gitbucket.core.helper.html.checkicon(issue.flatMap(is => is.priorityId).map(id => id == priority.priorityId).getOrElse(false))
<span class="label" style="background-color: #@priority.color;">&nbsp;</span>
@priority.priorityName
@@ -56,7 +56,7 @@
<span id="label-priority">
@issue.flatMap(_.priorityId).map { priorityId =>
@priorities.collect { case priority if(priority.priorityId == priorityId) =>
<a class="issue-priority" style="background-color: #@priority.color; color: #@priority.fontColor;" href="@helpers.url(repository)/issues?priority=@helpers.urlEncode(priority.priorityName)&state=open">@priority.priorityName</a>
<a class="issue-priority" style="background-color: #@priority.color; color: #@priority.fontColor;" href="@helpers.url(repository)/issues?priority=@helpers.urlEncode(priority.priorityName)&state=open" title="@priority.description">@priority.priorityName</a>
}
}.getOrElse {
<span class="muted small">No priority</span>
@@ -190,12 +190,13 @@ $(function(){
$('a.priority').click(function(){
var priorityName = $(this).data('name');
var priorityId = $(this).data('id');
var description = $(this).attr('title');
var color = $(this).data('color');
var fontColor = $(this).data('font-color');
$.post('@helpers.url(repository)/issues/@issue.issueId/priority',
{ priorityId: priorityId },
function(data){
displayPriority(priorityName, priorityId, color, fontColor);
displayPriority(priorityName, priorityId, description, color, fontColor);
}
);
});
@@ -239,9 +240,10 @@ $(function(){
$('a.priority').click(function(){
var priorityName = $(this).data('name');
var priorityId = $(this).data('id');
var description = $(this).attr('title');
var color = $(this).data('color');
var fontColor = $(this).data('font-color');
displayPriority(priorityName, priorityId, color, fontColor);
displayPriority(priorityName, priorityId, description, color, fontColor);
$('input[name=priorityId]').val(priorityId);
});
@@ -279,13 +281,14 @@ $(function(){
}
}
function displayPriority(priorityName, priorityId, color, fontColor){
function displayPriority(priorityName, priorityId, description, color, fontColor){
$('a.priority i.octicon-check').removeClass('octicon-check');
if(priorityId == ''){
$('#label-priority').html($('<span class="muted small">').text('No priority'));
} else {
$('#label-priority').html($('<a class="issue-priority">').text(priorityName)
.attr('href', '@helpers.url(repository)/issues?priority=' + encodeURIComponent(priorityName) + '&state=open')
.attr('title', description)
.css({
"background-color": color,
"color": fontColor

View File

@@ -57,7 +57,7 @@
</li>
@priorities.map { priority =>
<li>
<a href="@condition.copy(priority = (if(condition.priority == Some(Some(priority.priorityName))) None else Some(Some(priority.priorityName)))).toURL">
<a href="@condition.copy(priority = (if(condition.priority == Some(Some(priority.priorityName))) None else Some(Some(priority.priorityName)))).toURL" title="@priority.description">
@gitbucket.core.helper.html.checkicon(condition.priority == Some(Some(priority.priorityName)))
<span style="background-color: #@priority.color;" class="label-color">&nbsp;&nbsp;</span>
@priority.priorityName
@@ -157,7 +157,7 @@
@gitbucket.core.helper.html.dropdown("Priority", filter = ("priority", "Find Priority...")) {
<li><a href="javascript:void(0);" class="toggle-priority" data-id="">No priority</a></li>
@priorities.map { priority =>
<li><a href="javascript:void(0);" class="toggle-priority" data-id="@priority.priorityId">
<li><a href="javascript:void(0);" class="toggle-priority" data-id="@priority.priorityId" title="@priority.description">
<span style="background-color: #@priority.color;" class="label">&nbsp;</span>
@priority.priorityName</a></li>
}
@@ -244,7 +244,7 @@
<div class="small muted" style="margin-left: 12px; margin-top: 2px;">
#@issue.issueId opened @gitbucket.core.helper.html.datetimeago(issue.registeredDate) by @helpers.user(issue.openedUserName, styleClass="username")
@priority.map(priority => priorities.filter(p => p.priorityName == priority).head).map { priority =>
<span style="margin: 20px;"><a href="@condition.copy(priority = Some(Some(priority.priorityName))).toURL" class="username"><i class="octicon octicon-flame"></i>
<span style="margin: 20px;"><a href="@condition.copy(priority = Some(Some(priority.priorityName))).toURL" class="username" title="@priority.description"><i class="octicon octicon-flame"></i>
<span class="issue-priority issue-priority-inline" style="background-color: #@priority.color; color: #@priority.fontColor;">@priority.priorityName</span></a></span>
}
@milestone.map { milestone =>

View File

@@ -12,6 +12,7 @@
<script>
$('div#priority-color-@priorityId').colorpicker({format: "hex"});
</script>
<input type="text" id="description-@priorityId" style="width: 500px; float: left; margin-left: 4px;" class="form-control" value="@priority.map(_.description)" placeholder="Description..." />
<span class="pull-right">
<span id="priority-error-@priorityId" class="error"></span>
<input type="button" id="cancel-@priorityId" class="btn btn-default priority-edit-cancel" value="Cancel">
@@ -24,6 +25,7 @@ $(function(){
$('#submit-@priorityId').click(function(e){
$.post('@helpers.url(repository)/issues/priorities/@{if(priorityId == "new") "new" else priorityId + "/edit"}', {
'priorityName' : $('#priorityName-@priorityId').val(),
'description' : $('#description-@priorityId').val(),
'priorityColor': $('#priorityColor-@priorityId').val()
}, function(data, status){
$('div#edit-priority-area-@priorityId').remove();

View File

@@ -6,19 +6,21 @@
<tr id="priority-row-@priority.priorityId" class="priority-row">
<td style="padding-top: 15px; padding-bottom: 15px;">
<div class="milestone row" id="priority-@priority.priorityId">
<div class="col-md-8">
<div class="col-md-2">
@if(hasWritePermission) {
<div class="pull-left priority-sort-handle" style="margin-top: 3px"><i class="octicon octicon-grabber" style="font-size: 2em"></i></div>
}
<div style="margin-top: 6px">
<a href="@helpers.url(repository)/issues?priority=@helpers.urlEncode(priority.priorityName)&state=open" id="priority-row-content-@priority.priorityId">
<span style="background-color: #@priority.color; color: #@priority.fontColor; padding: 8px; font-size: 120%; border-radius: 4px;">
<i class="octicon octicon-flame" style="color: #@priority.fontColor;"></i>
@priority.priorityName
<i class="octicon octicon-flame" style="color: #@priority.fontColor;"></i>&nbsp;@priority.priorityName
</span>
</a>
</div>
</div>
<div class="col-md-6">
<span>@priority.description</span>
</div>
<div class="@if(hasWritePermission){col-md-2} else {col-md-4}">
<div class="pull-right">
<span class="muted">@counts.get(priority.priorityName).getOrElse(0) open issues</span>