fix: Show minimum value for quantity (#7077)

This commit is contained in:
Michael Genson
2026-02-15 13:08:07 -06:00
committed by GitHub
parent 91fea086e5
commit 6d7b6bccab
2 changed files with 47 additions and 2 deletions

View File

@@ -205,4 +205,34 @@ describe("parseIngredientText", () => {
expect(parseIngredientText(ingredient)).toEqual("2 tablespoons diced onion"); expect(parseIngredientText(ingredient)).toEqual("2 tablespoons diced onion");
}); });
test("decimal below minimum precision shows < 0.001", () => {
const ingredient = createRecipeIngredient({
quantity: 0.0001,
unit: { id: "1", name: "cup", useAbbreviation: false },
food: { id: "1", name: "salt" },
});
expect(parseIngredientText(ingredient)).toEqual("&lt; 0.001 cup salt");
});
test("fraction below minimum denominator shows < 1/10", () => {
const ingredient = createRecipeIngredient({
quantity: 0.05,
unit: { id: "1", name: "cup", fraction: true, useAbbreviation: false },
food: { id: "1", name: "salt" },
});
expect(parseIngredientText(ingredient)).toEqual("&lt; <sup>1</sup><span></span><sub>10</sub> cup salt");
});
test("fraction below minimum denominator without formatting shows < 1/10", () => {
const ingredient = createRecipeIngredient({
quantity: 0.05,
unit: { id: "1", name: "cup", fraction: true, useAbbreviation: false },
food: { id: "1", name: "salt" },
});
expect(parseIngredientText(ingredient, 1, false)).toEqual("&lt; 1/10 cup salt");
});
}); });

View File

@@ -5,6 +5,9 @@ import type { CreateIngredientFood, CreateIngredientUnit, IngredientFood, Ingred
const { frac } = useFraction(); const { frac } = useFraction();
const FRAC_MIN_DENOM = 10;
const DECIMAL_PRECISION = 3;
export function sanitizeIngredientHTML(rawHtml: string) { export function sanitizeIngredientHTML(rawHtml: string) {
return DOMPurify.sanitize(rawHtml, { return DOMPurify.sanitize(rawHtml, {
USE_PROFILES: { html: true }, USE_PROFILES: { html: true },
@@ -91,11 +94,19 @@ export function useIngredientTextParser() {
// casting to number is required as sometimes quantity is a string // casting to number is required as sometimes quantity is a string
if (quantity && Number(quantity) !== 0) { if (quantity && Number(quantity) !== 0) {
const scaledQuantity = Number((quantity * scale));
if (unit && !unit.fraction) { if (unit && !unit.fraction) {
returnQty = Number((quantity * scale).toPrecision(3)).toString(); const minVal = 10 ** -DECIMAL_PRECISION;
returnQty = scaledQuantity >= minVal
? Number(scaledQuantity.toPrecision(DECIMAL_PRECISION)).toString()
: `< ${minVal}`;
} }
else { else {
const fraction = frac(quantity * scale, 10, true); const minVal = 1 / FRAC_MIN_DENOM;
const isUnderMinVal = !(scaledQuantity >= minVal);
const fraction = !isUnderMinVal ? frac(scaledQuantity, FRAC_MIN_DENOM, true) : [0, 1, FRAC_MIN_DENOM];
if (fraction[0] !== undefined && fraction[0] > 0) { if (fraction[0] !== undefined && fraction[0] > 0) {
returnQty += fraction[0]; returnQty += fraction[0];
} }
@@ -105,6 +116,10 @@ export function useIngredientTextParser() {
? `<sup>${fraction[1]}</sup><span>&frasl;</span><sub>${fraction[2]}</sub>` ? `<sup>${fraction[1]}</sup><span>&frasl;</span><sub>${fraction[2]}</sub>`
: ` ${fraction[1]}/${fraction[2]}`; : ` ${fraction[1]}/${fraction[2]}`;
} }
if (isUnderMinVal) {
returnQty = `< ${returnQty}`;
}
} }
} }