Merged PR 2255: refactor(representations): extract deterministic data-resolution helpers for...

refactor(representations): extract deterministic data-resolution helpers for representation flow (Slice R6, behaviour-preserving)

Related work items: #22441
This commit is contained in:
Robert Bond
2026-04-17 10:07:52 +00:00
parent 8e21ec1dd7
commit 33f31ad3c8
3 changed files with 155 additions and 59 deletions
+40 -58
View File
@@ -39,6 +39,13 @@ import {
resolveRepresentationControlKey, resolveRepresentationControlKey,
resolveSubmitTransition resolveSubmitTransition
} from "./utils/stepResolution"; } from "./utils/stepResolution";
import {
findDetailsObjForSubmit,
findDetailsObjForView,
findResultsObjForCurrentReference,
resolveInitialCaseDataSources,
resolveSubmitCaseDetailsSource
} from "./utils/dataResolution";
let MakeRepresentation = (props) => { let MakeRepresentation = (props) => {
let { t } = useTranslation(); let { t } = useTranslation();
@@ -261,52 +268,31 @@ let MakeRepresentation = (props) => {
const isEditState = router.query.state === "edit"; const isEditState = router.query.state === "edit";
const hasState = router.query.hasOwnProperty("state"); const hasState = router.query.hasOwnProperty("state");
const getCaseDetailsObj = () => { const { caseDetailsSource, caseResultsSource } =
if (hasState) { resolveInitialCaseDataSources({
return isEditState hasState,
? props.props.myRepresentations.myRepresentations isEditState,
: props.props.searchResultsObj.searchDetailsObj; currentType: props.currentType,
} myRepresentations: props.props.myRepresentations.myRepresentations,
return props.currentType === "watchedCases" searchDetailsObj: props.props.searchResultsObj.searchDetailsObj,
? props.props.watchedCases.watchedCasesDetails searchResultsObj: props.props.searchResultsObj.searchResultsObj,
: props.props.searchResultsObj.searchDetailsObj; watchedCasesDetails: props.props.watchedCases.watchedCasesDetails
}; });
const getCaseResultsObj = () => { let resultsObj = findResultsObjForCurrentReference({
if (hasState) { "currentReference": currentView.caseReference.currentReference,
return isEditState "caseResultsSource": caseResultsSource
? props.props.myRepresentations.myRepresentations });
: props.props.searchResultsObj.searchResultsObj;
}
return props.currentType === "watchedCases"
? props.props.watchedCases.watchedCasesDetails
: props.props.searchResultsObj.searchResultsObj;
};
const setCaseDetailsObj = getCaseDetailsObj();
const setCaseResultsObj = getCaseResultsObj();
let resultsObj = jsonpath({
path: `$..[?(@ && @.ticketnumber=="${currentView.caseReference.currentReference}")]`,
json: setCaseResultsObj,
eval: true
})[0];
// let detailsObj; // let detailsObj;
if (hasState && isEditState) { detailsObj = findDetailsObjForView({
detailsObj = jsonpath({ hasState,
path: `$..[?(@ && @.repfile_name=="${router.query.created}")]`, isEditState,
json: setCaseDetailsObj, "queryCreated": router.query.created,
eval: true "ticketnumber": currentView.caseReference.ticketnumber,
})[0]; "caseDetailsSource": caseDetailsSource
} else { });
detailsObj = jsonpath({
path: `$..[?(@ && @.ticketnumber=="${currentView.caseReference.ticketnumber}")]`,
json: setCaseDetailsObj,
eval: true
})[0];
}
const safeDetailsObj = detailsObj || {}; const safeDetailsObj = detailsObj || {};
const safeResultsObj = resultsObj || {}; const safeResultsObj = resultsObj || {};
@@ -963,24 +949,20 @@ let MakeRepresentation = (props) => {
return; return;
} }
// Determine case data source const caseDetailsSource = resolveSubmitCaseDetailsSource({
const getCaseDetailsSource = () => { "isEditState": router.query?.state === "edit",
if (router.query?.state === "edit") { "currentType": props.currentType,
return props.props.myRepresentations.myRepresentations; "myRepresentations":
} props.props.myRepresentations.myRepresentations,
return props.currentType === "watchedCases" "watchedCasesDetails": props.props.watchedCases.watchedCasesDetails,
? props.props.watchedCases.watchedCasesDetails "searchDetailsObj": props.props.searchResultsObj.searchDetailsObj
: props.props.searchResultsObj.searchDetailsObj; });
};
const setCaseDetailsObj = getCaseDetailsSource();
// Find correct case details // Find correct case details
let detailsObj = jsonpath({ let detailsObj = findDetailsObjForSubmit({
path: `$..[?(@ && @.ticketnumber=="${ticketnumber}")]`, ticketnumber,
json: setCaseDetailsObj, caseDetailsSource
eval: true });
})[0];
// Cancel submit status if editing // Cancel submit status if editing
if (router.query?.state === "edit") { if (router.query?.state === "edit") {
@@ -0,0 +1,93 @@
import { JSONPath as jsonpath } from "jsonpath-plus";
export const resolveInitialCaseDataSources = ({
hasState,
isEditState,
currentType,
myRepresentations,
searchDetailsObj,
searchResultsObj,
watchedCasesDetails
}) => {
if (hasState) {
return {
"caseDetailsSource": isEditState
? myRepresentations
: searchDetailsObj,
"caseResultsSource": isEditState
? myRepresentations
: searchResultsObj
};
}
return {
"caseDetailsSource":
currentType === "watchedCases"
? watchedCasesDetails
: searchDetailsObj,
"caseResultsSource":
currentType === "watchedCases"
? watchedCasesDetails
: searchResultsObj
};
};
export const findResultsObjForCurrentReference = ({
currentReference,
caseResultsSource
}) => {
return jsonpath({
path: `$..[?(@ && @.ticketnumber=="${currentReference}")]`,
"json": caseResultsSource,
"eval": true
})[0];
};
export const findDetailsObjForView = ({
hasState,
isEditState,
queryCreated,
ticketnumber,
caseDetailsSource
}) => {
if (hasState && isEditState) {
return jsonpath({
path: `$..[?(@ && @.repfile_name=="${queryCreated}")]`,
"json": caseDetailsSource,
"eval": true
})[0];
}
return jsonpath({
path: `$..[?(@ && @.ticketnumber=="${ticketnumber}")]`,
"json": caseDetailsSource,
"eval": true
})[0];
};
export const resolveSubmitCaseDetailsSource = ({
isEditState,
currentType,
myRepresentations,
watchedCasesDetails,
searchDetailsObj
}) => {
if (isEditState) {
return myRepresentations;
}
return currentType === "watchedCases"
? watchedCasesDetails
: searchDetailsObj;
};
export const findDetailsObjForSubmit = ({
ticketnumber,
caseDetailsSource
}) => {
return jsonpath({
path: `$..[?(@ && @.ticketnumber=="${ticketnumber}")]`,
"json": caseDetailsSource,
"eval": true
})[0];
};
+22 -1
View File
@@ -6,7 +6,7 @@ Base branch: `refactor`
## Status ## Status
Current slice: Slice R5Representation Elements Normalisation Current slice: Slice R6Async Data / Service Layer Cleanup
Status: COMPLETE Status: COMPLETE
--- ---
@@ -181,6 +181,27 @@ Reduce duplication and coupling in data fetching.
- blob/file retrieval - blob/file retrieval
- representation detail aggregation - representation detail aggregation
**Completion notes (this slice):**
- Implemented on feature branch created from `refactor`: `rep-slice-r6-data-service-cleanup`.
- Added deterministic representation-specific data-resolution helpers in:
- `components/case/representation/utils/dataResolution.js`
- Updated `components/case/representation/index.js` to use extracted helper functions for:
- initial case details/results source resolution
- details/results lookup by current context (state/edit/ticket/created)
- submit-path details source resolution and details lookup
- Preserved slice boundary constraints:
- no service/API call execution movement
- no dispatch sequencing changes
- no loader branch redesign
- no blob retrieval orchestration changes
- no payload contract/Redux/route/query/EN-CY changes
- Validation evidence:
- `npm run lint` completed (warnings only, no new errors).
- `npm run test:reps` completed: **7 passed**.
- Manual APP/IP/Agent/LPA checks: **passed**.
- Manual EN/CY parity checks: **passed**.
--- ---
### Slice R7 — Summary / Case-Type Rendering Simplification (Optional) ### Slice R7 — Summary / Case-Type Rendering Simplification (Optional)