diff --git a/gogs.go b/gogs.go index 04029391f..2f8e51bf5 100644 --- a/gogs.go +++ b/gogs.go @@ -16,7 +16,7 @@ import ( "github.com/gogits/gogs/modules/setting" ) -const APP_VER = "0.10.19.0316" +const APP_VER = "0.10.20.0316" func init() { setting.AppVer = APP_VER diff --git a/models/action.go b/models/action.go index 6a25f542a..d04f6d3dc 100644 --- a/models/action.go +++ b/models/action.go @@ -671,14 +671,12 @@ func MergePullRequestAction(actUser *User, repo *Repository, pull *Issue) error // GetFeeds returns action list of given user in given context. // actorID is the user who's requesting, ctxUserID is the user/org that is requested. // actorID can be -1 when isProfile is true or to skip the permission check. -func GetFeeds(ctxUser *User, actorID int64, page int, isProfile bool) ([]*Action, error) { - if page <= 0 { - page = 1 - } - +func GetFeeds(ctxUser *User, actorID, afterID int64, isProfile bool) ([]*Action, error) { actions := make([]*Action, 0, setting.UI.User.NewsFeedPagingNum) - sess := x.Limit(setting.UI.User.NewsFeedPagingNum, (page-1)*setting.UI.User.NewsFeedPagingNum). - Desc("id").Where("user_id = ?", ctxUser.ID) + sess := x.Limit(setting.UI.User.NewsFeedPagingNum).Where("user_id = ?", ctxUser.ID).Desc("id") + if afterID > 0 { + sess.And("id < ?", afterID) + } if isProfile { sess.And("is_private = ?", false).And("act_user_id = ?", ctxUser.ID) } else if actorID != -1 && ctxUser.IsOrganization() { diff --git a/public/js/gogs.js b/public/js/gogs.js index 5c35cae04..9ea6f6f1e 100644 --- a/public/js/gogs.js +++ b/public/js/gogs.js @@ -1339,6 +1339,30 @@ $(document).ready(function () { e.trigger.setAttribute('data-content', e.trigger.getAttribute('data-original')) }); + // AJAX load buttons + $('.ajax-load-button').click(function () { + var $this = $(this); + $this.addClass('disabled'); + + $.ajax({ + url: $this.data('url'), + headers: { + 'X-AJAX': "true" + } + }).success(function (data, status, request) { + $(data).insertBefore($this); + + // Update new URL or remove self if no more feeds + var url = request.getResponseHeader('X-AJAX-URL'); + if (url) { + $this.data('url', url); + $this.removeClass('disabled'); + } else { + $this.remove(); + } + }); + }); + // Helpers. $('.delete-button').click(function () { var $this = $(this); diff --git a/routers/user/home.go b/routers/user/home.go index 5dc834669..2fe70c43e 100644 --- a/routers/user/home.go +++ b/routers/user/home.go @@ -20,6 +20,7 @@ import ( const ( DASHBOARD base.TplName = "user/dashboard/dashboard" + NEWS_FEED base.TplName = "user/dashboard/feeds" ISSUES base.TplName = "user/dashboard/issues" PROFILE base.TplName = "user/profile" ORG_HOME base.TplName = "org/home" @@ -52,8 +53,8 @@ func getDashboardContextUser(ctx *context.Context) *models.User { // retrieveFeeds loads feeds from database by given context user. // The user could be organization so it is not always the logged in user, // which is why we have to explicitly pass the context user ID. -func retrieveFeeds(ctx *context.Context, ctxUser *models.User, userID int64, page int, isProfile bool) { - actions, err := models.GetFeeds(ctxUser, userID, page, isProfile) +func retrieveFeeds(ctx *context.Context, ctxUser *models.User, userID int64, isProfile bool) { + actions, err := models.GetFeeds(ctxUser, userID, ctx.QueryInt64("after_id"), isProfile) if err != nil { ctx.Handle(500, "GetFeeds", err) return @@ -81,6 +82,11 @@ func retrieveFeeds(ctx *context.Context, ctxUser *models.User, userID int64, pag feeds = append(feeds, act) } ctx.Data["Feeds"] = feeds + if len(feeds) > 0 { + afterID := feeds[len(feeds)-1].ID + ctx.Data["AfterID"] = afterID + ctx.Header().Set("X-AJAX-URL", fmt.Sprintf("%s?after_id=%d", ctx.Data["Link"], afterID)) + } } func Dashboard(ctx *context.Context) { @@ -89,6 +95,16 @@ func Dashboard(ctx *context.Context) { return } + retrieveFeeds(ctx, ctxUser, ctx.User.ID, false) + if ctx.Written() { + return + } + + if ctx.Req.Header.Get("X-AJAX") == "true" { + ctx.HTML(200, NEWS_FEED) + return + } + ctx.Data["Title"] = ctxUser.DisplayName() + " - " + ctx.Tr("dashboard") ctx.Data["PageIsDashboard"] = true ctx.Data["PageIsNews"] = true @@ -143,10 +159,6 @@ func Dashboard(ctx *context.Context) { ctx.Data["MirrorCount"] = len(mirrors) ctx.Data["Mirrors"] = mirrors - retrieveFeeds(ctx, ctxUser, ctx.User.ID, 1, false) - if ctx.Written() { - return - } ctx.HTML(200, DASHBOARD) } diff --git a/routers/user/profile.go b/routers/user/profile.go index be4356198..ee5f97c53 100644 --- a/routers/user/profile.go +++ b/routers/user/profile.go @@ -86,7 +86,7 @@ func Profile(ctx *context.Context) { ctx.Data["TabName"] = tab switch tab { case "activity": - retrieveFeeds(ctx, ctxUser, -1, 0, true) + retrieveFeeds(ctx, ctxUser, -1, true) if ctx.Written() { return } diff --git a/templates/.VERSION b/templates/.VERSION index c4d428b70..5c9f0f2f9 100644 --- a/templates/.VERSION +++ b/templates/.VERSION @@ -1 +1 @@ -0.10.19.0316 \ No newline at end of file +0.10.20.0316 \ No newline at end of file diff --git a/templates/user/dashboard/dashboard.tmpl b/templates/user/dashboard/dashboard.tmpl index 5e862f99a..0c2c744f8 100644 --- a/templates/user/dashboard/dashboard.tmpl +++ b/templates/user/dashboard/dashboard.tmpl @@ -5,6 +5,7 @@
{{template "user/dashboard/feeds" .}} +
-{{end}} +{{end}} \ No newline at end of file