Skip to content

Commit

Permalink
Add a provider report pdf component.
Browse files Browse the repository at this point in the history
  • Loading branch information
greinard committed Feb 20, 2024
1 parent f1cc3dd commit a1c88a3
Show file tree
Hide file tree
Showing 9 changed files with 877 additions and 30 deletions.
447 changes: 421 additions & 26 deletions package-lock.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@
"@fortawesome/free-regular-svg-icons": "^6.4.2",
"@fortawesome/free-solid-svg-icons": "^6.4.2",
"@fortawesome/react-fontawesome": "^0.2.0",
"@react-pdf/renderer": "^3.3.8",
"@types/lodash": "^4.14.195",
"date-fns": "^2.28.0",
"html-react-parser": "^5.0.7",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
.mdhui-asthma-provider-report {
padding: 16px;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { AsthmaLogEntry, AsthmaParticipant } from '../../model';
import { DeviceDataPoint, SurveyAnswer } from '@careevolution/mydatahelps-js';

export type AsthmaProviderReportPreviewState = 'default';

export interface AsthmaProviderReportPreviewData {
participant: AsthmaParticipant;
logEntries: AsthmaLogEntry[];
surveyAnswers: SurveyAnswer[];
airQualityDataPoints: DeviceDataPoint[];
}

export const previewData: Record<AsthmaProviderReportPreviewState, AsthmaProviderReportPreviewData> = {
'default': {
participant: {
getFirstName: () => 'Leroy'
} as AsthmaParticipant,
logEntries: [],
surveyAnswers: [],
airQualityDataPoints: []
}
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import React from 'react';
import AsthmaProviderReport, { AsthmaProviderReportProps } from './AsthmaProviderReport';
import { Layout } from '../../../presentational';

export default {
title: 'Asthma/Components/AsthmaProviderReport',
component: AsthmaProviderReport,
parameters: {layout: 'fullscreen'}
};

interface AsthmaProviderReportStoryArgs extends AsthmaProviderReportProps {
colorScheme: 'auto' | 'light' | 'dark';
}

const render = (args: AsthmaProviderReportStoryArgs) => {
return <Layout colorScheme={args.colorScheme}>
<AsthmaProviderReport {...args} logTodayEntrySurveyName="Log Symptoms - Today"/>
</Layout>;
};

export const Default = {
args: {
colorScheme: 'auto',
previewState: 'default'
},
argTypes: {
colorScheme: {
name: 'color scheme',
control: 'radio',
options: ['auto', 'light', 'dark']
},
previewState: {
name: 'state',
control: 'radio',
options: ['loading', 'default', 'live']
}
},
render: render
};

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export { default } from './AsthmaProviderReport';
export { AsthmaProviderReportPreviewState } from './AsthmaProviderReport.previewData';
1 change: 1 addition & 0 deletions src/components/asthma/components/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ export { default as AsthmaControlStatusHeader } from './AsthmaControlStatusHeade
export { default as AsthmaLogEntryDetails, AsthmaLogEntryDetailsPreviewState } from './AsthmaLogEntryDetails';
export { default as AsthmaLogEntryHeader } from './AsthmaLogEntryHeader';
export { default as AsthmaPostEnrollmentSurveyTrigger } from './AsthmaPostEnrollmentSurveyTrigger';
export { default as AsthmaProviderReport } from './AsthmaProviderReport';
export { default as AsthmaRecommendedArticle } from './AsthmaRecommendedArticle';
26 changes: 22 additions & 4 deletions src/components/asthma/helpers/asthma-data.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import MyDataHelps, { DeviceDataPoint, DeviceDataPointQuery, DeviceDataPointsPage, DeviceInfo, PersistableDeviceDataPoint, SurveyAnswer, SurveyAnswersQuery } from '@careevolution/mydatahelps-js';
import MyDataHelps, { DeviceDataPoint, DeviceDataPointQuery, DeviceDataPointsPage, DeviceInfo, Guid, PersistableDeviceDataPoint, SurveyAnswer, SurveyAnswersQuery } from '@careevolution/mydatahelps-js';
import { add, compareDesc, endOfDay, endOfToday, formatISO, isAfter, isBefore, isToday, parseISO, startOfDay, startOfToday } from 'date-fns';
import { AsthmaActionPlan, AsthmaAirQuality, AsthmaAirQualityType, AsthmaBiometric, AsthmaBiometricType, AsthmaDataStatus, AsthmaLogEntry, AsthmaParticipant } from '../model';
import { isBloodOxygenLevelWithinRange, isDaytimeRestingHeartRateWithinRange, isNighttimeRestingHeartRateWithinRange, isRespiratoryRateWithinRange, isSleepDisturbancesWithinRange, isStepsWithinRange } from './asthma-functions';
Expand Down Expand Up @@ -174,13 +174,18 @@ const computeBiometricsForDate = (date: Date, dataPoints: DeviceDataPoint[]): As
];
};

const loadAirQualities = (observedAfter: Date, observedBefore: Date): Promise<DeviceDataPointsPage> => {
const loadAirQualities = (observedAfter: Date, observedBefore?: Date, pageID?: Guid): Promise<DeviceDataPointsPage> => {
let params: DeviceDataPointQuery = {
namespace: 'AirNowApi',
type: ['HomeAirQuality', 'WorkAirQuality'],
observedAfter: observedAfter.toISOString(),
observedBefore: observedBefore.toISOString()
observedAfter: observedAfter.toISOString()
};
if (observedBefore) {
params.observedBefore = observedBefore.toISOString();
}
if (pageID) {
params.pageID = pageID;
}
return MyDataHelps.queryDeviceData(params);
};

Expand Down Expand Up @@ -236,6 +241,8 @@ export interface AsthmaDataService {

loadAirQualitiesForDate(date: Date): Promise<AsthmaAirQuality[]>;

loadAirQualityDataPoints(fromDate: Date): Promise<DeviceDataPoint[]>;

saveLogEntry(logEntry: AsthmaLogEntry): Promise<void>;

loadAndClearAlertTakeover(): Promise<string | undefined>;
Expand Down Expand Up @@ -301,6 +308,17 @@ const service: AsthmaDataService = {
computeAirQuality('work', result.deviceDataPoints, computeAqi, 'not-found')
];
},
loadAirQualityDataPoints: async function (fromDate: Date): Promise<DeviceDataPoint[]> {
let allDataPoints: DeviceDataPoint[] = [];

let results = await loadAirQualities(fromDate);
allDataPoints = allDataPoints.concat(results.deviceDataPoints);
while (results.nextPageID) {
results = await loadAirQualities(fromDate, undefined, results.nextPageID);
allDataPoints = allDataPoints.concat(results.deviceDataPoints);
}
return allDataPoints;
},
saveLogEntry: function (logEntry: AsthmaLogEntry): Promise<void> {
let logEntryDataPoint: PersistableDeviceDataPoint = {
type: 'Asthma-LogEntry',
Expand Down

0 comments on commit a1c88a3

Please sign in to comment.