Skip to content

Commit dbf73f7

Browse files
harshithaduraiharshithadurai
authored andcommitted
fix(dashboards): add fe check to allow managers and owners to always edit dashboards (#81181)
add frontend check to allow managers and owners to always be able to edit dashboards, and dashboard edit perms. this won't work until #80684 is merged --------- Co-authored-by: harshithadurai <[email protected]>
1 parent eda3f29 commit dbf73f7

File tree

3 files changed

+22
-10
lines changed

3 files changed

+22
-10
lines changed

Diff for: static/app/views/dashboards/detail.spec.tsx

+5-1
Original file line numberDiff line numberDiff line change
@@ -1902,7 +1902,7 @@ describe('Dashboards > Detail', function () {
19021902
}),
19031903
});
19041904

1905-
const currentUser = UserFixture({id: '781629'});
1905+
const currentUser = UserFixture({id: '781629', isSuperuser: false});
19061906
ConfigStore.set('user', currentUser);
19071907

19081908
render(
@@ -1911,6 +1911,7 @@ describe('Dashboards > Detail', function () {
19111911
organization={{
19121912
...initialData.organization,
19131913
features: ['dashboards-edit-access', ...initialData.organization.features],
1914+
access: ['org:read'],
19141915
}}
19151916
params={{orgId: 'org-slug', dashboardId: '1'}}
19161917
router={initialData.router}
@@ -1922,6 +1923,7 @@ describe('Dashboards > Detail', function () {
19221923
router: initialData.router,
19231924
organization: {
19241925
features: ['dashboards-edit-access', ...initialData.organization.features],
1926+
access: ['org:read'],
19251927
},
19261928
}
19271929
);
@@ -1973,6 +1975,7 @@ describe('Dashboards > Detail', function () {
19731975
organization={{
19741976
...initialData.organization,
19751977
features: ['dashboards-edit-access', ...initialData.organization.features],
1978+
access: ['org:read'],
19761979
}}
19771980
params={{orgId: 'org-slug', dashboardId: '1'}}
19781981
router={initialData.router}
@@ -1984,6 +1987,7 @@ describe('Dashboards > Detail', function () {
19841987
router: initialData.router,
19851988
organization: {
19861989
features: ['dashboards-edit-access', ...initialData.organization.features],
1990+
access: ['org:read'],
19871991
},
19881992
}
19891993
);

Diff for: static/app/views/dashboards/detail.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
import {addErrorMessage, addSuccessMessage} from 'sentry/actionCreators/indicator';
1515
import {openWidgetViewerModal} from 'sentry/actionCreators/modal';
1616
import type {Client} from 'sentry/api';
17+
import {hasEveryAccess} from 'sentry/components/acl/access';
1718
import {Breadcrumbs} from 'sentry/components/breadcrumbs';
1819
import HookOrDefault from 'sentry/components/hookOrDefault';
1920
import * as Layout from 'sentry/components/layouts/thirds';
@@ -180,6 +181,7 @@ export function checkUserHasEditAccess(
180181
): boolean {
181182
if (
182183
!organization.features.includes('dashboards-edit-access') ||
184+
hasEveryAccess(['org:write'], {organization}) || // Managers and Owners
183185
!dashboardPermissions ||
184186
dashboardPermissions.isEditableByEveryone ||
185187
dashboardCreator?.id === currentUser.id

Diff for: static/app/views/dashboards/editAccessSelector.tsx

+15-9
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import styled from '@emotion/styled';
33
import debounce from 'lodash/debounce';
44
import isEqual from 'lodash/isEqual';
55

6+
import {hasEveryAccess} from 'sentry/components/acl/access';
67
import AvatarList from 'sentry/components/avatar/avatarList';
78
import TeamAvatar from 'sentry/components/avatar/teamAvatar';
89
import Badge from 'sentry/components/badge/badge';
@@ -20,6 +21,7 @@ import {space} from 'sentry/styles/space';
2021
import type {Team} from 'sentry/types/organization';
2122
import type {User} from 'sentry/types/user';
2223
import {defined} from 'sentry/utils';
24+
import useOrganization from 'sentry/utils/useOrganization';
2325
import {useTeams} from 'sentry/utils/useTeams';
2426
import {useTeamsById} from 'sentry/utils/useTeamsById';
2527
import {useUser} from 'sentry/utils/useUser';
@@ -37,7 +39,11 @@ interface EditAccessSelectorProps {
3739
function EditAccessSelector({dashboard, onChangeEditAccess}: EditAccessSelectorProps) {
3840
const currentUser: User = useUser();
3941
const dashboardCreator: User | undefined = dashboard.createdBy;
40-
const isCurrentUserDashboardOwner = dashboardCreator?.id === currentUser.id;
42+
43+
const organization = useOrganization();
44+
const userCanEditDashboardPermissions =
45+
dashboardCreator?.id === currentUser.id ||
46+
hasEveryAccess(['org:write'], {organization});
4147

4248
// Retrieves teams from the team store, which may contain only a subset of all teams
4349
const {teams: teamsToRender} = useTeamsById();
@@ -143,7 +149,7 @@ function EditAccessSelector({dashboard, onChangeEditAccess}: EditAccessSelectorP
143149
maxVisibleAvatars={1}
144150
avatarSize={25}
145151
renderUsersFirst
146-
tooltipOptions={{disabled: !isCurrentUserDashboardOwner}}
152+
tooltipOptions={{disabled: !userCanEditDashboardPermissions}}
147153
/>
148154
) : (
149155
// Case where we display 1 Creator Avatar + a Badge with no. of teams selected
@@ -153,7 +159,7 @@ function EditAccessSelector({dashboard, onChangeEditAccess}: EditAccessSelectorP
153159
users={Array(selectedOptions.length).fill(dashboardCreator)}
154160
maxVisibleAvatars={1}
155161
avatarSize={25}
156-
tooltipOptions={{disabled: !isCurrentUserDashboardOwner}}
162+
tooltipOptions={{disabled: !userCanEditDashboardPermissions}}
157163
/>
158164
);
159165

@@ -165,16 +171,16 @@ function EditAccessSelector({dashboard, onChangeEditAccess}: EditAccessSelectorP
165171
{
166172
value: '_allUsers',
167173
label: t('All users'),
168-
disabled: !isCurrentUserDashboardOwner,
174+
disabled: !userCanEditDashboardPermissions,
169175
},
170176
],
171177
},
172178
{
173179
value: '_teams',
174180
label: t('Teams'),
175181
options: teamsToRender.map(makeTeamOption),
176-
showToggleAllButton: isCurrentUserDashboardOwner,
177-
disabled: !isCurrentUserDashboardOwner,
182+
showToggleAllButton: userCanEditDashboardPermissions,
183+
disabled: !userCanEditDashboardPermissions,
178184
},
179185
];
180186

@@ -189,7 +195,7 @@ function EditAccessSelector({dashboard, onChangeEditAccess}: EditAccessSelectorP
189195
setSelectedOptions(getSelectedOptions());
190196
}
191197
}}
192-
disabled={!isCurrentUserDashboardOwner}
198+
disabled={!userCanEditDashboardPermissions}
193199
>
194200
{t('Cancel')}
195201
</Button>
@@ -209,7 +215,7 @@ function EditAccessSelector({dashboard, onChangeEditAccess}: EditAccessSelectorP
209215
}}
210216
priority="primary"
211217
disabled={
212-
!isCurrentUserDashboardOwner ||
218+
!userCanEditDashboardPermissions ||
213219
isEqual(getDashboardPermissions(), dashboard.permissions)
214220
}
215221
>
@@ -254,7 +260,7 @@ function EditAccessSelector({dashboard, onChangeEditAccess}: EditAccessSelectorP
254260
return (
255261
<Tooltip
256262
title={t('Only the creator of the dashboard can edit permissions')}
257-
disabled={isCurrentUserDashboardOwner || isMenuOpen}
263+
disabled={userCanEditDashboardPermissions || isMenuOpen}
258264
>
259265
{dropdownMenu}
260266
</Tooltip>

0 commit comments

Comments
 (0)