conveyal/modeify

View on GitHub
client/filter-view/index.js

Summary

Maintainability
A
0 mins
Test Coverage
var debounce = require('debounce')
var reactiveSelect = require('../reactive-select')
var view = require('../view')
var session = require('../session')

var View = module.exports = view(require('./template.html'), function (view, plan) {
  view.reactive.use(reactiveSelect)
  view.on('active', function () {
    plan.updateRoutes()
  })
  view.on('selected', function () {
    plan.updateRoutes()
  })
})

var times = hourOptions()

View.prototype.startTimes = function () {
  return times.slice(0, -1)
}

View.prototype.endTimes = function () {
  return times.slice(1)
}

View.prototype.bikeSpeeds = function () {
  return [4, 6, 8, 10].map(function (s) {
    return {
      name: s + ' mph',
      value: s
    }
  })
}

View.prototype.bikeTrafficStressLevels = function () {
  return [1, 2, 3, 4].map(function (l) {
    return {
      name: 'Level ' + l,
      value: l
    }
  })
}

View.prototype.walkSpeeds = function () {
  return [2.3, 3, 4].map(function (s) {
    return {
      name: parseInt(s, 10) + ' mph  ',
      value: s
    }
  })
}

View.prototype.parseInt = parseInt

function hourOptions () {
  var times = []
  for (var i = 0; i <= 24; i++) {
    times.push(toOption(i))
  }
  return times
}

function toOption (n) {
  var opt = {
    name: '',
    value: n
  }

  if (n > 23 || n === 0) opt.name = 'Midnight'
  else if (n > 12) opt.name = n - 12 + 'pm'
  else if (n === 12) opt.name = 'Noon'
  else opt.name = n + 'am'

  return opt
}

View.prototype.showSettings = function () {
  this.find('.ExpandedSettings').classList.add('open')
}

View.prototype.hideSettings = function () {
  this.find('.ExpandedSettings').classList.remove('open')
}

View.prototype.save = debounce(function (e) {
  var names = ['maxBikeTime', 'maxWalkTime', 'carParkingCost', 'carCostPerMile']
  var self = this
  var values = {}
  names.forEach(function (n) {
    values[n] = parseFloat(self.find('input[name=' + n + ']').value)
  })
  var scorer = this.model.scorer()
  scorer.rates.carParkingCost = values.carParkingCost
  scorer.rates.mileageRate = values.carCostPerMile
  this.model.set(values)
  this.model.updateRoutes()
  this.saveProfile()
}, 1000)

View.prototype.saveProfile = function () {
  var self = this

  if (session.user()) {
    setTimeout(function () {
      var userMetadata = session.user().user_metadata()
      if (!userMetadata.modeify_opts) userMetadata.modeify_opts = {}
      userMetadata.modeify_opts.bikeSpeed = self.model.bikeSpeed()
      userMetadata.modeify_opts.walkSpeed = self.model.walkSpeed()
      userMetadata.modeify_opts.maxBikeTime = self.model.maxBikeTime()
      userMetadata.modeify_opts.maxWalkTime = self.model.maxWalkTime()
      userMetadata.modeify_opts.carParkingCost = self.model.carParkingCost()
      userMetadata.modeify_opts.carCostPerMile = self.model.carCostPerMile()
      userMetadata.modeify_opts.bikeTrafficStress = self.model.bikeTrafficStress()

      session.user().user_metadata(userMetadata)
      session.user().saveUserMetadata(function () {}) // TODO: handle error
    }, 1000)
  }
}