Skip to content

Commit fc40927

Browse files
upcoming: [UIE-9730] - Add Beta/New Feature Chip Support for RuleSets and Prefix Lists (#13164)
* Update tests and fix typo * Added changeset: Integrate Prefix List details drawer with Edit and Add Rule drawer * Add tests for handleOpenPrefixListDrawer call on click of View Details * Update ruleset details drawer button text from cancel to close * Change from Link to LinkButton * Update mock protocol * Add beta or new feature chip support for firewall RS & PL * Add tests and do not display chip for edit mode * Added changeset: Add Beta/New feature Chip support for RuleSets and Prefix Lists
1 parent 9147732 commit fc40927

File tree

8 files changed

+146
-12
lines changed

8 files changed

+146
-12
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@linode/manager": Upcoming Features
3+
---
4+
5+
Add Beta/New feature Chip support for RuleSets and Prefix Lists ([#13164](https://github.com/linode/manager/pull/13164))

packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallPrefixListDrawer.tsx

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ import ArrowLeftIcon from 'src/assets/icons/arrow-left.svg';
77
import { CopyTooltip } from 'src/components/CopyTooltip/CopyTooltip';
88
import { DateTimeDisplay } from 'src/components/DateTimeDisplay';
99

10-
import { useIsFirewallRulesetsPrefixlistsEnabled } from '../../shared';
10+
import {
11+
getFeatureChip,
12+
useIsFirewallRulesetsPrefixlistsEnabled,
13+
} from '../../shared';
1114
import {
1215
getPrefixListType,
1316
PREFIXLIST_MARKED_FOR_DELETION_TEXT,
@@ -42,8 +45,11 @@ export const FirewallPrefixListDrawer = React.memo(
4245
const { category, context, onClose, isOpen, selectedPrefixListLabel } =
4346
props;
4447

45-
const { isFirewallRulesetsPrefixlistsFeatureEnabled } =
46-
useIsFirewallRulesetsPrefixlistsEnabled();
48+
const {
49+
isFirewallRulesetsPrefixlistsFeatureEnabled,
50+
isFirewallRulesetsPrefixListsBetaEnabled,
51+
isFirewallRulesetsPrefixListsGAEnabled,
52+
} = useIsFirewallRulesetsPrefixlistsEnabled();
4753
const { classes } = useStyles();
4854

4955
const { data, error, isFetching } = useAllFirewallPrefixListsQuery(
@@ -118,6 +124,13 @@ export const FirewallPrefixListDrawer = React.memo(
118124
onClose={() => onClose({ closeAll: true })}
119125
open={isOpen}
120126
title={titleText}
127+
titleSuffix={
128+
getFeatureChip({
129+
isFirewallRulesetsPrefixlistsFeatureEnabled,
130+
isFirewallRulesetsPrefixListsBetaEnabled,
131+
isFirewallRulesetsPrefixListsGAEnabled,
132+
}) ?? undefined
133+
}
121134
>
122135
<Box mt={2}>
123136
{prefixListDetails && (

packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRuleDrawer.test.tsx

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { capitalize } from '@linode/utilities';
2+
import { within } from '@testing-library/react';
23
import userEvent from '@testing-library/user-event';
34
import * as React from 'react';
45

@@ -272,6 +273,26 @@ describe('ViewRuleSetDetailsDrawer', () => {
272273
);
273274
});
274275

276+
describe('EditRuleDrawer', () => {
277+
it('should not show the Firewall RS & PL feature chip in the title in Edit mode', () => {
278+
spy.mockReturnValue({
279+
isFirewallRulesetsPrefixlistsFeatureEnabled: true,
280+
isFirewallRulesetsPrefixListsBetaEnabled: true,
281+
isFirewallRulesetsPrefixListsLAEnabled: false,
282+
isFirewallRulesetsPrefixListsGAEnabled: false,
283+
});
284+
285+
const { getByTestId } = renderWithTheme(
286+
<FirewallRuleDrawer {...props} mode="edit" />
287+
);
288+
289+
const titleContainer = getByTestId('drawer-title-container');
290+
291+
// The beta (chip) should NOT be in the title area
292+
expect(within(titleContainer).queryByText('beta')).not.toBeInTheDocument();
293+
});
294+
});
295+
275296
describe('utilities', () => {
276297
describe('formValueToIPs', () => {
277298
it('returns a complete set of IPs given a string form value', () => {

packages/manager/src/features/Firewalls/FirewallDetail/Rules/FirewallRuleDrawer.tsx

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ import * as React from 'react';
66

77
import { SelectionCard } from 'src/components/SelectionCard/SelectionCard';
88

9-
import { useIsFirewallRulesetsPrefixlistsEnabled } from '../../shared';
9+
import {
10+
getFeatureChip,
11+
useIsFirewallRulesetsPrefixlistsEnabled,
12+
} from '../../shared';
1013
import {
1114
formValueToIPs,
1215
getInitialFormValues,
@@ -50,8 +53,11 @@ export const FirewallRuleDrawer = React.memo(
5053
ruleToModifyOrView,
5154
} = props;
5255

53-
const { isFirewallRulesetsPrefixlistsFeatureEnabled } =
54-
useIsFirewallRulesetsPrefixlistsEnabled();
56+
const {
57+
isFirewallRulesetsPrefixlistsFeatureEnabled,
58+
isFirewallRulesetsPrefixListsBetaEnabled,
59+
isFirewallRulesetsPrefixListsGAEnabled,
60+
} = useIsFirewallRulesetsPrefixlistsEnabled();
5561

5662
/**
5763
* State for the type of entity being created: either a firewall 'rule' or
@@ -189,8 +195,23 @@ export const FirewallRuleDrawer = React.memo(
189195
return errors;
190196
};
191197

198+
const featureChip =
199+
getFeatureChip({
200+
isFirewallRulesetsPrefixlistsFeatureEnabled,
201+
isFirewallRulesetsPrefixListsBetaEnabled,
202+
isFirewallRulesetsPrefixListsGAEnabled,
203+
}) ?? undefined;
204+
205+
// Do not show the Firewall RS & PL feature chip in Edit mode drawer title
206+
const titleSuffix = mode === 'edit' ? undefined : featureChip;
207+
192208
return (
193-
<Drawer onClose={onClose} open={isOpen} title={title}>
209+
<Drawer
210+
onClose={onClose}
211+
open={isOpen}
212+
title={title}
213+
titleSuffix={titleSuffix}
214+
>
194215
{mode === 'create' && isFirewallRulesetsPrefixlistsFeatureEnabled && (
195216
<Grid container spacing={2}>
196217
{firewallRuleCreateOptions.map((option) => (

packages/manager/src/features/Firewalls/FirewallDetail/Rules/MultiplePrefixListSelect.tsx

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { useAllFirewallPrefixListsQuery } from '@linode/queries';
22
import {
33
Autocomplete,
4-
BetaChip,
54
Box,
65
Button,
76
Checkbox,
@@ -15,7 +14,10 @@ import Grid from '@mui/material/Grid';
1514
import * as React from 'react';
1615
import { makeStyles } from 'tss-react/mui';
1716

18-
import { useIsFirewallRulesetsPrefixlistsEnabled } from 'src/features/Firewalls/shared';
17+
import {
18+
getFeatureChip,
19+
useIsFirewallRulesetsPrefixlistsEnabled,
20+
} from 'src/features/Firewalls/shared';
1921

2022
import { getPrefixListType, groupPriority } from './shared';
2123

@@ -121,7 +123,9 @@ export const MultiplePrefixListSelect = React.memo(
121123
const {
122124
isFirewallRulesetsPrefixlistsFeatureEnabled,
123125
isFirewallRulesetsPrefixListsBetaEnabled,
126+
isFirewallRulesetsPrefixListsGAEnabled,
124127
} = useIsFirewallRulesetsPrefixlistsEnabled();
128+
125129
const { data, isLoading } = useAllFirewallPrefixListsQuery(
126130
isFirewallRulesetsPrefixlistsFeatureEnabled
127131
);
@@ -326,7 +330,11 @@ export const MultiplePrefixListSelect = React.memo(
326330
{pls.length > 0 && (
327331
<Box display="flex">
328332
<InputLabel sx={{ margin: 0 }}>Prefix List</InputLabel>
329-
{isFirewallRulesetsPrefixListsBetaEnabled && <BetaChip />}
333+
{getFeatureChip({
334+
isFirewallRulesetsPrefixlistsFeatureEnabled,
335+
isFirewallRulesetsPrefixListsBetaEnabled,
336+
isFirewallRulesetsPrefixListsGAEnabled,
337+
})}
330338
</Box>
331339
)}
332340
<Stack spacing={1}>

packages/manager/src/features/Firewalls/shared.test.tsx

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
buildPrefixListReferenceMap,
1212
generateAddressesLabel,
1313
generateAddressesLabelV2,
14+
getFeatureChip,
1415
predefinedFirewallFromRule,
1516
useIsFirewallRulesetsPrefixlistsEnabled,
1617
} from './shared';
@@ -442,3 +443,43 @@ describe('useIsFirewallRulesetsPrefixlistsEnabled', () => {
442443
});
443444
});
444445
});
446+
447+
describe('getFeatureChip', () => {
448+
it('returns null if RS & PL feature is disabled', () => {
449+
const result = getFeatureChip({
450+
isFirewallRulesetsPrefixlistsFeatureEnabled: false,
451+
isFirewallRulesetsPrefixListsBetaEnabled: false,
452+
isFirewallRulesetsPrefixListsGAEnabled: false,
453+
});
454+
expect(result).toBeNull();
455+
});
456+
457+
it('returns BetaChip if Firewall RS & PL feature is enabled and Beta is true', () => {
458+
const result = getFeatureChip({
459+
isFirewallRulesetsPrefixlistsFeatureEnabled: true,
460+
isFirewallRulesetsPrefixListsBetaEnabled: true,
461+
isFirewallRulesetsPrefixListsGAEnabled: false,
462+
});
463+
const { getByText } = renderWithTheme(<>{result}</>);
464+
expect(getByText('beta')).toBeVisible();
465+
});
466+
467+
it('returns NewFeatureChip if Firewall RS & PL feature is enabled, GA is true, and Beta is false', () => {
468+
const result = getFeatureChip({
469+
isFirewallRulesetsPrefixlistsFeatureEnabled: true,
470+
isFirewallRulesetsPrefixListsBetaEnabled: false,
471+
isFirewallRulesetsPrefixListsGAEnabled: true,
472+
});
473+
const { getByText } = renderWithTheme(<>{result}</>);
474+
expect(getByText('new')).toBeVisible();
475+
});
476+
477+
it('returns null if feature is enabled but neither Beta nor GA', () => {
478+
const result = getFeatureChip({
479+
isFirewallRulesetsPrefixlistsFeatureEnabled: true,
480+
isFirewallRulesetsPrefixListsBetaEnabled: false,
481+
isFirewallRulesetsPrefixListsGAEnabled: false,
482+
});
483+
expect(result).toBeNull();
484+
});
485+
});

packages/manager/src/features/Firewalls/shared.tsx

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Box, Chip, Tooltip } from '@linode/ui';
1+
import { BetaChip, Box, Chip, NewFeatureChip, Tooltip } from '@linode/ui';
22
import { capitalize, truncateAndJoinList } from '@linode/utilities';
33
import React from 'react';
44

@@ -580,3 +580,24 @@ export const useIsFirewallRulesetsPrefixlistsEnabled = () => {
580580
flags.fwRulesetsPrefixLists?.ga ?? false,
581581
};
582582
};
583+
584+
/**
585+
* Returns the feature chip for Firewall Rulesets & Prefix Lists.
586+
*
587+
* - Shows `<BetaChip />` if the feature is in Beta.
588+
* - Shows `<NewFeatureChip />` if the feature is in GA.
589+
* - Returns `null` if the feature is disabled OR if the feature is enabled but no chip applies.
590+
*/
591+
export const getFeatureChip = ({
592+
isFirewallRulesetsPrefixlistsFeatureEnabled,
593+
isFirewallRulesetsPrefixListsBetaEnabled,
594+
isFirewallRulesetsPrefixListsGAEnabled,
595+
}: Omit<
596+
ReturnType<typeof useIsFirewallRulesetsPrefixlistsEnabled>,
597+
'isFirewallRulesetsPrefixListsLAEnabled'
598+
>) => {
599+
if (!isFirewallRulesetsPrefixlistsFeatureEnabled) return null;
600+
if (isFirewallRulesetsPrefixListsBetaEnabled) return <BetaChip />;
601+
if (isFirewallRulesetsPrefixListsGAEnabled) return <NewFeatureChip />;
602+
return null;
603+
};

packages/ui/src/components/Drawer/Drawer.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,11 @@ export const Drawer = React.forwardRef<HTMLDivElement, DrawerProps>(
154154
>
155155
<Grid>
156156
{isFetching ? null : (
157-
<Box alignItems="center" display="flex">
157+
<Box
158+
alignItems="center"
159+
data-testid="drawer-title-container"
160+
display="flex"
161+
>
158162
<Typography
159163
data-qa-drawer-title={lastTitleRef.current}
160164
data-testid="drawer-title"

0 commit comments

Comments
 (0)