Files
website/src/client/site/header/header_controller.coffee
T

156 lines
5.2 KiB
CoffeeScript

#
# Crafting Guide - header_controller.coffee
#
# Copyright © 2014-2016 by Redwood Labs
# All rights reserved.
#
BaseController = require '../base_controller'
ItemSelectorController = require '../common/item_selector/item_selector_controller'
UrlParams = require '../url_params'
########################################################################################################################
module.exports = class HeaderController extends BaseController
constructor: (options={})->
if not options.modPack? then throw new Error 'options.modPack is required'
options.model ?= {}
options.templateName = 'header'
super options
@_modPack = options.modPack
global.site.on c.event.change + ':user', => @tryRefresh()
# Event Methods ################################################################################
onCraft: ->
tracker.trackEvent c.tracking.category.navigate, 'click-button', 'craft'
@router.navigate '/craft', trigger:true
return false
onBrowse: ->
tracker.trackEvent c.tracking.category.navigate, 'click-button', 'browse'
@router.navigate '/browse', trigger:true
return false
onLogin: ->
if global.site.user?
tracker.trackEvent c.tracking.category.account, 'logout'
global.site.logout()
else
tracker.trackEvent c.tracking.category.navigate, 'click-button', 'login'
@router.navigate '/login', trigger:true
return false
onNews: ->
tracker.trackEvent c.tracking.category.navigate, 'click-button', 'news'
@router.navigate '/news', trigger:true
return false
onSearch: (event, hint='')->
tracker.trackEvent c.tracking.category.search, 'launch'
@_selector.launch hint
.then (itemSlug)=>
if not itemSlug?
tracker.trackEvent c.tracking.category.search, 'cancel', itemSlug
return
tracker.trackEvent c.tracking.category.search, 'complete', itemSlug
itemDisplay = @_modPack.findItemDisplay itemSlug
@router.navigate itemDisplay.itemUrl, trigger:true
return false
# BaseController Overrides #####################################################################
onDidRender: ->
@_selector = @addChild ItemSelectorController, null, modPack: @_modPack
if global.env in c.productionEnvs
addThisUrl = 'http://s7.addthis.com/js/300/addthis_widget.js?pubid=ra-54f3c9717b2e530d'
$('body').append "<script async=\"async\" src=\"#{addThisUrl}\"></script>"
else
@$('.addthis_sharing_toolbox').addClass 'placeholder'
@$breadcrumbs = @$('.breadcrumbs')
@$extraNav = @$('.extra-nav')
@$loginButtonLabel = @$('.button.login p')
@$title = $('title')
@_checkForSearchRequest()
super
onWillChangeModel: (oldModel, newModel)->
if oldModel? then @stopListening oldModel.controller
@listenTo newModel.controller, c.event.change, => @tryRefresh()
return newModel
refresh: ->
@$loginButtonLabel.text if global.site.user? then "Logout" else "Login"
@_refreshBreadcrumbs()
@_refreshExtraNav()
@_refreshSelectedNavButton()
@_refreshTitle()
super
# Backbone.View Overrides ######################################################################
events: ->
_.extend super,
'click .craft': 'onCraft'
'click .browse': 'onBrowse'
'click .login': 'onLogin'
'click .news': 'onNews'
'click .search': 'onSearch'
'click .breadcrumb-bar a': 'routeLinkClick'
# Private Methods ##############################################################################
_checkForSearchRequest: ->
params = new UrlParams search:{type:'string'}
return unless params.search?
_.delay (=> @onSearch {}, params.search), c.duration.slow
_refreshBreadcrumbs: ->
breadcrumbs = @model?.controller?.getBreadcrumbs()
breadcrumbs ?= []
if breadcrumbs.length > 0
@$breadcrumbs.empty()
for crumb, index in breadcrumbs
if index isnt 0 then @$breadcrumbs.append $("<span>⟩</span>")
@$breadcrumbs.append crumb
@show @$breadcrumbs
else
@hide @$breadcrumbs
_refreshExtraNav: ->
return unless _.isFunction @model?.controller?.getExtraNav
extraNavContent = @model.controller.getExtraNav()
if extraNavContent?
@$extraNav.empty()
@$extraNav.append extraNavContent
@show @$extraNav
else
@hide @$extraNav
_refreshSelectedNavButton: ->
return unless @model?.page?
@$('.button').removeClass 'active'
@$(".button.#{@model.page}").addClass 'active'
_refreshTitle: ->
title = @model?.controller?.getTitle()
if title
@$title.text c.text.titleWithText text: title
else
@$title.text c.text.title()