PublicDashboards: Disable email sharing inputs when user does not have write permissions (#74046)

This commit is contained in:
Juan Cabanas 2023-09-12 09:32:59 -03:00 committed by GitHub
parent 376f9a75db
commit 07d96eb458
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -5,6 +5,7 @@ import { useWindowSize } from 'react-use';
import { GrafanaTheme2, SelectableValue } from '@grafana/data/src';
import { selectors as e2eSelectors } from '@grafana/e2e-selectors/src';
import { FieldSet } from '@grafana/ui';
import {
Button,
ButtonGroup,
@ -15,6 +16,7 @@ import {
Spinner,
useStyles2,
} from '@grafana/ui/src';
import { contextSrv } from 'app/core/services/context_srv';
import {
useAddRecipientMutation,
useDeleteRecipientMutation,
@ -22,7 +24,8 @@ import {
useReshareAccessToRecipientMutation,
useUpdatePublicDashboardMutation,
} from 'app/features/dashboard/api/publicDashboardApi';
import { useSelector } from 'app/types';
import { isOrgAdmin } from 'app/features/plugins/admin/permissions';
import { AccessControlAction, useSelector } from 'app/types';
import { trackDashboardSharingActionPerType } from '../../analytics';
import { shareDashboardType } from '../../utils';
@ -118,6 +121,8 @@ export const EmailSharingConfiguration = () => {
const [updateShareType] = useUpdatePublicDashboardMutation();
const [addEmail, { isLoading: isAddEmailLoading }] = useAddRecipientMutation();
const hasWritePermissions = contextSrv.hasAccess(AccessControlAction.DashboardsPublicWrite, isOrgAdmin());
const {
register,
setValue,
@ -154,70 +159,72 @@ export const EmailSharingConfiguration = () => {
};
return (
<form data-testid={selectors.Container} className={styles.container} onSubmit={handleSubmit(onSubmit)}>
<Field label="Can view dashboard" className={styles.field}>
<InputControl
name="shareType"
control={control}
render={({ field }) => {
const { ref, ...rest } = field;
return (
<RadioButtonGroup
{...rest}
size={width < 480 ? 'sm' : 'md'}
options={options}
onChange={(shareType: PublicDashboardShareType) => {
trackDashboardSharingActionPerType(
`share_type_${shareType === PublicDashboardShareType.EMAIL ? 'email' : 'public'}`,
shareDashboardType.publicDashboard
);
setValue('shareType', shareType);
onUpdateShareType(shareType);
}}
<form onSubmit={handleSubmit(onSubmit)}>
<FieldSet disabled={!hasWritePermissions} data-testid={selectors.Container} className={styles.container}>
<Field label="Can view dashboard" className={styles.field}>
<InputControl
name="shareType"
control={control}
render={({ field }) => {
const { ref, ...rest } = field;
return (
<RadioButtonGroup
{...rest}
size={width < 480 ? 'sm' : 'md'}
options={options}
onChange={(shareType: PublicDashboardShareType) => {
trackDashboardSharingActionPerType(
`share_type_${shareType === PublicDashboardShareType.EMAIL ? 'email' : 'public'}`,
shareDashboardType.publicDashboard
);
setValue('shareType', shareType);
onUpdateShareType(shareType);
}}
/>
);
}}
/>
</Field>
{watch('shareType') === PublicDashboardShareType.EMAIL && (
<>
<Field
label="Invite"
description="Invite people by email"
error={errors.email?.message}
invalid={!!errors.email?.message || undefined}
className={styles.field}
>
<div className={styles.emailContainer}>
<Input
className={styles.emailInput}
placeholder="email"
autoCapitalize="none"
{...register('email', {
required: 'Email is required',
pattern: { value: validEmailRegex, message: 'Invalid email' },
})}
data-testid={selectors.EmailSharingInput}
/>
<Button
type="submit"
variant="primary"
disabled={isAddEmailLoading}
data-testid={selectors.EmailSharingInviteButton}
>
Invite {isAddEmailLoading && <Spinner />}
</Button>
</div>
</Field>
{!!publicDashboard?.recipients?.length && (
<EmailList
recipients={publicDashboard.recipients}
dashboardUid={dashboard.uid}
publicDashboardUid={publicDashboard.uid}
/>
);
}}
/>
</Field>
{watch('shareType') === PublicDashboardShareType.EMAIL && (
<>
<Field
label="Invite"
description="Invite people by email"
error={errors.email?.message}
invalid={!!errors.email?.message || undefined}
className={styles.field}
>
<div className={styles.emailContainer}>
<Input
className={styles.emailInput}
placeholder="email"
autoCapitalize="none"
{...register('email', {
required: 'Email is required',
pattern: { value: validEmailRegex, message: 'Invalid email' },
})}
data-testid={selectors.EmailSharingInput}
/>
<Button
type="submit"
variant="primary"
disabled={isAddEmailLoading}
data-testid={selectors.EmailSharingInviteButton}
>
Invite {isAddEmailLoading && <Spinner />}
</Button>
</div>
</Field>
{!!publicDashboard?.recipients?.length && (
<EmailList
recipients={publicDashboard.recipients}
dashboardUid={dashboard.uid}
publicDashboardUid={publicDashboard.uid}
/>
)}
</>
)}
)}
</>
)}
</FieldSet>
</form>
);
};