(refs #4)Add 'News Feed' to the index page.

This commit is contained in:
takezoe
2013-07-07 14:05:01 +09:00
parent 6005282d9f
commit 96dac65e31
5 changed files with 81 additions and 59 deletions

View File

@@ -2,12 +2,16 @@ package app
import service._ import service._
class IndexController extends IndexControllerBase with RepositoryService with AccountService with SystemSettingsService class IndexController extends IndexControllerBase
with RepositoryService with AccountService with SystemSettingsService with ActivityService
trait IndexControllerBase extends ControllerBase { self: RepositoryService with SystemSettingsService => trait IndexControllerBase extends ControllerBase { self: RepositoryService
with SystemSettingsService with ActivityService =>
get("/"){ get("/"){
html.index(getAccessibleRepositories(context.loginAccount, baseUrl), loadSystemSettings(), html.index(getRecentActivities(),
getAccessibleRepositories(context.loginAccount, baseUrl),
loadSystemSettings(),
context.loginAccount.map{ account => getRepositoryNamesOfUser(account.userName) }.getOrElse(Nil)) context.loginAccount.map{ account => getRepositoryNamesOfUser(account.userName) }.getOrElse(Nil))
} }

View File

@@ -22,6 +22,16 @@ trait ActivityService {
.list .list
} }
def getRecentActivities(): List[Activity] =
Query(Activities)
.innerJoin(Repositories).on((t1, t2) => t1.byRepository(t2.userName, t2.repositoryName))
.filter { case (t1, t2) => t2.isPrivate is false.bind }
.sortBy { case (t1, t2) => t1.activityId desc }
.map { case (t1, t2) => t1 }
.take(30)
.list
def recordCreateRepositoryActivity(userName: String, repositoryName: String, activityUserName: String): Unit = def recordCreateRepositoryActivity(userName: String, repositoryName: String, activityUserName: String): Unit =
Activities.autoInc insert(userName, repositoryName, activityUserName, Activities.autoInc insert(userName, repositoryName, activityUserName,
"create_repository", "create_repository",

View File

@@ -15,39 +15,7 @@
</div> </div>
<div class="span8"> <div class="span8">
@tab(account, "activity") @tab(account, "activity")
@if(activities.isEmpty){ @helper.html.activities(activities)
No activity
} else {
@activities.map { activity =>
<div class="block">
<div class="muted small">@datetime(activity.activityDate)</div>
<div class="strong">@activityMessage(activity.message)</div>
@activity.additionalInfo.map { additionalInfo =>
@(activity.activityType match {
case "create_wiki" => {
<div class="small">Created <a href={"%s/%s/%s/wiki/%s".format(path, activity.userName, activity.repositoryName, additionalInfo)}>{additionalInfo}</a>.</div>
}
case "edit_wiki" => {
<div class="small">Edited <a href={"%s/%s/%s/wiki/%s".format(path, activity.userName, activity.repositoryName, additionalInfo)}>{additionalInfo}</a>.</div>
}
case "push" => {
<div class="small">
{additionalInfo.split("\n").map{ commit =>
<div>
<a href={"%s/%s/%s/commit/%s".format(path, activity.userName, activity.repositoryName, commit.substring(0, 40))} class="monospace">{commit.substring(0, 7)}</a>
<span>{commit.substring(41)}</span>
</div>
}}
</div>
}
case _ => {
<div>{additionalInfo}</div>
}
})
}
</div>
}
}
</div> </div>
</div> </div>
</div> </div>

View File

@@ -0,0 +1,36 @@
@(activities: List[model.Activity])(implicit context: app.Context)
@import context._
@import view.helpers._
@if(activities.isEmpty){
No activity
} else {
@activities.map { activity =>
<div class="block">
<div class="muted small">@datetime(activity.activityDate)</div>
<div class="strong">@activityMessage(activity.message)</div>
@activity.additionalInfo.map { additionalInfo =>
@(activity.activityType match {
case "create_wiki" => {
<div class="small">Created <a href={"%s/%s/%s/wiki/%s".format(path, activity.userName, activity.repositoryName, additionalInfo)}>{additionalInfo}</a>.</div>
}
case "edit_wiki" => {
<div class="small">Edited <a href={"%s/%s/%s/wiki/%s".format(path, activity.userName, activity.repositoryName, additionalInfo)}>{additionalInfo}</a>.</div>
}
case "push" => {
<div class="small">
{additionalInfo.split("\n").map{ commit =>
<div>
<a href={"%s/%s/%s/commit/%s".format(path, activity.userName, activity.repositoryName, commit.substring(0, 40))} class="monospace">{commit.substring(0, 7)}</a>
<span>{commit.substring(41)}</span>
</div>
}}
</div>
}
case _ => {
<div>{additionalInfo}</div>
}
})
}
</div>
}
}

View File

@@ -1,31 +1,14 @@
@(repositories: List[service.RepositoryService.RepositoryInfo], systemSettings: service.SystemSettingsService.SystemSettings, @(activities: List[model.Activity],
repositories: List[service.RepositoryService.RepositoryInfo],
systemSettings: service.SystemSettingsService.SystemSettings,
userRepositories: List[String])(implicit context: app.Context) userRepositories: List[String])(implicit context: app.Context)
@import context._ @import context._
@import view.helpers._ @import view.helpers._
@main("GitBucket"){ @main("GitBucket"){
<div class="row-fluid"> <div class="row-fluid">
<div class="span8"> <div class="span8">
<h3>Recent updated repositories</h3> <h3>News Feed</h3>
@if(repositories.isEmpty){ @helper.html.activities(activities)
No repositories
} else {
@repositories.map { repository =>
<div class="block">
<div class="block-header">
<a href="@url(repository.owner)">@repository.owner</a>
/
<a href="@url(repository)">@repository.name</a>
@if(repository.repository.isPrivate){
<i class="icon-lock"></i>
}
</div>
@if(repository.repository.description.isDefined){
<div>@repository.repository.description</div>
}
<div><span class="muted small">Last updated: @datetime(repository.repository.lastActivityDate)</span></div>
</div>
}
}
</div> </div>
<div class="span4"> <div class="span4">
@if(loginAccount.isEmpty){ @if(loginAccount.isEmpty){
@@ -47,12 +30,33 @@
} else { } else {
@userRepositories.map { repositoryName => @userRepositories.map { repositoryName =>
<tr> <tr>
<td><a href="@path/@loginAccount.get.userName/@repositoryName">@repositoryName</a></td> <td><a href="@path/@loginAccount.get.userName/@repositoryName"><strong>@repositoryName</strong></a></td>
</tr> </tr>
} }
} }
</table> </table>
} }
<table class="table table-bordered">
<tr>
<th class="metal">
Recent updated repositories
</th>
</tr>
@if(repositories.isEmpty){
<tr>
<td>No repositories</td>
</tr>
} else {
@repositories.map { repository =>
<tr>
<td>
<a href="@url(repository)">@repository.owner/<strong>@repository.name</strong></a>
</td>
</tr>
}
}
</table>
</div> </div>
</div> </div>