fix: org overview layout - move public members to sidebar, fix stats
Some checks failed
Build and Release / Create Release (push) Has been skipped
Build and Release / Integration Tests (PostgreSQL) (push) Successful in 1m33s
Build and Release / Lint (push) Failing after 1m54s
Build and Release / Build Binaries (amd64, darwin) (push) Has been skipped
Build and Release / Build Binaries (amd64, linux) (push) Has been skipped
Build and Release / Build Binaries (amd64, windows) (push) Has been skipped
Build and Release / Build Binaries (arm64, darwin) (push) Has been skipped
Build and Release / Build Binaries (arm64, linux) (push) Has been skipped
Build and Release / Unit Tests (push) Successful in 2m5s

- Move public members section to right sidebar for non-members
- Members see internal members + teams in sidebar
- Non-members see public members in sidebar
- Fix Activity stats formatting with 2x2 grid in sidebar
- Remove duplicate public members section from main content

🤖 Generated with Claude Code

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-11 02:44:00 +00:00
parent 11b2ee48e9
commit 4580e5c87f
2 changed files with 63 additions and 71 deletions

View File

@@ -103,6 +103,7 @@ func home(ctx *context.Context, viewRepositories bool) {
ctx.Data["Teams"] = ctx.Org.Teams
ctx.Data["DisableNewPullMirrors"] = setting.Mirror.DisableNewPull
ctx.Data["ShowMemberAndTeamTab"] = ctx.Org.IsMember || len(members) > 0
ctx.Data["IsOrganizationMember"] = ctx.Org.IsMember
prepareResult, err := shared_user.RenderUserOrgHeader(ctx)
if err != nil {

View File

@@ -4,7 +4,7 @@
<div class="ui container">
<div class="ui mobile reversed stackable grid">
<div class="ui {{if .ShowMemberAndTeamTab}}eleven wide{{end}} column">
<div class="ui eleven wide column">
{{/* Profile README Section */}}
{{if .ProfileReadmeContent}}
<div id="readme_profile" class="render-content markup" data-profile-view-as-member="{{.IsViewingOrgAsMember}}">{{.ProfileReadmeContent}}</div>
@@ -124,63 +124,6 @@
{{end}}
</div>
{{/* Public Members Section */}}
<div class="ui segment public-members-section tw-mt-4">
<h4 class="ui header tw-flex tw-items-center">
{{svg "octicon-people" 16}} {{ctx.Locale.Tr "org.public_members"}}
{{if .HasMorePublicMembers}}
<a class="tw-ml-auto text grey tw-text-sm" href="{{.OrgLink}}/members">{{ctx.Locale.Tr "org.view_all_members" .TotalPublicMembers}}</a>
{{end}}
</h4>
{{if .PublicMembers}}
<div class="tw-flex tw-flex-wrap tw-gap-4">
{{range .PublicMembers}}
<a href="{{.User.HomeLink}}" title="{{.User.Name}}{{if .User.FullName}} ({{.User.FullName}}){{end}}" class="tw-flex tw-flex-col tw-items-center tw-p-2 tw-no-underline">
{{ctx.AvatarUtils.Avatar .User 48}}
<span class="tw-text-sm tw-mt-1 text primary">{{.User.Name}}</span>
{{if .Role}}<span class="tw-text-xs text grey">{{.Role}}</span>{{end}}
</a>
{{end}}
</div>
{{else}}
<div class="ui placeholder segment tw-text-center">
<div class="ui icon header">
{{svg "octicon-person" 32}}
<div class="sub header">
{{ctx.Locale.Tr "org.no_public_members"}}
</div>
</div>
</div>
{{end}}
</div>
{{/* Organization Stats */}}
{{if .OrgStats}}
<div class="ui segment org-stats-section tw-mt-4">
<h4 class="ui header">
{{svg "octicon-graph" 16}} {{ctx.Locale.Tr "org.activity"}}
</h4>
<div class="ui four mini statistics">
<div class="statistic">
<div class="value">{{.OrgStats.TotalRepos}}</div>
<div class="label">{{ctx.Locale.Tr "org.repositories"}}</div>
</div>
<div class="statistic">
<div class="value">{{.OrgStats.TotalMembers}}</div>
<div class="label">{{ctx.Locale.Tr "org.members"}}</div>
</div>
<div class="statistic">
<div class="value">{{.OrgStats.TotalTeams}}</div>
<div class="label">{{ctx.Locale.Tr "org.teams"}}</div>
</div>
<div class="statistic">
<div class="value">{{.OrgStats.TotalStars}}</div>
<div class="label">{{ctx.Locale.Tr "repo.stars"}}</div>
</div>
</div>
</div>
{{end}}
{{/* Profile README Empty State */}}
{{if and (not .ProfileReadmeContent) .IsOrganizationOwner}}
<div class="ui segment tw-mt-4">
@@ -212,7 +155,6 @@
{{end}}
</div>
{{if .ShowMemberAndTeamTab}}
<div class="ui five wide column">
{{if .CanCreateOrgRepo}}
<div class="tw-flex tw-flex-wrap tw-justify-center tw-gap-x-1 tw-gap-y-2 tw-mb-4">
@@ -224,7 +166,7 @@
<div class="divider"></div>
{{end}}
{{if and .ShowMemberAndTeamTab .ShowOrgProfileReadmeSelector}}
{{if .ShowOrgProfileReadmeSelector}}
<div class="tw-my-4">
<div id="org-home-view-as-dropdown" class="ui dropdown jump">
{{- $viewAsRole := Iif (.IsViewingOrgAsMember) (ctx.Locale.Tr "org.members.member") (ctx.Locale.Tr "settings.visibility.public") -}}
@@ -239,28 +181,56 @@
</a>
</div>
</div>
<div class="tw-my-2">
<div class="tw-my-2 text grey">
{{if .IsViewingOrgAsMember}}{{ctx.Locale.Tr "org.view_as_member_hint"}}{{else}}{{ctx.Locale.Tr "org.view_as_public_hint"}}{{end}}
</div>
</div>
{{end}}
{{if .NumMembers}}
<h4 class="ui top attached header tw-flex">
{{/* Organization Stats - Sidebar Card */}}
{{if .OrgStats}}
<div class="ui top attached header tw-flex">
<strong class="tw-flex-1">{{svg "octicon-graph" 16}} {{ctx.Locale.Tr "org.activity"}}</strong>
</div>
<div class="ui attached segment">
<div class="tw-grid tw-grid-cols-2 tw-gap-4 tw-text-center">
<div>
<div class="tw-text-2xl tw-font-bold">{{.OrgStats.TotalRepos}}</div>
<div class="text grey tw-text-sm">{{ctx.Locale.Tr "org.repositories"}}</div>
</div>
<div>
<div class="tw-text-2xl tw-font-bold">{{.OrgStats.TotalMembers}}</div>
<div class="text grey tw-text-sm">{{ctx.Locale.Tr "org.members"}}</div>
</div>
<div>
<div class="tw-text-2xl tw-font-bold">{{.OrgStats.TotalTeams}}</div>
<div class="text grey tw-text-sm">{{ctx.Locale.Tr "org.teams"}}</div>
</div>
<div>
<div class="tw-text-2xl tw-font-bold">{{.OrgStats.TotalStars}}</div>
<div class="text grey tw-text-sm">{{ctx.Locale.Tr "repo.stars"}}</div>
</div>
</div>
</div>
{{end}}
{{/* Members/Public Members Section */}}
{{if .IsOrganizationMember}}
{{/* Internal view - show all members */}}
{{if .NumMembers}}
<h4 class="ui top attached header tw-flex tw-mt-4">
<strong class="tw-flex-1">{{ctx.Locale.Tr "org.members"}}</strong>
<a class="text grey tw-flex tw-items-center" href="{{.OrgLink}}/members"><span>{{.NumMembers}}</span> {{svg "octicon-chevron-right"}}</a>
</h4>
<div class="ui attached segment members">
{{$isMember := .IsOrganizationMember}}
{{range .Members}}
{{if or $isMember (call $.IsPublicMember .ID)}}
<a href="{{.HomeLink}}" title="{{.Name}}{{if .FullName}} ({{.FullName}}){{end}}">{{ctx.AvatarUtils.Avatar . 48}}</a>
{{end}}
<a href="{{.HomeLink}}" title="{{.Name}}{{if .FullName}} ({{.FullName}}){{end}}">{{ctx.AvatarUtils.Avatar . 48}}</a>
{{end}}
</div>
{{end}}
{{if .IsOrganizationMember}}
<div class="ui top attached header tw-flex">
{{end}}
{{/* Teams - only for members */}}
<div class="ui top attached header tw-flex tw-mt-4">
<strong class="tw-flex-1">{{ctx.Locale.Tr "org.teams"}}</strong>
<a class="text grey tw-flex tw-items-center" href="{{.OrgLink}}/teams"><span>{{.Org.NumTeams}}</span> {{svg "octicon-chevron-right"}}</a>
</div>
@@ -280,9 +250,30 @@
<a class="ui primary small button" href="{{.OrgLink}}/teams/new">{{ctx.Locale.Tr "org.create_new_team"}}</a>
</div>
{{end}}
{{else}}
{{/* Public view - show public members only */}}
{{if .PublicMembers}}
<h4 class="ui top attached header tw-flex tw-mt-4">
<strong class="tw-flex-1">{{ctx.Locale.Tr "org.public_members"}}</strong>
{{if .HasMorePublicMembers}}
<a class="text grey tw-flex tw-items-center" href="{{.OrgLink}}/members"><span>{{.TotalPublicMembers}}</span> {{svg "octicon-chevron-right"}}</a>
{{end}}
</h4>
<div class="ui attached segment members">
{{range .PublicMembers}}
<a href="{{.User.HomeLink}}" title="{{.User.Name}}{{if .User.FullName}} ({{.User.FullName}}){{end}}">{{ctx.AvatarUtils.Avatar .User 48}}</a>
{{end}}
</div>
{{else}}
<h4 class="ui top attached header tw-flex tw-mt-4">
<strong class="tw-flex-1">{{ctx.Locale.Tr "org.public_members"}}</strong>
</h4>
<div class="ui attached segment">
<p class="text grey tw-text-center">{{ctx.Locale.Tr "org.no_public_members"}}</p>
</div>
{{end}}
{{end}}
</div>
{{end}}
</div>
</div>
</div>