Skip to content

Commit

Permalink
feat(RHINENG-15537): Return back RuleResults export (#2354)
Browse files Browse the repository at this point in the history
* feat(RHINENG-15537): Return back RuleResults export

* fix(Export): Fixing issue & refactor

* fix(ExportColumns): Correct columns on export

* fix(Lint): Correct code with linter

* fix(Export): Bugfix for rule state

Co-authored-by: Michael Johnson <[email protected]>

* fix(Export): Refactor

---------

Co-authored-by: Michael Johnson <[email protected]>
  • Loading branch information
LightOfHeaven1994 and johnsonm325 authored Jan 28, 2025
1 parent 597bfea commit 06c7c86
Show file tree
Hide file tree
Showing 4 changed files with 98 additions and 41 deletions.
2 changes: 1 addition & 1 deletion src/SmartComponents/SystemDetails/Columns.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export const Name = {

export const PassedSystemDetails = {
...Passed,
renderExport: ({ result }) => (result === 'pass' ? 'Yes' : 'No'),
renderExport: ({ result }) => (result === 'pass' ? 'passed' : 'failed'),
renderFunc: renderComponent(PassedCell),
};

Expand Down
59 changes: 34 additions & 25 deletions src/SmartComponents/SystemDetails/RuleResults.js
Original file line number Diff line number Diff line change
@@ -1,49 +1,55 @@
import React, { useMemo } from 'react';
import React, { useMemo, useCallback } from 'react';
import RulesTable from '../../PresentationalComponents/RulesTable/RulesTableRest';
import propTypes from 'prop-types';
import TableStateProvider from '../../Frameworks/AsyncTableTools/components/TableStateProvider';
import useReportRuleResults from '../../Utilities/hooks/api/useReportRuleResults';
import { useSerialisedTableState } from '../../Frameworks/AsyncTableTools/hooks/useTableState';
import columns from './Columns';
import useReportRuleResults from '../../Utilities/hooks/api/useReportRuleResults';

import useExporter from '@/Frameworks/AsyncTableTools/hooks/useExporter';

const RuleResults = ({ reportTestResult }) => {
const serialisedTableState = useSerialisedTableState();

const { limit, offset } = serialisedTableState?.pagination || {};
const filters = serialisedTableState?.filters;
const sort = serialisedTableState?.sort;

// Enable default filter
const activeFiltersPassed = true;
const activeFilters = {
'rule-state': ['failed'],
};

const { data: ruleResults } = useReportRuleResults({
params: [
reportTestResult.id,
reportTestResult.report_id,
undefined,
limit,
offset,
false,
sort,
filters,
],
const testResultId = reportTestResult.id;
const reportId = reportTestResult.report_id;

const { data: ruleResults, fetch: fetchRuleResults } = useReportRuleResults({
params: {
testResultId,
reportId,
},
useTableState: true,
skip: serialisedTableState === undefined,
});

const transformRules = (ruleResults, reportTestResult) => {
return ruleResults !== undefined
? ruleResults.map((rule) => ({
...rule,
profile: { name: reportTestResult.title },
}))
: [];
};

const rules = useMemo(
() =>
ruleResults !== undefined
? ruleResults.data.map((rule) => ({
...rule,
profile: { name: reportTestResult.title },
}))
: [],
() => transformRules(ruleResults?.data, reportTestResult),
[ruleResults, reportTestResult]
);

const fetchForExport = useCallback(
async (offset, limit) => await fetchRuleResults({ offset, limit }, false),
[fetchRuleResults]
);

const ruleResultsExporter = useExporter(fetchForExport);

return (
<RulesTable
activeFiltersPassed={activeFiltersPassed}
Expand All @@ -60,8 +66,11 @@ const RuleResults = ({ reportTestResult }) => {
remediationsEnabled
reportTestResult={reportTestResult}
skipValueDefinitions={true}
options={{
exporter: async () =>
transformRules(await ruleResultsExporter(), reportTestResult),
}}
// TODO: provide ruleTree
// TODO: hide passed rules by default
/>
);
};
Expand Down
25 changes: 24 additions & 1 deletion src/Utilities/hooks/api/useReportRuleResults.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,29 @@
import useComplianceQuery from './useComplianceQuery';

const convertToArray = (params) => {
if (Array.isArray(params)) {
return params;
} else {
const { testResultId, reportId, limit, offset, idsOnly, sortBy, filter } =
params;

return [
testResultId,
reportId,
undefined, // xRHIDENTITY
limit,
offset,
idsOnly,
sortBy,
filter,
];
}
};

const useReportRuleResults = (options) =>
useComplianceQuery('reportRuleResults', options);
useComplianceQuery('reportRuleResults', {
...options,
convertToArray,
});

export default useReportRuleResults;
53 changes: 39 additions & 14 deletions src/Utilities/hooks/useQuery/useQuery.js
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,43 @@ const useQuery = (fn, options = {}) => {

const fetchFn = useCallback(
async (fn, params, setDataState = true) => {
if (!loading) {
setDataState && setLoading(true);
if (setDataState) {
if (!loading) {
setDataState && setLoading(true);
try {
const data = await (async (params) => {
const convertedParams = convertToArray
? convertToArray(params)
: params;

if (Array.isArray(convertedParams)) {
return debounced && setDataState
? await debouncedFn(...convertedParams)
: await fn(...convertedParams);
} else {
return debounced && setDataState
? await debouncedFn(convertedParams)
: await fn(convertedParams);
}
})(params);

if (setDataState && mounted.current) {
setData(data?.data || data);
setLoading(false);
} else {
return data?.data || data;
}
} catch (e) {
console.log(e);
if (setDataState) {
setError(e);
setLoading(false);
} else {
throw e;
}
}
}
} else {
try {
const data = await (async (params) => {
const convertedParams = convertToArray
Expand All @@ -71,20 +106,10 @@ const useQuery = (fn, options = {}) => {
}
})(params);

if (setDataState && mounted.current) {
setData(data?.data || data);
setLoading(false);
} else {
return data?.data || data;
}
return data?.data || data;
} catch (e) {
console.log(e);
if (setDataState) {
setError(e);
setLoading(false);
} else {
throw e;
}
throw e;
}
}
},
Expand Down

0 comments on commit 06c7c86

Please sign in to comment.