Skip to content

Commit f3b1b3b

Browse files
authored
fix(OperatingSystemFilter): RHINENG-10345 - Fix OS inventory filter conversion (#1152)
1 parent 7f7bc89 commit f3b1b3b

File tree

6 files changed

+79
-15
lines changed

6 files changed

+79
-15
lines changed

src/SmartComponents/AdvisorySystems/AdvisorySystems.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ import { changeAffectedSystemsParams, clearAdvisorySystemsReducer,
88
import {
99
decodeQueryparams
1010
} from '../../Utilities/Helpers';
11+
import {
12+
osParamParser
13+
} from '../../Utilities/SystemsHelpers';
1114
import RemediationWizard from '../Remediation/RemediationWizard';
1215
import { useSearchParams } from 'react-router-dom';
1316
import { useActivateRemediationModal } from '../Systems/SystemsListAssets';
@@ -20,7 +23,7 @@ const AdvisorySystems = ({ advisoryName }) => {
2023
const [isRemediationOpen, setRemediationOpen] = useState(false);
2124
const [remediationIssues, setRemediationIssues] = useState([]);
2225

23-
const decodedParams = decodeQueryparams('?' + searchParams.toString());
26+
const decodedParams = decodeQueryparams('?' + searchParams.toString(), { os: osParamParser });
2427
const status = useSelector(
2528
({ entities }) => entities?.status || {}
2629
);

src/SmartComponents/PackageSystems/PackageSystems.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ import {
2323
arrayFromObj, buildFilterChips, decodeQueryparams, filterRemediatablePackageSystems,
2424
persistantParams, remediationProviderWithPairs, removeUndefinedObjectKeys
2525
} from '../../Utilities/Helpers';
26+
import {
27+
osParamParser
28+
} from '../../Utilities/SystemsHelpers';
2629
import { useBulkSelectConfig, useGetEntities, useOnExport, useRemoveFilter,
2730
useOnSelect, ID_API_ENDPOINTS } from '../../Utilities/hooks';
2831
import { intl } from '../../Utilities/IntlProvider';
@@ -36,7 +39,7 @@ const PackageSystems = ({ packageName }) => {
3639
const [packageVersions, setPackageVersions] = React.useState([]);
3740

3841
const [searchParams, setSearchParams] = useSearchParams();
39-
const decodedParams = decodeQueryparams('?' + searchParams.toString());
42+
const decodedParams = decodeQueryparams('?' + searchParams.toString(), { os: osParamParser });
4043
const systems = useSelector(({ entities }) => entities?.rows || [], shallowEqual);
4144
const status = useSelector(
4245
({ entities }) => entities?.status || {}

src/SmartComponents/Systems/SystemsTable.js

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,23 @@ const SystemsTable = ({
6060
]);
6161

6262
const { systemProfile, selectedTags,
63-
filter, search, page, perPage, sort } = queryParams;
63+
filter: queryParamsFilter, search, page, perPage, sort
64+
} = queryParams;
65+
const { os: operatingSystemFilter, ...filter } = queryParamsFilter || {};
66+
const osFilter = operatingSystemFilter && [{
67+
osFilter: operatingSystemFilter.reduce((osFilter, os) => {
68+
const [osName, osVersion] = os.split(' ');
69+
const [major] = osVersion.split('.');
70+
71+
return {
72+
...osFilter,
73+
[`${osName}-${major}`]: {
74+
...osFilter[`${osName}-${major}`] || {},
75+
[`${osName}-${major}-${osVersion}`]: true
76+
}
77+
};
78+
}, {})
79+
}];
6480

6581
const applyMetadata = (metadata) => {
6682
dispatch(changeSystemsMetadata(metadata));
@@ -143,6 +159,9 @@ const SystemsTable = ({
143159
columns={(defaultColumns) => systemsColumnsMerger(defaultColumns, systemsListColumns)}
144160
showTags
145161
customFilters={{
162+
...operatingSystemFilter ? {
163+
filters: [...(osFilter || [])]
164+
} : {},
146165
patchParams: {
147166
search,
148167
filter,

src/Utilities/Helpers.js

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -293,16 +293,18 @@ export const encodeURLParams = parameters => {
293293
return encodeParams(removeUndefinedObjectItems(urlParams), false);
294294
};
295295

296-
export const decomposeFilterValue = filterValue => {
297-
if (typeof(filterValue) === 'string' && filterValue.startsWith('in:')) {
296+
export const decomposeFilterValue = (filterValue, parser) => {
297+
if (parser) {
298+
return parser(filterValue);
299+
} else if (typeof(filterValue) === 'string' && filterValue.startsWith('in:')) {
298300
const values = filterValue.slice(3);
299301
return values.split(',');
302+
} else {
303+
return filterValue;
300304
}
301-
302-
return filterValue;
303305
};
304306

305-
export const decodeQueryparams = queryString => {
307+
export const decodeQueryparams = (queryString, parsers = {}) => {
306308
const parsed = qs.parse(queryString);
307309
const res = {};
308310
Object.keys(parsed).forEach(key => {
@@ -313,9 +315,10 @@ export const decodeQueryparams = queryString => {
313315
if (bracketIndex > 0) {
314316
const objParent = key.slice(0, bracketIndex);
315317
const objKey = key.slice(bracketIndex + 1, -1);
318+
const parser = parsers[objKey];
316319
res[objParent] = {
317320
...res[objParent],
318-
[objKey]: decomposeFilterValue(typeHandledParam)
321+
[objKey]: decomposeFilterValue(typeHandledParam, parser)
319322
};
320323
} else {
321324
res[key] = typeHandledParam;
@@ -325,11 +328,13 @@ export const decodeQueryparams = queryString => {
325328
return res;
326329
};
327330

328-
export const buildFilterChips = (filters, search, searchChipLabel = 'Search') => {
331+
export const buildFilterChips = (filters, search, searchChipLabel = 'Search', parsers = {}) => {
329332

330333
let filterConfig = [];
331334
const buildChips = (filters, category) => {
332-
if (multiValueFilters.includes(category)) {
335+
if (parsers[category]) {
336+
return parsers[category](filters[category]);
337+
} else if (multiValueFilters.includes(category)) {
333338
const filterValues = filters[category] && (typeof(filters[category]) === 'string' && filters[category].split(',')
334339
|| filters[category]) || [];
335340
return filterValues.map(value => ({
@@ -396,15 +401,29 @@ export const buildFilterChips = (filters, search, searchChipLabel = 'Search') =>
396401
return filterConfig;
397402
};
398403

404+
export const buildOsFilter = (osFilter = {}) => {
405+
const osVersions = Object.entries(osFilter).reduce((acc, [, osGroupValues]) => {
406+
return [
407+
...acc,
408+
...Object.entries(osGroupValues).filter(([, value]) => (value === true)).map(([key]) => {
409+
const keyParts = key.split('-');
410+
return keyParts.slice(0, keyParts.length - 2) + ' ' + keyParts[keyParts.length - 1];
411+
})
412+
];
413+
}, []);
414+
415+
return osVersions.length > 0 ? {
416+
os: osVersions.join(',')
417+
} : {};
418+
};
419+
399420
export const buildApiFilters = (patchFilters, inventoryFilters) => (
400421
{
401422
...patchFilters,
402423
...(Array.isArray(inventoryFilters.hostGroupFilter) && inventoryFilters.hostGroupFilter.length > 0
403424
? { group_name: inventoryFilters.hostGroupFilter }
404425
: {}),
405-
...inventoryFilters?.osFilter?.length > 0 ? {
406-
os: inventoryFilters.osFilter.map(({ value }) => 'RHEL ' + value).join(',')
407-
} : {}
426+
...buildOsFilter(inventoryFilters?.osFilter)
408427
});
409428

410429
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
};

src/Utilities/SystemsHelpers.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,3 +104,18 @@ export const createSystemsSortBy = (orderBy, orderDirection, hasLastUpload) => {
104104

105105
return sort;
106106
};
107+
108+
export const osParamParser = (paramValue) => {
109+
return paramValue.replace('in:', '').split(',').reduce((osFilter, os) => {
110+
const [osName, osVersion] = os.split(' ');
111+
const [major] = osVersion.split('.');
112+
113+
return {
114+
...osFilter,
115+
[`${osName}-${major}`]: {
116+
...osFilter[`${osName}-${major}`] || {},
117+
[`${osName}-${major}-${osVersion}`]: true
118+
}
119+
};
120+
}, {});
121+
};

0 commit comments

Comments
 (0)