Skip to content

Commit e37342d

Browse files
zeripath6543silverwindtechknowlogick
authored
Add modals to Organization and Team remove/leave (#16471)
* Add modals to Organization and Team remove/leave Add confirmation modals to Organization and Team remove and leave. Fix #16215 Signed-off-by: Andrew Thornton <art27@cantab.net> * avoid for-in Signed-off-by: Andrew Thornton <art27@cantab.net> * Revert "avoid for-in" This reverts commit 2af9a6f. * Apply suggestions from code review Co-authored-by: silverwind <me@silverwind.io> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: silverwind <me@silverwind.io> Co-authored-by: techknowlogick <techknowlogick@gitea.io>
1 parent 3289ace commit e37342d

19 files changed

+157
-40
lines changed

Diff for: options/locale/locale_en-US.ini

+3
Original file line numberDiff line numberDiff line change
@@ -2176,12 +2176,15 @@ members.member_role = Member Role:
21762176
members.owner = Owner
21772177
members.member = Member
21782178
members.remove = Remove
2179+
members.remove.detail = Remove %[1]s from %[2]s?
21792180
members.leave = Leave
2181+
members.leave.detail = Leave %s?
21802182
members.invite_desc = Add a new member to %s:
21812183
members.invite_now = Invite Now
21822184
21832185
teams.join = Join
21842186
teams.leave = Leave
2187+
teams.leave.detail = Leave %s?
21852188
teams.can_create_org_repo = Create repositories
21862189
teams.can_create_org_repo_helper = Members can create new repositories in organization. Creator will get administrator access to the new repository.
21872190
teams.read_access = Read Access

Diff for: routers/web/org/members.go

+13-6
Original file line numberDiff line numberDiff line change
@@ -99,14 +99,18 @@ func MembersAction(ctx *context.Context) {
9999
err = org.RemoveMember(uid)
100100
if models.IsErrLastOrgOwner(err) {
101101
ctx.Flash.Error(ctx.Tr("form.last_org_owner"))
102-
ctx.Redirect(ctx.Org.OrgLink + "/members")
102+
ctx.JSON(http.StatusOK, map[string]interface{}{
103+
"redirect": ctx.Org.OrgLink + "/members",
104+
})
103105
return
104106
}
105107
case "leave":
106108
err = org.RemoveMember(ctx.User.ID)
107109
if models.IsErrLastOrgOwner(err) {
108110
ctx.Flash.Error(ctx.Tr("form.last_org_owner"))
109-
ctx.Redirect(ctx.Org.OrgLink + "/members")
111+
ctx.JSON(http.StatusOK, map[string]interface{}{
112+
"redirect": ctx.Org.OrgLink + "/members",
113+
})
110114
return
111115
}
112116
}
@@ -120,9 +124,12 @@ func MembersAction(ctx *context.Context) {
120124
return
121125
}
122126

123-
if ctx.Params(":action") != "leave" {
124-
ctx.Redirect(ctx.Org.OrgLink + "/members")
125-
} else {
126-
ctx.Redirect(setting.AppSubURL + "/")
127+
redirect := ctx.Org.OrgLink + "/members"
128+
if ctx.Params(":action") == "leave" {
129+
redirect = setting.AppSubURL + "/"
127130
}
131+
132+
ctx.JSON(http.StatusOK, map[string]interface{}{
133+
"redirect": redirect,
134+
})
128135
}

Diff for: routers/web/org/teams.go

+34
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,47 @@ func TeamsAction(ctx *context.Context) {
6666
err = ctx.Org.Team.AddMember(ctx.User.ID)
6767
case "leave":
6868
err = ctx.Org.Team.RemoveMember(ctx.User.ID)
69+
if err != nil {
70+
if models.IsErrLastOrgOwner(err) {
71+
ctx.Flash.Error(ctx.Tr("form.last_org_owner"))
72+
} else {
73+
log.Error("Action(%s): %v", ctx.Params(":action"), err)
74+
ctx.JSON(http.StatusOK, map[string]interface{}{
75+
"ok": false,
76+
"err": err.Error(),
77+
})
78+
return
79+
}
80+
}
81+
ctx.JSON(http.StatusOK,
82+
map[string]interface{}{
83+
"redirect": ctx.Org.OrgLink + "/teams/",
84+
})
85+
return
6986
case "remove":
7087
if !ctx.Org.IsOwner {
7188
ctx.Error(http.StatusNotFound)
7289
return
7390
}
7491
err = ctx.Org.Team.RemoveMember(uid)
7592
page = "team"
93+
if err != nil {
94+
if models.IsErrLastOrgOwner(err) {
95+
ctx.Flash.Error(ctx.Tr("form.last_org_owner"))
96+
} else {
97+
log.Error("Action(%s): %v", ctx.Params(":action"), err)
98+
ctx.JSON(http.StatusOK, map[string]interface{}{
99+
"ok": false,
100+
"err": err.Error(),
101+
})
102+
return
103+
}
104+
}
105+
ctx.JSON(http.StatusOK,
106+
map[string]interface{}{
107+
"redirect": ctx.Org.OrgLink + "/teams/" + ctx.Org.Team.LowerName,
108+
})
109+
return
76110
case "add":
77111
if !ctx.Org.IsOwner {
78112
ctx.Error(http.StatusNotFound)

Diff for: templates/org/member/members.tmpl

+31-6
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,18 @@
5454
<div class="ui four wide column">
5555
<div class="text right">
5656
{{if eq $.SignedUser.ID .ID}}
57-
<form method="post" action="{{$.OrgLink}}/members/action/leave">
58-
{{$.CsrfTokenHtml}}
59-
<button type="submit" class="ui red small button" name="uid" value="{{.ID}}">{{$.i18n.Tr "org.members.leave"}}</button>
57+
<form>
58+
<button class="ui red small button delete-button" data-modal-id="leave-organization"
59+
data-url="{{$.OrgLink}}/members/action/leave" data-datauid="{{.ID}}"
60+
data-name="{{.DisplayName}}"
61+
data-data-organization-name="{{$.Org.DisplayName}}">{{$.i18n.Tr "org.members.leave"}}</button>
6062
</form>
6163
{{else if $.IsOrganizationOwner}}
62-
<form method="post" action="{{$.OrgLink}}/members/action/remove">
63-
{{$.CsrfTokenHtml}}
64-
<button type="submit" class="ui red small button" name="uid" value="{{.ID}}">{{$.i18n.Tr "org.members.remove"}}</button>
64+
<form>
65+
<button class="ui red small button delete-button" data-modal-id="remove-organization-member"
66+
data-url="{{$.OrgLink}}/members/action/remove" data-datauid="{{.ID}}"
67+
data-name="{{.DisplayName}}"
68+
data-data-organization-name="{{$.Org.DisplayName}}">{{$.i18n.Tr "org.members.remove"}}</button>
6569
</form>
6670
{{end}}
6771
</div>
@@ -73,4 +77,25 @@
7377
{{template "base/paginate" .}}
7478
</div>
7579
</div>
80+
<div class="ui small basic delete modal" id="leave-organization">
81+
<div class="ui icon header">
82+
{{svg "octicon-x" 16 "close inside"}}
83+
{{$.i18n.Tr "org.members.leave"}}
84+
</div>
85+
<div class="content">
86+
<p>{{$.i18n.Tr "org.members.leave.detail" `<span class="dataOrganizationName"></span>` | Safe}}</p>
87+
</div>
88+
{{template "base/delete_modal_actions" .}}
89+
</div>
90+
<div class="ui small basic delete modal" id="remove-organization-member">
91+
<div class="ui icon header">
92+
{{svg "octicon-x" 16 "close inside"}}
93+
{{$.i18n.Tr "org.members.remove"}}
94+
</div>
95+
<div class="content">
96+
<p>{{$.i18n.Tr "org.members.remove.detail" `<span class="name"></span>` `<span class="dataOrganizationName"></span>` | Safe}}</p>
97+
</div>
98+
{{template "base/delete_modal_actions" .}}
99+
</div>
100+
76101
{{template "base/footer" .}}

Diff for: templates/org/team/members.tmpl

+16-4
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,12 @@
2626
<div class="ui bottom attached table segment members">
2727
{{range .Team.Members}}
2828
<div class="item">
29-
{{if $.IsOrganizationOwner}}
30-
<form method="post" action="{{$.OrgLink}}/teams/{{$.Team.LowerName}}/action/remove">
31-
{{$.CsrfTokenHtml}}
32-
<button type="submit" class="ui red small button right" name="uid" value="{{.ID}}">{{$.i18n.Tr "org.members.remove"}}</button>
29+
{{if and $.IsOrganizationOwner (not (eq $.SignedUser.ID .ID))}}
30+
<form>
31+
<button class="ui red button delete-button right" data-modal-id="remove-team-member"
32+
data-url="{{$.OrgLink}}/teams/{{$.Team.LowerName}}/action/remove" data-datauid="{{.ID}}"
33+
data-name="{{.DisplayName}}"
34+
data-data-team-name="{{$.Team.Name}}">{{$.i18n.Tr "org.members.remove"}}</button>
3335
</form>
3436
{{end}}
3537
<a href="{{.HomeLink}}">
@@ -47,4 +49,14 @@
4749
</div>
4850
</div>
4951
</div>
52+
<div class="ui small basic delete modal" id="remove-team-member">
53+
<div class="ui icon header">
54+
{{svg "octicon-x" 16 "close inside"}}
55+
{{$.i18n.Tr "org.members.remove"}}
56+
</div>
57+
<div class="content">
58+
<p>{{$.i18n.Tr "org.members.remove.detail" `<span class="name"></span>` `<span class="dataTeamName"></span>` | Safe}}</p>
59+
</div>
60+
{{template "base/delete_modal_actions" .}}
61+
</div>
5062
{{template "base/footer" .}}

Diff for: templates/org/team/sidebar.tmpl

+14-4
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
<strong>{{.Team.Name}}</strong>
44
<div class="ui right">
55
{{if .Team.IsMember $.SignedUser.ID}}
6-
<form method="post" action="{{.OrgLink}}/teams/{{.Team.LowerName}}/action/leave">
7-
{{$.CsrfTokenHtml}}
8-
<input type="hidden" name="page" value="home"/>
9-
<button type="submit" class="ui red tiny button" name="uid" value="{{$.SignedUser.ID}}">{{$.i18n.Tr "org.teams.leave"}}</button>
6+
<form>
7+
<button class="ui red tiny button delete-button" data-modal-id="leave-team-sidebar"
8+
data-url="{{.OrgLink}}/teams/{{.Team.LowerName}}/action/leave" data-datauid="{{$.SignedUser.ID}}"
9+
data-name="{{.Team.Name}}">{{$.i18n.Tr "org.teams.leave"}}</button>
1010
</form>
1111
{{else if .IsOrganizationOwner}}
1212
<form method="post" action="{{.OrgLink}}/teams/{{.Team.LowerName}}/action/join">
@@ -59,3 +59,13 @@
5959
</div>
6060
{{end}}
6161
</div>
62+
<div class="ui small basic delete modal" id="leave-team-sidebar">
63+
<div class="ui icon header">
64+
{{svg "octicon-x" 16 "close inside"}}
65+
{{$.i18n.Tr "org.teams.leave"}}
66+
</div>
67+
<div class="content">
68+
<p>{{$.i18n.Tr "org.teams.leave.detail" `<span class="name"></span>` | Safe}}</p>
69+
</div>
70+
{{template "base/delete_modal_actions" .}}
71+
</div>

Diff for: templates/org/team/teams.tmpl

+14-3
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@
1717
<a class="text black" href="{{$.OrgLink}}/teams/{{.LowerName}}"><strong>{{.Name}}</strong></a>
1818
<div class="ui right">
1919
{{if .IsMember $.SignedUser.ID}}
20-
<form method="post" action="{{$.OrgLink}}/teams/{{.LowerName}}/action/leave">
21-
{{$.CsrfTokenHtml}}
22-
<button type="submit" class="ui red small button" name="uid" value="{{$.SignedUser.ID}}">{{$.i18n.Tr "org.teams.leave"}}</button>
20+
<form>
21+
<button class="ui red tiny button delete-button" data-modal-id="leave-team"
22+
data-url="{{$.OrgLink}}/teams/{{.LowerName}}/action/leave" data-datauid="{{$.SignedUser.ID}}"
23+
data-name="{{.Name}}">{{$.i18n.Tr "org.teams.leave"}}</button>
2324
</form>
2425
{{else if $.IsOrganizationOwner}}
2526
<form method="post" action="{{$.OrgLink}}/teams/{{.LowerName}}/action/join">
@@ -44,4 +45,14 @@
4445
</div>
4546
</div>
4647
</div>
48+
<div class="ui small basic delete modal" id="leave-team">
49+
<div class="ui icon header">
50+
{{svg "octicon-x" 16 "close inside"}}
51+
{{$.i18n.Tr "org.teams.leave"}}
52+
</div>
53+
<div class="content">
54+
<p>{{$.i18n.Tr "org.teams.leave.detail" `<span class="name"></span>` | Safe}}</p>
55+
</div>
56+
{{template "base/delete_modal_actions" .}}
57+
</div>
4758
{{template "base/footer" .}}

Diff for: templates/user/settings/account.tmpl

+2-2
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@
7272
<div class="item">
7373
{{if not .IsPrimary}}
7474
<div class="right floated content">
75-
<button class="ui red tiny button delete-button" id="delete-email" data-url="{{AppSubUrl}}/user/settings/account/email/delete" data-id="{{.ID}}">
75+
<button class="ui red tiny button delete-button" data-modal-id="delete-email" data-url="{{AppSubUrl}}/user/settings/account/email/delete" data-id="{{.ID}}">
7676
{{$.i18n.Tr "settings.delete_email"}}
7777
</button>
7878
</div>
@@ -185,7 +185,7 @@
185185
<input id="password-confirmation" name="password" type="password" autocomplete="off" required>
186186
</div>
187187
<div class="field">
188-
<div class="ui red button delete-button" id="delete-account" data-type="form" data-form="#delete-form">
188+
<div class="ui red button delete-button" data-modal-id="delete-account" data-type="form" data-form="#delete-form">
189189
{{.i18n.Tr "settings.confirm_delete_account"}}
190190
</div>
191191
<a href="{{AppSubUrl}}/user/forgot_password?email={{.Email}}">{{.i18n.Tr "auth.forgot_password"}}</a>

Diff for: templates/user/settings/applications.tmpl

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
{{range .Tokens}}
1515
<div class="item">
1616
<div class="right floated content">
17-
<button class="ui red tiny button delete-button" id="delete-token" data-url="{{$.Link}}/delete" data-id="{{.ID}}">
17+
<button class="ui red tiny button delete-button" data-modal-id="delete-token" data-url="{{$.Link}}/delete" data-id="{{.ID}}">
1818
{{svg "octicon-trash" 16 "mr-2"}}
1919
{{$.i18n.Tr "settings.delete_token"}}
2020
</button>

Diff for: templates/user/settings/applications_oauth2.tmpl

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
{{svg "octicon-pencil" 16 "mr-2"}}
1414
{{$.i18n.Tr "settings.oauth2_application_edit"}}
1515
</a>
16-
<button class="ui red tiny button delete-button" id="remove-gitea-oauth2-application"
16+
<button class="ui red tiny button delete-button" data-modal-id="remove-gitea-oauth2-application"
1717
data-url="{{AppSubUrl}}/user/settings/applications/oauth2/delete"
1818
data-id="{{$app.ID}}">
1919
{{svg "octicon-trash" 16 "mr-2"}}

Diff for: templates/user/settings/grants_oauth2.tmpl

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
{{range $grant := .Grants}}
1010
<div class="item">
1111
<div class="right floated content">
12-
<button class="ui red tiny button delete-button" id="revoke-gitea-oauth2-grant"
12+
<button class="ui red tiny button delete-button" data-modal-id="revoke-gitea-oauth2-grant"
1313
data-url="{{AppSubUrl}}/user/settings/applications/oauth2/revoke"
1414
data-id="{{$grant.ID}}">
1515
{{$.i18n.Tr "settings.revoke_key"}}

Diff for: templates/user/settings/keys_gpg.tmpl

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
{{range .GPGKeys}}
1313
<div class="item">
1414
<div class="right floated content">
15-
<button class="ui red tiny button delete-button" id="delete-gpg" data-url="{{$.Link}}/delete?type=gpg" data-id="{{.ID}}">
15+
<button class="ui red tiny button delete-button" data-modal-id="delete-gpg" data-url="{{$.Link}}/delete?type=gpg" data-id="{{.ID}}">
1616
{{$.i18n.Tr "settings.delete_key"}}
1717
</button>
1818
{{if and (not .Verified) (ne $.VerifyingID .KeyID)}}

Diff for: templates/user/settings/keys_principal.tmpl

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
{{range .Principals}}
1818
<div class="item">
1919
<div class="right floated content">
20-
<button class="ui red tiny button delete-button" id="delete-principal" data-url="{{$.Link}}/delete?type=principal" data-id="{{.ID}}">
20+
<button class="ui red tiny button delete-button" data-modal-id="delete-principal" data-url="{{$.Link}}/delete?type=principal" data-id="{{.ID}}">
2121
{{$.i18n.Tr "settings.delete_key"}}
2222
</button>
2323
</div>

Diff for: templates/user/settings/keys_ssh.tmpl

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
{{range $index, $key := .Keys}}
1717
<div class="item">
1818
<div class="right floated content">
19-
<button class="ui red tiny button delete-button{{if index $.ExternalKeys $index}} disabled{{end}}" id="delete-ssh" data-url="{{$.Link}}/delete?type=ssh" data-id="{{.ID}}"{{if index $.ExternalKeys $index}} title="{{$.i18n.Tr "settings.ssh_externally_managed"}}"{{end}}>
19+
<button class="ui red tiny button delete-button{{if index $.ExternalKeys $index}} disabled{{end}}" data-modal-id="delete-ssh" data-url="{{$.Link}}/delete?type=ssh" data-id="{{.ID}}"{{if index $.ExternalKeys $index}} title="{{$.i18n.Tr "settings.ssh_externally_managed"}}"{{end}}>
2020
{{$.i18n.Tr "settings.delete_key"}}
2121
</button>
2222
</div>

Diff for: templates/user/settings/security_accountlinks.tmpl

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
{{range $loginSource, $provider := .AccountLinks}}
1111
<div class="item">
1212
<div class="right floated content">
13-
<button class="ui red tiny button delete-button" id="delete-account-link" data-url="{{AppSubUrl}}/user/settings/security/account_link" data-id="{{$loginSource.ID}}">
13+
<button class="ui red tiny button delete-button" data-modal-id="delete-account-link" data-url="{{AppSubUrl}}/user/settings/security/account_link" data-id="{{$loginSource.ID}}">
1414
{{$.i18n.Tr "settings.delete_key"}}
1515
</button>
1616
</div>

Diff for: templates/user/settings/security_openid.tmpl

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
{{range .OpenIDs}}
1010
<div class="item">
1111
<div class="right floated content">
12-
<button class="ui red tiny button delete-button" id="delete-openid" data-url="{{AppSubUrl}}/user/settings/security/openid/delete" data-id="{{.ID}}">
12+
<button class="ui red tiny button delete-button" data-modal-id="delete-openid" data-url="{{AppSubUrl}}/user/settings/security/openid/delete" data-id="{{.ID}}">
1313
{{$.i18n.Tr "settings.delete_key"}}
1414
</button>
1515
</div>

Diff for: templates/user/settings/security_twofa.tmpl

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<form class="ui form" action="{{AppSubUrl}}/user/settings/security/two_factor/disable" method="post" enctype="multipart/form-data" id="disable-form">
1414
{{.CsrfTokenHtml}}
1515
<p>{{.i18n.Tr "settings.twofa_disable_note"}}</p>
16-
<div class="ui red button delete-button" id="disable-twofa" data-type="form" data-form="#disable-form">{{$.i18n.Tr "settings.twofa_disable"}}</div>
16+
<div class="ui red button delete-button" data-modal-id="disable-twofa" data-type="form" data-form="#disable-form">{{$.i18n.Tr "settings.twofa_disable"}}</div>
1717
</form>
1818
{{else}}
1919
<p>{{.i18n.Tr "settings.twofa_not_enrolled"}}</p>

Diff for: templates/user/settings/security_u2f.tmpl

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
{{range .U2FRegistrations}}
99
<div class="item">
1010
<div class="right floated content">
11-
<button class="ui red tiny button delete-button" id="delete-registration" data-url="{{$.Link}}/u2f/delete" data-id="{{.ID}}">
11+
<button class="ui red tiny button delete-button" data-modal-id="delete-registration" data-url="{{$.Link}}/u2f/delete" data-id="{{.ID}}">
1212
{{$.i18n.Tr "settings.delete_key"}}
1313
</button>
1414
</div>

Diff for: web_src/js/index.js

+20-5
Original file line numberDiff line numberDiff line change
@@ -2956,13 +2956,19 @@ $(() => {
29562956

29572957
function showDeletePopup() {
29582958
const $this = $(this);
2959+
const dataArray = $this.data();
29592960
let filter = '';
2960-
if ($this.attr('id')) {
2961-
filter += `#${$this.attr('id')}`;
2961+
if ($this.data('modal-id')) {
2962+
filter += `#${$this.data('modal-id')}`;
29622963
}
29632964

29642965
const dialog = $(`.delete.modal${filter}`);
29652966
dialog.find('.name').text($this.data('name'));
2967+
for (const [key, value] of Object.entries(dataArray)) {
2968+
if (key && key.startsWith('data')) {
2969+
dialog.find(`.${key}`).text(value);
2970+
}
2971+
}
29662972

29672973
dialog.modal({
29682974
closable: false,
@@ -2972,10 +2978,19 @@ function showDeletePopup() {
29722978
return;
29732979
}
29742980

2975-
$.post($this.data('url'), {
2981+
const postData = {
29762982
_csrf: csrf,
2977-
id: $this.data('id')
2978-
}).done((data) => {
2983+
};
2984+
for (const [key, value] of Object.entries(dataArray)) {
2985+
if (key && key.startsWith('data')) {
2986+
postData[key.substr(4)] = value;
2987+
}
2988+
if (key === 'id') {
2989+
postData['id'] = value;
2990+
}
2991+
}
2992+
2993+
$.post($this.data('url'), postData).done((data) => {
29792994
window.location.href = data.redirect;
29802995
});
29812996
}

0 commit comments

Comments
 (0)