From ca2a695a6444e76afee0c9aa88e770053d87f548 Mon Sep 17 00:00:00 2001 From: "Gustavo \"Guz\" L de Mello" Date: Tue, 30 Sep 2025 17:51:35 -0300 Subject: [PATCH] feat(lored,user): add activity feed for user overview tab --- routers/web/user/profile.go | 101 ++++++++++++++-------------- templates/user/overview/header.tmpl | 5 +- templates/user/profile.tmpl | 14 +++- 3 files changed, 64 insertions(+), 56 deletions(-) diff --git a/routers/web/user/profile.go b/routers/web/user/profile.go index d7052914b6..dae2f90f1a 100644 --- a/routers/web/user/profile.go +++ b/routers/web/user/profile.go @@ -1,5 +1,6 @@ // Copyright 2015 The Gogs Authors. All rights reserved. // Copyright 2019 The Gitea Authors. All rights reserved. +// Copyright 2025 Gustavo "Guz" L. de Mello & The Lored.dev Contributors // SPDX-License-Identifier: MIT package user @@ -82,12 +83,8 @@ func prepareUserProfileTabData(ctx *context.Context, profileDbRepo *repo_model.R // if there is a profile readme, default to "overview" page, otherwise, default to "repositories" page // if there is not a profile readme, the overview tab should be treated as the repositories tab tab := ctx.FormString("tab") - if tab == "" || tab == "overview" { - if profileReadme != nil { - tab = "overview" - } else { - tab = "repositories" - } + if tab == "" { + tab = "overview" } ctx.Data["TabName"] = tab ctx.Data["HasUserProfileReadme"] = profileReadme != nil @@ -160,41 +157,6 @@ func prepareUserProfileTabData(ctx *context.Context, profileDbRepo *repo_model.R case "following": ctx.Data["Cards"] = following total = int(numFollowing) - case "activity": - // prepare heatmap data - if setting.Service.EnableUserHeatmap { - data, err := activities_model.GetUserHeatmapDataByUser(ctx, ctx.ContextUser, ctx.Doer) - if err != nil { - ctx.ServerError("GetUserHeatmapDataByUser", err) - return - } - ctx.Data["HeatmapData"] = data - ctx.Data["HeatmapTotalContributions"] = activities_model.GetTotalContributionsInHeatmap(data) - } - - date := ctx.FormString("date") - pagingNum = setting.UI.FeedPagingNum - showPrivate := ctx.IsSigned && (ctx.Doer.IsAdmin || ctx.Doer.ID == ctx.ContextUser.ID) - items, count, err := feed_service.GetFeeds(ctx, activities_model.GetFeedsOptions{ - RequestedUser: ctx.ContextUser, - Actor: ctx.Doer, - IncludePrivate: showPrivate, - OnlyPerformedBy: true, - IncludeDeleted: false, - Date: date, - ListOptions: db.ListOptions{ - PageSize: pagingNum, - Page: page, - }, - }) - if err != nil { - ctx.ServerError("GetFeeds", err) - return - } - ctx.Data["Feeds"] = items - ctx.Data["Date"] = date - - total = int(count) case "stars": ctx.Data["PageIsProfileStarList"] = true ctx.Data["ShowRepoOwnerOnList"] = true @@ -251,19 +213,56 @@ func prepareUserProfileTabData(ctx *context.Context, profileDbRepo *repo_model.R } total = int(count) - case "overview": - if bytes, err := profileReadme.GetBlobContent(setting.UI.MaxDisplayFileSize); err != nil { - log.Error("failed to GetBlobContent: %v", err) - } else { - rctx := renderhelper.NewRenderContextRepoFile(ctx, profileDbRepo, renderhelper.RepoFileOptions{ - CurrentRefPath: path.Join("branch", util.PathEscapeSegments(profileDbRepo.DefaultBranch)), - }) - if profileContent, err := markdown.RenderString(rctx, bytes); err != nil { - log.Error("failed to RenderString: %v", err) + case "overview", "activity": + if profileReadme != nil && tab == "overview" { + if bytes, err := profileReadme.GetBlobContent(setting.UI.MaxDisplayFileSize); err != nil { + log.Error("failed to GetBlobContent: %v", err) } else { - ctx.Data["ProfileReadmeContent"] = profileContent + rctx := renderhelper.NewRenderContextRepoFile(ctx, profileDbRepo, renderhelper.RepoFileOptions{ + CurrentRefPath: path.Join("branch", util.PathEscapeSegments(profileDbRepo.DefaultBranch)), + }) + if profileContent, err := markdown.RenderString(rctx, bytes); err != nil { + log.Error("failed to RenderString: %v", err) + } else { + ctx.Data["ProfileReadmeContent"] = profileContent + } } } + + // prepare heatmap data + if setting.Service.EnableUserHeatmap { + data, err := activities_model.GetUserHeatmapDataByUser(ctx, ctx.ContextUser, ctx.Doer) + if err != nil { + ctx.ServerError("GetUserHeatmapDataByUser", err) + return + } + ctx.Data["HeatmapData"] = data + ctx.Data["HeatmapTotalContributions"] = activities_model.GetTotalContributionsInHeatmap(data) + } + + date := ctx.FormString("date") + pagingNum = setting.UI.FeedPagingNum + showPrivate := ctx.IsSigned && (ctx.Doer.IsAdmin || ctx.Doer.ID == ctx.ContextUser.ID) + items, count, err := feed_service.GetFeeds(ctx, activities_model.GetFeedsOptions{ + RequestedUser: ctx.ContextUser, + Actor: ctx.Doer, + IncludePrivate: showPrivate, + OnlyPerformedBy: true, + IncludeDeleted: false, + Date: date, + ListOptions: db.ListOptions{ + PageSize: pagingNum, + Page: page, + }, + }) + if err != nil { + ctx.ServerError("GetFeeds", err) + return + } + ctx.Data["Feeds"] = items + ctx.Data["Date"] = date + + total = int(count) case "organizations": orgs, count, err := db.FindAndCount[organization.Organization](ctx, organization.FindOrgOptions{ UserID: ctx.ContextUser.ID, diff --git a/templates/user/overview/header.tmpl b/templates/user/overview/header.tmpl index f4664c704d..41c2546ee4 100644 --- a/templates/user/overview/header.tmpl +++ b/templates/user/overview/header.tmpl @@ -1,6 +1,6 @@