openfoodfoundation/openfoodnetwork

View on GitHub
app/webpacker/js/services/variant_unit_manager.js

Summary

Maintainability
A
0 mins
Test Coverage
// Requires global variable from page: ofn_available_units_sorted

export default class VariantUnitManager {
  constructor() {
    this.units = this.#loadUnits(ofn_available_units_sorted);
  }

  getUnitName(scale, unitType) {
    if (this.units[unitType][scale]) {
      return this.units[unitType][scale]['name'];
    } else {
      return '';
    }
  };

 // Filter by measurement system
  compatibleUnitScales(scale, unitType) {
    const scaleSystem = this.units[unitType][scale]['system'];

    return Object.entries(this.units[unitType])
      .filter(([scale, scaleInfo]) => {
        return scaleInfo['system'] == scaleSystem;
      })
      .map(([scale, _]) => parseFloat(scale))
      .sort();
  }

  // private

  #loadUnits(units) {
    // Transform unit scale to a JS Number for compatibility. This would be way simpler in Ruby or Coffeescript!!
    const unitsTransformed = Object.entries(units).map(([measurement, measurementInfo]) => {
      const measurementInfoTransformed = Object.fromEntries(Object.entries(measurementInfo).map(([scale, unitInfo]) =>
        [ parseFloat(scale), unitInfo ]
      ));
      return [ measurement, measurementInfoTransformed ];
    });
    return Object.fromEntries(unitsTransformed);
  }
}