diff --git a/actions/services/caseDirectService.js b/actions/services/caseDirectService.js index 0b406534..65f31954 100644 --- a/actions/services/caseDirectService.js +++ b/actions/services/caseDirectService.js @@ -274,3 +274,14 @@ export const getPortalModuleDetailsProxy = (appealType, caseReference) => { consoleLogger(error); }); }; + +export const getCaseStatus = async (appealType, caseReference) => { + const route = buildFileQuery("/api/endpoint/getStatusCounts_api", { + appealType, + caseReference: encodeURI(caseReference) + }); + + return getJson(withBaseUrl(BASE_URL, route)).catch((error) => { + consoleLogger(error); + }); +}; diff --git a/actions/services/caseService.js b/actions/services/caseService.js index ca19d922..063cc5bb 100644 --- a/actions/services/caseService.js +++ b/actions/services/caseService.js @@ -16,7 +16,8 @@ import { getPartSavedAppeal, getIsPublishedbyID, getPortalModuleDetails, - getPortalModuleDetailsProxy + getPortalModuleDetailsProxy, + getCaseStatus } from "./caseDirectService"; export { @@ -37,5 +38,6 @@ export { getPartSavedAppeal, getIsPublishedbyID, getPortalModuleDetails, - getPortalModuleDetailsProxy + getPortalModuleDetailsProxy, + getCaseStatus }; diff --git a/components/search/advancedsearch.js b/components/search/advancedsearch.js index d37f694f..be606029 100644 --- a/components/search/advancedsearch.js +++ b/components/search/advancedsearch.js @@ -3,9 +3,10 @@ import useTranslation from "next-translate/useTranslation"; import { useRouter } from "next/router"; import { connect } from "react-redux"; import { Field, formValueSelector, reduxForm } from "redux-form"; - +import { useEffect, useState } from "react"; import transLookup from "../../data/lookuptranslations.json"; -import { statusValues } from "../utils/caseStagesObj"; + +import { getCaseStatus } from "../../actions/services/caseDirectService"; const required = (errorMsg) => (value) => value || typeof value === "number" ? undefined : errorMsg; @@ -177,16 +178,8 @@ const RenderCaseStatusList = ({ ) ? "" : router.locale == "cy" - ? jsonpath({ - path: - '$..[?(@ && @.statuscode=="' + - optionsObj[key] - .statuscode + - '")].value_cy', - json: optionsObj, - eval: true - }) - : optionsObj[key].value || + ? `${optionsObj[key].value_cy} (${optionsObj[key].caseCount || 0})` + : `${optionsObj[key].value} (${optionsObj[key].caseCount || 0})` || t( "case:summary-no-date-entered-label" )} @@ -206,6 +199,27 @@ let AdvancedSearch = (props) => { const router = useRouter(); const { locale } = router; + const [caseStatusValues, setCaseStatusValues] = useState([]); + + useEffect(() => { + const fetchCaseStatus = async () => { + try { + const response = await getCaseStatus(); + + setCaseStatusValues( + Array.isArray(response?.data) + ? response.data + : response?.data?.value || response || [] + ); + } catch (error) { + console.error("Failed to fetch case statuses", error); + setCaseStatusValues([]); + } + }; + + fetchCaseStatus(); + }, []); + const { LPAData, onSubmit, @@ -691,7 +705,7 @@ let AdvancedSearch = (props) => { name="statusCode" id="statusCode" component={RenderCaseStatusList} - optionsObj={statusValues} + optionsObj={caseStatusValues} //validate={[required]} label={t( "search:case-status-label" diff --git a/pages/api/endpoint/getStatusCounts_api.js b/pages/api/endpoint/getStatusCounts_api.js new file mode 100644 index 00000000..08f20a0a --- /dev/null +++ b/pages/api/endpoint/getStatusCounts_api.js @@ -0,0 +1,105 @@ +// // pages/api/status-counts.js + +// import { azureHeadersPaged, azureHeaders } from "../../../actions/core/headers"; +// import { respondError } from "../middleware/apiResponse"; +// import { relayGet } from "../middleware/relayForwarding"; +// import { RELAY_POLICY_BOUNDED_READ } from "../middleware/relayPolicyPresets"; + +// import statusValues from "../../../components/utils/caseStagesObj"; + +// export default async function ApiProxy(req, res) { +// try { +// const relayPolicy = RELAY_POLICY_BOUNDED_READ; + +// const queryUrl = +// "incidents?$apply=groupby((statuscode),aggregate($count as caseCount))"; + +// const response = await relayGet({ +// queryUrl, +// res, +// requestOptionsBuilder: (accessToken) => azureHeaders(accessToken), +// relayPolicy, +// transformData: (data) => { +// if ( +// Object.prototype.hasOwnProperty.call( +// data, +// "@odata.nextLink" +// ) +// ) { +// const dataStr = JSON.stringify(data["@odata.nextLink"]); +// data["@odata.nextLink"] = dataStr.split("/v9.2/")[1]; +// } + +// return data; +// }, +// errorResponse: { +// status: 400, +// code: "BASIC_SEARCH_FETCH_FAILED", +// message: "Failed to fetch basic search results" +// } +// }); + +// const countsByStatusCode = response.data.value.reduce((acc, item) => { +// acc[item.statuscode] = item.caseCount; +// return acc; +// }, {}); + +// const result = statusValues.map((status) => ({ +// ...status, +// count: countsByStatusCode[status.statuscode] || 0 +// })); + +// return res.status(200).json({ +// count: result.length, +// value: result +// }); +// } catch (error) { +// console.error( +// "Failed to get status counts", +// error.response?.data || error.message +// ); + +// return res.status(500).json({ +// error: "Failed to get status counts" +// }); +// } +// } + +// pages/api/status-counts.js + +import { azureHeaders } from "../../../actions/core/headers"; +import { relayGet } from "../middleware/relayForwarding"; +import { RELAY_POLICY_BOUNDED_READ } from "../middleware/relayPolicyPresets"; + +import { statusValues } from "../../../components/utils/caseStagesObj"; + +export default async function ApiProxy(req, res) { + const queryUrl = + "incidents?$apply=groupby((statuscode),aggregate($count as caseCount))"; + + return relayGet({ + queryUrl, + res, + requestOptionsBuilder: (accessToken) => azureHeaders(accessToken), + relayPolicy: RELAY_POLICY_BOUNDED_READ, + transformData: (data) => { + const countsByStatusCode = (data.value || []).reduce( + (acc, item) => { + acc[item.statuscode] = item.caseCount || 0; + return acc; + }, + {} + ); + + return statusValues.map((status) => ({ + ...status, + caseCount: countsByStatusCode[status.statuscode] || 0 + })); + }, + errorResponse: { + status: 400, + code: "STATUS_COUNTS_FETCH_FAILED", + message: "Failed to fetch status counts" + } + }); +}