From e9aaa4b0ef019d5362041e32c58b19eb91da9f70 Mon Sep 17 00:00:00 2001 From: Adam Setch Date: Mon, 24 Feb 2025 17:18:19 -0500 Subject: [PATCH 1/4] feat: add state filter Signed-off-by: Adam Setch --- src/renderer/__mocks__/state-mocks.ts | 1 + .../components/filters/StateFilter.test.tsx | 108 ++ .../components/filters/StateFilter.tsx | 68 + .../__snapshots__/StateFilter.test.tsx.snap | 1586 +++++++++++++++++ src/renderer/context/App.tsx | 1 + src/renderer/routes/Filters.tsx | 2 + .../__snapshots__/Filters.test.tsx.snap | 266 +++ src/renderer/types.ts | 5 +- .../notifications/filters/filter.test.ts | 23 +- .../utils/notifications/filters/filter.ts | 8 + .../utils/notifications/filters/state.ts | 89 + 11 files changed, 2155 insertions(+), 2 deletions(-) create mode 100644 src/renderer/components/filters/StateFilter.test.tsx create mode 100644 src/renderer/components/filters/StateFilter.tsx create mode 100644 src/renderer/components/filters/__snapshots__/StateFilter.test.tsx.snap create mode 100644 src/renderer/utils/notifications/filters/state.ts diff --git a/src/renderer/__mocks__/state-mocks.ts b/src/renderer/__mocks__/state-mocks.ts index 7905387d8..4a879e857 100644 --- a/src/renderer/__mocks__/state-mocks.ts +++ b/src/renderer/__mocks__/state-mocks.ts @@ -109,6 +109,7 @@ const mockFilters: FilterSettingsState = { filterUserTypes: [], filterIncludeHandles: [], filterExcludeHandles: [], + filterStates: [], filterReasons: [], }; diff --git a/src/renderer/components/filters/StateFilter.test.tsx b/src/renderer/components/filters/StateFilter.test.tsx new file mode 100644 index 000000000..9525a0d52 --- /dev/null +++ b/src/renderer/components/filters/StateFilter.test.tsx @@ -0,0 +1,108 @@ +import { act, fireEvent, render, screen } from '@testing-library/react'; +import { MemoryRouter } from 'react-router-dom'; +import { mockSettings } from '../../__mocks__/state-mocks'; +import { AppContext } from '../../context/App'; +import type { SettingsState } from '../../types'; +import { StateFilter } from './StateFilter'; + +describe('renderer/components/filters/StateFilter.tsx', () => { + const updateFilter = jest.fn(); + + it('should render itself & its children - detailed notifications enabled', () => { + const tree = render( + + + + + , + ); + + expect(tree).toMatchSnapshot(); + }); + + it('should render itself & its children - detailed notifications disabled', () => { + const tree = render( + + + + + , + ); + + expect(tree).toMatchSnapshot(); + }); + + it('should be able to toggle user type - none already set', async () => { + await act(async () => { + render( + + + + + , + ); + }); + + fireEvent.click(screen.getByLabelText('Open')); + + expect(updateFilter).toHaveBeenCalledWith('filterStates', 'open', true); + + expect( + screen.getByLabelText('Open').parentNode.parentNode, + ).toMatchSnapshot(); + }); + + it('should be able to toggle user type - some filters already set', async () => { + await act(async () => { + render( + + + + + , + ); + }); + + fireEvent.click(screen.getByLabelText('Closed')); + + expect(updateFilter).toHaveBeenCalledWith('filterStates', 'closed', true); + + expect( + screen.getByLabelText('Closed').parentNode.parentNode, + ).toMatchSnapshot(); + }); +}); diff --git a/src/renderer/components/filters/StateFilter.tsx b/src/renderer/components/filters/StateFilter.tsx new file mode 100644 index 000000000..5d6fce034 --- /dev/null +++ b/src/renderer/components/filters/StateFilter.tsx @@ -0,0 +1,68 @@ +import { type FC, useContext } from 'react'; + +import { BellIcon } from '@primer/octicons-react'; +import { Stack, Text } from '@primer/react'; + +import { AppContext } from '../../context/App'; +import type { FilterStateType } from '../../types'; +import { + FILTERS_STATE_TYPES, + getStateDetails, + getStateFilterCount, + isStateFilterSet, +} from '../../utils/notifications/filters/state'; +import { Checkbox } from '../fields/Checkbox'; +import { Tooltip } from '../fields/Tooltip'; +import { Title } from '../primitives/Title'; + +export const StateFilter: FC = () => { + const { updateFilter, settings, notifications } = useContext(AppContext); + + return ( +
+ + State + + Filter notifications by state. + + ⚠️ This filter requires the{' '} + Detailed Notifications setting to be + enabled. + + + } + /> + + + + {Object.keys(FILTERS_STATE_TYPES).map((stateType: FilterStateType) => { + const stateDetails = getStateDetails(stateType); + const stateTitle = stateDetails.title; + const stateDescription = stateDetails.description; + const isStateChecked = isStateFilterSet(settings, stateType); + const stateCount = getStateFilterCount(notifications, stateType); + + return ( + + updateFilter('filterStates', stateType, evt.target.checked) + } + tooltip={ + stateDescription ? {stateDescription} : null + } + disabled={!settings.detailedNotifications} + counter={stateCount} + /> + ); + })} + +
+ ); +}; diff --git a/src/renderer/components/filters/__snapshots__/StateFilter.test.tsx.snap b/src/renderer/components/filters/__snapshots__/StateFilter.test.tsx.snap new file mode 100644 index 000000000..2cd37a159 --- /dev/null +++ b/src/renderer/components/filters/__snapshots__/StateFilter.test.tsx.snap @@ -0,0 +1,1586 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`renderer/components/filters/StateFilter.tsx should be able to toggle user type - none already set 1`] = ` +
+
+ + +
+
+ + +
+ +
+
+
+ + +
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+`; + +exports[`renderer/components/filters/StateFilter.tsx should be able to toggle user type - some filters already set 1`] = ` +
+
+ + +
+
+ + +
+ +
+
+
+ + +
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+`; + +exports[`renderer/components/filters/StateFilter.tsx should render itself & its children - detailed notifications disabled 1`] = ` +{ + "asFragment": [Function], + "baseElement": +
+
+
+ +
+
+ +

+ State +

+
+
+
+
+ +
+
+
+
+ + +
+
+ + +
+ +
+
+
+ + +
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+
+
+ , + "container":
+
+
+ +
+
+ +

+ State +

+
+
+
+
+ +
+
+
+
+ + +
+
+ + +
+ +
+
+
+ + +
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+
+
, + "debug": [Function], + "findAllByAltText": [Function], + "findAllByDisplayValue": [Function], + "findAllByLabelText": [Function], + "findAllByPlaceholderText": [Function], + "findAllByRole": [Function], + "findAllByTestId": [Function], + "findAllByText": [Function], + "findAllByTitle": [Function], + "findByAltText": [Function], + "findByDisplayValue": [Function], + "findByLabelText": [Function], + "findByPlaceholderText": [Function], + "findByRole": [Function], + "findByTestId": [Function], + "findByText": [Function], + "findByTitle": [Function], + "getAllByAltText": [Function], + "getAllByDisplayValue": [Function], + "getAllByLabelText": [Function], + "getAllByPlaceholderText": [Function], + "getAllByRole": [Function], + "getAllByTestId": [Function], + "getAllByText": [Function], + "getAllByTitle": [Function], + "getByAltText": [Function], + "getByDisplayValue": [Function], + "getByLabelText": [Function], + "getByPlaceholderText": [Function], + "getByRole": [Function], + "getByTestId": [Function], + "getByText": [Function], + "getByTitle": [Function], + "queryAllByAltText": [Function], + "queryAllByDisplayValue": [Function], + "queryAllByLabelText": [Function], + "queryAllByPlaceholderText": [Function], + "queryAllByRole": [Function], + "queryAllByTestId": [Function], + "queryAllByText": [Function], + "queryAllByTitle": [Function], + "queryByAltText": [Function], + "queryByDisplayValue": [Function], + "queryByLabelText": [Function], + "queryByPlaceholderText": [Function], + "queryByRole": [Function], + "queryByTestId": [Function], + "queryByText": [Function], + "queryByTitle": [Function], + "rerender": [Function], + "unmount": [Function], +} +`; + +exports[`renderer/components/filters/StateFilter.tsx should render itself & its children - detailed notifications enabled 1`] = ` +{ + "asFragment": [Function], + "baseElement": +
+
+
+ +
+
+ +

+ State +

+
+
+
+
+ +
+
+
+
+ + +
+
+ + +
+ +
+
+
+ + +
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+
+
+ , + "container":
+
+
+ +
+
+ +

+ State +

+
+
+
+
+ +
+
+
+
+ + +
+
+ + +
+ +
+
+
+ + +
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+
+
, + "debug": [Function], + "findAllByAltText": [Function], + "findAllByDisplayValue": [Function], + "findAllByLabelText": [Function], + "findAllByPlaceholderText": [Function], + "findAllByRole": [Function], + "findAllByTestId": [Function], + "findAllByText": [Function], + "findAllByTitle": [Function], + "findByAltText": [Function], + "findByDisplayValue": [Function], + "findByLabelText": [Function], + "findByPlaceholderText": [Function], + "findByRole": [Function], + "findByTestId": [Function], + "findByText": [Function], + "findByTitle": [Function], + "getAllByAltText": [Function], + "getAllByDisplayValue": [Function], + "getAllByLabelText": [Function], + "getAllByPlaceholderText": [Function], + "getAllByRole": [Function], + "getAllByTestId": [Function], + "getAllByText": [Function], + "getAllByTitle": [Function], + "getByAltText": [Function], + "getByDisplayValue": [Function], + "getByLabelText": [Function], + "getByPlaceholderText": [Function], + "getByRole": [Function], + "getByTestId": [Function], + "getByText": [Function], + "getByTitle": [Function], + "queryAllByAltText": [Function], + "queryAllByDisplayValue": [Function], + "queryAllByLabelText": [Function], + "queryAllByPlaceholderText": [Function], + "queryAllByRole": [Function], + "queryAllByTestId": [Function], + "queryAllByText": [Function], + "queryAllByTitle": [Function], + "queryByAltText": [Function], + "queryByDisplayValue": [Function], + "queryByLabelText": [Function], + "queryByPlaceholderText": [Function], + "queryByRole": [Function], + "queryByTestId": [Function], + "queryByText": [Function], + "queryByTitle": [Function], + "rerender": [Function], + "unmount": [Function], +} +`; diff --git a/src/renderer/context/App.tsx b/src/renderer/context/App.tsx index ff7b80816..8e0199276 100644 --- a/src/renderer/context/App.tsx +++ b/src/renderer/context/App.tsx @@ -101,6 +101,7 @@ export const defaultFilters: FilterSettingsState = { filterUserTypes: [], filterIncludeHandles: [], filterExcludeHandles: [], + filterStates: [], filterReasons: [], }; diff --git a/src/renderer/routes/Filters.tsx b/src/renderer/routes/Filters.tsx index 9f8836a90..b6906c9aa 100644 --- a/src/renderer/routes/Filters.tsx +++ b/src/renderer/routes/Filters.tsx @@ -4,6 +4,7 @@ import { FilterIcon, FilterRemoveIcon } from '@primer/octicons-react'; import { Button, Stack, Tooltip } from '@primer/react'; import { ReasonFilter } from '../components/filters/ReasonFilter'; +import { StateFilter } from '../components/filters/StateFilter'; import { UserHandleFilter } from '../components/filters/UserHandleFilter'; import { UserTypeFilter } from '../components/filters/UserTypeFilter'; import { Contents } from '../components/layout/Contents'; @@ -25,6 +26,7 @@ export const FiltersRoute: FC = () => { + diff --git a/src/renderer/routes/__snapshots__/Filters.test.tsx.snap b/src/renderer/routes/__snapshots__/Filters.test.tsx.snap index d89afcdbb..dd4639376 100644 --- a/src/renderer/routes/__snapshots__/Filters.test.tsx.snap +++ b/src/renderer/routes/__snapshots__/Filters.test.tsx.snap @@ -498,6 +498,272 @@ exports[`renderer/routes/Filters.tsx General should render itself & its children +
+
+ +
+
+ +

+ State +

+
+
+
+
+ +
+
+
+
+ + +
+
+ + +
+ +
+
+
+ + +
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+
; label: string; }; + +export type FilterStateType = 'open' | 'closed' | 'merged' | 'draft' | 'other'; diff --git a/src/renderer/utils/notifications/filters/filter.test.ts b/src/renderer/utils/notifications/filters/filter.test.ts index 4c2c3d58a..f85cc866f 100644 --- a/src/renderer/utils/notifications/filters/filter.test.ts +++ b/src/renderer/utils/notifications/filters/filter.test.ts @@ -33,13 +33,14 @@ describe('renderer/utils/notifications/filters/filter.ts', () => { }), ]; - it('should ignore user type or handle filters if detailed notifications not enabled', async () => { + it('should ignore user type, handle filters and state filters if detailed notifications not enabled', async () => { const result = filterNotifications(mockNotifications, { ...mockSettings, detailedNotifications: false, filterUserTypes: ['Bot'], filterIncludeHandles: ['github-user'], filterExcludeHandles: ['github-bot'], + filterStates: ['merged'], }); expect(result.length).toBe(2); @@ -79,6 +80,18 @@ describe('renderer/utils/notifications/filters/filter.ts', () => { expect(result).toEqual([mockNotifications[0]]); }); + it('should filter notifications by state when provided', async () => { + mockNotifications[0].subject.state = 'open'; + mockNotifications[1].subject.state = 'closed'; + const result = filterNotifications(mockNotifications, { + ...mockSettings, + filterStates: ['closed'], + }); + + expect(result.length).toBe(1); + expect(result).toEqual([mockNotifications[1]]); + }); + it('should filter notifications by reasons when provided', async () => { mockNotifications[0].reason = 'subscribed'; mockNotifications[1].reason = 'manual'; @@ -121,6 +134,14 @@ describe('renderer/utils/notifications/filters/filter.ts', () => { expect(hasAnyFiltersSet(settings)).toBe(true); }); + it('non-default state filters', () => { + const settings = { + ...defaultSettings, + filterStates: ['draft', 'merged'], + } as SettingsState; + expect(hasAnyFiltersSet(settings)).toBe(true); + }); + it('non-default reason filters', () => { const settings = { ...defaultSettings, diff --git a/src/renderer/utils/notifications/filters/filter.ts b/src/renderer/utils/notifications/filters/filter.ts index a14698709..a6078ca3a 100644 --- a/src/renderer/utils/notifications/filters/filter.ts +++ b/src/renderer/utils/notifications/filters/filter.ts @@ -6,6 +6,7 @@ import { hasIncludeHandleFilters, } from './handles'; import { filterNotificationByReason, hasReasonFilters } from './reason'; +import { filterNotificationByState, hasStateFilters } from './state'; import { filterNotificationByUserType, hasUserTypeFilters } from './userType'; export function filterNotifications( @@ -31,6 +32,12 @@ export function filterNotifications( filterNotificationByHandle(notification, handle), ); } + + if (hasStateFilters(settings)) { + return settings.filterStates.some((state) => + filterNotificationByState(notification, state), + ); + } } if (hasReasonFilters(settings)) { @@ -48,6 +55,7 @@ export function hasAnyFiltersSet(settings: SettingsState): boolean { hasUserTypeFilters(settings) || hasIncludeHandleFilters(settings) || hasExcludeHandleFilters(settings) || + hasStateFilters(settings) || hasReasonFilters(settings) ); } diff --git a/src/renderer/utils/notifications/filters/state.ts b/src/renderer/utils/notifications/filters/state.ts new file mode 100644 index 000000000..38f8f1044 --- /dev/null +++ b/src/renderer/utils/notifications/filters/state.ts @@ -0,0 +1,89 @@ +import type { + AccountNotifications, + FilterStateType, + SettingsState, + TypeDetails, +} from '../../../types'; +import type { Notification } from '../../../typesGitHub'; + +export const FILTERS_STATE_TYPES: Record = { + draft: { + title: 'Draft', + }, + open: { + title: 'Open', + description: 'Open or reopened', + }, + merged: { + title: 'Merged', + }, + closed: { + title: 'Closed', + description: 'Closed, completed or not planned', + }, + other: { + title: 'Other', + description: 'Catch all for any other notification states', + }, +} as Partial> as Record< + FilterStateType, + TypeDetails +>; + +export function getStateDetails(stateType: FilterStateType): TypeDetails { + return FILTERS_STATE_TYPES[stateType]; +} + +export function hasStateFilters(settings: SettingsState) { + return settings.filterStates.length > 0; +} + +export function isStateFilterSet( + settings: SettingsState, + stateType: FilterStateType, +) { + return settings.filterStates.includes(stateType); +} + +export function getStateFilterCount( + notifications: AccountNotifications[], + stateType: FilterStateType, +) { + return notifications.reduce( + (sum, account) => + sum + + account.notifications.filter((n) => + filterNotificationByState(n, stateType), + ).length, + 0, + ); +} + +export function filterNotificationByState( + notification: Notification, + stateType: FilterStateType, +): boolean { + if (stateType === 'open') { + return ['open', 'reopened'].includes(notification.subject?.state); + } + + if (stateType === 'closed') { + return ['closed', 'completed', 'not_planned'].includes( + notification.subject?.state, + ); + } + + if (stateType === 'merged' || stateType === 'draft') { + return notification.subject?.state === stateType; + } + + return ![ + 'open', + 'reopened', + 'closed', + 'completed', + 'not_planned', + 'merged', + 'draft', + ].includes(notification.subject?.state); +} From e5120ebf7b79d8ed1f7e55bb6de49a9f9568acec Mon Sep 17 00:00:00 2001 From: Adam Setch Date: Mon, 24 Feb 2025 18:56:43 -0500 Subject: [PATCH 2/4] update coverage Signed-off-by: Adam Setch --- .../__snapshots__/AllRead.test.tsx.snap | 24 +- .../__snapshots__/Oops.test.tsx.snap | 24 +- .../__snapshots__/Sidebar.test.tsx.snap | 108 ++-- .../AvatarWithFallback.test.tsx.snap | 52 +- .../__snapshots__/Checkbox.test.tsx.snap | 40 +- .../__snapshots__/RadioGroup.test.tsx.snap | 24 +- .../components/filters/ReasonFilter.test.tsx | 3 +- .../components/filters/StateFilter.test.tsx | 73 +-- .../filters/UserHandleFilter.test.tsx | 77 +-- .../filters/UserTypeFilter.test.tsx | 73 +-- .../__snapshots__/ReasonFilter.test.tsx.snap | 192 ++++--- .../__snapshots__/StateFilter.test.tsx.snap | 212 ++++++-- .../UserHandleFilter.test.tsx.snap | 148 +++--- .../UserTypeFilter.test.tsx.snap | 132 +++-- .../__snapshots__/Centered.test.tsx.snap | 8 +- .../__snapshots__/EmojiSplash.test.tsx.snap | 24 +- .../__snapshots__/MetricGroup.test.tsx.snap | 400 +++++++------- .../__snapshots__/MetricPill.test.tsx.snap | 20 +- .../AccountNotifications.test.tsx.snap | 490 ++++++++--------- .../NotificationFooter.test.tsx.snap | 236 ++++----- .../NotificationHeader.test.tsx.snap | 48 +- .../NotificationRow.test.tsx.snap | 280 +++++----- .../RepositoryNotifications.test.tsx.snap | 172 +++--- .../__snapshots__/Footer.test.tsx.snap | 8 +- .../__snapshots__/Header.test.tsx.snap | 16 +- .../__snapshots__/HoverButton.test.tsx.snap | 4 +- .../__snapshots__/HoverGroup.test.tsx.snap | 4 +- .../__snapshots__/Title.test.tsx.snap | 8 +- .../SettingsFooter.test.tsx.snap | 8 +- .../__snapshots__/Accounts.test.tsx.snap | 498 +++++++++--------- .../__snapshots__/Filters.test.tsx.snap | 124 ++--- .../routes/__snapshots__/Login.test.tsx.snap | 64 +-- .../LoginWithOAuthApp.test.tsx.snap | 172 +++--- ...LoginWithPersonalAccessToken.test.tsx.snap | 160 +++--- .../__snapshots__/Settings.test.tsx.snap | 120 ++--- .../utils/notifications/filters/state.test.ts | 61 +++ .../utils/notifications/filters/state.ts | 42 +- .../notifications/filters/userType.test.ts | 33 +- .../utils/notifications/filters/userType.ts | 7 +- 39 files changed, 2257 insertions(+), 1932 deletions(-) create mode 100644 src/renderer/utils/notifications/filters/state.test.ts diff --git a/src/renderer/components/__snapshots__/AllRead.test.tsx.snap b/src/renderer/components/__snapshots__/AllRead.test.tsx.snap index 851456cc8..89d98c835 100644 --- a/src/renderer/components/__snapshots__/AllRead.test.tsx.snap +++ b/src/renderer/components/__snapshots__/AllRead.test.tsx.snap @@ -6,7 +6,7 @@ exports[`renderer/components/AllRead.tsx should render itself & its children - n "baseElement":
, "container":
, "container":
, "container":
, "container":
@@ -669,7 +697,7 @@ exports[`renderer/components/filters/StateFilter.tsx should render itself & its id="filter-state" >

State @@ -741,7 +769,7 @@ exports[`renderer/components/filters/StateFilter.tsx should render itself & its

+ + +  ( + 1 + ) +
+ + +  ( + 3 + ) + @@ -990,7 +1046,7 @@ exports[`renderer/components/filters/StateFilter.tsx should render itself & its } `; -exports[`renderer/components/filters/StateFilter.tsx should render itself & its children - detailed notifications enabled 1`] = ` +exports[`renderer/components/filters/StateFilter.tsx should render itself & its children with detailed notifications enabled 1`] = ` { "asFragment": [Function], "baseElement": @@ -1000,7 +1056,7 @@ exports[`renderer/components/filters/StateFilter.tsx should render itself & its id="filter-state" >

State @@ -1072,7 +1128,7 @@ exports[`renderer/components/filters/StateFilter.tsx should render itself & its

+ + +  ( + 1 + ) +
+ + +  ( + 3 + ) + @@ -1269,7 +1353,7 @@ exports[`renderer/components/filters/StateFilter.tsx should render itself & its id="filter-state" >

State @@ -1341,7 +1425,7 @@ exports[`renderer/components/filters/StateFilter.tsx should render itself & its

+ + +  ( + 1 + ) +
+ + +  ( + 3 + ) + diff --git a/src/renderer/components/filters/__snapshots__/UserHandleFilter.test.tsx.snap b/src/renderer/components/filters/__snapshots__/UserHandleFilter.test.tsx.snap index ffba23026..ccaecefef 100644 --- a/src/renderer/components/filters/__snapshots__/UserHandleFilter.test.tsx.snap +++ b/src/renderer/components/filters/__snapshots__/UserHandleFilter.test.tsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`renderer/components/filters/UserHandleFilter.tsx should render itself & its children - detailed notifications disabled 1`] = ` +exports[`renderer/components/filters/UserHandleFilter.tsx should render itself & its children with detailed notifications disabled 1`] = ` { "asFragment": [Function], "baseElement": @@ -10,7 +10,7 @@ exports[`renderer/components/filters/UserHandleFilter.tsx should render itself & id="filter-user-handles" >

Handles @@ -82,7 +82,7 @@ exports[`renderer/components/filters/UserHandleFilter.tsx should render itself &

Include:
Exclude:

Handles @@ -312,7 +312,7 @@ exports[`renderer/components/filters/UserHandleFilter.tsx should render itself &

Include:
Exclude:
@@ -527,7 +527,7 @@ exports[`renderer/components/filters/UserHandleFilter.tsx should render itself & id="filter-user-handles" >

Handles @@ -599,7 +599,7 @@ exports[`renderer/components/filters/UserHandleFilter.tsx should render itself &

Include:
Exclude:

Handles @@ -827,7 +827,7 @@ exports[`renderer/components/filters/UserHandleFilter.tsx should render itself &

Include:
Exclude:
`; -exports[`renderer/components/filters/UserTypeFilter.tsx should render itself & its children - detailed notifications disabled 1`] = ` +exports[`renderer/components/filters/UserTypeFilter.tsx should render itself & its children with detailed notifications disabled 1`] = ` { "asFragment": [Function], "baseElement": @@ -215,7 +215,7 @@ exports[`renderer/components/filters/UserTypeFilter.tsx should render itself & i id="filter-user-types" >

User Type @@ -287,7 +287,7 @@ exports[`renderer/components/filters/UserTypeFilter.tsx should render itself & i

User + + +  ( + 1 + ) +

User Type @@ -469,7 +483,7 @@ exports[`renderer/components/filters/UserTypeFilter.tsx should render itself & i

User + + +  ( + 1 + ) +
@@ -636,7 +664,7 @@ exports[`renderer/components/filters/UserTypeFilter.tsx should render itself & i id="filter-user-types" >

User Type @@ -708,7 +736,7 @@ exports[`renderer/components/filters/UserTypeFilter.tsx should render itself & i

User + + +  ( + 1 + ) +

User Type @@ -887,7 +929,7 @@ exports[`renderer/components/filters/UserTypeFilter.tsx should render itself & i

User + + +  ( + 1 + ) +
, "container":
, "container":
, "container":
, "container":
2
1
1
1 @@ -167,12 +167,12 @@ exports[`renderer/components/metrics/MetricGroup.tsx comment pills should render class="Box-sc-g0xbh4-0 flex gap-1" >
2
1
1
1 @@ -382,12 +382,12 @@ exports[`renderer/components/metrics/MetricGroup.tsx comment pills should render class="Box-sc-g0xbh4-0 flex gap-1" >
2
1
1
2 @@ -540,12 +540,12 @@ exports[`renderer/components/metrics/MetricGroup.tsx comment pills should render class="Box-sc-g0xbh4-0 flex gap-1" >
2
1
1
2 @@ -755,12 +755,12 @@ exports[`renderer/components/metrics/MetricGroup.tsx comment pills should render class="Box-sc-g0xbh4-0 flex gap-1" >
2
1
1 @@ -876,12 +876,12 @@ exports[`renderer/components/metrics/MetricGroup.tsx comment pills should render class="Box-sc-g0xbh4-0 flex gap-1" >
2
1
1 @@ -1054,12 +1054,12 @@ exports[`renderer/components/metrics/MetricGroup.tsx label pills should render l class="Box-sc-g0xbh4-0 flex gap-1" >
2
1
1
2
2 @@ -1250,12 +1250,12 @@ exports[`renderer/components/metrics/MetricGroup.tsx label pills should render l class="Box-sc-g0xbh4-0 flex gap-1" >
2
1
1
2
2 @@ -1503,12 +1503,12 @@ exports[`renderer/components/metrics/MetricGroup.tsx linked issue pills should r class="Box-sc-g0xbh4-0 flex gap-1" >
2
1
1 @@ -1624,12 +1624,12 @@ exports[`renderer/components/metrics/MetricGroup.tsx linked issue pills should r class="Box-sc-g0xbh4-0 flex gap-1" >
2
1
1 @@ -1802,12 +1802,12 @@ exports[`renderer/components/metrics/MetricGroup.tsx linked issue pills should r class="Box-sc-g0xbh4-0 flex gap-1" >
1
1
1 @@ -1923,12 +1923,12 @@ exports[`renderer/components/metrics/MetricGroup.tsx linked issue pills should r class="Box-sc-g0xbh4-0 flex gap-1" >
1
1
1 @@ -2101,12 +2101,12 @@ exports[`renderer/components/metrics/MetricGroup.tsx milestone pills should rend class="Box-sc-g0xbh4-0 flex gap-1" >
2
1
1
2
2
2
1
1
2
2
2
1
1
2
2
2
1
1
2
2
1 @@ -46,12 +46,12 @@ exports[`renderer/components/metrics/MetricPill.tsx should render with metric 1` , "container":
1 @@ -143,12 +143,12 @@ exports[`renderer/components/metrics/MetricPill.tsx should render without metric "baseElement":
, "container":