@tidepool/viz 1.53.0-web-3981-qa-feedback.1 → 1.54.0-web-4151-copy-text.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/data.js +1 -1
- package/dist/data.js.map +1 -1
- package/dist/getAGPFigures.js +1 -1
- package/dist/getAGPFigures.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/print.js +1 -1
- package/dist/print.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getAGPFigures.js","mappings":"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","sources":["webpack://@tidepool/viz/./src/modules/print/utils/AGPConstants.js","webpack://@tidepool/viz/./src/modules/print/utils/AGPUtils.js","webpack://@tidepool/viz/./src/modules/print/utils/constants.js","webpack://@tidepool/viz/./src/utils/bloodglucose.js","webpack://@tidepool/viz/./src/utils/constants.js","webpack://@tidepool/viz/./src/utils/datetime.js","webpack://@tidepool/viz/./src/utils/device.js","webpack://@tidepool/viz/./src/utils/format.js","webpack://@tidepool/viz/./src/utils/glycemicRanges.js","webpack://@tidepool/viz/./src/utils/settings/data.js","webpack://@tidepool/viz/./src/utils/stat.js","webpack://@tidepool/viz/external commonjs \"d3-array\"","webpack://@tidepool/viz/external commonjs \"d3-format\"","webpack://@tidepool/viz/external commonjs \"d3-time-format\"","webpack://@tidepool/viz/external commonjs \"i18next\"","webpack://@tidepool/viz/external commonjs \"lodash\"","webpack://@tidepool/viz/external commonjs \"moment\"","webpack://@tidepool/viz/external commonjs \"moment-timezone\"","webpack://@tidepool/viz/external commonjs \"react\"","webpack://@tidepool/viz/external commonjs \"sundial\"","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/interopRequireDefault.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/interopRequireWildcard.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/typeof.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/objectSpread2.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/regeneratorRuntime.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/slicedToArray.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack://@tidepool/viz/webpack/bootstrap","webpack://@tidepool/viz/webpack/runtime/define property getters","webpack://@tidepool/viz/webpack/runtime/hasOwnProperty shorthand","webpack://@tidepool/viz/webpack/runtime/make namespace object","webpack://@tidepool/viz/./src/utils/print/plotly.js"],"sourcesContent":["import _ from 'lodash';\nimport i18next from 'i18next';\nconst t = i18next.t.bind(i18next);\n\nimport { DPI } from './constants';\nimport { BGM_DATA_KEY, CGM_DATA_KEY, GLYCEMIC_RANGES_PRESET } from '../../../utils/constants';\n\nif (_.get(i18next, 'options.returnEmptyString') === undefined) {\n // Return key if no translation is present\n i18next.init({ returnEmptyString: false, nsSeparator: '|' });\n}\n\nexport const AGP_BG_CLAMP_MGDL = 350;\nexport const AGP_BG_CLAMP_MMOLL = 19.4;\nexport const AGP_FOOTER_Y_PADDING = DPI * 0.25;\nexport const AGP_TIR_MIN_HEIGHT = 6;\nexport const AGP_TIR_MIN_TARGET_HEIGHT = 12;\nexport const AGP_SECTION_BORDER_RADIUS = 8;\nexport const AGP_SECTION_HEADER_HEIGHT = DPI * 0.25;\nexport const AGP_SECTION_DESCRIPTION_HEIGHT = DPI * 0.25;\nexport const AGP_LOWER_QUANTILE = 0.05;\nexport const AGP_UPPER_QUANTILE = 0.95;\n\n// Preferring Helvetica instead of Arial since we don't have license and PDFkit doesn't include it\nexport const AGP_FONT_FAMILY = 'Helvetica, Arial, Sans-Serif';\n\nexport const text = {\n reportHeader: t('AGP Report:'),\n reportSubHeader: {\n [CGM_DATA_KEY]: t('Continuous Glucose Monitoring'),\n [BGM_DATA_KEY]: t('Blood Glucose Monitoring'),\n },\n reportFooter: t('Patent pending \\u2013 HealthPartners Institute dba International Diabetes Center \\u2013 All Rights Reserved. \\u00A92022'),\n reportInsuffienctData: t('Insufficient data to generate an AGP Report.'),\n percentInRanges: {\n title: {\n [CGM_DATA_KEY]: t('Time in Ranges'),\n [BGM_DATA_KEY]: t('Percent BGM Readings'),\n },\n subtitle: {\n [CGM_DATA_KEY]: {\n [GLYCEMIC_RANGES_PRESET.ADA_STANDARD]: t('Goals for Type 1 and Type 2 Diabetes'),\n [GLYCEMIC_RANGES_PRESET.ADA_OLDER_HIGH_RISK]: t('Goals for Older/High Risk (Type 1 and 2)'),\n [GLYCEMIC_RANGES_PRESET.ADA_PREGNANCY_T1]: t('Goals for Pregnancy (Type 1)'),\n [GLYCEMIC_RANGES_PRESET.ADA_GESTATIONAL_T2]: t('Goals for Pregnancy (Gestational and Type 2)'),\n PWD_SELF_DEFINED: '', // No goals for PwD self-defined ranges\n },\n [BGM_DATA_KEY]: {\n [GLYCEMIC_RANGES_PRESET.ADA_STANDARD]: '',\n [GLYCEMIC_RANGES_PRESET.ADA_OLDER_HIGH_RISK]: t('Older/High Risk'),\n [GLYCEMIC_RANGES_PRESET.ADA_PREGNANCY_T1]: t('Pregnancy'),\n [GLYCEMIC_RANGES_PRESET.ADA_GESTATIONAL_T2]: t('Pregnancy'),\n PWD_SELF_DEFINED: '', // No goals for PwD self-defined ranges\n }\n },\n },\n reportInfo: {\n dob: t('DOB:'),\n mrn: t('MRN:'),\n },\n glucoseMetrics: {\n [CGM_DATA_KEY]: {\n title: t('Glucose metrics'),\n averageGlucose: {\n label: t('Average Glucose'),\n goal: {\n mgdl: t('Goal: <154 mg/dL'),\n mmoll: t('Goal: <8.6 mmol/L'),\n },\n },\n coefficientOfVariation: {\n label: t('Glucose Variability'),\n subLabel: t('Defined as percent coefficient of variation'),\n goal: t('Goal: <=36%'), // \\u2264 unicode symbol not available in Helvetica, and we don't own license for Arial\n },\n glucoseManagementIndicator: {\n label: t('Glucose Management Indicator (GMI)'),\n goal: t('Goal: <7%'),\n },\n },\n [BGM_DATA_KEY]: {\n title: t('BGM Statistics'),\n averageGlucose: {\n label: t('Average Glucose'),\n },\n bgExtents: {\n label: t('Lowest/Highest Glucose'),\n },\n coefficientOfVariation: {\n label: t('Glucose Variability'),\n subLabel: t('Defined as percent coefficient of variation'),\n goal: t('Goal: <=36%'), // \\u2264 unicode symbol not available in Helvetica, and we don't own license for Arial\n },\n dailyReadingsInRange: {\n label: t('Average Readings/Day'),\n },\n readingsInRange: {\n label: t('Number of Readings'),\n },\n },\n },\n ambulatoryGlucoseProfile: {\n [CGM_DATA_KEY]: {\n title: t('Ambulatory Glucose Profile (AGP)'),\n description: t('AGP is a summary of glucose values from the report period, with median (50%) and other percentiles shown as if they occurred in a single day.'),\n targetRange: t('Target<br>Range'),\n insufficientData: t('Insufficient CGM data to generate AGP graph'),\n },\n [BGM_DATA_KEY]: {\n title: t('Ambulatory Glucose Profile (AGP)'),\n insufficientDataTitle: t('Modal Day BGM Values Graph'),\n description: t('AGP is a summary of glucose values from the report period, with median (50%) and other percentiles shown as if they occurred in a single day.'),\n targetRange: t('Target<br>Range'),\n insufficientData: t('Insufficient glucose data to generate AGP'),\n },\n },\n dailyGlucoseProfiles: {\n [CGM_DATA_KEY]: {\n title: t('Daily Glucose Profiles'),\n description: t('Each daily profile represents a midnight-to-midnight period.'),\n },\n [BGM_DATA_KEY]: {\n title: t('Daily Glucose Profiles'),\n description: t('Each daily profile represents a midnight-to-midnight period. The more readings available throughout the day, the more opportunities for improvement.'),\n },\n },\n bgRanges: {\n veryHigh: t('Very High'),\n high: t('High'),\n target: t('Target'),\n low: t('Low'),\n veryLow: t('Very Low'),\n },\n goals: {\n [GLYCEMIC_RANGES_PRESET.ADA_STANDARD]: {\n veryHigh: t('Goal: <5%'),\n highCombined: t('Goal: <25%'),\n target: t('Goal: >70%'),\n lowCombined: t('Goal: <4%'),\n veryLow: t('Goal: <1%'),\n },\n [GLYCEMIC_RANGES_PRESET.ADA_OLDER_HIGH_RISK]: {\n veryHigh: t('Goal: <10%'),\n highCombined: t('Goal: <50%'),\n target: t('Goal: >50%'),\n lowCombined: t('Goal: <1%'),\n // veryLow: undefined,\n },\n [GLYCEMIC_RANGES_PRESET.ADA_PREGNANCY_T1]: {\n // veryHigh: undefined,\n highCombined: t('Goal: <25%'),\n target: t('Goal: >70%'),\n lowCombined: t('Goal: <4%'),\n veryLow: t('Goal: <1%'),\n },\n [GLYCEMIC_RANGES_PRESET.ADA_GESTATIONAL_T2]: {\n // veryHigh: undefined,\n highCombined: t('Goal: n/a'),\n target: t('Goal: n/a'),\n lowCombined: t('Goal: n/a'),\n veryLow: t('Goal: n/a'),\n },\n PWD_SELF_DEFINED: {\n veryHigh: t('Goal: n/a'),\n highCombined: t('Goal: n/a'),\n target: t('Goal: n/a'),\n lowCombined: t('Goal: n/a'),\n veryLow: t('Goal: n/a'),\n }\n },\n subLabels: {\n TIRtarget: t('Each 5% increase is clinically beneficial'),\n TIRminutes: t('Each 1% time in range = about 15 minutes'),\n },\n};\n\nexport const fontSizes = {\n reportHeader: 14,\n reportSubHeader: 14,\n reportFooter: 7,\n reportInfo: {\n default: 10,\n label: 8,\n },\n section: {\n title: 9,\n subtitle: 8,\n description: 7,\n insufficientData: 7,\n },\n percentInRanges: {\n values: 9,\n ticks: 7,\n summaries: 12,\n goals: 7,\n subLabels: 7,\n },\n glucoseMetrics: {\n values: 12,\n bgUnits: 8,\n labels: 9,\n subLabels: 8,\n subStats: 8,\n goals: 8,\n },\n ambulatoryGlucoseProfile: {\n hourlyTicks: 7,\n bgTicks: 9,\n percentileTicks: 8,\n bgUnits: 7,\n targetRange: 9,\n },\n dailyGlucoseProfiles: {\n bgTicks: 7,\n bgUnits: 7,\n timeTicks: 7,\n weekdayTicks: 8,\n calendarDates: 8,\n },\n};\n\nconst black = '#000000';\nconst white = '#FFFFFF';\nconst lightGrey = '#D9D9D9';\nconst mediumGrey = '#7A7A7A';\nconst darkGrey = '#626267';\n\nexport const colors = {\n text: {\n reportHeader: '#522398',\n label: darkGrey,\n reportFooter: black,\n section: {\n title: black,\n subtitle: darkGrey,\n description: black,\n insufficientData: black,\n },\n reportInfo: black,\n calendarDates: darkGrey,\n goals: {\n veryHigh: darkGrey,\n highCombined: mediumGrey,\n target: mediumGrey,\n lowCombined: mediumGrey,\n veryLow: darkGrey,\n glucoseMetrics: darkGrey,\n },\n subLabels: {\n TIRtarget: darkGrey,\n TIRminutes: black,\n glucoseMetrics: darkGrey,\n },\n subStats: {\n glucoseMetrics: black,\n },\n ticks: {\n bg: darkGrey,\n dailyProfileBg: black,\n hour: darkGrey,\n percentile: darkGrey,\n },\n },\n line: {\n default: darkGrey,\n ticks: lightGrey,\n range: {\n target: '#00AA51',\n dailyProfileTarget: black,\n default: lightGrey,\n divider: white,\n },\n },\n white,\n black,\n lightGrey,\n mediumGrey,\n darkGrey,\n background: {\n shaded: lightGrey,\n },\n bgRange: {\n veryLow: '#CC0019',\n low: '#FF0000',\n lowShaded: '#FF8080',\n target: '#0BAD5A',\n high: '#FFBF00',\n highShaded: '#FFD180',\n veryHigh: '#FF6900',\n empty: darkGrey,\n },\n bgReadings: {\n veryLow: '#A30014',\n low: '#F20000',\n target: '#14B85C',\n high: '#FFA600',\n veryHigh: '#FF6900',\n },\n ambulatoryGlucoseProfile: {\n median: {\n veryLow: '#A30014',\n low: '#FF0000',\n target: '#00AA51',\n high: '#FFA600',\n veryHigh: '#FF7538',\n },\n interQuartile: {\n veryLow: '#A30014',\n low: '#FF0000',\n target: '#8BCD9E',\n high: '#FFC966',\n veryHigh: '#FFB380',\n },\n outerQuantile: {\n veryLow: '#A30014',\n low: '#FF8080',\n target: '#BEE1C6',\n high: '#FFE6B3',\n veryHigh: '#FFD9BF',\n },\n },\n dailyGlucoseProfiles: {\n low: {\n line: '#FF0000',\n fill: '#FF8080',\n },\n target: {\n line: '#00AA51',\n fill: lightGrey,\n },\n high: {\n line: '#FFA600',\n fill: '#FFD180',\n },\n },\n};\n\nexport default {\n text,\n colors\n};\n","import _ from 'lodash';\n\nimport {\n AGP_BG_CLAMP_MGDL,\n AGP_BG_CLAMP_MMOLL,\n AGP_FONT_FAMILY,\n AGP_FOOTER_Y_PADDING,\n AGP_LOWER_QUANTILE,\n AGP_SECTION_BORDER_RADIUS,\n AGP_SECTION_DESCRIPTION_HEIGHT,\n AGP_SECTION_HEADER_HEIGHT,\n AGP_TIR_MIN_HEIGHT,\n AGP_TIR_MIN_TARGET_HEIGHT,\n AGP_UPPER_QUANTILE,\n colors,\n fontSizes,\n text,\n} from './AGPConstants';\n\nimport { DPI, MARGINS, WIDTH, HEIGHT } from './constants';\nimport { bankersRound, formatBgValue, formatPercentage } from '../../../utils/format';\nimport { ONE_HR, getTimezoneFromTimePrefs } from '../../../utils/datetime';\nimport { classifyBgValue, mungeBGDataBins } from '../../../utils/bloodglucose';\nimport { getGlycemicRangesPreset } from '../../../utils/glycemicRanges';\nimport { reconcileTIRPercentages } from '../../../utils/stat';\nimport {\n MGDL_UNITS,\n MS_IN_DAY,\n MS_IN_HOUR,\n BGM_DATA_KEY,\n CGM_DATA_KEY,\n ADA_STANDARD_BG_BOUNDS,\n GLYCEMIC_RANGES_PRESET,\n} from '../../../utils/constants';\nimport moment from 'moment';\n\nexport const boldText = textString => `<b>${String(textString)}</b>`;\nexport const chartScaleToPixels = (paperPixelDimension, scaleValue) => scaleValue * paperPixelDimension;\nexport const pixelsToChartScale = (paperPixelDimension, pixels) => pixels / paperPixelDimension;\nexport const pointsToPixels = points => points * 0.75;\n\nexport const createAnnotation = options => {\n const annotation = _.defaultsDeep(options, {\n arrowside: 'none',\n font: {\n color: colors.black,\n family: AGP_FONT_FAMILY,\n },\n showarrow: false,\n });\n\n return annotation;\n};\n\nexport const calculateCGMDataSufficiency = (data = {}) => {\n const { statsByDate } = data.data?.current?.aggregationsByDate;\n const { newestDatum, bgDaysWorn } = data.data?.current?.stats?.bgExtents || {};\n\n const {\n count,\n sampleInterval,\n sensorUsageAGP,\n } = data.data?.current?.stats?.sensorUsage || {};\n\n const sufficiencyBySection = {\n ambulatoryGlucoseProfile: true,\n dailyGlucoseProfiles: true,\n glucoseMetrics: true,\n percentInRanges: true,\n };\n\n const hoursOfCGMData = (count * sampleInterval) / MS_IN_HOUR;\n\n if (hoursOfCGMData < 24) {\n // Show nothing if <24 hours total cgm time\n return {\n ambulatoryGlucoseProfile: false,\n dailyGlucoseProfiles: false,\n glucoseMetrics: false,\n percentInRanges: false,\n };\n } else if (hoursOfCGMData === 24) {\n // Hide agp if only 24 hours total cgm time, but show other sections conditional on sufficiency\n const sufficencyMet = sensorUsageAGP >= 70;\n\n return {\n ambulatoryGlucoseProfile: false,\n dailyGlucoseProfiles: sufficencyMet,\n glucoseMetrics: sufficencyMet,\n percentInRanges: sufficencyMet,\n };\n }\n\n const cgmCalendarDays = _.map(_.range(_.max([bgDaysWorn, 7])), (val, index) => (\n moment.utc(newestDatum.time).tz(getTimezoneFromTimePrefs(data.timePrefs)).subtract(index, 'days').format('YYYY-MM-DD')\n )).reverse();\n\n const sensorUsageByDate = _.map(cgmCalendarDays, (date, index) => {\n const {\n count: countForDate,\n sampleInterval: sampleFrequencyForDate,\n } = statsByDate[date]?.sensorUsage || {};\n\n const {\n newestDatum: newestDatumForDate = {},\n oldestDatum: oldestDatumForDate = {},\n } = statsByDate[date]?.bgExtents || {};\n\n if (!sampleFrequencyForDate || !countForDate) {\n return { sufficiencyMet: false, sensorUsage: 0 };\n }\n\n const minCount = MS_IN_HOUR / sampleFrequencyForDate;\n\n let maxPossibleReadings = 0;\n if (index === 0) {\n maxPossibleReadings = bankersRound((MS_IN_DAY - oldestDatumForDate.msPer24) / sampleFrequencyForDate);\n } else if (index === cgmCalendarDays.length - 1) {\n maxPossibleReadings = bankersRound(newestDatumForDate.msPer24 / sampleFrequencyForDate);\n } else {\n maxPossibleReadings = bankersRound(MS_IN_DAY / sampleFrequencyForDate);\n }\n\n const sensorUsage = maxPossibleReadings > 0 ? countForDate / maxPossibleReadings * 100 : 0;\n const sufficiencyMet = countForDate >= minCount;\n\n return ({ count: countForDate, date, maxPossibleReadings, sensorUsage, sufficiencyMet });\n });\n\n // AGP section requires that each day in the top 7 have at least an hour of data, and an average\n // sensore usage of 70%\n const sufficientDays = _.filter(sensorUsageByDate, { sufficiencyMet: true });\n const topSevenSufficientDays = _.slice(_.orderBy(sufficientDays, ['sensorUsage'], ['desc']), 0, 7);\n\n if (topSevenSufficientDays.length < 7) {\n sufficiencyBySection.ambulatoryGlucoseProfile = false;\n } else {\n const topSevenDaysSensorUsageMean = _.meanBy(topSevenSufficientDays, 'sensorUsage');\n sufficiencyBySection.ambulatoryGlucoseProfile = topSevenDaysSensorUsageMean >= 70;\n }\n\n return sufficiencyBySection;\n};\n\nexport const calculateBGMDataSufficiency = (data = {}) => {\n const totalReadings = data.data?.current?.data?.smbg?.length || 0;\n\n const sufficiencyBySection = {\n ambulatoryGlucoseProfile: totalReadings >= 30,\n dailyGlucoseProfiles: totalReadings > 0,\n glucoseMetrics: totalReadings > 0,\n percentInRanges: totalReadings > 0,\n };\n\n return sufficiencyBySection;\n};\n\nexport const generateChartSections = (data, bgSource) => {\n const reportInfoAndMetricsWidth = DPI * 3.375;\n const chartRenderAreaTop = DPI * 0.75;\n const rightEdge = MARGINS.left + WIDTH;\n const bottomEdge = MARGINS.top + HEIGHT;\n const chartRenderAreaBottom = bottomEdge - (DPI * 0.75 - MARGINS.bottom);\n const sectionGap = DPI * 0.25;\n const sections = {};\n const dataSufficiency = bgSource === CGM_DATA_KEY\n ? calculateCGMDataSufficiency(data)\n : calculateBGMDataSufficiency(data);\n\n const glycemicRangesPreset = getGlycemicRangesPreset(data.query?.glycemicRanges);\n\n sections.percentInRanges = {\n bgSource,\n x: MARGINS.left,\n y: chartRenderAreaTop,\n width: DPI * 3.875,\n height: DPI * 3,\n bordered: true,\n text: {\n title: text.percentInRanges.title[bgSource],\n subtitle: text.percentInRanges.subtitle[bgSource][glycemicRangesPreset]\n },\n sufficientData: dataSufficiency.percentInRanges,\n };\n\n sections.reportInfo = {\n bgSource,\n x: rightEdge - reportInfoAndMetricsWidth,\n y: chartRenderAreaTop,\n width: reportInfoAndMetricsWidth,\n height: DPI * (bgSource === CGM_DATA_KEY ? 0.875 : 0.55),\n text: text.reportInfo,\n };\n\n sections.glucoseMetrics = {\n bgSource,\n x: rightEdge - reportInfoAndMetricsWidth,\n y: sections.reportInfo.y + sections.reportInfo.height + sectionGap,\n width: reportInfoAndMetricsWidth,\n height: DPI * (bgSource === CGM_DATA_KEY ? 1.875 : 2.2),\n bordered: true,\n text: text.glucoseMetrics[bgSource],\n sufficientData: dataSufficiency.glucoseMetrics,\n };\n\n sections.ambulatoryGlucoseProfile = {\n bgSource,\n x: MARGINS.left,\n y: DPI * 4,\n width: WIDTH,\n height: DPI * 3.5,\n bordered: true,\n text: text.ambulatoryGlucoseProfile[bgSource],\n sufficientData: dataSufficiency.ambulatoryGlucoseProfile,\n };\n\n const dailyGlucoseProfilesHeight = DPI * 2.25;\n sections.dailyGlucoseProfiles = {\n bgSource,\n x: MARGINS.left,\n y: chartRenderAreaBottom - dailyGlucoseProfilesHeight - AGP_FOOTER_Y_PADDING,\n width: WIDTH,\n height: dailyGlucoseProfilesHeight,\n bordered: true,\n text: text.dailyGlucoseProfiles[bgSource],\n sufficientData: dataSufficiency.dailyGlucoseProfiles,\n };\n\n return sections;\n};\n\n/**\n * Generates the Plotly figure for the AGP Time In Ranges chart\n * @param {*} section\n * @param {*} stat\n * @param {*} bgPrefs\n * @param {*} glycemicRanges\n * @returns\n */\nexport const generatePercentInRangesFigure = (\n section,\n stat,\n bgPrefs,\n glycemicRanges\n) => {\n // Set chart plot within section borders\n const chartAreaWidth = section.width - 2;\n const chartAreaHeight = section.height - 2 - DPI * 0.25 - AGP_SECTION_BORDER_RADIUS;\n const plotMarginX = DPI * 0.5;\n const plotMarginTop = DPI * 0.425;\n const plotMarginBottom = DPI * 0.3;\n const paperWidth = chartAreaWidth - (plotMarginX * 2);\n const paperHeight = chartAreaHeight - (plotMarginTop + plotMarginBottom);\n const barWidth = DPI * 0.35;\n const barSeparatorPixelWidth = 2;\n const yScale = pixelsToChartScale.bind(null, paperHeight);\n const xScale = pixelsToChartScale.bind(null, paperWidth);\n\n const hasVeryLow = _.isNumber(bgPrefs?.bgBounds?.veryLowThreshold);\n const hasVeryHigh = _.isNumber(bgPrefs?.bgBounds?.veryHighThreshold);\n\n const statTotal = _.get(stat, 'data.raw.counts.total', 0);\n if (section.sufficientData) {\n const rawCounts = _.get(stat, 'data.raw.counts', {});\n\n const statDatums = _.filter([\n hasVeryLow && { id: 'veryLow', value: rawCounts.veryLow },\n { id: 'low', value: rawCounts.low },\n { id: 'target', value: rawCounts.target },\n { id: 'high', value: rawCounts.high },\n hasVeryHigh && { id: 'veryHigh', value: rawCounts.veryHigh },\n ], Boolean);\n\n const chartData = _.reduce(statDatums, (res, datum, i) => {\n const value = _.toNumber(datum.value) / statTotal * 1;\n const minHeight = datum.id === 'target' ? AGP_TIR_MIN_TARGET_HEIGHT : AGP_TIR_MIN_HEIGHT;\n const renderedValue = _.max([value, minHeight / 100]);\n res.rawById[datum.id] = value;\n res.raw.push(value);\n res.rendered.push(renderedValue);\n res.ticks.push((res.ticks[i - 1] || 0) + renderedValue);\n return res;\n }, { rawById: {}, raw: [], rendered: [], ticks: [] });\n\n // Needs y-scale correction since we may exceed y domain limits due to minimum bar height\n const yScaleCorrection = 1 / _.last(chartData.ticks);\n chartData.rendered = _.map(chartData.rendered, value => value * yScaleCorrection);\n chartData.ticks = _.map(chartData.ticks, value => value * yScaleCorrection);\n\n const data = _.map(statDatums, (datum, index) => ({\n x: [stat.id],\n y: [chartData.rendered[index]],\n name: datum.id,\n type: 'bar',\n width: barWidth / paperWidth * 2,\n marker: {\n color: _.toNumber(datum.value) > 0 ? colors.bgRange[datum.id] : colors.bgRange.empty,\n line: {\n color: colors.line.range.divider,\n width: barSeparatorPixelWidth,\n },\n },\n }));\n\n const tickYPos = (() => {\n const ticks = [...chartData.ticks];\n\n if (!hasVeryLow) ticks.unshift(0); // if no veryLow, low range stretches to the bottom\n\n if (!hasVeryHigh) ticks.push(1); // if no veryHigh, high range to stretches to the top\n\n return {\n veryLowThreshold: ticks[0],\n targetLowerBound: ticks[1],\n targetUpperBound: ticks[2],\n veryHighThreshold: ticks[3],\n max: ticks[4]\n };\n })();\n\n /* eslint-disable lodash/prefer-lodash-method */\n const bgTicks = [\n hasVeryLow && bgPrefs?.bgBounds?.veryLowThreshold,\n bgPrefs.bgBounds.targetLowerBound,\n bgPrefs.bgBounds.targetUpperBound,\n hasVeryHigh && bgPrefs?.bgBounds?.veryHighThreshold,\n bgPrefs?.bgUnits,\n ]\n .filter(Boolean)\n .map((tick, index, arr) => createAnnotation({\n align: 'right',\n font: {\n size: fontSizes.percentInRanges.ticks,\n },\n text: (index === arr.length - 1) // bgUnits label\n ? boldText(tick)\n : boldText(formatBgValue(tick, bgPrefs, undefined)),\n x: 0,\n xanchor: 'right',\n xshift: -2,\n y: (index === arr.length - 1) // bgUnits label\n ? tickYPos.targetLowerBound + ((tickYPos.targetUpperBound - tickYPos.targetLowerBound) / 2)\n : chartData.ticks[index],\n yanchor: 'middle',\n }));\n /* eslint-enable lodash/prefer-lodash-method */\n\n /* eslint-disable no-param-reassign */\n const getBracketPosValues = (name, posX, posX2, posY, posY2) => {\n const minBracketYOffSet = yScale(13);\n\n if (_.isNumber(posY2)) {\n const maxSubBracketYOffset = yScale(24);\n if (posY - posY2 < minBracketYOffSet) posY2 = posY - minBracketYOffSet;\n const subBracketXOffset = (posX2 - posX) / 2;\n const subBracketYOffset = _.min([(posY - posY2) / 2, maxSubBracketYOffset]);\n\n return {\n posX,\n posX2,\n posY,\n posY2,\n subBracketXOffset,\n subBracketYOffset,\n };\n }\n\n // If only a single Ypos is passed when:\n // -- Target bracket\n // -- Low bracket if veryLow range does not exist\n // -- High bracket if veryHigh range does not exist\n\n // If Target, we need to ensure it's not too close to the range extents to avoid potential crowding\n if (name === 'TARGET') {\n const targetBracketAllowedYRange = [\n yScale(AGP_TIR_MIN_TARGET_HEIGHT),\n 1 - (yScale(AGP_TIR_MIN_TARGET_HEIGHT)),\n ];\n\n if (posY < targetBracketAllowedYRange[0]) posY = targetBracketAllowedYRange[0];\n if (posY > targetBracketAllowedYRange[1]) posY = targetBracketAllowedYRange[1];\n }\n\n return { posX, posX2, posY };\n };\n /* eslint-enable no-param-reassign */\n\n const createBracketSVG = (pos) => {\n const {\n posX,\n posX2,\n posY,\n posY2,\n subBracketXOffset,\n subBracketYOffset,\n } = pos;\n\n if (_.isNumber(posY2)) {\n const radiusX = xScale(5);\n const radiusY = yScale(5);\n\n return [\n `M ${posX} ${posY}`,\n `H ${posX + subBracketXOffset - radiusX}`,\n `Q ${posX + subBracketXOffset} ${posY} ${posX + subBracketXOffset} ${posY - radiusY}`,\n `V ${posY2 + radiusY}`,\n `Q ${posX + subBracketXOffset} ${posY2} ${posX + subBracketXOffset - radiusX} ${posY2}`,\n `H ${posX}`,\n `M ${posX + subBracketXOffset} ${posY2 + subBracketYOffset}`,\n `H ${posX2}`,\n ].join(' ');\n }\n\n return [\n `M ${posX} ${posY}`,\n `H ${posX2}`,\n ].join(' ');\n };\n\n const bracketYPos = {\n veryLow: yScale(-11),\n low: tickYPos.veryLowThreshold,\n target: tickYPos.targetLowerBound + ((tickYPos.targetUpperBound - tickYPos.targetLowerBound) / 2),\n high: tickYPos.targetUpperBound + ((tickYPos.veryHighThreshold - tickYPos.targetUpperBound) / 2),\n veryHigh: tickYPos.max,\n };\n\n const bracketXExtents = [xScale(barWidth + 5), xScale(paperWidth - barWidth)];\n\n const bracketPos = {\n low: (\n hasVeryLow\n ? getBracketPosValues('LOW', ...bracketXExtents, bracketYPos.low, bracketYPos.veryLow)\n : getBracketPosValues('LOW', ...bracketXExtents, bracketYPos.low)\n ),\n\n target: getBracketPosValues('TARGET', ...bracketXExtents, bracketYPos.target),\n\n high: (\n hasVeryHigh\n ? getBracketPosValues('HIGH', ...bracketXExtents, bracketYPos.veryHigh, bracketYPos.high)\n : getBracketPosValues('HIGH', ...bracketXExtents, bracketYPos.high)\n ),\n };\n\n const brackets = _.map(_.values(bracketPos), pos => ({\n type: 'path',\n path: createBracketSVG(pos),\n line: { color: colors.line.default, width: 0.5 },\n yref: 'paper',\n }));\n\n const createLeaderSVG = (posX, posX2, posY, posY2) => {\n const isLowLeader = posY > posY2;\n const radiusX = xScale(5);\n const radiusY = isLowLeader ? yScale(-5) : yScale(5);\n\n return [\n `M ${posX} ${posY}`,\n `V ${posY2 - radiusY}`,\n `Q ${posX} ${posY2} ${posX + radiusX} ${posY2}`,\n `H ${posX2}`,\n ].join(' ');\n };\n\n const leaderYPos = [\n // Very Low Leader\n 0,\n bracketPos.low.posY2 + yScale(6),\n\n // Very High Leader\n 1,\n bracketPos.high.posY + yScale(6),\n ];\n\n const leaderXExtents = [xScale(barWidth / 2), xScale(barWidth + 2)];\n\n const leaderPos = _.filter([\n (hasVeryLow && [...leaderXExtents, ...leaderYPos.slice(0, 2)]),\n (hasVeryHigh && [...leaderXExtents, ...leaderYPos.slice(2)]),\n ], Boolean);\n\n const leaders = _.map(leaderPos, pos => ({\n type: 'path',\n path: createLeaderSVG(...pos),\n line: { color: colors.black, width: 0.5 },\n yref: 'paper',\n }));\n\n const rangePosY = {\n veryLow: bracketPos.low.posY2,\n low: bracketPos.low.posY,\n target: bracketPos.target.posY,\n high: hasVeryHigh ? bracketPos.high.posY2 : bracketPos.high.posY,\n veryHigh: bracketPos.high.posY,\n };\n\n const rangePosYOrderedKeys = _.filter([\n hasVeryLow && 'veryLow',\n 'low',\n 'target',\n 'high',\n hasVeryHigh && 'veryHigh',\n ], Boolean);\n\n const rangeLabels = _.map(rangePosYOrderedKeys, range => createAnnotation({\n align: 'left',\n font: {\n size: fontSizes.percentInRanges.values,\n },\n text: boldText(text.bgRanges[range]),\n x: bracketXExtents[0],\n xanchor: 'left',\n xshift: -1,\n y: rangePosY[range],\n yanchor: 'bottom',\n yref: 'paper',\n yshift: -1,\n }));\n\n const rangeValuesOrderedKeys = _.filter([\n hasVeryLow && 'veryLow',\n hasVeryLow && 'low',\n hasVeryHigh && 'high',\n hasVeryHigh && 'veryHigh',\n ], Boolean);\n\n const timeInRanges = reconcileTIRPercentages(chartData.rawById);\n\n const rangeValues = _.map(rangeValuesOrderedKeys, range => createAnnotation({\n align: 'right',\n font: {\n size: fontSizes.percentInRanges.values,\n },\n text: boldText(formatPercentage(timeInRanges[range], 0, true)),\n x: bracketXExtents[0] + (bracketXExtents[1] - bracketXExtents[0]) / 2,\n xanchor: 'right',\n xshift: -4,\n y: rangePosY[range],\n yanchor: 'bottom',\n yref: 'paper',\n yshift: -1,\n }));\n\n const rangeSummaryPosY = {\n low: hasVeryLow ? (bracketPos.low.posY2 + bracketPos.low.subBracketYOffset) : bracketPos.low.posY,\n target: bracketPos.target.posY,\n high: hasVeryHigh ? (bracketPos.high.posY2 + bracketPos.high.subBracketYOffset) : bracketPos.high.posY,\n };\n\n const combinedRangeSummaryValues = {\n low: (timeInRanges.veryLow || 0) + timeInRanges.low,\n target: timeInRanges.target,\n high: (timeInRanges.veryHigh || 0) + timeInRanges.high,\n };\n\n const rangeSummaryOrderedKeys = [\n 'low',\n 'target',\n 'high',\n ];\n\n const rangeSummaryValues = _.map(rangeSummaryOrderedKeys, range => createAnnotation({\n align: 'left',\n font: {\n size: fontSizes.percentInRanges.summaries,\n },\n text: boldText(formatPercentage(combinedRangeSummaryValues[range], 0, true)),\n x: bracketXExtents[0] + (bracketXExtents[1] - bracketXExtents[0]) / 2,\n xanchor: 'left',\n xshift: section.bgSource === CGM_DATA_KEY ? 3 : 28,\n y: rangeSummaryPosY[range],\n yanchor: 'bottom',\n yref: 'paper',\n yshift: -2,\n }));\n\n const goalsPos = {\n veryLow: {\n x: bracketXExtents[0],\n xanchor: 'left',\n xshift: -1,\n y: bracketPos.low.posY2,\n yshift: -11,\n },\n lowCombined: {\n x: bracketXExtents[1],\n xanchor: 'right',\n xshift: 5,\n y: hasVeryLow ? (bracketPos.low.posY2 + bracketPos.low.subBracketYOffset) : bracketPos.low.posY,\n yshift: 0,\n },\n target: {\n x: bracketXExtents[1],\n xanchor: 'right',\n xshift: 5,\n y: bracketPos.target.posY,\n yshift: 0,\n },\n highCombined: {\n x: bracketXExtents[1],\n xanchor: 'right',\n xshift: 5,\n y: hasVeryHigh ? (bracketPos.high.posY2 + bracketPos.high.subBracketYOffset) : bracketPos.high.posY,\n yshift: 0,\n },\n veryHigh: {\n x: bracketXExtents[0],\n xanchor: 'left',\n xshift: -1,\n y: bracketPos.high.posY,\n yshift: 9,\n },\n };\n\n const glycemicRangesPreset = getGlycemicRangesPreset(glycemicRanges);\n\n // User is viewing a PwD self-defined range if glycemicRanges is set to ADA Standard,\n // but targetLowerBound or targetUpperBound do not match those of the ADA Standard\n const isPwdSelfDefinedRange = (\n glycemicRangesPreset === GLYCEMIC_RANGES_PRESET.ADA_STANDARD && (\n ADA_STANDARD_BG_BOUNDS[(bgPrefs.bgUnits || MGDL_UNITS)].veryLowThreshold !== bgPrefs.bgBounds?.veryLowThreshold ||\n ADA_STANDARD_BG_BOUNDS[(bgPrefs.bgUnits || MGDL_UNITS)].targetLowerBound !== bgPrefs.bgBounds?.targetLowerBound ||\n ADA_STANDARD_BG_BOUNDS[(bgPrefs.bgUnits || MGDL_UNITS)].targetUpperBound !== bgPrefs.bgBounds?.targetUpperBound ||\n ADA_STANDARD_BG_BOUNDS[(bgPrefs.bgUnits || MGDL_UNITS)].veryHighThreshold !== bgPrefs.bgBounds?.veryHighThreshold\n )\n );\n\n const goalGlycemicRangesKey = isPwdSelfDefinedRange ? 'PWD_SELF_DEFINED' : glycemicRangesPreset;\n\n // if PwD self-defined range, show goal for every stat; otherwise show only goals that exist\n const goalsOrderedKeys = _.filter([\n 'veryLow',\n 'lowCombined',\n 'target',\n 'highCombined',\n 'veryHigh',\n ], range => !!text.goals[goalGlycemicRangesKey][range]);\n\n const goals = _.map(goalsOrderedKeys, range => createAnnotation({\n align: 'left',\n font: {\n color: colors.text.goals[range],\n size: fontSizes.percentInRanges.goals,\n },\n text: text.goals[goalGlycemicRangesKey][range],\n yanchor: 'bottom',\n yref: 'paper',\n ...goalsPos[range],\n }));\n\n const subLabelsPos = {\n TIRtarget: {\n x: xScale(paperWidth),\n xanchor: 'right',\n xref: 'paper',\n xshift: plotMarginX - 15,\n y: bracketPos.target.posY,\n yshift: -12,\n },\n TIRminutes: {\n x: xScale(paperWidth),\n xanchor: 'right',\n xref: 'paper',\n xshift: plotMarginX - 7,\n y: hasVeryLow ? bracketPos.low.posY2 : bracketPos.low.posY - 0.05,\n yshift: -12,\n },\n };\n\n const subLabelsOrderedKeys = [\n 'TIRtarget',\n 'TIRminutes',\n ];\n\n const subLabels = _.map(subLabelsOrderedKeys, label => createAnnotation({\n align: 'left',\n font: {\n color: colors.text.subLabels[label],\n size: fontSizes.percentInRanges.subLabels,\n },\n text: text.subLabels[label],\n yanchor: 'bottom',\n yref: 'paper',\n ...subLabelsPos[label],\n }));\n\n const rangeAnnotations = {\n veryLow: [\n rangeLabels[0],\n rangeValues[0],\n section.bgSource === CGM_DATA_KEY && goals[0],\n ],\n low: [\n rangeLabels[1],\n rangeValues[1],\n ],\n lowSummary: [\n rangeSummaryValues[0],\n section.bgSource === CGM_DATA_KEY && goals[1],\n ],\n target: [\n rangeLabels[2],\n rangeSummaryValues[1],\n section.bgSource === CGM_DATA_KEY && goals[2],\n section.bgSource === CGM_DATA_KEY && subLabels[0],\n ],\n high: [\n rangeLabels[3],\n rangeValues[2],\n ],\n veryHigh: [\n rangeLabels[4],\n rangeValues[3],\n section.bgSource === CGM_DATA_KEY && goals[4],\n ],\n highSummary: [\n rangeSummaryValues[2],\n section.bgSource === CGM_DATA_KEY && goals[3],\n ],\n };\n\n const layout = {\n barmode: 'stack',\n width: chartAreaWidth,\n height: chartAreaHeight,\n showlegend: false,\n\n margin: {\n l: plotMarginX,\n r: plotMarginX,\n b: plotMarginBottom,\n t: plotMarginTop,\n },\n\n xaxis: {\n range: [0, 1],\n showgrid: false,\n showline: false,\n showticklabels: false,\n zeroline: false,\n },\n\n yaxis: {\n range: [0, 1],\n showgrid: false,\n showline: false,\n showticklabels: false,\n zeroline: false,\n },\n\n annotations: [\n ...bgTicks,\n ...rangeAnnotations.veryHigh,\n ...rangeAnnotations.high,\n ...rangeAnnotations.highSummary,\n ...rangeAnnotations.target,\n ...rangeAnnotations.low,\n ...rangeAnnotations.veryLow,\n ...rangeAnnotations.lowSummary,\n section.bgSource === CGM_DATA_KEY && subLabels[1],\n ],\n\n shapes: [\n ...brackets,\n ...leaders,\n ],\n };\n\n const figure = { data, layout };\n return figure;\n }\n\n return null;\n};\n\nexport const generateAmbulatoryGlucoseProfileFigure = (section, bgData, bgPrefs, bgSource) => {\n // Set chart plot within section borders\n const chartAreaWidth = section.width - 2;\n const chartAreaHeight = section.height - 2 - (AGP_SECTION_HEADER_HEIGHT + AGP_SECTION_DESCRIPTION_HEIGHT) - AGP_SECTION_BORDER_RADIUS;\n const plotMarginX = DPI * 0.5;\n const plotMarginY = DPI * 0.2;\n const paperWidth = chartAreaWidth - (plotMarginX * 2);\n const paperHeight = chartAreaHeight - (plotMarginY * 2);\n\n const hasVeryHigh = _.isNumber(bgPrefs?.bgBounds?.veryHighThreshold);\n const hasVeryLow = _.isNumber(bgPrefs?.bgBounds?.veryLowThreshold);\n\n if (section.sufficientData || bgSource === BGM_DATA_KEY) {\n const yClamp = bgPrefs?.bgUnits === MGDL_UNITS ? AGP_BG_CLAMP_MGDL : AGP_BG_CLAMP_MMOLL;\n const chartData = mungeBGDataBins(bgSource, ONE_HR, bgData, [AGP_LOWER_QUANTILE, AGP_UPPER_QUANTILE]);\n\n // Smooth all bin quantiles according to AGP spec\n const quantileKeys = [\n 'lowerQuantile',\n 'firstQuartile',\n 'median',\n 'thirdQuartile',\n 'upperQuantile',\n ];\n\n const firstDatum = chartData[0];\n const lastDatum = chartData[chartData.length - 1];\n\n const smoothDatum = (prev, curr, next) => {\n // return with current value if current bin, or both adjacent bins, are empty\n if ((!prev && !next) || !curr) {\n return curr;\n } else if (!prev || !next) {\n // Weight at 0-4-1 or 1-4-0 respectively if one of the adjacent bins is empty\n return _.sum([prev || 0, curr * 4, next || 0]) / 5;\n }\n // Weight at 1-4-1\n return _.sum([prev, curr * 4, next]) / 6;\n };\n\n const smoothedChartData = _.map(chartData, (datum, index) => ({\n ...datum,\n ..._.reduce(quantileKeys, (result, key) => {\n result[key] = smoothDatum( // eslint-disable-line no-param-reassign\n chartData[index - 1]?.[key] || lastDatum[key],\n datum[key],\n chartData[index + 1]?.[key] || firstDatum[key]\n );\n return result;\n }, {}),\n }));\n\n // Prepend/append extent datums to opposite ends to allow fully cyclic traces across the entire\n // X axis. Otherwise, the first and last 1/2 hours will not be rendered.\n const firstSmoothedDatum = smoothedChartData[0];\n const lastSmoothedDatum = smoothedChartData[smoothedChartData.length - 1];\n smoothedChartData.unshift({ ...lastSmoothedDatum, msX: firstSmoothedDatum.msX - ONE_HR });\n smoothedChartData.push({ ...firstSmoothedDatum, msX: lastSmoothedDatum.msX + ONE_HR });\n\n const quantileBand = (upperKey, lowerKey, key, bgRange, index) => ({\n name: key,\n type: 'scatter',\n x: [..._.map(smoothedChartData, 'msX'), ..._.map(_.reverse([...smoothedChartData]), 'msX')],\n y: [..._.map(smoothedChartData, upperKey), ..._.map(_.reverse([...smoothedChartData]), lowerKey)],\n yaxis: index === 0 ? 'y' : `y${index + 1}`,\n fill: 'tozerox',\n fillcolor: colors.ambulatoryGlucoseProfile[key][bgRange],\n mode: 'none',\n line: {\n simplify: false,\n shape: 'spline',\n smoothing: 0.5,\n },\n });\n\n const quantileSegment = (upperKey, lowerKey, key, bgRange, index, segmentData) => ({\n name: key,\n type: 'scatter',\n x: [..._.map(segmentData, 'msX'), ..._.map(_.reverse([...segmentData]), 'msX')],\n y: [..._.map(segmentData, upperKey), ..._.map(_.reverse([...segmentData]), lowerKey)],\n yaxis: index === 0 ? 'y' : `y${index + 1}`,\n fill: 'toself',\n fillcolor: colors.ambulatoryGlucoseProfile[key][bgRange],\n mode: 'none',\n line: {\n simplify: false,\n shape: 'line',\n smoothing: 0,\n },\n });\n\n // Define ranges to show on AGP. Start with only Low, Target, and High.\n // Add veryLow and veryHigh range if their respective thresholds exist.\n const bgRangeKeys = _.filter([\n hasVeryLow && 'veryLow',\n 'low',\n 'target',\n 'high',\n hasVeryHigh && 'veryHigh',\n ], Boolean);\n\n const bgTicks = _.filter([\n 0,\n hasVeryLow && bgPrefs.bgBounds.veryLowThreshold,\n bgPrefs.bgBounds.targetLowerBound,\n bgPrefs.bgBounds.targetUpperBound,\n hasVeryHigh && bgPrefs.bgBounds.veryHighThreshold,\n yClamp,\n ], tick => _.isNumber(tick));\n\n const targetStart = _.findIndex(bgRangeKeys, key => key === 'target');\n const targetEnd = targetStart + 1;\n\n const bgTickAnnotations = _.map(bgTicks, (tick, index) => {\n const isTarget = _.includes([targetStart, targetEnd], index);\n\n let yshift = 0;\n if (index === 0) yshift = 4;\n if (index === 1) yshift = -2;\n\n return createAnnotation({\n align: 'right',\n font: {\n color: isTarget ? colors.white : colors.text.ticks.bg,\n size: fontSizes.ambulatoryGlucoseProfile.bgTicks,\n },\n height: 9,\n text: index === 0\n ? boldText(tick)\n : boldText(formatBgValue(tick, bgPrefs, undefined, true)),\n y: tick / yClamp,\n yanchor: 'middle',\n yref: 'paper',\n yshift,\n xanchor: 'right',\n xref: 'x',\n xshift: -2,\n x: 0,\n });\n });\n\n const createbgTargetMarkerSVG = (posX, posY) => {\n const radiusX = 2;\n const radiusY = 2;\n const width = 22;\n const height = 10;\n const posXLeft = posX - width;\n const posYTop = posY + height / 2;\n const posYBottom = posY - height / 2;\n const arrowHeight = height / 2 - 1;\n\n return [\n `M ${posX} ${posY}`,\n `V ${posY - 1}`,\n `L ${posX - arrowHeight} ${posYBottom}`,\n `H ${posXLeft + radiusX}`,\n `Q ${posXLeft} ${posYBottom} ${posXLeft} ${posYBottom + radiusY}`,\n `V ${posYTop - radiusY}`,\n `Q ${posXLeft} ${posYTop} ${posXLeft + radiusX} ${posYTop}`,\n `H ${posX - arrowHeight}`,\n `L ${posX} ${posY + 1}`,\n `V ${posY}`,\n ].join(' ');\n };\n\n const bgTargetMarkers = _.map(_.slice(bgTicks, targetStart, targetEnd + 1), tick => ({\n fillcolor: colors.line.range.target,\n line: {\n width: 0,\n },\n tick,\n path: createbgTargetMarkerSVG(-1, tick / yClamp * paperHeight),\n type: 'path',\n xanchor: 0,\n xref: 'paper',\n xsizemode: 'pixel',\n yanchor: 0,\n yref: 'paper',\n ysizemode: 'pixel',\n }));\n\n const bgGridLines = _.map(bgTicks, (tick, index) => {\n const isClamp = index === 5;\n const isTarget = _.includes([targetStart, targetEnd], index);\n const isZero = index === 0;\n\n return {\n layer: (bgSource === CGM_DATA_KEY && (isTarget || isClamp)) ? 'above' : 'below',\n line: {\n color: isTarget ? colors.line.range.target : colors.line.range.default,\n width: isTarget ? 2 : 1,\n },\n type: 'line',\n x0: isClamp || isZero ? -1 : 0, // fills an empty pixel cap on top grid line\n x1: isClamp || isZero ? paperWidth + 1 : paperWidth, // fills an empty pixel cap on top grid line\n xref: 'paper',\n xanchor: 0,\n xsizemode: 'pixel',\n y0: tick / yClamp,\n y1: tick / yClamp,\n yref: 'paper',\n };\n });\n\n const percentileTicks = _.map(quantileKeys, key => {\n if (firstSmoothedDatum[key] && lastSmoothedDatum[key]) {\n return (firstSmoothedDatum[key] + lastSmoothedDatum[key]) / 2;\n }\n\n return bgSource === CGM_DATA_KEY\n ? firstSmoothedDatum[key] || lastSmoothedDatum[key]\n : undefined;\n });\n\n const percentileLabels = ['5%', '25%', '50%', '75%', '95%'];\n\n // Ensure that percentile ticks and annotations don't crowd\n const percentileTickYPositions = _.map(percentileTicks, tick => chartScaleToPixels(paperHeight, tick / yClamp));\n const percentileTickShiftedYPositions = [...percentileTickYPositions];\n const medianYPos = percentileTickYPositions[2];\n const minGap = pointsToPixels(fontSizes.ambulatoryGlucoseProfile.percentileTicks) + 2;\n percentileTickShiftedYPositions[1] = _.min([medianYPos - minGap, percentileTickShiftedYPositions[1]]);\n percentileTickShiftedYPositions[0] = _.min([percentileTickShiftedYPositions[1] - minGap, percentileTickShiftedYPositions[0]]);\n percentileTickShiftedYPositions[3] = _.max([medianYPos + minGap, percentileTickShiftedYPositions[3]]);\n percentileTickShiftedYPositions[4] = _.max([percentileTickShiftedYPositions[3] + minGap, percentileTickShiftedYPositions[4]]);\n const percentileTickYShifts = _.map(percentileTickShiftedYPositions, (shiftedYPos, index) => (shiftedYPos - percentileTickYPositions[index]));\n\n const percentileTickAnnotations = _.map(percentileTicks, (tick, index) => createAnnotation({\n align: 'left',\n font: {\n color: index === 2 ? colors.black : colors.text.ticks.percentile,\n size: fontSizes.ambulatoryGlucoseProfile.percentileTicks,\n },\n name: bgRangeKeys[index],\n text: boldText(percentileLabels[index]),\n visible: _.isFinite(tick) && tick / yClamp <= 1,\n y: tick / yClamp,\n yanchor: 'middle',\n yref: 'paper',\n yshift: percentileTickYShifts[index],\n xanchor: 'left',\n xref: 'x',\n xshift: 5,\n x: MS_IN_DAY,\n }));\n\n const percentileTickLines = _.map(percentileTicks, (tick, index) => ({\n line: {\n color: colors.line.ticks,\n width: 1,\n },\n type: 'line',\n visible: _.isFinite(tick) && tick / yClamp <= 1,\n x0: paperWidth,\n x1: paperWidth + 5,\n xref: 'paper',\n xanchor: 0,\n xsizemode: 'pixel',\n y0: tick / yClamp,\n y1: tick / yClamp + pixelsToChartScale(paperHeight, percentileTickYShifts[index]),\n yref: 'paper',\n }));\n\n const quarterDayTicks = _.range(0, MS_IN_DAY + 1, MS_IN_HOUR * 6);\n\n const hourlyTicks = _.filter(\n _.range(0, MS_IN_DAY + 1, MS_IN_HOUR),\n tick => ((tick / MS_IN_HOUR) % 12 !== 0)\n );\n\n const hourlyTicksAnnotations = _.map(_.range(0, MS_IN_DAY + 1, MS_IN_HOUR * 3), tick => createAnnotation({\n align: 'center',\n font: {\n color: (tick / MS_IN_HOUR) % 12 === 0 ? colors.black : colors.darkGrey,\n size: fontSizes.ambulatoryGlucoseProfile.hourlyTicks,\n },\n text: boldText(moment.utc(tick).format('ha')),\n y: 0,\n yanchor: 'top',\n yref: 'y',\n yshift: 0,\n xanchor: 'middle',\n xref: 'x',\n x: tick,\n }));\n\n const data = [];\n const yAxes = [];\n const bgmMedian = [];\n const legend = [];\n let showLegend = false;\n\n _.each(bgRangeKeys, (bgRange, index) => {\n const range = [bgTicks[index], bgTicks[index + 1]];\n\n if (bgSource === CGM_DATA_KEY) {\n data.push(quantileBand('upperQuantile', 'lowerQuantile', 'outerQuantile', bgRange, index));\n data.push(quantileBand('thirdQuartile', 'firstQuartile', 'interQuartile', bgRange, index));\n data.push({\n name: 'median',\n type: 'scatter',\n x: _.map(smoothedChartData, 'msX'),\n y: _.map(smoothedChartData, 'median'),\n yaxis: index === 0 ? 'y' : `y${index + 1}`,\n mode: 'lines',\n fill: 'none',\n line: {\n color: colors.ambulatoryGlucoseProfile.median[bgRange],\n simplify: false,\n shape: 'spline',\n width: 3,\n smoothing: 0.5,\n },\n });\n } else if (bgSource === BGM_DATA_KEY) {\n if (section.sufficientData) {\n _.each(smoothedChartData, (bin, i) => {\n const segmentData = [smoothedChartData[i - 1], bin];\n\n const bandData = _.filter(\n segmentData,\n ({ thirdQuartile, firstQuartile } = {}) => _.isFinite(thirdQuartile) && _.isFinite(firstQuartile)\n );\n\n if (bandData.length === 2) {\n data.push(quantileSegment('thirdQuartile', 'firstQuartile', 'interQuartile', bgRange, index, bandData));\n }\n\n const medianData = _.filter(\n segmentData,\n ({ median } = {}) => _.isFinite(median)\n );\n\n const isLastDrawableSegment = i === smoothedChartData.length - 1;\n\n // Show legend if the interquartile ranges don't extend to the chart edge\n if (isLastDrawableSegment && bandData.length < 2) {\n const medianTickYPos = (segmentData[0].median + segmentData[1].median) / 2;\n showLegend = medianTickYPos > yClamp / 2 ? 'bottom' : 'top';\n }\n\n if (medianData.length === 2) {\n const medianWidth = 3;\n const isFirstDrawableSegment = i === 1;\n\n let x0 = medianData[0].msX / MS_IN_DAY;\n let x1 = medianData[1].msX / MS_IN_DAY;\n let y0 = medianData[0].median;\n let y1 = medianData[1].median;\n\n if (isFirstDrawableSegment) {\n x0 = 0;\n y0 = y1 - ((y1 - y0) / 2);\n }\n\n if (isLastDrawableSegment) {\n x1 = 1;\n y1 = y1 - ((y1 - y0) / 2);\n }\n\n bgmMedian.push({\n type: 'line',\n x0,\n x1,\n y0,\n y1,\n line: {\n color: colors.ambulatoryGlucoseProfile.median[bgRange],\n width: medianWidth,\n },\n xref: 'paper',\n xsizemode: 'scaled',\n yref: index === 0 ? 'y' : `y${index + 1}`,\n ysizemode: 'scaled',\n });\n\n const lineEndRadius = medianWidth / 2;\n const rx = pixelsToChartScale(paperWidth, lineEndRadius);\n const ry = pixelsToChartScale(paperHeight, lineEndRadius) * yClamp;\n\n // add circles at line end to smooth out any sharp gaps between interconnected segments\n const previousSegmentData = [smoothedChartData[i - 2], smoothedChartData[i - 1]];\n\n if (_.filter(\n previousSegmentData,\n ({ median } = {}) => _.isFinite(median)\n ).length === 2) {\n const lineEnd = segmentData[0];\n bgmMedian.push({\n type: 'circle',\n x0: lineEnd.msX / MS_IN_DAY - rx,\n x1: lineEnd.msX / MS_IN_DAY + rx,\n y0: lineEnd.median - ry,\n y1: lineEnd.median + ry,\n line: { width: 0 },\n fillcolor: colors.ambulatoryGlucoseProfile.median[bgRange],\n xref: 'paper',\n xsizemode: 'scaled',\n yref: index === 0 ? 'y' : `y${index + 1}`,\n ysizemode: 'scaled',\n });\n }\n }\n });\n } else {\n // No AGP data to plot, but need to add dummy datums so that the readings will plot\n }\n }\n\n const yAxis = {\n domain: [range[0] / yClamp, range[1] / yClamp],\n range,\n showgrid: false,\n showline: true,\n linecolor: colors.lightGrey,\n mirror: true,\n showticklabels: false,\n zeroline: false,\n };\n\n yAxes.push(yAxis);\n });\n\n if (showLegend) {\n const legendRangeWidth = 5;\n const legendRangeHeight = 15;\n const legendXOffset = pixelsToChartScale(paperWidth, 4);\n\n const legendYOffset = showLegend === 'top'\n ? 1 - pixelsToChartScale(paperHeight, legendRangeHeight * 5 + 4)\n : pixelsToChartScale(paperHeight, 4);\n\n _.each(percentileTickAnnotations, (tick, tickIndex) => {\n // Create legend range and update tick position to be adjacent to the legend\n const showTick = _.includes([0, 2, 4], tickIndex);\n const isTarget = tickIndex === 2;\n const yPos = tickIndex * legendRangeHeight;\n\n legend.push({\n type: 'rect',\n x0: 0,\n x1: legendRangeWidth,\n y0: yPos,\n y1: yPos + legendRangeHeight,\n line: { width: 0 },\n fillcolor: colors.ambulatoryGlucoseProfile.interQuartile[tick.name],\n xanchor: 1 + legendXOffset,\n xref: 'paper',\n xsizemode: 'pixel',\n yanchor: 0 + legendYOffset,\n yref: 'paper',\n ysizemode: 'pixel',\n });\n\n if (isTarget) {\n legend.push({\n type: 'line',\n x0: 0,\n x1: legendRangeWidth,\n y0: yPos + legendRangeHeight / 2,\n y1: yPos + legendRangeHeight / 2,\n line: {\n color: colors.ambulatoryGlucoseProfile.median.target,\n width: 3,\n },\n xanchor: 1 + legendXOffset,\n xref: 'paper',\n xsizemode: 'pixel',\n yanchor: 0 + legendYOffset,\n yref: 'paper',\n ysizemode: 'pixel',\n });\n }\n\n if (showTick) {\n let tickYPosOffset = 0.5;\n let tickTextIndex = tickIndex + 1;\n\n if (tickIndex > 0) {\n tickYPosOffset = (isTarget ? legendRangeHeight / 2 : legendRangeHeight - 0.5);\n tickTextIndex = isTarget ? tickIndex : tickIndex - 1;\n }\n\n percentileTickLines.push({\n type: 'line',\n x0: 0,\n x1: 5,\n y0: yPos + tickYPosOffset,\n y1: yPos + tickYPosOffset,\n line: {\n color: colors.line.ticks,\n width: 1,\n },\n xanchor: 1 + pixelsToChartScale(paperWidth, legendRangeWidth) + legendXOffset,\n xref: 'paper',\n xsizemode: 'pixel',\n yanchor: 0 + legendYOffset,\n yref: 'paper',\n ysizemode: 'pixel',\n });\n\n percentileTickAnnotations.push(createAnnotation({\n align: 'left',\n font: {\n color: isTarget ? colors.black : colors.text.ticks.percentile,\n size: fontSizes.ambulatoryGlucoseProfile.percentileTicks,\n },\n name: bgRangeKeys[tickIndex],\n text: boldText(percentileLabels[tickTextIndex]),\n xanchor: 'left',\n xref: 'paper',\n xshift: 5,\n x: 1 + pixelsToChartScale(paperWidth, legendRangeWidth) + legendXOffset,\n y: pixelsToChartScale(paperHeight, yPos + tickYPosOffset),\n yanchor: 'middle',\n yref: 'paper',\n yshift: chartScaleToPixels(paperHeight, legendYOffset),\n }));\n }\n });\n }\n\n let targetReadings = [];\n let lowReadings = [];\n let veryLowReadings = [];\n let highReadings = [];\n let veryHighReadings = [];\n\n if (bgSource === BGM_DATA_KEY) {\n const bgPlotRadius = 2.25;\n const rx = pixelsToChartScale(paperWidth, bgPlotRadius);\n const ry = pixelsToChartScale(paperHeight, bgPlotRadius);\n\n const renderBgReadings = bgRange => _.map(_.filter(bgData, ({ value }) => classifyBgValue(bgPrefs.bgBounds, bgPrefs.bgUnits, value, 'fiveWay') === bgRange), d => ({\n type: 'circle',\n x0: d.msPer24 / (MS_IN_DAY) - rx,\n x1: d.msPer24 / (MS_IN_DAY) + rx,\n y0: _.min([d.value, yClamp]) / yClamp - ry,\n y1: _.min([d.value, yClamp]) / yClamp + ry,\n fillcolor: colors.bgReadings[bgRange],\n line: {\n color: colors.black,\n width: 0.25,\n },\n xref: 'paper',\n xsizemode: 'scaled',\n yref: 'paper',\n ysizemode: 'scaled',\n }));\n\n veryLowReadings = renderBgReadings('veryLow');\n lowReadings = renderBgReadings('low');\n targetReadings = renderBgReadings('target');\n highReadings = renderBgReadings('high');\n veryHighReadings = renderBgReadings('veryHigh');\n }\n\n const layout = {\n width: chartAreaWidth,\n height: chartAreaHeight,\n showlegend: false,\n\n margin: {\n l: plotMarginX,\n r: plotMarginX,\n b: plotMarginY,\n t: plotMarginY,\n },\n\n xaxis: {\n gridcolor: colors.line.ticks,\n linecolor: colors.line.ticks,\n range: [0, MS_IN_DAY],\n showgrid: true,\n showline: false,\n showticklabels: false,\n tickvals: quarterDayTicks,\n zeroline: false,\n },\n\n // secondary axis for hourly ticks\n xaxis2: {\n range: [0, MS_IN_DAY],\n overlaying: 'x',\n showgrid: false,\n showline: false,\n showticklabels: false,\n ticks: 'inside',\n tickcolor: colors.lightGrey,\n ticklen: 5,\n tickvals: hourlyTicks,\n zeroline: false,\n },\n\n ..._.reduce(yAxes, (result, axis, index) => {\n const axisKey = index === 0 ? 'yaxis' : `yaxis${index + 1}`;\n result[axisKey] = axis; // eslint-disable-line no-param-reassign\n return result;\n }, {}),\n\n annotations: [\n ...bgTickAnnotations,\n ...percentileTickAnnotations,\n ...hourlyTicksAnnotations,\n\n createAnnotation({\n font: {\n color: colors.text.ticks.bg,\n size: fontSizes.ambulatoryGlucoseProfile.bgUnits,\n },\n text: bgPrefs?.bgUnits,\n x: 0,\n xanchor: 'right',\n xref: 'paper',\n xshift: -2,\n y: bgTicks[5] / yClamp,\n yanchor: 'top',\n yref: 'paper',\n yshift: -4,\n }),\n\n createAnnotation({\n font: {\n color: colors.black,\n size: fontSizes.ambulatoryGlucoseProfile.bgUnits,\n },\n text: boldText(text.ambulatoryGlucoseProfile[bgSource].targetRange),\n x: 0,\n xanchor: 'right',\n xref: 'paper',\n xshift: -2,\n y: _.mean(_.slice(bgTicks, 2, 4)) / yClamp,\n yanchor: 'middle',\n yref: 'paper',\n }),\n ],\n\n shapes: [\n ...bgGridLines,\n ...bgTargetMarkers,\n ...targetReadings,\n ...lowReadings,\n ...veryLowReadings,\n ...highReadings,\n ...veryHighReadings,\n ...bgmMedian,\n ...percentileTickLines,\n ...legend,\n ],\n };\n\n const figure = {\n data: [\n ...data,\n // Dummy data to ensure that all axes render (plotly will not render axes lines if empty)\n { visible: false, xaxis: 'x2' },\n ..._.map(yAxes, (axis, i) => ({ visible: false, yaxis: i === 0 ? 'y' : `y${i + 1}` })),\n ],\n layout,\n };\n\n return figure;\n }\n\n return null;\n};\n\nexport const generateDailyGlucoseProfilesFigure = (section, bgData, bgPrefs, dateLabelFormat) => {\n // Set chart plot within section borders\n const chartAreaWidth = section.width - 2;\n const chartAreaHeight = section.height - 2 - (AGP_SECTION_HEADER_HEIGHT + AGP_SECTION_DESCRIPTION_HEIGHT) - AGP_SECTION_BORDER_RADIUS;\n const plotHeight = chartAreaHeight / 2;\n const plotMarginX = DPI * 0.5;\n const plotMarginTop = DPI * 0.2;\n const plotMarginBottom = 1;\n const paperWidth = chartAreaWidth - (plotMarginX * 2);\n const paperHeight = plotHeight - (plotMarginTop + plotMarginBottom);\n\n if (section.sufficientData) {\n const yClamp = bgPrefs?.bgUnits === MGDL_UNITS ? AGP_BG_CLAMP_MGDL : AGP_BG_CLAMP_MMOLL;\n\n const bgRangeKeys = [\n 'low',\n 'target',\n 'high',\n ];\n\n const bgTicks = [\n 0,\n bgPrefs?.bgBounds?.targetLowerBound,\n bgPrefs?.bgBounds?.targetUpperBound,\n yClamp,\n ];\n\n const bgTickAnnotations = _.map(_.slice(bgTicks, 1, 3), tick => createAnnotation({\n align: 'right',\n font: {\n color: colors.text.ticks.dailyProfileBg,\n size: fontSizes.dailyGlucoseProfiles.bgTicks,\n },\n text: boldText(formatBgValue(tick, bgPrefs, undefined, true)),\n y: tick / yClamp,\n yanchor: 'middle',\n yref: 'paper',\n xanchor: 'right',\n xref: 'x',\n xshift: -2,\n x: 0,\n }));\n\n const bgGridLines = _.map(bgTicks, (tick, index) => {\n const isClamp = index === 3;\n const isTarget = _.includes([1, 2], index);\n const isZero = index === 0;\n\n return {\n layer: isTarget || isClamp ? 'above' : 'below',\n line: {\n color: isTarget ? colors.line.range.dailyProfileTarget : colors.line.range.default,\n width: 1,\n },\n type: 'line',\n x0: isClamp || isZero ? -1 : 0, // fills an empty pixel gap on top grid line\n x1: isClamp || isZero ? paperWidth + 1 : paperWidth, // fills an empty pixel gap on top grid line\n xref: 'paper',\n xanchor: 0,\n xsizemode: 'pixel',\n y0: tick / yClamp,\n y1: tick / yClamp,\n yref: 'paper',\n };\n });\n\n const halfDayTicks = _.range(0, MS_IN_DAY * 7 + 1, MS_IN_HOUR * 12);\n\n const halfDayTickAnnotations = _.map(_.filter(halfDayTicks, (tick, index) => index % 2 !== 0), (tick, index) => createAnnotation({\n align: 'center',\n font: {\n color: colors.black,\n size: dateLabelFormat === 'ha'\n ? fontSizes.dailyGlucoseProfiles.timeTicks\n : fontSizes.dailyGlucoseProfiles.weekdayTicks,\n },\n text: dateLabelFormat === 'ha'\n ? boldText(moment.utc(tick).format(dateLabelFormat))\n : boldText(moment.utc(String(bgData[index][0])).format(dateLabelFormat)),\n y: 1,\n yanchor: 'bottom',\n yref: 'paper',\n yshift: 1,\n xanchor: 'middle',\n xref: 'x',\n x: tick,\n }));\n\n const calendarDays = _.flatten(_.map(bgData, (d) => d[0]));\n\n const calendarDayAnnotations = _.map(calendarDays, (date, index) => createAnnotation({\n align: 'left',\n font: {\n color: colors.text.calendarDates,\n size: fontSizes.dailyGlucoseProfiles.calendarDates,\n },\n text: boldText(moment.utc(date).format('D')),\n y: 1,\n yanchor: 'top',\n yref: 'paper',\n yshift: 0,\n xanchor: 'left',\n xref: 'x',\n xshift: 0,\n x: index * MS_IN_DAY,\n }));\n\n const data = [];\n const yAxes = [];\n\n const combinedData = _.flatten(_.map(bgData, (d, index) => (_.map(d[1], dayData => ({\n ...dayData,\n msPer24: dayData.msPer24 + MS_IN_DAY * index,\n bgRange: dayData.type === BGM_DATA_KEY\n ? classifyBgValue(bgPrefs.bgBounds, bgPrefs.bgUnits, dayData.value, 'threeWay')\n : undefined,\n })))));\n\n let lowReadings = [];\n let targetReadings = [];\n let highReadings = [];\n\n if (section.bgSource === CGM_DATA_KEY) {\n _.each(bgRangeKeys, (bgRange, index) => {\n const isLow = index === 0;\n const isTarget = index === 1;\n const firstDatum = _.first(combinedData);\n const lastDatum = _.last(combinedData);\n const range = [bgTicks[index], bgTicks[index + 1]];\n const fillYExentRangeIndex = isLow ? 1 : 0;\n\n data.push({\n name: 'rangeFill',\n type: 'scatter',\n x: isTarget\n ? [0, MS_IN_DAY * 7, MS_IN_DAY * 7, 0]\n : [firstDatum?.msPer24, ..._.map(combinedData, 'msPer24'), lastDatum?.msPer24, firstDatum?.msPer24],\n y: isTarget\n ? [range[1], range[1], range[0], range[0]]\n : [range[fillYExentRangeIndex], ..._.map(combinedData, 'value'), range[fillYExentRangeIndex], range[fillYExentRangeIndex]],\n yaxis: index === 0 ? 'y' : `y${index + 1}`,\n mode: 'none',\n fill: 'tonextx',\n fillcolor: colors.dailyGlucoseProfiles[bgRange].fill,\n line: {\n color: colors.dailyGlucoseProfiles[bgRange].line,\n simplify: false,\n width: 1,\n },\n });\n\n data.push({\n name: 'median',\n type: 'scatter',\n x: _.map(combinedData, 'msPer24'),\n y: _.map(combinedData, 'value'),\n yaxis: index === 0 ? 'y' : `y${index + 1}`,\n mode: 'lines',\n fill: 'none',\n line: {\n color: colors.dailyGlucoseProfiles[bgRange].line,\n simplify: false,\n width: 1,\n },\n });\n\n const yAxis = {\n domain: [range[0] / yClamp, range[1] / yClamp],\n range,\n showgrid: false,\n showline: true,\n linecolor: colors.lightGrey,\n mirror: true,\n showticklabels: false,\n zeroline: false,\n };\n\n yAxes.push(yAxis);\n });\n }\n\n if (section.bgSource === BGM_DATA_KEY) {\n const bgPlotRadius = 2;\n const rx = pixelsToChartScale(paperWidth, bgPlotRadius);\n const ry = pixelsToChartScale(paperHeight, bgPlotRadius);\n\n const renderBgReadings = bgRange => _.map(_.filter(combinedData, { bgRange }), d => ({\n type: 'circle',\n x0: d.msPer24 / (MS_IN_DAY * 7) - rx,\n x1: d.msPer24 / (MS_IN_DAY * 7) + rx,\n y0: _.min([d.value, yClamp]) / yClamp - ry,\n y1: _.min([d.value, yClamp]) / yClamp + ry,\n fillcolor: colors.bgReadings[bgRange],\n line: {\n color: colors.black,\n width: 0.25,\n },\n xref: 'paper',\n xsizemode: 'scaled',\n yref: 'paper',\n ysizemode: 'scaled',\n }));\n\n lowReadings = renderBgReadings('low');\n targetReadings = renderBgReadings('target');\n highReadings = renderBgReadings('high');\n\n data.push({\n name: 'rangeFill',\n type: 'scatter',\n x: [0, MS_IN_DAY * 7, MS_IN_DAY * 7, 0],\n y: [bgTicks[2], bgTicks[2], bgTicks[1], bgTicks[1]],\n yaxis: 'y',\n mode: 'none',\n fill: 'tonextx',\n fillcolor: colors.dailyGlucoseProfiles.target.fill,\n line: {\n color: colors.dailyGlucoseProfiles.target.line,\n simplify: false,\n width: 1,\n },\n });\n\n const yAxis = {\n domain: [0, 1],\n range: [0, yClamp],\n showgrid: false,\n showline: true,\n linecolor: colors.lightGrey,\n mirror: true,\n showticklabels: false,\n zeroline: false,\n };\n\n yAxes.push(yAxis);\n }\n\n const layout = {\n width: chartAreaWidth,\n height: plotHeight,\n showlegend: false,\n\n margin: {\n l: plotMarginX,\n r: plotMarginX,\n b: plotMarginBottom,\n t: plotMarginTop,\n },\n\n xaxis: {\n gridcolor: colors.line.ticks,\n linecolor: colors.line.ticks,\n range: [0, MS_IN_DAY * 7],\n showgrid: true,\n showline: false,\n showticklabels: false,\n tickvals: halfDayTicks,\n zeroline: false,\n },\n\n ..._.reduce(yAxes, (result, axis, index) => {\n const axisKey = index === 0 ? 'yaxis' : `yaxis${index + 1}`;\n result[axisKey] = axis; // eslint-disable-line no-param-reassign\n return result;\n }, {}),\n\n annotations: [\n ...bgTickAnnotations,\n ...halfDayTickAnnotations,\n ...calendarDayAnnotations,\n\n createAnnotation({\n font: {\n color: colors.text.ticks.bg,\n size: fontSizes.dailyGlucoseProfiles.bgUnits,\n },\n text: boldText(bgPrefs?.bgUnits),\n textangle: 270,\n x: 0,\n xanchor: 'right',\n xref: 'paper',\n xshift: -18,\n y: _.mean(_.slice(bgTicks, 1, 3)) / yClamp,\n yanchor: 'middle',\n yref: 'paper',\n yshift: 0,\n }),\n ],\n\n shapes: [\n ...bgGridLines,\n ...targetReadings,\n ...lowReadings,\n ...highReadings,\n ],\n };\n\n const figure = {\n data: [\n ...data,\n // Dummy data to ensure that all axes render (plotly will not render axes lines if empty)\n ..._.map(yAxes, (axis, i) => ({ visible: false, yaxis: i === 0 ? 'y' : `y${i + 1}` })),\n ],\n layout,\n };\n\n return figure;\n }\n\n return null;\n};\n","// DPI here is the coordinate system, not the resolution; sub-dot precision renders crisply!\nexport const DPI = 72;\nexport const MARGIN = DPI / 2;\nexport const HEIGHT = 11 * DPI - (2 * MARGIN);\nexport const WIDTH = 8.5 * DPI - (2 * MARGIN);\nexport const MARGINS = {\n left: MARGIN,\n top: MARGIN,\n right: MARGIN,\n bottom: MARGIN,\n};\nexport const DEFAULT_FONT_SIZE = 10;\nexport const LARGE_FONT_SIZE = 12;\nexport const FOOTER_FONT_SIZE = 8;\nexport const HEADER_FONT_SIZE = 14;\nexport const SMALL_FONT_SIZE = 8;\nexport const EXTRA_SMALL_FONT_SIZE = 6;\n","/*\n * == BSD2 LICENSE ==\n * Copyright (c) 2017, Tidepool Project\n *\n * This program is free software; you can redistribute it and/or modify it under\n * the terms of the associated License, which is identical to the BSD 2-Clause\n * License as published by the Open Source Initiative at opensource.org.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n * FOR A PARTICULAR PURPOSE. See the License for more details.\n *\n * You should have received a copy of the License along with this program; if\n * not, you can obtain one from Tidepool Project at tidepool.org.\n * == BSD2 LICENSE ==\n */\n\nimport _ from 'lodash';\nimport { max, mean, median, min, quantile, range } from 'd3-array';\n\nimport { BG_DISPLAY_MINIMUM_INCREMENTS, DEFAULT_BG_BOUNDS, MGDL_PER_MMOLL, MGDL_UNITS, MMOLL_UNITS, MS_IN_MIN } from './constants';\nimport { TWENTY_FOUR_HRS } from './datetime';\n\nimport { bankersRound, formatBgValue } from './format.js';\n\n/**\n * classifyBgValue\n * @param {Object} bgBounds - object describing boundaries for blood glucose categories\n * @param {String} bgUnits MGDL_UNITS or MMOLL_UNITS\n * @param {Number} bgValue - integer or float blood glucose value in either mg/dL or mmol/L\n * @param {String} classificationType - 'threeWay' or 'fiveWay'\n *\n * @return {String} bgClassification - low, target, high\n */\nexport function classifyBgValue(bgBounds, bgUnits, bgValue, classificationType = 'threeWay') {\n if (_.isEmpty(bgBounds) ||\n !_.isNumber(_.get(bgBounds, 'targetLowerBound')) ||\n !_.isNumber(_.get(bgBounds, 'targetUpperBound'))) {\n throw new Error(\n 'You must provide a `bgBounds` object with a `targetLowerBound` and a `targetUpperBound`!'\n );\n }\n if (!_.isNumber(bgValue) || !_.gt(bgValue, 0)) {\n throw new Error('You must provide a positive, numerical blood glucose value to categorize!');\n }\n if (!_.includes([MMOLL_UNITS, MGDL_UNITS], bgUnits)) {\n throw new Error('Must provide a valid blood glucose unit of measure!');\n }\n\n const { veryLowThreshold, targetLowerBound, targetUpperBound, veryHighThreshold } = bgBounds;\n\n const precision = bgUnits === MMOLL_UNITS ? 1 : 0;\n const roundedValue = bankersRound(bgValue, precision);\n\n // fiveWay\n if (classificationType === 'fiveWay') {\n if (_.isNumber(veryLowThreshold) && roundedValue < veryLowThreshold) {\n return 'veryLow';\n } else if (_.isNumber(veryHighThreshold) && roundedValue > veryHighThreshold) {\n return 'veryHigh';\n } else if (roundedValue < targetLowerBound) {\n return 'low';\n } else if (roundedValue > targetUpperBound) {\n return 'high';\n }\n\n return 'target';\n }\n\n // threeWay\n if (roundedValue < targetLowerBound) {\n return 'low';\n } else if (roundedValue > targetUpperBound) {\n return 'high';\n }\n return 'target';\n}\n\n/**\n * classifyCvValue\n * @param {number} value - integer or float coefficient of variation (CV) value\n * @return {String} cvClassification - target, high\n */\nexport function classifyCvValue(value) {\n if (value <= 36) {\n return 'target';\n } else {\n return 'high';\n }\n}\n\n/**\n * convertToMmolL\n * @param {Number} bgVal - blood glucose value in mg/dL\n *\n * @return {Number} convertedBgVal - blood glucose value in mmol/L, unrounded\n */\nexport function convertToMmolL(val) {\n return (val / MGDL_PER_MMOLL);\n}\n\n/**\n * convertToMGDL\n * @param {Number} bgVal - blood glucose value in mmol/L\n *\n * @return {Number} convertedBgVal - blood glucose value in mg/dL, unrounded\n */\nexport function convertToMGDL(val) {\n return (val * MGDL_PER_MMOLL);\n}\n\n/**\n * reshapeBgClassesToBgBounds\n * @param {Object} bgPrefs - bgPrefs object from blip containing tideline-style bgClasses\n *\n * @return {Object} bgBounds - @tidepool/viz-style bgBounds\n */\nexport function reshapeBgClassesToBgBounds(bgPrefs) {\n const { bgClasses, bgUnits } = bgPrefs;\n\n const bgBounds = {\n veryHighThreshold: _.get(bgClasses, 'high.boundary', DEFAULT_BG_BOUNDS[bgUnits].veryHighThreshold),\n targetUpperBound: _.get(bgClasses, 'target.boundary', DEFAULT_BG_BOUNDS[bgUnits].targetUpperBound),\n targetLowerBound: _.get(bgClasses, 'low.boundary', DEFAULT_BG_BOUNDS[bgUnits].targetLowerBound),\n veryLowThreshold: _.get(bgClasses, 'very-low.boundary', DEFAULT_BG_BOUNDS[bgUnits].veryLowThreshold),\n extremeHighThreshold: DEFAULT_BG_BOUNDS[bgUnits].extremeHighThreshold,\n clampThreshold: DEFAULT_BG_BOUNDS[bgUnits].clampThreshold,\n };\n\n return bgBounds;\n}\n\n/**\n * Generate BG Range Labels for a given set of bg prefs\n *\n * @export\n * @param {Object} bgPrefs - bgPrefs object containing viz-style bgBounds and the bgUnits\n * @returns {Object} bgRangeLabels - map of labels keyed by bgClassification\n */\nexport function generateBgRangeLabels(bgPrefs, opts = {}) {\n const { bgBounds, bgUnits } = bgPrefs;\n const minimumIncrement = BG_DISPLAY_MINIMUM_INCREMENTS[bgUnits];\n\n const thresholds = _.mapValues(\n bgBounds,\n threshold => (_.isNumber(threshold) ? formatBgValue(threshold, bgPrefs) : null)\n );\n\n thresholds.highLowerBound = formatBgValue(bgBounds.targetUpperBound + minimumIncrement, bgPrefs);\n thresholds.lowUpperBound = formatBgValue(bgBounds.targetLowerBound - minimumIncrement, bgPrefs);\n\n const {\n veryLowThreshold,\n lowUpperBound,\n targetLowerBound,\n targetUpperBound,\n highLowerBound,\n veryHighThreshold,\n extremeHighThreshold,\n } = thresholds;\n\n if (opts.condensed) {\n return {\n veryLow: !!veryLowThreshold ? `<${veryLowThreshold}` : null,\n low: !!veryLowThreshold ? `${veryLowThreshold}-${lowUpperBound}` : `<${targetLowerBound}`,\n anyLow: `<${targetLowerBound}`,\n target: `${targetLowerBound}-${targetUpperBound}`,\n high: !!veryHighThreshold ? `${highLowerBound}-${veryHighThreshold}` : `>${targetUpperBound}`,\n anyHigh: `>${targetUpperBound}`,\n veryHigh: !!veryHighThreshold ? `>${veryHighThreshold}` : null,\n extremeHigh: !!extremeHighThreshold ? `>${extremeHighThreshold}` : null,\n };\n }\n\n if (opts.segmented) {\n return {\n veryLow: {\n suffix: bgUnits,\n value: !!veryLowThreshold ? `<${veryLowThreshold}` : null,\n },\n low: {\n prefix: 'between',\n suffix: bgUnits,\n value: !!veryLowThreshold ? `${veryLowThreshold}-${lowUpperBound}` : `<${targetLowerBound}`,\n },\n anyLow: {\n suffix: bgUnits,\n value: `<${targetLowerBound}`,\n },\n target: {\n prefix: 'between',\n suffix: bgUnits,\n value: `${targetLowerBound}-${targetUpperBound}`,\n },\n high: {\n prefix: 'between',\n suffix: bgUnits,\n value: !!veryHighThreshold ? `${highLowerBound}-${veryHighThreshold}` : `>${targetUpperBound}`,\n },\n anyHigh: {\n suffix: bgUnits,\n value: `>${targetUpperBound}`,\n },\n veryHigh: {\n suffix: bgUnits,\n value: !!veryHighThreshold ? `>${veryHighThreshold}` : null,\n },\n extremeHigh: {\n suffix: bgUnits,\n value: !!extremeHighThreshold ? `>${extremeHighThreshold}` : null,\n },\n };\n }\n\n return {\n veryLow: !!veryLowThreshold ? `below ${veryLowThreshold} ${bgUnits}` : null,\n low: !!veryLowThreshold ? `between ${veryLowThreshold} - ${lowUpperBound} ${bgUnits}` : `below ${targetLowerBound} ${bgUnits}`,\n anyLow: `below ${targetLowerBound} ${bgUnits}`,\n target: `between ${targetLowerBound} - ${targetUpperBound} ${bgUnits}`,\n high: !!veryHighThreshold ? `between ${highLowerBound} - ${veryHighThreshold} ${bgUnits}` : `above ${targetUpperBound} ${bgUnits}`,\n anyHigh: `above ${targetUpperBound} ${bgUnits}`,\n veryHigh: !!veryHighThreshold ? `above ${veryHighThreshold} ${bgUnits}` : null,\n extremeHigh: !!extremeHighThreshold ? `above ${extremeHighThreshold} ${bgUnits}` : null,\n };\n}\n\n/**\n * getOutOfRangeThreshold\n * @param {Object} bgDatum\n * @return Object containing out of range threshold or null\n */\nexport function getOutOfRangeThreshold(bgDatum) {\n const outOfRangeAnnotation = _.find(\n bgDatum.annotations || [], (annotation) => (annotation.code === 'bg/out-of-range')\n );\n return outOfRangeAnnotation ?\n { [outOfRangeAnnotation.value]: outOfRangeAnnotation.threshold } : null;\n}\n\n/**\n * Get the adjusted count of expected CGM data points for devices that do not sample at the default\n * 5 minute interval, such as the Abbot FreeStyle Libre, which samples every 15 mins\n *\n * @param {Array} data - cgm data\n * @return {Integer} count - the weighted count\n */\nexport function weightedCGMCount(data) {\n return _.reduce(data, (total, datum) => {\n const sampleInterval = _.get(datum, 'sampleInterval', 5 * MS_IN_MIN);\n const sampleIntervalInMinutes = sampleInterval / MS_IN_MIN;\n const datumWeight = sampleIntervalInMinutes / 5; // Default weight is 1, for 5 minute samples\n return total + datumWeight;\n }, 0);\n}\n\n/**\n * Determine if a patient is using a custom target bg range\n *\n * @param {Object} bgPrefs - bgPrefs object containing viz-style bgBounds and the bgUnits\n */\nexport function isCustomBgRange(bgPrefs) {\n const { bgBounds, bgUnits } = bgPrefs;\n return bgBounds.targetUpperBound !== DEFAULT_BG_BOUNDS[bgUnits].targetUpperBound\n || bgBounds.targetLowerBound !== DEFAULT_BG_BOUNDS[bgUnits].targetLowerBound;\n}\n\n/**\n * determineRangeBoundaries\n * @param {Array} outOfRange - Array of out-of-range objects w/threshold and value\n *\n * @return {Object} highAndLowThresholds - Object with high and low keys\n */\nexport function determineRangeBoundaries(outOfRange) {\n const lowThresholds = _.filter(outOfRange, { value: 'low' });\n const highThresholds = _.filter(outOfRange, { value: 'high' });\n const boundaries = {};\n if (!_.isEmpty(lowThresholds)) {\n // if there is data from multiple devices present with different thresholds\n // we want to use the more conservative (= higher) threshold for lows\n boundaries.low = max(lowThresholds, (d) => (d.threshold));\n }\n if (!_.isEmpty(highThresholds)) {\n // if there is data from multiple devices present with different thresholds\n // we want to use the more conservative (= lower) threshold for highs\n boundaries.high = min(highThresholds, (d) => (d.threshold));\n }\n return boundaries;\n}\n\n/**\n * findBinForTimeOfDay\n * @param {Number} binSize - natural number duration in milliseconds\n * @param {Number} msPer24 - natural number milliseconds into a twenty-four hour day\n *\n * @return {Number} bin\n */\nexport function findBinForTimeOfDay(binSize, msPer24) {\n if (msPer24 < 0 || msPer24 >= TWENTY_FOUR_HRS) {\n throw new Error('`msPer24` < 0 or >= 86400000 is invalid!');\n }\n\n return Math.floor(msPer24 / binSize) * binSize + (binSize / 2);\n}\n\n/**\n * findOutOfRangeAnnotations\n * @param {Array} data - Array of `cbg` or `smbg` events\n *\n * @return {Array} thresholds - Array of objects with unique `threshold`\n * (and `value` of 'low' or 'high')\n */\nexport function findOutOfRangeAnnotations(data) {\n const isOutOfRangeAnnotation = (annotation) => (annotation.code === 'bg/out-of-range');\n const eventsAnnotatedAsOutOfRange = _.filter(\n data,\n (d) => (_.some(d.annotations || [], isOutOfRangeAnnotation))\n );\n const annotations = _.map(eventsAnnotatedAsOutOfRange, (d) => (_.pick(\n _.find(d.annotations || [], isOutOfRangeAnnotation),\n ['threshold', 'value']\n )));\n // the numerical `threshold` is our determiner of uniqueness\n return _.uniqBy(annotations, (d) => (d.threshold));\n}\n\n/**\n * calculateCbgStatsForBin\n * @param {String} binKey - String of natural number milliseconds bin\n * @param {Number} binSize - natural number duration in milliseconds\n * @param {Array} data - Array of cbg values in mg/dL or mmol/L\n * @param {Array} outOfRange - Array of out-of-range objects w/threshold and value\n * @param {Array} outerQuantiles - Array of values to use for lower and upper quantiles\n *\n * @return {Object} calculatedCbgStats\n */\nexport function calculateCbgStatsForBin(binKey, binSize, data, outOfRange, outerQuantiles = []) {\n const [\n lowerQuantile = 0.1,\n upperQuantile = 0.9,\n ] = outerQuantiles;\n\n const sorted = _.sortBy(data, d => d);\n const centerOfBinMs = parseInt(binKey, 10);\n const stats = {\n id: binKey,\n min: min(sorted),\n lowerQuantile: quantile(sorted, lowerQuantile),\n firstQuartile: quantile(sorted, 0.25),\n median: median(sorted),\n thirdQuartile: quantile(sorted, 0.75),\n upperQuantile: quantile(sorted, upperQuantile),\n max: max(sorted),\n msX: centerOfBinMs,\n msFrom: centerOfBinMs - (binSize / 2),\n msTo: centerOfBinMs + (binSize / 2),\n };\n if (!_.isEmpty(outOfRange)) {\n const thresholds = determineRangeBoundaries(outOfRange);\n stats.outOfRangeThresholds = thresholds;\n }\n return stats;\n}\n\n/**\n * calculateSmbgStatsForBin\n * @param {String} binKey - String of natural number milliseconds bin\n * @param {Number} binSize - natural number duration in milliseconds\n * @param {Array} data - Array of smbg values in mg/dL or mmol/L\n * @param {Array} outOfRange - Array of out-of-range objects w/threshold and value\n *\n * @return {Object} calculatedSmbgStats\n */\nexport function calculateSmbgStatsForBin(binKey, binSize, data, outOfRange) {\n const minDatums = {\n quantile: 5,\n median: 3,\n };\n\n const sorted = _.sortBy(data, d => d);\n const centerOfBinMs = parseInt(binKey, 10);\n const stats = {\n id: binKey,\n min: min(sorted),\n mean: mean(sorted),\n max: max(sorted),\n msX: centerOfBinMs,\n firstQuartile: data.length >= minDatums.quantile ? quantile(sorted, 0.25) : undefined,\n median: data.length >= minDatums.median ? median(sorted) : undefined,\n thirdQuartile: data.length >= minDatums.quantile ? quantile(sorted, 0.75) : undefined,\n msFrom: centerOfBinMs - (binSize / 2),\n msTo: centerOfBinMs + (binSize / 2),\n };\n if (!_.isEmpty(outOfRange)) {\n const thresholds = determineRangeBoundaries(outOfRange);\n stats.outOfRangeThresholds = thresholds;\n }\n return stats;\n}\n\n/**\n * mungeBGDataBins\n * @param {String} bgType - String - one of [smbg|cbg]\n * @param {String} binKey - String of natural number milliseconds bin\n * @param {Number} binSize - natural number duration in milliseconds\n * @param {Array} data - Array of smbg values in mg/dL or mmol/L\n * @param {Array} outerQuantiles - Array of values to use for lower and upper quantiles\n * @returns munged bg bin data\n */\nexport function mungeBGDataBins(bgType, binSize, data, outerQuantiles) {\n const binned = _.groupBy(data, (d) => (findBinForTimeOfDay(binSize, d.msPer24)));\n const outOfRanges = findOutOfRangeAnnotations(data);\n // we need *all* possible keys for TransitionMotion to work on enter/exit\n // and the range starts with binSize/2 because the keys are centered in each bin\n const binKeys = _.map(range(binSize / 2, TWENTY_FOUR_HRS, binSize), (d) => String(d));\n\n const binCalculator = bgType === 'smbg' ? calculateSmbgStatsForBin : calculateCbgStatsForBin;\n const valueExtractor = (d) => (d.value);\n const mungedData = [];\n for (let i = 0; i < binKeys.length; ++i) {\n const values = _.map(_.get(binned, binKeys[i], []), valueExtractor);\n mungedData.push(binCalculator(binKeys[i], binSize, values, outOfRanges, outerQuantiles));\n }\n return mungedData;\n}\n","/*\n * == BSD2 LICENSE ==\n * Copyright (c) 2016, Tidepool Project\n *\n * This program is free software; you can redistribute it and/or modify it under\n * the terms of the associated License, which is identical to the BSD 2-Clause\n * License as published by the Open Source Initiative at opensource.org.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n * FOR A PARTICULAR PURPOSE. See the License for more details.\n *\n * You should have received a copy of the License along with this program; if\n * not, you can obtain one from Tidepool Project at tidepool.org.\n * == BSD2 LICENSE ==\n */\n\nimport _ from 'lodash';\nimport i18next from 'i18next';\nconst t = i18next.t.bind(i18next);\n\nif (_.get(i18next, 'options.returnEmptyString') === undefined) {\n // Return key if no translation is present\n i18next.init({ returnEmptyString: false, nsSeparator: '|' });\n}\n\nexport const BG_HIGH = t('High');\nexport const BG_LOW = t('Low');\n\nconst STIFFNESS = 180;\nconst DAMPING = 40;\nconst PRECISION = 0.1;\n\nexport const springConfig = { stiffness: STIFFNESS, damping: DAMPING, precision: PRECISION };\n\nexport const MGDL_CLAMP_TOP = 400;\nexport const MMOLL_CLAMP_TOP = 22.5;\n\nexport const MGDL_UNITS = t('mg/dL');\nexport const MMOLL_UNITS = t('mmol/L');\nexport const MGDL_PER_MMOLL = 18.01559;\n\nexport const BG_DISPLAY_MINIMUM_INCREMENTS = {\n [MGDL_UNITS]: 1,\n [MMOLL_UNITS]: 0.1,\n};\n\nexport const GLYCEMIC_RANGES_PRESET = {\n ADA_STANDARD: 'adaStandard',\n ADA_OLDER_HIGH_RISK: 'adaHighRisk',\n ADA_PREGNANCY_T1: 'adaPregnancyType1',\n ADA_GESTATIONAL_T2: 'adaPregnancyType2',\n};\n\nexport const GLYCEMIC_RANGES_TYPE = {\n PRESET: 'preset',\n CUSTOM: 'custom',\n};\n\nexport const DEFAULT_BG_BOUNDS = {\n [MGDL_UNITS]: {\n veryLowThreshold: 54,\n targetLowerBound: 70,\n targetUpperBound: 180,\n veryHighThreshold: 250,\n extremeHighThreshold: 350,\n clampThreshold: 600,\n },\n [MMOLL_UNITS]: {\n veryLowThreshold: 3.0,\n targetLowerBound: 3.9,\n targetUpperBound: 10.0,\n veryHighThreshold: 13.9,\n extremeHighThreshold: 19.4,\n clampThreshold: 33.3,\n },\n};\n\nexport const ADA_STANDARD_BG_BOUNDS = DEFAULT_BG_BOUNDS;\n\nexport const ADA_OLDER_HIGH_RISK_BG_BOUNDS = {\n [MGDL_UNITS]: {\n veryLowThreshold: null,\n targetLowerBound: 70,\n targetUpperBound: 180,\n veryHighThreshold: 250,\n extremeHighThreshold: null,\n clampThreshold: 600,\n },\n [MMOLL_UNITS]: {\n veryLowThreshold: null,\n targetLowerBound: 3.9,\n targetUpperBound: 10.0,\n veryHighThreshold: 13.9,\n extremeHighThreshold: null,\n clampThreshold: 33.3,\n },\n};\n\nexport const ADA_PREGNANCY_T1_BG_BOUNDS = {\n [MGDL_UNITS]: {\n veryLowThreshold: 54,\n targetLowerBound: 63,\n targetUpperBound: 140,\n veryHighThreshold: null,\n extremeHighThreshold: null,\n clampThreshold: 600,\n },\n [MMOLL_UNITS]: {\n veryLowThreshold: 3.0,\n targetLowerBound: 3.5,\n targetUpperBound: 7.8,\n veryHighThreshold: null,\n extremeHighThreshold: null,\n clampThreshold: 33.3,\n },\n};\n\nexport const ADA_GESTATIONAL_T2_BG_BOUNDS = ADA_PREGNANCY_T1_BG_BOUNDS;\n\nexport const LBS_PER_KG = 2.2046226218;\n\nconst ONE_WEEK = 7;\nconst TWO_WEEKS = 14;\nconst FOUR_WEEKS = 28;\n\nexport const trends = { extentSizes: { ONE_WEEK, TWO_WEEKS, FOUR_WEEKS } };\n\nexport const MS_IN_DAY = 864e5;\nexport const MS_IN_HOUR = 864e5 / 24;\nexport const MS_IN_MIN = MS_IN_HOUR / 60;\n\nexport const CGM_READINGS_ONE_DAY = 288;\nexport const CGM_DATA_KEY = 'cbg';\nexport const BGM_DATA_KEY = 'smbg';\n\nexport const NO_SITE_CHANGE = 'noSiteChange';\nexport const SITE_CHANGE = 'siteChange';\nexport const SITE_CHANGE_RESERVOIR = 'reservoirChange';\nexport const SITE_CHANGE_TUBING = 'tubingPrime';\nexport const SITE_CHANGE_CANNULA = 'cannulaPrime';\n\nexport const ALARM = 'alarm';\nexport const ALARM_NO_DELIVERY = 'no_delivery';\nexport const ALARM_AUTO_OFF = 'auto_off';\nexport const ALARM_NO_INSULIN = 'no_insulin';\nexport const ALARM_NO_POWER = 'no_power';\nexport const ALARM_OCCLUSION = 'occlusion';\nexport const ALARM_OVER_LIMIT = 'over_limit';\n\nexport const EVENT = 'event';\nexport const EVENT_PUMP_SHUTDOWN = 'pump_shutdown';\n\nexport const AUTOMATED_BOLUS = 'automatedBolus';\nexport const AUTOMATED_DELIVERY = 'automatedDelivery';\nexport const AUTOMATED_SUSPEND = 'automatedSuspend';\nexport const AUTOMATED_MODE_EXITED = 'automatedModeExited';\nexport const SCHEDULED_DELIVERY = 'scheduledDelivery';\nexport const SETTINGS_OVERRIDE = 'settingsOverride';\nexport const SLEEP = 'sleep';\nexport const PHYSICAL_ACTIVITY = 'physicalActivity';\nexport const PREPRANDIAL = 'preprandial';\nexport const MAX_BOLUS = 'maxBolus';\nexport const MAX_BASAL = 'maxBasal';\nexport const ONE_BUTTON_BOLUS = 'oneButtonBolus';\nexport const INSULIN_DURATION = 'insulinDuration';\n\nexport const SITE_CHANGE_TYPE_UNDECLARED = 'undeclared';\n\nexport const INSULET = 'Insulet';\nexport const TANDEM = 'Tandem';\nexport const ANIMAS = 'Animas';\nexport const TIDEPOOL_LOOP = 'Tidepool Loop';\nexport const DIY_LOOP = 'DIY Loop';\nexport const TWIIST_LOOP = 'twiist';\nexport const MEDTRONIC = 'Medtronic';\nexport const MICROTECH = 'Microtech';\n\nexport const pumpVocabulary = {\n [ANIMAS]: {\n [SITE_CHANGE_RESERVOIR]: t('Go Rewind'),\n [SITE_CHANGE_TUBING]: t('Go Prime'),\n [SITE_CHANGE_CANNULA]: t('Cannula Fill'),\n },\n [INSULET]: {\n [SITE_CHANGE_RESERVOIR]: t('Pod Change'),\n [SITE_CHANGE_TUBING]: t('Pod Activate'),\n [SITE_CHANGE_CANNULA]: t('Prime'),\n [MAX_BOLUS]: t('Maximum Bolus'),\n [MAX_BASAL]: t('Max Basal Rate'),\n [INSULIN_DURATION]: t('Duration of Insulin Action'),\n },\n [MEDTRONIC]: {\n [SITE_CHANGE_RESERVOIR]: t('Rewind'),\n [SITE_CHANGE_TUBING]: t('Prime'),\n [SITE_CHANGE_CANNULA]: t('Cannula Prime'),\n [AUTOMATED_DELIVERY]: t('Auto Mode'),\n [SCHEDULED_DELIVERY]: t('Manual'),\n [MAX_BOLUS]: t('Max Bolus'),\n [MAX_BASAL]: t('Max Basal'),\n [INSULIN_DURATION]: t('Active Insulin Time'),\n },\n [MICROTECH]: {\n [SITE_CHANGE_RESERVOIR]: t('Rewind'),\n [SITE_CHANGE_TUBING]: t('Reservoir Prime'),\n [SITE_CHANGE_CANNULA]: t('Cannula Prime'),\n },\n [TANDEM]: {\n [SITE_CHANGE_RESERVOIR]: t('Cartridge Change'),\n [SITE_CHANGE_TUBING]: t('Tubing Fill'),\n [SITE_CHANGE_CANNULA]: t('Cannula Fill'),\n [AUTOMATED_DELIVERY]: t('Automation'),\n [SCHEDULED_DELIVERY]: t('Manual'),\n [SETTINGS_OVERRIDE]: t('Activity'),\n [SLEEP]: { label: t('Sleep'), marker: t('Z') },\n [PHYSICAL_ACTIVITY]: { label: t('Exercise'), marker: t('E') },\n [MAX_BOLUS]: t('Max Bolus'),\n [INSULIN_DURATION]: t('Insulin Duration'),\n },\n [TIDEPOOL_LOOP]: {\n [AUTOMATED_DELIVERY]: t('Automation'),\n [AUTOMATED_MODE_EXITED]: t('Off'),\n [SCHEDULED_DELIVERY]: t('Manual'),\n [SETTINGS_OVERRIDE]: t('Preset'),\n [PHYSICAL_ACTIVITY]: { label: t('Workout'), marker: t('W') },\n [MAX_BOLUS]: t('Maximum Bolus'),\n [MAX_BASAL]: t('Maximum Basal Rate'),\n },\n [TWIIST_LOOP]: {\n [SITE_CHANGE_RESERVOIR]: t('Cassette Change'),\n [AUTOMATED_DELIVERY]: t('Automation'),\n [AUTOMATED_MODE_EXITED]: t('Off'),\n [SCHEDULED_DELIVERY]: t('Manual'),\n [SETTINGS_OVERRIDE]: t('Preset'),\n [PHYSICAL_ACTIVITY]: { label: t('Workout'), marker: t('W') },\n [MAX_BOLUS]: t('Maximum Bolus'),\n [MAX_BASAL]: t('Maximum Basal Rate'),\n [ALARM_NO_INSULIN]: t('Cassette Empty'),\n [ALARM_OCCLUSION]: t('Line Blocked'),\n },\n [DIY_LOOP]: {\n [AUTOMATED_DELIVERY]: t('Automation'),\n [AUTOMATED_MODE_EXITED]: t('Off'),\n [SCHEDULED_DELIVERY]: t('Manual'),\n [SETTINGS_OVERRIDE]: t('Preset'),\n [PHYSICAL_ACTIVITY]: { label: t('Workout'), marker: t('W') },\n [MAX_BOLUS]: t('Maximum Bolus'),\n [MAX_BASAL]: t('Maximum Basal Rate'),\n },\n default: {\n [SITE_CHANGE_RESERVOIR]: t('Cartridge Change'),\n [SITE_CHANGE_TUBING]: t('Tubing Fill'),\n [SITE_CHANGE_CANNULA]: t('Cannula Fill'),\n [AUTOMATED_BOLUS]: t('Automated'),\n [AUTOMATED_DELIVERY]: t('Automated'),\n [AUTOMATED_SUSPEND]: t('Automated Suspend'),\n [AUTOMATED_MODE_EXITED]: t('Exited'),\n [SCHEDULED_DELIVERY]: t('Manual'),\n [SETTINGS_OVERRIDE]: t('Settings Override'),\n [SLEEP]: { label: t('Sleep'), marker: t('Z') },\n [PHYSICAL_ACTIVITY]: { label: t('Exercise'), marker: t('E') },\n [PREPRANDIAL]: { label: t('Premeal'), marker: t('P') },\n [MAX_BOLUS]: t('Max Bolus'),\n [MAX_BASAL]: t('Max Basal'),\n [INSULIN_DURATION]: t('Insulin Duration'),\n [ONE_BUTTON_BOLUS]: t('One-Button Bolus'),\n [ALARM_NO_DELIVERY]: t('Insulin Delivery Stopped'),\n [ALARM_AUTO_OFF]: t('Pump Auto-Off'),\n [ALARM_NO_INSULIN]: t('Reservoir Empty'),\n [ALARM_NO_POWER]: t('Battery Empty'),\n [ALARM_OCCLUSION]: t('Occlusion Detected'),\n [ALARM_OVER_LIMIT]: t('Insulin Delivery Limit Exceeded'),\n [EVENT_PUMP_SHUTDOWN]: t('Pump Shutdown'),\n },\n};\n\nexport const settingsOverrides = {\n [TANDEM]: [\n SLEEP,\n PHYSICAL_ACTIVITY,\n ],\n [TIDEPOOL_LOOP]: [\n PHYSICAL_ACTIVITY,\n PREPRANDIAL,\n ],\n [TWIIST_LOOP]: [\n PHYSICAL_ACTIVITY,\n PREPRANDIAL,\n ],\n [DIY_LOOP]: [\n PREPRANDIAL,\n ],\n default: [\n SLEEP,\n PHYSICAL_ACTIVITY,\n PREPRANDIAL,\n ],\n};\n\nexport const AUTOMATED_BASAL_DEVICE_MODELS = {\n [MEDTRONIC]: ['1580', '1581', '1582', '1780', '1781', '1782'],\n};\nexport const BG_DATA_TYPES = [\n 'cbg',\n 'smbg',\n];\n\nexport const DIABETES_DATA_TYPES = [\n ...BG_DATA_TYPES,\n 'basal',\n 'bolus',\n 'wizard',\n 'food',\n];\n\nexport const BG_COLORS = {\n veryLow: '#FB5951',\n low: '#FF8B7C',\n target: '#76D3A6',\n high: '#BB9AE7',\n veryHigh: '#8C65D6',\n};\n","/*\n * == BSD2 LICENSE ==\n * Copyright (c) 2016, Tidepool Project\n *\n * This program is free software; you can redistribute it and/or modify it under\n * the terms of the associated License, which is identical to the BSD 2-Clause\n * License as published by the Open Source Initiative at opensource.org.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n * FOR A PARTICULAR PURPOSE. See the License for more details.\n *\n * You should have received a copy of the License along with this program; if\n * not, you can obtain one from Tidepool Project at tidepool.org.\n * == BSD2 LICENSE ==\n */\n\n/*\n * Guidelines for these utilities:\n *\n * 1. Only \"workhorse\" functions used in 2+ places should be here.\n * 1a. A function used in multiple components for one view should live\n * in view-specific utils: src/utils/[view]/datetime.js\n * 1b. A function used in only one component should just be part of that component,\n * potentially as a named export if tests are deemed important to have.\n *\n * 2. Function naming scheme: the two main verbs here are `get` and `format`.\n * 2a. If the function returns any kind of datetime (JavaScript Date, hammertime, ISO 8601 String),\n * then the function name should start with `get`.\n * 2b. If the function returns a _formatted_ String that will be **surfaced to the end user**,\n * then the function name should start with `format`.\n *\n * 3. Function organizational scheme in this file and tests file: alphabetical plz, unless ESLint\n * complains about an undefined (e.g., getTimezoneFromTimePrefs must be at the top).\n *\n * 4. Try to be consistent in how params are used:\n * (e.g., always pass in `timePrefs`) rather than a named timezone\n * and try to copy & paste JSDoc @param descriptions for common params.\n *\n */\n\nimport _ from 'lodash';\n// using d3-time-format because time is time of data access in\n// user’s browser time, not PwD’s configured timezone\nimport { utcFormat, timeFormat } from 'd3-time-format';\nimport moment from 'moment-timezone';\nimport sundial from 'sundial';\nimport i18next from 'i18next';\n\nconst t = i18next.t.bind(i18next);\n\nexport const THIRTY_MINS = 1800000;\nexport const ONE_HR = 3600000;\nexport const THREE_HRS = 10800000;\nexport const TWENTY_FOUR_HRS = 86400000;\n\n/**\n * getMsPer24\n * @param {String} utc - Zulu timestamp (Integer hammertime also OK)\n * @param {String} timezoneName - valid timezoneName String\n * @returns\n */\nexport function getMsPer24(utc, timezoneName = 'UTC') {\n const localized = moment.utc(utc).tz(timezoneName);\n const hrsToMs = localized.hours() * 1000 * 60 * 60;\n const minToMs = localized.minutes() * 1000 * 60;\n const secToMs = localized.seconds() * 1000;\n const ms = localized.milliseconds();\n return hrsToMs + minToMs + secToMs + ms;\n}\n\n/**\n * getOffset\n * @param {String} utc - Zulu timestamp (Integer hammertime also OK)\n * @param {String} timezoneName - valid timezoneName String\n *\n * @return {Object} a JavaScript Date, the closest (future) midnight according to timePrefs;\n * if utc is already local midnight, returns utc\n */\nexport function getOffset(utc, timezoneName) {\n const utcHammertime = (typeof utc === 'string') ? Date.parse(utc) : utc;\n return moment.tz.zone(timezoneName).utcOffset(utcHammertime);\n}\n\n/**\n * getBrowserTimezone\n * @returns {String} browser-determined timezone name\n */\nexport function getBrowserTimezone() {\n return new Intl.DateTimeFormat().resolvedOptions().timeZone;\n}\n\n/**\n * getTimezoneFromTimePrefs\n * @param {Object} timePrefs - object containing timezoneAware Boolean and timezoneName String\n *\n * @return {String} timezoneName from timePrefs, browser, or fallback to 'UTC'\n */\nexport function getTimezoneFromTimePrefs(timePrefs = {}) {\n const { timezoneAware, timezoneName } = timePrefs;\n try {\n let timezone = getBrowserTimezone() || 'UTC';\n if (timezoneAware && timezoneName) {\n timezone = timezoneName;\n }\n sundial.checkTimezoneName(timezone);\n return timezone;\n } catch (err) {\n return 'UTC';\n }\n}\n\n/**\n * formatBirthdate\n * @param {Object} patient - Tidepool patient object containing profile\n *\n * @return {String} formatted birthdate, e.g., 'Jul 4, 1975'; empty String if none found\n */\nexport function formatBirthdate(patient) {\n const bday = _.get(patient, ['profile', 'patient', 'birthday'], '');\n if (bday) {\n return utcFormat('%b %-d, %Y')(Date.parse(bday));\n }\n return '';\n}\n\n/**\n * formatClocktimeFromMsPer24\n * @param {Number} duration - positive integer representing a time of day\n * in milliseconds within a 24-hr day\n * @param {String} [format] - optional moment display format string; default is 'h:mm a'\n *\n * @return {String} formatted clocktime, e.g., '12:05 pm'\n */\nexport function formatClocktimeFromMsPer24(milliseconds, format = 'h:mm a') {\n if (_.isNull(milliseconds) || _.isUndefined(milliseconds) ||\n milliseconds < 0 || milliseconds > TWENTY_FOUR_HRS || milliseconds instanceof Date) {\n throw new Error('First argument must be a value in milliseconds per twenty-four hour day!');\n }\n return moment.utc(milliseconds).format(format);\n}\n\n/**\n * formatCurrentDate\n * @return {String} formatted current date, e.g., 'Jul 4, 2017';\n */\nexport function formatCurrentDate() {\n return timeFormat('%b %-d, %Y')(new Date());\n}\n\n/**\n * formatDiagnosisDate\n * @param {Object} patient - Tidepool patient object containing profile\n *\n * @return {String} formatted diagnosis date, e.g., 'Jul 4, 1975'; empty String if none found\n */\nexport function formatDiagnosisDate(patient) {\n const diagnosis = _.get(patient, ['profile', 'patient', 'diagnosisDate'], '');\n if (diagnosis) {\n return utcFormat('%b %-d, %Y')(Date.parse(diagnosis));\n }\n return '';\n}\n\n/**\n * formatDateRange\n * @param {String|Date} startDate - A moment-compatible date object or string\n * @param {String|Date} endDate - A moment-compatible date object or string\n * @param {String} format - Optional. The moment format string to parse startDate and endDate with\n */\nexport function formatDateRange(startDate, endDate, dateParseFormat, monthFormat = 'MMM') {\n const start = moment.utc(startDate, dateParseFormat);\n const end = moment.utc(endDate, dateParseFormat);\n\n const isSameYear = start.isSame(end, 'year');\n const isSameDay = start.isSame(end, 'day');\n const startFormat = isSameYear ? start.format(`${monthFormat} D`) : start.format(`${monthFormat} D, YYYY`);\n const endFormat = end.format(`${monthFormat} D, YYYY`);\n\n const formattedRange = isSameDay ? endFormat : `${startFormat} - ${endFormat}`;\n\n return formattedRange;\n}\n\n/**\n * formatDuration\n * @param {Number} duration - positive integer duration in milliseconds\n * @param {String} format - one of [hoursFractional, condensed]\n * @return {String} formatted duration, e.g., '1¼ hr'\n */\nexport function formatDuration(duration, opts = {}) {\n const momentDuration = moment.duration(duration);\n const days = momentDuration.days();\n const hours = momentDuration.hours();\n const minutes = momentDuration.minutes();\n const seconds = momentDuration.seconds();\n\n const QUARTER = opts.ascii ? ' 1/4' : '¼';\n const THIRD = opts.ascii ? ' 1/3' : '⅓';\n const HALF = opts.ascii ? ' 1/2' : '½';\n const TWO_THIRDS = opts.ascii ? ' 2/3' : '⅔';\n const THREE_QUARTERS = opts.ascii ? ' 3/4' : '¾';\n\n if (opts.condensed) {\n const formatted = {\n days: '',\n hours: '',\n minutes: '',\n seconds: '',\n };\n\n if (days + hours + minutes === 0) {\n // Less than a minute\n if (seconds > 0) {\n formatted.seconds = `${seconds}s`;\n } else {\n formatted.minutes = '0m';\n }\n } else {\n let roundedMinutes = seconds >= 30 ? minutes + 1 : minutes;\n let roundedHours = hours;\n let roundedDays = days;\n\n if (roundedMinutes >= 60) {\n roundedMinutes = roundedMinutes - 60;\n roundedHours++;\n }\n\n if (roundedHours >= 24) {\n roundedHours = roundedHours - 24;\n roundedDays++;\n }\n\n formatted.days = roundedDays !== 0 ? `${roundedDays}d ` : '';\n formatted.hours = roundedHours !== 0 ? `${roundedHours}h ` : '';\n formatted.minutes = roundedMinutes !== 0 ? `${roundedMinutes}m ` : '';\n }\n\n return `${formatted.days}${formatted.hours}${formatted.minutes}${formatted.seconds}`.trim();\n } else if (hours !== 0) {\n const suffix = (hours === 1) ? 'hr' : 'hrs';\n switch (minutes) {\n case 0:\n return `${hours} ${suffix}`;\n case 15:\n return `${hours}${QUARTER} ${suffix}`;\n case 20:\n return `${hours}${THIRD} ${suffix}`;\n case 30:\n return `${hours}${HALF} ${suffix}`;\n case 40:\n return `${hours}${TWO_THIRDS} ${suffix}`;\n case 45:\n return `${hours}${THREE_QUARTERS} ${suffix}`;\n default:\n return `${hours} ${suffix} ${minutes} min`;\n }\n } else {\n return `${minutes} min`;\n }\n}\n\n/**\n * formatLocalizedFromUTC\n * @param {String} utc - Zulu timestamp (Integer hammertime also OK)\n * @param {Object} timePrefs - object containing timezoneAware Boolean and timezoneName String\n * @param {String} [format] - optional moment display format string; default is 'dddd, MMMM D'\n *\n * @return {String} formatted datetime, e.g., 'Sunday, January 1'\n */\nexport function formatLocalizedFromUTC(utc, timePrefs, format = 'dddd, MMMM D') {\n if (utc instanceof Date) {\n throw new Error('`utc` must be a ISO-formatted String timestamp or integer hammertime!');\n }\n const timezone = getTimezoneFromTimePrefs(timePrefs);\n return moment.utc(utc).tz(timezone).format(format);\n}\n\n/**\n * getLocalizedCeiling\n * @param {String} utc - Zulu timestamp (Integer hammertime also OK)\n * @param {Object} timePrefs - object containing timezoneAware Boolean and timezoneName String\n * @param {String} period - the period to round the timestamp to the ceiling of\n *\n * @return {Object} a JavaScript Date, the start of the next closes period according timePrefs;\n * If period is 'day', this fn returns the closest future midnight\n * If period is 'hour', this fn returns the start of the closest future hour\n * if utc is already local midnight, returns utc\n */\nexport function getLocalizedCeiling(utc, timePrefs, period = 'day') {\n if (utc instanceof Date) {\n throw new Error('`utc` must be a ISO-formatted String timestamp or integer hammertime!');\n }\n if (!_.includes(['day', 'hour'], period)) {\n throw new Error('`period` must be either \"day\" or \"hour\"');\n }\n const timezone = getTimezoneFromTimePrefs(timePrefs);\n const startOfPeriod = moment.utc(utc)\n .tz(timezone)\n .startOf(period);\n\n const utcHammertime = (typeof utc === 'string') ? Date.parse(utc) : utc;\n if (startOfPeriod.valueOf() === utcHammertime) {\n return startOfPeriod.toDate();\n }\n return startOfPeriod.add(1, period).toDate();\n}\n\n/**\n * formatTimeAgo\n *\n * @param {String|Date} utc - A moment-compatible date object or string\n * @param {Object} timePrefs - object containing timezoneAware Boolean and timezoneName String\n * @param {String} format - Optional. The moment format string to use for dates beyond 30 days ago\n *\n * @return {Object} Object containing the formatted time ago string, and the calculated days ago as an integer\n */\nexport const formatTimeAgo = (utc, timePrefs, format = 'YYYY-MM-DD') => {\n const timezone = getTimezoneFromTimePrefs(timePrefs);\n const endOfToday = moment.utc(getLocalizedCeiling(new Date().toISOString(), timePrefs)).tz(timezone);\n const endOfProvidedDay = moment.utc(getLocalizedCeiling(utc, timePrefs)).tz(timezone);\n const daysAgo = endOfToday.diff(endOfProvidedDay, 'days', true);\n const minutesAgo = moment.utc().tz(timezone).diff(utc, 'minutes');\n const hoursAgo = moment.utc().tz(timezone).diff(utc, 'hours');\n const lastUploadDateMoment = moment.utc(utc).tz(timezone);\n let daysText = lastUploadDateMoment.format(format);\n\n if (daysAgo < 2) {\n daysText = (daysAgo >= 1) ? t('yesterday') : t('today');\n } else if (daysAgo <= 30) {\n daysText = t('{{days}} days ago', { days: Math.ceil(daysAgo) });\n }\n\n const hoursText = t('{{hoursAgo}} {{unit}} ago', { hoursAgo, unit: hoursAgo === 1 ? 'hour' : 'hours' });\n\n let minutesText = t('{{minutesAgo}} {{unit}} ago', { minutesAgo, unit: minutesAgo === 1 ? 'minute' : 'minutes' });\n if (minutesAgo < 1) minutesText = t('a few seconds ago');\n\n return {\n daysAgo,\n daysText,\n hoursAgo,\n hoursText,\n minutesAgo,\n minutesText,\n };\n};\n","import _ from 'lodash';\n\nimport {\n AUTOMATED_BASAL_DEVICE_MODELS,\n pumpVocabulary,\n settingsOverrides,\n} from './constants';\n\nimport { deviceName } from './settings/data';\n\n/**\n * Get the latest upload datum\n * @param {Array} uploadData Array of Tidepool upload data\n * @returns {Object} The latest upload datum\n */\nexport function getLatestPumpUpload(uploadData = []) {\n return _.findLast(uploadData, { deviceTags: ['insulin-pump'] });\n}\n\n/**\n * Get the latest manual basal schedule name from an array of basal data\n * @param {Array} basalData Array of Tidepool basal data\n * @returns {Object} The latest manual basal schedule name, else undefined\n */\nexport function getLastManualBasalSchedule(basalData = []) {\n const lastManualBasal = _.findLast(basalData, { deliveryType: 'scheduled' });\n return _.get(lastManualBasal, 'scheduleName');\n}\n\n/**\n * Check to see if datum is from DIY Loop\n */\nexport function isDIYLoop(datum = {}) {\n return (/^com\\.[a-zA-Z0-9]*\\.?loopkit\\.Loop/).test(_.get(datum, 'origin.name', datum?.client?.name || ''));\n}\n\n/**\n * Check to see if datum is from Tidepool Loop\n*/\nexport function isTidepoolLoop(datum = {}) {\n return (/^org\\.tidepool\\.[a-zA-Z0-9]*\\.?Loop/).test(_.get(datum, 'origin.name', datum?.client?.name || ''));\n}\n\n/**\n * Check to see if datum is from Twiist Loop\n*/\nexport function isTwiistLoop(datum = {}) {\n if (datum.type === 'upload') {\n const majorVersion = parseInt(_.get(datum, 'client.version', '0').split('.')[0], 10);\n return (/^com.sequelmedtech.tidepool-service/).test(_.get(datum, 'client.name', '')) && majorVersion >= 2;\n }\n return (/^com.dekaresearch.twiist/).test(_.get(datum, 'origin.name', datum?.client?.name || ''));\n}\n\n/**\n * Check to see if datum is from Control-IQ\n */\nexport function isControlIQ(datum = {}) {\n return _.get(datum, 'deviceId', '').indexOf('tandemCIQ') === 0;\n}\n\n/**\n * Check to see if datum is from LibreView API\n */\nexport function isLibreViewAPI(datum = {}) {\n const TARGET = 'org.tidepool.abbott.libreview.partner.api';\n return datum?.client?.name === TARGET || datum?.origin?.name === TARGET;\n}\n\n/**\n * Check to see if datum is from a known Loop device\n */\nexport function isLoop(datum = {}) {\n return datum.tags?.loop || isDIYLoop(datum) || isTidepoolLoop(datum) || isTwiistLoop(datum);\n}\n\n/**\n * Check if the provided datum was for an automated basal device\n * @param {String} manufacturer Manufacturer name\n * @param {Object} pumpSettingsOrUpload Tidepool pumpSettings or upload datum\n * @param {String} deviceModel Device model number\n * @returns {Boolean}\n */\nexport function isAutomatedBasalDevice(manufacturer, pumpSettingsOrUpload = {}, deviceModel) {\n return _.includes(_.get(AUTOMATED_BASAL_DEVICE_MODELS, deviceName(manufacturer), []), deviceModel)\n || (manufacturer === 'tandem' && isControlIQ(pumpSettingsOrUpload))\n || isLoop(pumpSettingsOrUpload);\n}\n\n/**\n * Check if the provided datum was for an automated bolus device\n * @param {String} manufacturer Manufacturer name\n * @param {Object} pumpSettingsOrUpload Tidepool pumpSettings or upload datum\n * @returns {Boolean}\n */\nexport function isAutomatedBolusDevice(manufacturer, pumpSettingsOrUpload = {}) {\n return (manufacturer === 'tandem' && isControlIQ(pumpSettingsOrUpload))\n || isDIYLoop(pumpSettingsOrUpload);\n}\n\n/**\n * Check if the provided datum was for a settings-overrideable device\n * @param {String} manufacturer Manufacturer name\n * @param {Object} pumpSettingsOrUpload Tidepool pumpSettings or upload datum\n * @returns {Boolean}\n */\nexport function isSettingsOverrideDevice(manufacturer, pumpSettingsOrUpload = {}) {\n return (manufacturer === 'tandem' && isControlIQ(pumpSettingsOrUpload))\n || isLoop(pumpSettingsOrUpload);\n}\n\n/**\n * Check if the provided datum was for a 1-minute CGM sample interval device\n * @param {Object} pumpSettingsOrUpload Tidepool pumpSettings or upload datum\n * @returns {Boolean}\n */\nexport function isOneMinCGMSampleIntervalDevice(pumpSettingsOrUpload = {}) {\n return isTwiistLoop(pumpSettingsOrUpload);\n}\n\n/**\n * Get the uppercased manufacturer name\n * @param {String} manufacturer Manufacturer name\n */\nexport function getUppercasedManufacturer(manufacturer = '') {\n return _.map(manufacturer.split(' '), part => {\n switch (part) {\n case 'diy':\n return _.upperCase(part);\n case 'twiist':\n return part;\n default:\n return _.upperFirst(part);\n }\n }).join(' ');\n}\n\n/**\n * Get a list of standard settings overrides for a settings-overrideable device,\n * with default fallbacks for missing keys\n * @param {String} manufacturer Manufacturer name\n * @returns {Array} settings overrides\n */\nexport function getSettingsOverrides(manufacturer) {\n return _.get(settingsOverrides, getUppercasedManufacturer(manufacturer), settingsOverrides.default);\n}\n\n/**\n * Get a pump terminology vocabulary, with default fallbacks for missing keys\n * @param {String} manufacturer Manufacturer name\n * @returns {Object} pump vocabulary\n */\nexport function getPumpVocabulary(manufacturer) {\n const vocabulary = _.cloneDeep(pumpVocabulary);\n return _.defaults(\n _.get(vocabulary, getUppercasedManufacturer(manufacturer), {}),\n vocabulary.default\n );\n}\n","/*\n * == BSD2 LICENSE ==\n * Copyright (c) 2016, Tidepool Project\n *\n * This program is free software; you can redistribute it and/or modify it under\n * the terms of the associated License, which is identical to the BSD 2-Clause\n * License as published by the Open Source Initiative at opensource.org.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n * FOR A PARTICULAR PURPOSE. See the License for more details.\n *\n * You should have received a copy of the License along with this program; if\n * not, you can obtain one from Tidepool Project at tidepool.org.\n * == BSD2 LICENSE ==\n */\n\n/*\n * Guidelines for these utilities:\n *\n * 1. Only \"workhorse\" functions used in 2+ places should be here.\n * 1a. A function used in multiple components for one view should live\n * in view-specific utils: src/utils/[view]/format.js\n * 1b. A function used in only one component should just be part of that component,\n * potentially as a named export if tests are deemed important to have.\n * 1c. This set of utilities is ONLY for NON-datetime related formatting. Any functions\n * used for formatting dates and/or times should go in src/utils/datetime.js\n *\n * 2. Function naming scheme: the main verb here is `format`. Start all function names with that.\n *\n * 3. Function organizational scheme in this file and tests file: alphabetical plz\n *\n * 4. Try to be consistent in how params are used:\n * (e.g., always pass in `bgPrefs`) rather than some (subset) of bgUnits and/or bgBounds\n * and try to copy & paste JSDoc @param descriptions for common params.\n *\n */\n\nimport _ from 'lodash';\nimport { format } from 'd3-format';\nimport { convertToMmolL } from './bloodglucose';\nimport { BG_HIGH, BG_LOW, MMOLL_UNITS } from './constants';\n\n/**\n * bankersRound\n *\n * Rounding with balanced tie-breaking to reduce upward bias in rounding by rounding the midway\n * point digit (x.5) to the nearest even number, rather than always upwards.\n * ref: https://stackoverflow.com/a/49080858\n *\n * Used as default rounding in AGP reports.\n *\n * @param {Number} value - numeric value to format\n * @param {Number} [precision] - optional number of decimal places to display;\n * if not provided, will display as integer (0 decimal places)\n *\n * @return {Number} numeric value rounded to the desired number of decimal places\n */\nexport function bankersRound(value, precision = 0) {\n /* eslint-disable no-nested-ternary */\n const x = value * (10 ** precision);\n const r = Math.round(x);\n const br = Math.abs(x) % 1 === 0.5 ? (r % 2 === 0 ? r : r - 1) : r;\n return br / (10 ** precision);\n /* eslint-enable no-nested-ternary */\n}\n\n/**\n * precisionRound\n *\n * Rounding numbers to desired precison.\n *\n * @param {Number} value - numeric value to format\n * @param {Number} [precision] - optional number of decimal places to display;\n * if not provided, will display as integer (0 decimal places)\n *\n * @return {Number} numeric value rounded to the desired number of decimal places\n */\nexport function precisionRound(value, precision = 0) {\n const shift = precision > 0 ? 10 ** precision : 1;\n return Math.round(value * shift) / shift;\n}\n\n/**\n * formatBgValue\n * @param {Number} val - integer or float blood glucose value in either mg/dL or mmol/L\n * @param {Object} bgPrefs - object containing bgUnits String and bgBounds Object\n * @param {Object} [outOfRangeThresholds] - optional thresholds for `low` and `high` values;\n * derived from annotations in PwD's data, so may not exist\n *\n * @return {String} formatted blood glucose value\n */\nexport function formatBgValue(val, bgPrefs, outOfRangeThresholds) {\n const units = _.get(bgPrefs, 'bgUnits', '');\n\n if (!_.isEmpty(outOfRangeThresholds)) {\n let lowThreshold = outOfRangeThresholds.low;\n let highThreshold = outOfRangeThresholds.high;\n\n if (units === MMOLL_UNITS) {\n if (lowThreshold) {\n lowThreshold = convertToMmolL(lowThreshold);\n }\n if (highThreshold) {\n highThreshold = convertToMmolL(highThreshold);\n }\n }\n if (lowThreshold && val < lowThreshold) {\n return BG_LOW;\n }\n if (highThreshold && val > highThreshold) {\n return BG_HIGH;\n }\n }\n\n if (units === MMOLL_UNITS) {\n return bankersRound(val, 1).toFixed(1);\n }\n\n return bankersRound(val).toString();\n}\n\n/**\n * formatDecimalNumber\n *\n * This (and all d3-format methods) is to format numbers for localized human display.\n * To use rounded results in calculations, use the `precisionRound` utility\n *\n * @param {Number} val - numeric value to format\n * @param {Number} [places] - optional number of decimal places to display;\n * if not provided, will display as integer (0 decimal places)\n *\n * @return {String} numeric value rounded to the desired number of decimal places\n */\nexport function formatDecimalNumber(val, places) {\n if (places === null || places === undefined) {\n return format('d')(val);\n }\n return format(`.${places}f`)(val);\n}\n\n/**\n * formatInsulin\n *\n * @export\n * @param {Number} val - numeric value to format\n * @returns {String} numeric value formatted for the precision of insulin dosing\n */\nexport function formatInsulin(val) {\n let decimalLength = 1;\n const qtyString = val.toString();\n if (qtyString.indexOf('.') !== -1) {\n const length = qtyString.split('.')[1].length;\n decimalLength = _.min([length, 3]);\n }\n return formatDecimalNumber(val, decimalLength);\n}\n\n/**\n * formatPercentage\n * @param {Number} val - raw decimal proportion, range of 0.0 to 1.0\n *\n * @return {String} percentage\n */\nexport function formatPercentage(val, precision = 0, useAGPFormat) {\n if (Number.isNaN(val)) {\n return '--%';\n }\n return useAGPFormat\n ? `${bankersRound(val * 100, precision)}%`\n : format(`.${precision}%`)(val);\n}\n\n/**\n * formatStatsPercentage\n * @param {Number} val - raw decimal proportion, range of 0.0 to 1.0\n *\n * @return {String} percentage\n */\nexport function formatStatsPercentage(value) {\n if (Number.isNaN(value)) return '--';\n\n const percentage = value * 100;\n const roundedValue = bankersRound(percentage, 0);\n\n return _.toString(roundedValue);\n}\n\n/**\n * removeTrailingZeroes\n * @param {String} - formatted decimal value, may have trailing zeroes\n *\n * @return {String} - formatted decimal value w/o trailing zero-indexes\n */\nexport function removeTrailingZeroes(val) {\n return val.replace(/\\.0+$/, '');\n}\n","import { GLYCEMIC_RANGES_PRESET, GLYCEMIC_RANGES_TYPE } from './constants';\n\n/**\n * Extracts the glycemic ranges preset value from the glycemicRanges object of the\n * clinicPatient record\n *\n * @param {Object} glycemicRanges the glycemicRanges object of the clinicPatient record\n *\n * @return {String} target range preset, e.g. 'adaStandard', 'adaPregnancyType1', etc\n */\nexport const getGlycemicRangesPreset = glycemicRanges => {\n // glycemicRanges field will not exist on older clinicPatient records\n if (!glycemicRanges) return GLYCEMIC_RANGES_PRESET.ADA_STANDARD;\n\n switch (glycemicRanges.type) {\n case GLYCEMIC_RANGES_TYPE.PRESET:\n return glycemicRanges.preset;\n case GLYCEMIC_RANGES_TYPE.CUSTOM:\n // feature to be implemented in future revisions\n default: // eslint-disable-line no-fallthrough\n return GLYCEMIC_RANGES_PRESET.ADA_STANDARD;\n }\n};\n","/*\n * == BSD2 LICENSE ==\n * Copyright (c) 2016, Tidepool Project\n *\n * This program is free software; you can redistribute it and/or modify it under\n * the terms of the associated License, which is identical to the BSD 2-Clause\n * License as published by the Open Source Initiative at opensource.org.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n * FOR A PARTICULAR PURPOSE. See the License for more details.\n *\n * You should have received a copy of the License along with this program; if\n * not, you can obtain one from Tidepool Project at tidepool.org.\n * == BSD2 LICENSE ==\n */\n\nimport _ from 'lodash';\nimport i18next from 'i18next';\n\nimport * as datetime from '../datetime';\nimport * as format from '../format';\nimport { getPumpVocabulary, isControlIQ, isLoop } from '../device';\n\nimport {\n MAX_BOLUS,\n MAX_BASAL,\n INSULIN_DURATION,\n PHYSICAL_ACTIVITY,\n PREPRANDIAL,\n} from '../../utils/constants';\n\nconst t = i18next.t.bind(i18next);\nconst BASAL_RATE_PRECISION_PLACES = 3;\nconst MAX_BASAL_RATE_PRECISION_PLACES = 2;\n\n/**\n * noData\n * @param {ANY} val value to check\n *\n * @return {Boolean} true if value is defined, not null, not empty string, false otherwise\n */\nexport function noData(val) {\n return val == null || (typeof val === 'string' && _.isEmpty(val));\n}\n\n/**\n * deviceName\n * @param {String} manufacturer one of: animas, insulet, medtronic, tandem, microtech, loop\n *\n * @return {String} name for given manufacturer\n */\nexport function deviceName(manufacturer) {\n const DEVICE_DISPLAY_NAME_BY_MANUFACTURER = {\n animas: 'Animas',\n insulet: 'OmniPod',\n medtronic: 'Medtronic',\n tandem: 'Tandem',\n microtech: 'Equil',\n 'diy loop': 'DIY Loop',\n 'tidepool loop': 'Tidepool Loop',\n twiist: 'twiist',\n };\n return DEVICE_DISPLAY_NAME_BY_MANUFACTURER[manufacturer] || manufacturer;\n}\n\n/**\n * getBasalRate\n * @private\n * @param {Array} scheduleData basal schedule\n * @param {Number} startTime milliseconds from start of day\n * @return {String} formatted basal rate\n */\nfunction getBasalRate(scheduleData, startTime) {\n const rate = _.find(scheduleData, (schedule) =>\n schedule.start === startTime\n ).rate;\n\n if (noData(rate)) {\n return '';\n }\n return format.formatDecimalNumber(rate, BASAL_RATE_PRECISION_PLACES);\n}\n\n/**\n * getValue\n * @private\n * @param {Array} scheduleData scheduleData\n * @param {String} fieldName field to search for\n * @param {Number} startTime milliseconds from start of day\n *\n * @return {String} value of field for startTime\n */\nfunction getValue(scheduleData, fieldName, startTime) {\n const val = _.find(scheduleData, (schedule) =>\n schedule.start === startTime\n )[fieldName];\n\n if (noData(val)) {\n return '';\n }\n return val;\n}\n\n/**\n * getBloodGlucoseValue\n * @private\n * @param {Array} scheduleData scheduleData\n * @param {String} fieldName field to search format\n * @param {Number} startTime milliseconds from start of day\n * @param {String} units MGDL_UNITS or MMOLL_UNITS\n *\n * @return {String} formatted blood glucose value\n */\nfunction getBloodGlucoseValue(scheduleData, fieldName, startTime, units) {\n const bgValue = getValue(scheduleData, fieldName, startTime);\n if (noData(bgValue)) {\n return '';\n }\n return format.formatBgValue(bgValue, { bgUnits: units });\n}\n\n/**\n * getStarts\n * @private\n * @param {Array} timedData array with time based data\n *\n * @return {Array} array of start times in milliseconds\n */\nfunction getStarts(timedData) {\n return _.map(timedData, 'start');\n}\n\n/**\n * getTotalBasalRates\n * @param {Array} scheduleData basal schedule data\n *\n * @return {String} formatted total of basal rates\n */\nexport function getTotalBasalRates(scheduleData) {\n const HOUR_IN_MILLISECONDS = 60 * 60 * 1000;\n const DAY_IN_MILLISECONDS = 86400000;\n\n let total = 0;\n for (let i = scheduleData.length - 1; i >= 0; i--) {\n const start = scheduleData[i].start;\n let finish = DAY_IN_MILLISECONDS;\n const next = i + 1;\n if (next < scheduleData.length) {\n finish = scheduleData[next].start;\n }\n const hrs = (finish - start) / HOUR_IN_MILLISECONDS;\n const amount = parseFloat(scheduleData[i].rate.toFixed(BASAL_RATE_PRECISION_PLACES)) * hrs;\n total += parseFloat(amount.toFixed(BASAL_RATE_PRECISION_PLACES));\n }\n return format.formatDecimalNumber(total, BASAL_RATE_PRECISION_PLACES);\n}\n\n/**\n * getScheduleLabel\n * @param {String} scheduleName basal schedule name\n * @param {String} activeName name of active basal schedule at time of upload\n * @param {String} deviceKey one of: animas, carelink, insulet, medtronic, tandem, microtech, tidepool loop, diy loop, twiist\n * @param {Boolean} noUnits whether units should be included in label object\n *\n * @return {Object} object representing basal schedule label\n */\nexport function getScheduleLabel(scheduleName, activeName, deviceKey, noUnits) {\n const CAPITALIZED = ['carelink', 'medtronic'];\n let displayName = scheduleName;\n if (_.includes(CAPITALIZED, deviceKey)) {\n displayName = _.map(scheduleName.split(' '), (part) => (_.upperFirst(part))).join(' ');\n }\n return {\n main: displayName,\n secondary: scheduleName === activeName ? 'Active at upload' : '',\n units: noUnits ? '' : 'U/hr',\n };\n}\n\n/**\n * getScheduleNames\n * @param {Object} settingsData object with basal schedule properties\n *\n * @return {Array} array of basal schedule names\n */\nexport function getScheduleNames(settingsData) {\n return _.keysIn(settingsData);\n}\n\n/**\n * getTimedSchedules\n * @param {Array} settingsData array of basal schedules\n *\n * @return {Array} array of {name, position} basal objects\n */\nexport function getTimedSchedules(settingsData) {\n const names = _.map(settingsData, 'name');\n const schedules = [];\n for (let i = names.length - 1; i >= 0; i--) {\n schedules.push({ name: names[i], position: i });\n }\n return schedules;\n}\n\n/**\n * getDeviceMeta\n * @param {Object} settingsData all settings data\n * @param {Object} timePrefs timezone preferences object\n *\n * @return {Object} filtered meta data\n */\nexport function getDeviceMeta(settingsData = {}, timePrefs) {\n const utc = settingsData.normalTime;\n const uploadedTime = utc ?\n datetime.formatLocalizedFromUTC(utc, timePrefs, 'MMM D, YYYY') :\n false;\n return {\n schedule: settingsData.activeSchedule || 'unknown',\n uploaded: uploadedTime || 'unknown',\n serial: settingsData.deviceSerialNumber || 'unknown',\n };\n}\n\n/**\n * processBasalRateData\n * @param {Object} scheduleData basal schedule object\n *\n * @return {Array} array of formatted schedule entries\n */\nexport function processBasalRateData(scheduleData) {\n const starts = getStarts(scheduleData.value);\n const noRateData = [{ start: '-', rate: '-' }];\n\n if (starts.length === 0) {\n return noRateData;\n } else if (starts.length === 1) {\n if (Number(getBasalRate(scheduleData.value, starts[0])) === 0) {\n return noRateData;\n }\n }\n\n const data = _.map(starts, (startTime) => ({\n start: datetime.formatClocktimeFromMsPer24(\n startTime\n ),\n rate: getBasalRate(\n scheduleData.value,\n startTime\n ),\n }));\n\n data.push({\n start: 'Total',\n rate: getTotalBasalRates(scheduleData.value),\n });\n return data;\n}\n\n/**\n * processBgTargetData\n * @param {Array} targetsData array of blood glucose targets\n * @param {String} bgUnits MGDL_UNITS or MMOLL_UNITS\n * @param {Object} keys key names as {columnTwo, columnThree}\n *\n * @return {Array} formatted bloog glucose target data\n */\nexport function processBgTargetData(targetsData, bgUnits, keys) {\n return _.map(getStarts(targetsData), (startTime) => ({\n start: datetime.formatClocktimeFromMsPer24(\n startTime\n ),\n columnTwo: getBloodGlucoseValue(\n targetsData,\n keys.columnTwo,\n startTime,\n bgUnits\n ),\n columnThree: getBloodGlucoseValue(\n targetsData,\n keys.columnThree,\n startTime,\n bgUnits\n ),\n }));\n}\n\n/**\n * processCarbRatioData\n * @param {Array} carbRatioData array of carb ratio data\n *\n * @return {Array} array of formatted carb ratio objects\n */\nexport function processCarbRatioData(carbRatioData) {\n return _.map(getStarts(carbRatioData), (startTime) => ({\n start: datetime.formatClocktimeFromMsPer24(\n startTime\n ),\n amount: getValue(\n carbRatioData,\n 'amount',\n startTime\n ),\n }));\n}\n\n/**\n * processSensitivityData\n * @param {Array} sensitivityData array of sensitivity data\n * @param {String} bgUnits MGDL_UNITS or MMOLL_UNITS\n *\n * @return {Array} array of formatted sensitivity objects\n */\nexport function processSensitivityData(sensitivityData, bgUnits) {\n return _.map(getStarts(sensitivityData), (startTime) => ({\n start: datetime.formatClocktimeFromMsPer24(\n startTime\n ),\n amount: getBloodGlucoseValue(\n sensitivityData,\n 'amount',\n startTime,\n bgUnits\n ),\n }));\n}\n\n/**\n * processTimedSettings\n * @param {Object} pumpSettings entire pump settings object\n * @param {Object} schedule {name, position} schedule object\n * @param {String} bgUnits MGDL_UNITS or MMOLL_UNITS\n *\n * @return {Array} array of formatted objects with\n * {start, rate, bgTarget, carbRatio, insulinSensitivity}\n */\nexport function processTimedSettings(pumpSettings, schedule, bgUnits) {\n const data = _.map(getStarts(pumpSettings.bgTargets[schedule.name]), (startTime) => ({\n start: datetime.formatClocktimeFromMsPer24(\n startTime\n ),\n rate: getBasalRate(\n pumpSettings.basalSchedules[schedule.position].value,\n startTime\n ),\n bgTarget: getBloodGlucoseValue(\n pumpSettings.bgTargets[schedule.name],\n 'target',\n startTime,\n bgUnits\n ),\n carbRatio: getValue(\n pumpSettings.carbRatios[schedule.name],\n 'amount',\n startTime\n ),\n insulinSensitivity: getBloodGlucoseValue(\n pumpSettings.insulinSensitivities[schedule.name],\n 'amount',\n startTime,\n bgUnits\n ),\n }));\n\n data.push({\n start: 'Total',\n rate: getTotalBasalRates(\n pumpSettings.basalSchedules[schedule.position].value\n ),\n bgTarget: '',\n carbRatio: '',\n insulinSensitivity: '',\n });\n return data;\n}\n\n/**\n * startTimeAndValue\n * @param {TYPE} accessor key for value displayed in this column\n *\n * @return {Array} array of objects describing table columns\n */\nexport function startTimeAndValue(valueKey) {\n return [\n { key: 'start', label: 'Start time' },\n { key: valueKey, label: 'Value' },\n ];\n}\n\n/**\n * insulinSettings\n *\n * @param {Object} settings object with pump settings data\n * @param {String} manufacturer one of: animas, carelink, insulet, medtronic, tandem, microtech, tidepool loop, diy loop, twiist\n * @param {String} [scheduleName] name of schedule for tandem settings\n */\nexport function insulinSettings(settings, manufacturer, scheduleName) {\n const bgUnits = settings?.units?.bg;\n const deviceLabels = getPumpVocabulary(manufacturer);\n const maxBasal = _.get(settings, scheduleName ? `basal[${scheduleName}].rateMaximum.value` : 'basal.rateMaximum.value');\n const maxBolus = _.get(settings, scheduleName ? `bolus[${scheduleName}].amountMaximum.value` : 'bolus.amountMaximum.value');\n let insulinDurationUnits = _.get(settings, scheduleName ? `bolus[${scheduleName}].calculator.insulin.units` : 'bolus.calculator.insulin.units');\n let insulinDuration = _.get(settings, scheduleName ? `bolus[${scheduleName}].calculator.insulin.duration` : 'bolus.calculator.insulin.duration');\n\n if (_.includes(['diy loop', 'tidepool loop', 'twiist'], manufacturer)) {\n insulinDuration = _.get(settings, 'insulinModel.actionDuration');\n insulinDurationUnits = 'milliseconds';\n }\n\n const columns = [\n { key: 'setting' },\n { key: 'value' },\n ];\n\n if (insulinDurationUnits === 'minutes') {\n const durationInHours = Math.floor(insulinDuration / 60);\n const minutesRemainder = insulinDuration % 60;\n\n insulinDuration = (minutesRemainder > 0)\n ? `${durationInHours}:${_.padStart(minutesRemainder, 2, '0')}`\n : durationInHours;\n }\n\n if (insulinDurationUnits === 'milliseconds') {\n const durationInHours = Math.floor(insulinDuration / 60 / 60);\n const minutesRemainder = insulinDuration % 60;\n\n insulinDuration = (minutesRemainder > 0)\n ? `${durationInHours}:${_.padStart(minutesRemainder, 2, '0')}`\n : durationInHours;\n }\n\n const rows = [\n { setting: deviceLabels[MAX_BASAL], value: maxBasal ? `${format.formatDecimalNumber(maxBasal, MAX_BASAL_RATE_PRECISION_PLACES)} U/hr` : '-' },\n { setting: deviceLabels[MAX_BOLUS], value: maxBolus ? `${maxBolus} U` : '-' },\n { setting: deviceLabels[INSULIN_DURATION] + (isControlIQ(settings) ? '*' : ''), value: insulinDuration ? `${insulinDuration} hrs` : '-' },\n ];\n\n if (isLoop(settings)) {\n const insulinModelLabels = {\n rapidAdult: t('Rapid-Acting - Adults'),\n rapidChild: t('Rapid Acting - Children'),\n fiasp: t('Fiasp'),\n lyumjev: t('Lyumjev'),\n afrezza: t('Afrezza'),\n };\n\n const insulinModel = {\n label: insulinModelLabels[settings?.insulinModel?.modelType] || settings?.insulinModel?.modelType || t('Unknown'),\n peakMinutes: _.isFinite(settings?.insulinModel?.actionPeakOffset) ? settings.insulinModel.actionPeakOffset / 60 : null,\n };\n\n const device = deviceName(manufacturer);\n\n const insulinModelAnnotations = [\n t('{{device}} assumes that the insulin it has delivered is actively working to lower your glucose for 6 hours. This setting cannot be changed.', { device }),\n ];\n\n if (insulinModel.peakMinutes) insulinModelAnnotations.push(t('The {{label}} model assumes peak activity at {{peakMinutes}} minutes.', insulinModel));\n\n rows.unshift({\n annotations: [t('{{device}} will deliver basal and recommend bolus insulin only if your glucose is predicted to be above this limit for the next three hours.', { device })],\n setting: t('Glucose Safety Limit'),\n value: `${format.formatBgValue(settings?.bgSafetyLimit, { bgUnits })} ${bgUnits}`,\n });\n\n rows.splice(3, 1, {\n annotations: insulinModelAnnotations,\n setting: t('Insulin Model'),\n value: insulinModel.label,\n });\n }\n\n // Tandem insulin settings do not have max basal\n if (manufacturer === 'tandem') rows.shift();\n\n return {\n columns,\n rows,\n };\n}\n\n/**\n * presetSettings\n *\n * @param {Object} settings object with pump settings data\n * @param {String} manufacturer one of: tidepool loop, diy loop, twiist\n */\nexport function presetSettings(settings, manufacturer) {\n const deviceLabels = getPumpVocabulary(manufacturer);\n const bgUnits = settings?.units?.bg;\n const correctionRange = range => `${format.formatBgValue(range?.low, { bgUnits })}-${format.formatBgValue(range?.high, { bgUnits })}`;\n\n const columns = [\n { key: 'name', label: 'Name' },\n { key: 'value', label: `${t('Correction Range')} (${bgUnits})` },\n ];\n\n const rows = [];\n if (settings?.bgTargetPreprandial) rows.push({ name: deviceLabels[PREPRANDIAL]?.label, value: correctionRange(settings?.bgTargetPreprandial) });\n if (settings?.bgTargetPhysicalActivity) rows.push({ name: deviceLabels[PHYSICAL_ACTIVITY]?.label, value: correctionRange(settings?.bgTargetPhysicalActivity) });\n\n return {\n columns,\n rows,\n };\n}\n","import _ from 'lodash';\nimport React from 'react';\nimport i18next from 'i18next';\n\nimport {\n generateBgRangeLabels,\n classifyBgValue,\n classifyCvValue,\n reshapeBgClassesToBgBounds,\n} from './bloodglucose';\n\nimport {\n AUTOMATED_DELIVERY,\n BG_COLORS,\n LBS_PER_KG,\n MS_IN_DAY,\n SCHEDULED_DELIVERY,\n SETTINGS_OVERRIDE,\n} from './constants';\n\nimport { getPumpVocabulary, getSettingsOverrides } from './device';\nimport { bankersRound, formatDecimalNumber, formatBgValue, formatStatsPercentage } from './format';\nimport { formatDuration } from './datetime';\n\nconst t = i18next.t.bind(i18next);\n\nif (_.get(i18next, 'options.returnEmptyString') === undefined) {\n // Return key if no translation is present\n i18next.init({ returnEmptyString: false, nsSeparator: '|' });\n}\n\nexport const dailyDoseUnitOptions = [\n {\n label: 'kg',\n value: 'kg',\n },\n {\n label: 'lb',\n value: 'lb',\n },\n];\n\nexport const statTypes = {\n barHorizontal: 'barHorizontal',\n barBg: 'barBg',\n input: 'input',\n simple: 'simple',\n};\n\nexport const statBgSourceLabels = {\n cbg: t('CGM'),\n smbg: t('BGM'),\n};\n\nexport const statFormats = {\n bgCount: 'bgCount',\n bgRange: 'bgRange',\n bgValue: 'bgValue',\n cv: 'cv',\n carbs: 'carbs',\n duration: 'duration',\n gmi: 'gmi',\n percentage: 'percentage',\n standardDevRange: 'standardDevRange',\n standardDevValue: 'standardDevValue',\n units: 'units',\n unitsPerKg: 'unitsPerKg',\n};\n\nexport const commonStats = {\n averageGlucose: 'averageGlucose',\n averageDailyDose: 'averageDailyDose',\n bgExtents: 'bgExtents',\n carbs: 'carbs',\n coefficientOfVariation: 'coefficientOfVariation',\n glucoseManagementIndicator: 'glucoseManagementIndicator',\n readingsInRange: 'readingsInRange',\n sensorUsage: 'sensorUsage',\n standardDev: 'standardDev',\n timeInAuto: 'timeInAuto',\n timeInOverride: 'timeInOverride',\n timeInRange: 'timeInRange',\n totalInsulin: 'totalInsulin',\n};\n\nexport const statFetchMethods = {\n [commonStats.averageGlucose]: 'getAverageGlucoseData',\n [commonStats.averageDailyDose]: 'getTotalInsulinData',\n [commonStats.bgExtents]: 'getBgExtentsData',\n [commonStats.carbs]: 'getCarbsData',\n [commonStats.coefficientOfVariation]: 'getCoefficientOfVariationData',\n [commonStats.glucoseManagementIndicator]: 'getGlucoseManagementIndicatorData',\n [commonStats.readingsInRange]: 'getReadingsInRangeData',\n [commonStats.sensorUsage]: 'getSensorUsage',\n [commonStats.standardDev]: 'getStandardDevData',\n [commonStats.timeInAuto]: 'getTimeInAutoData',\n [commonStats.timeInOverride]: 'getTimeInOverrideData',\n [commonStats.timeInRange]: 'getTimeInRangeData',\n [commonStats.totalInsulin]: 'getBasalBolusData',\n};\n\nexport const getSum = data => _.sum(_.map(data, d => _.max([d.value, 0])));\n\nexport const ensureNumeric = value => (_.isNil(value) || _.isNaN(value) ? -1 : parseFloat(value));\n\nexport const isRangeDefined = value => ensureNumeric(value) > -1;\n\nexport const formatDatum = (datum = {}, format, opts = {}) => {\n let id = datum.id;\n let value = _.isFinite(datum) ? datum : datum.value;\n let suffix = datum.suffix || '';\n let deviation;\n let lowerValue;\n let lowerColorId;\n let upperValue;\n let upperColorId;\n\n const {\n bgPrefs,\n data,\n useAGPFormat,\n emptyDataPlaceholder = '--',\n forcePlainTextValues = false,\n } = opts;\n\n const total = _.get(data, 'total.value');\n\n const disableStat = () => {\n id = 'statDisabled';\n value = emptyDataPlaceholder;\n };\n\n switch (format) {\n case statFormats.bgCount:\n if (value >= 0) {\n const precision = value < 0.05 ? 2 : 1;\n // Note: the + converts the rounded, fixed string back to a number\n // This allows 2.67777777 to render as 2.7 and 3.0000001 to render as 3 (not 3.0)\n value = +value.toFixed(precision);\n } else {\n disableStat();\n }\n break;\n\n case statFormats.bgRange:\n value = generateBgRangeLabels(bgPrefs, { condensed: true })[id];\n break;\n\n case statFormats.bgValue:\n if (value >= 0) {\n id = classifyBgValue(_.get(bgPrefs, 'bgBounds'), bgPrefs?.bgUnits, value, 'threeWay');\n value = formatBgValue(value, bgPrefs);\n } else {\n disableStat();\n }\n break;\n\n case statFormats.carbs:\n if (_.isPlainObject(value) && (value.grams > 0 || value.exchanges > 0)) {\n const { grams, exchanges } = value;\n value = [];\n suffix = [];\n if (grams > 0) {\n value.push(formatDecimalNumber(grams));\n suffix.push('g');\n }\n if (exchanges > 0) {\n // Note: the + converts the rounded, fixed string back to a number\n // This allows 2.67777777 to render as 2.7 and 3.0000001 to render as 3 (not 3.0)\n value.push(+formatDecimalNumber(exchanges, 1));\n suffix.push('exch');\n }\n } else {\n disableStat();\n }\n break;\n\n case statFormats.cv:\n if (value >= 0) {\n id = classifyCvValue(value);\n value = useAGPFormat\n ? bankersRound(value, 1).toString()\n : formatDecimalNumber(value);\n suffix = '%';\n } else {\n disableStat();\n }\n break;\n\n case statFormats.duration:\n if (value >= 0) {\n value = formatDuration(value, { condensed: true });\n } else {\n disableStat();\n }\n break;\n\n case statFormats.gmi:\n if (value >= 0) {\n value = useAGPFormat\n ? bankersRound(value, 1).toString()\n : formatDecimalNumber(value, 1);\n suffix = '%';\n } else {\n disableStat();\n }\n break;\n\n case statFormats.percentage:\n if (total && total >= 0) {\n value = _.max([value, 0]);\n value = formatStatsPercentage(value / total);\n suffix = '%';\n } else {\n disableStat();\n }\n break;\n\n case statFormats.standardDevRange:\n deviation = _.get(datum, 'deviation.value', -1);\n if (value >= 0 && deviation >= 0) {\n lowerValue = value - deviation;\n lowerColorId = lowerValue >= 0\n ? classifyBgValue(_.get(bgPrefs, 'bgBounds'), bgPrefs?.bgUnits, lowerValue, 'threeWay')\n : 'low';\n\n upperValue = value + deviation;\n upperColorId = classifyBgValue(_.get(bgPrefs, 'bgBounds'), bgPrefs?.bgUnits, upperValue, 'threeWay');\n\n lowerValue = formatBgValue(lowerValue, bgPrefs);\n upperValue = formatBgValue(upperValue, bgPrefs);\n\n value = !forcePlainTextValues ? (\n <span>\n <span style={{\n color: BG_COLORS[lowerColorId],\n }}>\n {lowerValue}\n </span>\n - \n <span style={{\n color: BG_COLORS[upperColorId],\n }}>\n {upperValue}\n </span>\n </span>\n ) : `${lowerValue}-${upperValue}`;\n } else {\n disableStat();\n }\n break;\n\n case statFormats.standardDevValue:\n if (value >= 0) {\n value = formatBgValue(value, bgPrefs);\n } else {\n disableStat();\n }\n break;\n\n case statFormats.units:\n if (value >= 0) {\n value = formatDecimalNumber(value, 1);\n suffix = 'U';\n } else {\n disableStat();\n }\n break;\n\n case statFormats.unitsPerKg:\n if (suffix === 'lb') {\n value = value * LBS_PER_KG;\n }\n suffix = 'U/kg';\n if (value > 0 && _.isFinite(value)) {\n value = formatDecimalNumber(value, 2);\n } else {\n disableStat();\n }\n break;\n\n default:\n break;\n }\n\n return {\n id,\n value,\n suffix,\n };\n};\n\n/**\n * reconcileTIRPercentages\n * @param {Object} timeInRanges - the percent TIR values for each range in decimal form\n * - e.g. { veryLow: 0.012, low: 0.056, target: 0.612, high: 0.294, veryHigh: 0.021 }\n *\n * @returns {Object} an object with values corrected to sum up to 100%\n * - if the values do not sum up to 100%, the 'high' range is adjusted to compensate\n */\nexport const reconcileTIRPercentages = (timeInRanges) => {\n const DECIMAL_PRECISION = 2;\n\n // Round each TIR value to whole integers for percentages (e.g. 0.21428 -> 0.21)\n const modifiedTimeInRanges = _.cloneDeep(timeInRanges);\n const rangeKeys = _.keys(modifiedTimeInRanges);\n\n _.forEach(rangeKeys, key => {\n modifiedTimeInRanges[key] = bankersRound(modifiedTimeInRanges[key], DECIMAL_PRECISION);\n });\n\n // Calculate the sum of all TIR values. It should be close to 1 (or 100%)\n const rangeValues = _.values(modifiedTimeInRanges);\n const sum = _.reduce(rangeValues, (acc, cur) => acc + cur, 0);\n\n // Error Case: If the discrepancy from 100% is >2%, there is something wrong with\n // the incoming data. Performing additional calculations on TIR would compound the\n // error. Instead, we'll return the data in its original state.\n if (sum < 0.98 || sum > 1.02) return timeInRanges;\n\n // Calculate the difference from 100% and dump the discrepancy into the 'high' range.\n // e.g. if sum === 0.99 and high === 0.21, we increase high to 0.22 so that all TIR\n // values add up to 1 (or 100%).\n const diff = 1 - sum;\n const newHigh = bankersRound((modifiedTimeInRanges.high || 0) + diff, DECIMAL_PRECISION);\n modifiedTimeInRanges.high = newHigh;\n\n return modifiedTimeInRanges;\n};\n\n/**\n * reconcileTIRDatumValues\n * @param {Object} statTIRDatum - the stat TIR datum\n * - Should contain the following subfields:\n * - data.data - an array of TIR datums for all of the ranges\n * - data.total.value - a number representing the total time duration\n *\n * @returns {Object} a modified stat TIR datum so the percentages add to 100%\n */\nexport const reconcileTIRDatumValues = (statTIRDatum) => {\n // For each of the individual range datums, calculate its percentage of the total\n const ranges = {};\n const total = statTIRDatum.data?.total?.value;\n\n _.forEach(statTIRDatum.data.data, datum => {\n ranges[datum.id] = datum.value / total;\n });\n\n // Reconcile the values to ensure the values sum up to 1 (or 100%)\n const reconciledTimeInRanges = reconcileTIRPercentages(ranges);\n\n // Multiply the reconciled percentages with the total to get the reconciled datum\n // values. We return a modified stat TIR datum with these reconciled values.\n const modifiedStatTIRDatum = _.cloneDeep(statTIRDatum);\n\n const rangeKeys = _.keys(reconciledTimeInRanges);\n _.forEach(rangeKeys, key => {\n const datum = _.find(modifiedStatTIRDatum.data.data, d => d.id === key);\n datum.value = reconciledTimeInRanges[key] * total;\n });\n\n return modifiedStatTIRDatum;\n};\n\nexport const getStatAnnotations = (data, type, opts = {}) => {\n const { bgSource, days, manufacturer } = opts;\n const vocabulary = getPumpVocabulary(manufacturer);\n const labels = { overrideLabel: vocabulary[SETTINGS_OVERRIDE], overrideLabelLowerCase: _.lowerCase(vocabulary[SETTINGS_OVERRIDE]) };\n\n const annotations = [];\n\n const bgStats = [\n commonStats.averageGlucose,\n commonStats.coefficientOfVariation,\n commonStats.glucoseManagementIndicator,\n commonStats.readingsInRange,\n commonStats.timeInRange,\n commonStats.standardDev,\n ];\n\n switch (type) {\n case commonStats.averageGlucose:\n annotations.push(t('**Avg. Glucose ({{bgSourceLabel}}):** All {{bgSourceLabel}} glucose values added together, divided by the number of readings.', { bgSourceLabel: statBgSourceLabels[bgSource] }));\n break;\n\n case commonStats.averageDailyDose:\n if (days > 1) {\n annotations.push(t('**Avg. Daily Insulin:** All basal and bolus insulin delivery (in Units) added together, divided by the number of days in this view for which we have insulin data.'));\n } else {\n annotations.push(t('**Daily Insulin:** All basal and bolus insulin delivery (in Units) added together.'));\n }\n break;\n\n case commonStats.carbs:\n if (days > 1) {\n annotations.push(t('**Avg. Daily Carbs**: All carb entries added together, then divided by the number of days in this view for which we have carb data. Note, these entries come from either bolus wizard events, or Apple Health records.'));\n } else {\n annotations.push(t('**Total Carbs**: All carb entries from bolus wizard events or Apple Health records added together.'));\n }\n annotations.push(t('Derived from _**{{total}}**_ carb entries.', { total: data.total }));\n break;\n\n case commonStats.coefficientOfVariation:\n annotations.push(t('**CV (Coefficient of Variation):** How far apart (wide) glucose values are; research suggests a target of 36% or lower.'));\n break;\n\n case commonStats.glucoseManagementIndicator:\n annotations.push(t('**GMI (Glucose Management Indicator):** Tells you what your approximate A1C level is likely to be, based on the average glucose level from your CGM readings.'));\n break;\n\n case commonStats.readingsInRange:\n annotations.push(t('**Readings In Range:** Daily average of the number of {{smbgLabel}} readings.', { smbgLabel: statBgSourceLabels.smbg }));\n break;\n\n case commonStats.sensorUsage:\n annotations.push(t('**Sensor Usage:** Time the {{cbgLabel}} collected data, divided by the total time represented in this view.', { cbgLabel: statBgSourceLabels.cbg }));\n break;\n\n case commonStats.standardDev:\n annotations.push(t('**SD (Standard Deviation):** How far values are from the average.'));\n break;\n\n case commonStats.timeInAuto:\n if (days > 1) {\n annotations.push(t('**Time In {{automatedLabel}}:** Daily average of the time spent in automated basal delivery.', { automatedLabel: vocabulary[AUTOMATED_DELIVERY] }));\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the duration in {{automatedLabel}} divided by the total duration of basals for this time period.\\n\\n**(time)** is 24 hours multiplied by % in {{automatedLabel}}.', { automatedLabel: vocabulary[AUTOMATED_DELIVERY] }));\n } else {\n annotations.push(t('**Time In {{automatedLabel}}:** Time spent in automated basal delivery.', { automatedLabel: vocabulary[AUTOMATED_DELIVERY] }));\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the duration in {{automatedLabel}} divided by the total duration of basals for this time period.\\n\\n**(time)** is total duration of time in {{automatedLabel}}.', { automatedLabel: vocabulary[AUTOMATED_DELIVERY] }));\n }\n break;\n\n case commonStats.timeInOverride:\n if (days > 1) {\n annotations.push(t('**Time In {{overrideLabel}}:** Daily average of the time spent in {{overrideLabelLowerCase}}.', labels));\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the duration in {{overrideLabelLowerCase}} divided by the total duration for this time period.\\n\\n**(time)** is 24 hours multiplied by % in {{overrideLabelLowerCase}}.', labels));\n } else {\n annotations.push(t('**Time In {{overrideLabel}}:** Time spent in {{overrideLabelLowerCase}}.', labels));\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the duration in {{overrideLabelLowerCase}} divided by the total duration for this time period.\\n\\n**(time)** is total duration of time in {{overrideLabelLowerCase}}.', labels));\n }\n break;\n\n case commonStats.timeInRange:\n if (days > 1) {\n annotations.push(t('**Time In Range:** Daily average of the time spent in range, based on {{cbgLabel}} readings.', { cbgLabel: statBgSourceLabels.cbg }));\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the number of readings in range divided by all readings for this time period.\\n\\n**(time)** is 24 hours multiplied by % in range.'));\n } else {\n annotations.push(t('**Time In Range:** Time spent in range, based on {{cbgLabel}} readings.', { cbgLabel: statBgSourceLabels.cbg }));\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the number of readings in range divided by all readings for this time period.\\n\\n**(time)** is number of readings in range multiplied by the {{cbgLabel}} sample frequency.', { cbgLabel: statBgSourceLabels.cbg }));\n }\n break;\n\n case commonStats.totalInsulin:\n if (days > 1) {\n annotations.push(t('**Total Insulin:** All basal and bolus insulin delivery (in Units) added together, divided by the number of days in this view for which we have insulin data'));\n } else {\n annotations.push(t('**Total Insulin:** All basal and bolus insulin delivery (in Units) added together'));\n }\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the respective total of basal or bolus delivery divided by total insulin delivered for the time period for which we have insulin data.'));\n break;\n\n default:\n break;\n }\n\n if (data.insufficientData) {\n annotations.push(t('**Why is this stat empty?**\\n\\nThere is not enough data present in this view to calculate it.'));\n } else if (_.includes(bgStats, type)) {\n if (bgSource === 'smbg') {\n annotations.push(t('Derived from _**{{total}}**_ {{smbgLabel}} readings.', { total: _.get(data, 'counts.total', data.total), smbgLabel: statBgSourceLabels.smbg }));\n }\n }\n\n return annotations;\n};\n\nexport const getStatData = (data, type, opts = {}) => {\n const vocabulary = getPumpVocabulary(opts.manufacturer);\n const settingsOverrides = getSettingsOverrides(opts.manufacturer);\n const bgRanges = generateBgRangeLabels(opts.bgPrefs, { condensed: true });\n\n let statData = {\n raw: {\n days: opts.days,\n ...data,\n },\n };\n\n const readingsInRangeDataPath = opts.days > 1 ? 'dailyAverages' : 'counts';\n\n switch (type) {\n case commonStats.averageGlucose:\n statData.data = [\n {\n value: ensureNumeric(data.averageGlucose),\n },\n ];\n\n statData.dataPaths = {\n summary: 'data.0',\n };\n break;\n\n case commonStats.averageDailyDose:\n statData.data = [\n {\n id: 'insulin',\n input: {\n id: 'weight',\n label: 'Weight',\n suffix: {\n id: 'units',\n options: dailyDoseUnitOptions,\n value: opts.suffixValue || dailyDoseUnitOptions[0],\n },\n type: 'number',\n value: opts.inputValue ? ensureNumeric(opts.inputValue) : undefined,\n },\n output: {\n label: 'Daily Dose ÷ Weight',\n type: 'divisor',\n dataPaths: {\n dividend: 'data.0',\n },\n },\n value: ensureNumeric(data.totalInsulin),\n },\n ];\n\n statData.dataPaths = {\n input: 'data.0.input',\n output: 'data.0.output',\n summary: 'data.0',\n };\n break;\n\n case commonStats.bgExtents:\n statData.data = [\n {\n id: 'bgMax',\n value: ensureNumeric(data.bgMax),\n title: t('Max BG'),\n },\n {\n id: 'bgMin',\n value: ensureNumeric(data.bgMin),\n title: t('Min BG'),\n },\n ];\n break;\n\n case commonStats.carbs:\n statData.data = [\n {\n value: {\n grams: ensureNumeric(_.get(data, 'carbs.grams')),\n exchanges: ensureNumeric(_.get(data, 'carbs.exchanges')),\n },\n },\n ];\n\n statData.dataPaths = {\n summary: 'data.0',\n };\n break;\n\n case commonStats.coefficientOfVariation:\n statData.data = [\n {\n id: 'cv',\n value: ensureNumeric(data.coefficientOfVariation),\n },\n ];\n\n statData.dataPaths = {\n summary: 'data.0',\n };\n break;\n\n case commonStats.glucoseManagementIndicator:\n statData.data = [\n {\n id: 'gmi',\n value: ensureNumeric(data.glucoseManagementIndicator),\n },\n {\n id: 'gmiAGP',\n value: ensureNumeric(data.glucoseManagementIndicatorAGP),\n },\n ];\n\n statData.dataPaths = {\n summary: 'data.0',\n summaryAGP: 'data.1',\n };\n break;\n\n case commonStats.readingsInRange:\n statData.data = _.filter([\n (isRangeDefined(data[readingsInRangeDataPath]?.veryLow) && ({\n id: 'veryLow',\n value: ensureNumeric(data[readingsInRangeDataPath].veryLow),\n title: t('Readings Below Range'),\n legendTitle: bgRanges.veryLow,\n })),\n {\n id: 'low',\n value: ensureNumeric(data[readingsInRangeDataPath].low),\n title: t('Readings Below Range'),\n legendTitle: bgRanges.low,\n },\n {\n id: 'target',\n value: ensureNumeric(data[readingsInRangeDataPath].target),\n title: t('Readings In Range'),\n legendTitle: bgRanges.target,\n },\n {\n id: 'high',\n value: ensureNumeric(data[readingsInRangeDataPath].high),\n title: t('Readings Above Range'),\n legendTitle: bgRanges.high,\n },\n (isRangeDefined(data[readingsInRangeDataPath]?.veryHigh) && ({\n id: 'veryHigh',\n value: ensureNumeric(data[readingsInRangeDataPath].veryHigh),\n title: t('Readings Above Range'),\n legendTitle: bgRanges.veryHigh,\n })),\n ], Boolean);\n\n statData.total = { value: getSum(statData.data) };\n statData.dataPaths = {\n summary: [\n 'data',\n _.findIndex(statData.data, { id: 'target' }),\n ],\n totalReadings: 'raw.counts.total',\n averageDailyReadings: 'total',\n };\n break;\n\n case commonStats.sensorUsage:\n statData.data = [\n {\n value: ensureNumeric(data.sensorUsage),\n },\n {\n value: ensureNumeric(data.sensorUsageAGP),\n },\n ];\n statData.total = { value: ensureNumeric(data.total) };\n statData.dataPaths = {\n summary: 'data.0',\n summaryAGP: 'data.1',\n };\n break;\n\n case commonStats.standardDev:\n statData.data = [\n {\n value: ensureNumeric(data.averageGlucose),\n deviation: {\n value: ensureNumeric(data.standardDeviation),\n },\n },\n ];\n\n statData.dataPaths = {\n summary: 'data.0.deviation',\n title: 'data.0',\n };\n break;\n\n case commonStats.timeInAuto:\n statData.data = [\n {\n id: 'basalAutomated',\n value: ensureNumeric(data.automated),\n title: t('Time In {{automatedLabel}}', { automatedLabel: vocabulary[AUTOMATED_DELIVERY] }),\n legendTitle: vocabulary[AUTOMATED_DELIVERY],\n },\n {\n id: 'basal',\n value: ensureNumeric(data.manual),\n title: t('Time In {{scheduledLabel}}', { scheduledLabel: vocabulary[SCHEDULED_DELIVERY] }),\n legendTitle: vocabulary[SCHEDULED_DELIVERY],\n },\n ];\n\n statData.total = { value: getSum(statData.data) };\n statData.dataPaths = {\n summary: [\n 'data',\n _.findIndex(statData.data, { id: 'basalAutomated' }),\n ],\n };\n break;\n\n case commonStats.timeInOverride:\n statData.data = _.map(settingsOverrides, override => ({\n id: override,\n value: ensureNumeric(_.get(data, override, 0)),\n title: t('Time In {{overrideLabel}}', { overrideLabel: _.get(vocabulary, [override, 'label']) }),\n legendTitle: _.get(vocabulary, [override, 'label']),\n }));\n\n statData.sum = { value: getSum(statData.data) };\n statData.total = { value: MS_IN_DAY };\n statData.dataPaths = {\n summary: 'sum',\n };\n break;\n\n case commonStats.timeInRange:\n statData.data = _.filter([\n (isRangeDefined(data.durations.veryLow) && ({\n id: 'veryLow',\n value: ensureNumeric(data.durations.veryLow),\n title: t('Time Below Range'),\n legendTitle: bgRanges.veryLow,\n })),\n {\n id: 'low',\n value: ensureNumeric(data.durations.low),\n title: t('Time Below Range'),\n legendTitle: bgRanges.low,\n },\n {\n id: 'target',\n value: ensureNumeric(data.durations.target),\n title: t('Time In Range'),\n legendTitle: bgRanges.target,\n },\n {\n id: 'high',\n value: ensureNumeric(data.durations.high),\n title: t('Time Above Range'),\n legendTitle: bgRanges.high,\n },\n (isRangeDefined(data.durations.veryHigh) && ({\n id: 'veryHigh',\n value: ensureNumeric(data.durations.veryHigh),\n title: t('Time Above Range'),\n legendTitle: bgRanges.veryHigh,\n })),\n ], Boolean);\n\n statData.total = { value: getSum(statData.data) };\n statData.dataPaths = {\n summary: [\n 'data',\n _.findIndex(statData.data, { id: 'target' }),\n ],\n };\n break;\n\n case commonStats.totalInsulin:\n statData.data = [\n {\n id: 'bolus',\n value: ensureNumeric(data.bolus),\n title: t('Bolus Insulin'),\n legendTitle: t('Bolus'),\n },\n {\n id: 'basal',\n value: ensureNumeric(data.basal),\n title: t('Basal Insulin'),\n legendTitle: t('Basal'),\n },\n ];\n\n statData.total = { id: 'insulin', value: getSum(statData.data) };\n statData.dataPaths = {\n summary: 'total',\n title: 'total',\n };\n break;\n\n default:\n statData = undefined;\n break;\n }\n\n return statData;\n};\n\nexport const getStatTitle = (type, opts = {}) => {\n const { bgSource, days } = opts;\n const vocabulary = getPumpVocabulary(opts.manufacturer);\n const bgTypeLabel = bgSource === 'cbg' ? t('Glucose') : t('BG');\n\n let title;\n\n switch (type) {\n case commonStats.averageGlucose:\n title = t('Avg. Glucose ({{bgSourceLabel}})', { bgSourceLabel: statBgSourceLabels[bgSource] });\n break;\n\n case commonStats.averageDailyDose:\n title = (days > 1) ? t('Avg. Daily Insulin') : t('Total Insulin');\n break;\n\n case commonStats.bgExtents:\n title = t('{{bgTypeLabel}} Extents ({{bgSourceLabel}})', { bgSourceLabel: statBgSourceLabels[bgSource], bgTypeLabel });\n break;\n\n case commonStats.carbs:\n title = (days > 1) ? t('Avg. Daily Carbs') : t('Total Carbs');\n break;\n\n case commonStats.coefficientOfVariation:\n title = t('CV ({{bgSourceLabel}})', { bgSourceLabel: statBgSourceLabels[bgSource] });\n break;\n\n case commonStats.glucoseManagementIndicator:\n title = t('GMI ({{bgSourceLabel}})', { bgSourceLabel: statBgSourceLabels[bgSource] });\n break;\n\n case commonStats.readingsInRange:\n title = (days > 1) ? t('Avg. Daily Readings In Range') : t('Readings In Range');\n break;\n\n case commonStats.sensorUsage:\n title = t('Sensor Usage');\n break;\n\n case commonStats.standardDev:\n title = t('Std. Deviation ({{bgSourceLabel}})', { bgSourceLabel: statBgSourceLabels[bgSource] });\n break;\n\n case commonStats.timeInAuto:\n title = (days > 1)\n ? t('Avg. Daily Time In {{automatedLabel}}', { automatedLabel: vocabulary[AUTOMATED_DELIVERY] })\n : t('Time In {{automatedLabel}}', { automatedLabel: vocabulary[AUTOMATED_DELIVERY] });\n break;\n\n case commonStats.timeInOverride:\n title = (days > 1)\n ? t('Avg. Daily Time In {{overrideLabel}}', { overrideLabel: vocabulary[SETTINGS_OVERRIDE] })\n : t('Time In {{overrideLabel}}', { overrideLabel: vocabulary[SETTINGS_OVERRIDE] });\n break;\n\n case commonStats.timeInRange:\n title = (days > 1) ? t('Avg. Daily Time In Range') : t('Time In Range');\n break;\n\n case commonStats.totalInsulin:\n title = (days > 1) ? t('Avg. Daily Total Insulin') : t('Total Insulin');\n break;\n\n default:\n title = '';\n break;\n }\n\n return title;\n};\n\nexport const getStatDefinition = (data = {}, type, opts = {}) => {\n let stat = {\n annotations: getStatAnnotations(data, type, opts),\n collapsible: _.get(opts, 'collapsible', false),\n data: getStatData(data, type, opts),\n id: type,\n title: getStatTitle(type, opts),\n type: statTypes.barHorizontal,\n };\n\n switch (type) {\n case commonStats.averageGlucose:\n stat.dataFormat = {\n label: statFormats.bgValue,\n summary: statFormats.bgValue,\n };\n stat.type = statTypes.barBg;\n stat.units = _.get(opts, 'bgPrefs.bgUnits');\n break;\n\n case commonStats.averageDailyDose:\n stat.alwaysShowSummary = true;\n stat.dataFormat = {\n output: statFormats.unitsPerKg,\n summary: statFormats.units,\n };\n stat.type = statTypes.input;\n break;\n\n case commonStats.bgExtents:\n stat.dataFormat = {\n label: statFormats.bgValue,\n summary: statFormats.bgValue,\n };\n stat.type = statTypes.simple;\n stat.units = _.get(opts, 'bgPrefs.bgUnits');\n break;\n\n case commonStats.carbs:\n stat.dataFormat = {\n summary: statFormats.carbs,\n };\n stat.type = statTypes.simple;\n break;\n\n case commonStats.coefficientOfVariation:\n stat.dataFormat = {\n summary: statFormats.cv,\n };\n stat.type = statTypes.simple;\n break;\n\n case commonStats.glucoseManagementIndicator:\n stat.dataFormat = {\n summary: statFormats.gmi,\n };\n stat.type = statTypes.simple;\n break;\n\n case commonStats.readingsInRange:\n stat.alwaysShowTooltips = true;\n stat.dataFormat = {\n label: statFormats.percentage,\n summary: statFormats.percentage,\n tooltip: statFormats.bgCount,\n tooltipTitle: statFormats.bgRange,\n count: statFormats.bgCount,\n };\n stat.legend = true;\n stat.hideSummaryUnits = true;\n stat.reverseLegendOrder = true;\n stat.units = _.get(opts, 'bgPrefs.bgUnits');\n break;\n\n case commonStats.sensorUsage:\n stat.dataFormat = {\n summary: statFormats.percentage,\n };\n stat.type = statTypes.simple;\n break;\n\n case commonStats.standardDev:\n stat.dataFormat = {\n label: statFormats.standardDevValue,\n summary: statFormats.standardDevValue,\n title: statFormats.standardDevRange,\n };\n stat.type = statTypes.barBg;\n stat.units = _.get(opts, 'bgPrefs.bgUnits');\n break;\n\n case commonStats.timeInAuto:\n stat.alwaysShowTooltips = true;\n stat.dataFormat = {\n label: statFormats.percentage,\n summary: statFormats.percentage,\n tooltip: statFormats.duration,\n };\n stat.legend = true;\n break;\n\n case commonStats.timeInOverride:\n stat.alwaysShowTooltips = true;\n stat.dataFormat = {\n label: statFormats.percentage,\n summary: statFormats.percentage,\n tooltip: statFormats.duration,\n };\n stat.legend = true;\n stat.reverseLegendOrder = true;\n break;\n\n case commonStats.timeInRange:\n stat.alwaysShowTooltips = true;\n stat.dataFormat = {\n label: statFormats.percentage,\n summary: statFormats.percentage,\n tooltip: statFormats.duration,\n tooltipTitle: statFormats.bgRange,\n };\n stat.legend = true;\n stat.hideSummaryUnits = true;\n stat.reverseLegendOrder = true;\n stat.units = _.get(opts, 'bgPrefs.bgUnits');\n break;\n\n case commonStats.totalInsulin:\n stat.alwaysShowTooltips = true;\n stat.dataFormat = {\n label: statFormats.percentage,\n summary: statFormats.units,\n title: statFormats.units,\n tooltip: statFormats.units,\n };\n stat.legend = true;\n break;\n\n default:\n stat = undefined;\n break;\n }\n\n return stat;\n};\n\n/**\n * statsText\n * @param {Object} stats - all stats data\n * @param {Object} textUtil - TextUtil instance\n * @param {Object} bgPrefs - bgPrefs object from blip containing tideline-style bgClasses\n *\n * @return {String} Stats data as a formatted string\n */\nexport function statsText(stats, textUtil, bgPrefs, formatFn = formatDatum) {\n _.defaults(bgPrefs, {\n bgBounds: reshapeBgClassesToBgBounds(bgPrefs),\n });\n\n let statsString = '';\n\n _.each(stats, statArg => {\n let statTitle = `${statArg.title}${statArg.units ? ` (${statArg.units})` : ''}`;\n\n if (statArg.id === 'readingsInRange' && statArg.data?.raw?.total > 0) {\n statTitle += t(' from {{count}} readings', { count: statArg.data.raw.total });\n }\n\n const isTIRStat = _.includes(['timeInRange', 'readingsInRange'], statArg.id);\n const stat = isTIRStat ? reconcileTIRDatumValues(statArg) : statArg;\n\n const renderTable = _.includes([\n commonStats.timeInRange,\n commonStats.readingsInRange,\n commonStats.totalInsulin,\n commonStats.timeInAuto,\n commonStats.timeInOverride,\n commonStats.bgExtents,\n ], stat.id);\n\n const renderSecondaryValue = _.includes([\n commonStats.readingsInRange,\n commonStats.timeInAuto,\n commonStats.timeInOverride,\n commonStats.timeInRange,\n ], stat.id);\n\n const opts = { bgPrefs, data: stat.data, forcePlainTextValues: true };\n\n if (renderTable) {\n statsString += textUtil.buildTextTable(\n statTitle,\n _.map(_.reverse([...stat.data.data]), datum => {\n const formatted = formatFn(\n datum,\n stat.dataFormat.summary,\n opts\n );\n\n let formattedText = `${formatted.value}${formatted.suffix || ''}`;\n\n if (renderSecondaryValue) {\n const secondary = formatFn(\n datum,\n stat.dataFormat.tooltip,\n opts\n );\n\n if (stat.id === 'readingsInRange') secondary.suffix += ' readings/day';\n formattedText += ` (${secondary.value}${secondary.suffix || ''})`;\n }\n\n return {\n label: datum.legendTitle || datum.title,\n value: formattedText,\n };\n }),\n [\n { key: 'label', label: 'Label' },\n { key: 'value', label: 'Value' },\n ],\n { showHeader: false }\n );\n } else {\n const formatted = formatFn(\n _.get(stat.data, stat.data.dataPaths.summary, {}),\n stat.dataFormat.summary,\n opts\n );\n\n // Ensure zero values are not stripped by _.compact when setting values array\n if (formatted.value === 0) formatted.value = [formatted.value];\n if (!_.isArray(formatted.value)) formatted.value = _.compact([formatted.value]);\n if (!_.isArray(formatted.suffix)) formatted.suffix = _.compact([formatted.suffix]);\n\n statsString += '\\n';\n statsString += textUtil.buildTextLine({\n label: stat.title,\n value: _.map(formatted.value, (value, i) => `${value}${formatted.suffix[i] || (stat.units ? ` ${stat.units}` : '')}`).join(' '),\n });\n }\n });\n\n return statsString;\n}\n","module.exports = require(\"d3-array\");","module.exports = require(\"d3-format\");","module.exports = require(\"d3-time-format\");","module.exports = require(\"i18next\");","module.exports = require(\"lodash\");","module.exports = require(\"moment\");","module.exports = require(\"moment-timezone\");","module.exports = require(\"react\");","module.exports = require(\"sundial\");","function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n \"default\": obj\n };\n}\nmodule.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction _getRequireWildcardCache(e) {\n if (\"function\" != typeof WeakMap) return null;\n var r = new WeakMap(),\n t = new WeakMap();\n return (_getRequireWildcardCache = function _getRequireWildcardCache(e) {\n return e ? t : r;\n })(e);\n}\nfunction _interopRequireWildcard(e, r) {\n if (!r && e && e.__esModule) return e;\n if (null === e || \"object\" != _typeof(e) && \"function\" != typeof e) return {\n \"default\": e\n };\n var t = _getRequireWildcardCache(r);\n if (t && t.has(e)) return t.get(e);\n var n = {\n __proto__: null\n },\n a = Object.defineProperty && Object.getOwnPropertyDescriptor;\n for (var u in e) if (\"default\" !== u && Object.prototype.hasOwnProperty.call(e, u)) {\n var i = a ? Object.getOwnPropertyDescriptor(e, u) : null;\n i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u];\n }\n return n[\"default\"] = e, t && t.set(e, n), n;\n}\nmodule.exports = _interopRequireWildcard, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return (module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports), _typeof(o);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\nexport default function _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(undefined);\n });\n };\n}","import toPropertyKey from \"./toPropertyKey.js\";\nexport default function _defineProperty(obj, key, value) {\n key = toPropertyKey(key);\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}","import defineProperty from \"./defineProperty.js\";\nfunction ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function (r) {\n return Object.getOwnPropertyDescriptor(e, r).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n}\nexport default function _objectSpread2(e) {\n for (var r = 1; r < arguments.length; r++) {\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n defineProperty(e, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return e;\n}","import _typeof from \"./typeof.js\";\nexport default function _regeneratorRuntime() {\n \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */\n _regeneratorRuntime = function _regeneratorRuntime() {\n return e;\n };\n var t,\n e = {},\n r = Object.prototype,\n n = r.hasOwnProperty,\n o = Object.defineProperty || function (t, e, r) {\n t[e] = r.value;\n },\n i = \"function\" == typeof Symbol ? Symbol : {},\n a = i.iterator || \"@@iterator\",\n c = i.asyncIterator || \"@@asyncIterator\",\n u = i.toStringTag || \"@@toStringTag\";\n function define(t, e, r) {\n return Object.defineProperty(t, e, {\n value: r,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }), t[e];\n }\n try {\n define({}, \"\");\n } catch (t) {\n define = function define(t, e, r) {\n return t[e] = r;\n };\n }\n function wrap(t, e, r, n) {\n var i = e && e.prototype instanceof Generator ? e : Generator,\n a = Object.create(i.prototype),\n c = new Context(n || []);\n return o(a, \"_invoke\", {\n value: makeInvokeMethod(t, r, c)\n }), a;\n }\n function tryCatch(t, e, r) {\n try {\n return {\n type: \"normal\",\n arg: t.call(e, r)\n };\n } catch (t) {\n return {\n type: \"throw\",\n arg: t\n };\n }\n }\n e.wrap = wrap;\n var h = \"suspendedStart\",\n l = \"suspendedYield\",\n f = \"executing\",\n s = \"completed\",\n y = {};\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n var p = {};\n define(p, a, function () {\n return this;\n });\n var d = Object.getPrototypeOf,\n v = d && d(d(values([])));\n v && v !== r && n.call(v, a) && (p = v);\n var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p);\n function defineIteratorMethods(t) {\n [\"next\", \"throw\", \"return\"].forEach(function (e) {\n define(t, e, function (t) {\n return this._invoke(e, t);\n });\n });\n }\n function AsyncIterator(t, e) {\n function invoke(r, o, i, a) {\n var c = tryCatch(t[r], t, o);\n if (\"throw\" !== c.type) {\n var u = c.arg,\n h = u.value;\n return h && \"object\" == _typeof(h) && n.call(h, \"__await\") ? e.resolve(h.__await).then(function (t) {\n invoke(\"next\", t, i, a);\n }, function (t) {\n invoke(\"throw\", t, i, a);\n }) : e.resolve(h).then(function (t) {\n u.value = t, i(u);\n }, function (t) {\n return invoke(\"throw\", t, i, a);\n });\n }\n a(c.arg);\n }\n var r;\n o(this, \"_invoke\", {\n value: function value(t, n) {\n function callInvokeWithMethodAndArg() {\n return new e(function (e, r) {\n invoke(t, n, e, r);\n });\n }\n return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();\n }\n });\n }\n function makeInvokeMethod(e, r, n) {\n var o = h;\n return function (i, a) {\n if (o === f) throw new Error(\"Generator is already running\");\n if (o === s) {\n if (\"throw\" === i) throw a;\n return {\n value: t,\n done: !0\n };\n }\n for (n.method = i, n.arg = a;;) {\n var c = n.delegate;\n if (c) {\n var u = maybeInvokeDelegate(c, n);\n if (u) {\n if (u === y) continue;\n return u;\n }\n }\n if (\"next\" === n.method) n.sent = n._sent = n.arg;else if (\"throw\" === n.method) {\n if (o === h) throw o = s, n.arg;\n n.dispatchException(n.arg);\n } else \"return\" === n.method && n.abrupt(\"return\", n.arg);\n o = f;\n var p = tryCatch(e, r, n);\n if (\"normal\" === p.type) {\n if (o = n.done ? s : l, p.arg === y) continue;\n return {\n value: p.arg,\n done: n.done\n };\n }\n \"throw\" === p.type && (o = s, n.method = \"throw\", n.arg = p.arg);\n }\n };\n }\n function maybeInvokeDelegate(e, r) {\n var n = r.method,\n o = e.iterator[n];\n if (o === t) return r.delegate = null, \"throw\" === n && e.iterator[\"return\"] && (r.method = \"return\", r.arg = t, maybeInvokeDelegate(e, r), \"throw\" === r.method) || \"return\" !== n && (r.method = \"throw\", r.arg = new TypeError(\"The iterator does not provide a '\" + n + \"' method\")), y;\n var i = tryCatch(o, e.iterator, r.arg);\n if (\"throw\" === i.type) return r.method = \"throw\", r.arg = i.arg, r.delegate = null, y;\n var a = i.arg;\n return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, \"return\" !== r.method && (r.method = \"next\", r.arg = t), r.delegate = null, y) : a : (r.method = \"throw\", r.arg = new TypeError(\"iterator result is not an object\"), r.delegate = null, y);\n }\n function pushTryEntry(t) {\n var e = {\n tryLoc: t[0]\n };\n 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e);\n }\n function resetTryEntry(t) {\n var e = t.completion || {};\n e.type = \"normal\", delete e.arg, t.completion = e;\n }\n function Context(t) {\n this.tryEntries = [{\n tryLoc: \"root\"\n }], t.forEach(pushTryEntry, this), this.reset(!0);\n }\n function values(e) {\n if (e || \"\" === e) {\n var r = e[a];\n if (r) return r.call(e);\n if (\"function\" == typeof e.next) return e;\n if (!isNaN(e.length)) {\n var o = -1,\n i = function next() {\n for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next;\n return next.value = t, next.done = !0, next;\n };\n return i.next = i;\n }\n }\n throw new TypeError(_typeof(e) + \" is not iterable\");\n }\n return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, \"constructor\", {\n value: GeneratorFunctionPrototype,\n configurable: !0\n }), o(GeneratorFunctionPrototype, \"constructor\", {\n value: GeneratorFunction,\n configurable: !0\n }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, \"GeneratorFunction\"), e.isGeneratorFunction = function (t) {\n var e = \"function\" == typeof t && t.constructor;\n return !!e && (e === GeneratorFunction || \"GeneratorFunction\" === (e.displayName || e.name));\n }, e.mark = function (t) {\n return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, \"GeneratorFunction\")), t.prototype = Object.create(g), t;\n }, e.awrap = function (t) {\n return {\n __await: t\n };\n }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () {\n return this;\n }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) {\n void 0 === i && (i = Promise);\n var a = new AsyncIterator(wrap(t, r, n, o), i);\n return e.isGeneratorFunction(r) ? a : a.next().then(function (t) {\n return t.done ? t.value : a.next();\n });\n }, defineIteratorMethods(g), define(g, u, \"Generator\"), define(g, a, function () {\n return this;\n }), define(g, \"toString\", function () {\n return \"[object Generator]\";\n }), e.keys = function (t) {\n var e = Object(t),\n r = [];\n for (var n in e) r.push(n);\n return r.reverse(), function next() {\n for (; r.length;) {\n var t = r.pop();\n if (t in e) return next.value = t, next.done = !1, next;\n }\n return next.done = !0, next;\n };\n }, e.values = values, Context.prototype = {\n constructor: Context,\n reset: function reset(e) {\n if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) \"t\" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t);\n },\n stop: function stop() {\n this.done = !0;\n var t = this.tryEntries[0].completion;\n if (\"throw\" === t.type) throw t.arg;\n return this.rval;\n },\n dispatchException: function dispatchException(e) {\n if (this.done) throw e;\n var r = this;\n function handle(n, o) {\n return a.type = \"throw\", a.arg = e, r.next = n, o && (r.method = \"next\", r.arg = t), !!o;\n }\n for (var o = this.tryEntries.length - 1; o >= 0; --o) {\n var i = this.tryEntries[o],\n a = i.completion;\n if (\"root\" === i.tryLoc) return handle(\"end\");\n if (i.tryLoc <= this.prev) {\n var c = n.call(i, \"catchLoc\"),\n u = n.call(i, \"finallyLoc\");\n if (c && u) {\n if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);\n if (this.prev < i.finallyLoc) return handle(i.finallyLoc);\n } else if (c) {\n if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);\n } else {\n if (!u) throw new Error(\"try statement without catch or finally\");\n if (this.prev < i.finallyLoc) return handle(i.finallyLoc);\n }\n }\n }\n },\n abrupt: function abrupt(t, e) {\n for (var r = this.tryEntries.length - 1; r >= 0; --r) {\n var o = this.tryEntries[r];\n if (o.tryLoc <= this.prev && n.call(o, \"finallyLoc\") && this.prev < o.finallyLoc) {\n var i = o;\n break;\n }\n }\n i && (\"break\" === t || \"continue\" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null);\n var a = i ? i.completion : {};\n return a.type = t, a.arg = e, i ? (this.method = \"next\", this.next = i.finallyLoc, y) : this.complete(a);\n },\n complete: function complete(t, e) {\n if (\"throw\" === t.type) throw t.arg;\n return \"break\" === t.type || \"continue\" === t.type ? this.next = t.arg : \"return\" === t.type ? (this.rval = this.arg = t.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === t.type && e && (this.next = e), y;\n },\n finish: function finish(t) {\n for (var e = this.tryEntries.length - 1; e >= 0; --e) {\n var r = this.tryEntries[e];\n if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y;\n }\n },\n \"catch\": function _catch(t) {\n for (var e = this.tryEntries.length - 1; e >= 0; --e) {\n var r = this.tryEntries[e];\n if (r.tryLoc === t) {\n var n = r.completion;\n if (\"throw\" === n.type) {\n var o = n.arg;\n resetTryEntry(r);\n }\n return o;\n }\n }\n throw new Error(\"illegal catch attempt\");\n },\n delegateYield: function delegateYield(e, r, n) {\n return this.delegate = {\n iterator: values(e),\n resultName: r,\n nextLoc: n\n }, \"next\" === this.method && (this.arg = t), y;\n }\n }, e;\n}","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nexport default function _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}","export default function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArrayLimit(r, l) {\n var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n if (null != t) {\n var e,\n n,\n i,\n u,\n a = [],\n f = !0,\n o = !1;\n try {\n if (i = (t = t.call(r)).next, 0 === l) {\n if (Object(t) !== t) return;\n f = !1;\n } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n } catch (r) {\n o = !0, n = r;\n } finally {\n try {\n if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return;\n } finally {\n if (o) throw n;\n }\n }\n return a;\n }\n}","export default function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nexport default function _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}","export default function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nexport default function _toPropertyKey(arg) {\n var key = toPrimitive(arg, \"string\");\n return _typeof(key) === \"symbol\" ? key : String(key);\n}","import _typeof from \"./typeof.js\";\nexport default function _toPrimitive(input, hint) {\n if (_typeof(input) !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (_typeof(res) !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n}","export default function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import _ from 'lodash';\nimport moment from 'moment-timezone';\n\nimport { getStatDefinition } from '../stat';\nimport { getTimezoneFromTimePrefs } from '../datetime';\nimport { BGM_DATA_KEY, CGM_DATA_KEY } from '../constants';\n\nimport {\n generateAmbulatoryGlucoseProfileFigure,\n generateChartSections,\n generateDailyGlucoseProfilesFigure,\n generatePercentInRangesFigure,\n} from '../../modules/print/utils/AGPUtils';\n\n/**\n * generateAGPFigureDefinitions\n * @param {Object} data - Data as provided by DataUtil from AGP pdf query\n */\nexport async function generateAGPFigureDefinitions(data) {\n const svgDataURLS = {};\n const bgSource = _.get(data, 'metaData.bgSources.current');\n const endpoints = _.get(data, 'data.current.endpoints', {});\n const sections = generateChartSections(data, bgSource);\n\n // Generate SVG data urls from Plotly figures\n const stats = {};\n const statsData = _.get(data, 'data.current.stats', {});\n _.forOwn(statsData, (statData, statType) => {\n const stat = getStatDefinition(statData, statType, {\n bgSource,\n days: endpoints.activeDays || endpoints.days,\n bgPrefs: data.bgPrefs,\n });\n stats[statType] = stat;\n });\n\n const percentInRangesStat = bgSource === CGM_DATA_KEY ? stats.timeInRange : stats.readingsInRange;\n\n // Generate percentInRanges figure\n if (sections.percentInRanges?.sufficientData) {\n svgDataURLS.percentInRanges = generatePercentInRangesFigure(sections.percentInRanges, percentInRangesStat, data.bgPrefs, data.query?.glycemicRanges);\n }\n\n // Generate ambulatoryGlucoseProfile figure\n if (sections.ambulatoryGlucoseProfile.sufficientData || bgSource === BGM_DATA_KEY) {\n const bgData = data?.data?.current?.data?.[bgSource] || [];\n svgDataURLS.ambulatoryGlucoseProfile = generateAmbulatoryGlucoseProfileFigure(sections.ambulatoryGlucoseProfile, bgData, data.bgPrefs, bgSource);\n }\n\n // Generate dailyGlucoseProfiles figures\n if (sections.dailyGlucoseProfiles.sufficientData) {\n // All CGM data passed into AGP should be deduplicated\n const dataKey = bgSource === 'cbg' ? 'cbgDeduplicated' : bgSource;\n const bgDataByDate = _.mapValues(data?.data?.current?.aggregationsByDate?.dataByDate, dataKey);\n\n // Group daily data by week\n const { newestDatum } = stats.bgExtents?.data?.raw || {};\n\n const weeklyDates = _.chunk(_.map(_.range(14), (val, index) => (\n moment.utc(newestDatum?.time).tz(getTimezoneFromTimePrefs(data.timePrefs)).subtract(index, 'days').format('YYYY-MM-DD')\n )).reverse(), 7);\n\n const week1Data = _.map(weeklyDates[0], date => ([[date], bgDataByDate[date]]));\n const week2Data = _.map(weeklyDates[1], date => ([[date], bgDataByDate[date]]));\n\n svgDataURLS.dailyGlucoseProfiles = [\n generateDailyGlucoseProfilesFigure(sections.dailyGlucoseProfiles, week1Data, data.bgPrefs, 'dddd'),\n generateDailyGlucoseProfilesFigure(sections.dailyGlucoseProfiles, week2Data, data.bgPrefs, 'ha'),\n ];\n }\n\n return svgDataURLS;\n}\n"],"names":["_reportSubHeader","_title","_CGM_DATA_KEY","_BGM_DATA_KEY","_subtitle","_glucoseMetrics","_ambulatoryGlucosePro","_dailyGlucoseProfiles","_goals","_lodash","_interopRequireDefault","require","_i18next","_constants","_constants2","t","i18next","bind","undefined","_","get","init","returnEmptyString","nsSeparator","exports","DPI","text","reportHeader","reportSubHeader","_defineProperty2","CGM_DATA_KEY","BGM_DATA_KEY","reportFooter","reportInsuffienctData","percentInRanges","title","subtitle","GLYCEMIC_RANGES_PRESET","ADA_STANDARD","ADA_OLDER_HIGH_RISK","ADA_PREGNANCY_T1","ADA_GESTATIONAL_T2","reportInfo","dob","mrn","glucoseMetrics","averageGlucose","label","goal","mgdl","mmoll","coefficientOfVariation","subLabel","glucoseManagementIndicator","bgExtents","dailyReadingsInRange","readingsInRange","ambulatoryGlucoseProfile","description","targetRange","insufficientData","insufficientDataTitle","dailyGlucoseProfiles","bgRanges","veryHigh","high","target","low","veryLow","goals","highCombined","lowCombined","subLabels","TIRtarget","TIRminutes","black","default","section","values","ticks","summaries","bgUnits","labels","subStats","hourlyTicks","bgTicks","percentileTicks","timeTicks","weekdayTicks","calendarDates","white","lightGrey","mediumGrey","darkGrey","colors","bg","dailyProfileBg","hour","percentile","line","range","dailyProfileTarget","divider","background","shaded","bgRange","lowShaded","highShaded","empty","bgReadings","median","interQuartile","outerQuantile","fill","_AGPConstants","_format","_datetime","_bloodglucose","_glycemicRanges","_stat","_moment","boldText","textString","concat","String","chartScaleToPixels","paperPixelDimension","scaleValue","pixelsToChartScale","pixels","pointsToPixels","points","createAnnotation","options","defaultsDeep","arrowside","font","color","family","AGP_FONT_FAMILY","showarrow","calculateCGMDataSufficiency","_data$data","_data$data$current","_data$data2","_data$data2$current","_data$data2$current$s","_data$data3","_data$data3$current","_data$data3$current$s","data","arguments","length","statsByDate","current","aggregationsByDate","_ref","stats","newestDatum","bgDaysWorn","_ref2","sensorUsage","count","sampleInterval","sensorUsageAGP","sufficiencyBySection","hoursOfCGMData","MS_IN_HOUR","sufficencyMet","cgmCalendarDays","map","max","val","index","moment","utc","time","tz","getTimezoneFromTimePrefs","timePrefs","subtract","format","reverse","sensorUsageByDate","date","_statsByDate$date","_statsByDate$date2","_ref3","countForDate","sampleFrequencyForDate","_ref4","_ref4$newestDatum","newestDatumForDate","_ref4$oldestDatum","oldestDatum","oldestDatumForDate","sufficiencyMet","maxPossibleReadings","minCount","bankersRound","MS_IN_DAY","msPer24","sufficientDays","filter","topSevenSufficientDays","slice","orderBy","topSevenDaysSensorUsageMean","meanBy","calculateBGMDataSufficiency","_data$data4","_data$data4$current","_data$data4$current$d","_data$data4$current$d2","totalReadings","smbg","bgSource","_data$query","reportInfoAndMetricsWidth","chartRenderAreaTop","rightEdge","MARGINS","left","WIDTH","chartRenderAreaBottom","top","HEIGHT","bottom","sectionGap","sections","dataSufficiency","glycemicRangesPreset","getGlycemicRangesPreset","query","glycemicRanges","x","y","width","height","bordered","sufficientData","dailyGlucoseProfilesHeight","AGP_FOOTER_Y_PADDING","stat","bgPrefs","_bgPrefs$bgBounds","_bgPrefs$bgBounds2","chartAreaWidth","chartAreaHeight","AGP_SECTION_BORDER_RADIUS","plotMarginX","plotMarginTop","plotMarginBottom","paperWidth","paperHeight","barWidth","yScale","xScale","hasVeryLow","isNumber","bgBounds","veryLowThreshold","hasVeryHigh","veryHighThreshold","statTotal","_bgPrefs$bgBounds3","_bgPrefs$bgBounds4","_bgPrefs$bgBounds5","_bgPrefs$bgBounds6","_bgPrefs$bgBounds7","_bgPrefs$bgBounds8","rawCounts","statDatums","id","value","Boolean","chartData","reduce","res","datum","i","toNumber","minHeight","AGP_TIR_MIN_TARGET_HEIGHT","AGP_TIR_MIN_HEIGHT","renderedValue","rawById","raw","push","rendered","yScaleCorrection","last","name","type","marker","tickYPos","_toConsumableArray2","unshift","targetLowerBound","targetUpperBound","tick","arr","align","size","fontSizes","formatBgValue","xanchor","xshift","yanchor","getBracketPosValues","posX","posX2","posY","posY2","minBracketYOffSet","maxSubBracketYOffset","subBracketXOffset","subBracketYOffset","min","targetBracketAllowedYRange","createBracketSVG","pos","radiusX","radiusY","join","bracketYPos","bracketXExtents","bracketPos","apply","brackets","path","yref","createLeaderSVG","isLowLeader","leaderYPos","leaderXExtents","leaderPos","leaders","rangePosY","rangePosYOrderedKeys","rangeLabels","yshift","rangeValuesOrderedKeys","timeInRanges","reconcileTIRPercentages","rangeValues","formatPercentage","rangeSummaryPosY","combinedRangeSummaryValues","rangeSummaryValues","goalsPos","goalGlycemicRangesKey","ADA_STANDARD_BG_BOUNDS","MGDL_UNITS","goalsOrderedKeys","_objectSpread2","subLabelsPos","xref","rangeAnnotations","lowSummary","highSummary","layout","barmode","showlegend","margin","l","r","b","xaxis","showgrid","showline","showticklabels","zeroline","yaxis","annotations","shapes","bgData","_bgPrefs$bgBounds9","_bgPrefs$bgBounds10","AGP_SECTION_HEADER_HEIGHT","AGP_SECTION_DESCRIPTION_HEIGHT","plotMarginY","yClamp","AGP_BG_CLAMP_MGDL","AGP_BG_CLAMP_MMOLL","mungeBGDataBins","ONE_HR","AGP_LOWER_QUANTILE","AGP_UPPER_QUANTILE","quantileKeys","firstDatum","lastDatum","smoothedChartData","result","key","_chartData","_chartData2","prev","curr","next","sum","firstSmoothedDatum","lastSmoothedDatum","msX","quantileBand","upperKey","lowerKey","fillcolor","mode","simplify","shape","smoothing","bgRangeKeys","targetStart","findIndex","targetEnd","bgTickAnnotations","isTarget","includes","bgTargetMarkers","posXLeft","posYTop","posYBottom","xsizemode","ysizemode","bgGridLines","isClamp","isZero","layer","x0","x1","y0","y1","percentileLabels","percentileTickYPositions","percentileTickShiftedYPositions","medianYPos","minGap","percentileTickYShifts","shiftedYPos","percentileTickAnnotations","visible","isFinite","percentileTickLines","quarterDayTicks","hourlyTicksAnnotations","yAxes","bgmMedian","legend","showLegend","each","bin","segmentData","bandData","_ref5","thirdQuartile","firstQuartile","quantileSegment","medianData","isLastDrawableSegment","medianTickYPos","isFirstDrawableSegment","rx","medianWidth","ry","previousSegmentData","lineEnd","yAxis","domain","linecolor","mirror","legendXOffset","legendYOffset","legendRangeHeight","tickIndex","showTick","yPos","tickYPosOffset","tickTextIndex","targetReadings","lowReadings","veryLowReadings","highReadings","veryHighReadings","renderBgReadings","_ref8","classifyBgValue","d","gridcolor","tickvals","xaxis2","overlaying","tickcolor","ticklen","axis","mean","figure","dateLabelFormat","plotHeight","_bgPrefs$bgBounds11","_bgPrefs$bgBounds12","halfDayTicks","halfDayTickAnnotations","calendarDays","flatten","calendarDayAnnotations","combinedData","dayData","isLow","first","fillYExentRangeIndex","textangle","MARGIN","right","bgValue","classificationType","isEmpty","Error","gt","MMOLL_UNITS","precision","roundedValue","MGDL_PER_MMOLL","opts","minimumIncrement","BG_DISPLAY_MINIMUM_INCREMENTS","thresholds","mapValues","threshold","highLowerBound","lowUpperBound","extremeHighThreshold","condensed","anyLow","anyHigh","extremeHigh","segmented","suffix","prefix","bgDatum","outOfRangeAnnotation","find","annotation","code","DEFAULT_BG_BOUNDS","bgType","binSize","outerQuantiles","binned","groupBy","findBinForTimeOfDay","outOfRanges","findOutOfRangeAnnotations","binKeys","TWENTY_FOUR_HRS","binCalculator","calculateSmbgStatsForBin","calculateCbgStatsForBin","valueExtractor","mungedData","bgClasses","clampThreshold","total","MS_IN_MIN","_d3Array","determineRangeBoundaries","outOfRange","lowThresholds","highThresholds","boundaries","Math","floor","isOutOfRangeAnnotation","eventsAnnotatedAsOutOfRange","some","pick","uniqBy","binKey","_outerQuantiles","_slicedToArray2","_outerQuantiles$","lowerQuantile","_outerQuantiles$2","upperQuantile","sorted","sortBy","centerOfBinMs","parseInt","quantile","msFrom","msTo","outOfRangeThresholds","_BG_DISPLAY_MINIMUM_I","_DEFAULT_BG_BOUNDS","_ADA_OLDER_HIGH_RISK_","_ADA_PREGNANCY_T1_BG_","_ANIMAS","_INSULET","_MEDTRONIC","_MICROTECH","_TANDEM","_TIDEPOOL_LOOP","_TWIIST_LOOP","_DIY_LOOP","_default","_pumpVocabulary","_settingsOverrides","stiffness","damping","PRESET","CUSTOM","ADA_PREGNANCY_T1_BG_BOUNDS","extentSizes","ONE_WEEK","TWO_WEEKS","FOUR_WEEKS","SITE_CHANGE_RESERVOIR","SITE_CHANGE_TUBING","SITE_CHANGE_CANNULA","ALARM_NO_DELIVERY","ALARM_AUTO_OFF","ALARM_NO_INSULIN","ALARM_NO_POWER","ALARM_OCCLUSION","ALARM_OVER_LIMIT","EVENT_PUMP_SHUTDOWN","AUTOMATED_BOLUS","AUTOMATED_DELIVERY","AUTOMATED_SUSPEND","AUTOMATED_MODE_EXITED","SCHEDULED_DELIVERY","SETTINGS_OVERRIDE","SLEEP","PHYSICAL_ACTIVITY","PREPRANDIAL","MAX_BOLUS","MAX_BASAL","ONE_BUTTON_BOLUS","INSULIN_DURATION","INSULET","TANDEM","ANIMAS","TIDEPOOL_LOOP","DIY_LOOP","TWIIST_LOOP","MEDTRONIC","MICROTECH","BG_DATA_TYPES","patient","bday","utcFormat","Date","parse","milliseconds","isNull","isUndefined","timeFormat","startDate","endDate","dateParseFormat","monthFormat","start","end","isSameYear","isSame","isSameDay","startFormat","endFormat","diagnosis","duration","momentDuration","days","hours","minutes","seconds","QUARTER","ascii","THIRD","HALF","TWO_THIRDS","THREE_QUARTERS","formatted","roundedMinutes","roundedHours","roundedDays","trim","timezone","timezoneName","localized","utcHammertime","zone","utcOffset","_d3TimeFormat","_momentTimezone","_sundial","getBrowserTimezone","Intl","DateTimeFormat","resolvedOptions","timeZone","timezoneAware","sundial","checkTimezoneName","err","getLocalizedCeiling","period","startOfPeriod","startOf","valueOf","toDate","add","endOfToday","toISOString","endOfProvidedDay","daysAgo","diff","minutesAgo","hoursAgo","daysText","ceil","hoursText","unit","minutesText","basalData","lastManualBasal","findLast","deliveryType","uploadData","deviceTags","manufacturer","vocabulary","cloneDeep","pumpVocabulary","defaults","getUppercasedManufacturer","settingsOverrides","pumpSettingsOrUpload","deviceModel","AUTOMATED_BASAL_DEVICE_MODELS","deviceName","isControlIQ","isLoop","isDIYLoop","_datum$client4","_datum$origin","TARGET","client","origin","isTwiistLoop","_data","_datum$client","test","isTidepoolLoop","_datum$client2","_datum$client3","majorVersion","split","indexOf","_datum$tags","tags","loop","part","upperCase","upperFirst","units","lowThreshold","highThreshold","convertToMmolL","BG_LOW","BG_HIGH","toFixed","toString","decimalLength","qtyString","formatDecimalNumber","useAGPFormat","Number","isNaN","shift","pow","round","replace","_d3Format","abs","places","GLYCEMIC_RANGES_TYPE","preset","settingsData","normalTime","uploadedTime","datetime","formatLocalizedFromUTC","schedule","activeSchedule","uploaded","serial","deviceSerialNumber","scheduleName","activeName","deviceKey","noUnits","displayName","main","secondary","keysIn","names","schedules","position","settings","_settings$units","deviceLabels","getPumpVocabulary","maxBasal","maxBolus","insulinDurationUnits","insulinDuration","durationInHours","minutesRemainder","padStart","rows","setting","MAX_BASAL_RATE_PRECISION_PLACES","_settings$insulinMode","_settings$insulinMode2","_settings$insulinMode3","insulinModel","rapidAdult","rapidChild","fiasp","lyumjev","afrezza","modelType","peakMinutes","actionPeakOffset","device","insulinModelAnnotations","bgSafetyLimit","splice","columns","_settings$units2","_deviceLabels$PREPRAN","_deviceLabels$PHYSICA","correctionRange","bgTargetPreprandial","bgTargetPhysicalActivity","scheduleData","starts","getStarts","noRateData","rate","getBasalRate","startTime","formatClocktimeFromMsPer24","getTotalBasalRates","targetsData","keys","columnTwo","getBloodGlucoseValue","columnThree","carbRatioData","amount","getValue","sensitivityData","pumpSettings","bgTargets","basalSchedules","bgTarget","carbRatio","carbRatios","insulinSensitivity","insulinSensitivities","valueKey","_interopRequireWildcard","_device","BASAL_RATE_PRECISION_PLACES","noData","animas","insulet","medtronic","tandem","microtech","twiist","fieldName","timedData","finish","hrs","parseFloat","textUtil","formatFn","formatDatum","reshapeBgClassesToBgBounds","statsString","statArg","_statArg$data","_statArg$data$raw","statTitle","reconcileTIRDatumValues","renderTable","commonStats","timeInRange","totalInsulin","timeInAuto","timeInOverride","renderSecondaryValue","forcePlainTextValues","buildTextTable","dataFormat","summary","formattedText","tooltip","legendTitle","showHeader","dataPaths","isArray","compact","buildTextLine","_statFetchMethods","_react","dailyDoseUnitOptions","statTypes","barHorizontal","barBg","input","simple","statBgSourceLabels","cbg","statFormats","bgCount","cv","carbs","gmi","percentage","standardDevRange","standardDevValue","unitsPerKg","averageDailyDose","standardDev","getSum","ensureNumeric","isNil","isRangeDefined","deviation","lowerValue","lowerColorId","upperValue","upperColorId","_opts$emptyDataPlaceh","emptyDataPlaceholder","_opts$forcePlainTextV","disableStat","generateBgRangeLabels","isPlainObject","grams","exchanges","_value","classifyCvValue","formatDuration","formatStatsPercentage","createElement","style","BG_COLORS","LBS_PER_KG","modifiedTimeInRanges","rangeKeys","forEach","acc","cur","newHigh","statTIRDatum","_statTIRDatum$data","_statTIRDatum$data$to","ranges","reconciledTimeInRanges","modifiedStatTIRDatum","getStatAnnotations","overrideLabel","overrideLabelLowerCase","lowerCase","bgStats","bgSourceLabel","smbgLabel","cbgLabel","automatedLabel","getStatData","_data$readingsInRange","_data$readingsInRange2","getSettingsOverrides","statData","readingsInRangeDataPath","suffixValue","inputValue","output","dividend","bgMax","bgMin","glucoseManagementIndicatorAGP","summaryAGP","averageDailyReadings","standardDeviation","automated","manual","scheduledLabel","override","durations","bolus","basal","getStatTitle","bgTypeLabel","collapsible","alwaysShowSummary","alwaysShowTooltips","tooltipTitle","hideSummaryUnits","reverseLegendOrder","module","obj","__esModule","_typeof","_getRequireWildcardCache","e","WeakMap","has","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","set","o","Symbol","iterator","constructor","_arrayLikeToArray","len","arr2","Array","asyncGeneratorStep","gen","resolve","reject","_next","_throw","arg","info","error","done","Promise","then","_asyncToGenerator","fn","self","this","args","_defineProperty","enumerable","configurable","writable","ownKeys","getOwnPropertySymbols","getOwnPropertyDescriptors","defineProperties","_regeneratorRuntime","c","asyncIterator","toStringTag","define","wrap","Generator","create","Context","makeInvokeMethod","tryCatch","h","f","s","GeneratorFunction","GeneratorFunctionPrototype","p","getPrototypeOf","v","g","defineIteratorMethods","_invoke","AsyncIterator","invoke","__await","callInvokeWithMethodAndArg","method","delegate","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","TypeError","resultName","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","reset","isGeneratorFunction","mark","setPrototypeOf","awrap","async","pop","charAt","stop","rval","handle","complete","delegateYield","_slicedToArray","unsupportedIterableToArray","_toConsumableArray","arrayLikeToArray","iter","from","_toPropertyKey","prim","toPrimitive","hint","_unsupportedIterableToArray","minLen","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","definition","prop","_x","_generateAGPFigureDefinitions","_AGPUtils","_asyncToGenerator2","_regeneratorRuntime2","_callee","_sections$percentInRa","svgDataURLS","endpoints","statsData","percentInRangesStat","_data$data$current$da","_data$data2$current$a","_stats$bgExtents","_stats$bgExtents$data","dataKey","bgDataByDate","weeklyDates","week1Data","week2Data","_context","generateChartSections","forOwn","statType","getStatDefinition","activeDays","generatePercentInRangesFigure","generateAmbulatoryGlucoseProfileFigure","dataByDate","chunk","generateDailyGlucoseProfilesFigure"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"getAGPFigures.js","mappings":"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","sources":["webpack://@tidepool/viz/./src/modules/print/utils/AGPConstants.js","webpack://@tidepool/viz/./src/modules/print/utils/AGPUtils.js","webpack://@tidepool/viz/./src/modules/print/utils/constants.js","webpack://@tidepool/viz/./src/utils/bloodglucose.js","webpack://@tidepool/viz/./src/utils/constants.js","webpack://@tidepool/viz/./src/utils/datetime.js","webpack://@tidepool/viz/./src/utils/device.js","webpack://@tidepool/viz/./src/utils/format.js","webpack://@tidepool/viz/./src/utils/glycemicRanges.js","webpack://@tidepool/viz/./src/utils/settings/data.js","webpack://@tidepool/viz/./src/utils/stat.js","webpack://@tidepool/viz/external commonjs \"d3-array\"","webpack://@tidepool/viz/external commonjs \"d3-format\"","webpack://@tidepool/viz/external commonjs \"d3-time-format\"","webpack://@tidepool/viz/external commonjs \"i18next\"","webpack://@tidepool/viz/external commonjs \"lodash\"","webpack://@tidepool/viz/external commonjs \"moment\"","webpack://@tidepool/viz/external commonjs \"moment-timezone\"","webpack://@tidepool/viz/external commonjs \"react\"","webpack://@tidepool/viz/external commonjs \"sundial\"","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/interopRequireDefault.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/interopRequireWildcard.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/typeof.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/objectSpread2.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/regeneratorRuntime.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/slicedToArray.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack://@tidepool/viz/webpack/bootstrap","webpack://@tidepool/viz/webpack/runtime/define property getters","webpack://@tidepool/viz/webpack/runtime/hasOwnProperty shorthand","webpack://@tidepool/viz/webpack/runtime/make namespace object","webpack://@tidepool/viz/./src/utils/print/plotly.js"],"sourcesContent":["import _ from 'lodash';\nimport i18next from 'i18next';\nconst t = i18next.t.bind(i18next);\n\nimport { DPI } from './constants';\nimport { BGM_DATA_KEY, CGM_DATA_KEY, GLYCEMIC_RANGES_PRESET } from '../../../utils/constants';\n\nif (_.get(i18next, 'options.returnEmptyString') === undefined) {\n // Return key if no translation is present\n i18next.init({ returnEmptyString: false, nsSeparator: '|' });\n}\n\nexport const AGP_BG_CLAMP_MGDL = 350;\nexport const AGP_BG_CLAMP_MMOLL = 19.4;\nexport const AGP_FOOTER_Y_PADDING = DPI * 0.25;\nexport const AGP_TIR_MIN_HEIGHT = 6;\nexport const AGP_TIR_MIN_TARGET_HEIGHT = 12;\nexport const AGP_SECTION_BORDER_RADIUS = 8;\nexport const AGP_SECTION_HEADER_HEIGHT = DPI * 0.25;\nexport const AGP_SECTION_DESCRIPTION_HEIGHT = DPI * 0.25;\nexport const AGP_LOWER_QUANTILE = 0.05;\nexport const AGP_UPPER_QUANTILE = 0.95;\n\n// Preferring Helvetica instead of Arial since we don't have license and PDFkit doesn't include it\nexport const AGP_FONT_FAMILY = 'Helvetica, Arial, Sans-Serif';\n\nexport const text = {\n reportHeader: t('AGP Report:'),\n reportSubHeader: {\n [CGM_DATA_KEY]: t('Continuous Glucose Monitoring'),\n [BGM_DATA_KEY]: t('Blood Glucose Monitoring'),\n },\n reportFooter: t('Patent pending \\u2013 HealthPartners Institute dba International Diabetes Center \\u2013 All Rights Reserved. \\u00A92022'),\n reportInsuffienctData: t('Insufficient data to generate an AGP Report.'),\n percentInRanges: {\n title: {\n [CGM_DATA_KEY]: t('Time in Ranges'),\n [BGM_DATA_KEY]: t('Percent BGM Readings'),\n },\n subtitle: {\n [CGM_DATA_KEY]: {\n [GLYCEMIC_RANGES_PRESET.ADA_STANDARD]: t('Goals for Type 1 and Type 2 Diabetes'),\n [GLYCEMIC_RANGES_PRESET.ADA_OLDER_HIGH_RISK]: t('Goals for Older/High Risk (Type 1 and 2)'),\n [GLYCEMIC_RANGES_PRESET.ADA_PREGNANCY_T1]: t('Goals for Pregnancy (Type 1)'),\n [GLYCEMIC_RANGES_PRESET.ADA_GESTATIONAL_T2]: t('Goals for Pregnancy (Gestational and Type 2)'),\n PWD_SELF_DEFINED: '', // No goals for PwD self-defined ranges\n },\n [BGM_DATA_KEY]: {\n [GLYCEMIC_RANGES_PRESET.ADA_STANDARD]: '',\n [GLYCEMIC_RANGES_PRESET.ADA_OLDER_HIGH_RISK]: t('Older/High Risk'),\n [GLYCEMIC_RANGES_PRESET.ADA_PREGNANCY_T1]: t('Pregnancy'),\n [GLYCEMIC_RANGES_PRESET.ADA_GESTATIONAL_T2]: t('Pregnancy'),\n PWD_SELF_DEFINED: '', // No goals for PwD self-defined ranges\n }\n },\n },\n reportInfo: {\n dob: t('DOB:'),\n mrn: t('MRN:'),\n },\n glucoseMetrics: {\n [CGM_DATA_KEY]: {\n title: t('Glucose metrics'),\n averageGlucose: {\n label: t('Average Glucose'),\n goal: {\n mgdl: t('Goal: <154 mg/dL'),\n mmoll: t('Goal: <8.6 mmol/L'),\n },\n },\n coefficientOfVariation: {\n label: t('Glucose Variability'),\n subLabel: t('Defined as percent coefficient of variation'),\n goal: t('Goal: <=36%'), // \\u2264 unicode symbol not available in Helvetica, and we don't own license for Arial\n },\n glucoseManagementIndicator: {\n label: t('Glucose Management Indicator (GMI)'),\n goal: t('Goal: <7%'),\n },\n },\n [BGM_DATA_KEY]: {\n title: t('BGM Statistics'),\n averageGlucose: {\n label: t('Average Glucose'),\n },\n bgExtents: {\n label: t('Lowest/Highest Glucose'),\n },\n coefficientOfVariation: {\n label: t('Glucose Variability'),\n subLabel: t('Defined as percent coefficient of variation'),\n goal: t('Goal: <=36%'), // \\u2264 unicode symbol not available in Helvetica, and we don't own license for Arial\n },\n dailyReadingsInRange: {\n label: t('Average Readings/Day'),\n },\n readingsInRange: {\n label: t('Number of Readings'),\n },\n },\n },\n ambulatoryGlucoseProfile: {\n [CGM_DATA_KEY]: {\n title: t('Ambulatory Glucose Profile (AGP)'),\n description: t('AGP is a summary of glucose values from the report period, with median (50%) and other percentiles shown as if they occurred in a single day.'),\n targetRange: t('Target<br>Range'),\n insufficientData: t('Insufficient CGM data to generate AGP graph'),\n },\n [BGM_DATA_KEY]: {\n title: t('Ambulatory Glucose Profile (AGP)'),\n insufficientDataTitle: t('Modal Day BGM Values Graph'),\n description: t('AGP is a summary of glucose values from the report period, with median (50%) and other percentiles shown as if they occurred in a single day.'),\n targetRange: t('Target<br>Range'),\n insufficientData: t('Insufficient glucose data to generate AGP'),\n },\n },\n dailyGlucoseProfiles: {\n [CGM_DATA_KEY]: {\n title: t('Daily Glucose Profiles'),\n description: t('Each daily profile represents a midnight-to-midnight period.'),\n },\n [BGM_DATA_KEY]: {\n title: t('Daily Glucose Profiles'),\n description: t('Each daily profile represents a midnight-to-midnight period. The more readings available throughout the day, the more opportunities for improvement.'),\n },\n },\n bgRanges: {\n veryHigh: t('Very High'),\n high: t('High'),\n target: t('Target'),\n low: t('Low'),\n veryLow: t('Very Low'),\n },\n goals: {\n [GLYCEMIC_RANGES_PRESET.ADA_STANDARD]: {\n veryHigh: t('Goal: <5%'),\n highCombined: t('Goal: <25%'),\n target: t('Goal: >70%'),\n lowCombined: t('Goal: <4%'),\n veryLow: t('Goal: <1%'),\n },\n [GLYCEMIC_RANGES_PRESET.ADA_OLDER_HIGH_RISK]: {\n veryHigh: t('Goal: <10%'),\n highCombined: t('Goal: <50%'),\n target: t('Goal: >50%'),\n lowCombined: t('Goal: <1%'),\n // veryLow: undefined,\n },\n [GLYCEMIC_RANGES_PRESET.ADA_PREGNANCY_T1]: {\n // veryHigh: undefined,\n highCombined: t('Goal: <25%'),\n target: t('Goal: >70%'),\n lowCombined: t('Goal: <4%'),\n veryLow: t('Goal: <1%'),\n },\n [GLYCEMIC_RANGES_PRESET.ADA_GESTATIONAL_T2]: {\n // veryHigh: undefined,\n highCombined: t('Goal: n/a'),\n target: t('Goal: n/a'),\n lowCombined: t('Goal: n/a'),\n veryLow: t('Goal: n/a'),\n },\n PWD_SELF_DEFINED: {\n veryHigh: t('Goal: n/a'),\n highCombined: t('Goal: n/a'),\n target: t('Goal: n/a'),\n lowCombined: t('Goal: n/a'),\n veryLow: t('Goal: n/a'),\n }\n },\n subLabels: {\n TIRtarget: t('Each 5% increase is clinically beneficial'),\n TIRminutes: t('Each 1% time in range = about 15 minutes'),\n },\n};\n\nexport const fontSizes = {\n reportHeader: 14,\n reportSubHeader: 14,\n reportFooter: 7,\n reportInfo: {\n default: 10,\n label: 8,\n },\n section: {\n title: 9,\n subtitle: 8,\n description: 7,\n insufficientData: 7,\n },\n percentInRanges: {\n values: 9,\n ticks: 7,\n summaries: 12,\n goals: 7,\n subLabels: 7,\n },\n glucoseMetrics: {\n values: 12,\n bgUnits: 8,\n labels: 9,\n subLabels: 8,\n subStats: 8,\n goals: 8,\n },\n ambulatoryGlucoseProfile: {\n hourlyTicks: 7,\n bgTicks: 9,\n percentileTicks: 8,\n bgUnits: 7,\n targetRange: 9,\n },\n dailyGlucoseProfiles: {\n bgTicks: 7,\n bgUnits: 7,\n timeTicks: 7,\n weekdayTicks: 8,\n calendarDates: 8,\n },\n};\n\nconst black = '#000000';\nconst white = '#FFFFFF';\nconst lightGrey = '#D9D9D9';\nconst mediumGrey = '#7A7A7A';\nconst darkGrey = '#626267';\n\nexport const colors = {\n text: {\n reportHeader: '#522398',\n label: darkGrey,\n reportFooter: black,\n section: {\n title: black,\n subtitle: darkGrey,\n description: black,\n insufficientData: black,\n },\n reportInfo: black,\n calendarDates: darkGrey,\n goals: {\n veryHigh: darkGrey,\n highCombined: mediumGrey,\n target: mediumGrey,\n lowCombined: mediumGrey,\n veryLow: darkGrey,\n glucoseMetrics: darkGrey,\n },\n subLabels: {\n TIRtarget: darkGrey,\n TIRminutes: black,\n glucoseMetrics: darkGrey,\n },\n subStats: {\n glucoseMetrics: black,\n },\n ticks: {\n bg: darkGrey,\n dailyProfileBg: black,\n hour: darkGrey,\n percentile: darkGrey,\n },\n },\n line: {\n default: darkGrey,\n ticks: lightGrey,\n range: {\n target: '#00AA51',\n dailyProfileTarget: black,\n default: lightGrey,\n divider: white,\n },\n },\n white,\n black,\n lightGrey,\n mediumGrey,\n darkGrey,\n background: {\n shaded: lightGrey,\n },\n bgRange: {\n veryLow: '#CC0019',\n low: '#FF0000',\n lowShaded: '#FF8080',\n target: '#0BAD5A',\n high: '#FFBF00',\n highShaded: '#FFD180',\n veryHigh: '#FF6900',\n empty: darkGrey,\n },\n bgReadings: {\n veryLow: '#A30014',\n low: '#F20000',\n target: '#14B85C',\n high: '#FFA600',\n veryHigh: '#FF6900',\n },\n ambulatoryGlucoseProfile: {\n median: {\n veryLow: '#A30014',\n low: '#FF0000',\n target: '#00AA51',\n high: '#FFA600',\n veryHigh: '#FF7538',\n },\n interQuartile: {\n veryLow: '#A30014',\n low: '#FF0000',\n target: '#8BCD9E',\n high: '#FFC966',\n veryHigh: '#FFB380',\n },\n outerQuantile: {\n veryLow: '#A30014',\n low: '#FF8080',\n target: '#BEE1C6',\n high: '#FFE6B3',\n veryHigh: '#FFD9BF',\n },\n },\n dailyGlucoseProfiles: {\n low: {\n line: '#FF0000',\n fill: '#FF8080',\n },\n target: {\n line: '#00AA51',\n fill: lightGrey,\n },\n high: {\n line: '#FFA600',\n fill: '#FFD180',\n },\n },\n};\n\nexport default {\n text,\n colors\n};\n","import _ from 'lodash';\n\nimport {\n AGP_BG_CLAMP_MGDL,\n AGP_BG_CLAMP_MMOLL,\n AGP_FONT_FAMILY,\n AGP_FOOTER_Y_PADDING,\n AGP_LOWER_QUANTILE,\n AGP_SECTION_BORDER_RADIUS,\n AGP_SECTION_DESCRIPTION_HEIGHT,\n AGP_SECTION_HEADER_HEIGHT,\n AGP_TIR_MIN_HEIGHT,\n AGP_TIR_MIN_TARGET_HEIGHT,\n AGP_UPPER_QUANTILE,\n colors,\n fontSizes,\n text,\n} from './AGPConstants';\n\nimport { DPI, MARGINS, WIDTH, HEIGHT } from './constants';\nimport { bankersRound, formatBgValue, formatPercentage } from '../../../utils/format';\nimport { ONE_HR, getTimezoneFromTimePrefs } from '../../../utils/datetime';\nimport { classifyBgValue, mungeBGDataBins } from '../../../utils/bloodglucose';\nimport { getGlycemicRangesPreset } from '../../../utils/glycemicRanges';\nimport {\n MGDL_UNITS,\n MS_IN_DAY,\n MS_IN_HOUR,\n BGM_DATA_KEY,\n CGM_DATA_KEY,\n ADA_STANDARD_BG_BOUNDS,\n GLYCEMIC_RANGES_PRESET,\n} from '../../../utils/constants';\nimport moment from 'moment';\n\nexport const boldText = textString => `<b>${String(textString)}</b>`;\nexport const chartScaleToPixels = (paperPixelDimension, scaleValue) => scaleValue * paperPixelDimension;\nexport const pixelsToChartScale = (paperPixelDimension, pixels) => pixels / paperPixelDimension;\nexport const pointsToPixels = points => points * 0.75;\n\nexport const createAnnotation = options => {\n const annotation = _.defaultsDeep(options, {\n arrowside: 'none',\n font: {\n color: colors.black,\n family: AGP_FONT_FAMILY,\n },\n showarrow: false,\n });\n\n return annotation;\n};\n\nexport const calculateCGMDataSufficiency = (data = {}) => {\n const { statsByDate } = data.data?.current?.aggregationsByDate;\n const { newestDatum, bgDaysWorn } = data.data?.current?.stats?.bgExtents || {};\n\n const {\n count,\n sampleInterval,\n sensorUsageAGP,\n } = data.data?.current?.stats?.sensorUsage || {};\n\n const sufficiencyBySection = {\n ambulatoryGlucoseProfile: true,\n dailyGlucoseProfiles: true,\n glucoseMetrics: true,\n percentInRanges: true,\n };\n\n const hoursOfCGMData = (count * sampleInterval) / MS_IN_HOUR;\n\n if (hoursOfCGMData < 24) {\n // Show nothing if <24 hours total cgm time\n return {\n ambulatoryGlucoseProfile: false,\n dailyGlucoseProfiles: false,\n glucoseMetrics: false,\n percentInRanges: false,\n };\n } else if (hoursOfCGMData === 24) {\n // Hide agp if only 24 hours total cgm time, but show other sections conditional on sufficiency\n const sufficencyMet = sensorUsageAGP >= 70;\n\n return {\n ambulatoryGlucoseProfile: false,\n dailyGlucoseProfiles: sufficencyMet,\n glucoseMetrics: sufficencyMet,\n percentInRanges: sufficencyMet,\n };\n }\n\n const cgmCalendarDays = _.map(_.range(_.max([bgDaysWorn, 7])), (val, index) => (\n moment.utc(newestDatum.time).tz(getTimezoneFromTimePrefs(data.timePrefs)).subtract(index, 'days').format('YYYY-MM-DD')\n )).reverse();\n\n const sensorUsageByDate = _.map(cgmCalendarDays, (date, index) => {\n const {\n count: countForDate,\n sampleInterval: sampleFrequencyForDate,\n } = statsByDate[date]?.sensorUsage || {};\n\n const {\n newestDatum: newestDatumForDate = {},\n oldestDatum: oldestDatumForDate = {},\n } = statsByDate[date]?.bgExtents || {};\n\n if (!sampleFrequencyForDate || !countForDate) {\n return { sufficiencyMet: false, sensorUsage: 0 };\n }\n\n const minCount = MS_IN_HOUR / sampleFrequencyForDate;\n\n let maxPossibleReadings = 0;\n if (index === 0) {\n maxPossibleReadings = bankersRound((MS_IN_DAY - oldestDatumForDate.msPer24) / sampleFrequencyForDate);\n } else if (index === cgmCalendarDays.length - 1) {\n maxPossibleReadings = bankersRound(newestDatumForDate.msPer24 / sampleFrequencyForDate);\n } else {\n maxPossibleReadings = bankersRound(MS_IN_DAY / sampleFrequencyForDate);\n }\n\n const sensorUsage = maxPossibleReadings > 0 ? countForDate / maxPossibleReadings * 100 : 0;\n const sufficiencyMet = countForDate >= minCount;\n\n return ({ count: countForDate, date, maxPossibleReadings, sensorUsage, sufficiencyMet });\n });\n\n // AGP section requires that each day in the top 7 have at least an hour of data, and an average\n // sensore usage of 70%\n const sufficientDays = _.filter(sensorUsageByDate, { sufficiencyMet: true });\n const topSevenSufficientDays = _.slice(_.orderBy(sufficientDays, ['sensorUsage'], ['desc']), 0, 7);\n\n if (topSevenSufficientDays.length < 7) {\n sufficiencyBySection.ambulatoryGlucoseProfile = false;\n } else {\n const topSevenDaysSensorUsageMean = _.meanBy(topSevenSufficientDays, 'sensorUsage');\n sufficiencyBySection.ambulatoryGlucoseProfile = topSevenDaysSensorUsageMean >= 70;\n }\n\n return sufficiencyBySection;\n};\n\nexport const calculateBGMDataSufficiency = (data = {}) => {\n const totalReadings = data.data?.current?.data?.smbg?.length || 0;\n\n const sufficiencyBySection = {\n ambulatoryGlucoseProfile: totalReadings >= 30,\n dailyGlucoseProfiles: totalReadings > 0,\n glucoseMetrics: totalReadings > 0,\n percentInRanges: totalReadings > 0,\n };\n\n return sufficiencyBySection;\n};\n\nexport const generateChartSections = (data, bgSource) => {\n const reportInfoAndMetricsWidth = DPI * 3.375;\n const chartRenderAreaTop = DPI * 0.75;\n const rightEdge = MARGINS.left + WIDTH;\n const bottomEdge = MARGINS.top + HEIGHT;\n const chartRenderAreaBottom = bottomEdge - (DPI * 0.75 - MARGINS.bottom);\n const sectionGap = DPI * 0.25;\n const sections = {};\n const dataSufficiency = bgSource === CGM_DATA_KEY\n ? calculateCGMDataSufficiency(data)\n : calculateBGMDataSufficiency(data);\n\n const glycemicRangesPreset = getGlycemicRangesPreset(data.query?.glycemicRanges);\n\n sections.percentInRanges = {\n bgSource,\n x: MARGINS.left,\n y: chartRenderAreaTop,\n width: DPI * 3.875,\n height: DPI * 3,\n bordered: true,\n text: {\n title: text.percentInRanges.title[bgSource],\n subtitle: text.percentInRanges.subtitle[bgSource][glycemicRangesPreset]\n },\n sufficientData: dataSufficiency.percentInRanges,\n };\n\n sections.reportInfo = {\n bgSource,\n x: rightEdge - reportInfoAndMetricsWidth,\n y: chartRenderAreaTop,\n width: reportInfoAndMetricsWidth,\n height: DPI * (bgSource === CGM_DATA_KEY ? 0.875 : 0.55),\n text: text.reportInfo,\n };\n\n sections.glucoseMetrics = {\n bgSource,\n x: rightEdge - reportInfoAndMetricsWidth,\n y: sections.reportInfo.y + sections.reportInfo.height + sectionGap,\n width: reportInfoAndMetricsWidth,\n height: DPI * (bgSource === CGM_DATA_KEY ? 1.875 : 2.2),\n bordered: true,\n text: text.glucoseMetrics[bgSource],\n sufficientData: dataSufficiency.glucoseMetrics,\n };\n\n sections.ambulatoryGlucoseProfile = {\n bgSource,\n x: MARGINS.left,\n y: DPI * 4,\n width: WIDTH,\n height: DPI * 3.5,\n bordered: true,\n text: text.ambulatoryGlucoseProfile[bgSource],\n sufficientData: dataSufficiency.ambulatoryGlucoseProfile,\n };\n\n const dailyGlucoseProfilesHeight = DPI * 2.25;\n sections.dailyGlucoseProfiles = {\n bgSource,\n x: MARGINS.left,\n y: chartRenderAreaBottom - dailyGlucoseProfilesHeight - AGP_FOOTER_Y_PADDING,\n width: WIDTH,\n height: dailyGlucoseProfilesHeight,\n bordered: true,\n text: text.dailyGlucoseProfiles[bgSource],\n sufficientData: dataSufficiency.dailyGlucoseProfiles,\n };\n\n return sections;\n};\n\n/**\n * Generates the Plotly figure for the AGP Time In Ranges chart\n * @param {*} section\n * @param {*} stat\n * @param {*} bgPrefs\n * @param {*} glycemicRanges\n * @returns\n */\nexport const generatePercentInRangesFigure = (\n section,\n stat,\n bgPrefs,\n glycemicRanges\n) => {\n // Set chart plot within section borders\n const chartAreaWidth = section.width - 2;\n const chartAreaHeight = section.height - 2 - DPI * 0.25 - AGP_SECTION_BORDER_RADIUS;\n const plotMarginX = DPI * 0.5;\n const plotMarginTop = DPI * 0.425;\n const plotMarginBottom = DPI * 0.3;\n const paperWidth = chartAreaWidth - (plotMarginX * 2);\n const paperHeight = chartAreaHeight - (plotMarginTop + plotMarginBottom);\n const barWidth = DPI * 0.35;\n const barSeparatorPixelWidth = 2;\n const yScale = pixelsToChartScale.bind(null, paperHeight);\n const xScale = pixelsToChartScale.bind(null, paperWidth);\n\n const hasVeryLow = _.isNumber(bgPrefs?.bgBounds?.veryLowThreshold);\n const hasVeryHigh = _.isNumber(bgPrefs?.bgBounds?.veryHighThreshold);\n\n const statTotal = _.get(stat, 'data.raw.counts.total', 0);\n if (section.sufficientData) {\n const rawCounts = _.get(stat, 'data.raw.counts', {});\n\n const statDatums = _.filter([\n hasVeryLow && { id: 'veryLow', value: rawCounts.veryLow },\n { id: 'low', value: rawCounts.low },\n { id: 'target', value: rawCounts.target },\n { id: 'high', value: rawCounts.high },\n hasVeryHigh && { id: 'veryHigh', value: rawCounts.veryHigh },\n ], Boolean);\n\n const chartData = _.reduce(statDatums, (res, datum, i) => {\n const value = _.toNumber(datum.value) / statTotal * 1;\n const minHeight = datum.id === 'target' ? AGP_TIR_MIN_TARGET_HEIGHT : AGP_TIR_MIN_HEIGHT;\n const renderedValue = _.max([value, minHeight / 100]);\n res.rawById[datum.id] = value;\n res.raw.push(value);\n res.rendered.push(renderedValue);\n res.ticks.push((res.ticks[i - 1] || 0) + renderedValue);\n return res;\n }, { rawById: {}, raw: [], rendered: [], ticks: [] });\n\n // Needs y-scale correction since we may exceed y domain limits due to minimum bar height\n const yScaleCorrection = 1 / _.last(chartData.ticks);\n chartData.rendered = _.map(chartData.rendered, value => value * yScaleCorrection);\n chartData.ticks = _.map(chartData.ticks, value => value * yScaleCorrection);\n\n const data = _.map(statDatums, (datum, index) => ({\n x: [stat.id],\n y: [chartData.rendered[index]],\n name: datum.id,\n type: 'bar',\n width: barWidth / paperWidth * 2,\n marker: {\n color: _.toNumber(datum.value) > 0 ? colors.bgRange[datum.id] : colors.bgRange.empty,\n line: {\n color: colors.line.range.divider,\n width: barSeparatorPixelWidth,\n },\n },\n }));\n\n const tickYPos = (() => {\n const ticks = [...chartData.ticks];\n\n if (!hasVeryLow) ticks.unshift(0); // if no veryLow, low range stretches to the bottom\n\n if (!hasVeryHigh) ticks.push(1); // if no veryHigh, high range to stretches to the top\n\n return {\n veryLowThreshold: ticks[0],\n targetLowerBound: ticks[1],\n targetUpperBound: ticks[2],\n veryHighThreshold: ticks[3],\n max: ticks[4]\n };\n })();\n\n /* eslint-disable lodash/prefer-lodash-method */\n const bgTicks = [\n hasVeryLow && bgPrefs?.bgBounds?.veryLowThreshold,\n bgPrefs.bgBounds.targetLowerBound,\n bgPrefs.bgBounds.targetUpperBound,\n hasVeryHigh && bgPrefs?.bgBounds?.veryHighThreshold,\n bgPrefs?.bgUnits,\n ]\n .filter(Boolean)\n .map((tick, index, arr) => createAnnotation({\n align: 'right',\n font: {\n size: fontSizes.percentInRanges.ticks,\n },\n text: (index === arr.length - 1) // bgUnits label\n ? boldText(tick)\n : boldText(formatBgValue(tick, bgPrefs, undefined)),\n x: 0,\n xanchor: 'right',\n xshift: -2,\n y: (index === arr.length - 1) // bgUnits label\n ? tickYPos.targetLowerBound + ((tickYPos.targetUpperBound - tickYPos.targetLowerBound) / 2)\n : chartData.ticks[index],\n yanchor: 'middle',\n }));\n /* eslint-enable lodash/prefer-lodash-method */\n\n /* eslint-disable no-param-reassign */\n const getBracketPosValues = (name, posX, posX2, posY, posY2) => {\n const minBracketYOffSet = yScale(13);\n\n if (_.isNumber(posY2)) {\n const maxSubBracketYOffset = yScale(24);\n if (posY - posY2 < minBracketYOffSet) posY2 = posY - minBracketYOffSet;\n const subBracketXOffset = (posX2 - posX) / 2;\n const subBracketYOffset = _.min([(posY - posY2) / 2, maxSubBracketYOffset]);\n\n return {\n posX,\n posX2,\n posY,\n posY2,\n subBracketXOffset,\n subBracketYOffset,\n };\n }\n\n // If only a single Ypos is passed when:\n // -- Target bracket\n // -- Low bracket if veryLow range does not exist\n // -- High bracket if veryHigh range does not exist\n\n // If Target, we need to ensure it's not too close to the range extents to avoid potential crowding\n if (name === 'TARGET') {\n const targetBracketAllowedYRange = [\n yScale(AGP_TIR_MIN_TARGET_HEIGHT),\n 1 - (yScale(AGP_TIR_MIN_TARGET_HEIGHT)),\n ];\n\n if (posY < targetBracketAllowedYRange[0]) posY = targetBracketAllowedYRange[0];\n if (posY > targetBracketAllowedYRange[1]) posY = targetBracketAllowedYRange[1];\n }\n\n return { posX, posX2, posY };\n };\n /* eslint-enable no-param-reassign */\n\n const createBracketSVG = (pos) => {\n const {\n posX,\n posX2,\n posY,\n posY2,\n subBracketXOffset,\n subBracketYOffset,\n } = pos;\n\n if (_.isNumber(posY2)) {\n const radiusX = xScale(5);\n const radiusY = yScale(5);\n\n return [\n `M ${posX} ${posY}`,\n `H ${posX + subBracketXOffset - radiusX}`,\n `Q ${posX + subBracketXOffset} ${posY} ${posX + subBracketXOffset} ${posY - radiusY}`,\n `V ${posY2 + radiusY}`,\n `Q ${posX + subBracketXOffset} ${posY2} ${posX + subBracketXOffset - radiusX} ${posY2}`,\n `H ${posX}`,\n `M ${posX + subBracketXOffset} ${posY2 + subBracketYOffset}`,\n `H ${posX2}`,\n ].join(' ');\n }\n\n return [\n `M ${posX} ${posY}`,\n `H ${posX2}`,\n ].join(' ');\n };\n\n const bracketYPos = {\n veryLow: yScale(-11),\n low: tickYPos.veryLowThreshold,\n target: tickYPos.targetLowerBound + ((tickYPos.targetUpperBound - tickYPos.targetLowerBound) / 2),\n high: tickYPos.targetUpperBound + ((tickYPos.veryHighThreshold - tickYPos.targetUpperBound) / 2),\n veryHigh: tickYPos.max,\n };\n\n const bracketXExtents = [xScale(barWidth + 5), xScale(paperWidth - barWidth)];\n\n const bracketPos = {\n low: (\n hasVeryLow\n ? getBracketPosValues('LOW', ...bracketXExtents, bracketYPos.low, bracketYPos.veryLow)\n : getBracketPosValues('LOW', ...bracketXExtents, bracketYPos.low)\n ),\n\n target: getBracketPosValues('TARGET', ...bracketXExtents, bracketYPos.target),\n\n high: (\n hasVeryHigh\n ? getBracketPosValues('HIGH', ...bracketXExtents, bracketYPos.veryHigh, bracketYPos.high)\n : getBracketPosValues('HIGH', ...bracketXExtents, bracketYPos.high)\n ),\n };\n\n const brackets = _.map(_.values(bracketPos), pos => ({\n type: 'path',\n path: createBracketSVG(pos),\n line: { color: colors.line.default, width: 0.5 },\n yref: 'paper',\n }));\n\n const createLeaderSVG = (posX, posX2, posY, posY2) => {\n const isLowLeader = posY > posY2;\n const radiusX = xScale(5);\n const radiusY = isLowLeader ? yScale(-5) : yScale(5);\n\n return [\n `M ${posX} ${posY}`,\n `V ${posY2 - radiusY}`,\n `Q ${posX} ${posY2} ${posX + radiusX} ${posY2}`,\n `H ${posX2}`,\n ].join(' ');\n };\n\n const leaderYPos = [\n // Very Low Leader\n 0,\n bracketPos.low.posY2 + yScale(6),\n\n // Very High Leader\n 1,\n bracketPos.high.posY + yScale(6),\n ];\n\n const leaderXExtents = [xScale(barWidth / 2), xScale(barWidth + 2)];\n\n const leaderPos = _.filter([\n (hasVeryLow && [...leaderXExtents, ...leaderYPos.slice(0, 2)]),\n (hasVeryHigh && [...leaderXExtents, ...leaderYPos.slice(2)]),\n ], Boolean);\n\n const leaders = _.map(leaderPos, pos => ({\n type: 'path',\n path: createLeaderSVG(...pos),\n line: { color: colors.black, width: 0.5 },\n yref: 'paper',\n }));\n\n const rangePosY = {\n veryLow: bracketPos.low.posY2,\n low: bracketPos.low.posY,\n target: bracketPos.target.posY,\n high: hasVeryHigh ? bracketPos.high.posY2 : bracketPos.high.posY,\n veryHigh: bracketPos.high.posY,\n };\n\n const rangePosYOrderedKeys = _.filter([\n hasVeryLow && 'veryLow',\n 'low',\n 'target',\n 'high',\n hasVeryHigh && 'veryHigh',\n ], Boolean);\n\n const rangeLabels = _.map(rangePosYOrderedKeys, range => createAnnotation({\n align: 'left',\n font: {\n size: fontSizes.percentInRanges.values,\n },\n text: boldText(text.bgRanges[range]),\n x: bracketXExtents[0],\n xanchor: 'left',\n xshift: -1,\n y: rangePosY[range],\n yanchor: 'bottom',\n yref: 'paper',\n yshift: -1,\n }));\n\n const rangeValuesOrderedKeys = _.filter([\n hasVeryLow && 'veryLow',\n hasVeryLow && 'low',\n hasVeryHigh && 'high',\n hasVeryHigh && 'veryHigh',\n ], Boolean);\n\n const rangeValues = _.map(rangeValuesOrderedKeys, range => createAnnotation({\n align: 'right',\n font: {\n size: fontSizes.percentInRanges.values,\n },\n text: boldText(formatPercentage(chartData.rawById[range], 0, true)),\n x: bracketXExtents[0] + (bracketXExtents[1] - bracketXExtents[0]) / 2,\n xanchor: 'right',\n xshift: -4,\n y: rangePosY[range],\n yanchor: 'bottom',\n yref: 'paper',\n yshift: -1,\n }));\n\n const rangeSummaryPosY = {\n low: hasVeryLow ? (bracketPos.low.posY2 + bracketPos.low.subBracketYOffset) : bracketPos.low.posY,\n target: bracketPos.target.posY,\n high: hasVeryHigh ? (bracketPos.high.posY2 + bracketPos.high.subBracketYOffset) : bracketPos.high.posY,\n };\n\n const combinedRangeSummaryValues = {\n low: (chartData.rawById.veryLow || 0) + chartData.rawById.low,\n target: chartData.rawById.target,\n high: (chartData.rawById.veryHigh || 0) + chartData.rawById.high,\n };\n\n const rangeSummaryOrderedKeys = [\n 'low',\n 'target',\n 'high',\n ];\n\n const rangeSummaryValues = _.map(rangeSummaryOrderedKeys, range => createAnnotation({\n align: 'left',\n font: {\n size: fontSizes.percentInRanges.summaries,\n },\n text: boldText(formatPercentage(combinedRangeSummaryValues[range], 0, true)),\n x: bracketXExtents[0] + (bracketXExtents[1] - bracketXExtents[0]) / 2,\n xanchor: 'left',\n xshift: section.bgSource === CGM_DATA_KEY ? 3 : 28,\n y: rangeSummaryPosY[range],\n yanchor: 'bottom',\n yref: 'paper',\n yshift: -2,\n }));\n\n const goalsPos = {\n veryLow: {\n x: bracketXExtents[0],\n xanchor: 'left',\n xshift: -1,\n y: bracketPos.low.posY2,\n yshift: -11,\n },\n lowCombined: {\n x: bracketXExtents[1],\n xanchor: 'right',\n xshift: 5,\n y: hasVeryLow ? (bracketPos.low.posY2 + bracketPos.low.subBracketYOffset) : bracketPos.low.posY,\n yshift: 0,\n },\n target: {\n x: bracketXExtents[1],\n xanchor: 'right',\n xshift: 5,\n y: bracketPos.target.posY,\n yshift: 0,\n },\n highCombined: {\n x: bracketXExtents[1],\n xanchor: 'right',\n xshift: 5,\n y: hasVeryHigh ? (bracketPos.high.posY2 + bracketPos.high.subBracketYOffset) : bracketPos.high.posY,\n yshift: 0,\n },\n veryHigh: {\n x: bracketXExtents[0],\n xanchor: 'left',\n xshift: -1,\n y: bracketPos.high.posY,\n yshift: 9,\n },\n };\n\n const glycemicRangesPreset = getGlycemicRangesPreset(glycemicRanges);\n\n // User is viewing a PwD self-defined range if glycemicRanges is set to ADA Standard,\n // but targetLowerBound or targetUpperBound do not match those of the ADA Standard\n const isPwdSelfDefinedRange = (\n glycemicRangesPreset === GLYCEMIC_RANGES_PRESET.ADA_STANDARD && (\n ADA_STANDARD_BG_BOUNDS[(bgPrefs.bgUnits || MGDL_UNITS)].veryLowThreshold !== bgPrefs.bgBounds?.veryLowThreshold ||\n ADA_STANDARD_BG_BOUNDS[(bgPrefs.bgUnits || MGDL_UNITS)].targetLowerBound !== bgPrefs.bgBounds?.targetLowerBound ||\n ADA_STANDARD_BG_BOUNDS[(bgPrefs.bgUnits || MGDL_UNITS)].targetUpperBound !== bgPrefs.bgBounds?.targetUpperBound ||\n ADA_STANDARD_BG_BOUNDS[(bgPrefs.bgUnits || MGDL_UNITS)].veryHighThreshold !== bgPrefs.bgBounds?.veryHighThreshold\n )\n );\n\n const goalGlycemicRangesKey = isPwdSelfDefinedRange ? 'PWD_SELF_DEFINED' : glycemicRangesPreset;\n\n // if PwD self-defined range, show goal for every stat; otherwise show only goals that exist\n const goalsOrderedKeys = _.filter([\n 'veryLow',\n 'lowCombined',\n 'target',\n 'highCombined',\n 'veryHigh',\n ], range => !!text.goals[goalGlycemicRangesKey][range]);\n\n const goals = _.map(goalsOrderedKeys, range => createAnnotation({\n align: 'left',\n font: {\n color: colors.text.goals[range],\n size: fontSizes.percentInRanges.goals,\n },\n text: text.goals[goalGlycemicRangesKey][range],\n yanchor: 'bottom',\n yref: 'paper',\n ...goalsPos[range],\n }));\n\n const subLabelsPos = {\n TIRtarget: {\n x: xScale(paperWidth),\n xanchor: 'right',\n xref: 'paper',\n xshift: plotMarginX - 15,\n y: bracketPos.target.posY,\n yshift: -12,\n },\n TIRminutes: {\n x: xScale(paperWidth),\n xanchor: 'right',\n xref: 'paper',\n xshift: plotMarginX - 7,\n y: hasVeryLow ? bracketPos.low.posY2 : bracketPos.low.posY - 0.05,\n yshift: -12,\n },\n };\n\n const subLabelsOrderedKeys = [\n 'TIRtarget',\n 'TIRminutes',\n ];\n\n const subLabels = _.map(subLabelsOrderedKeys, label => createAnnotation({\n align: 'left',\n font: {\n color: colors.text.subLabels[label],\n size: fontSizes.percentInRanges.subLabels,\n },\n text: text.subLabels[label],\n yanchor: 'bottom',\n yref: 'paper',\n ...subLabelsPos[label],\n }));\n\n const rangeAnnotations = {\n veryLow: [\n rangeLabels[0],\n rangeValues[0],\n section.bgSource === CGM_DATA_KEY && goals[0],\n ],\n low: [\n rangeLabels[1],\n rangeValues[1],\n ],\n lowSummary: [\n rangeSummaryValues[0],\n section.bgSource === CGM_DATA_KEY && goals[1],\n ],\n target: [\n rangeLabels[2],\n rangeSummaryValues[1],\n section.bgSource === CGM_DATA_KEY && goals[2],\n section.bgSource === CGM_DATA_KEY && subLabels[0],\n ],\n high: [\n rangeLabels[3],\n rangeValues[2],\n ],\n veryHigh: [\n rangeLabels[4],\n rangeValues[3],\n section.bgSource === CGM_DATA_KEY && goals[4],\n ],\n highSummary: [\n rangeSummaryValues[2],\n section.bgSource === CGM_DATA_KEY && goals[3],\n ],\n };\n\n const layout = {\n barmode: 'stack',\n width: chartAreaWidth,\n height: chartAreaHeight,\n showlegend: false,\n\n margin: {\n l: plotMarginX,\n r: plotMarginX,\n b: plotMarginBottom,\n t: plotMarginTop,\n },\n\n xaxis: {\n range: [0, 1],\n showgrid: false,\n showline: false,\n showticklabels: false,\n zeroline: false,\n },\n\n yaxis: {\n range: [0, 1],\n showgrid: false,\n showline: false,\n showticklabels: false,\n zeroline: false,\n },\n\n annotations: [\n ...bgTicks,\n ...rangeAnnotations.veryHigh,\n ...rangeAnnotations.high,\n ...rangeAnnotations.highSummary,\n ...rangeAnnotations.target,\n ...rangeAnnotations.low,\n ...rangeAnnotations.veryLow,\n ...rangeAnnotations.lowSummary,\n section.bgSource === CGM_DATA_KEY && subLabels[1],\n ],\n\n shapes: [\n ...brackets,\n ...leaders,\n ],\n };\n\n const figure = { data, layout };\n return figure;\n }\n\n return null;\n};\n\nexport const generateAmbulatoryGlucoseProfileFigure = (section, bgData, bgPrefs, bgSource) => {\n // Set chart plot within section borders\n const chartAreaWidth = section.width - 2;\n const chartAreaHeight = section.height - 2 - (AGP_SECTION_HEADER_HEIGHT + AGP_SECTION_DESCRIPTION_HEIGHT) - AGP_SECTION_BORDER_RADIUS;\n const plotMarginX = DPI * 0.5;\n const plotMarginY = DPI * 0.2;\n const paperWidth = chartAreaWidth - (plotMarginX * 2);\n const paperHeight = chartAreaHeight - (plotMarginY * 2);\n\n const hasVeryHigh = _.isNumber(bgPrefs?.bgBounds?.veryHighThreshold);\n const hasVeryLow = _.isNumber(bgPrefs?.bgBounds?.veryLowThreshold);\n\n if (section.sufficientData || bgSource === BGM_DATA_KEY) {\n const yClamp = bgPrefs?.bgUnits === MGDL_UNITS ? AGP_BG_CLAMP_MGDL : AGP_BG_CLAMP_MMOLL;\n const chartData = mungeBGDataBins(bgSource, ONE_HR, bgData, [AGP_LOWER_QUANTILE, AGP_UPPER_QUANTILE]);\n\n // Smooth all bin quantiles according to AGP spec\n const quantileKeys = [\n 'lowerQuantile',\n 'firstQuartile',\n 'median',\n 'thirdQuartile',\n 'upperQuantile',\n ];\n\n const firstDatum = chartData[0];\n const lastDatum = chartData[chartData.length - 1];\n\n const smoothDatum = (prev, curr, next) => {\n // return with current value if current bin, or both adjacent bins, are empty\n if ((!prev && !next) || !curr) {\n return curr;\n } else if (!prev || !next) {\n // Weight at 0-4-1 or 1-4-0 respectively if one of the adjacent bins is empty\n return _.sum([prev || 0, curr * 4, next || 0]) / 5;\n }\n // Weight at 1-4-1\n return _.sum([prev, curr * 4, next]) / 6;\n };\n\n const smoothedChartData = _.map(chartData, (datum, index) => ({\n ...datum,\n ..._.reduce(quantileKeys, (result, key) => {\n result[key] = smoothDatum( // eslint-disable-line no-param-reassign\n chartData[index - 1]?.[key] || lastDatum[key],\n datum[key],\n chartData[index + 1]?.[key] || firstDatum[key]\n );\n return result;\n }, {}),\n }));\n\n // Prepend/append extent datums to opposite ends to allow fully cyclic traces across the entire\n // X axis. Otherwise, the first and last 1/2 hours will not be rendered.\n const firstSmoothedDatum = smoothedChartData[0];\n const lastSmoothedDatum = smoothedChartData[smoothedChartData.length - 1];\n smoothedChartData.unshift({ ...lastSmoothedDatum, msX: firstSmoothedDatum.msX - ONE_HR });\n smoothedChartData.push({ ...firstSmoothedDatum, msX: lastSmoothedDatum.msX + ONE_HR });\n\n const quantileBand = (upperKey, lowerKey, key, bgRange, index) => ({\n name: key,\n type: 'scatter',\n x: [..._.map(smoothedChartData, 'msX'), ..._.map(_.reverse([...smoothedChartData]), 'msX')],\n y: [..._.map(smoothedChartData, upperKey), ..._.map(_.reverse([...smoothedChartData]), lowerKey)],\n yaxis: index === 0 ? 'y' : `y${index + 1}`,\n fill: 'tozerox',\n fillcolor: colors.ambulatoryGlucoseProfile[key][bgRange],\n mode: 'none',\n line: {\n simplify: false,\n shape: 'spline',\n smoothing: 0.5,\n },\n });\n\n const quantileSegment = (upperKey, lowerKey, key, bgRange, index, segmentData) => ({\n name: key,\n type: 'scatter',\n x: [..._.map(segmentData, 'msX'), ..._.map(_.reverse([...segmentData]), 'msX')],\n y: [..._.map(segmentData, upperKey), ..._.map(_.reverse([...segmentData]), lowerKey)],\n yaxis: index === 0 ? 'y' : `y${index + 1}`,\n fill: 'toself',\n fillcolor: colors.ambulatoryGlucoseProfile[key][bgRange],\n mode: 'none',\n line: {\n simplify: false,\n shape: 'line',\n smoothing: 0,\n },\n });\n\n // Define ranges to show on AGP. Start with only Low, Target, and High.\n // Add veryLow and veryHigh range if their respective thresholds exist.\n const bgRangeKeys = _.filter([\n hasVeryLow && 'veryLow',\n 'low',\n 'target',\n 'high',\n hasVeryHigh && 'veryHigh',\n ], Boolean);\n\n const bgTicks = _.filter([\n 0,\n hasVeryLow && bgPrefs.bgBounds.veryLowThreshold,\n bgPrefs.bgBounds.targetLowerBound,\n bgPrefs.bgBounds.targetUpperBound,\n hasVeryHigh && bgPrefs.bgBounds.veryHighThreshold,\n yClamp,\n ], tick => _.isNumber(tick));\n\n const targetStart = _.findIndex(bgRangeKeys, key => key === 'target');\n const targetEnd = targetStart + 1;\n\n const bgTickAnnotations = _.map(bgTicks, (tick, index) => {\n const isTarget = _.includes([targetStart, targetEnd], index);\n\n let yshift = 0;\n if (index === 0) yshift = 4;\n if (index === 1) yshift = -2;\n\n return createAnnotation({\n align: 'right',\n font: {\n color: isTarget ? colors.white : colors.text.ticks.bg,\n size: fontSizes.ambulatoryGlucoseProfile.bgTicks,\n },\n height: 9,\n text: index === 0\n ? boldText(tick)\n : boldText(formatBgValue(tick, bgPrefs, undefined, true)),\n y: tick / yClamp,\n yanchor: 'middle',\n yref: 'paper',\n yshift,\n xanchor: 'right',\n xref: 'x',\n xshift: -2,\n x: 0,\n });\n });\n\n const createbgTargetMarkerSVG = (posX, posY) => {\n const radiusX = 2;\n const radiusY = 2;\n const width = 22;\n const height = 10;\n const posXLeft = posX - width;\n const posYTop = posY + height / 2;\n const posYBottom = posY - height / 2;\n const arrowHeight = height / 2 - 1;\n\n return [\n `M ${posX} ${posY}`,\n `V ${posY - 1}`,\n `L ${posX - arrowHeight} ${posYBottom}`,\n `H ${posXLeft + radiusX}`,\n `Q ${posXLeft} ${posYBottom} ${posXLeft} ${posYBottom + radiusY}`,\n `V ${posYTop - radiusY}`,\n `Q ${posXLeft} ${posYTop} ${posXLeft + radiusX} ${posYTop}`,\n `H ${posX - arrowHeight}`,\n `L ${posX} ${posY + 1}`,\n `V ${posY}`,\n ].join(' ');\n };\n\n const bgTargetMarkers = _.map(_.slice(bgTicks, targetStart, targetEnd + 1), tick => ({\n fillcolor: colors.line.range.target,\n line: {\n width: 0,\n },\n tick,\n path: createbgTargetMarkerSVG(-1, tick / yClamp * paperHeight),\n type: 'path',\n xanchor: 0,\n xref: 'paper',\n xsizemode: 'pixel',\n yanchor: 0,\n yref: 'paper',\n ysizemode: 'pixel',\n }));\n\n const bgGridLines = _.map(bgTicks, (tick, index) => {\n const isClamp = index === 5;\n const isTarget = _.includes([targetStart, targetEnd], index);\n const isZero = index === 0;\n\n return {\n layer: (bgSource === CGM_DATA_KEY && (isTarget || isClamp)) ? 'above' : 'below',\n line: {\n color: isTarget ? colors.line.range.target : colors.line.range.default,\n width: isTarget ? 2 : 1,\n },\n type: 'line',\n x0: isClamp || isZero ? -1 : 0, // fills an empty pixel cap on top grid line\n x1: isClamp || isZero ? paperWidth + 1 : paperWidth, // fills an empty pixel cap on top grid line\n xref: 'paper',\n xanchor: 0,\n xsizemode: 'pixel',\n y0: tick / yClamp,\n y1: tick / yClamp,\n yref: 'paper',\n };\n });\n\n const percentileTicks = _.map(quantileKeys, key => {\n if (firstSmoothedDatum[key] && lastSmoothedDatum[key]) {\n return (firstSmoothedDatum[key] + lastSmoothedDatum[key]) / 2;\n }\n\n return bgSource === CGM_DATA_KEY\n ? firstSmoothedDatum[key] || lastSmoothedDatum[key]\n : undefined;\n });\n\n const percentileLabels = ['5%', '25%', '50%', '75%', '95%'];\n\n // Ensure that percentile ticks and annotations don't crowd\n const percentileTickYPositions = _.map(percentileTicks, tick => chartScaleToPixels(paperHeight, tick / yClamp));\n const percentileTickShiftedYPositions = [...percentileTickYPositions];\n const medianYPos = percentileTickYPositions[2];\n const minGap = pointsToPixels(fontSizes.ambulatoryGlucoseProfile.percentileTicks) + 2;\n percentileTickShiftedYPositions[1] = _.min([medianYPos - minGap, percentileTickShiftedYPositions[1]]);\n percentileTickShiftedYPositions[0] = _.min([percentileTickShiftedYPositions[1] - minGap, percentileTickShiftedYPositions[0]]);\n percentileTickShiftedYPositions[3] = _.max([medianYPos + minGap, percentileTickShiftedYPositions[3]]);\n percentileTickShiftedYPositions[4] = _.max([percentileTickShiftedYPositions[3] + minGap, percentileTickShiftedYPositions[4]]);\n const percentileTickYShifts = _.map(percentileTickShiftedYPositions, (shiftedYPos, index) => (shiftedYPos - percentileTickYPositions[index]));\n\n const percentileTickAnnotations = _.map(percentileTicks, (tick, index) => createAnnotation({\n align: 'left',\n font: {\n color: index === 2 ? colors.black : colors.text.ticks.percentile,\n size: fontSizes.ambulatoryGlucoseProfile.percentileTicks,\n },\n name: bgRangeKeys[index],\n text: boldText(percentileLabels[index]),\n visible: _.isFinite(tick) && tick / yClamp <= 1,\n y: tick / yClamp,\n yanchor: 'middle',\n yref: 'paper',\n yshift: percentileTickYShifts[index],\n xanchor: 'left',\n xref: 'x',\n xshift: 5,\n x: MS_IN_DAY,\n }));\n\n const percentileTickLines = _.map(percentileTicks, (tick, index) => ({\n line: {\n color: colors.line.ticks,\n width: 1,\n },\n type: 'line',\n visible: _.isFinite(tick) && tick / yClamp <= 1,\n x0: paperWidth,\n x1: paperWidth + 5,\n xref: 'paper',\n xanchor: 0,\n xsizemode: 'pixel',\n y0: tick / yClamp,\n y1: tick / yClamp + pixelsToChartScale(paperHeight, percentileTickYShifts[index]),\n yref: 'paper',\n }));\n\n const quarterDayTicks = _.range(0, MS_IN_DAY + 1, MS_IN_HOUR * 6);\n\n const hourlyTicks = _.filter(\n _.range(0, MS_IN_DAY + 1, MS_IN_HOUR),\n tick => ((tick / MS_IN_HOUR) % 12 !== 0)\n );\n\n const hourlyTicksAnnotations = _.map(_.range(0, MS_IN_DAY + 1, MS_IN_HOUR * 3), tick => createAnnotation({\n align: 'center',\n font: {\n color: (tick / MS_IN_HOUR) % 12 === 0 ? colors.black : colors.darkGrey,\n size: fontSizes.ambulatoryGlucoseProfile.hourlyTicks,\n },\n text: boldText(moment.utc(tick).format('ha')),\n y: 0,\n yanchor: 'top',\n yref: 'y',\n yshift: 0,\n xanchor: 'middle',\n xref: 'x',\n x: tick,\n }));\n\n const data = [];\n const yAxes = [];\n const bgmMedian = [];\n const legend = [];\n let showLegend = false;\n\n _.each(bgRangeKeys, (bgRange, index) => {\n const range = [bgTicks[index], bgTicks[index + 1]];\n\n if (bgSource === CGM_DATA_KEY) {\n data.push(quantileBand('upperQuantile', 'lowerQuantile', 'outerQuantile', bgRange, index));\n data.push(quantileBand('thirdQuartile', 'firstQuartile', 'interQuartile', bgRange, index));\n data.push({\n name: 'median',\n type: 'scatter',\n x: _.map(smoothedChartData, 'msX'),\n y: _.map(smoothedChartData, 'median'),\n yaxis: index === 0 ? 'y' : `y${index + 1}`,\n mode: 'lines',\n fill: 'none',\n line: {\n color: colors.ambulatoryGlucoseProfile.median[bgRange],\n simplify: false,\n shape: 'spline',\n width: 3,\n smoothing: 0.5,\n },\n });\n } else if (bgSource === BGM_DATA_KEY) {\n if (section.sufficientData) {\n _.each(smoothedChartData, (bin, i) => {\n const segmentData = [smoothedChartData[i - 1], bin];\n\n const bandData = _.filter(\n segmentData,\n ({ thirdQuartile, firstQuartile } = {}) => _.isFinite(thirdQuartile) && _.isFinite(firstQuartile)\n );\n\n if (bandData.length === 2) {\n data.push(quantileSegment('thirdQuartile', 'firstQuartile', 'interQuartile', bgRange, index, bandData));\n }\n\n const medianData = _.filter(\n segmentData,\n ({ median } = {}) => _.isFinite(median)\n );\n\n const isLastDrawableSegment = i === smoothedChartData.length - 1;\n\n // Show legend if the interquartile ranges don't extend to the chart edge\n if (isLastDrawableSegment && bandData.length < 2) {\n const medianTickYPos = (segmentData[0].median + segmentData[1].median) / 2;\n showLegend = medianTickYPos > yClamp / 2 ? 'bottom' : 'top';\n }\n\n if (medianData.length === 2) {\n const medianWidth = 3;\n const isFirstDrawableSegment = i === 1;\n\n let x0 = medianData[0].msX / MS_IN_DAY;\n let x1 = medianData[1].msX / MS_IN_DAY;\n let y0 = medianData[0].median;\n let y1 = medianData[1].median;\n\n if (isFirstDrawableSegment) {\n x0 = 0;\n y0 = y1 - ((y1 - y0) / 2);\n }\n\n if (isLastDrawableSegment) {\n x1 = 1;\n y1 = y1 - ((y1 - y0) / 2);\n }\n\n bgmMedian.push({\n type: 'line',\n x0,\n x1,\n y0,\n y1,\n line: {\n color: colors.ambulatoryGlucoseProfile.median[bgRange],\n width: medianWidth,\n },\n xref: 'paper',\n xsizemode: 'scaled',\n yref: index === 0 ? 'y' : `y${index + 1}`,\n ysizemode: 'scaled',\n });\n\n const lineEndRadius = medianWidth / 2;\n const rx = pixelsToChartScale(paperWidth, lineEndRadius);\n const ry = pixelsToChartScale(paperHeight, lineEndRadius) * yClamp;\n\n // add circles at line end to smooth out any sharp gaps between interconnected segments\n const previousSegmentData = [smoothedChartData[i - 2], smoothedChartData[i - 1]];\n\n if (_.filter(\n previousSegmentData,\n ({ median } = {}) => _.isFinite(median)\n ).length === 2) {\n const lineEnd = segmentData[0];\n bgmMedian.push({\n type: 'circle',\n x0: lineEnd.msX / MS_IN_DAY - rx,\n x1: lineEnd.msX / MS_IN_DAY + rx,\n y0: lineEnd.median - ry,\n y1: lineEnd.median + ry,\n line: { width: 0 },\n fillcolor: colors.ambulatoryGlucoseProfile.median[bgRange],\n xref: 'paper',\n xsizemode: 'scaled',\n yref: index === 0 ? 'y' : `y${index + 1}`,\n ysizemode: 'scaled',\n });\n }\n }\n });\n } else {\n // No AGP data to plot, but need to add dummy datums so that the readings will plot\n }\n }\n\n const yAxis = {\n domain: [range[0] / yClamp, range[1] / yClamp],\n range,\n showgrid: false,\n showline: true,\n linecolor: colors.lightGrey,\n mirror: true,\n showticklabels: false,\n zeroline: false,\n };\n\n yAxes.push(yAxis);\n });\n\n if (showLegend) {\n const legendRangeWidth = 5;\n const legendRangeHeight = 15;\n const legendXOffset = pixelsToChartScale(paperWidth, 4);\n\n const legendYOffset = showLegend === 'top'\n ? 1 - pixelsToChartScale(paperHeight, legendRangeHeight * 5 + 4)\n : pixelsToChartScale(paperHeight, 4);\n\n _.each(percentileTickAnnotations, (tick, tickIndex) => {\n // Create legend range and update tick position to be adjacent to the legend\n const showTick = _.includes([0, 2, 4], tickIndex);\n const isTarget = tickIndex === 2;\n const yPos = tickIndex * legendRangeHeight;\n\n legend.push({\n type: 'rect',\n x0: 0,\n x1: legendRangeWidth,\n y0: yPos,\n y1: yPos + legendRangeHeight,\n line: { width: 0 },\n fillcolor: colors.ambulatoryGlucoseProfile.interQuartile[tick.name],\n xanchor: 1 + legendXOffset,\n xref: 'paper',\n xsizemode: 'pixel',\n yanchor: 0 + legendYOffset,\n yref: 'paper',\n ysizemode: 'pixel',\n });\n\n if (isTarget) {\n legend.push({\n type: 'line',\n x0: 0,\n x1: legendRangeWidth,\n y0: yPos + legendRangeHeight / 2,\n y1: yPos + legendRangeHeight / 2,\n line: {\n color: colors.ambulatoryGlucoseProfile.median.target,\n width: 3,\n },\n xanchor: 1 + legendXOffset,\n xref: 'paper',\n xsizemode: 'pixel',\n yanchor: 0 + legendYOffset,\n yref: 'paper',\n ysizemode: 'pixel',\n });\n }\n\n if (showTick) {\n let tickYPosOffset = 0.5;\n let tickTextIndex = tickIndex + 1;\n\n if (tickIndex > 0) {\n tickYPosOffset = (isTarget ? legendRangeHeight / 2 : legendRangeHeight - 0.5);\n tickTextIndex = isTarget ? tickIndex : tickIndex - 1;\n }\n\n percentileTickLines.push({\n type: 'line',\n x0: 0,\n x1: 5,\n y0: yPos + tickYPosOffset,\n y1: yPos + tickYPosOffset,\n line: {\n color: colors.line.ticks,\n width: 1,\n },\n xanchor: 1 + pixelsToChartScale(paperWidth, legendRangeWidth) + legendXOffset,\n xref: 'paper',\n xsizemode: 'pixel',\n yanchor: 0 + legendYOffset,\n yref: 'paper',\n ysizemode: 'pixel',\n });\n\n percentileTickAnnotations.push(createAnnotation({\n align: 'left',\n font: {\n color: isTarget ? colors.black : colors.text.ticks.percentile,\n size: fontSizes.ambulatoryGlucoseProfile.percentileTicks,\n },\n name: bgRangeKeys[tickIndex],\n text: boldText(percentileLabels[tickTextIndex]),\n xanchor: 'left',\n xref: 'paper',\n xshift: 5,\n x: 1 + pixelsToChartScale(paperWidth, legendRangeWidth) + legendXOffset,\n y: pixelsToChartScale(paperHeight, yPos + tickYPosOffset),\n yanchor: 'middle',\n yref: 'paper',\n yshift: chartScaleToPixels(paperHeight, legendYOffset),\n }));\n }\n });\n }\n\n let targetReadings = [];\n let lowReadings = [];\n let veryLowReadings = [];\n let highReadings = [];\n let veryHighReadings = [];\n\n if (bgSource === BGM_DATA_KEY) {\n const bgPlotRadius = 2.25;\n const rx = pixelsToChartScale(paperWidth, bgPlotRadius);\n const ry = pixelsToChartScale(paperHeight, bgPlotRadius);\n\n const renderBgReadings = bgRange => _.map(_.filter(bgData, ({ value }) => classifyBgValue(bgPrefs.bgBounds, bgPrefs.bgUnits, value, 'fiveWay') === bgRange), d => ({\n type: 'circle',\n x0: d.msPer24 / (MS_IN_DAY) - rx,\n x1: d.msPer24 / (MS_IN_DAY) + rx,\n y0: _.min([d.value, yClamp]) / yClamp - ry,\n y1: _.min([d.value, yClamp]) / yClamp + ry,\n fillcolor: colors.bgReadings[bgRange],\n line: {\n color: colors.black,\n width: 0.25,\n },\n xref: 'paper',\n xsizemode: 'scaled',\n yref: 'paper',\n ysizemode: 'scaled',\n }));\n\n veryLowReadings = renderBgReadings('veryLow');\n lowReadings = renderBgReadings('low');\n targetReadings = renderBgReadings('target');\n highReadings = renderBgReadings('high');\n veryHighReadings = renderBgReadings('veryHigh');\n }\n\n const layout = {\n width: chartAreaWidth,\n height: chartAreaHeight,\n showlegend: false,\n\n margin: {\n l: plotMarginX,\n r: plotMarginX,\n b: plotMarginY,\n t: plotMarginY,\n },\n\n xaxis: {\n gridcolor: colors.line.ticks,\n linecolor: colors.line.ticks,\n range: [0, MS_IN_DAY],\n showgrid: true,\n showline: false,\n showticklabels: false,\n tickvals: quarterDayTicks,\n zeroline: false,\n },\n\n // secondary axis for hourly ticks\n xaxis2: {\n range: [0, MS_IN_DAY],\n overlaying: 'x',\n showgrid: false,\n showline: false,\n showticklabels: false,\n ticks: 'inside',\n tickcolor: colors.lightGrey,\n ticklen: 5,\n tickvals: hourlyTicks,\n zeroline: false,\n },\n\n ..._.reduce(yAxes, (result, axis, index) => {\n const axisKey = index === 0 ? 'yaxis' : `yaxis${index + 1}`;\n result[axisKey] = axis; // eslint-disable-line no-param-reassign\n return result;\n }, {}),\n\n annotations: [\n ...bgTickAnnotations,\n ...percentileTickAnnotations,\n ...hourlyTicksAnnotations,\n\n createAnnotation({\n font: {\n color: colors.text.ticks.bg,\n size: fontSizes.ambulatoryGlucoseProfile.bgUnits,\n },\n text: bgPrefs?.bgUnits,\n x: 0,\n xanchor: 'right',\n xref: 'paper',\n xshift: -2,\n y: bgTicks[5] / yClamp,\n yanchor: 'top',\n yref: 'paper',\n yshift: -4,\n }),\n\n createAnnotation({\n font: {\n color: colors.black,\n size: fontSizes.ambulatoryGlucoseProfile.bgUnits,\n },\n text: boldText(text.ambulatoryGlucoseProfile[bgSource].targetRange),\n x: 0,\n xanchor: 'right',\n xref: 'paper',\n xshift: -2,\n y: _.mean(_.slice(bgTicks, 2, 4)) / yClamp,\n yanchor: 'middle',\n yref: 'paper',\n }),\n ],\n\n shapes: [\n ...bgGridLines,\n ...bgTargetMarkers,\n ...targetReadings,\n ...lowReadings,\n ...veryLowReadings,\n ...highReadings,\n ...veryHighReadings,\n ...bgmMedian,\n ...percentileTickLines,\n ...legend,\n ],\n };\n\n const figure = {\n data: [\n ...data,\n // Dummy data to ensure that all axes render (plotly will not render axes lines if empty)\n { visible: false, xaxis: 'x2' },\n ..._.map(yAxes, (axis, i) => ({ visible: false, yaxis: i === 0 ? 'y' : `y${i + 1}` })),\n ],\n layout,\n };\n\n return figure;\n }\n\n return null;\n};\n\nexport const generateDailyGlucoseProfilesFigure = (section, bgData, bgPrefs, dateLabelFormat) => {\n // Set chart plot within section borders\n const chartAreaWidth = section.width - 2;\n const chartAreaHeight = section.height - 2 - (AGP_SECTION_HEADER_HEIGHT + AGP_SECTION_DESCRIPTION_HEIGHT) - AGP_SECTION_BORDER_RADIUS;\n const plotHeight = chartAreaHeight / 2;\n const plotMarginX = DPI * 0.5;\n const plotMarginTop = DPI * 0.2;\n const plotMarginBottom = 1;\n const paperWidth = chartAreaWidth - (plotMarginX * 2);\n const paperHeight = plotHeight - (plotMarginTop + plotMarginBottom);\n\n if (section.sufficientData) {\n const yClamp = bgPrefs?.bgUnits === MGDL_UNITS ? AGP_BG_CLAMP_MGDL : AGP_BG_CLAMP_MMOLL;\n\n const bgRangeKeys = [\n 'low',\n 'target',\n 'high',\n ];\n\n const bgTicks = [\n 0,\n bgPrefs?.bgBounds?.targetLowerBound,\n bgPrefs?.bgBounds?.targetUpperBound,\n yClamp,\n ];\n\n const bgTickAnnotations = _.map(_.slice(bgTicks, 1, 3), tick => createAnnotation({\n align: 'right',\n font: {\n color: colors.text.ticks.dailyProfileBg,\n size: fontSizes.dailyGlucoseProfiles.bgTicks,\n },\n text: boldText(formatBgValue(tick, bgPrefs, undefined, true)),\n y: tick / yClamp,\n yanchor: 'middle',\n yref: 'paper',\n xanchor: 'right',\n xref: 'x',\n xshift: -2,\n x: 0,\n }));\n\n const bgGridLines = _.map(bgTicks, (tick, index) => {\n const isClamp = index === 3;\n const isTarget = _.includes([1, 2], index);\n const isZero = index === 0;\n\n return {\n layer: isTarget || isClamp ? 'above' : 'below',\n line: {\n color: isTarget ? colors.line.range.dailyProfileTarget : colors.line.range.default,\n width: 1,\n },\n type: 'line',\n x0: isClamp || isZero ? -1 : 0, // fills an empty pixel gap on top grid line\n x1: isClamp || isZero ? paperWidth + 1 : paperWidth, // fills an empty pixel gap on top grid line\n xref: 'paper',\n xanchor: 0,\n xsizemode: 'pixel',\n y0: tick / yClamp,\n y1: tick / yClamp,\n yref: 'paper',\n };\n });\n\n const halfDayTicks = _.range(0, MS_IN_DAY * 7 + 1, MS_IN_HOUR * 12);\n\n const halfDayTickAnnotations = _.map(_.filter(halfDayTicks, (tick, index) => index % 2 !== 0), (tick, index) => createAnnotation({\n align: 'center',\n font: {\n color: colors.black,\n size: dateLabelFormat === 'ha'\n ? fontSizes.dailyGlucoseProfiles.timeTicks\n : fontSizes.dailyGlucoseProfiles.weekdayTicks,\n },\n text: dateLabelFormat === 'ha'\n ? boldText(moment.utc(tick).format(dateLabelFormat))\n : boldText(moment.utc(String(bgData[index][0])).format(dateLabelFormat)),\n y: 1,\n yanchor: 'bottom',\n yref: 'paper',\n yshift: 1,\n xanchor: 'middle',\n xref: 'x',\n x: tick,\n }));\n\n const calendarDays = _.flatten(_.map(bgData, (d) => d[0]));\n\n const calendarDayAnnotations = _.map(calendarDays, (date, index) => createAnnotation({\n align: 'left',\n font: {\n color: colors.text.calendarDates,\n size: fontSizes.dailyGlucoseProfiles.calendarDates,\n },\n text: boldText(moment.utc(date).format('D')),\n y: 1,\n yanchor: 'top',\n yref: 'paper',\n yshift: 0,\n xanchor: 'left',\n xref: 'x',\n xshift: 0,\n x: index * MS_IN_DAY,\n }));\n\n const data = [];\n const yAxes = [];\n\n const combinedData = _.flatten(_.map(bgData, (d, index) => (_.map(d[1], dayData => ({\n ...dayData,\n msPer24: dayData.msPer24 + MS_IN_DAY * index,\n bgRange: dayData.type === BGM_DATA_KEY\n ? classifyBgValue(bgPrefs.bgBounds, bgPrefs.bgUnits, dayData.value, 'threeWay')\n : undefined,\n })))));\n\n let lowReadings = [];\n let targetReadings = [];\n let highReadings = [];\n\n if (section.bgSource === CGM_DATA_KEY) {\n _.each(bgRangeKeys, (bgRange, index) => {\n const isLow = index === 0;\n const isTarget = index === 1;\n const firstDatum = _.first(combinedData);\n const lastDatum = _.last(combinedData);\n const range = [bgTicks[index], bgTicks[index + 1]];\n const fillYExentRangeIndex = isLow ? 1 : 0;\n\n data.push({\n name: 'rangeFill',\n type: 'scatter',\n x: isTarget\n ? [0, MS_IN_DAY * 7, MS_IN_DAY * 7, 0]\n : [firstDatum?.msPer24, ..._.map(combinedData, 'msPer24'), lastDatum?.msPer24, firstDatum?.msPer24],\n y: isTarget\n ? [range[1], range[1], range[0], range[0]]\n : [range[fillYExentRangeIndex], ..._.map(combinedData, 'value'), range[fillYExentRangeIndex], range[fillYExentRangeIndex]],\n yaxis: index === 0 ? 'y' : `y${index + 1}`,\n mode: 'none',\n fill: 'tonextx',\n fillcolor: colors.dailyGlucoseProfiles[bgRange].fill,\n line: {\n color: colors.dailyGlucoseProfiles[bgRange].line,\n simplify: false,\n width: 1,\n },\n });\n\n data.push({\n name: 'median',\n type: 'scatter',\n x: _.map(combinedData, 'msPer24'),\n y: _.map(combinedData, 'value'),\n yaxis: index === 0 ? 'y' : `y${index + 1}`,\n mode: 'lines',\n fill: 'none',\n line: {\n color: colors.dailyGlucoseProfiles[bgRange].line,\n simplify: false,\n width: 1,\n },\n });\n\n const yAxis = {\n domain: [range[0] / yClamp, range[1] / yClamp],\n range,\n showgrid: false,\n showline: true,\n linecolor: colors.lightGrey,\n mirror: true,\n showticklabels: false,\n zeroline: false,\n };\n\n yAxes.push(yAxis);\n });\n }\n\n if (section.bgSource === BGM_DATA_KEY) {\n const bgPlotRadius = 2;\n const rx = pixelsToChartScale(paperWidth, bgPlotRadius);\n const ry = pixelsToChartScale(paperHeight, bgPlotRadius);\n\n const renderBgReadings = bgRange => _.map(_.filter(combinedData, { bgRange }), d => ({\n type: 'circle',\n x0: d.msPer24 / (MS_IN_DAY * 7) - rx,\n x1: d.msPer24 / (MS_IN_DAY * 7) + rx,\n y0: _.min([d.value, yClamp]) / yClamp - ry,\n y1: _.min([d.value, yClamp]) / yClamp + ry,\n fillcolor: colors.bgReadings[bgRange],\n line: {\n color: colors.black,\n width: 0.25,\n },\n xref: 'paper',\n xsizemode: 'scaled',\n yref: 'paper',\n ysizemode: 'scaled',\n }));\n\n lowReadings = renderBgReadings('low');\n targetReadings = renderBgReadings('target');\n highReadings = renderBgReadings('high');\n\n data.push({\n name: 'rangeFill',\n type: 'scatter',\n x: [0, MS_IN_DAY * 7, MS_IN_DAY * 7, 0],\n y: [bgTicks[2], bgTicks[2], bgTicks[1], bgTicks[1]],\n yaxis: 'y',\n mode: 'none',\n fill: 'tonextx',\n fillcolor: colors.dailyGlucoseProfiles.target.fill,\n line: {\n color: colors.dailyGlucoseProfiles.target.line,\n simplify: false,\n width: 1,\n },\n });\n\n const yAxis = {\n domain: [0, 1],\n range: [0, yClamp],\n showgrid: false,\n showline: true,\n linecolor: colors.lightGrey,\n mirror: true,\n showticklabels: false,\n zeroline: false,\n };\n\n yAxes.push(yAxis);\n }\n\n const layout = {\n width: chartAreaWidth,\n height: plotHeight,\n showlegend: false,\n\n margin: {\n l: plotMarginX,\n r: plotMarginX,\n b: plotMarginBottom,\n t: plotMarginTop,\n },\n\n xaxis: {\n gridcolor: colors.line.ticks,\n linecolor: colors.line.ticks,\n range: [0, MS_IN_DAY * 7],\n showgrid: true,\n showline: false,\n showticklabels: false,\n tickvals: halfDayTicks,\n zeroline: false,\n },\n\n ..._.reduce(yAxes, (result, axis, index) => {\n const axisKey = index === 0 ? 'yaxis' : `yaxis${index + 1}`;\n result[axisKey] = axis; // eslint-disable-line no-param-reassign\n return result;\n }, {}),\n\n annotations: [\n ...bgTickAnnotations,\n ...halfDayTickAnnotations,\n ...calendarDayAnnotations,\n\n createAnnotation({\n font: {\n color: colors.text.ticks.bg,\n size: fontSizes.dailyGlucoseProfiles.bgUnits,\n },\n text: boldText(bgPrefs?.bgUnits),\n textangle: 270,\n x: 0,\n xanchor: 'right',\n xref: 'paper',\n xshift: -18,\n y: _.mean(_.slice(bgTicks, 1, 3)) / yClamp,\n yanchor: 'middle',\n yref: 'paper',\n yshift: 0,\n }),\n ],\n\n shapes: [\n ...bgGridLines,\n ...targetReadings,\n ...lowReadings,\n ...highReadings,\n ],\n };\n\n const figure = {\n data: [\n ...data,\n // Dummy data to ensure that all axes render (plotly will not render axes lines if empty)\n ..._.map(yAxes, (axis, i) => ({ visible: false, yaxis: i === 0 ? 'y' : `y${i + 1}` })),\n ],\n layout,\n };\n\n return figure;\n }\n\n return null;\n};\n","// DPI here is the coordinate system, not the resolution; sub-dot precision renders crisply!\nexport const DPI = 72;\nexport const MARGIN = DPI / 2;\nexport const HEIGHT = 11 * DPI - (2 * MARGIN);\nexport const WIDTH = 8.5 * DPI - (2 * MARGIN);\nexport const MARGINS = {\n left: MARGIN,\n top: MARGIN,\n right: MARGIN,\n bottom: MARGIN,\n};\nexport const DEFAULT_FONT_SIZE = 10;\nexport const LARGE_FONT_SIZE = 12;\nexport const FOOTER_FONT_SIZE = 8;\nexport const HEADER_FONT_SIZE = 14;\nexport const SMALL_FONT_SIZE = 8;\nexport const EXTRA_SMALL_FONT_SIZE = 6;\n","/*\n * == BSD2 LICENSE ==\n * Copyright (c) 2017, Tidepool Project\n *\n * This program is free software; you can redistribute it and/or modify it under\n * the terms of the associated License, which is identical to the BSD 2-Clause\n * License as published by the Open Source Initiative at opensource.org.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n * FOR A PARTICULAR PURPOSE. See the License for more details.\n *\n * You should have received a copy of the License along with this program; if\n * not, you can obtain one from Tidepool Project at tidepool.org.\n * == BSD2 LICENSE ==\n */\n\nimport _ from 'lodash';\nimport { max, mean, median, min, quantile, range } from 'd3-array';\n\nimport { BG_DISPLAY_MINIMUM_INCREMENTS, DEFAULT_BG_BOUNDS, MGDL_PER_MMOLL, MGDL_UNITS, MMOLL_UNITS, MS_IN_MIN } from './constants';\nimport { TWENTY_FOUR_HRS } from './datetime';\n\nimport { bankersRound, formatBgValue } from './format.js';\n\n/**\n * classifyBgValue\n * @param {Object} bgBounds - object describing boundaries for blood glucose categories\n * @param {String} bgUnits MGDL_UNITS or MMOLL_UNITS\n * @param {Number} bgValue - integer or float blood glucose value in either mg/dL or mmol/L\n * @param {String} classificationType - 'threeWay' or 'fiveWay'\n *\n * @return {String} bgClassification - low, target, high\n */\nexport function classifyBgValue(bgBounds, bgUnits, bgValue, classificationType = 'threeWay') {\n if (_.isEmpty(bgBounds) ||\n !_.isNumber(_.get(bgBounds, 'targetLowerBound')) ||\n !_.isNumber(_.get(bgBounds, 'targetUpperBound'))) {\n throw new Error(\n 'You must provide a `bgBounds` object with a `targetLowerBound` and a `targetUpperBound`!'\n );\n }\n if (!_.isNumber(bgValue) || !_.gt(bgValue, 0)) {\n throw new Error('You must provide a positive, numerical blood glucose value to categorize!');\n }\n if (!_.includes([MMOLL_UNITS, MGDL_UNITS], bgUnits)) {\n throw new Error('Must provide a valid blood glucose unit of measure!');\n }\n\n const { veryLowThreshold, targetLowerBound, targetUpperBound, veryHighThreshold } = bgBounds;\n\n const precision = bgUnits === MMOLL_UNITS ? 1 : 0;\n const roundedValue = bankersRound(bgValue, precision);\n\n // fiveWay\n if (classificationType === 'fiveWay') {\n if (_.isNumber(veryLowThreshold) && roundedValue < veryLowThreshold) {\n return 'veryLow';\n } else if (_.isNumber(veryHighThreshold) && roundedValue > veryHighThreshold) {\n return 'veryHigh';\n } else if (roundedValue < targetLowerBound) {\n return 'low';\n } else if (roundedValue > targetUpperBound) {\n return 'high';\n }\n\n return 'target';\n }\n\n // threeWay\n if (roundedValue < targetLowerBound) {\n return 'low';\n } else if (roundedValue > targetUpperBound) {\n return 'high';\n }\n return 'target';\n}\n\n/**\n * classifyCvValue\n * @param {number} value - integer or float coefficient of variation (CV) value\n * @return {String} cvClassification - target, high\n */\nexport function classifyCvValue(value) {\n if (value <= 36) {\n return 'target';\n } else {\n return 'high';\n }\n}\n\n/**\n * convertToMmolL\n * @param {Number} bgVal - blood glucose value in mg/dL\n *\n * @return {Number} convertedBgVal - blood glucose value in mmol/L, unrounded\n */\nexport function convertToMmolL(val) {\n return (val / MGDL_PER_MMOLL);\n}\n\n/**\n * convertToMGDL\n * @param {Number} bgVal - blood glucose value in mmol/L\n *\n * @return {Number} convertedBgVal - blood glucose value in mg/dL, unrounded\n */\nexport function convertToMGDL(val) {\n return (val * MGDL_PER_MMOLL);\n}\n\n/**\n * reshapeBgClassesToBgBounds\n * @param {Object} bgPrefs - bgPrefs object from blip containing tideline-style bgClasses\n *\n * @return {Object} bgBounds - @tidepool/viz-style bgBounds\n */\nexport function reshapeBgClassesToBgBounds(bgPrefs) {\n const { bgClasses, bgUnits } = bgPrefs;\n\n const bgBounds = {\n veryHighThreshold: _.get(bgClasses, 'high.boundary', DEFAULT_BG_BOUNDS[bgUnits].veryHighThreshold),\n targetUpperBound: _.get(bgClasses, 'target.boundary', DEFAULT_BG_BOUNDS[bgUnits].targetUpperBound),\n targetLowerBound: _.get(bgClasses, 'low.boundary', DEFAULT_BG_BOUNDS[bgUnits].targetLowerBound),\n veryLowThreshold: _.get(bgClasses, 'very-low.boundary', DEFAULT_BG_BOUNDS[bgUnits].veryLowThreshold),\n extremeHighThreshold: DEFAULT_BG_BOUNDS[bgUnits].extremeHighThreshold,\n clampThreshold: DEFAULT_BG_BOUNDS[bgUnits].clampThreshold,\n };\n\n return bgBounds;\n}\n\n/**\n * Generate BG Range Labels for a given set of bg prefs\n *\n * @export\n * @param {Object} bgPrefs - bgPrefs object containing viz-style bgBounds and the bgUnits\n * @returns {Object} bgRangeLabels - map of labels keyed by bgClassification\n */\nexport function generateBgRangeLabels(bgPrefs, opts = {}) {\n const { bgBounds, bgUnits } = bgPrefs;\n const minimumIncrement = BG_DISPLAY_MINIMUM_INCREMENTS[bgUnits];\n\n const thresholds = _.mapValues(\n bgBounds,\n threshold => (_.isNumber(threshold) ? formatBgValue(threshold, bgPrefs) : null)\n );\n\n thresholds.highLowerBound = formatBgValue(bgBounds.targetUpperBound + minimumIncrement, bgPrefs);\n thresholds.lowUpperBound = formatBgValue(bgBounds.targetLowerBound - minimumIncrement, bgPrefs);\n\n const {\n veryLowThreshold,\n lowUpperBound,\n targetLowerBound,\n targetUpperBound,\n highLowerBound,\n veryHighThreshold,\n extremeHighThreshold,\n } = thresholds;\n\n if (opts.condensed) {\n return {\n veryLow: !!veryLowThreshold ? `<${veryLowThreshold}` : null,\n low: !!veryLowThreshold ? `${veryLowThreshold}-${lowUpperBound}` : `<${targetLowerBound}`,\n anyLow: `<${targetLowerBound}`,\n target: `${targetLowerBound}-${targetUpperBound}`,\n high: !!veryHighThreshold ? `${highLowerBound}-${veryHighThreshold}` : `>${targetUpperBound}`,\n anyHigh: `>${targetUpperBound}`,\n veryHigh: !!veryHighThreshold ? `>${veryHighThreshold}` : null,\n extremeHigh: !!extremeHighThreshold ? `>${extremeHighThreshold}` : null,\n };\n }\n\n if (opts.segmented) {\n return {\n veryLow: {\n suffix: bgUnits,\n value: !!veryLowThreshold ? `<${veryLowThreshold}` : null,\n },\n low: {\n prefix: 'between',\n suffix: bgUnits,\n value: !!veryLowThreshold ? `${veryLowThreshold}-${lowUpperBound}` : `<${targetLowerBound}`,\n },\n anyLow: {\n suffix: bgUnits,\n value: `<${targetLowerBound}`,\n },\n target: {\n prefix: 'between',\n suffix: bgUnits,\n value: `${targetLowerBound}-${targetUpperBound}`,\n },\n high: {\n prefix: 'between',\n suffix: bgUnits,\n value: !!veryHighThreshold ? `${highLowerBound}-${veryHighThreshold}` : `>${targetUpperBound}`,\n },\n anyHigh: {\n suffix: bgUnits,\n value: `>${targetUpperBound}`,\n },\n veryHigh: {\n suffix: bgUnits,\n value: !!veryHighThreshold ? `>${veryHighThreshold}` : null,\n },\n extremeHigh: {\n suffix: bgUnits,\n value: !!extremeHighThreshold ? `>${extremeHighThreshold}` : null,\n },\n };\n }\n\n return {\n veryLow: !!veryLowThreshold ? `below ${veryLowThreshold} ${bgUnits}` : null,\n low: !!veryLowThreshold ? `between ${veryLowThreshold} - ${lowUpperBound} ${bgUnits}` : `below ${targetLowerBound} ${bgUnits}`,\n anyLow: `below ${targetLowerBound} ${bgUnits}`,\n target: `between ${targetLowerBound} - ${targetUpperBound} ${bgUnits}`,\n high: !!veryHighThreshold ? `between ${highLowerBound} - ${veryHighThreshold} ${bgUnits}` : `above ${targetUpperBound} ${bgUnits}`,\n anyHigh: `above ${targetUpperBound} ${bgUnits}`,\n veryHigh: !!veryHighThreshold ? `above ${veryHighThreshold} ${bgUnits}` : null,\n extremeHigh: !!extremeHighThreshold ? `above ${extremeHighThreshold} ${bgUnits}` : null,\n };\n}\n\n/**\n * getOutOfRangeThreshold\n * @param {Object} bgDatum\n * @return Object containing out of range threshold or null\n */\nexport function getOutOfRangeThreshold(bgDatum) {\n const outOfRangeAnnotation = _.find(\n bgDatum.annotations || [], (annotation) => (annotation.code === 'bg/out-of-range')\n );\n return outOfRangeAnnotation ?\n { [outOfRangeAnnotation.value]: outOfRangeAnnotation.threshold } : null;\n}\n\n/**\n * Get the adjusted count of expected CGM data points for devices that do not sample at the default\n * 5 minute interval, such as the Abbot FreeStyle Libre, which samples every 15 mins\n *\n * @param {Array} data - cgm data\n * @return {Integer} count - the weighted count\n */\nexport function weightedCGMCount(data) {\n return _.reduce(data, (total, datum) => {\n const sampleInterval = _.get(datum, 'sampleInterval', 5 * MS_IN_MIN);\n const sampleIntervalInMinutes = sampleInterval / MS_IN_MIN;\n const datumWeight = sampleIntervalInMinutes / 5; // Default weight is 1, for 5 minute samples\n return total + datumWeight;\n }, 0);\n}\n\n/**\n * Determine if a patient is using a custom target bg range\n *\n * @param {Object} bgPrefs - bgPrefs object containing viz-style bgBounds and the bgUnits\n */\nexport function isCustomBgRange(bgPrefs) {\n const { bgBounds, bgUnits } = bgPrefs;\n return bgBounds.targetUpperBound !== DEFAULT_BG_BOUNDS[bgUnits].targetUpperBound\n || bgBounds.targetLowerBound !== DEFAULT_BG_BOUNDS[bgUnits].targetLowerBound;\n}\n\n/**\n * determineRangeBoundaries\n * @param {Array} outOfRange - Array of out-of-range objects w/threshold and value\n *\n * @return {Object} highAndLowThresholds - Object with high and low keys\n */\nexport function determineRangeBoundaries(outOfRange) {\n const lowThresholds = _.filter(outOfRange, { value: 'low' });\n const highThresholds = _.filter(outOfRange, { value: 'high' });\n const boundaries = {};\n if (!_.isEmpty(lowThresholds)) {\n // if there is data from multiple devices present with different thresholds\n // we want to use the more conservative (= higher) threshold for lows\n boundaries.low = max(lowThresholds, (d) => (d.threshold));\n }\n if (!_.isEmpty(highThresholds)) {\n // if there is data from multiple devices present with different thresholds\n // we want to use the more conservative (= lower) threshold for highs\n boundaries.high = min(highThresholds, (d) => (d.threshold));\n }\n return boundaries;\n}\n\n/**\n * findBinForTimeOfDay\n * @param {Number} binSize - natural number duration in milliseconds\n * @param {Number} msPer24 - natural number milliseconds into a twenty-four hour day\n *\n * @return {Number} bin\n */\nexport function findBinForTimeOfDay(binSize, msPer24) {\n if (msPer24 < 0 || msPer24 >= TWENTY_FOUR_HRS) {\n throw new Error('`msPer24` < 0 or >= 86400000 is invalid!');\n }\n\n return Math.floor(msPer24 / binSize) * binSize + (binSize / 2);\n}\n\n/**\n * findOutOfRangeAnnotations\n * @param {Array} data - Array of `cbg` or `smbg` events\n *\n * @return {Array} thresholds - Array of objects with unique `threshold`\n * (and `value` of 'low' or 'high')\n */\nexport function findOutOfRangeAnnotations(data) {\n const isOutOfRangeAnnotation = (annotation) => (annotation.code === 'bg/out-of-range');\n const eventsAnnotatedAsOutOfRange = _.filter(\n data,\n (d) => (_.some(d.annotations || [], isOutOfRangeAnnotation))\n );\n const annotations = _.map(eventsAnnotatedAsOutOfRange, (d) => (_.pick(\n _.find(d.annotations || [], isOutOfRangeAnnotation),\n ['threshold', 'value']\n )));\n // the numerical `threshold` is our determiner of uniqueness\n return _.uniqBy(annotations, (d) => (d.threshold));\n}\n\n/**\n * calculateCbgStatsForBin\n * @param {String} binKey - String of natural number milliseconds bin\n * @param {Number} binSize - natural number duration in milliseconds\n * @param {Array} data - Array of cbg values in mg/dL or mmol/L\n * @param {Array} outOfRange - Array of out-of-range objects w/threshold and value\n * @param {Array} outerQuantiles - Array of values to use for lower and upper quantiles\n *\n * @return {Object} calculatedCbgStats\n */\nexport function calculateCbgStatsForBin(binKey, binSize, data, outOfRange, outerQuantiles = []) {\n const [\n lowerQuantile = 0.1,\n upperQuantile = 0.9,\n ] = outerQuantiles;\n\n const sorted = _.sortBy(data, d => d);\n const centerOfBinMs = parseInt(binKey, 10);\n const stats = {\n id: binKey,\n min: min(sorted),\n lowerQuantile: quantile(sorted, lowerQuantile),\n firstQuartile: quantile(sorted, 0.25),\n median: median(sorted),\n thirdQuartile: quantile(sorted, 0.75),\n upperQuantile: quantile(sorted, upperQuantile),\n max: max(sorted),\n msX: centerOfBinMs,\n msFrom: centerOfBinMs - (binSize / 2),\n msTo: centerOfBinMs + (binSize / 2),\n };\n if (!_.isEmpty(outOfRange)) {\n const thresholds = determineRangeBoundaries(outOfRange);\n stats.outOfRangeThresholds = thresholds;\n }\n return stats;\n}\n\n/**\n * calculateSmbgStatsForBin\n * @param {String} binKey - String of natural number milliseconds bin\n * @param {Number} binSize - natural number duration in milliseconds\n * @param {Array} data - Array of smbg values in mg/dL or mmol/L\n * @param {Array} outOfRange - Array of out-of-range objects w/threshold and value\n *\n * @return {Object} calculatedSmbgStats\n */\nexport function calculateSmbgStatsForBin(binKey, binSize, data, outOfRange) {\n const minDatums = {\n quantile: 5,\n median: 3,\n };\n\n const sorted = _.sortBy(data, d => d);\n const centerOfBinMs = parseInt(binKey, 10);\n const stats = {\n id: binKey,\n min: min(sorted),\n mean: mean(sorted),\n max: max(sorted),\n msX: centerOfBinMs,\n firstQuartile: data.length >= minDatums.quantile ? quantile(sorted, 0.25) : undefined,\n median: data.length >= minDatums.median ? median(sorted) : undefined,\n thirdQuartile: data.length >= minDatums.quantile ? quantile(sorted, 0.75) : undefined,\n msFrom: centerOfBinMs - (binSize / 2),\n msTo: centerOfBinMs + (binSize / 2),\n };\n if (!_.isEmpty(outOfRange)) {\n const thresholds = determineRangeBoundaries(outOfRange);\n stats.outOfRangeThresholds = thresholds;\n }\n return stats;\n}\n\n/**\n * mungeBGDataBins\n * @param {String} bgType - String - one of [smbg|cbg]\n * @param {String} binKey - String of natural number milliseconds bin\n * @param {Number} binSize - natural number duration in milliseconds\n * @param {Array} data - Array of smbg values in mg/dL or mmol/L\n * @param {Array} outerQuantiles - Array of values to use for lower and upper quantiles\n * @returns munged bg bin data\n */\nexport function mungeBGDataBins(bgType, binSize, data, outerQuantiles) {\n const binned = _.groupBy(data, (d) => (findBinForTimeOfDay(binSize, d.msPer24)));\n const outOfRanges = findOutOfRangeAnnotations(data);\n // we need *all* possible keys for TransitionMotion to work on enter/exit\n // and the range starts with binSize/2 because the keys are centered in each bin\n const binKeys = _.map(range(binSize / 2, TWENTY_FOUR_HRS, binSize), (d) => String(d));\n\n const binCalculator = bgType === 'smbg' ? calculateSmbgStatsForBin : calculateCbgStatsForBin;\n const valueExtractor = (d) => (d.value);\n const mungedData = [];\n for (let i = 0; i < binKeys.length; ++i) {\n const values = _.map(_.get(binned, binKeys[i], []), valueExtractor);\n mungedData.push(binCalculator(binKeys[i], binSize, values, outOfRanges, outerQuantiles));\n }\n return mungedData;\n}\n","/*\n * == BSD2 LICENSE ==\n * Copyright (c) 2016, Tidepool Project\n *\n * This program is free software; you can redistribute it and/or modify it under\n * the terms of the associated License, which is identical to the BSD 2-Clause\n * License as published by the Open Source Initiative at opensource.org.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n * FOR A PARTICULAR PURPOSE. See the License for more details.\n *\n * You should have received a copy of the License along with this program; if\n * not, you can obtain one from Tidepool Project at tidepool.org.\n * == BSD2 LICENSE ==\n */\n\nimport _ from 'lodash';\nimport i18next from 'i18next';\nconst t = i18next.t.bind(i18next);\n\nif (_.get(i18next, 'options.returnEmptyString') === undefined) {\n // Return key if no translation is present\n i18next.init({ returnEmptyString: false, nsSeparator: '|' });\n}\n\nexport const BG_HIGH = t('High');\nexport const BG_LOW = t('Low');\n\nconst STIFFNESS = 180;\nconst DAMPING = 40;\nconst PRECISION = 0.1;\n\nexport const springConfig = { stiffness: STIFFNESS, damping: DAMPING, precision: PRECISION };\n\nexport const MGDL_CLAMP_TOP = 400;\nexport const MMOLL_CLAMP_TOP = 22.5;\n\nexport const MGDL_UNITS = t('mg/dL');\nexport const MMOLL_UNITS = t('mmol/L');\nexport const MGDL_PER_MMOLL = 18.01559;\n\nexport const BG_DISPLAY_MINIMUM_INCREMENTS = {\n [MGDL_UNITS]: 1,\n [MMOLL_UNITS]: 0.1,\n};\n\nexport const GLYCEMIC_RANGES_PRESET = {\n ADA_STANDARD: 'adaStandard',\n ADA_OLDER_HIGH_RISK: 'adaHighRisk',\n ADA_PREGNANCY_T1: 'adaPregnancyType1',\n ADA_GESTATIONAL_T2: 'adaPregnancyType2',\n};\n\nexport const GLYCEMIC_RANGES_TYPE = {\n PRESET: 'preset',\n CUSTOM: 'custom',\n};\n\nexport const DEFAULT_BG_BOUNDS = {\n [MGDL_UNITS]: {\n veryLowThreshold: 54,\n targetLowerBound: 70,\n targetUpperBound: 180,\n veryHighThreshold: 250,\n extremeHighThreshold: 350,\n clampThreshold: 600,\n },\n [MMOLL_UNITS]: {\n veryLowThreshold: 3.0,\n targetLowerBound: 3.9,\n targetUpperBound: 10.0,\n veryHighThreshold: 13.9,\n extremeHighThreshold: 19.4,\n clampThreshold: 33.3,\n },\n};\n\nexport const ADA_STANDARD_BG_BOUNDS = DEFAULT_BG_BOUNDS;\n\nexport const ADA_OLDER_HIGH_RISK_BG_BOUNDS = {\n [MGDL_UNITS]: {\n veryLowThreshold: null,\n targetLowerBound: 70,\n targetUpperBound: 180,\n veryHighThreshold: 250,\n extremeHighThreshold: null,\n clampThreshold: 600,\n },\n [MMOLL_UNITS]: {\n veryLowThreshold: null,\n targetLowerBound: 3.9,\n targetUpperBound: 10.0,\n veryHighThreshold: 13.9,\n extremeHighThreshold: null,\n clampThreshold: 33.3,\n },\n};\n\nexport const ADA_PREGNANCY_T1_BG_BOUNDS = {\n [MGDL_UNITS]: {\n veryLowThreshold: 54,\n targetLowerBound: 63,\n targetUpperBound: 140,\n veryHighThreshold: null,\n extremeHighThreshold: null,\n clampThreshold: 600,\n },\n [MMOLL_UNITS]: {\n veryLowThreshold: 3.0,\n targetLowerBound: 3.5,\n targetUpperBound: 7.8,\n veryHighThreshold: null,\n extremeHighThreshold: null,\n clampThreshold: 33.3,\n },\n};\n\nexport const ADA_GESTATIONAL_T2_BG_BOUNDS = ADA_PREGNANCY_T1_BG_BOUNDS;\n\nexport const LBS_PER_KG = 2.2046226218;\n\nconst ONE_WEEK = 7;\nconst TWO_WEEKS = 14;\nconst FOUR_WEEKS = 28;\n\nexport const trends = { extentSizes: { ONE_WEEK, TWO_WEEKS, FOUR_WEEKS } };\n\nexport const MS_IN_DAY = 864e5;\nexport const MS_IN_HOUR = 864e5 / 24;\nexport const MS_IN_MIN = MS_IN_HOUR / 60;\n\nexport const CGM_READINGS_ONE_DAY = 288;\nexport const CGM_DATA_KEY = 'cbg';\nexport const BGM_DATA_KEY = 'smbg';\n\nexport const NO_SITE_CHANGE = 'noSiteChange';\nexport const SITE_CHANGE = 'siteChange';\nexport const SITE_CHANGE_RESERVOIR = 'reservoirChange';\nexport const SITE_CHANGE_TUBING = 'tubingPrime';\nexport const SITE_CHANGE_CANNULA = 'cannulaPrime';\n\nexport const ALARM = 'alarm';\nexport const ALARM_NO_DELIVERY = 'no_delivery';\nexport const ALARM_AUTO_OFF = 'auto_off';\nexport const ALARM_NO_INSULIN = 'no_insulin';\nexport const ALARM_NO_POWER = 'no_power';\nexport const ALARM_OCCLUSION = 'occlusion';\nexport const ALARM_OVER_LIMIT = 'over_limit';\n\nexport const EVENT = 'event';\nexport const EVENT_PUMP_SHUTDOWN = 'pump_shutdown';\n\nexport const AUTOMATED_BOLUS = 'automatedBolus';\nexport const AUTOMATED_DELIVERY = 'automatedDelivery';\nexport const AUTOMATED_SUSPEND = 'automatedSuspend';\nexport const AUTOMATED_MODE_EXITED = 'automatedModeExited';\nexport const SCHEDULED_DELIVERY = 'scheduledDelivery';\nexport const SETTINGS_OVERRIDE = 'settingsOverride';\nexport const SLEEP = 'sleep';\nexport const PHYSICAL_ACTIVITY = 'physicalActivity';\nexport const PREPRANDIAL = 'preprandial';\nexport const MAX_BOLUS = 'maxBolus';\nexport const MAX_BASAL = 'maxBasal';\nexport const ONE_BUTTON_BOLUS = 'oneButtonBolus';\nexport const INSULIN_DURATION = 'insulinDuration';\n\nexport const SITE_CHANGE_TYPE_UNDECLARED = 'undeclared';\n\nexport const INSULET = 'Insulet';\nexport const TANDEM = 'Tandem';\nexport const ANIMAS = 'Animas';\nexport const TIDEPOOL_LOOP = 'Tidepool Loop';\nexport const DIY_LOOP = 'DIY Loop';\nexport const TWIIST_LOOP = 'twiist';\nexport const MEDTRONIC = 'Medtronic';\nexport const MICROTECH = 'Microtech';\n\nexport const pumpVocabulary = {\n [ANIMAS]: {\n [SITE_CHANGE_RESERVOIR]: t('Go Rewind'),\n [SITE_CHANGE_TUBING]: t('Go Prime'),\n [SITE_CHANGE_CANNULA]: t('Cannula Fill'),\n },\n [INSULET]: {\n [SITE_CHANGE_RESERVOIR]: t('Pod Change'),\n [SITE_CHANGE_TUBING]: t('Pod Activate'),\n [SITE_CHANGE_CANNULA]: t('Prime'),\n [MAX_BOLUS]: t('Maximum Bolus'),\n [MAX_BASAL]: t('Max Basal Rate'),\n [INSULIN_DURATION]: t('Duration of Insulin Action'),\n },\n [MEDTRONIC]: {\n [SITE_CHANGE_RESERVOIR]: t('Rewind'),\n [SITE_CHANGE_TUBING]: t('Prime'),\n [SITE_CHANGE_CANNULA]: t('Cannula Prime'),\n [AUTOMATED_DELIVERY]: t('Auto Mode'),\n [SCHEDULED_DELIVERY]: t('Manual'),\n [MAX_BOLUS]: t('Max Bolus'),\n [MAX_BASAL]: t('Max Basal'),\n [INSULIN_DURATION]: t('Active Insulin Time'),\n },\n [MICROTECH]: {\n [SITE_CHANGE_RESERVOIR]: t('Rewind'),\n [SITE_CHANGE_TUBING]: t('Reservoir Prime'),\n [SITE_CHANGE_CANNULA]: t('Cannula Prime'),\n },\n [TANDEM]: {\n [SITE_CHANGE_RESERVOIR]: t('Cartridge Change'),\n [SITE_CHANGE_TUBING]: t('Tubing Fill'),\n [SITE_CHANGE_CANNULA]: t('Cannula Fill'),\n [AUTOMATED_DELIVERY]: t('Automation'),\n [SCHEDULED_DELIVERY]: t('Manual'),\n [SETTINGS_OVERRIDE]: t('Activity'),\n [SLEEP]: { label: t('Sleep'), marker: t('Z') },\n [PHYSICAL_ACTIVITY]: { label: t('Exercise'), marker: t('E') },\n [MAX_BOLUS]: t('Max Bolus'),\n [INSULIN_DURATION]: t('Insulin Duration'),\n },\n [TIDEPOOL_LOOP]: {\n [AUTOMATED_DELIVERY]: t('Automation'),\n [AUTOMATED_MODE_EXITED]: t('Off'),\n [SCHEDULED_DELIVERY]: t('Manual'),\n [SETTINGS_OVERRIDE]: t('Preset'),\n [PHYSICAL_ACTIVITY]: { label: t('Workout'), marker: t('W') },\n [MAX_BOLUS]: t('Maximum Bolus'),\n [MAX_BASAL]: t('Maximum Basal Rate'),\n },\n [TWIIST_LOOP]: {\n [SITE_CHANGE_RESERVOIR]: t('Cassette Change'),\n [AUTOMATED_DELIVERY]: t('Automation'),\n [AUTOMATED_MODE_EXITED]: t('Off'),\n [SCHEDULED_DELIVERY]: t('Manual'),\n [SETTINGS_OVERRIDE]: t('Preset'),\n [PHYSICAL_ACTIVITY]: { label: t('Workout'), marker: t('W') },\n [MAX_BOLUS]: t('Maximum Bolus'),\n [MAX_BASAL]: t('Maximum Basal Rate'),\n [ALARM_NO_INSULIN]: t('Cassette Empty'),\n [ALARM_OCCLUSION]: t('Line Blocked'),\n },\n [DIY_LOOP]: {\n [AUTOMATED_DELIVERY]: t('Automation'),\n [AUTOMATED_MODE_EXITED]: t('Off'),\n [SCHEDULED_DELIVERY]: t('Manual'),\n [SETTINGS_OVERRIDE]: t('Preset'),\n [PHYSICAL_ACTIVITY]: { label: t('Workout'), marker: t('W') },\n [MAX_BOLUS]: t('Maximum Bolus'),\n [MAX_BASAL]: t('Maximum Basal Rate'),\n },\n default: {\n [SITE_CHANGE_RESERVOIR]: t('Cartridge Change'),\n [SITE_CHANGE_TUBING]: t('Tubing Fill'),\n [SITE_CHANGE_CANNULA]: t('Cannula Fill'),\n [AUTOMATED_BOLUS]: t('Automated'),\n [AUTOMATED_DELIVERY]: t('Automated'),\n [AUTOMATED_SUSPEND]: t('Automated Suspend'),\n [AUTOMATED_MODE_EXITED]: t('Exited'),\n [SCHEDULED_DELIVERY]: t('Manual'),\n [SETTINGS_OVERRIDE]: t('Settings Override'),\n [SLEEP]: { label: t('Sleep'), marker: t('Z') },\n [PHYSICAL_ACTIVITY]: { label: t('Exercise'), marker: t('E') },\n [PREPRANDIAL]: { label: t('Premeal'), marker: t('P') },\n [MAX_BOLUS]: t('Max Bolus'),\n [MAX_BASAL]: t('Max Basal'),\n [INSULIN_DURATION]: t('Insulin Duration'),\n [ONE_BUTTON_BOLUS]: t('One-Button Bolus'),\n [ALARM_NO_DELIVERY]: t('Insulin Delivery Stopped'),\n [ALARM_AUTO_OFF]: t('Pump Auto-Off'),\n [ALARM_NO_INSULIN]: t('Reservoir Empty'),\n [ALARM_NO_POWER]: t('Battery Empty'),\n [ALARM_OCCLUSION]: t('Occlusion Detected'),\n [ALARM_OVER_LIMIT]: t('Insulin Delivery Limit Exceeded'),\n [EVENT_PUMP_SHUTDOWN]: t('Pump Shutdown'),\n },\n};\n\nexport const settingsOverrides = {\n [TANDEM]: [\n SLEEP,\n PHYSICAL_ACTIVITY,\n ],\n [TIDEPOOL_LOOP]: [\n PHYSICAL_ACTIVITY,\n PREPRANDIAL,\n ],\n [TWIIST_LOOP]: [\n PHYSICAL_ACTIVITY,\n PREPRANDIAL,\n ],\n [DIY_LOOP]: [\n PREPRANDIAL,\n ],\n default: [\n SLEEP,\n PHYSICAL_ACTIVITY,\n PREPRANDIAL,\n ],\n};\n\nexport const AUTOMATED_BASAL_DEVICE_MODELS = {\n [MEDTRONIC]: ['1580', '1581', '1582', '1780', '1781', '1782'],\n};\nexport const BG_DATA_TYPES = [\n 'cbg',\n 'smbg',\n];\n\nexport const DIABETES_DATA_TYPES = [\n ...BG_DATA_TYPES,\n 'basal',\n 'bolus',\n 'wizard',\n 'food',\n];\n\nexport const BG_COLORS = {\n veryLow: '#FB5951',\n low: '#FF8B7C',\n target: '#76D3A6',\n high: '#BB9AE7',\n veryHigh: '#8C65D6',\n};\n","/*\n * == BSD2 LICENSE ==\n * Copyright (c) 2016, Tidepool Project\n *\n * This program is free software; you can redistribute it and/or modify it under\n * the terms of the associated License, which is identical to the BSD 2-Clause\n * License as published by the Open Source Initiative at opensource.org.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n * FOR A PARTICULAR PURPOSE. See the License for more details.\n *\n * You should have received a copy of the License along with this program; if\n * not, you can obtain one from Tidepool Project at tidepool.org.\n * == BSD2 LICENSE ==\n */\n\n/*\n * Guidelines for these utilities:\n *\n * 1. Only \"workhorse\" functions used in 2+ places should be here.\n * 1a. A function used in multiple components for one view should live\n * in view-specific utils: src/utils/[view]/datetime.js\n * 1b. A function used in only one component should just be part of that component,\n * potentially as a named export if tests are deemed important to have.\n *\n * 2. Function naming scheme: the two main verbs here are `get` and `format`.\n * 2a. If the function returns any kind of datetime (JavaScript Date, hammertime, ISO 8601 String),\n * then the function name should start with `get`.\n * 2b. If the function returns a _formatted_ String that will be **surfaced to the end user**,\n * then the function name should start with `format`.\n *\n * 3. Function organizational scheme in this file and tests file: alphabetical plz, unless ESLint\n * complains about an undefined (e.g., getTimezoneFromTimePrefs must be at the top).\n *\n * 4. Try to be consistent in how params are used:\n * (e.g., always pass in `timePrefs`) rather than a named timezone\n * and try to copy & paste JSDoc @param descriptions for common params.\n *\n */\n\nimport _ from 'lodash';\n// using d3-time-format because time is time of data access in\n// user’s browser time, not PwD’s configured timezone\nimport { utcFormat, timeFormat } from 'd3-time-format';\nimport moment from 'moment-timezone';\nimport sundial from 'sundial';\nimport i18next from 'i18next';\n\nconst t = i18next.t.bind(i18next);\n\nexport const THIRTY_MINS = 1800000;\nexport const ONE_HR = 3600000;\nexport const THREE_HRS = 10800000;\nexport const TWENTY_FOUR_HRS = 86400000;\n\n/**\n * getMsPer24\n * @param {String} utc - Zulu timestamp (Integer hammertime also OK)\n * @param {String} timezoneName - valid timezoneName String\n * @returns\n */\nexport function getMsPer24(utc, timezoneName = 'UTC') {\n const localized = moment.utc(utc).tz(timezoneName);\n const hrsToMs = localized.hours() * 1000 * 60 * 60;\n const minToMs = localized.minutes() * 1000 * 60;\n const secToMs = localized.seconds() * 1000;\n const ms = localized.milliseconds();\n return hrsToMs + minToMs + secToMs + ms;\n}\n\n/**\n * getOffset\n * @param {String} utc - Zulu timestamp (Integer hammertime also OK)\n * @param {String} timezoneName - valid timezoneName String\n *\n * @return {Object} a JavaScript Date, the closest (future) midnight according to timePrefs;\n * if utc is already local midnight, returns utc\n */\nexport function getOffset(utc, timezoneName) {\n const utcHammertime = (typeof utc === 'string') ? Date.parse(utc) : utc;\n return moment.tz.zone(timezoneName).utcOffset(utcHammertime);\n}\n\n/**\n * getBrowserTimezone\n * @returns {String} browser-determined timezone name\n */\nexport function getBrowserTimezone() {\n return new Intl.DateTimeFormat().resolvedOptions().timeZone;\n}\n\n/**\n * getTimezoneFromTimePrefs\n * @param {Object} timePrefs - object containing timezoneAware Boolean and timezoneName String\n *\n * @return {String} timezoneName from timePrefs, browser, or fallback to 'UTC'\n */\nexport function getTimezoneFromTimePrefs(timePrefs = {}) {\n const { timezoneAware, timezoneName } = timePrefs;\n try {\n let timezone = getBrowserTimezone() || 'UTC';\n if (timezoneAware && timezoneName) {\n timezone = timezoneName;\n }\n sundial.checkTimezoneName(timezone);\n return timezone;\n } catch (err) {\n return 'UTC';\n }\n}\n\n/**\n * formatBirthdate\n * @param {Object} patient - Tidepool patient object containing profile\n *\n * @return {String} formatted birthdate, e.g., 'Jul 4, 1975'; empty String if none found\n */\nexport function formatBirthdate(patient) {\n const bday = _.get(patient, ['profile', 'patient', 'birthday'], '');\n if (bday) {\n return utcFormat('%b %-d, %Y')(Date.parse(bday));\n }\n return '';\n}\n\n/**\n * formatClocktimeFromMsPer24\n * @param {Number} duration - positive integer representing a time of day\n * in milliseconds within a 24-hr day\n * @param {String} [format] - optional moment display format string; default is 'h:mm a'\n *\n * @return {String} formatted clocktime, e.g., '12:05 pm'\n */\nexport function formatClocktimeFromMsPer24(milliseconds, format = 'h:mm a') {\n if (_.isNull(milliseconds) || _.isUndefined(milliseconds) ||\n milliseconds < 0 || milliseconds > TWENTY_FOUR_HRS || milliseconds instanceof Date) {\n throw new Error('First argument must be a value in milliseconds per twenty-four hour day!');\n }\n return moment.utc(milliseconds).format(format);\n}\n\n/**\n * formatCurrentDate\n * @return {String} formatted current date, e.g., 'Jul 4, 2017';\n */\nexport function formatCurrentDate() {\n return timeFormat('%b %-d, %Y')(new Date());\n}\n\n/**\n * formatDiagnosisDate\n * @param {Object} patient - Tidepool patient object containing profile\n *\n * @return {String} formatted diagnosis date, e.g., 'Jul 4, 1975'; empty String if none found\n */\nexport function formatDiagnosisDate(patient) {\n const diagnosis = _.get(patient, ['profile', 'patient', 'diagnosisDate'], '');\n if (diagnosis) {\n return utcFormat('%b %-d, %Y')(Date.parse(diagnosis));\n }\n return '';\n}\n\n/**\n * formatDateRange\n * @param {String|Date} startDate - A moment-compatible date object or string\n * @param {String|Date} endDate - A moment-compatible date object or string\n * @param {String} format - Optional. The moment format string to parse startDate and endDate with\n */\nexport function formatDateRange(startDate, endDate, dateParseFormat, monthFormat = 'MMM') {\n const start = moment.utc(startDate, dateParseFormat);\n const end = moment.utc(endDate, dateParseFormat);\n\n const isSameYear = start.isSame(end, 'year');\n const isSameDay = start.isSame(end, 'day');\n const startFormat = isSameYear ? start.format(`${monthFormat} D`) : start.format(`${monthFormat} D, YYYY`);\n const endFormat = end.format(`${monthFormat} D, YYYY`);\n\n const formattedRange = isSameDay ? endFormat : `${startFormat} - ${endFormat}`;\n\n return formattedRange;\n}\n\n/**\n * formatDuration\n * @param {Number} duration - positive integer duration in milliseconds\n * @param {String} format - one of [hoursFractional, condensed]\n * @return {String} formatted duration, e.g., '1¼ hr'\n */\nexport function formatDuration(duration, opts = {}) {\n const momentDuration = moment.duration(duration);\n const days = momentDuration.days();\n const hours = momentDuration.hours();\n const minutes = momentDuration.minutes();\n const seconds = momentDuration.seconds();\n\n const QUARTER = opts.ascii ? ' 1/4' : '¼';\n const THIRD = opts.ascii ? ' 1/3' : '⅓';\n const HALF = opts.ascii ? ' 1/2' : '½';\n const TWO_THIRDS = opts.ascii ? ' 2/3' : '⅔';\n const THREE_QUARTERS = opts.ascii ? ' 3/4' : '¾';\n\n if (opts.condensed) {\n const formatted = {\n days: '',\n hours: '',\n minutes: '',\n seconds: '',\n };\n\n if (days + hours + minutes === 0) {\n // Less than a minute\n if (seconds > 0) {\n formatted.seconds = `${seconds}s`;\n } else {\n formatted.minutes = '0m';\n }\n } else {\n let roundedMinutes = seconds >= 30 ? minutes + 1 : minutes;\n let roundedHours = hours;\n let roundedDays = days;\n\n if (roundedMinutes >= 60) {\n roundedMinutes = roundedMinutes - 60;\n roundedHours++;\n }\n\n if (roundedHours >= 24) {\n roundedHours = roundedHours - 24;\n roundedDays++;\n }\n\n formatted.days = roundedDays !== 0 ? `${roundedDays}d ` : '';\n formatted.hours = roundedHours !== 0 ? `${roundedHours}h ` : '';\n formatted.minutes = roundedMinutes !== 0 ? `${roundedMinutes}m ` : '';\n }\n\n return `${formatted.days}${formatted.hours}${formatted.minutes}${formatted.seconds}`.trim();\n } else if (hours !== 0) {\n const suffix = (hours === 1) ? 'hr' : 'hrs';\n switch (minutes) {\n case 0:\n return `${hours} ${suffix}`;\n case 15:\n return `${hours}${QUARTER} ${suffix}`;\n case 20:\n return `${hours}${THIRD} ${suffix}`;\n case 30:\n return `${hours}${HALF} ${suffix}`;\n case 40:\n return `${hours}${TWO_THIRDS} ${suffix}`;\n case 45:\n return `${hours}${THREE_QUARTERS} ${suffix}`;\n default:\n return `${hours} ${suffix} ${minutes} min`;\n }\n } else {\n return `${minutes} min`;\n }\n}\n\n/**\n * formatLocalizedFromUTC\n * @param {String} utc - Zulu timestamp (Integer hammertime also OK)\n * @param {Object} timePrefs - object containing timezoneAware Boolean and timezoneName String\n * @param {String} [format] - optional moment display format string; default is 'dddd, MMMM D'\n *\n * @return {String} formatted datetime, e.g., 'Sunday, January 1'\n */\nexport function formatLocalizedFromUTC(utc, timePrefs, format = 'dddd, MMMM D') {\n if (utc instanceof Date) {\n throw new Error('`utc` must be a ISO-formatted String timestamp or integer hammertime!');\n }\n const timezone = getTimezoneFromTimePrefs(timePrefs);\n return moment.utc(utc).tz(timezone).format(format);\n}\n\n/**\n * getLocalizedCeiling\n * @param {String} utc - Zulu timestamp (Integer hammertime also OK)\n * @param {Object} timePrefs - object containing timezoneAware Boolean and timezoneName String\n * @param {String} period - the period to round the timestamp to the ceiling of\n *\n * @return {Object} a JavaScript Date, the start of the next closes period according timePrefs;\n * If period is 'day', this fn returns the closest future midnight\n * If period is 'hour', this fn returns the start of the closest future hour\n * if utc is already local midnight, returns utc\n */\nexport function getLocalizedCeiling(utc, timePrefs, period = 'day') {\n if (utc instanceof Date) {\n throw new Error('`utc` must be a ISO-formatted String timestamp or integer hammertime!');\n }\n if (!_.includes(['day', 'hour'], period)) {\n throw new Error('`period` must be either \"day\" or \"hour\"');\n }\n const timezone = getTimezoneFromTimePrefs(timePrefs);\n const startOfPeriod = moment.utc(utc)\n .tz(timezone)\n .startOf(period);\n\n const utcHammertime = (typeof utc === 'string') ? Date.parse(utc) : utc;\n if (startOfPeriod.valueOf() === utcHammertime) {\n return startOfPeriod.toDate();\n }\n return startOfPeriod.add(1, period).toDate();\n}\n\n/**\n * formatTimeAgo\n *\n * @param {String|Date} utc - A moment-compatible date object or string\n * @param {Object} timePrefs - object containing timezoneAware Boolean and timezoneName String\n * @param {String} format - Optional. The moment format string to use for dates beyond 30 days ago\n *\n * @return {Object} Object containing the formatted time ago string, and the calculated days ago as an integer\n */\nexport const formatTimeAgo = (utc, timePrefs, format = 'YYYY-MM-DD') => {\n const timezone = getTimezoneFromTimePrefs(timePrefs);\n const endOfToday = moment.utc(getLocalizedCeiling(new Date().toISOString(), timePrefs)).tz(timezone);\n const endOfProvidedDay = moment.utc(getLocalizedCeiling(utc, timePrefs)).tz(timezone);\n const daysAgo = endOfToday.diff(endOfProvidedDay, 'days', true);\n const minutesAgo = moment.utc().tz(timezone).diff(utc, 'minutes');\n const hoursAgo = moment.utc().tz(timezone).diff(utc, 'hours');\n const lastUploadDateMoment = moment.utc(utc).tz(timezone);\n let daysText = lastUploadDateMoment.format(format);\n\n if (daysAgo < 2) {\n daysText = (daysAgo >= 1) ? t('yesterday') : t('today');\n } else if (daysAgo <= 30) {\n daysText = t('{{days}} days ago', { days: Math.ceil(daysAgo) });\n }\n\n const hoursText = t('{{hoursAgo}} {{unit}} ago', { hoursAgo, unit: hoursAgo === 1 ? 'hour' : 'hours' });\n\n let minutesText = t('{{minutesAgo}} {{unit}} ago', { minutesAgo, unit: minutesAgo === 1 ? 'minute' : 'minutes' });\n if (minutesAgo < 1) minutesText = t('a few seconds ago');\n\n return {\n daysAgo,\n daysText,\n hoursAgo,\n hoursText,\n minutesAgo,\n minutesText,\n };\n};\n","import _ from 'lodash';\n\nimport {\n AUTOMATED_BASAL_DEVICE_MODELS,\n pumpVocabulary,\n settingsOverrides,\n} from './constants';\n\nimport { deviceName } from './settings/data';\n\n/**\n * Get the latest upload datum\n * @param {Array} uploadData Array of Tidepool upload data\n * @returns {Object} The latest upload datum\n */\nexport function getLatestPumpUpload(uploadData = []) {\n return _.findLast(uploadData, { deviceTags: ['insulin-pump'] });\n}\n\n/**\n * Get the latest manual basal schedule name from an array of basal data\n * @param {Array} basalData Array of Tidepool basal data\n * @returns {Object} The latest manual basal schedule name, else undefined\n */\nexport function getLastManualBasalSchedule(basalData = []) {\n const lastManualBasal = _.findLast(basalData, { deliveryType: 'scheduled' });\n return _.get(lastManualBasal, 'scheduleName');\n}\n\n/**\n * Check to see if datum is from DIY Loop\n */\nexport function isDIYLoop(datum = {}) {\n return (/^com\\.[a-zA-Z0-9]*\\.?loopkit\\.Loop/).test(_.get(datum, 'origin.name', datum?.client?.name || ''));\n}\n\n/**\n * Check to see if datum is from Tidepool Loop\n*/\nexport function isTidepoolLoop(datum = {}) {\n return (/^org\\.tidepool\\.[a-zA-Z0-9]*\\.?Loop/).test(_.get(datum, 'origin.name', datum?.client?.name || ''));\n}\n\n/**\n * Check to see if datum is from Twiist Loop\n*/\nexport function isTwiistLoop(datum = {}) {\n if (datum.type === 'upload') {\n const majorVersion = parseInt(_.get(datum, 'client.version', '0').split('.')[0], 10);\n return (/^com.sequelmedtech.tidepool-service/).test(_.get(datum, 'client.name', '')) && majorVersion >= 2;\n }\n return (/^com.dekaresearch.twiist/).test(_.get(datum, 'origin.name', datum?.client?.name || ''));\n}\n\n/**\n * Check to see if datum is from Control-IQ\n */\nexport function isControlIQ(datum = {}) {\n return _.get(datum, 'deviceId', '').indexOf('tandemCIQ') === 0;\n}\n\n/**\n * Check to see if datum is from LibreView API\n */\nexport function isLibreViewAPI(datum = {}) {\n const TARGET = 'org.tidepool.abbott.libreview.partner.api';\n return datum?.client?.name === TARGET || datum?.origin?.name === TARGET;\n}\n\n/**\n * Check to see if datum is from a known Loop device\n */\nexport function isLoop(datum = {}) {\n return datum.tags?.loop || isDIYLoop(datum) || isTidepoolLoop(datum) || isTwiistLoop(datum);\n}\n\n/**\n * Check if the provided datum was for an automated basal device\n * @param {String} manufacturer Manufacturer name\n * @param {Object} pumpSettingsOrUpload Tidepool pumpSettings or upload datum\n * @param {String} deviceModel Device model number\n * @returns {Boolean}\n */\nexport function isAutomatedBasalDevice(manufacturer, pumpSettingsOrUpload = {}, deviceModel) {\n return _.includes(_.get(AUTOMATED_BASAL_DEVICE_MODELS, deviceName(manufacturer), []), deviceModel)\n || (manufacturer === 'tandem' && isControlIQ(pumpSettingsOrUpload))\n || isLoop(pumpSettingsOrUpload);\n}\n\n/**\n * Check if the provided datum was for an automated bolus device\n * @param {String} manufacturer Manufacturer name\n * @param {Object} pumpSettingsOrUpload Tidepool pumpSettings or upload datum\n * @returns {Boolean}\n */\nexport function isAutomatedBolusDevice(manufacturer, pumpSettingsOrUpload = {}) {\n return (manufacturer === 'tandem' && isControlIQ(pumpSettingsOrUpload))\n || isDIYLoop(pumpSettingsOrUpload);\n}\n\n/**\n * Check if the provided datum was for a settings-overrideable device\n * @param {String} manufacturer Manufacturer name\n * @param {Object} pumpSettingsOrUpload Tidepool pumpSettings or upload datum\n * @returns {Boolean}\n */\nexport function isSettingsOverrideDevice(manufacturer, pumpSettingsOrUpload = {}) {\n return (manufacturer === 'tandem' && isControlIQ(pumpSettingsOrUpload))\n || isLoop(pumpSettingsOrUpload);\n}\n\n/**\n * Check if the provided datum was for a 1-minute CGM sample interval device\n * @param {Object} pumpSettingsOrUpload Tidepool pumpSettings or upload datum\n * @returns {Boolean}\n */\nexport function isOneMinCGMSampleIntervalDevice(pumpSettingsOrUpload = {}) {\n return isTwiistLoop(pumpSettingsOrUpload);\n}\n\n/**\n * Get the uppercased manufacturer name\n * @param {String} manufacturer Manufacturer name\n */\nexport function getUppercasedManufacturer(manufacturer = '') {\n return _.map(manufacturer.split(' '), part => {\n switch (part) {\n case 'diy':\n return _.upperCase(part);\n case 'twiist':\n return part;\n default:\n return _.upperFirst(part);\n }\n }).join(' ');\n}\n\n/**\n * Get a list of standard settings overrides for a settings-overrideable device,\n * with default fallbacks for missing keys\n * @param {String} manufacturer Manufacturer name\n * @returns {Array} settings overrides\n */\nexport function getSettingsOverrides(manufacturer) {\n return _.get(settingsOverrides, getUppercasedManufacturer(manufacturer), settingsOverrides.default);\n}\n\n/**\n * Get a pump terminology vocabulary, with default fallbacks for missing keys\n * @param {String} manufacturer Manufacturer name\n * @returns {Object} pump vocabulary\n */\nexport function getPumpVocabulary(manufacturer) {\n const vocabulary = _.cloneDeep(pumpVocabulary);\n return _.defaults(\n _.get(vocabulary, getUppercasedManufacturer(manufacturer), {}),\n vocabulary.default\n );\n}\n","/*\n * == BSD2 LICENSE ==\n * Copyright (c) 2016, Tidepool Project\n *\n * This program is free software; you can redistribute it and/or modify it under\n * the terms of the associated License, which is identical to the BSD 2-Clause\n * License as published by the Open Source Initiative at opensource.org.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n * FOR A PARTICULAR PURPOSE. See the License for more details.\n *\n * You should have received a copy of the License along with this program; if\n * not, you can obtain one from Tidepool Project at tidepool.org.\n * == BSD2 LICENSE ==\n */\n\n/*\n * Guidelines for these utilities:\n *\n * 1. Only \"workhorse\" functions used in 2+ places should be here.\n * 1a. A function used in multiple components for one view should live\n * in view-specific utils: src/utils/[view]/format.js\n * 1b. A function used in only one component should just be part of that component,\n * potentially as a named export if tests are deemed important to have.\n * 1c. This set of utilities is ONLY for NON-datetime related formatting. Any functions\n * used for formatting dates and/or times should go in src/utils/datetime.js\n *\n * 2. Function naming scheme: the main verb here is `format`. Start all function names with that.\n *\n * 3. Function organizational scheme in this file and tests file: alphabetical plz\n *\n * 4. Try to be consistent in how params are used:\n * (e.g., always pass in `bgPrefs`) rather than some (subset) of bgUnits and/or bgBounds\n * and try to copy & paste JSDoc @param descriptions for common params.\n *\n */\n\nimport _ from 'lodash';\nimport { format } from 'd3-format';\nimport { convertToMmolL } from './bloodglucose';\nimport { BG_HIGH, BG_LOW, MMOLL_UNITS } from './constants';\n\n/**\n * bankersRound\n *\n * Rounding with balanced tie-breaking to reduce upward bias in rounding by rounding the midway\n * point digit (x.5) to the nearest even number, rather than always upwards.\n * ref: https://stackoverflow.com/a/49080858\n *\n * Used as default rounding in AGP reports.\n *\n * @param {Number} value - numeric value to format\n * @param {Number} [precision] - optional number of decimal places to display;\n * if not provided, will display as integer (0 decimal places)\n *\n * @return {Number} numeric value rounded to the desired number of decimal places\n */\nexport function bankersRound(value, precision = 0) {\n /* eslint-disable no-nested-ternary */\n const x = value * (10 ** precision);\n const r = Math.round(x);\n const br = Math.abs(x) % 1 === 0.5 ? (r % 2 === 0 ? r : r - 1) : r;\n return br / (10 ** precision);\n /* eslint-enable no-nested-ternary */\n}\n\n/**\n * precisionRound\n *\n * Rounding numbers to desired precison.\n *\n * @param {Number} value - numeric value to format\n * @param {Number} [precision] - optional number of decimal places to display;\n * if not provided, will display as integer (0 decimal places)\n *\n * @return {Number} numeric value rounded to the desired number of decimal places\n */\nexport function precisionRound(value, precision = 0) {\n const shift = precision > 0 ? 10 ** precision : 1;\n return Math.round(value * shift) / shift;\n}\n\n/**\n * formatBgValue\n * @param {Number} val - integer or float blood glucose value in either mg/dL or mmol/L\n * @param {Object} bgPrefs - object containing bgUnits String and bgBounds Object\n * @param {Object} [outOfRangeThresholds] - optional thresholds for `low` and `high` values;\n * derived from annotations in PwD's data, so may not exist\n *\n * @return {String} formatted blood glucose value\n */\nexport function formatBgValue(val, bgPrefs, outOfRangeThresholds) {\n const units = _.get(bgPrefs, 'bgUnits', '');\n\n if (!_.isEmpty(outOfRangeThresholds)) {\n let lowThreshold = outOfRangeThresholds.low;\n let highThreshold = outOfRangeThresholds.high;\n\n if (units === MMOLL_UNITS) {\n if (lowThreshold) {\n lowThreshold = convertToMmolL(lowThreshold);\n }\n if (highThreshold) {\n highThreshold = convertToMmolL(highThreshold);\n }\n }\n if (lowThreshold && val < lowThreshold) {\n return BG_LOW;\n }\n if (highThreshold && val > highThreshold) {\n return BG_HIGH;\n }\n }\n\n if (units === MMOLL_UNITS) {\n return bankersRound(val, 1).toFixed(1);\n }\n\n return bankersRound(val).toString();\n}\n\n/**\n * formatDecimalNumber\n *\n * This (and all d3-format methods) is to format numbers for localized human display.\n * To use rounded results in calculations, use the `precisionRound` utility\n *\n * @param {Number} val - numeric value to format\n * @param {Number} [places] - optional number of decimal places to display;\n * if not provided, will display as integer (0 decimal places)\n *\n * @return {String} numeric value rounded to the desired number of decimal places\n */\nexport function formatDecimalNumber(val, places) {\n if (places === null || places === undefined) {\n return format('d')(val);\n }\n return format(`.${places}f`)(val);\n}\n\n/**\n * formatInsulin\n *\n * @export\n * @param {Number} val - numeric value to format\n * @returns {String} numeric value formatted for the precision of insulin dosing\n */\nexport function formatInsulin(val) {\n let decimalLength = 1;\n const qtyString = val.toString();\n if (qtyString.indexOf('.') !== -1) {\n const length = qtyString.split('.')[1].length;\n decimalLength = _.min([length, 3]);\n }\n return formatDecimalNumber(val, decimalLength);\n}\n\n/**\n * formatPercentage\n * @param {Number} val - raw decimal proportion, range of 0.0 to 1.0\n *\n * @return {String} percentage\n */\nexport function formatPercentage(val, precision = 0, useAGPFormat) {\n if (Number.isNaN(val)) {\n return '--%';\n }\n return useAGPFormat\n ? `${bankersRound(val * 100, precision)}%`\n : format(`.${precision}%`)(val);\n}\n\n/**\n * formatStatsPercentage\n * @param {Number} val - raw decimal proportion, range of 0.0 to 1.0\n *\n * @return {String} percentage\n */\nexport function formatStatsPercentage(value) {\n if (Number.isNaN(value)) return '--';\n\n const percentage = value * 100;\n\n // Round to one decimal place if below 1, and zero decimal places if above 1;\n const precision = percentage >= 1 ? 0 : 1;\n const roundedValue = bankersRound(percentage, precision);\n\n return _.toString(roundedValue);\n}\n\n/**\n * removeTrailingZeroes\n * @param {String} - formatted decimal value, may have trailing zeroes\n *\n * @return {String} - formatted decimal value w/o trailing zero-indexes\n */\nexport function removeTrailingZeroes(val) {\n return val.replace(/\\.0+$/, '');\n}\n","import { GLYCEMIC_RANGES_PRESET, GLYCEMIC_RANGES_TYPE } from './constants';\n\n/**\n * Extracts the glycemic ranges preset value from the glycemicRanges object of the\n * clinicPatient record\n *\n * @param {Object} glycemicRanges the glycemicRanges object of the clinicPatient record\n *\n * @return {String} target range preset, e.g. 'adaStandard', 'adaPregnancyType1', etc\n */\nexport const getGlycemicRangesPreset = glycemicRanges => {\n // glycemicRanges field will not exist on older clinicPatient records\n if (!glycemicRanges) return GLYCEMIC_RANGES_PRESET.ADA_STANDARD;\n\n switch (glycemicRanges.type) {\n case GLYCEMIC_RANGES_TYPE.PRESET:\n return glycemicRanges.preset;\n case GLYCEMIC_RANGES_TYPE.CUSTOM:\n // feature to be implemented in future revisions\n default: // eslint-disable-line no-fallthrough\n return GLYCEMIC_RANGES_PRESET.ADA_STANDARD;\n }\n};\n","/*\n * == BSD2 LICENSE ==\n * Copyright (c) 2016, Tidepool Project\n *\n * This program is free software; you can redistribute it and/or modify it under\n * the terms of the associated License, which is identical to the BSD 2-Clause\n * License as published by the Open Source Initiative at opensource.org.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n * FOR A PARTICULAR PURPOSE. See the License for more details.\n *\n * You should have received a copy of the License along with this program; if\n * not, you can obtain one from Tidepool Project at tidepool.org.\n * == BSD2 LICENSE ==\n */\n\nimport _ from 'lodash';\nimport i18next from 'i18next';\n\nimport * as datetime from '../datetime';\nimport * as format from '../format';\nimport { getPumpVocabulary, isControlIQ, isLoop } from '../device';\n\nimport {\n MAX_BOLUS,\n MAX_BASAL,\n INSULIN_DURATION,\n PHYSICAL_ACTIVITY,\n PREPRANDIAL,\n} from '../../utils/constants';\n\nconst t = i18next.t.bind(i18next);\nconst BASAL_RATE_PRECISION_PLACES = 3;\nconst MAX_BASAL_RATE_PRECISION_PLACES = 2;\n\n/**\n * noData\n * @param {ANY} val value to check\n *\n * @return {Boolean} true if value is defined, not null, not empty string, false otherwise\n */\nexport function noData(val) {\n return val == null || (typeof val === 'string' && _.isEmpty(val));\n}\n\n/**\n * deviceName\n * @param {String} manufacturer one of: animas, insulet, medtronic, tandem, microtech, loop\n *\n * @return {String} name for given manufacturer\n */\nexport function deviceName(manufacturer) {\n const DEVICE_DISPLAY_NAME_BY_MANUFACTURER = {\n animas: 'Animas',\n insulet: 'OmniPod',\n medtronic: 'Medtronic',\n tandem: 'Tandem',\n microtech: 'Equil',\n 'diy loop': 'DIY Loop',\n 'tidepool loop': 'Tidepool Loop',\n twiist: 'twiist',\n };\n return DEVICE_DISPLAY_NAME_BY_MANUFACTURER[manufacturer] || manufacturer;\n}\n\n/**\n * getBasalRate\n * @private\n * @param {Array} scheduleData basal schedule\n * @param {Number} startTime milliseconds from start of day\n * @return {String} formatted basal rate\n */\nfunction getBasalRate(scheduleData, startTime) {\n const rate = _.find(scheduleData, (schedule) =>\n schedule.start === startTime\n ).rate;\n\n if (noData(rate)) {\n return '';\n }\n return format.formatDecimalNumber(rate, BASAL_RATE_PRECISION_PLACES);\n}\n\n/**\n * getValue\n * @private\n * @param {Array} scheduleData scheduleData\n * @param {String} fieldName field to search for\n * @param {Number} startTime milliseconds from start of day\n *\n * @return {String} value of field for startTime\n */\nfunction getValue(scheduleData, fieldName, startTime) {\n const val = _.find(scheduleData, (schedule) =>\n schedule.start === startTime\n )[fieldName];\n\n if (noData(val)) {\n return '';\n }\n return val;\n}\n\n/**\n * getBloodGlucoseValue\n * @private\n * @param {Array} scheduleData scheduleData\n * @param {String} fieldName field to search format\n * @param {Number} startTime milliseconds from start of day\n * @param {String} units MGDL_UNITS or MMOLL_UNITS\n *\n * @return {String} formatted blood glucose value\n */\nfunction getBloodGlucoseValue(scheduleData, fieldName, startTime, units) {\n const bgValue = getValue(scheduleData, fieldName, startTime);\n if (noData(bgValue)) {\n return '';\n }\n return format.formatBgValue(bgValue, { bgUnits: units });\n}\n\n/**\n * getStarts\n * @private\n * @param {Array} timedData array with time based data\n *\n * @return {Array} array of start times in milliseconds\n */\nfunction getStarts(timedData) {\n return _.map(timedData, 'start');\n}\n\n/**\n * getTotalBasalRates\n * @param {Array} scheduleData basal schedule data\n *\n * @return {String} formatted total of basal rates\n */\nexport function getTotalBasalRates(scheduleData) {\n const HOUR_IN_MILLISECONDS = 60 * 60 * 1000;\n const DAY_IN_MILLISECONDS = 86400000;\n\n let total = 0;\n for (let i = scheduleData.length - 1; i >= 0; i--) {\n const start = scheduleData[i].start;\n let finish = DAY_IN_MILLISECONDS;\n const next = i + 1;\n if (next < scheduleData.length) {\n finish = scheduleData[next].start;\n }\n const hrs = (finish - start) / HOUR_IN_MILLISECONDS;\n const amount = parseFloat(scheduleData[i].rate.toFixed(BASAL_RATE_PRECISION_PLACES)) * hrs;\n total += parseFloat(amount.toFixed(BASAL_RATE_PRECISION_PLACES));\n }\n return format.formatDecimalNumber(total, BASAL_RATE_PRECISION_PLACES);\n}\n\n/**\n * getScheduleLabel\n * @param {String} scheduleName basal schedule name\n * @param {String} activeName name of active basal schedule at time of upload\n * @param {String} deviceKey one of: animas, carelink, insulet, medtronic, tandem, microtech, tidepool loop, diy loop, twiist\n * @param {Boolean} noUnits whether units should be included in label object\n *\n * @return {Object} object representing basal schedule label\n */\nexport function getScheduleLabel(scheduleName, activeName, deviceKey, noUnits) {\n const CAPITALIZED = ['carelink', 'medtronic'];\n let displayName = scheduleName;\n if (_.includes(CAPITALIZED, deviceKey)) {\n displayName = _.map(scheduleName.split(' '), (part) => (_.upperFirst(part))).join(' ');\n }\n return {\n main: displayName,\n secondary: scheduleName === activeName ? 'Active at upload' : '',\n units: noUnits ? '' : 'U/hr',\n };\n}\n\n/**\n * getScheduleNames\n * @param {Object} settingsData object with basal schedule properties\n *\n * @return {Array} array of basal schedule names\n */\nexport function getScheduleNames(settingsData) {\n return _.keysIn(settingsData);\n}\n\n/**\n * getTimedSchedules\n * @param {Array} settingsData array of basal schedules\n *\n * @return {Array} array of {name, position} basal objects\n */\nexport function getTimedSchedules(settingsData) {\n const names = _.map(settingsData, 'name');\n const schedules = [];\n for (let i = names.length - 1; i >= 0; i--) {\n schedules.push({ name: names[i], position: i });\n }\n return schedules;\n}\n\n/**\n * getDeviceMeta\n * @param {Object} settingsData all settings data\n * @param {Object} timePrefs timezone preferences object\n *\n * @return {Object} filtered meta data\n */\nexport function getDeviceMeta(settingsData = {}, timePrefs) {\n const utc = settingsData.normalTime;\n const uploadedTime = utc ?\n datetime.formatLocalizedFromUTC(utc, timePrefs, 'MMM D, YYYY') :\n false;\n return {\n schedule: settingsData.activeSchedule || 'unknown',\n uploaded: uploadedTime || 'unknown',\n serial: settingsData.deviceSerialNumber || 'unknown',\n };\n}\n\n/**\n * processBasalRateData\n * @param {Object} scheduleData basal schedule object\n *\n * @return {Array} array of formatted schedule entries\n */\nexport function processBasalRateData(scheduleData) {\n const starts = getStarts(scheduleData.value);\n const noRateData = [{ start: '-', rate: '-' }];\n\n if (starts.length === 0) {\n return noRateData;\n } else if (starts.length === 1) {\n if (Number(getBasalRate(scheduleData.value, starts[0])) === 0) {\n return noRateData;\n }\n }\n\n const data = _.map(starts, (startTime) => ({\n start: datetime.formatClocktimeFromMsPer24(\n startTime\n ),\n rate: getBasalRate(\n scheduleData.value,\n startTime\n ),\n }));\n\n data.push({\n start: 'Total',\n rate: getTotalBasalRates(scheduleData.value),\n });\n return data;\n}\n\n/**\n * processBgTargetData\n * @param {Array} targetsData array of blood glucose targets\n * @param {String} bgUnits MGDL_UNITS or MMOLL_UNITS\n * @param {Object} keys key names as {columnTwo, columnThree}\n *\n * @return {Array} formatted bloog glucose target data\n */\nexport function processBgTargetData(targetsData, bgUnits, keys) {\n return _.map(getStarts(targetsData), (startTime) => ({\n start: datetime.formatClocktimeFromMsPer24(\n startTime\n ),\n columnTwo: getBloodGlucoseValue(\n targetsData,\n keys.columnTwo,\n startTime,\n bgUnits\n ),\n columnThree: getBloodGlucoseValue(\n targetsData,\n keys.columnThree,\n startTime,\n bgUnits\n ),\n }));\n}\n\n/**\n * processCarbRatioData\n * @param {Array} carbRatioData array of carb ratio data\n *\n * @return {Array} array of formatted carb ratio objects\n */\nexport function processCarbRatioData(carbRatioData) {\n return _.map(getStarts(carbRatioData), (startTime) => ({\n start: datetime.formatClocktimeFromMsPer24(\n startTime\n ),\n amount: getValue(\n carbRatioData,\n 'amount',\n startTime\n ),\n }));\n}\n\n/**\n * processSensitivityData\n * @param {Array} sensitivityData array of sensitivity data\n * @param {String} bgUnits MGDL_UNITS or MMOLL_UNITS\n *\n * @return {Array} array of formatted sensitivity objects\n */\nexport function processSensitivityData(sensitivityData, bgUnits) {\n return _.map(getStarts(sensitivityData), (startTime) => ({\n start: datetime.formatClocktimeFromMsPer24(\n startTime\n ),\n amount: getBloodGlucoseValue(\n sensitivityData,\n 'amount',\n startTime,\n bgUnits\n ),\n }));\n}\n\n/**\n * processTimedSettings\n * @param {Object} pumpSettings entire pump settings object\n * @param {Object} schedule {name, position} schedule object\n * @param {String} bgUnits MGDL_UNITS or MMOLL_UNITS\n *\n * @return {Array} array of formatted objects with\n * {start, rate, bgTarget, carbRatio, insulinSensitivity}\n */\nexport function processTimedSettings(pumpSettings, schedule, bgUnits) {\n const data = _.map(getStarts(pumpSettings.bgTargets[schedule.name]), (startTime) => ({\n start: datetime.formatClocktimeFromMsPer24(\n startTime\n ),\n rate: getBasalRate(\n pumpSettings.basalSchedules[schedule.position].value,\n startTime\n ),\n bgTarget: getBloodGlucoseValue(\n pumpSettings.bgTargets[schedule.name],\n 'target',\n startTime,\n bgUnits\n ),\n carbRatio: getValue(\n pumpSettings.carbRatios[schedule.name],\n 'amount',\n startTime\n ),\n insulinSensitivity: getBloodGlucoseValue(\n pumpSettings.insulinSensitivities[schedule.name],\n 'amount',\n startTime,\n bgUnits\n ),\n }));\n\n data.push({\n start: 'Total',\n rate: getTotalBasalRates(\n pumpSettings.basalSchedules[schedule.position].value\n ),\n bgTarget: '',\n carbRatio: '',\n insulinSensitivity: '',\n });\n return data;\n}\n\n/**\n * startTimeAndValue\n * @param {TYPE} accessor key for value displayed in this column\n *\n * @return {Array} array of objects describing table columns\n */\nexport function startTimeAndValue(valueKey) {\n return [\n { key: 'start', label: 'Start time' },\n { key: valueKey, label: 'Value' },\n ];\n}\n\n/**\n * insulinSettings\n *\n * @param {Object} settings object with pump settings data\n * @param {String} manufacturer one of: animas, carelink, insulet, medtronic, tandem, microtech, tidepool loop, diy loop, twiist\n * @param {String} [scheduleName] name of schedule for tandem settings\n */\nexport function insulinSettings(settings, manufacturer, scheduleName) {\n const bgUnits = settings?.units?.bg;\n const deviceLabels = getPumpVocabulary(manufacturer);\n const maxBasal = _.get(settings, scheduleName ? `basal[${scheduleName}].rateMaximum.value` : 'basal.rateMaximum.value');\n const maxBolus = _.get(settings, scheduleName ? `bolus[${scheduleName}].amountMaximum.value` : 'bolus.amountMaximum.value');\n let insulinDurationUnits = _.get(settings, scheduleName ? `bolus[${scheduleName}].calculator.insulin.units` : 'bolus.calculator.insulin.units');\n let insulinDuration = _.get(settings, scheduleName ? `bolus[${scheduleName}].calculator.insulin.duration` : 'bolus.calculator.insulin.duration');\n\n if (_.includes(['diy loop', 'tidepool loop', 'twiist'], manufacturer)) {\n insulinDuration = _.get(settings, 'insulinModel.actionDuration');\n insulinDurationUnits = 'milliseconds';\n }\n\n const columns = [\n { key: 'setting' },\n { key: 'value' },\n ];\n\n if (insulinDurationUnits === 'minutes') {\n const durationInHours = Math.floor(insulinDuration / 60);\n const minutesRemainder = insulinDuration % 60;\n\n insulinDuration = (minutesRemainder > 0)\n ? `${durationInHours}:${_.padStart(minutesRemainder, 2, '0')}`\n : durationInHours;\n }\n\n if (insulinDurationUnits === 'milliseconds') {\n const durationInHours = Math.floor(insulinDuration / 60 / 60);\n const minutesRemainder = insulinDuration % 60;\n\n insulinDuration = (minutesRemainder > 0)\n ? `${durationInHours}:${_.padStart(minutesRemainder, 2, '0')}`\n : durationInHours;\n }\n\n const rows = [\n { setting: deviceLabels[MAX_BASAL], value: maxBasal ? `${format.formatDecimalNumber(maxBasal, MAX_BASAL_RATE_PRECISION_PLACES)} U/hr` : '-' },\n { setting: deviceLabels[MAX_BOLUS], value: maxBolus ? `${maxBolus} U` : '-' },\n { setting: deviceLabels[INSULIN_DURATION] + (isControlIQ(settings) ? '*' : ''), value: insulinDuration ? `${insulinDuration} hrs` : '-' },\n ];\n\n if (isLoop(settings)) {\n const insulinModelLabels = {\n rapidAdult: t('Rapid-Acting - Adults'),\n rapidChild: t('Rapid Acting - Children'),\n fiasp: t('Fiasp'),\n lyumjev: t('Lyumjev'),\n afrezza: t('Afrezza'),\n };\n\n const insulinModel = {\n label: insulinModelLabels[settings?.insulinModel?.modelType] || settings?.insulinModel?.modelType || t('Unknown'),\n peakMinutes: _.isFinite(settings?.insulinModel?.actionPeakOffset) ? settings.insulinModel.actionPeakOffset / 60 : null,\n };\n\n const device = deviceName(manufacturer);\n\n const insulinModelAnnotations = [\n t('{{device}} assumes that the insulin it has delivered is actively working to lower your glucose for 6 hours. This setting cannot be changed.', { device }),\n ];\n\n if (insulinModel.peakMinutes) insulinModelAnnotations.push(t('The {{label}} model assumes peak activity at {{peakMinutes}} minutes.', insulinModel));\n\n rows.unshift({\n annotations: [t('{{device}} will deliver basal and recommend bolus insulin only if your glucose is predicted to be above this limit for the next three hours.', { device })],\n setting: t('Glucose Safety Limit'),\n value: `${format.formatBgValue(settings?.bgSafetyLimit, { bgUnits })} ${bgUnits}`,\n });\n\n rows.splice(3, 1, {\n annotations: insulinModelAnnotations,\n setting: t('Insulin Model'),\n value: insulinModel.label,\n });\n }\n\n // Tandem insulin settings do not have max basal\n if (manufacturer === 'tandem') rows.shift();\n\n return {\n columns,\n rows,\n };\n}\n\n/**\n * presetSettings\n *\n * @param {Object} settings object with pump settings data\n * @param {String} manufacturer one of: tidepool loop, diy loop, twiist\n */\nexport function presetSettings(settings, manufacturer) {\n const deviceLabels = getPumpVocabulary(manufacturer);\n const bgUnits = settings?.units?.bg;\n const correctionRange = range => `${format.formatBgValue(range?.low, { bgUnits })}-${format.formatBgValue(range?.high, { bgUnits })}`;\n\n const columns = [\n { key: 'name', label: 'Name' },\n { key: 'value', label: `${t('Correction Range')} (${bgUnits})` },\n ];\n\n const rows = [];\n if (settings?.bgTargetPreprandial) rows.push({ name: deviceLabels[PREPRANDIAL]?.label, value: correctionRange(settings?.bgTargetPreprandial) });\n if (settings?.bgTargetPhysicalActivity) rows.push({ name: deviceLabels[PHYSICAL_ACTIVITY]?.label, value: correctionRange(settings?.bgTargetPhysicalActivity) });\n\n return {\n columns,\n rows,\n };\n}\n","import _ from 'lodash';\nimport React from 'react';\nimport i18next from 'i18next';\n\nimport {\n generateBgRangeLabels,\n classifyBgValue,\n classifyCvValue,\n reshapeBgClassesToBgBounds,\n} from './bloodglucose';\n\nimport {\n AUTOMATED_DELIVERY,\n BG_COLORS,\n LBS_PER_KG,\n MS_IN_DAY,\n SCHEDULED_DELIVERY,\n SETTINGS_OVERRIDE,\n} from './constants';\n\nimport { getPumpVocabulary, getSettingsOverrides } from './device';\nimport { bankersRound, formatDecimalNumber, formatBgValue, formatStatsPercentage } from './format';\nimport { formatDuration } from './datetime';\n\nconst t = i18next.t.bind(i18next);\n\nif (_.get(i18next, 'options.returnEmptyString') === undefined) {\n // Return key if no translation is present\n i18next.init({ returnEmptyString: false, nsSeparator: '|' });\n}\n\nexport const dailyDoseUnitOptions = [\n {\n label: 'kg',\n value: 'kg',\n },\n {\n label: 'lb',\n value: 'lb',\n },\n];\n\nexport const statTypes = {\n barHorizontal: 'barHorizontal',\n barBg: 'barBg',\n input: 'input',\n simple: 'simple',\n};\n\nexport const statBgSourceLabels = {\n cbg: t('CGM'),\n smbg: t('BGM'),\n};\n\nexport const statFormats = {\n bgCount: 'bgCount',\n bgRange: 'bgRange',\n bgValue: 'bgValue',\n cv: 'cv',\n carbs: 'carbs',\n duration: 'duration',\n gmi: 'gmi',\n percentage: 'percentage',\n standardDevRange: 'standardDevRange',\n standardDevValue: 'standardDevValue',\n units: 'units',\n unitsPerKg: 'unitsPerKg',\n};\n\nexport const commonStats = {\n averageGlucose: 'averageGlucose',\n averageDailyDose: 'averageDailyDose',\n bgExtents: 'bgExtents',\n carbs: 'carbs',\n coefficientOfVariation: 'coefficientOfVariation',\n glucoseManagementIndicator: 'glucoseManagementIndicator',\n readingsInRange: 'readingsInRange',\n sensorUsage: 'sensorUsage',\n standardDev: 'standardDev',\n timeInAuto: 'timeInAuto',\n timeInOverride: 'timeInOverride',\n timeInRange: 'timeInRange',\n totalInsulin: 'totalInsulin',\n};\n\nexport const statFetchMethods = {\n [commonStats.averageGlucose]: 'getAverageGlucoseData',\n [commonStats.averageDailyDose]: 'getTotalInsulinData',\n [commonStats.bgExtents]: 'getBgExtentsData',\n [commonStats.carbs]: 'getCarbsData',\n [commonStats.coefficientOfVariation]: 'getCoefficientOfVariationData',\n [commonStats.glucoseManagementIndicator]: 'getGlucoseManagementIndicatorData',\n [commonStats.readingsInRange]: 'getReadingsInRangeData',\n [commonStats.sensorUsage]: 'getSensorUsage',\n [commonStats.standardDev]: 'getStandardDevData',\n [commonStats.timeInAuto]: 'getTimeInAutoData',\n [commonStats.timeInOverride]: 'getTimeInOverrideData',\n [commonStats.timeInRange]: 'getTimeInRangeData',\n [commonStats.totalInsulin]: 'getBasalBolusData',\n};\n\nexport const getSum = data => _.sum(_.map(data, d => _.max([d.value, 0])));\n\nexport const ensureNumeric = value => (_.isNil(value) || _.isNaN(value) ? -1 : parseFloat(value));\n\nexport const isRangeDefined = value => ensureNumeric(value) > -1;\n\nexport const formatDatum = (datum = {}, format, opts = {}) => {\n let id = datum.id;\n let value = _.isFinite(datum) ? datum : datum.value;\n let suffix = datum.suffix || '';\n let deviation;\n let lowerValue;\n let lowerColorId;\n let upperValue;\n let upperColorId;\n\n const {\n bgPrefs,\n data,\n useAGPFormat,\n emptyDataPlaceholder = '--',\n forcePlainTextValues = false,\n } = opts;\n\n const total = _.get(data, 'total.value');\n\n const disableStat = () => {\n id = 'statDisabled';\n value = emptyDataPlaceholder;\n };\n\n switch (format) {\n case statFormats.bgCount:\n if (value >= 0) {\n const precision = value < 0.05 ? 2 : 1;\n // Note: the + converts the rounded, fixed string back to a number\n // This allows 2.67777777 to render as 2.7 and 3.0000001 to render as 3 (not 3.0)\n value = +value.toFixed(precision);\n } else {\n disableStat();\n }\n break;\n\n case statFormats.bgRange:\n value = generateBgRangeLabels(bgPrefs, { condensed: true })[id];\n break;\n\n case statFormats.bgValue:\n if (value >= 0) {\n id = classifyBgValue(_.get(bgPrefs, 'bgBounds'), bgPrefs?.bgUnits, value, 'threeWay');\n value = formatBgValue(value, bgPrefs);\n } else {\n disableStat();\n }\n break;\n\n case statFormats.carbs:\n if (_.isPlainObject(value) && (value.grams > 0 || value.exchanges > 0)) {\n const { grams, exchanges } = value;\n value = [];\n suffix = [];\n if (grams > 0) {\n value.push(formatDecimalNumber(grams));\n suffix.push('g');\n }\n if (exchanges > 0) {\n // Note: the + converts the rounded, fixed string back to a number\n // This allows 2.67777777 to render as 2.7 and 3.0000001 to render as 3 (not 3.0)\n value.push(+formatDecimalNumber(exchanges, 1));\n suffix.push('exch');\n }\n } else {\n disableStat();\n }\n break;\n\n case statFormats.cv:\n if (value >= 0) {\n id = classifyCvValue(value);\n value = useAGPFormat\n ? bankersRound(value, 1).toString()\n : formatDecimalNumber(value);\n suffix = '%';\n } else {\n disableStat();\n }\n break;\n\n case statFormats.duration:\n if (value >= 0) {\n value = formatDuration(value, { condensed: true });\n } else {\n disableStat();\n }\n break;\n\n case statFormats.gmi:\n if (value >= 0) {\n value = useAGPFormat\n ? bankersRound(value, 1).toString()\n : formatDecimalNumber(value, 1);\n suffix = '%';\n } else {\n disableStat();\n }\n break;\n\n case statFormats.percentage:\n if (total && total >= 0) {\n value = _.max([value, 0]);\n value = formatStatsPercentage(value / total);\n suffix = '%';\n } else {\n disableStat();\n }\n break;\n\n case statFormats.standardDevRange:\n deviation = _.get(datum, 'deviation.value', -1);\n if (value >= 0 && deviation >= 0) {\n lowerValue = value - deviation;\n lowerColorId = lowerValue >= 0\n ? classifyBgValue(_.get(bgPrefs, 'bgBounds'), bgPrefs?.bgUnits, lowerValue, 'threeWay')\n : 'low';\n\n upperValue = value + deviation;\n upperColorId = classifyBgValue(_.get(bgPrefs, 'bgBounds'), bgPrefs?.bgUnits, upperValue, 'threeWay');\n\n lowerValue = formatBgValue(lowerValue, bgPrefs);\n upperValue = formatBgValue(upperValue, bgPrefs);\n\n value = !forcePlainTextValues ? (\n <span>\n <span style={{\n color: BG_COLORS[lowerColorId],\n }}>\n {lowerValue}\n </span>\n - \n <span style={{\n color: BG_COLORS[upperColorId],\n }}>\n {upperValue}\n </span>\n </span>\n ) : `${lowerValue}-${upperValue}`;\n } else {\n disableStat();\n }\n break;\n\n case statFormats.standardDevValue:\n if (value >= 0) {\n value = formatBgValue(value, bgPrefs);\n } else {\n disableStat();\n }\n break;\n\n case statFormats.units:\n if (value >= 0) {\n value = formatDecimalNumber(value, 1);\n suffix = 'U';\n } else {\n disableStat();\n }\n break;\n\n case statFormats.unitsPerKg:\n if (suffix === 'lb') {\n value = value * LBS_PER_KG;\n }\n suffix = 'U/kg';\n if (value > 0 && _.isFinite(value)) {\n value = formatDecimalNumber(value, 2);\n } else {\n disableStat();\n }\n break;\n\n default:\n break;\n }\n\n return {\n id,\n value,\n suffix,\n };\n};\n\nexport const getStatAnnotations = (data, type, opts = {}) => {\n const { bgSource, days, manufacturer } = opts;\n const vocabulary = getPumpVocabulary(manufacturer);\n const labels = { overrideLabel: vocabulary[SETTINGS_OVERRIDE], overrideLabelLowerCase: _.lowerCase(vocabulary[SETTINGS_OVERRIDE]) };\n\n const annotations = [];\n\n const bgStats = [\n commonStats.averageGlucose,\n commonStats.coefficientOfVariation,\n commonStats.glucoseManagementIndicator,\n commonStats.readingsInRange,\n commonStats.timeInRange,\n commonStats.standardDev,\n ];\n\n switch (type) {\n case commonStats.averageGlucose:\n annotations.push(t('**Avg. Glucose ({{bgSourceLabel}}):** All {{bgSourceLabel}} glucose values added together, divided by the number of readings.', { bgSourceLabel: statBgSourceLabels[bgSource] }));\n break;\n\n case commonStats.averageDailyDose:\n if (days > 1) {\n annotations.push(t('**Avg. Daily Insulin:** All basal and bolus insulin delivery (in Units) added together, divided by the number of days in this view for which we have insulin data.'));\n } else {\n annotations.push(t('**Daily Insulin:** All basal and bolus insulin delivery (in Units) added together.'));\n }\n break;\n\n case commonStats.carbs:\n if (days > 1) {\n annotations.push(t('**Avg. Daily Carbs**: All carb entries added together, then divided by the number of days in this view for which we have carb data. Note, these entries come from either bolus wizard events, or Apple Health records.'));\n } else {\n annotations.push(t('**Total Carbs**: All carb entries from bolus wizard events or Apple Health records added together.'));\n }\n annotations.push(t('Derived from _**{{total}}**_ carb entries.', { total: data.total }));\n break;\n\n case commonStats.coefficientOfVariation:\n annotations.push(t('**CV (Coefficient of Variation):** How far apart (wide) glucose values are; research suggests a target of 36% or lower.'));\n break;\n\n case commonStats.glucoseManagementIndicator:\n annotations.push(t('**GMI (Glucose Management Indicator):** Tells you what your approximate A1C level is likely to be, based on the average glucose level from your CGM readings.'));\n break;\n\n case commonStats.readingsInRange:\n annotations.push(t('**Readings In Range:** Daily average of the number of {{smbgLabel}} readings.', { smbgLabel: statBgSourceLabels.smbg }));\n break;\n\n case commonStats.sensorUsage:\n annotations.push(t('**Sensor Usage:** Time the {{cbgLabel}} collected data, divided by the total time represented in this view.', { cbgLabel: statBgSourceLabels.cbg }));\n break;\n\n case commonStats.standardDev:\n annotations.push(t('**SD (Standard Deviation):** How far values are from the average.'));\n break;\n\n case commonStats.timeInAuto:\n if (days > 1) {\n annotations.push(t('**Time In {{automatedLabel}}:** Daily average of the time spent in automated basal delivery.', { automatedLabel: vocabulary[AUTOMATED_DELIVERY] }));\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the duration in {{automatedLabel}} divided by the total duration of basals for this time period.\\n\\n**(time)** is 24 hours multiplied by % in {{automatedLabel}}.', { automatedLabel: vocabulary[AUTOMATED_DELIVERY] }));\n } else {\n annotations.push(t('**Time In {{automatedLabel}}:** Time spent in automated basal delivery.', { automatedLabel: vocabulary[AUTOMATED_DELIVERY] }));\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the duration in {{automatedLabel}} divided by the total duration of basals for this time period.\\n\\n**(time)** is total duration of time in {{automatedLabel}}.', { automatedLabel: vocabulary[AUTOMATED_DELIVERY] }));\n }\n break;\n\n case commonStats.timeInOverride:\n if (days > 1) {\n annotations.push(t('**Time In {{overrideLabel}}:** Daily average of the time spent in {{overrideLabelLowerCase}}.', labels));\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the duration in {{overrideLabelLowerCase}} divided by the total duration for this time period.\\n\\n**(time)** is 24 hours multiplied by % in {{overrideLabelLowerCase}}.', labels));\n } else {\n annotations.push(t('**Time In {{overrideLabel}}:** Time spent in {{overrideLabelLowerCase}}.', labels));\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the duration in {{overrideLabelLowerCase}} divided by the total duration for this time period.\\n\\n**(time)** is total duration of time in {{overrideLabelLowerCase}}.', labels));\n }\n break;\n\n case commonStats.timeInRange:\n if (days > 1) {\n annotations.push(t('**Time In Range:** Daily average of the time spent in range, based on {{cbgLabel}} readings.', { cbgLabel: statBgSourceLabels.cbg }));\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the number of readings in range divided by all readings for this time period.\\n\\n**(time)** is 24 hours multiplied by % in range.'));\n } else {\n annotations.push(t('**Time In Range:** Time spent in range, based on {{cbgLabel}} readings.', { cbgLabel: statBgSourceLabels.cbg }));\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the number of readings in range divided by all readings for this time period.\\n\\n**(time)** is number of readings in range multiplied by the {{cbgLabel}} sample frequency.', { cbgLabel: statBgSourceLabels.cbg }));\n }\n break;\n\n case commonStats.totalInsulin:\n if (days > 1) {\n annotations.push(t('**Total Insulin:** All basal and bolus insulin delivery (in Units) added together, divided by the number of days in this view for which we have insulin data'));\n } else {\n annotations.push(t('**Total Insulin:** All basal and bolus insulin delivery (in Units) added together'));\n }\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the respective total of basal or bolus delivery divided by total insulin delivered for the time period for which we have insulin data.'));\n break;\n\n default:\n break;\n }\n\n if (data.insufficientData) {\n annotations.push(t('**Why is this stat empty?**\\n\\nThere is not enough data present in this view to calculate it.'));\n } else if (_.includes(bgStats, type)) {\n if (bgSource === 'smbg') {\n annotations.push(t('Derived from _**{{total}}**_ {{smbgLabel}} readings.', { total: _.get(data, 'counts.total', data.total), smbgLabel: statBgSourceLabels.smbg }));\n }\n }\n\n return annotations;\n};\n\nexport const getStatData = (data, type, opts = {}) => {\n const vocabulary = getPumpVocabulary(opts.manufacturer);\n const settingsOverrides = getSettingsOverrides(opts.manufacturer);\n const bgRanges = generateBgRangeLabels(opts.bgPrefs, { condensed: true });\n\n let statData = {\n raw: {\n days: opts.days,\n ...data,\n },\n };\n\n const readingsInRangeDataPath = opts.days > 1 ? 'dailyAverages' : 'counts';\n\n switch (type) {\n case commonStats.averageGlucose:\n statData.data = [\n {\n value: ensureNumeric(data.averageGlucose),\n },\n ];\n\n statData.dataPaths = {\n summary: 'data.0',\n };\n break;\n\n case commonStats.averageDailyDose:\n statData.data = [\n {\n id: 'insulin',\n input: {\n id: 'weight',\n label: 'Weight',\n suffix: {\n id: 'units',\n options: dailyDoseUnitOptions,\n value: opts.suffixValue || dailyDoseUnitOptions[0],\n },\n type: 'number',\n value: opts.inputValue ? ensureNumeric(opts.inputValue) : undefined,\n },\n output: {\n label: 'Daily Dose ÷ Weight',\n type: 'divisor',\n dataPaths: {\n dividend: 'data.0',\n },\n },\n value: ensureNumeric(data.totalInsulin),\n },\n ];\n\n statData.dataPaths = {\n input: 'data.0.input',\n output: 'data.0.output',\n summary: 'data.0',\n };\n break;\n\n case commonStats.bgExtents:\n statData.data = [\n {\n id: 'bgMax',\n value: ensureNumeric(data.bgMax),\n title: t('Max BG'),\n },\n {\n id: 'bgMin',\n value: ensureNumeric(data.bgMin),\n title: t('Min BG'),\n },\n ];\n break;\n\n case commonStats.carbs:\n statData.data = [\n {\n value: {\n grams: ensureNumeric(_.get(data, 'carbs.grams')),\n exchanges: ensureNumeric(_.get(data, 'carbs.exchanges')),\n },\n },\n ];\n\n statData.dataPaths = {\n summary: 'data.0',\n };\n break;\n\n case commonStats.coefficientOfVariation:\n statData.data = [\n {\n id: 'cv',\n value: ensureNumeric(data.coefficientOfVariation),\n },\n ];\n\n statData.dataPaths = {\n summary: 'data.0',\n };\n break;\n\n case commonStats.glucoseManagementIndicator:\n statData.data = [\n {\n id: 'gmi',\n value: ensureNumeric(data.glucoseManagementIndicator),\n },\n {\n id: 'gmiAGP',\n value: ensureNumeric(data.glucoseManagementIndicatorAGP),\n },\n ];\n\n statData.dataPaths = {\n summary: 'data.0',\n summaryAGP: 'data.1',\n };\n break;\n\n case commonStats.readingsInRange:\n statData.data = _.filter([\n (isRangeDefined(data[readingsInRangeDataPath]?.veryLow) && ({\n id: 'veryLow',\n value: ensureNumeric(data[readingsInRangeDataPath].veryLow),\n title: t('Readings Below Range'),\n legendTitle: bgRanges.veryLow,\n })),\n {\n id: 'low',\n value: ensureNumeric(data[readingsInRangeDataPath].low),\n title: t('Readings Below Range'),\n legendTitle: bgRanges.low,\n },\n {\n id: 'target',\n value: ensureNumeric(data[readingsInRangeDataPath].target),\n title: t('Readings In Range'),\n legendTitle: bgRanges.target,\n },\n {\n id: 'high',\n value: ensureNumeric(data[readingsInRangeDataPath].high),\n title: t('Readings Above Range'),\n legendTitle: bgRanges.high,\n },\n (isRangeDefined(data[readingsInRangeDataPath]?.veryHigh) && ({\n id: 'veryHigh',\n value: ensureNumeric(data[readingsInRangeDataPath].veryHigh),\n title: t('Readings Above Range'),\n legendTitle: bgRanges.veryHigh,\n })),\n ], Boolean);\n\n statData.total = { value: getSum(statData.data) };\n statData.dataPaths = {\n summary: [\n 'data',\n _.findIndex(statData.data, { id: 'target' }),\n ],\n totalReadings: 'raw.counts.total',\n averageDailyReadings: 'total',\n };\n break;\n\n case commonStats.sensorUsage:\n statData.data = [\n {\n value: ensureNumeric(data.sensorUsage),\n },\n {\n value: ensureNumeric(data.sensorUsageAGP),\n },\n ];\n statData.total = { value: ensureNumeric(data.total) };\n statData.dataPaths = {\n summary: 'data.0',\n summaryAGP: 'data.1',\n };\n break;\n\n case commonStats.standardDev:\n statData.data = [\n {\n value: ensureNumeric(data.averageGlucose),\n deviation: {\n value: ensureNumeric(data.standardDeviation),\n },\n },\n ];\n\n statData.dataPaths = {\n summary: 'data.0.deviation',\n title: 'data.0',\n };\n break;\n\n case commonStats.timeInAuto:\n statData.data = [\n {\n id: 'basalAutomated',\n value: ensureNumeric(data.automated),\n title: t('Time In {{automatedLabel}}', { automatedLabel: vocabulary[AUTOMATED_DELIVERY] }),\n legendTitle: vocabulary[AUTOMATED_DELIVERY],\n },\n {\n id: 'basal',\n value: ensureNumeric(data.manual),\n title: t('Time In {{scheduledLabel}}', { scheduledLabel: vocabulary[SCHEDULED_DELIVERY] }),\n legendTitle: vocabulary[SCHEDULED_DELIVERY],\n },\n ];\n\n statData.total = { value: getSum(statData.data) };\n statData.dataPaths = {\n summary: [\n 'data',\n _.findIndex(statData.data, { id: 'basalAutomated' }),\n ],\n };\n break;\n\n case commonStats.timeInOverride:\n statData.data = _.map(settingsOverrides, override => ({\n id: override,\n value: ensureNumeric(_.get(data, override, 0)),\n title: t('Time In {{overrideLabel}}', { overrideLabel: _.get(vocabulary, [override, 'label']) }),\n legendTitle: _.get(vocabulary, [override, 'label']),\n }));\n\n statData.sum = { value: getSum(statData.data) };\n statData.total = { value: MS_IN_DAY };\n statData.dataPaths = {\n summary: 'sum',\n };\n break;\n\n case commonStats.timeInRange:\n statData.data = _.filter([\n (isRangeDefined(data.durations.veryLow) && ({\n id: 'veryLow',\n value: ensureNumeric(data.durations.veryLow),\n title: t('Time Below Range'),\n legendTitle: bgRanges.veryLow,\n })),\n {\n id: 'low',\n value: ensureNumeric(data.durations.low),\n title: t('Time Below Range'),\n legendTitle: bgRanges.low,\n },\n {\n id: 'target',\n value: ensureNumeric(data.durations.target),\n title: t('Time In Range'),\n legendTitle: bgRanges.target,\n },\n {\n id: 'high',\n value: ensureNumeric(data.durations.high),\n title: t('Time Above Range'),\n legendTitle: bgRanges.high,\n },\n (isRangeDefined(data.durations.veryHigh) && ({\n id: 'veryHigh',\n value: ensureNumeric(data.durations.veryHigh),\n title: t('Time Above Range'),\n legendTitle: bgRanges.veryHigh,\n })),\n ], Boolean);\n\n statData.total = { value: getSum(statData.data) };\n statData.dataPaths = {\n summary: [\n 'data',\n _.findIndex(statData.data, { id: 'target' }),\n ],\n };\n break;\n\n case commonStats.totalInsulin:\n statData.data = [\n {\n id: 'bolus',\n value: ensureNumeric(data.bolus),\n title: t('Bolus Insulin'),\n legendTitle: t('Bolus'),\n },\n {\n id: 'basal',\n value: ensureNumeric(data.basal),\n title: t('Basal Insulin'),\n legendTitle: t('Basal'),\n },\n ];\n\n statData.total = { id: 'insulin', value: getSum(statData.data) };\n statData.dataPaths = {\n summary: 'total',\n title: 'total',\n };\n break;\n\n default:\n statData = undefined;\n break;\n }\n\n return statData;\n};\n\nexport const getStatTitle = (type, opts = {}) => {\n const { bgSource, days } = opts;\n const vocabulary = getPumpVocabulary(opts.manufacturer);\n const bgTypeLabel = bgSource === 'cbg' ? t('Glucose') : t('BG');\n\n let title;\n\n switch (type) {\n case commonStats.averageGlucose:\n title = t('Avg. Glucose ({{bgSourceLabel}})', { bgSourceLabel: statBgSourceLabels[bgSource] });\n break;\n\n case commonStats.averageDailyDose:\n title = (days > 1) ? t('Avg. Daily Insulin') : t('Total Insulin');\n break;\n\n case commonStats.bgExtents:\n title = t('{{bgTypeLabel}} Extents ({{bgSourceLabel}})', { bgSourceLabel: statBgSourceLabels[bgSource], bgTypeLabel });\n break;\n\n case commonStats.carbs:\n title = (days > 1) ? t('Avg. Daily Carbs') : t('Total Carbs');\n break;\n\n case commonStats.coefficientOfVariation:\n title = t('CV ({{bgSourceLabel}})', { bgSourceLabel: statBgSourceLabels[bgSource] });\n break;\n\n case commonStats.glucoseManagementIndicator:\n title = t('GMI ({{bgSourceLabel}})', { bgSourceLabel: statBgSourceLabels[bgSource] });\n break;\n\n case commonStats.readingsInRange:\n title = (days > 1) ? t('Avg. Daily Readings In Range') : t('Readings In Range');\n break;\n\n case commonStats.sensorUsage:\n title = t('Sensor Usage');\n break;\n\n case commonStats.standardDev:\n title = t('Std. Deviation ({{bgSourceLabel}})', { bgSourceLabel: statBgSourceLabels[bgSource] });\n break;\n\n case commonStats.timeInAuto:\n title = (days > 1)\n ? t('Avg. Daily Time In {{automatedLabel}}', { automatedLabel: vocabulary[AUTOMATED_DELIVERY] })\n : t('Time In {{automatedLabel}}', { automatedLabel: vocabulary[AUTOMATED_DELIVERY] });\n break;\n\n case commonStats.timeInOverride:\n title = (days > 1)\n ? t('Avg. Daily Time In {{overrideLabel}}', { overrideLabel: vocabulary[SETTINGS_OVERRIDE] })\n : t('Time In {{overrideLabel}}', { overrideLabel: vocabulary[SETTINGS_OVERRIDE] });\n break;\n\n case commonStats.timeInRange:\n title = (days > 1) ? t('Avg. Daily Time In Range') : t('Time In Range');\n break;\n\n case commonStats.totalInsulin:\n title = (days > 1) ? t('Avg. Daily Total Insulin') : t('Total Insulin');\n break;\n\n default:\n title = '';\n break;\n }\n\n return title;\n};\n\nexport const getStatDefinition = (data = {}, type, opts = {}) => {\n let stat = {\n annotations: getStatAnnotations(data, type, opts),\n collapsible: _.get(opts, 'collapsible', false),\n data: getStatData(data, type, opts),\n id: type,\n title: getStatTitle(type, opts),\n type: statTypes.barHorizontal,\n };\n\n switch (type) {\n case commonStats.averageGlucose:\n stat.dataFormat = {\n label: statFormats.bgValue,\n summary: statFormats.bgValue,\n };\n stat.type = statTypes.barBg;\n stat.units = _.get(opts, 'bgPrefs.bgUnits');\n break;\n\n case commonStats.averageDailyDose:\n stat.alwaysShowSummary = true;\n stat.dataFormat = {\n output: statFormats.unitsPerKg,\n summary: statFormats.units,\n };\n stat.type = statTypes.input;\n break;\n\n case commonStats.bgExtents:\n stat.dataFormat = {\n label: statFormats.bgValue,\n summary: statFormats.bgValue,\n };\n stat.type = statTypes.simple;\n stat.units = _.get(opts, 'bgPrefs.bgUnits');\n break;\n\n case commonStats.carbs:\n stat.dataFormat = {\n summary: statFormats.carbs,\n };\n stat.type = statTypes.simple;\n break;\n\n case commonStats.coefficientOfVariation:\n stat.dataFormat = {\n summary: statFormats.cv,\n };\n stat.type = statTypes.simple;\n break;\n\n case commonStats.glucoseManagementIndicator:\n stat.dataFormat = {\n summary: statFormats.gmi,\n };\n stat.type = statTypes.simple;\n break;\n\n case commonStats.readingsInRange:\n stat.alwaysShowTooltips = true;\n stat.dataFormat = {\n label: statFormats.percentage,\n summary: statFormats.percentage,\n tooltip: statFormats.bgCount,\n tooltipTitle: statFormats.bgRange,\n count: statFormats.bgCount,\n };\n stat.legend = true;\n stat.hideSummaryUnits = true;\n stat.reverseLegendOrder = true;\n stat.units = _.get(opts, 'bgPrefs.bgUnits');\n break;\n\n case commonStats.sensorUsage:\n stat.dataFormat = {\n summary: statFormats.percentage,\n };\n stat.type = statTypes.simple;\n break;\n\n case commonStats.standardDev:\n stat.dataFormat = {\n label: statFormats.standardDevValue,\n summary: statFormats.standardDevValue,\n title: statFormats.standardDevRange,\n };\n stat.type = statTypes.barBg;\n stat.units = _.get(opts, 'bgPrefs.bgUnits');\n break;\n\n case commonStats.timeInAuto:\n stat.alwaysShowTooltips = true;\n stat.dataFormat = {\n label: statFormats.percentage,\n summary: statFormats.percentage,\n tooltip: statFormats.duration,\n };\n stat.legend = true;\n break;\n\n case commonStats.timeInOverride:\n stat.alwaysShowTooltips = true;\n stat.dataFormat = {\n label: statFormats.percentage,\n summary: statFormats.percentage,\n tooltip: statFormats.duration,\n };\n stat.legend = true;\n stat.reverseLegendOrder = true;\n break;\n\n case commonStats.timeInRange:\n stat.alwaysShowTooltips = true;\n stat.dataFormat = {\n label: statFormats.percentage,\n summary: statFormats.percentage,\n tooltip: statFormats.duration,\n tooltipTitle: statFormats.bgRange,\n };\n stat.legend = true;\n stat.hideSummaryUnits = true;\n stat.reverseLegendOrder = true;\n stat.units = _.get(opts, 'bgPrefs.bgUnits');\n break;\n\n case commonStats.totalInsulin:\n stat.alwaysShowTooltips = true;\n stat.dataFormat = {\n label: statFormats.percentage,\n summary: statFormats.units,\n title: statFormats.units,\n tooltip: statFormats.units,\n };\n stat.legend = true;\n break;\n\n default:\n stat = undefined;\n break;\n }\n\n return stat;\n};\n\n/**\n * statsText\n * @param {Object} stats - all stats data\n * @param {Object} textUtil - TextUtil instance\n * @param {Object} bgPrefs - bgPrefs object from blip containing tideline-style bgClasses\n *\n * @return {String} Stats data as a formatted string\n */\nexport function statsText(stats, textUtil, bgPrefs, formatFn = formatDatum) {\n _.defaults(bgPrefs, {\n bgBounds: reshapeBgClassesToBgBounds(bgPrefs),\n });\n\n let statsString = '';\n\n _.each(stats, stat => {\n const renderTable = _.includes([\n commonStats.timeInRange,\n commonStats.readingsInRange,\n commonStats.totalInsulin,\n commonStats.timeInAuto,\n commonStats.timeInOverride,\n commonStats.bgExtents,\n ], stat.id);\n\n const renderSecondaryValue = _.includes([\n commonStats.readingsInRange,\n commonStats.timeInAuto,\n commonStats.timeInOverride,\n commonStats.timeInRange,\n ], stat.id);\n\n const opts = { bgPrefs, data: stat.data, forcePlainTextValues: true };\n let statTitle = `${stat.title}${stat.units ? ` (${stat.units})` : ''}`;\n\n if (stat.id === 'readingsInRange' && stat.data?.raw?.total > 0) {\n statTitle += t(' from {{count}} readings', { count: stat.data.raw.total });\n }\n\n if (renderTable) {\n statsString += textUtil.buildTextTable(\n statTitle,\n _.map(_.reverse([...stat.data.data]), datum => {\n const formatted = formatFn(\n datum,\n stat.dataFormat.summary,\n opts\n );\n\n let formattedText = `${formatted.value}${formatted.suffix || ''}`;\n\n if (renderSecondaryValue) {\n const secondary = formatFn(\n datum,\n stat.dataFormat.tooltip,\n opts\n );\n\n if (stat.id === 'readingsInRange') secondary.suffix += ' readings/day';\n formattedText += ` (${secondary.value}${secondary.suffix || ''})`;\n }\n\n return {\n label: datum.legendTitle || datum.title,\n value: formattedText,\n };\n }),\n [\n { key: 'label', label: 'Label' },\n { key: 'value', label: 'Value' },\n ],\n { showHeader: false }\n );\n } else {\n const formatted = formatFn(\n _.get(stat.data, stat.data.dataPaths.summary, {}),\n stat.dataFormat.summary,\n opts\n );\n\n // Ensure zero values are not stripped by _.compact when setting values array\n if (formatted.value === 0) formatted.value = [formatted.value];\n if (!_.isArray(formatted.value)) formatted.value = _.compact([formatted.value]);\n if (!_.isArray(formatted.suffix)) formatted.suffix = _.compact([formatted.suffix]);\n\n statsString += '\\n';\n statsString += textUtil.buildTextLine({\n label: stat.title,\n value: _.map(formatted.value, (value, i) => `${value}${formatted.suffix[i] || (stat.units ? ` ${stat.units}` : '')}`).join(' '),\n });\n }\n });\n\n return statsString;\n}\n","module.exports = require(\"d3-array\");","module.exports = require(\"d3-format\");","module.exports = require(\"d3-time-format\");","module.exports = require(\"i18next\");","module.exports = require(\"lodash\");","module.exports = require(\"moment\");","module.exports = require(\"moment-timezone\");","module.exports = require(\"react\");","module.exports = require(\"sundial\");","function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n \"default\": obj\n };\n}\nmodule.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction _getRequireWildcardCache(e) {\n if (\"function\" != typeof WeakMap) return null;\n var r = new WeakMap(),\n t = new WeakMap();\n return (_getRequireWildcardCache = function _getRequireWildcardCache(e) {\n return e ? t : r;\n })(e);\n}\nfunction _interopRequireWildcard(e, r) {\n if (!r && e && e.__esModule) return e;\n if (null === e || \"object\" != _typeof(e) && \"function\" != typeof e) return {\n \"default\": e\n };\n var t = _getRequireWildcardCache(r);\n if (t && t.has(e)) return t.get(e);\n var n = {\n __proto__: null\n },\n a = Object.defineProperty && Object.getOwnPropertyDescriptor;\n for (var u in e) if (\"default\" !== u && Object.prototype.hasOwnProperty.call(e, u)) {\n var i = a ? Object.getOwnPropertyDescriptor(e, u) : null;\n i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u];\n }\n return n[\"default\"] = e, t && t.set(e, n), n;\n}\nmodule.exports = _interopRequireWildcard, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return (module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports), _typeof(o);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\nexport default function _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(undefined);\n });\n };\n}","import toPropertyKey from \"./toPropertyKey.js\";\nexport default function _defineProperty(obj, key, value) {\n key = toPropertyKey(key);\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}","import defineProperty from \"./defineProperty.js\";\nfunction ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function (r) {\n return Object.getOwnPropertyDescriptor(e, r).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n}\nexport default function _objectSpread2(e) {\n for (var r = 1; r < arguments.length; r++) {\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n defineProperty(e, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return e;\n}","import _typeof from \"./typeof.js\";\nexport default function _regeneratorRuntime() {\n \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */\n _regeneratorRuntime = function _regeneratorRuntime() {\n return e;\n };\n var t,\n e = {},\n r = Object.prototype,\n n = r.hasOwnProperty,\n o = Object.defineProperty || function (t, e, r) {\n t[e] = r.value;\n },\n i = \"function\" == typeof Symbol ? Symbol : {},\n a = i.iterator || \"@@iterator\",\n c = i.asyncIterator || \"@@asyncIterator\",\n u = i.toStringTag || \"@@toStringTag\";\n function define(t, e, r) {\n return Object.defineProperty(t, e, {\n value: r,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }), t[e];\n }\n try {\n define({}, \"\");\n } catch (t) {\n define = function define(t, e, r) {\n return t[e] = r;\n };\n }\n function wrap(t, e, r, n) {\n var i = e && e.prototype instanceof Generator ? e : Generator,\n a = Object.create(i.prototype),\n c = new Context(n || []);\n return o(a, \"_invoke\", {\n value: makeInvokeMethod(t, r, c)\n }), a;\n }\n function tryCatch(t, e, r) {\n try {\n return {\n type: \"normal\",\n arg: t.call(e, r)\n };\n } catch (t) {\n return {\n type: \"throw\",\n arg: t\n };\n }\n }\n e.wrap = wrap;\n var h = \"suspendedStart\",\n l = \"suspendedYield\",\n f = \"executing\",\n s = \"completed\",\n y = {};\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n var p = {};\n define(p, a, function () {\n return this;\n });\n var d = Object.getPrototypeOf,\n v = d && d(d(values([])));\n v && v !== r && n.call(v, a) && (p = v);\n var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p);\n function defineIteratorMethods(t) {\n [\"next\", \"throw\", \"return\"].forEach(function (e) {\n define(t, e, function (t) {\n return this._invoke(e, t);\n });\n });\n }\n function AsyncIterator(t, e) {\n function invoke(r, o, i, a) {\n var c = tryCatch(t[r], t, o);\n if (\"throw\" !== c.type) {\n var u = c.arg,\n h = u.value;\n return h && \"object\" == _typeof(h) && n.call(h, \"__await\") ? e.resolve(h.__await).then(function (t) {\n invoke(\"next\", t, i, a);\n }, function (t) {\n invoke(\"throw\", t, i, a);\n }) : e.resolve(h).then(function (t) {\n u.value = t, i(u);\n }, function (t) {\n return invoke(\"throw\", t, i, a);\n });\n }\n a(c.arg);\n }\n var r;\n o(this, \"_invoke\", {\n value: function value(t, n) {\n function callInvokeWithMethodAndArg() {\n return new e(function (e, r) {\n invoke(t, n, e, r);\n });\n }\n return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();\n }\n });\n }\n function makeInvokeMethod(e, r, n) {\n var o = h;\n return function (i, a) {\n if (o === f) throw new Error(\"Generator is already running\");\n if (o === s) {\n if (\"throw\" === i) throw a;\n return {\n value: t,\n done: !0\n };\n }\n for (n.method = i, n.arg = a;;) {\n var c = n.delegate;\n if (c) {\n var u = maybeInvokeDelegate(c, n);\n if (u) {\n if (u === y) continue;\n return u;\n }\n }\n if (\"next\" === n.method) n.sent = n._sent = n.arg;else if (\"throw\" === n.method) {\n if (o === h) throw o = s, n.arg;\n n.dispatchException(n.arg);\n } else \"return\" === n.method && n.abrupt(\"return\", n.arg);\n o = f;\n var p = tryCatch(e, r, n);\n if (\"normal\" === p.type) {\n if (o = n.done ? s : l, p.arg === y) continue;\n return {\n value: p.arg,\n done: n.done\n };\n }\n \"throw\" === p.type && (o = s, n.method = \"throw\", n.arg = p.arg);\n }\n };\n }\n function maybeInvokeDelegate(e, r) {\n var n = r.method,\n o = e.iterator[n];\n if (o === t) return r.delegate = null, \"throw\" === n && e.iterator[\"return\"] && (r.method = \"return\", r.arg = t, maybeInvokeDelegate(e, r), \"throw\" === r.method) || \"return\" !== n && (r.method = \"throw\", r.arg = new TypeError(\"The iterator does not provide a '\" + n + \"' method\")), y;\n var i = tryCatch(o, e.iterator, r.arg);\n if (\"throw\" === i.type) return r.method = \"throw\", r.arg = i.arg, r.delegate = null, y;\n var a = i.arg;\n return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, \"return\" !== r.method && (r.method = \"next\", r.arg = t), r.delegate = null, y) : a : (r.method = \"throw\", r.arg = new TypeError(\"iterator result is not an object\"), r.delegate = null, y);\n }\n function pushTryEntry(t) {\n var e = {\n tryLoc: t[0]\n };\n 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e);\n }\n function resetTryEntry(t) {\n var e = t.completion || {};\n e.type = \"normal\", delete e.arg, t.completion = e;\n }\n function Context(t) {\n this.tryEntries = [{\n tryLoc: \"root\"\n }], t.forEach(pushTryEntry, this), this.reset(!0);\n }\n function values(e) {\n if (e || \"\" === e) {\n var r = e[a];\n if (r) return r.call(e);\n if (\"function\" == typeof e.next) return e;\n if (!isNaN(e.length)) {\n var o = -1,\n i = function next() {\n for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next;\n return next.value = t, next.done = !0, next;\n };\n return i.next = i;\n }\n }\n throw new TypeError(_typeof(e) + \" is not iterable\");\n }\n return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, \"constructor\", {\n value: GeneratorFunctionPrototype,\n configurable: !0\n }), o(GeneratorFunctionPrototype, \"constructor\", {\n value: GeneratorFunction,\n configurable: !0\n }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, \"GeneratorFunction\"), e.isGeneratorFunction = function (t) {\n var e = \"function\" == typeof t && t.constructor;\n return !!e && (e === GeneratorFunction || \"GeneratorFunction\" === (e.displayName || e.name));\n }, e.mark = function (t) {\n return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, \"GeneratorFunction\")), t.prototype = Object.create(g), t;\n }, e.awrap = function (t) {\n return {\n __await: t\n };\n }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () {\n return this;\n }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) {\n void 0 === i && (i = Promise);\n var a = new AsyncIterator(wrap(t, r, n, o), i);\n return e.isGeneratorFunction(r) ? a : a.next().then(function (t) {\n return t.done ? t.value : a.next();\n });\n }, defineIteratorMethods(g), define(g, u, \"Generator\"), define(g, a, function () {\n return this;\n }), define(g, \"toString\", function () {\n return \"[object Generator]\";\n }), e.keys = function (t) {\n var e = Object(t),\n r = [];\n for (var n in e) r.push(n);\n return r.reverse(), function next() {\n for (; r.length;) {\n var t = r.pop();\n if (t in e) return next.value = t, next.done = !1, next;\n }\n return next.done = !0, next;\n };\n }, e.values = values, Context.prototype = {\n constructor: Context,\n reset: function reset(e) {\n if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) \"t\" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t);\n },\n stop: function stop() {\n this.done = !0;\n var t = this.tryEntries[0].completion;\n if (\"throw\" === t.type) throw t.arg;\n return this.rval;\n },\n dispatchException: function dispatchException(e) {\n if (this.done) throw e;\n var r = this;\n function handle(n, o) {\n return a.type = \"throw\", a.arg = e, r.next = n, o && (r.method = \"next\", r.arg = t), !!o;\n }\n for (var o = this.tryEntries.length - 1; o >= 0; --o) {\n var i = this.tryEntries[o],\n a = i.completion;\n if (\"root\" === i.tryLoc) return handle(\"end\");\n if (i.tryLoc <= this.prev) {\n var c = n.call(i, \"catchLoc\"),\n u = n.call(i, \"finallyLoc\");\n if (c && u) {\n if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);\n if (this.prev < i.finallyLoc) return handle(i.finallyLoc);\n } else if (c) {\n if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);\n } else {\n if (!u) throw new Error(\"try statement without catch or finally\");\n if (this.prev < i.finallyLoc) return handle(i.finallyLoc);\n }\n }\n }\n },\n abrupt: function abrupt(t, e) {\n for (var r = this.tryEntries.length - 1; r >= 0; --r) {\n var o = this.tryEntries[r];\n if (o.tryLoc <= this.prev && n.call(o, \"finallyLoc\") && this.prev < o.finallyLoc) {\n var i = o;\n break;\n }\n }\n i && (\"break\" === t || \"continue\" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null);\n var a = i ? i.completion : {};\n return a.type = t, a.arg = e, i ? (this.method = \"next\", this.next = i.finallyLoc, y) : this.complete(a);\n },\n complete: function complete(t, e) {\n if (\"throw\" === t.type) throw t.arg;\n return \"break\" === t.type || \"continue\" === t.type ? this.next = t.arg : \"return\" === t.type ? (this.rval = this.arg = t.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === t.type && e && (this.next = e), y;\n },\n finish: function finish(t) {\n for (var e = this.tryEntries.length - 1; e >= 0; --e) {\n var r = this.tryEntries[e];\n if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y;\n }\n },\n \"catch\": function _catch(t) {\n for (var e = this.tryEntries.length - 1; e >= 0; --e) {\n var r = this.tryEntries[e];\n if (r.tryLoc === t) {\n var n = r.completion;\n if (\"throw\" === n.type) {\n var o = n.arg;\n resetTryEntry(r);\n }\n return o;\n }\n }\n throw new Error(\"illegal catch attempt\");\n },\n delegateYield: function delegateYield(e, r, n) {\n return this.delegate = {\n iterator: values(e),\n resultName: r,\n nextLoc: n\n }, \"next\" === this.method && (this.arg = t), y;\n }\n }, e;\n}","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nexport default function _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}","export default function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArrayLimit(r, l) {\n var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n if (null != t) {\n var e,\n n,\n i,\n u,\n a = [],\n f = !0,\n o = !1;\n try {\n if (i = (t = t.call(r)).next, 0 === l) {\n if (Object(t) !== t) return;\n f = !1;\n } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n } catch (r) {\n o = !0, n = r;\n } finally {\n try {\n if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return;\n } finally {\n if (o) throw n;\n }\n }\n return a;\n }\n}","export default function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nexport default function _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}","export default function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nexport default function _toPropertyKey(arg) {\n var key = toPrimitive(arg, \"string\");\n return _typeof(key) === \"symbol\" ? key : String(key);\n}","import _typeof from \"./typeof.js\";\nexport default function _toPrimitive(input, hint) {\n if (_typeof(input) !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (_typeof(res) !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n}","export default function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import _ from 'lodash';\nimport moment from 'moment-timezone';\n\nimport { getStatDefinition } from '../stat';\nimport { getTimezoneFromTimePrefs } from '../datetime';\nimport { BGM_DATA_KEY, CGM_DATA_KEY } from '../constants';\n\nimport {\n generateAmbulatoryGlucoseProfileFigure,\n generateChartSections,\n generateDailyGlucoseProfilesFigure,\n generatePercentInRangesFigure,\n} from '../../modules/print/utils/AGPUtils';\n\n/**\n * generateAGPFigureDefinitions\n * @param {Object} data - Data as provided by DataUtil from AGP pdf query\n */\nexport async function generateAGPFigureDefinitions(data) {\n const svgDataURLS = {};\n const bgSource = _.get(data, 'metaData.bgSources.current');\n const endpoints = _.get(data, 'data.current.endpoints', {});\n const sections = generateChartSections(data, bgSource);\n\n // Generate SVG data urls from Plotly figures\n const stats = {};\n const statsData = _.get(data, 'data.current.stats', {});\n _.forOwn(statsData, (statData, statType) => {\n const stat = getStatDefinition(statData, statType, {\n bgSource,\n days: endpoints.activeDays || endpoints.days,\n bgPrefs: data.bgPrefs,\n });\n stats[statType] = stat;\n });\n\n const percentInRangesStat = bgSource === CGM_DATA_KEY ? stats.timeInRange : stats.readingsInRange;\n\n // Generate percentInRanges figure\n if (sections.percentInRanges?.sufficientData) {\n svgDataURLS.percentInRanges = generatePercentInRangesFigure(sections.percentInRanges, percentInRangesStat, data.bgPrefs, data.query?.glycemicRanges);\n }\n\n // Generate ambulatoryGlucoseProfile figure\n if (sections.ambulatoryGlucoseProfile.sufficientData || bgSource === BGM_DATA_KEY) {\n const bgData = data?.data?.current?.data?.[bgSource] || [];\n svgDataURLS.ambulatoryGlucoseProfile = generateAmbulatoryGlucoseProfileFigure(sections.ambulatoryGlucoseProfile, bgData, data.bgPrefs, bgSource);\n }\n\n // Generate dailyGlucoseProfiles figures\n if (sections.dailyGlucoseProfiles.sufficientData) {\n // All CGM data passed into AGP should be deduplicated\n const dataKey = bgSource === 'cbg' ? 'cbgDeduplicated' : bgSource;\n const bgDataByDate = _.mapValues(data?.data?.current?.aggregationsByDate?.dataByDate, dataKey);\n\n // Group daily data by week\n const { newestDatum } = stats.bgExtents?.data?.raw || {};\n\n const weeklyDates = _.chunk(_.map(_.range(14), (val, index) => (\n moment.utc(newestDatum?.time).tz(getTimezoneFromTimePrefs(data.timePrefs)).subtract(index, 'days').format('YYYY-MM-DD')\n )).reverse(), 7);\n\n const week1Data = _.map(weeklyDates[0], date => ([[date], bgDataByDate[date]]));\n const week2Data = _.map(weeklyDates[1], date => ([[date], bgDataByDate[date]]));\n\n svgDataURLS.dailyGlucoseProfiles = [\n generateDailyGlucoseProfilesFigure(sections.dailyGlucoseProfiles, week1Data, data.bgPrefs, 'dddd'),\n generateDailyGlucoseProfilesFigure(sections.dailyGlucoseProfiles, week2Data, data.bgPrefs, 'ha'),\n ];\n }\n\n return svgDataURLS;\n}\n"],"names":["_reportSubHeader","_title","_CGM_DATA_KEY","_BGM_DATA_KEY","_subtitle","_glucoseMetrics","_ambulatoryGlucosePro","_dailyGlucoseProfiles","_goals","_lodash","_interopRequireDefault","require","_i18next","_constants","_constants2","t","i18next","bind","undefined","_","get","init","returnEmptyString","nsSeparator","exports","DPI","text","reportHeader","reportSubHeader","_defineProperty2","CGM_DATA_KEY","BGM_DATA_KEY","reportFooter","reportInsuffienctData","percentInRanges","title","subtitle","GLYCEMIC_RANGES_PRESET","ADA_STANDARD","ADA_OLDER_HIGH_RISK","ADA_PREGNANCY_T1","ADA_GESTATIONAL_T2","reportInfo","dob","mrn","glucoseMetrics","averageGlucose","label","goal","mgdl","mmoll","coefficientOfVariation","subLabel","glucoseManagementIndicator","bgExtents","dailyReadingsInRange","readingsInRange","ambulatoryGlucoseProfile","description","targetRange","insufficientData","insufficientDataTitle","dailyGlucoseProfiles","bgRanges","veryHigh","high","target","low","veryLow","goals","highCombined","lowCombined","subLabels","TIRtarget","TIRminutes","black","default","section","values","ticks","summaries","bgUnits","labels","subStats","hourlyTicks","bgTicks","percentileTicks","timeTicks","weekdayTicks","calendarDates","white","lightGrey","mediumGrey","darkGrey","colors","bg","dailyProfileBg","hour","percentile","line","range","dailyProfileTarget","divider","background","shaded","bgRange","lowShaded","highShaded","empty","bgReadings","median","interQuartile","outerQuantile","fill","_AGPConstants","_format","_datetime","_bloodglucose","_glycemicRanges","_moment","boldText","textString","concat","String","chartScaleToPixels","paperPixelDimension","scaleValue","pixelsToChartScale","pixels","pointsToPixels","points","createAnnotation","options","defaultsDeep","arrowside","font","color","family","AGP_FONT_FAMILY","showarrow","calculateCGMDataSufficiency","_data$data","_data$data$current","_data$data2","_data$data2$current","_data$data2$current$s","_data$data3","_data$data3$current","_data$data3$current$s","data","arguments","length","statsByDate","current","aggregationsByDate","_ref","stats","newestDatum","bgDaysWorn","_ref2","sensorUsage","count","sampleInterval","sensorUsageAGP","sufficiencyBySection","hoursOfCGMData","MS_IN_HOUR","sufficencyMet","cgmCalendarDays","map","max","val","index","moment","utc","time","tz","getTimezoneFromTimePrefs","timePrefs","subtract","format","reverse","sensorUsageByDate","date","_statsByDate$date","_statsByDate$date2","_ref3","countForDate","sampleFrequencyForDate","_ref4","_ref4$newestDatum","newestDatumForDate","_ref4$oldestDatum","oldestDatum","oldestDatumForDate","sufficiencyMet","maxPossibleReadings","minCount","bankersRound","MS_IN_DAY","msPer24","sufficientDays","filter","topSevenSufficientDays","slice","orderBy","topSevenDaysSensorUsageMean","meanBy","calculateBGMDataSufficiency","_data$data4","_data$data4$current","_data$data4$current$d","_data$data4$current$d2","totalReadings","smbg","bgSource","_data$query","reportInfoAndMetricsWidth","chartRenderAreaTop","rightEdge","MARGINS","left","WIDTH","chartRenderAreaBottom","top","HEIGHT","bottom","sectionGap","sections","dataSufficiency","glycemicRangesPreset","getGlycemicRangesPreset","query","glycemicRanges","x","y","width","height","bordered","sufficientData","dailyGlucoseProfilesHeight","AGP_FOOTER_Y_PADDING","stat","bgPrefs","_bgPrefs$bgBounds","_bgPrefs$bgBounds2","chartAreaWidth","chartAreaHeight","AGP_SECTION_BORDER_RADIUS","plotMarginX","plotMarginTop","plotMarginBottom","paperWidth","paperHeight","barWidth","yScale","xScale","hasVeryLow","isNumber","bgBounds","veryLowThreshold","hasVeryHigh","veryHighThreshold","statTotal","_bgPrefs$bgBounds3","_bgPrefs$bgBounds4","_bgPrefs$bgBounds5","_bgPrefs$bgBounds6","_bgPrefs$bgBounds7","_bgPrefs$bgBounds8","rawCounts","statDatums","id","value","Boolean","chartData","reduce","res","datum","i","toNumber","minHeight","AGP_TIR_MIN_TARGET_HEIGHT","AGP_TIR_MIN_HEIGHT","renderedValue","rawById","raw","push","rendered","yScaleCorrection","last","name","type","marker","tickYPos","_toConsumableArray2","unshift","targetLowerBound","targetUpperBound","tick","arr","align","size","fontSizes","formatBgValue","xanchor","xshift","yanchor","getBracketPosValues","posX","posX2","posY","posY2","minBracketYOffSet","maxSubBracketYOffset","subBracketXOffset","subBracketYOffset","min","targetBracketAllowedYRange","createBracketSVG","pos","radiusX","radiusY","join","bracketYPos","bracketXExtents","bracketPos","apply","brackets","path","yref","createLeaderSVG","isLowLeader","leaderYPos","leaderXExtents","leaderPos","leaders","rangePosY","rangePosYOrderedKeys","rangeLabels","yshift","rangeValuesOrderedKeys","rangeValues","formatPercentage","rangeSummaryPosY","combinedRangeSummaryValues","rangeSummaryValues","goalsPos","goalGlycemicRangesKey","ADA_STANDARD_BG_BOUNDS","MGDL_UNITS","goalsOrderedKeys","_objectSpread2","subLabelsPos","xref","rangeAnnotations","lowSummary","highSummary","layout","barmode","showlegend","margin","l","r","b","xaxis","showgrid","showline","showticklabels","zeroline","yaxis","annotations","shapes","bgData","_bgPrefs$bgBounds9","_bgPrefs$bgBounds10","AGP_SECTION_HEADER_HEIGHT","AGP_SECTION_DESCRIPTION_HEIGHT","plotMarginY","yClamp","AGP_BG_CLAMP_MGDL","AGP_BG_CLAMP_MMOLL","mungeBGDataBins","ONE_HR","AGP_LOWER_QUANTILE","AGP_UPPER_QUANTILE","quantileKeys","firstDatum","lastDatum","smoothedChartData","result","key","_chartData","_chartData2","prev","curr","next","sum","firstSmoothedDatum","lastSmoothedDatum","msX","quantileBand","upperKey","lowerKey","fillcolor","mode","simplify","shape","smoothing","bgRangeKeys","targetStart","findIndex","targetEnd","bgTickAnnotations","isTarget","includes","bgTargetMarkers","posXLeft","posYTop","posYBottom","xsizemode","ysizemode","bgGridLines","isClamp","isZero","layer","x0","x1","y0","y1","percentileLabels","percentileTickYPositions","percentileTickShiftedYPositions","medianYPos","minGap","percentileTickYShifts","shiftedYPos","percentileTickAnnotations","visible","isFinite","percentileTickLines","quarterDayTicks","hourlyTicksAnnotations","yAxes","bgmMedian","legend","showLegend","each","bin","segmentData","bandData","_ref5","thirdQuartile","firstQuartile","quantileSegment","medianData","isLastDrawableSegment","medianTickYPos","isFirstDrawableSegment","rx","medianWidth","ry","previousSegmentData","lineEnd","yAxis","domain","linecolor","mirror","legendXOffset","legendYOffset","legendRangeHeight","tickIndex","showTick","yPos","tickYPosOffset","tickTextIndex","targetReadings","lowReadings","veryLowReadings","highReadings","veryHighReadings","renderBgReadings","_ref8","classifyBgValue","d","gridcolor","tickvals","xaxis2","overlaying","tickcolor","ticklen","axis","mean","figure","dateLabelFormat","plotHeight","_bgPrefs$bgBounds11","_bgPrefs$bgBounds12","halfDayTicks","halfDayTickAnnotations","calendarDays","flatten","calendarDayAnnotations","combinedData","dayData","isLow","first","fillYExentRangeIndex","textangle","MARGIN","right","bgValue","classificationType","isEmpty","Error","gt","MMOLL_UNITS","precision","roundedValue","MGDL_PER_MMOLL","opts","minimumIncrement","BG_DISPLAY_MINIMUM_INCREMENTS","thresholds","mapValues","threshold","highLowerBound","lowUpperBound","extremeHighThreshold","condensed","anyLow","anyHigh","extremeHigh","segmented","suffix","prefix","bgDatum","outOfRangeAnnotation","find","annotation","code","DEFAULT_BG_BOUNDS","bgType","binSize","outerQuantiles","binned","groupBy","findBinForTimeOfDay","outOfRanges","findOutOfRangeAnnotations","binKeys","TWENTY_FOUR_HRS","binCalculator","calculateSmbgStatsForBin","calculateCbgStatsForBin","valueExtractor","mungedData","bgClasses","clampThreshold","total","MS_IN_MIN","_d3Array","determineRangeBoundaries","outOfRange","lowThresholds","highThresholds","boundaries","Math","floor","isOutOfRangeAnnotation","eventsAnnotatedAsOutOfRange","some","pick","uniqBy","binKey","_outerQuantiles","_slicedToArray2","_outerQuantiles$","lowerQuantile","_outerQuantiles$2","upperQuantile","sorted","sortBy","centerOfBinMs","parseInt","quantile","msFrom","msTo","outOfRangeThresholds","_BG_DISPLAY_MINIMUM_I","_DEFAULT_BG_BOUNDS","_ADA_OLDER_HIGH_RISK_","_ADA_PREGNANCY_T1_BG_","_ANIMAS","_INSULET","_MEDTRONIC","_MICROTECH","_TANDEM","_TIDEPOOL_LOOP","_TWIIST_LOOP","_DIY_LOOP","_default","_pumpVocabulary","_settingsOverrides","stiffness","damping","PRESET","CUSTOM","ADA_PREGNANCY_T1_BG_BOUNDS","extentSizes","ONE_WEEK","TWO_WEEKS","FOUR_WEEKS","SITE_CHANGE_RESERVOIR","SITE_CHANGE_TUBING","SITE_CHANGE_CANNULA","ALARM_NO_DELIVERY","ALARM_AUTO_OFF","ALARM_NO_INSULIN","ALARM_NO_POWER","ALARM_OCCLUSION","ALARM_OVER_LIMIT","EVENT_PUMP_SHUTDOWN","AUTOMATED_BOLUS","AUTOMATED_DELIVERY","AUTOMATED_SUSPEND","AUTOMATED_MODE_EXITED","SCHEDULED_DELIVERY","SETTINGS_OVERRIDE","SLEEP","PHYSICAL_ACTIVITY","PREPRANDIAL","MAX_BOLUS","MAX_BASAL","ONE_BUTTON_BOLUS","INSULIN_DURATION","INSULET","TANDEM","ANIMAS","TIDEPOOL_LOOP","DIY_LOOP","TWIIST_LOOP","MEDTRONIC","MICROTECH","BG_DATA_TYPES","patient","bday","utcFormat","Date","parse","milliseconds","isNull","isUndefined","timeFormat","startDate","endDate","dateParseFormat","monthFormat","start","end","isSameYear","isSame","isSameDay","startFormat","endFormat","diagnosis","duration","momentDuration","days","hours","minutes","seconds","QUARTER","ascii","THIRD","HALF","TWO_THIRDS","THREE_QUARTERS","formatted","roundedMinutes","roundedHours","roundedDays","trim","timezone","timezoneName","localized","utcHammertime","zone","utcOffset","_d3TimeFormat","_momentTimezone","_sundial","getBrowserTimezone","Intl","DateTimeFormat","resolvedOptions","timeZone","timezoneAware","sundial","checkTimezoneName","err","getLocalizedCeiling","period","startOfPeriod","startOf","valueOf","toDate","add","endOfToday","toISOString","endOfProvidedDay","daysAgo","diff","minutesAgo","hoursAgo","daysText","ceil","hoursText","unit","minutesText","basalData","lastManualBasal","findLast","deliveryType","uploadData","deviceTags","manufacturer","vocabulary","cloneDeep","pumpVocabulary","defaults","getUppercasedManufacturer","settingsOverrides","pumpSettingsOrUpload","deviceModel","AUTOMATED_BASAL_DEVICE_MODELS","deviceName","isControlIQ","isLoop","isDIYLoop","_datum$client4","_datum$origin","TARGET","client","origin","isTwiistLoop","_data","_datum$client","test","isTidepoolLoop","_datum$client2","_datum$client3","majorVersion","split","indexOf","_datum$tags","tags","loop","part","upperCase","upperFirst","units","lowThreshold","highThreshold","convertToMmolL","BG_LOW","BG_HIGH","toFixed","toString","decimalLength","qtyString","formatDecimalNumber","useAGPFormat","Number","isNaN","percentage","shift","pow","round","replace","_d3Format","abs","places","GLYCEMIC_RANGES_TYPE","preset","settingsData","normalTime","uploadedTime","datetime","formatLocalizedFromUTC","schedule","activeSchedule","uploaded","serial","deviceSerialNumber","scheduleName","activeName","deviceKey","noUnits","displayName","main","secondary","keysIn","names","schedules","position","settings","_settings$units","deviceLabels","getPumpVocabulary","maxBasal","maxBolus","insulinDurationUnits","insulinDuration","durationInHours","minutesRemainder","padStart","rows","setting","MAX_BASAL_RATE_PRECISION_PLACES","_settings$insulinMode","_settings$insulinMode2","_settings$insulinMode3","insulinModel","rapidAdult","rapidChild","fiasp","lyumjev","afrezza","modelType","peakMinutes","actionPeakOffset","device","insulinModelAnnotations","bgSafetyLimit","splice","columns","_settings$units2","_deviceLabels$PREPRAN","_deviceLabels$PHYSICA","correctionRange","bgTargetPreprandial","bgTargetPhysicalActivity","scheduleData","starts","getStarts","noRateData","rate","getBasalRate","startTime","formatClocktimeFromMsPer24","getTotalBasalRates","targetsData","keys","columnTwo","getBloodGlucoseValue","columnThree","carbRatioData","amount","getValue","sensitivityData","pumpSettings","bgTargets","basalSchedules","bgTarget","carbRatio","carbRatios","insulinSensitivity","insulinSensitivities","valueKey","_interopRequireWildcard","_device","BASAL_RATE_PRECISION_PLACES","noData","animas","insulet","medtronic","tandem","microtech","twiist","fieldName","timedData","finish","hrs","parseFloat","textUtil","formatFn","formatDatum","reshapeBgClassesToBgBounds","statsString","_stat$data","_stat$data$raw","renderTable","commonStats","timeInRange","totalInsulin","timeInAuto","timeInOverride","renderSecondaryValue","forcePlainTextValues","statTitle","buildTextTable","dataFormat","summary","formattedText","tooltip","legendTitle","showHeader","dataPaths","isArray","compact","buildTextLine","_statFetchMethods","_react","dailyDoseUnitOptions","statTypes","barHorizontal","barBg","input","simple","statBgSourceLabels","cbg","statFormats","bgCount","cv","carbs","gmi","standardDevRange","standardDevValue","unitsPerKg","averageDailyDose","standardDev","getSum","ensureNumeric","isNil","isRangeDefined","deviation","lowerValue","lowerColorId","upperValue","upperColorId","_opts$emptyDataPlaceh","emptyDataPlaceholder","_opts$forcePlainTextV","disableStat","generateBgRangeLabels","isPlainObject","grams","exchanges","_value","classifyCvValue","formatDuration","formatStatsPercentage","createElement","style","BG_COLORS","LBS_PER_KG","getStatAnnotations","overrideLabel","overrideLabelLowerCase","lowerCase","bgStats","bgSourceLabel","smbgLabel","cbgLabel","automatedLabel","getStatData","_data$readingsInRange","_data$readingsInRange2","getSettingsOverrides","statData","readingsInRangeDataPath","suffixValue","inputValue","output","dividend","bgMax","bgMin","glucoseManagementIndicatorAGP","summaryAGP","averageDailyReadings","standardDeviation","automated","manual","scheduledLabel","override","durations","bolus","basal","getStatTitle","bgTypeLabel","collapsible","alwaysShowSummary","alwaysShowTooltips","tooltipTitle","hideSummaryUnits","reverseLegendOrder","module","obj","__esModule","_typeof","_getRequireWildcardCache","e","WeakMap","has","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","set","o","Symbol","iterator","constructor","_arrayLikeToArray","len","arr2","Array","asyncGeneratorStep","gen","resolve","reject","_next","_throw","arg","info","error","done","Promise","then","_asyncToGenerator","fn","self","this","args","_defineProperty","enumerable","configurable","writable","ownKeys","getOwnPropertySymbols","forEach","getOwnPropertyDescriptors","defineProperties","_regeneratorRuntime","c","asyncIterator","toStringTag","define","wrap","Generator","create","Context","makeInvokeMethod","tryCatch","h","f","s","GeneratorFunction","GeneratorFunctionPrototype","p","getPrototypeOf","v","g","defineIteratorMethods","_invoke","AsyncIterator","invoke","__await","callInvokeWithMethodAndArg","method","delegate","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","TypeError","resultName","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","reset","isGeneratorFunction","mark","setPrototypeOf","awrap","async","pop","charAt","stop","rval","handle","complete","delegateYield","_slicedToArray","unsupportedIterableToArray","_toConsumableArray","arrayLikeToArray","iter","from","_toPropertyKey","prim","toPrimitive","hint","_unsupportedIterableToArray","minLen","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","definition","prop","_x","_generateAGPFigureDefinitions","_stat","_AGPUtils","_asyncToGenerator2","_regeneratorRuntime2","_callee","_sections$percentInRa","svgDataURLS","endpoints","statsData","percentInRangesStat","_data$data$current$da","_data$data2$current$a","_stats$bgExtents","_stats$bgExtents$data","dataKey","bgDataByDate","weeklyDates","week1Data","week2Data","_context","generateChartSections","forOwn","statType","getStatDefinition","activeDays","generatePercentInRangesFigure","generateAmbulatoryGlucoseProfileFigure","dataByDate","chunk","generateDailyGlucoseProfilesFigure"],"sourceRoot":""}
|