diff --git a/app/static/app/js/classes/Units.js b/app/static/app/js/classes/Units.js index 4b36e36f..4da1e3a7 100644 --- a/app/static/app/js/classes/Units.js +++ b/app/static/app/js/classes/Units.js @@ -2,15 +2,25 @@ import { _ } from './gettext'; const units = { acres: { - factor: 1 / 4046.85642, - abbr: 'ac', + factor: (1 / (0.3048 * 0.3048)) / 43560, + abbr: 'ac', + round: 5 + }, + acres_us: { + factor: Math.pow(3937 / 1200, 2) / 43560, + abbr: 'ac (US)', round: 5 }, feet: { - factor: 3.28084, + factor: 1 / 0.3048, abbr: 'ft', round: 4 }, + feet_us:{ + factor: 3937 / 1200, + abbr: 'ft (US)', + round: 4 + }, hectares: { factor: 0.0001, abbr: 'ha', @@ -32,15 +42,25 @@ const units = { round: 1 }, miles: { - factor: 3.28084 / 5280, - abbr: 'mi', - round: 5 + factor: (1 / 0.3048) / 5280, + abbr: 'mi', + round: 5 + }, + miles_us: { + factor: (3937 / 1200) / 5280, + abbr: 'mi (US)', + round: 5 }, sqfeet: { - factor: 1 / 0.09290304, + factor: 1 / (0.3048 * 0.3048), abbr: 'ft²', round: 2 }, + sqfeet_us: { + factor: Math.pow(3937 / 1200, 2), + abbr: 'ft² (US)', + round: 2 + }, sqmeters: { factor: 1, abbr: 'm²', @@ -52,9 +72,14 @@ const units = { round: 5 }, sqmiles: { - factor: 0.000000386102, + factor: Math.pow((1 / 0.3048) / 5280, 2), abbr: 'mi²', round: 5 + }, + sqmiles_us: { + factor: Math.pow((3937 / 1200) / 5280, 2), + abbr: 'mi² (US)', + round: 5 } }; @@ -117,24 +142,71 @@ class ImperialSystem extends UnitSystem{ getName(){ return _("Imperial"); } + + feet(){ + return units.feet; + } + + sqfeet(){ + return units.sqfeet; + } + + miles(){ + return units.miles; + } + + sqmiles(){ + return units.sqmiles; + } + + acres(){ + return units.acres; + } lengthUnit(meters){ - const feet = units.feet.factor * meters; - if (feet >= 5280) return units.miles; - else return units.feet; + const feet = this.feet().factor * meters; + if (feet >= 5280) return this.miles(); + else return this.feet(); } areaUnit(sqmeters){ - const sqfeet = units.sqfeet.factor * sqmeters; - if (sqfeet >= 43560 && sqfeet < 27878400) return units.acres; - else if (sqfeet >= 27878400) return units.sqmiles; - else return units.sqfeet; + const sqfeet = this.sqfeet().factor * sqmeters; + if (sqfeet >= 43560 && sqfeet < 27878400) return this.acres(); + else if (sqfeet >= 27878400) return this.sqmiles(); + else return this.sqfeet(); + } +} + +class ImperialUSSystem extends ImperialSystem{ + getName(){ + return _("Imperial (US)"); + } + + feet(){ + return units.feet_us; + } + + sqfeet(){ + return units.sqfeet_us; + } + + miles(){ + return units.miles_us; + } + + sqmiles(){ + return units.sqmiles_us; + } + + acres(){ + return units.acres_us; } } const systems = { metric: new MetricSystem(), - imperial: new ImperialSystem() + imperial: new ImperialSystem(), + imperialUS: new ImperialUSSystem() } // Expose to allow every part of the app to access this information diff --git a/app/static/app/js/components/tests/Units.test.jsx b/app/static/app/js/components/tests/Units.test.jsx index f616890e..c268ed18 100644 --- a/app/static/app/js/components/tests/Units.test.jsx +++ b/app/static/app/js/components/tests/Units.test.jsx @@ -41,34 +41,38 @@ describe('Metric system', () => { }) }); -describe('Imperial system', () => { +describe('Imperial systems', () => { it('it should display units properly', () => { - const { imperial } = systems; + const { imperial, imperialUS } = systems; const lengths = [ - [1, "3.2808 ft"], - [0.01, "0.0328 ft"], - [0.0154, "0.0505 ft"], - [1609, "5,278.8716 ft"], - [1609.344, "1 mi"], - [3218.69, "2 mi"] + [1, "3.2808 ft", "3.2808 ft (US)"], + [0.01, "0.0328 ft", "0.0328 ft (US)"], + [0.0154, "0.0505 ft", "0.0505 ft (US)"], + [1609, "5,278.8714 ft", "5,278.8608 ft (US)"], + [1609.344, "1 mi", "5,279.9894 ft (US)"], + [1609.3472187, "1 mi", "1 mi (US)"], + [3218.69, "2 mi", "2 mi (US)"] ]; lengths.forEach(l => { - expect(imperial.length(l[0]).toString()).toBe(l[1]); + expect(imperial.length(l[0]).toString()).toBe(l[1]); + expect(imperialUS.length(l[0]).toString()).toBe(l[2]); }); const areas = [ - [1, "10.76 ft²"], - [9999, "2.47081 ac"], - [4046.86, "1 ac"], - [2587398.1, "639.35999 ac"], - [2.59e+6, "1 mi²"] + [1, "10.76 ft²", "10.76 ft² (US)"], + [9999, "2.47081 ac", "2.4708 ac (US)"], + [4046.86, "1 ac", "43,559.86 ft² (US)"], + [4046.87261, "1 ac", "1 ac (US)"], + [2587398.1, "639.35999 ac", "639.35744 ac (US)"], + [2.59e+6, "1 mi²", "1 mi² (US)"] ]; areas.forEach(a => { - expect(imperial.area(a[0]).toString()).toBe(a[1]); + expect(imperial.area(a[0]).toString()).toBe(a[1]); + expect(imperialUS.area(a[0]).toString()).toBe(a[2]); }); }) }); \ No newline at end of file