From 1b5a2abba8372b16014b9cba1d65230f715f68f7 Mon Sep 17 00:00:00 2001 From: jy95 Date: Tue, 23 Apr 2024 21:37:33 +0200 Subject: [PATCH] feat: improving rendering of quantity objects --- src/locales/de/common.json | 13 +++++---- src/locales/en/common.json | 13 +++++---- src/locales/fr/common.json | 13 +++++---- src/locales/nl/common.json | 13 +++++---- src/translators/doseQuantity.ts | 16 +++++------ src/translators/maxDosePerAdministration.ts | 14 +++++----- src/translators/maxDosePerLifetime.ts | 14 +++++----- src/translators/rateQuantity.ts | 18 +++++-------- src/types.ts | 8 +++++- src/utils/fromQuantityToString.ts | 30 +++++++++++++++++++++ 10 files changed, 100 insertions(+), 52 deletions(-) create mode 100644 src/utils/fromQuantityToString.ts diff --git a/src/locales/de/common.json b/src/locales/de/common.json index ea7c6baa..ea7be53c 100644 --- a/src/locales/de/common.json +++ b/src/locales/de/common.json @@ -28,12 +28,15 @@ "denominator_other": ":{{count}}" } }, - "quantity": "{{quantity}} {{unit}}" + "quantity": { + "withUnit": "{{quantity}} {{unit}}", + "withoutUnit": "{{quantity}}" + } }, "fields": { - "doseQuantity": "{{quantity}} {{unit}}", + "doseQuantity": "{{quantityText}}", "doseRange": "{{rangeText}}", - "rateQuantity": "mit einem Verhältnis von {{quantity}} {{unit}}", + "rateQuantity": "mit einem Verhältnis von {{quantityText}}", "rateRange": "mit einem Verhältnis von {{rangeText}}", "rateRatio": "mit einem Verhältnis von {{ratioText}}", "duration": "für {{durationText}}", @@ -83,8 +86,8 @@ "event_one": "{{event}}", "event_other": "{{event}}" }, - "maxDosePerLifetime": "bis zu einer maximalen Menge von {{count}} {{unit}} über die Lebenszeit des Patienten", - "maxDosePerAdministration": "bis zu einer maximalen Menge von {{count}} {{unit}} pro Dosis", + "maxDosePerLifetime": "bis zu einer maximalen Menge von {{quantityText}} über die Lebenszeit des Patienten", + "maxDosePerAdministration": "bis zu einer maximalen Menge von {{quantityText}} pro Dosis", "maxDosePerPeriod": "bis zu einer maximalen Menge von {{maxDosePerPeriodText}}" } } diff --git a/src/locales/en/common.json b/src/locales/en/common.json index 2c5d3313..a9fd243e 100644 --- a/src/locales/en/common.json +++ b/src/locales/en/common.json @@ -28,12 +28,15 @@ "denominator_other": ":{{count}}" } }, - "quantity": "{{quantity}} {{unit}}" + "quantity": { + "withUnit": "{{quantity}} {{unit}}", + "withoutUnit": "{{quantity}}" + } }, "fields": { - "doseQuantity": "{{quantity}} {{unit}}", + "doseQuantity": "{{quantityText}}", "doseRange": "{{rangeText}}", - "rateQuantity": "at a rate of {{quantity}} {{unit}}", + "rateQuantity": "at a rate of {{quantityText}}", "rateRange": "at a rate of {{rangeText}}", "rateRatio": "at a rate of {{ratioText}}", "duration": "over {{durationText}}", @@ -83,8 +86,8 @@ "event_one": "on {{event}}", "event_other": "on {{event}}" }, - "maxDosePerLifetime": "up to a maximum of {{count}} {{unit}} for the lifetime of patient", - "maxDosePerAdministration": "up to a maximum of {{count}} {{unit}} per dose", + "maxDosePerLifetime": "up to a maximum of {{quantityText}} for the lifetime of patient", + "maxDosePerAdministration": "up to a maximum of {{quantityText}} per dose", "maxDosePerPeriod": "up to a maximum of {{maxDosePerPeriodText}}" } } diff --git a/src/locales/fr/common.json b/src/locales/fr/common.json index adba5c7f..925311b6 100644 --- a/src/locales/fr/common.json +++ b/src/locales/fr/common.json @@ -28,12 +28,15 @@ "denominator_other": ":{{count}}" } }, - "quantity": "{{quantity}} {{unit}}" + "quantity": { + "withUnit": "{{quantity}} {{unit}}", + "withoutUnit": "{{quantity}}" + } }, "fields": { - "doseQuantity": "{{quantity}} {{unit}}", + "doseQuantity": "{{quantityText}}", "doseRange": "{{rangeText}}", - "rateQuantity": "au taux de {{quantity}} {{unit}}", + "rateQuantity": "au taux de {{quantityText}}", "rateRange": "au taux de {{rangeText}}", "rateRatio": "au taux de {{ratioText}}", "duration": "durant {{durationText}}", @@ -83,8 +86,8 @@ "event_one": "{{event}}", "event_other": "{{event}}" }, - "maxDosePerLifetime": "jusqu'à un maximum de {{count}} {{unit}} pour la durée de vie du patient", - "maxDosePerAdministration": "jusqu'à un maximum de {{count}} {{unit}} par dose", + "maxDosePerLifetime": "jusqu'à un maximum de {{quantityText}} pour la durée de vie du patient", + "maxDosePerAdministration": "jusqu'à un maximum de {{quantityText}} par dose", "maxDosePerPeriod": "jusqu'à un maximum de {{maxDosePerPeriodText}}" } } diff --git a/src/locales/nl/common.json b/src/locales/nl/common.json index 04656baf..e004f94d 100644 --- a/src/locales/nl/common.json +++ b/src/locales/nl/common.json @@ -28,12 +28,15 @@ "denominator_other": ":{{count}}" } }, - "quantity": "{{quantity}} {{unit}}" + "quantity": { + "withUnit": "{{quantity}} {{unit}}", + "withoutUnit": "{{quantity}}" + } }, "fields": { - "doseQuantity": "{{quantity}} {{unit}}", + "doseQuantity": "{{quantityText}}", "doseRange": "{{rangeText}}", - "rateQuantity": "met een verhouding van {{quantity}} {{unit}}", + "rateQuantity": "met een verhouding van {{quantityText}}", "rateRange": "met een verhouding van {{rangeText}}", "rateRatio": "met een verhouding van {{ratioText}}", "duration": "gedurende {{durationText}}", @@ -83,8 +86,8 @@ "event_one": "{{event}}", "event_other": "{{event}}" }, - "maxDosePerLifetime": "tot een maximum van {{count}} {{unit}} gedurende de levensduur van de patiënt", - "maxDosePerAdministration": "tot een maximum van {{count}} {{unit}} per dosis", + "maxDosePerLifetime": "tot een maximum van {{quantityText}} gedurende de levensduur van de patiënt", + "maxDosePerAdministration": "tot een maximum van {{quantityText}} per dosis", "maxDosePerPeriod": "tot een maximum van {{maxDosePerPeriodText}}" } } diff --git a/src/translators/doseQuantity.ts b/src/translators/doseQuantity.ts index 10ca318f..e44b2c64 100644 --- a/src/translators/doseQuantity.ts +++ b/src/translators/doseQuantity.ts @@ -1,4 +1,6 @@ +// Functions import { extractMatchingDoseAndRateFirstEntry } from "../internal/extractMatchingDoseAndRateFirstEntry"; +import { fromQuantityToString } from "../utils/fromQuantityToString"; // types import type { DisplayOrderParams } from "../types"; @@ -15,14 +17,12 @@ export function transformDoseQuantityToText({ return undefined; } - let quantity = doseQuantity.value || 1; - let unit = config.fromFHIRQuantityUnitToString({ - language: config.language, - quantity: doseQuantity, - }); - + // Otherwise rendering it return i18next.t("fields.doseQuantity", { - quantity: quantity, - unit: unit, + quantityText: fromQuantityToString({ + quantity: doseQuantity, + config, + i18next, + }), }); } diff --git a/src/translators/maxDosePerAdministration.ts b/src/translators/maxDosePerAdministration.ts index b56c8619..0f56798f 100644 --- a/src/translators/maxDosePerAdministration.ts +++ b/src/translators/maxDosePerAdministration.ts @@ -1,3 +1,6 @@ +// Functions +import { fromQuantityToString } from "../utils/fromQuantityToString"; + // types import type { DisplayOrderParams } from "../types"; @@ -12,13 +15,12 @@ export function transformMaxDosePerAdministrationToText({ } const maxDosePerAdministration = dos.maxDosePerAdministration; - let unit = config.fromFHIRQuantityUnitToString({ - language: config.language, - quantity: maxDosePerAdministration, - }); return i18next.t("fields.maxDosePerAdministration", { - count: maxDosePerAdministration.value || 1, - unit: unit, + quantityText: fromQuantityToString({ + quantity: maxDosePerAdministration, + config, + i18next, + }), }); } diff --git a/src/translators/maxDosePerLifetime.ts b/src/translators/maxDosePerLifetime.ts index d7ee371e..b62fee84 100644 --- a/src/translators/maxDosePerLifetime.ts +++ b/src/translators/maxDosePerLifetime.ts @@ -1,3 +1,6 @@ +// Functions +import { fromQuantityToString } from "../utils/fromQuantityToString"; + // types import type { DisplayOrderParams } from "../types"; @@ -12,13 +15,12 @@ export function transformMaxDosePerLifetimeToText({ } const maxDosePerLifetime = dos.maxDosePerLifetime; - let unit = config.fromFHIRQuantityUnitToString({ - language: config.language, - quantity: maxDosePerLifetime, - }); return i18next.t("fields.maxDosePerLifetime", { - count: maxDosePerLifetime.value || 1, - unit: unit, + quantityText: fromQuantityToString({ + quantity: maxDosePerLifetime, + config, + i18next, + }), }); } diff --git a/src/translators/rateQuantity.ts b/src/translators/rateQuantity.ts index b71d6391..5d1a7c42 100644 --- a/src/translators/rateQuantity.ts +++ b/src/translators/rateQuantity.ts @@ -1,4 +1,6 @@ +// Functions import { extractMatchingDoseAndRateFirstEntry } from "../internal/extractMatchingDoseAndRateFirstEntry"; +import { fromQuantityToString } from "../utils/fromQuantityToString"; // types import type { DisplayOrderParams } from "../types"; @@ -15,17 +17,11 @@ export function transformRateQuantityToText({ return undefined; } - // information from rate - let value = rateQuantity.value || 1; - - // quantity unit - let unit = config.fromFHIRQuantityUnitToString({ - language: config.language, - quantity: rateQuantity, - }); - return i18next.t("fields.rateQuantity", { - quantity: value, - unit: unit, + quantityText: fromQuantityToString({ + quantity: rateQuantity, + config, + i18next, + }), }); } diff --git a/src/types.ts b/src/types.ts index eff77b2a..8a4c851c 100644 --- a/src/types.ts +++ b/src/types.ts @@ -258,7 +258,7 @@ export type { I18N, InitOptions }; */ export type I18InitOptions = Exclude; -// Types for amount functions +// Types for translation functions export type RangeParams = { range: Range; config: Config; @@ -270,3 +270,9 @@ export type RatioParams = { config: Config; i18next: I18N; }; + +export type QuantityParams = { + quantity: Quantity; + config: Config; + i18next: I18N; +}; diff --git a/src/utils/fromQuantityToString.ts b/src/utils/fromQuantityToString.ts new file mode 100644 index 00000000..5db0ef3b --- /dev/null +++ b/src/utils/fromQuantityToString.ts @@ -0,0 +1,30 @@ +// Function + +// Type +import type { QuantityParams } from "../types"; + +// To cover all nasty cases of Quantity, only once +// https://build.fhir.org/datatypes.html#Quantity +export function fromQuantityToString({ + quantity, + config, + i18next, +}: QuantityParams): string | undefined { + // extract function for the unit display from config + const { fromFHIRQuantityUnitToString, language } = config; + + // Compute the result + let unit = fromFHIRQuantityUnitToString({ language, quantity }); + + // If no unit is present (in other words ""), we don't put it + if (unit.length === 0) { + return i18next.t("amount.quantity.withoutUnit", { + quantity: quantity.value, + }); + } else { + return i18next.t("amount.quantity.withUnit", { + quantity: quantity.value, + unit: unit, + }); + } +}