From 30f697a3d5de3e8b7c6f263bd3b8494a066a45e5 Mon Sep 17 00:00:00 2001 From: Matias Arriola Date: Fri, 21 Feb 2025 13:37:05 -0300 Subject: [PATCH 1/2] fix: use org unit code instead of survey id in PPS breadcrumbs --- .../repositories/SurveyFormD2Repository.ts | 23 +++++++++++-------- .../SurveyFormTestRepository.ts | 4 ++-- src/data/utils/surveyListMappers.ts | 18 +++++++++++---- src/domain/entities/OrgUnit.ts | 6 +++++ src/domain/entities/Survey.ts | 3 ++- .../survey-list/hook/useSurveyListActions.ts | 18 +++++++-------- 6 files changed, 45 insertions(+), 27 deletions(-) diff --git a/src/data/repositories/SurveyFormD2Repository.ts b/src/data/repositories/SurveyFormD2Repository.ts index 3e290530..32592ad2 100644 --- a/src/data/repositories/SurveyFormD2Repository.ts +++ b/src/data/repositories/SurveyFormD2Repository.ts @@ -1,6 +1,6 @@ import { D2Api } from "@eyeseetea/d2-api/2.36"; import { Future } from "../../domain/entities/generic/Future"; -import { Id, NamedRef } from "../../domain/entities/Ref"; +import { Id } from "../../domain/entities/Ref"; import { SurveyRepository } from "../../domain/repositories/SurveyRepository"; import { apiToFuture, FutureData } from "../api-futures"; import _ from "../../domain/entities/generic/Collection"; @@ -47,6 +47,7 @@ import { getSurveyChildCount } from "../utils/surveyChildCountHelper"; import { TrackerPostRequest, TrackerPostResponse } from "@eyeseetea/d2-api/api/tracker"; import { Maybe } from "../../utils/ts-utils"; import { D2TrackerEvent, D2TrackerEventToPost } from "@eyeseetea/d2-api/api/trackerEvents"; +import { OrgUnitBasic } from "../../domain/entities/OrgUnit"; const OU_CHUNK_SIZE = 500; @@ -300,7 +301,7 @@ export class SurveyD2Repository implements SurveyRepository { }) ).flatMap((trackedEntities: TrackedEntitiesGetResponse) => { const instances: D2TrackerEntitySelectedPick[] = trackedEntities.instances; - return this.getOrgUnitNames(instances.map(instance => instance.orgUnit)).flatMap( + return this.getOrgUnitsBasicInfo(instances.map(instance => instance.orgUnit)).flatMap( orgUnits => { const surveys = mapTrackedEntityToSurvey(instances, surveyFormType, orgUnits); return Future.success(surveys); @@ -331,7 +332,7 @@ export class SurveyD2Repository implements SurveyRepository { ).flatMap( (trackedEntities: TrackedEntitiesGetResponse) => { const instances: D2TrackerEntitySelectedPick[] = trackedEntities.instances; - return this.getOrgUnitNames( + return this.getOrgUnitsBasicInfo( instances.map(instance => instance.orgUnit) ).flatMap(orgUnits => { const surveys = mapTrackedEntityToSurvey( @@ -347,16 +348,16 @@ export class SurveyD2Repository implements SurveyRepository { ).flatMap(listOfSurveys => Future.success(_(listOfSurveys).flatten().value())); } - private getOrgUnitNames(orgUnitIds: Id[]): FutureData { + private getOrgUnitsBasicInfo(orgUnitIds: Id[]): FutureData { return apiToFuture( this.api.models.organisationUnits.get({ - fields: { id: true, name: true }, + fields: { id: true, name: true, code: true }, filter: { id: { in: orgUnitIds } }, paging: false, }) ).flatMap(orgUnitsResponse => { const orgUnits = orgUnitsResponse.objects.map(ou => { - return { id: ou.id, name: ou.name }; + return { id: ou.id, name: ou.name, code: ou.code }; }); return Future.success(orgUnits); }); @@ -388,10 +389,12 @@ export class SurveyD2Repository implements SurveyRepository { ).flatMap(response => { const events = response.instances; - return this.getOrgUnitNames(events.map(event => event.orgUnit)).flatMap(orgUnits => { - const surveys = mapEventToSurvey(events, surveyFormType, programId, orgUnits); - return Future.success(surveys); - }); + return this.getOrgUnitsBasicInfo(events.map(event => event.orgUnit)).flatMap( + orgUnits => { + const surveys = mapEventToSurvey(events, surveyFormType, programId, orgUnits); + return Future.success(surveys); + } + ); }); } diff --git a/src/data/repositories/testRepositories/SurveyFormTestRepository.ts b/src/data/repositories/testRepositories/SurveyFormTestRepository.ts index 59228f2c..3b6f7018 100644 --- a/src/data/repositories/testRepositories/SurveyFormTestRepository.ts +++ b/src/data/repositories/testRepositories/SurveyFormTestRepository.ts @@ -95,7 +95,7 @@ export class SurveyTestRepository implements SurveyRepository { id: "1", startDate: new Date(), status: "ACTIVE", - assignedOrgUnit: { id: orgUnitId, name: "OU1" }, + assignedOrgUnit: { id: orgUnitId, name: "OrgUnit1", code: "OU1" }, surveyType: "SUPRANATIONAL", rootSurvey: { id: "1", name: "TestSurvey1", surveyType: "" }, surveyFormType: "PPSSurveyForm", @@ -106,7 +106,7 @@ export class SurveyTestRepository implements SurveyRepository { id: "2", startDate: new Date(), status: "COMPLETED", - assignedOrgUnit: { id: "OU1234", name: "OU2" }, + assignedOrgUnit: { id: "OU1234", name: "OrgUnit2", code: "OU2" }, surveyType: "NATIONAL", rootSurvey: { id: "2", name: "TestSurvey1", surveyType: "" }, surveyFormType: "PPSSurveyForm", diff --git a/src/data/utils/surveyListMappers.ts b/src/data/utils/surveyListMappers.ts index a68314ca..8085f6e1 100644 --- a/src/data/utils/surveyListMappers.ts +++ b/src/data/utils/surveyListMappers.ts @@ -12,9 +12,10 @@ import { patientIdList, } from "../entities/D2Survey"; import { getSurveyNameBySurveyFormType } from "./surveyProgramHelper"; -import { Id, NamedRef } from "../../domain/entities/Ref"; +import { Id } from "../../domain/entities/Ref"; import { SelectedPick } from "@eyeseetea/d2-api/api"; import { D2TrackerEvent } from "@eyeseetea/d2-api/api/trackerEvents"; +import { OrgUnitBasic } from "../../domain/entities/OrgUnit"; export const trackedEntityFields = { attributes: true, @@ -33,7 +34,7 @@ export type D2TrackerEntitySelectedPick = SelectedPick< export const mapTrackedEntityToSurvey = ( trackedEntities: D2TrackerEntitySelectedPick[], surveyFormType: SURVEY_FORM_TYPES, - orgUnits?: NamedRef[] + orgUnits?: OrgUnitBasic[] ): Survey[] => { return trackedEntities.map(trackedEntityInstance => { const parentPrevalenceSurveyId = @@ -68,6 +69,8 @@ export const mapTrackedEntityToSurvey = ( const createdAt = trackedEntityInstance.enrollments[0]?.createdAt; + const orgUnit = orgUnits?.find(ou => ou.id === trackedEntityInstance.orgUnit); + const survey: Survey = { id: trackedEntityInstance.trackedEntity ?? "", name: trackedEntityInstance.trackedEntity ?? "", @@ -83,7 +86,8 @@ export const mapTrackedEntityToSurvey = ( status: "ACTIVE", assignedOrgUnit: { id: trackedEntityInstance.orgUnit ?? "", - name: orgUnits?.find(ou => ou.id === trackedEntityInstance.orgUnit)?.name ?? "", + name: orgUnit?.name ?? "", + code: orgUnit?.code ?? "", }, surveyType: "", parentWardRegisterId: parentWardId, @@ -100,7 +104,7 @@ export const mapEventToSurvey = ( events: D2TrackerEvent[], surveyFormType: SURVEY_FORM_TYPES, programId: Id, - orgUnits?: NamedRef[] + orgUnits?: OrgUnitBasic[] ): Survey[] => { return events.map((event: D2TrackerEvent) => { const surveyProperties = new Map( @@ -133,6 +137,8 @@ export const mapEventToSurvey = ( : "ACTIVE" : "COMPLETED"; + const orgUnit = orgUnits?.find(ou => ou.id === event.orgUnit); + const survey: Survey = { id: event.event, name: getSurveyNameBySurveyFormType(surveyFormType, { @@ -162,8 +168,10 @@ export const mapEventToSurvey = ( ? ("COMPLETED" as SURVEY_STATUSES) : ("ACTIVE" as SURVEY_STATUSES), assignedOrgUnit: { + ...orgUnit, id: event.orgUnit, - name: orgUnits?.find(ou => ou.id === event.orgUnit)?.name ?? "", + name: orgUnit?.name ?? "", + code: orgUnit?.code ?? "", }, surveyType: surveyType, parentWardRegisterId: parentWardRegisterId, diff --git a/src/domain/entities/OrgUnit.ts b/src/domain/entities/OrgUnit.ts index 3788ba95..60cf184d 100644 --- a/src/domain/entities/OrgUnit.ts +++ b/src/domain/entities/OrgUnit.ts @@ -1,5 +1,11 @@ +import { NamedRef } from "./Ref"; + export interface OrgUnit { id: string; shortName: string; path: string; } + +export interface OrgUnitBasic extends NamedRef { + code: string; +} diff --git a/src/domain/entities/Survey.ts b/src/domain/entities/Survey.ts index 87ec6efb..c14e1c14 100644 --- a/src/domain/entities/Survey.ts +++ b/src/domain/entities/Survey.ts @@ -1,4 +1,5 @@ import { ASTGUIDELINE_TYPES } from "./ASTGuidelines"; +import { OrgUnitBasic } from "./OrgUnit"; import { ProgramCountMap, ProgramOptionCountMap } from "./Program"; import { NamedRef, Id } from "./Ref"; @@ -66,7 +67,7 @@ export interface Survey extends SurveyBase { rootSurvey: SurveyBase; // all surveys are associated with a given parent Survey Form instance. startDate?: Date; status: SURVEY_STATUSES; - assignedOrgUnit: NamedRef; + assignedOrgUnit: OrgUnitBasic; surveyFormType: SURVEY_FORM_TYPES; parentWardRegisterId?: Id; uniquePatient?: { id: string; code: string }; diff --git a/src/webapp/components/survey-list/hook/useSurveyListActions.ts b/src/webapp/components/survey-list/hook/useSurveyListActions.ts index 3154cc55..69493f4c 100644 --- a/src/webapp/components/survey-list/hook/useSurveyListActions.ts +++ b/src/webapp/components/survey-list/hook/useSurveyListActions.ts @@ -1,6 +1,5 @@ import { useState } from "react"; import { useHistory } from "react-router-dom"; -import { Id } from "../../../../domain/entities/Ref"; import { Survey, SurveyBase, SURVEY_FORM_TYPES } from "../../../../domain/entities/Survey"; import { getChildSurveyType, getSurveyOptions } from "../../../../domain/utils/PPSProgramsHelper"; import _ from "../../../../domain/entities/generic/Collection"; @@ -13,6 +12,7 @@ import useReadOnlyAccess from "../../survey/hook/useReadOnlyAccess"; import useCaptureAccess from "../../survey/hook/useCaptureAccess"; import { GLOBAL_OU_ID } from "../../../../domain/usecases/SaveFormDataUseCase"; import { useCurrentASTGuidelinesContext } from "../../../contexts/current-ast-guidelines-context"; +import { OrgUnitBasic } from "../../../../domain/entities/OrgUnit"; export type SortDirection = "asc" | "desc"; export function useSurveyListActions(surveyFormType: SURVEY_FORM_TYPES) { @@ -49,7 +49,7 @@ export function useSurveyListActions(surveyFormType: SURVEY_FORM_TYPES) { surveyType: survey.surveyType, astGuideline: survey.astGuideline, }, - survey.assignedOrgUnit.id, + survey.assignedOrgUnit, survey.rootSurvey ); history.push({ @@ -65,7 +65,7 @@ export function useSurveyListActions(surveyFormType: SURVEY_FORM_TYPES) { surveyType: survey.surveyType, astGuideline: survey.astGuideline, }, - survey.assignedOrgUnit.id, + survey.assignedOrgUnit, survey.rootSurvey ); const childSurveyType = getChildSurveyType(surveyFormType, survey.surveyType, option); @@ -86,7 +86,7 @@ export function useSurveyListActions(surveyFormType: SURVEY_FORM_TYPES) { surveyType: survey.surveyType, astGuideline: survey.astGuideline, }, - survey.assignedOrgUnit.id, + survey.assignedOrgUnit, survey.rootSurvey ); const childSurveyType = getChildSurveyType(surveyFormType, survey.surveyType, option); @@ -152,23 +152,23 @@ export function useSurveyListActions(surveyFormType: SURVEY_FORM_TYPES) { const updateSelectedSurveyDetails = ( survey: SurveyBase, - orgUnitId: Id, + orgUnit: OrgUnitBasic, rootSurvey: SurveyBase ) => { if (surveyFormType === "PPSSurveyForm") changeCurrentPPSSurveyForm(survey); else if (surveyFormType === "PPSCountryQuestionnaire") - changeCurrentCountryQuestionnaire(survey.id, survey.name, orgUnitId); + changeCurrentCountryQuestionnaire(survey.id, orgUnit.code, orgUnit.id); else if (surveyFormType === "PPSHospitalForm") { if (!isAdmin) { changeCurrentPPSSurveyForm(rootSurvey); } - changeCurrentHospitalForm(survey.id, survey.name, orgUnitId); + changeCurrentHospitalForm(survey.id, survey.name, orgUnit.id); } else if (surveyFormType === "PPSWardRegister") changeCurrentWardRegister(survey); else if (surveyFormType === "PrevalenceSurveyForm") { changeCurrentPrevalenceSurveyForm( survey.id, survey.name, - orgUnitId, + orgUnit.id, survey.astGuideline ); //when current astGuideline changes, fetch the corresponding ast guidelines from datstore @@ -210,7 +210,7 @@ export function useSurveyListActions(surveyFormType: SURVEY_FORM_TYPES) { } ); } - changeCurrentFacilityLevelForm(survey.id, survey.name, orgUnitId); + changeCurrentFacilityLevelForm(survey.id, survey.name, orgUnit.id); } else if (surveyFormType === "PrevalenceCaseReportForm") changeCurrentCaseReportForm({ id: survey.id, name: survey.name }); }; From 640eb8f9c744fc8c2404a94603d264e2866af413 Mon Sep 17 00:00:00 2001 From: Matias Arriola Date: Tue, 25 Feb 2025 10:31:29 -0300 Subject: [PATCH 2/2] refactor: change type of currentCountryQuestionnaire to better reflect orgUnitCode is used --- src/domain/entities/Survey.ts | 7 ++++++- .../survey-list/bread-crumbs/PPSListBreadCrumbs.tsx | 2 +- .../survey/bread-crumbs/PPSSurveyFormBreadCrumb.tsx | 2 +- .../contexts/CurrentSurveysContextProvider.tsx | 13 +++++++++---- src/webapp/contexts/current-surveys-context.ts | 11 ++++++++--- 5 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/domain/entities/Survey.ts b/src/domain/entities/Survey.ts index c14e1c14..05ed88cc 100644 --- a/src/domain/entities/Survey.ts +++ b/src/domain/entities/Survey.ts @@ -1,7 +1,7 @@ import { ASTGUIDELINE_TYPES } from "./ASTGuidelines"; import { OrgUnitBasic } from "./OrgUnit"; import { ProgramCountMap, ProgramOptionCountMap } from "./Program"; -import { NamedRef, Id } from "./Ref"; +import { NamedRef, Id, Ref } from "./Ref"; export type SURVEY_FORM_TYPES = | "PPSSurveyForm" @@ -42,6 +42,11 @@ export interface OrgUnitNamedRef extends NamedRef { orgUnitId: Id; } +export interface OrgUnitWithCodeRef extends Ref { + orgUnitId: Id; + orgUnitCode: string; +} + export interface PrevalenceSurveyForm extends OrgUnitNamedRef { astGuidelines: ASTGUIDELINE_TYPES | undefined; } diff --git a/src/webapp/components/survey-list/bread-crumbs/PPSListBreadCrumbs.tsx b/src/webapp/components/survey-list/bread-crumbs/PPSListBreadCrumbs.tsx index 1415db62..f003ed33 100644 --- a/src/webapp/components/survey-list/bread-crumbs/PPSListBreadCrumbs.tsx +++ b/src/webapp/components/survey-list/bread-crumbs/PPSListBreadCrumbs.tsx @@ -73,7 +73,7 @@ export const PPSListBreadCrumbs: React.FC = ({ formType to={`/survey/PPSCountryQuestionnaire/${currentCountryQuestionnaire?.id}`} exact={true} > - {currentCountryQuestionnaire?.name} + {currentCountryQuestionnaire?.orgUnitCode} diff --git a/src/webapp/components/survey/bread-crumbs/PPSSurveyFormBreadCrumb.tsx b/src/webapp/components/survey/bread-crumbs/PPSSurveyFormBreadCrumb.tsx index 05af3c75..8428d537 100644 --- a/src/webapp/components/survey/bread-crumbs/PPSSurveyFormBreadCrumb.tsx +++ b/src/webapp/components/survey/bread-crumbs/PPSSurveyFormBreadCrumb.tsx @@ -81,7 +81,7 @@ export const PPSSurveyFormBreadCrumb: React.FC = ( to={`/survey/PPSCountryQuestionnaire/${currentCountryQuestionnaire.id}`} exact={true} > - {currentCountryQuestionnaire.name} + {currentCountryQuestionnaire.orgUnitCode} ) : (