diff --git a/site/src/pages/UserSettingsPage/NotificationsPage/NotificationsPage.stories.tsx b/site/src/pages/UserSettingsPage/NotificationsPage/NotificationsPage.stories.tsx index e2ac02e773d2d..72f26f791e960 100644 --- a/site/src/pages/UserSettingsPage/NotificationsPage/NotificationsPage.stories.tsx +++ b/site/src/pages/UserSettingsPage/NotificationsPage/NotificationsPage.stories.tsx @@ -40,7 +40,7 @@ const meta = { }, ], user: MockUserOwner, - permissions: { viewDeploymentConfig: true }, + permissions: { createTemplates: true, createUser: true }, }, decorators: [withGlobalSnackbar, withAuthProvider, withDashboardProvider], } satisfies Meta; @@ -74,7 +74,19 @@ export const ToggleNotification: Story = { export const NonAdmin: Story = { parameters: { - permissions: { viewDeploymentConfig: false }, + permissions: { createTemplates: false, createUser: false }, + }, +}; + +export const TemplateAdmin: Story = { + parameters: { + permissions: { createTemplates: true, createUser: false }, + }, +}; + +export const UserAdmin: Story = { + parameters: { + permissions: { createTemplates: false, createUser: true }, }, }; diff --git a/site/src/pages/UserSettingsPage/NotificationsPage/NotificationsPage.tsx b/site/src/pages/UserSettingsPage/NotificationsPage/NotificationsPage.tsx index 1a89c2240c8d1..4e4b1e6bc61bd 100644 --- a/site/src/pages/UserSettingsPage/NotificationsPage/NotificationsPage.tsx +++ b/site/src/pages/UserSettingsPage/NotificationsPage/NotificationsPage.tsx @@ -28,6 +28,7 @@ import { methodIcons, methodLabels, } from "modules/notifications/utils"; +import type { Permissions } from "modules/permissions"; import { type FC, Fragment } from "react"; import { useEffect } from "react"; import { Helmet } from "react-helmet-async"; @@ -46,15 +47,7 @@ const NotificationsPage: FC = () => { }, { ...systemNotificationTemplates(), - select: (data: NotificationTemplate[]) => { - const groups = selectTemplatesByGroup(data); - return permissions.viewDeploymentConfig - ? groups - : { - // Members only have access to the "Workspace Notifications" group - "Workspace Events": groups["Workspace Events"], - }; - }, + select: (data: NotificationTemplate[]) => selectTemplatesByGroup(data), }, notificationDispatchMethods(), ], @@ -103,6 +96,10 @@ const NotificationsPage: FC = () => { {ready ? ( {Object.entries(templatesByGroup.data).map(([group, templates]) => { + if (!canSeeNotificationGroup(group, permissions)) { + return null; + } + const allDisabled = templates.some((tpl) => { return notificationIsDisabled(disabledPreferences.data, tpl); }); @@ -211,6 +208,22 @@ const NotificationsPage: FC = () => { export default NotificationsPage; +function canSeeNotificationGroup( + group: string, + permissions: Permissions, +): boolean { + switch (group) { + case "Workspace Events": + return true; + case "Template Events": + return permissions.createTemplates; + case "User Events": + return permissions.createUser; + default: + return false; + } +} + function notificationIsDisabled( disabledPreferences: Record, tmpl: NotificationTemplate, diff --git a/site/src/testHelpers/entities.ts b/site/src/testHelpers/entities.ts index 44e729e7f4d4f..f174699616bd4 100644 --- a/site/src/testHelpers/entities.ts +++ b/site/src/testHelpers/entities.ts @@ -4402,6 +4402,32 @@ export const MockNotificationTemplates: TypesGen.NotificationTemplate[] = [ kind: "system", enabled_by_default: true, }, + { + id: "template-event-1", + name: "Template Version Created", + title_template: 'Template version "{{.Labels.version_name}}" created', + body_template: + 'Hi {{.UserName}}\nA new version of template "{{.Labels.template_name}}" has been created.', + actions: + '[{"url": "{{ base_url }}/templates/{{.Labels.template_name}}", "label": "View template"}]', + group: "Template Events", + method: "smtp", + kind: "system", + enabled_by_default: true, + }, + { + id: "template-event-2", + name: "Template Updated", + title_template: 'Template "{{.Labels.template_name}}" updated', + body_template: + 'Hi {{.UserName}}\nTemplate "{{.Labels.template_name}}" has been updated.', + actions: + '[{"url": "{{ base_url }}/templates/{{.Labels.template_name}}", "label": "View template"}]', + group: "Template Events", + method: "webhook", + kind: "system", + enabled_by_default: true, + }, ]; export const MockNotificationMethodsResponse: TypesGen.NotificationMethodsResponse =