CartoDB/cartodb20

View on GitHub
lib/assets/javascripts/dashboard/components/dashboard-header/breadcrumbs/dropdown-view.js

Summary

Maintainability
C
7 hrs
Test Coverage
const $ = require('jquery');
const checkAndBuildOpts = require('builder/helpers/required-opts');
const navigateThroughRouter = require('builder/helpers/navigate-through-router');
const AdminDropdownMenu = require('dashboard/components/dropdown/dropdown-admin-view');

const REQUIRED_OPTS = [
  'viewModel'
];

/**
 * The content of the dropdown menu opened by the link at the end of the breadcrumbs menu, e.g.
 *   username > [Maps]
 *          ______/\____
 *         |            |
 *         |    this    |
 *         |____________|
 */

module.exports = AdminDropdownMenu.extend({
  className: 'Dropdown BreadcrumbsDropdown',

  events: {
    'click a': '_navigateToLinksHref'
  },

  initialize: function (options) {
    checkAndBuildOpts(options, REQUIRED_OPTS, this);
    AdminDropdownMenu.prototype.initialize.apply(this, arguments);
  },

  render: function () {
    var dashboardUrl = this.model.viewUrl().dashboard();
    var datasetsUrl = dashboardUrl.datasets();
    var deepInsightsUrl = dashboardUrl.deepInsights();
    var mapsUrl = dashboardUrl.maps();

    this.$el.html(this.template({
      avatarUrl: this.model.get('avatar_url'),
      userName: this.model.get('username'),
      mapsUrl: mapsUrl,
      datasetsUrl: datasetsUrl,
      deepInsightsUrl: deepInsightsUrl,
      lockedDatasetsUrl: datasetsUrl.lockedItems(),
      lockedMapsUrl: mapsUrl.lockedItems(),
      isDeepInsights: this._viewModel.isDisplayingDeepInsights(),
      isDatasets: this._viewModel.isDisplayingDatasets(),
      isMaps: this._viewModel.isDisplayingMaps(),
      isLocked: this._viewModel.isDisplayingLockedItems()
    }));

    // Necessary to hide dialog on click outside popup, for example.
    // TODO: Handle this
    // cdb.god.bind('closeDialogs', this.hide, this);

    // TODO: taken from existing code, how should dropdowns really be added to the DOM?
    $('body').append(this.el);

    return this;
  },

  _navigateToLinksHref: function () {
    this.hide(); // Hide must be called before routing for proper deconstruct of dropdown

    if (this.options.router) {
      navigateThroughRouter.apply(this, arguments);
    }
  }
});