Skip to content

Commit e3e800e

Browse files
committed
Updating dropdowns
1 parent 0279b14 commit e3e800e

File tree

13 files changed

+665
-355
lines changed

13 files changed

+665
-355
lines changed

_playwright-tests/UI/SnapshotRepo.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ test.describe('Snapshot Repositories', () => {
4141
await test.step('Filter by version', async () => {
4242
const versionFilterButton = page.getByRole('button', { name: 'filter version' });
4343
await versionFilterButton.click();
44-
await page.getByRole('menuitem', { name: 'el9' }).locator('label').click();
45-
await page.getByRole('menuitem', { name: 'el8' }).locator('label').click();
44+
await page.getByRole('option', { name: 'el9' }).click();
45+
await page.getByRole('option', { name: 'el8' }).click();
4646
await versionFilterButton.click(); // Close the version filter dropdown
4747
});
4848

_playwright-tests/UI/helpers/helpers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export const snapshotTimestampFormat = 'DD MMM YYYY - HH:mm:ss';
66

77
export const closePopupsIfExist = async (page: Page) => {
88
const locatorsToCheck = [
9-
page.locator('.pf-v5-c-alert.notification-item button'), // This closes all toast pop-ups // TODO: pf5 > pf6
9+
page.locator('.pf-v6-c-alert.notification-item button'), // This closes all toast pop-ups
1010
page.locator(`button[id^="pendo-close-guide-"]`), // This closes the pendo guide pop-up
1111
page.locator(`button[id="truste-consent-button"]`), // This closes the trusted consent pop-up
1212
page.getByLabel('close-notification'), // This closes a one off info notification (May be covered by the toast above, needs recheck.)

_playwright-tests/helpers/loginHelpers.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import path from 'path';
55

66
export const logout = async (page: Page) => {
77
const button = await page.locator(
8-
'div.pf-v5-c-toolbar__item.pf-m-hidden.pf-m-visible-on-lg.pf-v5-u-mr-0 > button', // TODO: pf5 > pf6
8+
'div.pf-v6-c-toolbar__item.pf-m-hidden.pf-m-visible-on-lg.pf-v6-u-mr-0 > button',
99
);
1010

1111
await button.click();
@@ -44,9 +44,9 @@ export const logInWithUsernameAndPassword = async (
4444
await passwordField.fill(password);
4545
await passwordField.press('Enter');
4646

47-
await expect(async () => {
48-
expect(page.url()).toBe(`${process.env.BASE_URL}/insights/content/repositories`);
49-
}).toPass();
47+
await expect(async () =>
48+
expect(page.url()).toBe(`${process.env.BASE_URL}/insights/content/repositories`),
49+
).toPass();
5050
};
5151

5252
export const logInWithUser1 = async (page: Page) =>

deploy/frontend.yaml

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,15 @@ objects:
1818
paths:
1919
- /apps/content-sources
2020
image: ${IMAGE}:${IMAGE_TAG}
21-
navItems:
22-
- appId: "content-sources"
23-
title: "Repositories"
24-
href: "/insights/content/repositories"
25-
product: "Content"
26-
- appId: "content-sources"
27-
title: "Templates"
28-
href: "/insights/content/templates"
29-
product: "Content"
21+
# navItems:
22+
# - appId: "content-sources"
23+
# title: "Repositories"
24+
# href: "/insights/content/repositories"
25+
# product: "Content"
26+
# - appId: "content-sources"
27+
# title: "Templates"
28+
# href: "/insights/content/templates"
29+
# product: "Content"
3030
module:
3131
manifestLocation: "/apps/content-sources/fed-mods.json"
3232
modules:
@@ -49,9 +49,9 @@ parameters:
4949
- name: SELENIUM_MEMORY_REQUEST
5050
value: 2Gi
5151
- name: SELENIUM_JAVA_OPTS
52-
value: ''
52+
value: ""
5353
- name: VNC_GEOMETRY
54-
value: '1920x1080'
54+
value: "1920x1080"
5555
- name: IQE_PARALLEL_ENABLED
5656
value: "false"
5757
- name: SE_NODE_SESSION_TIMEOUT

src/AppEntry.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { Provider as ReduxProvider } from 'react-redux';
44
import * as Redux from 'redux';
55

66
import App from './App';
7+
78
import { ContextProvider } from './middleware/AppContext';
89
import { createStore, restoreStore } from './store';
910

src/Pages/Repositories/AdminFeaturesTable/AdminFeaturesTable.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,15 +205,15 @@ const AdminFeaturesTable = () => {
205205
<FormGroup label='View' fieldId='view'>
206206
<Button
207207
isInline
208-
isActive={isJsonView}
208+
isClicked={isJsonView}
209209
onClick={() => setJsonView(true)}
210210
variant={isJsonView ? 'primary' : 'secondary'}
211211
>
212212
Json
213213
</Button>
214214
<Button
215215
isInline
216-
isActive={!isJsonView}
216+
isClicked={!isJsonView}
217217
onClick={() => setJsonView(false)}
218218
variant={!isJsonView ? 'primary' : 'secondary'}
219219
>

src/Pages/Repositories/AdminTaskTable/components/AdminTaskFilters.tsx

Lines changed: 131 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@ import {
55
Button,
66
Flex,
77
FlexItem,
8-
InputGroup,
8+
MenuToggle,
99
TextInput,
10-
type SelectOptionProps,
10+
Dropdown,
11+
DropdownItem,
12+
DropdownList,
1113
} from '@patternfly/react-core';
1214

13-
import DropdownSelect from 'components/DropdownSelect/DropdownSelect';
1415
import { FilterIcon, SearchIcon } from '@patternfly/react-icons';
1516
import Hide from 'components/Hide/Hide';
1617
import useDebounce from 'Hooks/useDebounce';
@@ -30,9 +31,21 @@ const useStyles = createUseStyles({
3031
clearFilters: {
3132
marginLeft: '16px',
3233
},
34+
menuToggle: {
35+
width: 'fit-content',
36+
maxWidth: 'unset!important', // Remove arbitrary button width
37+
},
38+
filter: {
39+
maxWidth: 'unset!important', // Remove arbitrary button width
40+
width: '-webkit-fill-available',
41+
},
42+
filterDropdown: {
43+
width: 'fit-content',
44+
},
3345
});
3446

3547
const statusValues = ['Running', 'Failed', 'Completed', 'Canceled', 'Pending'];
48+
3649
const typeValues = [
3750
'snapshot',
3851
'delete-repository-snapshots',
@@ -41,13 +54,17 @@ const typeValues = [
4154
'update-template-content',
4255
'update-repository',
4356
];
57+
4458
const filters = ['Account ID', 'Org ID', 'Status', 'Type'];
59+
4560
export type AdminTaskFilters = 'Account ID' | 'Org ID' | 'Status' | 'Type';
4661

4762
const AdminTaskFilters = ({ isLoading, setFilterData, filterData }: Props) => {
4863
const classes = useStyles();
4964
const [filterType, setFilterType] = useState<AdminTaskFilters>('Account ID');
5065
const [accountId, setAccountId] = useState('');
66+
const [typeFilterOpen, setTypeFilterOpen] = useState(false);
67+
const [isActionOpen, setActionOpen] = useState(false);
5168
const [orgId, setOrgId] = useState('');
5269
const [selectedStatuses, setSelectedStatuses] = useState<string[]>([]);
5370
const [selectedTypenames, setSelectedTypenames] = useState<string[]>([]);
@@ -129,94 +146,142 @@ const AdminTaskFilters = ({ isLoading, setFilterData, filterData }: Props) => {
129146
);
130147
case 'Status':
131148
return (
132-
<DropdownSelect
149+
<Dropdown
133150
onSelect={(_, val) =>
134151
setSelectedStatuses((prev) =>
135152
selectedStatuses.includes(val as string)
136153
? prev.filter((item) => item !== (val as string))
137154
: [...prev, val as string],
138155
)
139156
}
140-
menuToggleProps={{
141-
'aria-label': 'filter status',
142-
id: 'statusSelect',
143-
}}
144-
multiSelect
145-
dropDownItems={
146-
statusValues.map((status) => ({
147-
hasCheckbox: true,
148-
value: status,
149-
isSelected: selectedStatuses.includes(status),
150-
children: status,
151-
'data-ouia-component-id': `filter_${status}`,
152-
})) as SelectOptionProps[]
153-
}
154-
isDisabled={isLoading}
155-
menuValue='Filter by status'
156-
ouiaId='filter_status'
157-
/>
157+
toggle={(toggleRef) => (
158+
<MenuToggle
159+
ref={toggleRef}
160+
className={classes.menuToggle}
161+
aria-label='filter status'
162+
id='statusSelect'
163+
ouiaId='filter_status'
164+
onClick={() => setActionOpen((prev) => !prev)}
165+
isDisabled={isLoading}
166+
isExpanded={isActionOpen}
167+
>
168+
Filter by status
169+
</MenuToggle>
170+
)}
171+
onOpenChange={(isOpen) => setActionOpen(isOpen)}
172+
isOpen={isActionOpen}
173+
>
174+
<DropdownList>
175+
{statusValues.map((status) => (
176+
<DropdownItem
177+
key={status}
178+
hasCheckbox
179+
value={status}
180+
isSelected={selectedStatuses.includes(status)}
181+
component='button'
182+
data-ouia-component-id={`filter_${status}`}
183+
>
184+
{status}
185+
</DropdownItem>
186+
))}
187+
</DropdownList>
188+
</Dropdown>
158189
);
159190
case 'Type':
160191
return (
161-
<DropdownSelect
192+
<Dropdown
162193
onSelect={(_, val) =>
163194
setSelectedTypenames((prev) =>
164195
selectedTypenames.includes(val as string)
165196
? prev.filter((item) => item !== (val as string))
166197
: [...prev, val as string],
167198
)
168199
}
169-
menuToggleProps={{
170-
'aria-label': 'filter type',
171-
id: 'typeSelect',
172-
}}
173-
multiSelect
174-
dropDownItems={
175-
typeValues.map((status) => ({
176-
hasCheckbox: true,
177-
value: status,
178-
isSelected: selectedTypenames.includes(status),
179-
children: status,
180-
'data-ouia-component-id': `filter_${status}`,
181-
})) as SelectOptionProps[]
182-
}
183-
isDisabled={isLoading}
184-
menuValue='Filter by type'
185-
ouiaId='filter_type'
186-
/>
200+
toggle={(toggleRef) => (
201+
<MenuToggle
202+
ref={toggleRef}
203+
className={classes.menuToggle}
204+
aria-label='filter type'
205+
id='typeSelect'
206+
ouiaId='filter_type'
207+
onClick={() => setActionOpen((prev) => !prev)}
208+
isDisabled={isLoading}
209+
isExpanded={isActionOpen}
210+
>
211+
Filter by type
212+
</MenuToggle>
213+
)}
214+
onOpenChange={(isOpen) => setActionOpen(isOpen)}
215+
isOpen={isActionOpen}
216+
>
217+
<DropdownList>
218+
{typeValues.map((type) => (
219+
<DropdownItem
220+
key={type}
221+
hasCheckbox
222+
value={type}
223+
isSelected={selectedTypenames.includes(type)}
224+
component='button'
225+
data-ouia-component-id={`filter_${type}`}
226+
>
227+
{type}
228+
</DropdownItem>
229+
))}
230+
</DropdownList>
231+
</Dropdown>
187232
);
188233
default:
189234
return <></>;
190235
}
191-
}, [filterType, isLoading, accountId, orgId, selectedStatuses, selectedTypenames]);
236+
}, [filterType, isLoading, accountId, orgId, selectedStatuses, selectedTypenames, isActionOpen]);
192237

193238
return (
194239
<Flex direction={{ default: 'column' }}>
195-
<Flex>
196-
<FlexItem>
197-
<InputGroup>
198-
<DropdownSelect
199-
onSelect={(_, val) => setFilterType(val as AdminTaskFilters)}
200-
menuToggleProps={{
201-
'aria-label': 'filterSelectionDropdown',
202-
id: 'typeSelect',
203-
icon: <FilterIcon />,
204-
}}
205-
dropDownItems={
206-
filters.map((filter) => ({
207-
value: filter,
208-
isSelected: filterType === filter,
209-
children: filter,
210-
'data-ouia-component-id': `filter_${filter}`,
211-
})) as SelectOptionProps[]
212-
}
213-
isDisabled={isLoading}
214-
menuValue={filterType}
240+
<Flex
241+
direction={{ default: 'row' }}
242+
gap={{ default: 'gap' }}
243+
flexWrap={{ default: 'nowrap' }}
244+
alignItems={{ default: 'alignItemsCenter' }}
245+
>
246+
<Dropdown
247+
onSelect={(_, val) => {
248+
setFilterType(val as AdminTaskFilters);
249+
setTypeFilterOpen(false);
250+
}}
251+
toggle={(toggleRef) => (
252+
<MenuToggle
253+
icon={<FilterIcon />}
254+
ref={toggleRef}
255+
className={classes.filter}
256+
aria-label='filterSelectionDropdown'
257+
id='filterSelectionDropdown'
215258
ouiaId='filter_type'
216-
/>
217-
{Filter}
218-
</InputGroup>
219-
</FlexItem>
259+
onClick={() => setTypeFilterOpen((prev) => !prev)}
260+
isDisabled={isLoading}
261+
isExpanded={typeFilterOpen}
262+
>
263+
{filterType}
264+
</MenuToggle>
265+
)}
266+
onOpenChange={(isOpen) => setTypeFilterOpen(isOpen)}
267+
isOpen={typeFilterOpen}
268+
ouiaId='filter_type'
269+
>
270+
<DropdownList>
271+
{filters.map((filter) => (
272+
<DropdownItem
273+
key={filter}
274+
value={filter}
275+
isSelected={filterType === filter}
276+
component='button'
277+
data-ouia-component-id={`filter_${filter}`}
278+
>
279+
{filter}
280+
</DropdownItem>
281+
))}
282+
</DropdownList>
283+
</Dropdown>
284+
<FlexItem className={classes.filterDropdown}>{Filter}</FlexItem>
220285
</Flex>
221286
<Hide
222287
hide={

0 commit comments

Comments
 (0)