mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-04 01:34:27 +00:00 
			
		
		
		
	Add pagination for dashboard and user activity feeds (#22937)
Previously only the last few activities where available. This works for all activity and for activity on a date chosen on the heatmap.
This commit is contained in:
		
				
					committed by
					
						
						GitHub
					
				
			
			
				
	
			
			
			
						parent
						
							740a5ecdd9
						
					
				
				
					commit
					f4920c9c7f
				
			@@ -380,14 +380,14 @@ type GetFeedsOptions struct {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetFeeds returns actions according to the provided options
 | 
					// GetFeeds returns actions according to the provided options
 | 
				
			||||||
func GetFeeds(ctx context.Context, opts GetFeedsOptions) (ActionList, error) {
 | 
					func GetFeeds(ctx context.Context, opts GetFeedsOptions) (ActionList, int64, error) {
 | 
				
			||||||
	if opts.RequestedUser == nil && opts.RequestedTeam == nil && opts.RequestedRepo == nil {
 | 
						if opts.RequestedUser == nil && opts.RequestedTeam == nil && opts.RequestedRepo == nil {
 | 
				
			||||||
		return nil, fmt.Errorf("need at least one of these filters: RequestedUser, RequestedTeam, RequestedRepo")
 | 
							return nil, 0, fmt.Errorf("need at least one of these filters: RequestedUser, RequestedTeam, RequestedRepo")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cond, err := activityQueryCondition(opts)
 | 
						cond, err := activityQueryCondition(opts)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, 0, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sess := db.GetEngine(ctx).Where(cond).
 | 
						sess := db.GetEngine(ctx).Where(cond).
 | 
				
			||||||
@@ -398,16 +398,16 @@ func GetFeeds(ctx context.Context, opts GetFeedsOptions) (ActionList, error) {
 | 
				
			|||||||
	sess = db.SetSessionPagination(sess, &opts)
 | 
						sess = db.SetSessionPagination(sess, &opts)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	actions := make([]*Action, 0, opts.PageSize)
 | 
						actions := make([]*Action, 0, opts.PageSize)
 | 
				
			||||||
 | 
						count, err := sess.Desc("`action`.created_unix").FindAndCount(&actions)
 | 
				
			||||||
	if err := sess.Desc("`action`.created_unix").Find(&actions); err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, fmt.Errorf("Find: %w", err)
 | 
							return nil, 0, fmt.Errorf("FindAndCount: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err := ActionList(actions).loadAttributes(ctx); err != nil {
 | 
						if err := ActionList(actions).loadAttributes(ctx); err != nil {
 | 
				
			||||||
		return nil, fmt.Errorf("LoadAttributes: %w", err)
 | 
							return nil, 0, fmt.Errorf("LoadAttributes: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return actions, nil
 | 
						return actions, count, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ActivityReadable return whether doer can read activities of user
 | 
					// ActivityReadable return whether doer can read activities of user
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -44,7 +44,7 @@ func TestGetFeeds(t *testing.T) {
 | 
				
			|||||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
						assert.NoError(t, unittest.PrepareTestDatabase())
 | 
				
			||||||
	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
 | 
						user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	actions, err := activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
 | 
						actions, count, err := activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
 | 
				
			||||||
		RequestedUser:   user,
 | 
							RequestedUser:   user,
 | 
				
			||||||
		Actor:           user,
 | 
							Actor:           user,
 | 
				
			||||||
		IncludePrivate:  true,
 | 
							IncludePrivate:  true,
 | 
				
			||||||
@@ -56,8 +56,9 @@ func TestGetFeeds(t *testing.T) {
 | 
				
			|||||||
		assert.EqualValues(t, 1, actions[0].ID)
 | 
							assert.EqualValues(t, 1, actions[0].ID)
 | 
				
			||||||
		assert.EqualValues(t, user.ID, actions[0].UserID)
 | 
							assert.EqualValues(t, user.ID, actions[0].UserID)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						assert.Equal(t, int64(1), count)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	actions, err = activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
 | 
						actions, count, err = activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
 | 
				
			||||||
		RequestedUser:   user,
 | 
							RequestedUser:   user,
 | 
				
			||||||
		Actor:           user,
 | 
							Actor:           user,
 | 
				
			||||||
		IncludePrivate:  false,
 | 
							IncludePrivate:  false,
 | 
				
			||||||
@@ -65,6 +66,7 @@ func TestGetFeeds(t *testing.T) {
 | 
				
			|||||||
	})
 | 
						})
 | 
				
			||||||
	assert.NoError(t, err)
 | 
						assert.NoError(t, err)
 | 
				
			||||||
	assert.Len(t, actions, 0)
 | 
						assert.Len(t, actions, 0)
 | 
				
			||||||
 | 
						assert.Equal(t, int64(0), count)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestGetFeedsForRepos(t *testing.T) {
 | 
					func TestGetFeedsForRepos(t *testing.T) {
 | 
				
			||||||
@@ -74,38 +76,42 @@ func TestGetFeedsForRepos(t *testing.T) {
 | 
				
			|||||||
	pubRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 8})
 | 
						pubRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 8})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// private repo & no login
 | 
						// private repo & no login
 | 
				
			||||||
	actions, err := activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
 | 
						actions, count, err := activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
 | 
				
			||||||
		RequestedRepo:  privRepo,
 | 
							RequestedRepo:  privRepo,
 | 
				
			||||||
		IncludePrivate: true,
 | 
							IncludePrivate: true,
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	assert.NoError(t, err)
 | 
						assert.NoError(t, err)
 | 
				
			||||||
	assert.Len(t, actions, 0)
 | 
						assert.Len(t, actions, 0)
 | 
				
			||||||
 | 
						assert.Equal(t, int64(0), count)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// public repo & no login
 | 
						// public repo & no login
 | 
				
			||||||
	actions, err = activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
 | 
						actions, count, err = activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
 | 
				
			||||||
		RequestedRepo:  pubRepo,
 | 
							RequestedRepo:  pubRepo,
 | 
				
			||||||
		IncludePrivate: true,
 | 
							IncludePrivate: true,
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	assert.NoError(t, err)
 | 
						assert.NoError(t, err)
 | 
				
			||||||
	assert.Len(t, actions, 1)
 | 
						assert.Len(t, actions, 1)
 | 
				
			||||||
 | 
						assert.Equal(t, int64(1), count)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// private repo and login
 | 
						// private repo and login
 | 
				
			||||||
	actions, err = activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
 | 
						actions, count, err = activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
 | 
				
			||||||
		RequestedRepo:  privRepo,
 | 
							RequestedRepo:  privRepo,
 | 
				
			||||||
		IncludePrivate: true,
 | 
							IncludePrivate: true,
 | 
				
			||||||
		Actor:          user,
 | 
							Actor:          user,
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	assert.NoError(t, err)
 | 
						assert.NoError(t, err)
 | 
				
			||||||
	assert.Len(t, actions, 1)
 | 
						assert.Len(t, actions, 1)
 | 
				
			||||||
 | 
						assert.Equal(t, int64(1), count)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// public repo & login
 | 
						// public repo & login
 | 
				
			||||||
	actions, err = activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
 | 
						actions, count, err = activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
 | 
				
			||||||
		RequestedRepo:  pubRepo,
 | 
							RequestedRepo:  pubRepo,
 | 
				
			||||||
		IncludePrivate: true,
 | 
							IncludePrivate: true,
 | 
				
			||||||
		Actor:          user,
 | 
							Actor:          user,
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	assert.NoError(t, err)
 | 
						assert.NoError(t, err)
 | 
				
			||||||
	assert.Len(t, actions, 1)
 | 
						assert.Len(t, actions, 1)
 | 
				
			||||||
 | 
						assert.Equal(t, int64(1), count)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestGetFeeds2(t *testing.T) {
 | 
					func TestGetFeeds2(t *testing.T) {
 | 
				
			||||||
@@ -114,7 +120,7 @@ func TestGetFeeds2(t *testing.T) {
 | 
				
			|||||||
	org := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3})
 | 
						org := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3})
 | 
				
			||||||
	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
 | 
						user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	actions, err := activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
 | 
						actions, count, err := activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
 | 
				
			||||||
		RequestedUser:   org,
 | 
							RequestedUser:   org,
 | 
				
			||||||
		Actor:           user,
 | 
							Actor:           user,
 | 
				
			||||||
		IncludePrivate:  true,
 | 
							IncludePrivate:  true,
 | 
				
			||||||
@@ -127,8 +133,9 @@ func TestGetFeeds2(t *testing.T) {
 | 
				
			|||||||
		assert.EqualValues(t, 2, actions[0].ID)
 | 
							assert.EqualValues(t, 2, actions[0].ID)
 | 
				
			||||||
		assert.EqualValues(t, org.ID, actions[0].UserID)
 | 
							assert.EqualValues(t, org.ID, actions[0].UserID)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						assert.Equal(t, int64(1), count)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	actions, err = activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
 | 
						actions, count, err = activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
 | 
				
			||||||
		RequestedUser:   org,
 | 
							RequestedUser:   org,
 | 
				
			||||||
		Actor:           user,
 | 
							Actor:           user,
 | 
				
			||||||
		IncludePrivate:  false,
 | 
							IncludePrivate:  false,
 | 
				
			||||||
@@ -137,6 +144,7 @@ func TestGetFeeds2(t *testing.T) {
 | 
				
			|||||||
	})
 | 
						})
 | 
				
			||||||
	assert.NoError(t, err)
 | 
						assert.NoError(t, err)
 | 
				
			||||||
	assert.Len(t, actions, 0)
 | 
						assert.Len(t, actions, 0)
 | 
				
			||||||
 | 
						assert.Equal(t, int64(0), count)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestActivityReadable(t *testing.T) {
 | 
					func TestActivityReadable(t *testing.T) {
 | 
				
			||||||
@@ -224,13 +232,14 @@ func TestGetFeedsCorrupted(t *testing.T) {
 | 
				
			|||||||
		RepoID: 1700,
 | 
							RepoID: 1700,
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	actions, err := activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
 | 
						actions, count, err := activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
 | 
				
			||||||
		RequestedUser:  user,
 | 
							RequestedUser:  user,
 | 
				
			||||||
		Actor:          user,
 | 
							Actor:          user,
 | 
				
			||||||
		IncludePrivate: true,
 | 
							IncludePrivate: true,
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	assert.NoError(t, err)
 | 
						assert.NoError(t, err)
 | 
				
			||||||
	assert.Len(t, actions, 0)
 | 
						assert.Len(t, actions, 0)
 | 
				
			||||||
 | 
						assert.Equal(t, int64(0), count)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestConsistencyUpdateAction(t *testing.T) {
 | 
					func TestConsistencyUpdateAction(t *testing.T) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -73,7 +73,7 @@ func TestGetUserHeatmapDataByUser(t *testing.T) {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// get the action for comparison
 | 
							// get the action for comparison
 | 
				
			||||||
		actions, err := activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
 | 
							actions, count, err := activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
 | 
				
			||||||
			RequestedUser:   user,
 | 
								RequestedUser:   user,
 | 
				
			||||||
			Actor:           doer,
 | 
								Actor:           doer,
 | 
				
			||||||
			IncludePrivate:  true,
 | 
								IncludePrivate:  true,
 | 
				
			||||||
@@ -90,6 +90,7 @@ func TestGetUserHeatmapDataByUser(t *testing.T) {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		assert.NoError(t, err)
 | 
							assert.NoError(t, err)
 | 
				
			||||||
		assert.Len(t, actions, contributions, "invalid action count: did the test data became too old?")
 | 
							assert.Len(t, actions, contributions, "invalid action count: did the test data became too old?")
 | 
				
			||||||
 | 
							assert.Equal(t, count, int64(contributions))
 | 
				
			||||||
		assert.Equal(t, tc.CountResult, contributions, fmt.Sprintf("testcase '%s'", tc.desc))
 | 
							assert.Equal(t, tc.CountResult, contributions, fmt.Sprintf("testcase '%s'", tc.desc))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Test JSON rendering
 | 
							// Test JSON rendering
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,7 +26,7 @@ func ShowUserFeedAtom(ctx *context.Context) {
 | 
				
			|||||||
func showUserFeed(ctx *context.Context, formatType string) {
 | 
					func showUserFeed(ctx *context.Context, formatType string) {
 | 
				
			||||||
	includePrivate := ctx.IsSigned && (ctx.Doer.IsAdmin || ctx.Doer.ID == ctx.ContextUser.ID)
 | 
						includePrivate := ctx.IsSigned && (ctx.Doer.IsAdmin || ctx.Doer.ID == ctx.ContextUser.ID)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	actions, err := activities_model.GetFeeds(ctx, activities_model.GetFeedsOptions{
 | 
						actions, _, err := activities_model.GetFeeds(ctx, activities_model.GetFeedsOptions{
 | 
				
			||||||
		RequestedUser:   ctx.ContextUser,
 | 
							RequestedUser:   ctx.ContextUser,
 | 
				
			||||||
		Actor:           ctx.Doer,
 | 
							Actor:           ctx.Doer,
 | 
				
			||||||
		IncludePrivate:  includePrivate,
 | 
							IncludePrivate:  includePrivate,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// ShowRepoFeed shows user activity on the repo as RSS / Atom feed
 | 
					// ShowRepoFeed shows user activity on the repo as RSS / Atom feed
 | 
				
			||||||
func ShowRepoFeed(ctx *context.Context, repo *repo_model.Repository, formatType string) {
 | 
					func ShowRepoFeed(ctx *context.Context, repo *repo_model.Repository, formatType string) {
 | 
				
			||||||
	actions, err := activities_model.GetFeeds(ctx, activities_model.GetFeedsOptions{
 | 
						actions, _, err := activities_model.GetFeeds(ctx, activities_model.GetFeedsOptions{
 | 
				
			||||||
		RequestedRepo:  repo,
 | 
							RequestedRepo:  repo,
 | 
				
			||||||
		Actor:          ctx.Doer,
 | 
							Actor:          ctx.Doer,
 | 
				
			||||||
		IncludePrivate: true,
 | 
							IncludePrivate: true,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -72,12 +72,23 @@ func Dashboard(ctx *context.Context) {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var (
 | 
				
			||||||
 | 
							date = ctx.FormString("date")
 | 
				
			||||||
 | 
							page = ctx.FormInt("page")
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Make sure page number is at least 1. Will be posted to ctx.Data.
 | 
				
			||||||
 | 
						if page <= 1 {
 | 
				
			||||||
 | 
							page = 1
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ctx.Data["Title"] = ctxUser.DisplayName() + " - " + ctx.Tr("dashboard")
 | 
						ctx.Data["Title"] = ctxUser.DisplayName() + " - " + ctx.Tr("dashboard")
 | 
				
			||||||
	ctx.Data["PageIsDashboard"] = true
 | 
						ctx.Data["PageIsDashboard"] = true
 | 
				
			||||||
	ctx.Data["PageIsNews"] = true
 | 
						ctx.Data["PageIsNews"] = true
 | 
				
			||||||
	cnt, _ := organization.GetOrganizationCount(ctx, ctxUser)
 | 
						cnt, _ := organization.GetOrganizationCount(ctx, ctxUser)
 | 
				
			||||||
	ctx.Data["UserOrgsCount"] = cnt
 | 
						ctx.Data["UserOrgsCount"] = cnt
 | 
				
			||||||
	ctx.Data["MirrorsEnabled"] = setting.Mirror.Enabled
 | 
						ctx.Data["MirrorsEnabled"] = setting.Mirror.Enabled
 | 
				
			||||||
 | 
						ctx.Data["Date"] = date
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var uid int64
 | 
						var uid int64
 | 
				
			||||||
	if ctxUser != nil {
 | 
						if ctxUser != nil {
 | 
				
			||||||
@@ -98,8 +109,7 @@ func Dashboard(ctx *context.Context) {
 | 
				
			|||||||
		ctx.Data["HeatmapData"] = data
 | 
							ctx.Data["HeatmapData"] = data
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var err error
 | 
						feeds, count, err := activities_model.GetFeeds(ctx, activities_model.GetFeedsOptions{
 | 
				
			||||||
	ctx.Data["Feeds"], err = activities_model.GetFeeds(ctx, activities_model.GetFeedsOptions{
 | 
					 | 
				
			||||||
		RequestedUser:   ctxUser,
 | 
							RequestedUser:   ctxUser,
 | 
				
			||||||
		RequestedTeam:   ctx.Org.Team,
 | 
							RequestedTeam:   ctx.Org.Team,
 | 
				
			||||||
		Actor:           ctx.Doer,
 | 
							Actor:           ctx.Doer,
 | 
				
			||||||
@@ -107,13 +117,22 @@ func Dashboard(ctx *context.Context) {
 | 
				
			|||||||
		OnlyPerformedBy: false,
 | 
							OnlyPerformedBy: false,
 | 
				
			||||||
		IncludeDeleted:  false,
 | 
							IncludeDeleted:  false,
 | 
				
			||||||
		Date:            ctx.FormString("date"),
 | 
							Date:            ctx.FormString("date"),
 | 
				
			||||||
		ListOptions:     db.ListOptions{PageSize: setting.UI.FeedPagingNum},
 | 
							ListOptions: db.ListOptions{
 | 
				
			||||||
 | 
								Page:     page,
 | 
				
			||||||
 | 
								PageSize: setting.UI.FeedPagingNum,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		ctx.ServerError("GetFeeds", err)
 | 
							ctx.ServerError("GetFeeds", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ctx.Data["Feeds"] = feeds
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pager := context.NewPagination(int(count), setting.UI.FeedPagingNum, page, 5)
 | 
				
			||||||
 | 
						pager.AddParam(ctx, "date", "Date")
 | 
				
			||||||
 | 
						ctx.Data["Page"] = pager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ctx.HTML(http.StatusOK, tplDashboard)
 | 
						ctx.HTML(http.StatusOK, tplDashboard)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -119,6 +119,11 @@ func Profile(ctx *context.Context) {
 | 
				
			|||||||
		page = 1
 | 
							page = 1
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pagingNum := setting.UI.User.RepoPagingNum
 | 
				
			||||||
 | 
						if tab == "activity" {
 | 
				
			||||||
 | 
							pagingNum = setting.UI.FeedPagingNum
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	topicOnly := ctx.FormBool("topic")
 | 
						topicOnly := ctx.FormBool("topic")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
@@ -164,7 +169,7 @@ func Profile(ctx *context.Context) {
 | 
				
			|||||||
	switch tab {
 | 
						switch tab {
 | 
				
			||||||
	case "followers":
 | 
						case "followers":
 | 
				
			||||||
		items, count, err := user_model.GetUserFollowers(ctx, ctx.ContextUser, ctx.Doer, db.ListOptions{
 | 
							items, count, err := user_model.GetUserFollowers(ctx, ctx.ContextUser, ctx.Doer, db.ListOptions{
 | 
				
			||||||
			PageSize: setting.UI.User.RepoPagingNum,
 | 
								PageSize: pagingNum,
 | 
				
			||||||
			Page:     page,
 | 
								Page:     page,
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
@@ -176,7 +181,7 @@ func Profile(ctx *context.Context) {
 | 
				
			|||||||
		total = int(count)
 | 
							total = int(count)
 | 
				
			||||||
	case "following":
 | 
						case "following":
 | 
				
			||||||
		items, count, err := user_model.GetUserFollowing(ctx, ctx.ContextUser, ctx.Doer, db.ListOptions{
 | 
							items, count, err := user_model.GetUserFollowing(ctx, ctx.ContextUser, ctx.Doer, db.ListOptions{
 | 
				
			||||||
			PageSize: setting.UI.User.RepoPagingNum,
 | 
								PageSize: pagingNum,
 | 
				
			||||||
			Page:     page,
 | 
								Page:     page,
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
@@ -187,24 +192,32 @@ func Profile(ctx *context.Context) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		total = int(count)
 | 
							total = int(count)
 | 
				
			||||||
	case "activity":
 | 
						case "activity":
 | 
				
			||||||
		ctx.Data["Feeds"], err = activities_model.GetFeeds(ctx, activities_model.GetFeedsOptions{
 | 
							date := ctx.FormString("date")
 | 
				
			||||||
 | 
							items, count, err := activities_model.GetFeeds(ctx, activities_model.GetFeedsOptions{
 | 
				
			||||||
			RequestedUser:   ctx.ContextUser,
 | 
								RequestedUser:   ctx.ContextUser,
 | 
				
			||||||
			Actor:           ctx.Doer,
 | 
								Actor:           ctx.Doer,
 | 
				
			||||||
			IncludePrivate:  showPrivate,
 | 
								IncludePrivate:  showPrivate,
 | 
				
			||||||
			OnlyPerformedBy: true,
 | 
								OnlyPerformedBy: true,
 | 
				
			||||||
			IncludeDeleted:  false,
 | 
								IncludeDeleted:  false,
 | 
				
			||||||
			Date:            ctx.FormString("date"),
 | 
								Date:            date,
 | 
				
			||||||
			ListOptions:     db.ListOptions{PageSize: setting.UI.FeedPagingNum},
 | 
								ListOptions: db.ListOptions{
 | 
				
			||||||
 | 
									PageSize: pagingNum,
 | 
				
			||||||
 | 
									Page:     page,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			ctx.ServerError("GetFeeds", err)
 | 
								ctx.ServerError("GetFeeds", err)
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							ctx.Data["Feeds"] = items
 | 
				
			||||||
 | 
							ctx.Data["Date"] = date
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							total = int(count)
 | 
				
			||||||
	case "stars":
 | 
						case "stars":
 | 
				
			||||||
		ctx.Data["PageIsProfileStarList"] = true
 | 
							ctx.Data["PageIsProfileStarList"] = true
 | 
				
			||||||
		repos, count, err = repo_model.SearchRepository(ctx, &repo_model.SearchRepoOptions{
 | 
							repos, count, err = repo_model.SearchRepository(ctx, &repo_model.SearchRepoOptions{
 | 
				
			||||||
			ListOptions: db.ListOptions{
 | 
								ListOptions: db.ListOptions{
 | 
				
			||||||
				PageSize: setting.UI.User.RepoPagingNum,
 | 
									PageSize: pagingNum,
 | 
				
			||||||
				Page:     page,
 | 
									Page:     page,
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			Actor:              ctx.Doer,
 | 
								Actor:              ctx.Doer,
 | 
				
			||||||
@@ -236,7 +249,7 @@ func Profile(ctx *context.Context) {
 | 
				
			|||||||
	case "watching":
 | 
						case "watching":
 | 
				
			||||||
		repos, count, err = repo_model.SearchRepository(ctx, &repo_model.SearchRepoOptions{
 | 
							repos, count, err = repo_model.SearchRepository(ctx, &repo_model.SearchRepoOptions{
 | 
				
			||||||
			ListOptions: db.ListOptions{
 | 
								ListOptions: db.ListOptions{
 | 
				
			||||||
				PageSize: setting.UI.User.RepoPagingNum,
 | 
									PageSize: pagingNum,
 | 
				
			||||||
				Page:     page,
 | 
									Page:     page,
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			Actor:              ctx.Doer,
 | 
								Actor:              ctx.Doer,
 | 
				
			||||||
@@ -258,7 +271,7 @@ func Profile(ctx *context.Context) {
 | 
				
			|||||||
	default:
 | 
						default:
 | 
				
			||||||
		repos, count, err = repo_model.SearchRepository(ctx, &repo_model.SearchRepoOptions{
 | 
							repos, count, err = repo_model.SearchRepository(ctx, &repo_model.SearchRepoOptions{
 | 
				
			||||||
			ListOptions: db.ListOptions{
 | 
								ListOptions: db.ListOptions{
 | 
				
			||||||
				PageSize: setting.UI.User.RepoPagingNum,
 | 
									PageSize: pagingNum,
 | 
				
			||||||
				Page:     page,
 | 
									Page:     page,
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			Actor:              ctx.Doer,
 | 
								Actor:              ctx.Doer,
 | 
				
			||||||
@@ -281,12 +294,15 @@ func Profile(ctx *context.Context) {
 | 
				
			|||||||
	ctx.Data["Repos"] = repos
 | 
						ctx.Data["Repos"] = repos
 | 
				
			||||||
	ctx.Data["Total"] = total
 | 
						ctx.Data["Total"] = total
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pager := context.NewPagination(total, setting.UI.User.RepoPagingNum, page, 5)
 | 
						pager := context.NewPagination(total, pagingNum, page, 5)
 | 
				
			||||||
	pager.SetDefaultParams(ctx)
 | 
						pager.SetDefaultParams(ctx)
 | 
				
			||||||
	pager.AddParam(ctx, "tab", "TabName")
 | 
						pager.AddParam(ctx, "tab", "TabName")
 | 
				
			||||||
	if tab != "followers" && tab != "following" && tab != "activity" && tab != "projects" {
 | 
						if tab != "followers" && tab != "following" && tab != "activity" && tab != "projects" {
 | 
				
			||||||
		pager.AddParam(ctx, "language", "Language")
 | 
							pager.AddParam(ctx, "language", "Language")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if tab == "activity" {
 | 
				
			||||||
 | 
							pager.AddParam(ctx, "date", "Date")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	ctx.Data["Page"] = pager
 | 
						ctx.Data["Page"] = pager
 | 
				
			||||||
	ctx.Data["IsPackageEnabled"] = setting.Packages.Enabled
 | 
						ctx.Data["IsPackageEnabled"] = setting.Packages.Enabled
 | 
				
			||||||
	ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
 | 
						ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -124,3 +124,5 @@
 | 
				
			|||||||
		<div class="ui divider"></div>
 | 
							<div class="ui divider"></div>
 | 
				
			||||||
	</div>
 | 
						</div>
 | 
				
			||||||
{{end}}
 | 
					{{end}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{{template "base/paginate" .}}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -70,6 +70,8 @@ export default {
 | 
				
			|||||||
        params.set('date', clickedDate);
 | 
					        params.set('date', clickedDate);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      params.delete('page');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      const newSearch = params.toString();
 | 
					      const newSearch = params.toString();
 | 
				
			||||||
      window.location.search = newSearch.length ? `?${newSearch}` : '';
 | 
					      window.location.search = newSearch.length ? `?${newSearch}` : '';
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user