mirror of
https://github.com/grafana/grafana.git
synced 2025-02-11 08:05:43 -06:00
PublicDashboards: Disable email sharing inputs when user does not have write permissions (#74046)
This commit is contained in:
parent
376f9a75db
commit
07d96eb458
@ -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>
|
||||
);
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user