From 06c7c8696f1ad6add52fad6af5b033e4745ba93a Mon Sep 17 00:00:00 2001 From: Egor Shamardin <33912805+LightOfHeaven1994@users.noreply.github.com> Date: Tue, 28 Jan 2025 10:30:50 +0100 Subject: [PATCH] feat(RHINENG-15537): Return back RuleResults export (#2354) * 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 * fix(Export): Refactor --------- Co-authored-by: Michael Johnson --- src/SmartComponents/SystemDetails/Columns.js | 2 +- .../SystemDetails/RuleResults.js | 59 +++++++++++-------- .../hooks/api/useReportRuleResults.js | 25 +++++++- src/Utilities/hooks/useQuery/useQuery.js | 53 ++++++++++++----- 4 files changed, 98 insertions(+), 41 deletions(-) diff --git a/src/SmartComponents/SystemDetails/Columns.js b/src/SmartComponents/SystemDetails/Columns.js index 5d2a7983f..5812a42e5 100644 --- a/src/SmartComponents/SystemDetails/Columns.js +++ b/src/SmartComponents/SystemDetails/Columns.js @@ -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), }; diff --git a/src/SmartComponents/SystemDetails/RuleResults.js b/src/SmartComponents/SystemDetails/RuleResults.js index 68292082d..133fba8a2 100644 --- a/src/SmartComponents/SystemDetails/RuleResults.js +++ b/src/SmartComponents/SystemDetails/RuleResults.js @@ -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 ( { remediationsEnabled reportTestResult={reportTestResult} skipValueDefinitions={true} + options={{ + exporter: async () => + transformRules(await ruleResultsExporter(), reportTestResult), + }} // TODO: provide ruleTree - // TODO: hide passed rules by default /> ); }; diff --git a/src/Utilities/hooks/api/useReportRuleResults.js b/src/Utilities/hooks/api/useReportRuleResults.js index 88864acd8..dbb641533 100644 --- a/src/Utilities/hooks/api/useReportRuleResults.js +++ b/src/Utilities/hooks/api/useReportRuleResults.js @@ -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; diff --git a/src/Utilities/hooks/useQuery/useQuery.js b/src/Utilities/hooks/useQuery/useQuery.js index 881461814..aaf1abc11 100644 --- a/src/Utilities/hooks/useQuery/useQuery.js +++ b/src/Utilities/hooks/useQuery/useQuery.js @@ -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 @@ -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; } } },