Plato on Github
Report Home
ampersand/template/shared/client/views/main.js
Maintainability
75.74
Lines of code
87
Difficulty
14.24
Estimated Errors
0.61
Function weight
By Complexity
By SLOC
// This app view is responsible for rendering all content that goes into // <html>. It's initted right away and renders itself on DOM ready. var app = require('ampersand-app'); var setFavicon = require('favicon-setter'); var View = require('ampersand-view'); var dom = require('ampersand-dom'); var ViewSwitcher = require('ampersand-view-switcher'); var _ = require('lodash'); var domify = require('domify'); var localLinks = require('local-links'); var templates = require('../templates'); module.exports = View.extend({ template: templates.body, autoRender: true, initialize: function () { // this marks the correct nav item selected this.listenTo(app, 'page', this.handleNewPage); }, events: { 'click a[href]': 'handleLinkClick' }, render: function () { // some additional stuff we want to add to the document head document.head.appendChild(domify(templates.head())); // main renderer this.renderWithTemplate(this); // init and configure our page switcher this.pageSwitcher = new ViewSwitcher(this.queryByHook('page-container'), { show: function (newView, oldView) { // it's inserted and rendered for me document.title = _.result(newView, 'pageTitle') || '{{{title}}}'; document.scrollTop = 0; // add a class specifying it's active dom.addClass(newView.el, 'active'); // store an additional reference, just because app.currentPage = newView; } }); // setting a favicon for fun (note, it's dynamic) setFavicon('/favicon.ico'); return this; }, handleNewPage: function (view) { // tell the view switcher to render the new one this.pageSwitcher.set(view); // mark the correct nav item selected this.updateActiveNav(); }, // Handles all `<a>` clicks in the app not handled // by another view. This lets us determine if this is // a click that should be handled internally by the app. handleLinkClick: function (e) { // This module determines whether a click event is // a local click (making sure the for modifier keys, etc) // and dealing with browser quirks to determine if this // event was from clicking an internal link. That we should // treat like local navigation. var localPath = localLinks.pathname(e); if (localPath) { e.preventDefault(); app.navigate(localPath); } }, updateActiveNav: function () { var path = window.location.pathname.slice(1); this.queryAll('.nav a[href]').forEach(function (aTag) { var aPath = aTag.pathname.slice(1); if ((!aPath && !path) || (aPath && path.indexOf(aPath) === 0)) { dom.addClass(aTag.parentNode, 'active'); } else { dom.removeClass(aTag.parentNode, 'active'); } }); } });