Files
Gitea/templates/repo/settings/collaboration.tmpl
T
bircni ed4a23e893 enhance: inherit team access for all units (#38938)
Admin and write team authorize now grant that mode on every unit,
including units added later, instead of only rows present in
`team_unit`. Granular teams keep `authorize=none` and explicit unit
rows.

Closes the `TEAM-UNIT-PERMISSION` design gap from
https://github.com/go-gitea/gitea/pull/34128.

Maybe also fix #15962 (actually maybe it had been fixed before, the root
cause is out-of-sync "access" table)


## Screenshots

only writing selected:
<img width="1399" height="1007" alt="image"
src="https://github.com/user-attachments/assets/1d1b4c49-a59a-47b6-998f-0464a067395b"
/>


_Created with the help of AI_

---------

Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
2026-08-17 20:30:24 +00:00

128 lines
5.7 KiB
Handlebars

{{template "repo/settings/layout_head" (dict "pageClass" "repository settings collaboration")}}
<div class="repo-setting-content">
<h4 class="ui top attached header">
{{ctx.Locale.Tr "repo.settings.collaboration"}}
</h4>
{{if .Collaborators}}
<div class="ui attached segment">
<div class="flex-divided-list items-with-main">
{{range .Collaborators}}
<div class="item tw-items-center">
<div class="item-leading">
<a href="{{.HomeLink}}">{{ctx.AvatarUtils.Avatar . 32}}</a>
</div>
<div class="item-main">
<div class="item-title">
{{template "shared/user/name" .}}
</div>
</div>
<div class="item-trailing">
<div class="flex-text-block">
{{svg "octicon-shield-lock"}}
<div class="ui dropdown custom access-mode" data-url="{{$.Link}}/access_mode" data-uid="{{.ID}}" data-last-value="{{.Collaboration.Mode}}">
<div class="text">{{if eq .Collaboration.Mode 1}}{{ctx.Locale.Tr "repo.settings.collaboration.read"}}{{else if eq .Collaboration.Mode 2}}{{ctx.Locale.Tr "repo.settings.collaboration.write"}}{{else if eq .Collaboration.Mode 3}}{{ctx.Locale.Tr "repo.settings.collaboration.admin"}}{{else}}{{ctx.Locale.Tr "repo.settings.collaboration.undefined"}}{{end}}</div>
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
<div class="menu">
<div class="item" data-value="3">{{ctx.Locale.Tr "repo.settings.collaboration.admin"}}</div>
<div class="item" data-value="2">{{ctx.Locale.Tr "repo.settings.collaboration.write"}}</div>
<div class="item" data-value="1">{{ctx.Locale.Tr "repo.settings.collaboration.read"}}</div>
</div>
</div>
</div>
<button class="ui red tiny button link-action" data-modal-confirm="#repo-collaborator-delete-modal" data-url="{{$.Link}}/delete?id={{.ID}}">
{{ctx.Locale.Tr "repo.settings.delete_collaborator"}}
</button>
</div>
</div>
{{end}}
</div>
</div>
{{end}}
<div class="ui bottom attached segment">
<form class="ui form flex-text-block" id="repo-collab-form" action="{{.Link}}" method="post">
<div id="search-user-box" class="ui search input">
<input class="prompt" name="collaborator" placeholder="{{ctx.Locale.Tr "search.user_kind"}}" autocomplete="off" autofocus required>
</div>
<button class="ui primary button">{{ctx.Locale.Tr "repo.settings.add_collaborator"}}</button>
</form>
</div>
{{if $.Repository.Owner.IsOrganization}}
<h4 class="ui top attached header">
{{ctx.Locale.Tr "repo.settings.teams"}}
</h4>
{{$allowedToChangeTeams := (or (.Org.RepoAdminChangeTeamAccess) (.Permission.IsOwner))}}
{{if .Teams}}
<div class="ui attached segment">
<div class="flex-divided-list items-with-main">
{{range $t, $team := .Teams}}
<div class="item">
<div class="item-main">
<a class="item-title tw-text-primary" href="{{AppSubUrl}}/org/{{$.OrgName|PathEscape}}/teams/{{.LowerName|PathEscape}}">
{{.Name}}
</a>
<div class="item-body flex-text-block">
{{svg "octicon-shield-lock"}}
{{if ge .AccessMode 4}}
{{ctx.Locale.Tr "repo.settings.collaboration.owner"}}
{{else if ge .AccessMode 3}}
{{ctx.Locale.Tr "repo.settings.collaboration.admin"}}
{{else if eq .AccessMode 2}}
{{ctx.Locale.Tr "repo.settings.collaboration.write"}}
{{else if eq .AccessMode 1}}
{{ctx.Locale.Tr "repo.settings.collaboration.read"}}
{{else}}
{{ctx.Locale.Tr "repo.settings.collaboration.per_unit"}}
{{end}}
</div>
{{if lt .AccessMode 2}}
{{$first := true}}
<div class="item-body" data-tooltip-content="{{ctx.Locale.Tr "repo.settings.change_team_permission_tip"}}">
Units:
{{range $u, $unit := $.Units}}
{{- if and ($.Repo.UnitEnabled ctx $unit.Type) ($team.UnitEnabled ctx $unit.Type) -}}
{{- Iif $first "" ", "}}{{ctx.Locale.Tr $unit.NameKey -}}
{{- $first = false -}}
{{- end -}}
{{end}}
{{if $first}}None{{end}}
</div>
{{end}}
</div>
{{if $allowedToChangeTeams}}
<div class="item-trailing" {{if .IncludesAllRepositories}} data-tooltip-content="{{ctx.Locale.Tr "repo.settings.delete_team_tip"}}"{{end}}>
<button class="ui red tiny button link-action {{if .IncludesAllRepositories}}disabled{{end}}" data-modal-confirm="#repo-collaborator-delete-modal" data-url="{{$.Link}}/team/delete?id={{.ID}}">
{{ctx.Locale.Tr "repo.settings.delete_collaborator"}}
</button>
</div>
{{end}}
</div>
{{end}}
</div>
</div>
{{end}}
<div class="ui bottom attached segment">
{{if $allowedToChangeTeams}}
<form class="ui form flex-text-block" id="repo-collab-team-form" action="{{.Link}}/team" method="post">
<div id="search-team-box" class="ui search input" data-org-name="{{.OrgName}}">
<input class="prompt" name="team" placeholder="{{ctx.Locale.Tr "search.team_kind"}}" autocomplete="off" required>
</div>
<button class="ui primary button">{{ctx.Locale.Tr "repo.settings.add_team"}}</button>
</form>
{{else}}
<div class="item">
{{ctx.Locale.Tr "repo.settings.change_team_access_not_allowed"}}
</div>
{{end}}
</div>
{{end}}
</div>
<div class="ui small modal" id="repo-collaborator-delete-modal">
<div class="header">{{svg "octicon-trash"}} {{ctx.Locale.Tr "repo.settings.collaborator_deletion"}}</div>
<div class="content"><p>{{ctx.Locale.Tr "repo.settings.collaborator_deletion_desc"}}</p></div>
{{template "base/modal_actions_confirm" .}}
</div>
{{template "repo/settings/layout_footer" .}}