• Jump To … +
    app.js autocompleteSearch.js foodSearch.js nutritionTracker.js recipeSearch.js autocomplete.js food.js nutrition.js recipe.js namespace.js router.js templates.js foodSearchView.js nutritionEditorView.js nutritionTrackerView.js nutritionView.js recipeSearchView.js startView.js tabView.js
  • nutrition.js

  • ¶
    /** Model for nutrition label data
     * @namespace nt.Models
     * @class nt.Models.Nutrition
     * @memberof! <global>
     * @extends Backbone.Model */
    nt.Models.Nutrition = Backbone.Model.extend(/** @lends nt.Models.Nutrition# */{
    
        /** Default attributes */
        defaults: function() {
            return {
                width: 280,
                id: '',
                itemName: '',
                servingCount: 1,
                moreThanOne: false,
    
                showPolyFat: false,
                showMonoFat: false,
                showIngredients: false,
    
                valueServingSize: 0,
                valueServingSizeUnit: '',
    
                valueCalories: 0,
                valueFatCalories: 0,
                valueTotalFat: 0,
                valueSatFat: 0,
                valueTransFat: 0,
                valueCholesterol: 0,
                valueSodium: 0,
                valueTotalCarb: 0,
                valueFibers: 0,
                valueSugars: 0,
                valueProteins: 0,
                valueVitaminA: 0,
                valueVitaminC: 0,
                valueCalcium: 0,
                valueIron: 0
            };
        },
    
        /** Nutritionix API /item will return an object with all nutrition data */
        url: 'https://api.nutritionix.com/v1_1/item/',
    
        /** Override parse and return response attributes */
        parse: function(data) {
  • ¶

    Only parse response if data from API

            if (data.hasOwnProperty('item_id')) {
            var label = {};
                label.width                = 280;
                label.id                   = data.item_id;
                label.itemName             = data.item_name;
                label.servingCount         = 1;
                label.moreThanOne          = false;
                label.showPolyFat          = false;
                label.showMonoFat          = false;
                label.showIngredients      = false;
                label.valueServingSize     = data.nf_serving_size_qty;
                label.valueServingSizeUnit = data.nf_serving_size_unit;
                label.valueCalories        = data.nf_calories;
                label.valueFatCalories     = data.nf_calories_from_fat;
                label.valueTotalFat        = data.nf_total_fat;
                label.valueSatFat          = data.nf_saturated_fat;
                label.valueTransFat        = data.nf_trans_fatty_acid;
                label.valueCholesterol     = data.nf_cholesterol;
                label.valueSodium          = data.nf_sodium;
                label.valueTotalCarb       = data.nf_total_carbohydrate;
                label.valueFibers          = data.nf_dietary_fiber;
                label.valueSugars          = data.nf_sugars;
                label.valueProteins        = data.nf_protein;
                label.valueVitaminA        = data.nf_vitamin_a_dv;
                label.valueVitaminC        = data.nf_vitamin_c_dv;
                label.valueCalcium         = data.nf_calcium_dv;
                label.valueIron            = data.nf_iron_dv;
    
                return label;
            } else
                return data;
    
        }, // parse
    
        /** Model validation for editable attributes */
        validate: function(attrs, options) {
  • ¶

    Check if property exists since it is not a default attribute

            if(attrs.hasOwnProperty('trackDate')) {
                if (attrs.trackDate === '') {
                    return 'Date cannot be blank.';
                }
  • ¶

    Use momentjs to validate date format http://momentjs.com/docs/#/parsing/string-format/

                var valid = moment(attrs.trackDate, 'YYYY-MM-DD', true).isValid();
                if(!valid) {
                    return 'Date must be in YYYY-MM-DD format.';
                }
    
            } // trackDate
  • ¶

    Make sure the name isn’t blank

            if (attrs.itemName === '') {
                return 'Food name cannot be blank.';
    
            } // itemName
    
        }, // validate
    
        /** Multiplies value attributes by number of servings */
        valueUpdate: function(attributes, num) {
            var keys = [
                'valueCalories',
                'valueFatCalories',
                'valueTotalFat',
                'valueSatFat',
                'valueTransFat',
                'valueCholesterol',
                'valueSodium',
                'valueTotalCarb',
                'valueFibers',
                'valueSugars',
                'valueProteins',
                'valueVitaminA',
                'valueVitaminC',
                'valueCalcium',
                'valueIron'
            ];
            var newListObj = _.pick(attributes, keys);
            var val = 0;
            var key = '';
            var newVal = 0;
    
            for (key in newListObj) {
                val = newListObj[key];
  • ¶

    Check if the value is not falsy (0 or null)

                if(val) {
                    newVal = val * num;
  • ¶

    If not a whole number, show only 2 decimal places

                    if( Number.isInteger(newVal) )
                        newListObj[key] = newVal;
                    else
                        newListObj[key] = Number(newVal).toFixed(2);
                }
    
            } // for
  • ¶

    Update the servings-template flag

            if(num > 1)
                newListObj['moreThanOne'] = true;
            else
                newListObj['moreThanOne'] = false;
    
            newListObj['servingCount'] = num;
  • ¶

    Update the values for the selected model attributes

            this.set(newListObj);
    
        } // valueUpdate
    
    });