jiskattema/spot

View on GitHub
src/router.js

Summary

Maintainability
A
50 mins
Test Coverage
var app = require('ampersand-app');
var Router = require('ampersand-router');
var HomePage = require('./pages/home');
var DatasetsPage = require('./pages/datasets');
var ConfigureDatasetPage = require('./pages/configure-dataset');
var ConfigureFacetPage = require('./pages/configure-facet');
var ConfigurePartitionPage = require('./pages/configure-partition');
var AnalyzePage = require('./pages/analyze');

/**
 * [exports description]
 * @module router
 */
module.exports = Router.extend({
  routes: {
    '': 'home',
    'home': 'home',
    'datasets': 'datasets',
    'analyze': 'analyze',

    'dataset/:id': 'configureDataset',
    'facet/:id': 'configureFacet',
    'partition/:id': 'configurePartition',
    'session=(*url)': 'getSession',
    '(*path)': 'catchAll'
  },

  // ------- ROUTE HANDLERS ---------
  home: function () {
    app.trigger('page', new HomePage({
      model: app.me
    }));
  },

  datasets: function () {
    app.trigger('page', new DatasetsPage({
      model: app.me
    }));
  },

  analyze: function () {
    app.trigger('page', new AnalyzePage({
      model: app.me.dataview,
      collection: app.me.dataview.filters
    }));
  },

  share: function () {
    app.trigger('page', new SharePage({
      model: app.me
    }));
  },

  configureDataset: function (id) {
    var dataset = app.me.datasets.get(id);
    if (dataset) {
      app.trigger('page', new ConfigureDatasetPage({
        model: dataset,
        collection: dataset.facets
      }));
    } else {
      this.home();
    }
  },

  configureFacet: function (id) {
    var dataset = null;
    var facet = null;

    // look for facet in app.me.datasets
    app.me.datasets.forEach(function (d) {
      facet = d.facets.get(id);
      if (facet) {
        dataset = d;
      }
    });

    // look for facet in app.me.dataview
    facet = app.me.dataview.facets.get(id);
    if (facet) {
      dataset = app.me.dataview;
    }

    if (dataset) {
      facet = dataset.facets.get(id);
      app.trigger('page', new ConfigureFacetPage({
        dataset: dataset,
        model: facet
      }));
    } else {
      this.home();
      console.error('Facet not found');
    }
  },

  configurePartition: function (id) {
    // Search over all filters and partitions in this dataset to find the right partition
    // Not very pretty, but the number of filters and filters per partition are small
    var partitionToEdit;
    var found = false;
    app.me.dataview.filters.forEach(function (filter) {
      filter.partitions.forEach(function (partition) {
        if (partition.getId() === id) {
          found = true;
          partitionToEdit = partition;
        }
      });
    });

    if (found) {
      app.trigger('page', new ConfigurePartitionPage({ model: partitionToEdit }));
    } else {
      this.home();
    }
  },
  getSession: function (url) {
    console.log('router.js: Getting a remote session from:', url);
    app.importRemoteSession(url);
  },
  catchAll: function () {
    this.redirectTo('');
  }
});