From b4992c493d38bb93d4916fd365a01583dc03277b Mon Sep 17 00:00:00 2001 From: sultanofcardio Date: Thu, 24 Oct 2024 12:02:54 -0500 Subject: [PATCH 1/5] Update node version to 20.10.0 --- .node-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.node-version b/.node-version index 3c032078a..d5a159609 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -18 +20.10.0 From b34cab18ab8a0b9cd9be30954a2a4dfd9e2e73a1 Mon Sep 17 00:00:00 2001 From: sultanofcardio Date: Thu, 24 Oct 2024 12:07:00 -0500 Subject: [PATCH 2/5] Omit subscale linked report score from summary --- .../activity/lib/types/activityReportSettings.ts | 9 +++++++++ src/features/pass-survey/model/ScoresExtractor.ts | 8 ++++++++ 2 files changed, 17 insertions(+) diff --git a/src/entities/activity/lib/types/activityReportSettings.ts b/src/entities/activity/lib/types/activityReportSettings.ts index d4040ac13..f26afc602 100644 --- a/src/entities/activity/lib/types/activityReportSettings.ts +++ b/src/entities/activity/lib/types/activityReportSettings.ts @@ -70,6 +70,10 @@ export type ScoreConditionalLogic = { conditions: Array; }; +export const ScoreReportScoringType = ['score', 'raw_score'] as const; + +export type ScoreReportScoringType = (typeof ScoreReportScoringType)[number]; + export type Report = { id: string; calculationType: CalculationType; @@ -77,4 +81,9 @@ export type Report = { name: string; type: ReportType; conditionalLogic: Array; + + /** Whether to show raw score or T scores in the report */ + scoringType: ScoreReportScoringType; + /** The name of a subscale to use for a lookup table, if `scoringType` is set to "score" */ + subscaleName?: string; }; diff --git a/src/features/pass-survey/model/ScoresExtractor.ts b/src/features/pass-survey/model/ScoresExtractor.ts index 021495f1d..1bb4247ea 100644 --- a/src/features/pass-survey/model/ScoresExtractor.ts +++ b/src/features/pass-survey/model/ScoresExtractor.ts @@ -66,6 +66,14 @@ export class ScoresExtractor implements IScoresExtractor { ); for (const scoreSettings of settings) { + if ( + scoreSettings.type === 'score' && + scoreSettings.scoringType === 'score' + ) { + // Skip report scores that are not configured as raw scores + continue; + } + const logScore = `'${scoreSettings.name}' for settings with index '${settingsIndex}'`; try { From 4706b98865cdfff3afc2084e028796cf28c98661 Mon Sep 17 00:00:00 2001 From: sultanofcardio Date: Thu, 24 Oct 2024 12:24:25 -0500 Subject: [PATCH 3/5] Type and test fixes --- src/entities/activity/model/mappers.input.mock.ts | 1 + src/entities/activity/model/mappers.output.mock.ts | 1 + src/entities/activity/model/mappers.ts | 2 ++ .../pass-survey/model/tests/ScoresExtractor.test.ts | 6 ++++++ src/shared/api/services/ActivityReportSettingsDtos.ts | 8 ++++++++ 5 files changed, 18 insertions(+) diff --git a/src/entities/activity/model/mappers.input.mock.ts b/src/entities/activity/model/mappers.input.mock.ts index 149192e65..79a041392 100644 --- a/src/entities/activity/model/mappers.input.mock.ts +++ b/src/entities/activity/model/mappers.input.mock.ts @@ -1051,6 +1051,7 @@ export const conditionalInput: ActivityDto = { { itemsScore: ['one'], type: 'score', + scoringType: 'raw_score', id: '1', name: 'name', calculationType: 'sum', diff --git a/src/entities/activity/model/mappers.output.mock.ts b/src/entities/activity/model/mappers.output.mock.ts index 9536accde..9a6645d09 100644 --- a/src/entities/activity/model/mappers.output.mock.ts +++ b/src/entities/activity/model/mappers.output.mock.ts @@ -1187,6 +1187,7 @@ export const conditionalOutput: ActivityDetails = { includedItems: ['one'], name: 'name', type: 'score', + scoringType: 'raw_score', }, ], showAllAtOnce: false, diff --git a/src/entities/activity/model/mappers.ts b/src/entities/activity/model/mappers.ts index dcf72e64d..1b72378d0 100644 --- a/src/entities/activity/model/mappers.ts +++ b/src/entities/activity/model/mappers.ts @@ -762,6 +762,8 @@ export function mapToActivity(dto: ActivityDto): ActivityDetails { calculationType: x.calculationType, conditionalLogic: x.conditionalLogic, includedItems: x.itemsScore, + scoringType: x.scoringType, + subscaleName: x.subscaleName, })), }; diff --git a/src/features/pass-survey/model/tests/ScoresExtractor.test.ts b/src/features/pass-survey/model/tests/ScoresExtractor.test.ts index 6d1995cef..f9e470caf 100644 --- a/src/features/pass-survey/model/tests/ScoresExtractor.test.ts +++ b/src/features/pass-survey/model/tests/ScoresExtractor.test.ts @@ -218,6 +218,7 @@ describe('ScoresCalculator: test collectScoreForRadio', () => { includedItems: [RadioItemName, CheckboxesItemName, SliderItemName], name: 'mock-report-name-1', type: 'score', + scoringType: 'raw_score', }, ]; @@ -247,6 +248,7 @@ describe('ScoresCalculator: test collectScoreForRadio', () => { includedItems: [RadioItemName, CheckboxesItemName, SliderItemName], name: 'mock-report-name-1', type: 'score', + scoringType: 'raw_score', }, { calculationType: 'average', @@ -255,6 +257,7 @@ describe('ScoresCalculator: test collectScoreForRadio', () => { includedItems: [RadioItemName, CheckboxesItemName, SliderItemName], name: 'mock-report-name-2', type: 'score', + scoringType: 'raw_score', }, { calculationType: 'percentage', @@ -263,6 +266,7 @@ describe('ScoresCalculator: test collectScoreForRadio', () => { includedItems: [RadioItemName, CheckboxesItemName, SliderItemName], name: 'mock-report-name-3', type: 'score', + scoringType: 'raw_score', }, ]; @@ -328,6 +332,7 @@ describe('ScoresCalculator: test collectScoreForRadio', () => { includedItems: selectedItems, name: 'mock-report-name-1', type: 'score', + scoringType: 'raw_score', }, ]; @@ -372,6 +377,7 @@ describe('ScoresCalculator: test collectScoreForRadio', () => { includedItems: [RadioItemName, CheckboxesItemName, SliderItemName], name: 'mock-report-name-1', type: 'score', + scoringType: 'raw_score', }, ]; diff --git a/src/shared/api/services/ActivityReportSettingsDtos.ts b/src/shared/api/services/ActivityReportSettingsDtos.ts index 0557ab596..bd4f1aa89 100644 --- a/src/shared/api/services/ActivityReportSettingsDtos.ts +++ b/src/shared/api/services/ActivityReportSettingsDtos.ts @@ -4,6 +4,10 @@ type CalculationType = 'average' | 'percentage' | 'sum'; type MatchType = 'all' | 'any'; +const ScoreReportScoringType = ['score', 'raw_score'] as const; + +type ScoreReportScoringType = (typeof ScoreReportScoringType)[number]; + type ConditionDto = | GreaterThanCondition | LessThanCondition @@ -77,4 +81,8 @@ export type ReportDto = { name: string; type: ReportType; conditionalLogic: Array; + /** Whether to show raw score or T scores in the report */ + scoringType: ScoreReportScoringType; + /** The name of a subscale to use for a lookup table, if `scoringType` is set to "score" */ + subscaleName?: string; }; From b42b7500da6d811af3ee7506ab08e7dc8d1a9e87 Mon Sep 17 00:00:00 2001 From: sultanofcardio Date: Thu, 24 Oct 2024 12:39:13 -0500 Subject: [PATCH 4/5] Add test --- .../model/tests/ScoresExtractor.test.ts | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/features/pass-survey/model/tests/ScoresExtractor.test.ts b/src/features/pass-survey/model/tests/ScoresExtractor.test.ts index f9e470caf..4abd0914c 100644 --- a/src/features/pass-survey/model/tests/ScoresExtractor.test.ts +++ b/src/features/pass-survey/model/tests/ScoresExtractor.test.ts @@ -352,6 +352,32 @@ describe('ScoresCalculator: test collectScoreForRadio', () => { }, ); + it('Should exclude report items with scoringType "score"', () => { + const { pipelineItems, answers } = getItemsAndAnswers(); + + const reportSettings: Report[] = [ + { + calculationType: 'sum', + conditionalLogic: [], + id: 'mock-report-id-1', + includedItems: ['item-radio', 'item-checkboxes'], + name: 'mock-report-name-1', + type: 'score', + scoringType: 'score', + subscaleName: 'mock-subscale-name-1', + }, + ]; + + const result: ScoreRecord[] = extractor.extract( + pipelineItems, + answers, + reportSettings, + 'mock-log-activity-name-1', + ); + + expect(result).toHaveLength(0); + }); + it("Should return 517 and flagged set to true when calculationType is 'sum' and one condition is set: equal to 517", () => { const { pipelineItems, answers } = getItemsAndAnswers(); From 2f693f727b446afb598281505c5bc69f0fbfecac Mon Sep 17 00:00:00 2001 From: sultanofcardio Date: Fri, 25 Oct 2024 09:32:49 -0500 Subject: [PATCH 5/5] Update node version in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2cce65b5f..638bc2618 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Running the app: ### 1. Prerequisites -- NodeJS `18` or higher, recommend using `asdf` or `nvm` to manage local node version +- NodeJS `20.10.0` or higher, recommend using `asdf` or `nvm` to manage local node version - Yarn 1.x - Follow steps in [React Native CLI Environment Setup](https://reactnative.dev/docs/environment-setup?guide=native), including: - Watchman