Phase 3: Organization Public Profile Page - Pinned repositories with groups - Public members display with roles - API endpoints for pinned repos and groups Phase 4: Gitea Pages Foundation - Landing page templates (simple, docs, product, portfolio) - Custom domain support with verification - YAML configuration parser (.gitea/landing.yaml) - Repository settings UI for pages Phase 5: Enhanced Wiki System with V2 API - Full CRUD operations via v2 API - Full-text search with WikiIndex table - Link graph visualization - Wiki health metrics (orphaned, dead links, outdated) - Designed for external AI plugin integration - Developer guide for .NET integration 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
202 lines
8.1 KiB
Handlebars
202 lines
8.1 KiB
Handlebars
{{template "base/head" .}}
|
|
<div role="main" aria-label="{{.Title}}" class="page-content organization profile">
|
|
{{template "org/header" .}}
|
|
|
|
<div class="ui container">
|
|
<div class="ui mobile reversed stackable grid">
|
|
<div class="ui {{if .ShowMemberAndTeamTab}}eleven wide{{end}} column">
|
|
{{if .ProfileReadmeContent}}
|
|
<div id="readme_profile" class="render-content markup" data-profile-view-as-member="{{.IsViewingOrgAsMember}}">{{.ProfileReadmeContent}}</div>
|
|
{{end}}
|
|
|
|
{{/* Pinned Repositories Section */}}
|
|
{{if and .PageIsViewOverview .HasPinnedRepos}}
|
|
<div class="ui segment pinned-repos-section">
|
|
<h4 class="ui header">
|
|
{{svg "octicon-pin" 16}} {{ctx.Locale.Tr "org.pinned_repos"}}
|
|
</h4>
|
|
|
|
{{/* Ungrouped pinned repos */}}
|
|
{{if .UngroupedPinned}}
|
|
<div class="ui three stackable cards pinned-repos">
|
|
{{range .UngroupedPinned}}
|
|
{{if .Repo}}
|
|
<a class="ui card" href="{{.Repo.Link}}">
|
|
<div class="content">
|
|
<div class="header text truncate">
|
|
{{if .Repo.IsPrivate}}{{svg "octicon-lock" 16}}{{else if .Repo.IsFork}}{{svg "octicon-repo-forked" 16}}{{else if .Repo.IsMirror}}{{svg "octicon-mirror" 16}}{{else}}{{svg "octicon-repo" 16}}{{end}}
|
|
{{.Repo.Name}}
|
|
</div>
|
|
{{if .Repo.Description}}
|
|
<div class="description text truncate">{{.Repo.Description}}</div>
|
|
{{end}}
|
|
</div>
|
|
<div class="extra content">
|
|
{{if .Repo.PrimaryLanguage}}
|
|
<span class="tw-mr-2">
|
|
<span class="repo-language-color" style="background-color: {{.Repo.PrimaryLanguage.Color}}"></span>
|
|
{{.Repo.PrimaryLanguage.Language}}
|
|
</span>
|
|
{{end}}
|
|
{{if .Repo.NumStars}}
|
|
<span class="tw-mr-2">{{svg "octicon-star" 14}} {{.Repo.NumStars}}</span>
|
|
{{end}}
|
|
{{if .Repo.NumForks}}
|
|
<span>{{svg "octicon-repo-forked" 14}} {{.Repo.NumForks}}</span>
|
|
{{end}}
|
|
</div>
|
|
</a>
|
|
{{end}}
|
|
{{end}}
|
|
</div>
|
|
{{end}}
|
|
|
|
{{/* Grouped pinned repos */}}
|
|
{{range .PinnedGroups}}
|
|
{{$groupRepos := index $.PinnedByGroup .ID}}
|
|
{{if $groupRepos}}
|
|
<div class="pinned-group tw-mt-4">
|
|
<h5 class="ui header tw-mb-2">
|
|
{{svg "octicon-chevron-down" 14}} {{.Name}}
|
|
</h5>
|
|
<div class="ui three stackable cards pinned-repos">
|
|
{{range $groupRepos}}
|
|
{{if .Repo}}
|
|
<a class="ui card" href="{{.Repo.Link}}">
|
|
<div class="content">
|
|
<div class="header text truncate">
|
|
{{if .Repo.IsPrivate}}{{svg "octicon-lock" 16}}{{else if .Repo.IsFork}}{{svg "octicon-repo-forked" 16}}{{else if .Repo.IsMirror}}{{svg "octicon-mirror" 16}}{{else}}{{svg "octicon-repo" 16}}{{end}}
|
|
{{.Repo.Name}}
|
|
</div>
|
|
{{if .Repo.Description}}
|
|
<div class="description text truncate">{{.Repo.Description}}</div>
|
|
{{end}}
|
|
</div>
|
|
<div class="extra content">
|
|
{{if .Repo.PrimaryLanguage}}
|
|
<span class="tw-mr-2">
|
|
<span class="repo-language-color" style="background-color: {{.Repo.PrimaryLanguage.Color}}"></span>
|
|
{{.Repo.PrimaryLanguage.Language}}
|
|
</span>
|
|
{{end}}
|
|
{{if .Repo.NumStars}}
|
|
<span class="tw-mr-2">{{svg "octicon-star" 14}} {{.Repo.NumStars}}</span>
|
|
{{end}}
|
|
{{if .Repo.NumForks}}
|
|
<span>{{svg "octicon-repo-forked" 14}} {{.Repo.NumForks}}</span>
|
|
{{end}}
|
|
</div>
|
|
</a>
|
|
{{end}}
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
{{end}}
|
|
{{end}}
|
|
</div>
|
|
{{end}}
|
|
|
|
{{/* Public Members Section (on overview) */}}
|
|
{{if and .PageIsViewOverview .PublicMembers}}
|
|
<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>
|
|
<div class="tw-flex tw-flex-wrap tw-gap-2">
|
|
{{range .PublicMembers}}
|
|
<a href="{{.User.HomeLink}}" title="{{.User.Name}} ({{.Role}})" class="tw-flex tw-flex-col tw-items-center tw-p-2">
|
|
{{ctx.AvatarUtils.Avatar .User 48}}
|
|
<span class="tw-text-sm tw-mt-1">{{.User.Name}}</span>
|
|
<span class="tw-text-xs text grey">{{.Role}}</span>
|
|
</a>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
{{end}}
|
|
|
|
{{if .PageIsViewRepositories}}
|
|
{{template "shared/repo/search" .}}
|
|
{{template "shared/repo/list" .}}
|
|
{{template "base/paginate" .}}
|
|
{{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">
|
|
<a class="ui primary button tw-grow" href="{{AppSubUrl}}/repo/create?org={{.Org.ID}}">{{ctx.Locale.Tr "new_repo"}}</a>
|
|
{{if not .DisableNewPullMirrors}}
|
|
<a class="ui primary button tw-grow" href="{{AppSubUrl}}/repo/migrate?org={{.Org.ID}}&mirror=1">{{ctx.Locale.Tr "new_migrate"}}</a>
|
|
{{end}}
|
|
</div>
|
|
<div class="divider"></div>
|
|
{{end}}
|
|
|
|
{{if and .ShowMemberAndTeamTab .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") -}}
|
|
<span class="text">{{svg "octicon-eye"}} {{ctx.Locale.Tr "org.view_as_role" $viewAsRole}}</span>
|
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
|
<div class="menu">
|
|
<a href="?view_as=public" class="item {{if not .IsViewingOrgAsMember}}selected{{end}}">
|
|
{{svg "octicon-check" 14 (Iif (not .IsViewingOrgAsMember) "" "tw-invisible")}} {{ctx.Locale.Tr "settings.visibility.public"}}
|
|
</a>
|
|
<a href="?view_as=member" class="item {{if .IsViewingOrgAsMember}}selected{{end}}">
|
|
{{svg "octicon-check" 14 (Iif .IsViewingOrgAsMember "" "tw-invisible")}} {{ctx.Locale.Tr "org.members.member"}}
|
|
</a>
|
|
</div>
|
|
</div>
|
|
<div class="tw-my-2">
|
|
{{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">
|
|
<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}}
|
|
{{end}}
|
|
</div>
|
|
{{end}}
|
|
{{if .IsOrganizationMember}}
|
|
<div class="ui top attached header tw-flex">
|
|
<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>
|
|
<div class="ui attached table segment teams">
|
|
{{range .Teams}}
|
|
<div class="item">
|
|
<a href="{{$.OrgLink}}/teams/{{.LowerName | PathEscape}}"><strong class="team-name">{{.Name}}</strong></a>
|
|
<p class="text grey">
|
|
<a class="muted" href="{{$.OrgLink}}/teams/{{.LowerName | PathEscape}}"><strong>{{.NumMembers}}</strong> {{ctx.Locale.Tr "org.lower_members"}}</a> ·
|
|
<a class="muted" href="{{$.OrgLink}}/teams/{{.LowerName | PathEscape}}/repositories"><strong>{{.NumRepos}}</strong> {{ctx.Locale.Tr "org.lower_repositories"}}</a>
|
|
</p>
|
|
</div>
|
|
{{end}}
|
|
</div>
|
|
{{if .IsOrganizationOwner}}
|
|
<div class="ui bottom attached segment">
|
|
<a class="ui primary small button" href="{{.OrgLink}}/teams/new">{{ctx.Locale.Tr "org.create_new_team"}}</a>
|
|
</div>
|
|
{{end}}
|
|
{{end}}
|
|
</div>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{{template "base/footer" .}}
|