Skip to content

Commit 10838b9

Browse files
committed
fix(OperatingSystemFilter): RHINENG-2912 - Fix OS inventory filter conversion
1 parent ea62d3d commit 10838b9

File tree

3 files changed

+133
-91
lines changed

3 files changed

+133
-91
lines changed

src/SmartComponents/Systems/Systems.js

Lines changed: 110 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ import messages from '../../Messages';
88
import Header from '../../PresentationalComponents/Header/Header';
99
import ErrorHandler from '../../PresentationalComponents/Snippets/ErrorHandler';
1010
import { defaultReducers } from '../../store';
11-
import { changeSystemsParams, clearInventoryReducer,
12-
changeSystemsMetadata, changeTags, systemSelectAction } from '../../store/Actions/Actions';
11+
import {
12+
changeSystemsParams, clearInventoryReducer,
13+
changeSystemsMetadata, changeTags, systemSelectAction
14+
} from '../../store/Actions/Actions';
1315
import { inventoryEntitiesReducer, modifyInventory } from '../../store/Reducers/InventoryEntitiesReducer';
1416
import {
1517
exportSystemsCSV, exportSystemsJSON, fetchSystems
@@ -18,7 +20,8 @@ import { DEFAULT_PATCH_TITLE, systemsListDefaultFilters } from '../../Utilities/
1820
import {
1921
arrayFromObj, decodeQueryparams, persistantParams, filterSelectedActiveSystemIDs
2022
} from '../../Utilities/Helpers';
21-
import { useBulkSelectConfig, useGetEntities, useOnExport,
23+
import {
24+
useBulkSelectConfig, useGetEntities, useOnExport,
2225
useRemoveFilter
2326
} from '../../Utilities/Hooks';
2427
import { intl } from '../../Utilities/IntlProvider';
@@ -41,7 +44,7 @@ const Systems = () => {
4144
const inventory = useRef(null);
4245

4346
const chrome = useChrome();
44-
useEffect(()=>{
47+
useEffect(() => {
4548
chrome.updateDocumentTitle(`${intl.formatMessage(messages.titlesSystems)}${DEFAULT_PATCH_TITLE}`);
4649
}, [chrome, intl]);
4750

@@ -82,7 +85,23 @@ const Systems = () => {
8285
]);
8386

8487
const { systemProfile, selectedTags,
85-
filter, search, page, perPage, sort } = queryParams;
88+
filter: queryParamsFilter, search, page, perPage, sort
89+
} = queryParams;
90+
const { os: operatingSystemFilter, ...filter } = queryParamsFilter || {};
91+
const osFilter = operatingSystemFilter && [{
92+
osFilter: operatingSystemFilter.reduce((osFilter, os) => {
93+
const [osName, osVersion] = os.split(' ');
94+
const [major] = osVersion.split('.');
95+
96+
return {
97+
...osFilter,
98+
[`${osName}-${major}`]: {
99+
...osFilter[`${osName}-${major}`] || {},
100+
[`${osName}-${major}-${osVersion}`]: true
101+
}
102+
};
103+
}, {})
104+
}];
86105

87106
React.useEffect(() => {
88107
apply(decodedParams);
@@ -156,89 +175,93 @@ const Systems = () => {
156175
<React.Fragment>
157176
<Header title={intl.formatMessage(messages.titlesPatchSystems)} headerOUIA={'systems'} />
158177
{(hasError || metadata?.has_systems === false)
159-
&& <ErrorHandler code={code} metadata={metadata}/>
160-
|| <React.Fragment>
161-
<SystemsStatusReport apply={apply} queryParams={queryParams} />
162-
<PatchSetWrapper patchSetState={patchSetState} setPatchSetState={setPatchSetState} />
163-
{isRemediationOpen && <RemediationModalCmp /> || null}
164-
<Main>
165-
<InventoryTable
166-
ref={inventory}
167-
isFullView
168-
autoRefresh
169-
initialLoading
170-
hideFilters={{ all: true, tags: false, hostGroupFilter: false, operatingSystem: false }}
171-
columns={(defaultColumns) => systemsColumnsMerger(defaultColumns, systemsListColumns)}
172-
showTags
173-
customFilters={{
174-
patchParams: {
175-
search,
176-
filter,
177-
systemProfile,
178-
selectedTags
179-
}
180-
}}
181-
paginationProps={{
182-
isDisabled: totalItems === 0
183-
}}
184-
onLoad={({ mergeWithEntities }) => {
185-
store.replaceReducer(combineReducers({
186-
...defaultReducers,
187-
...mergeWithEntities(
188-
inventoryEntitiesReducer(systemsListColumns(), modifyInventory),
189-
persistantParams({ page, perPage, sort, search }, decodedParams)
190-
)
191-
}));
192-
}}
193-
getEntities={getEntities}
194-
tableProps={{
195-
actionResolver: (row) =>
196-
systemsRowActions(
197-
showRemediationModal,
198-
openAssignSystemsModal,
199-
openUnassignSystemsModal,
200-
row,
201-
hasTemplateAccess
202-
),
203-
canSelectAll: false,
204-
variant: TableVariant.compact,
205-
className: 'patchCompactInventory',
206-
isStickyHeader: true
207-
}}
208-
bulkSelect={bulkSelectConfig}
209-
exportConfig={{
210-
isDisabled: totalItems === 0,
211-
onSelect: onExport
212-
}}
213-
actionsConfig={{
214-
actions: [
215-
<AsyncRemediationButton
216-
key='remediate-multiple-systems'
217-
remediationProvider={remediationDataProvider}
218-
isDisabled={
219-
arrayFromObj(selectedRows).length === 0 || isRemediationLoading
220-
}
221-
isLoading={isRemediationLoading}
222-
/>,
223-
{
224-
key: 'assign-multiple-systems',
225-
label: intl.formatMessage(messages.titlesTemplateAssign),
226-
onClick: () => openAssignSystemsModal(selectedRows),
227-
props: { isDisabled: !hasTemplateAccess || selectedCount === 0 }
228-
},
229-
{
230-
key: 'remove-multiple-systems',
231-
label: intl.formatMessage(messages.titlesTemplateRemoveMultipleButton),
232-
onClick: () => openUnassignSystemsModal(filterSelectedActiveSystemIDs(selectedRows)),
233-
props: { isDisabled: !hasTemplateAccess || selectedCount === 0 }
178+
&& <ErrorHandler code={code} metadata={metadata} />
179+
|| <React.Fragment>
180+
<SystemsStatusReport apply={apply} queryParams={queryParams} />
181+
<PatchSetWrapper patchSetState={patchSetState} setPatchSetState={setPatchSetState} />
182+
{isRemediationOpen && <RemediationModalCmp /> || null}
183+
<Main>
184+
<InventoryTable
185+
ref={inventory}
186+
isFullView
187+
autoRefresh
188+
initialLoading
189+
hideFilters={{ all: true, tags: false, hostGroupFilter: false, operatingSystem: false }}
190+
columns={(defaultColumns) => systemsColumnsMerger(defaultColumns, systemsListColumns)}
191+
showTags
192+
customFilters={{
193+
...operatingSystemFilter ? {
194+
filters: [...(osFilter || [])]
195+
} : {},
196+
patchParams: {
197+
search,
198+
filter,
199+
systemProfile,
200+
selectedTags
201+
234202
}
235-
]
236-
}}
237-
filterConfig={filterConfig}
238-
activeFiltersConfig={activeFiltersConfig}
239-
/>
240-
</Main>
241-
</React.Fragment>}
203+
}}
204+
paginationProps={{
205+
isDisabled: totalItems === 0
206+
}}
207+
onLoad={({ mergeWithEntities }) => {
208+
store.replaceReducer(combineReducers({
209+
...defaultReducers,
210+
...mergeWithEntities(
211+
inventoryEntitiesReducer(systemsListColumns(), modifyInventory),
212+
persistantParams({ page, perPage, sort, search }, decodedParams)
213+
)
214+
}));
215+
}}
216+
getEntities={getEntities}
217+
tableProps={{
218+
actionResolver: (row) =>
219+
systemsRowActions(
220+
showRemediationModal,
221+
openAssignSystemsModal,
222+
openUnassignSystemsModal,
223+
row,
224+
hasTemplateAccess
225+
),
226+
canSelectAll: false,
227+
variant: TableVariant.compact,
228+
className: 'patchCompactInventory',
229+
isStickyHeader: true
230+
}}
231+
bulkSelect={bulkSelectConfig}
232+
exportConfig={{
233+
isDisabled: totalItems === 0,
234+
onSelect: onExport
235+
}}
236+
actionsConfig={{
237+
actions: [
238+
<AsyncRemediationButton
239+
key='remediate-multiple-systems'
240+
remediationProvider={remediationDataProvider}
241+
isDisabled={
242+
arrayFromObj(selectedRows).length === 0 || isRemediationLoading
243+
}
244+
isLoading={isRemediationLoading}
245+
/>,
246+
{
247+
key: 'assign-multiple-systems',
248+
label: intl.formatMessage(messages.titlesTemplateAssign),
249+
onClick: () => openAssignSystemsModal(selectedRows),
250+
props: { isDisabled: !hasTemplateAccess || selectedCount === 0 }
251+
},
252+
{
253+
key: 'remove-multiple-systems',
254+
label: intl.formatMessage(messages.titlesTemplateRemoveMultipleButton),
255+
onClick: () => openUnassignSystemsModal(filterSelectedActiveSystemIDs(selectedRows)),
256+
props: { isDisabled: !hasTemplateAccess || selectedCount === 0 }
257+
}
258+
]
259+
}}
260+
filterConfig={filterConfig}
261+
activeFiltersConfig={activeFiltersConfig}
262+
/>
263+
</Main>
264+
</React.Fragment>}
242265
</React.Fragment>
243266
);
244267
};

src/Utilities/Helpers.js

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -396,15 +396,29 @@ export const buildFilterChips = (filters, search, searchChipLabel = 'Search') =>
396396
return filterConfig;
397397
};
398398

399+
export const buildOsFilter = (osFilter = {}) => {
400+
const osVersions = Object.entries(osFilter).reduce((acc, [, osGroupValues]) => {
401+
return [
402+
...acc,
403+
...Object.entries(osGroupValues).filter(([, value]) => (value === true)).map(([key]) => {
404+
const keyParts = key.split('-');
405+
return keyParts.slice(0, keyParts.length - 2) + ' ' + keyParts[keyParts.length - 1];
406+
})
407+
];
408+
}, []);
409+
410+
return osVersions.length > 0 ? {
411+
os: osVersions.join(',')
412+
} : {};
413+
};
414+
399415
export const buildApiFilters = (patchFilters, inventoryFilters) => (
400416
{
401417
...patchFilters,
402418
...(Array.isArray(inventoryFilters.hostGroupFilter) && inventoryFilters.hostGroupFilter.length > 0
403419
? { group_name: inventoryFilters.hostGroupFilter }
404420
: {}),
405-
...inventoryFilters?.osFilter?.length > 0 ? {
406-
os: inventoryFilters.osFilter.map(({ value }) => 'RHEL ' + value).join(',')
407-
} : {}
421+
...buildOsFilter(inventoryFilters?.osFilter)
408422
});
409423

410424
export const changeListParams = (oldParams, newParams) => {

src/Utilities/Helpers.test.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,12 @@ describe('buildApiFilters', () => {
408408
});
409409

410410
it('adds a os filter when the inventory is filtered by OS', () => {
411-
const osFilter = [{ value: '8.8' }, { value: '8.9' }];
411+
const osFilter = {
412+
'RHEL-8': {
413+
'RHEL-8-8.8': true,
414+
'RHEL-8-8.9': true
415+
}
416+
};
412417
const inventoryFilters = {
413418
osFilter
414419
};

0 commit comments

Comments
 (0)