219 lines
8.1 KiB
CoffeeScript
219 lines
8.1 KiB
CoffeeScript
###
|
|
Crafting Guide - item_page_controller.coffee
|
|
|
|
Copyright (c) 2015 by Redwood Labs
|
|
All rights reserved.
|
|
###
|
|
|
|
AdsenseController = require './adsense_controller'
|
|
FullRecipeController = require './full_recipe_controller'
|
|
ImageLoader = require './image_loader'
|
|
Item = require '../models/item'
|
|
ItemGroupController = require './item_group_controller'
|
|
ItemPage = require '../models/item_page'
|
|
ItemSlug = require '../models/item_slug'
|
|
MarkdownSectionController = require './markdown_section_controller'
|
|
PageController = require './page_controller'
|
|
VideoController = require './video_controller'
|
|
{Duration} = require '../constants'
|
|
{Event} = require '../constants'
|
|
{Text} = require '../constants'
|
|
{Url} = require '../constants'
|
|
|
|
########################################################################################################################
|
|
|
|
module.exports = class ItemPageController extends PageController
|
|
|
|
constructor: (options={})->
|
|
if not options.itemSlug? then throw new Error 'options.itemSlug is required'
|
|
if not options.imageLoader? then throw new Error 'options.imageLoader is required'
|
|
if not options.modPack? then throw new Error 'options.modPack is required'
|
|
|
|
options.model ?= new ItemPage modPack:options.modPack
|
|
options.templateName ?= 'item_page'
|
|
|
|
super options
|
|
|
|
@imageLoader = options.imageLoader
|
|
@modPack = options.modPack
|
|
@_itemSlug = options.itemSlug
|
|
|
|
@modPack.on Event.change, => @tryRefresh()
|
|
|
|
# Event Methods ################################################################################
|
|
|
|
craftingPlanButtonClicked: ->
|
|
display = @modPack.findItemDisplay @model.item.slug
|
|
router.navigate display.craftingUrl, trigger:true
|
|
return false
|
|
|
|
# PageController Overrides #####################################################################
|
|
|
|
getTitle: ->
|
|
return @model.item?.name
|
|
|
|
# BaseController Overrides #####################################################################
|
|
|
|
onDidRender: ->
|
|
@adsenseController = @addChild AdsenseController, '.view__adsense', model:'sidebar_skyscraper'
|
|
|
|
options = imageLoader:@imageLoader, modPack:@modPack, show:false
|
|
@_descriptionController = @addChild MarkdownSectionController, '.section.description', options
|
|
@_similarItemsController = @addChild ItemGroupController, '.view__item_group.similar', options
|
|
@_usedAsToolToMakeController = @addChild ItemGroupController, '.view__item_group.usedAsToolToMake', options
|
|
@_usedToMakeController = @addChild ItemGroupController, '.view__item_group.usedToMake', options
|
|
|
|
@$byline = @$('.byline')
|
|
@$bylineLink = @$('.byline a')
|
|
@$descriptionSection = @$('.description')
|
|
@$name = @$('h1.name')
|
|
@$officialPageLink = @$('a.officialPage')
|
|
@$recipeContainer = @$('.recipes .panel')
|
|
@$recipesSection = @$('.recipes')
|
|
@$recipesSectionTitle = @$('.recipes h2')
|
|
@$similarSection = @$('.similar')
|
|
@$titleImage = @$('.titleImage img')
|
|
@$usedAsToolToMakeSection = @$('.usedAsToolToMake')
|
|
@$usedToMakeSection = @$('.usedToMake')
|
|
@$videosContainer = @$('.videos .panel')
|
|
@$videosSection = @$('.videos')
|
|
@$videosSectionTitle = @$('.videos h2')
|
|
super
|
|
|
|
refresh: ->
|
|
@_resolveItemSlug()
|
|
|
|
if @model.item?
|
|
display = @modPack.findItemDisplay @model.item.slug
|
|
@imageLoader.load display.iconUrl, @$titleImage
|
|
@$name.html display.itemName
|
|
|
|
if @model.item.officialUrl?
|
|
@$officialPageLink.attr 'href', @model.item.officialUrl
|
|
@show @$officialPageLink
|
|
else
|
|
@hide @$officialPageLink
|
|
|
|
@show()
|
|
else
|
|
@hide()
|
|
|
|
@_refreshByline()
|
|
@_refreshDescription()
|
|
@_refreshRecipes()
|
|
@_refreshSimilarItems()
|
|
@_refreshUsedAsToolToMake()
|
|
@_refreshUsedToMake()
|
|
@_refreshVideos()
|
|
|
|
super
|
|
|
|
# Backbone.View Overrides ######################################################################
|
|
|
|
events: ->
|
|
return _.extend super,
|
|
'click a.craftingPlan': 'routeLinkClick'
|
|
'click .byline a': 'routeLinkClick'
|
|
'click .markdown a': 'routeLinkClick'
|
|
'click button': 'craftingPlanButtonClicked'
|
|
|
|
# Private Methods ##############################################################################
|
|
|
|
_refreshByline: ->
|
|
mod = @model.item?.modVersion?.mod
|
|
if mod?.name?.length > 0
|
|
@$bylineLink.attr 'href', Url.mod modSlug:mod.slug
|
|
@$bylineLink.html mod.name
|
|
|
|
@show @$byline
|
|
else
|
|
@hide @$byline
|
|
|
|
_refreshDescription: ->
|
|
if @model.item?.description?.length > 0
|
|
@_descriptionController.model = @model.item.description
|
|
@show @$descriptionSection
|
|
else
|
|
@hide @$descriptionSection
|
|
|
|
_refreshRecipes: ->
|
|
@_recipeControllers ?= []
|
|
index = 0
|
|
|
|
recipes = @model.findRecipes()
|
|
if recipes?.length > 0
|
|
@$recipesSectionTitle.html if recipes.length is 1 then 'Recipe' else 'Recipes'
|
|
|
|
for recipe in @model.findRecipes()
|
|
controller = @_recipeControllers[index]
|
|
if not controller?
|
|
controller = new FullRecipeController imageLoader:@imageLoader, modPack:@modPack, model:recipe
|
|
@_recipeControllers.push controller
|
|
@$recipeContainer.append controller.$el
|
|
controller.render()
|
|
else
|
|
controller.model = recipe
|
|
index++
|
|
|
|
@show @$recipesSection
|
|
else
|
|
@hide @$recipesSection
|
|
|
|
while @_recipeControllers.length > index
|
|
@_recipeControllers.pop().remove()
|
|
|
|
_refreshSimilarItems: ->
|
|
group = @model.item?.group
|
|
if group? and group isnt Item.Group.Other
|
|
@_similarItemsController.title = "Other #{group}"
|
|
@_similarItemsController.model = @model.findSimilarItems()
|
|
else
|
|
@_similarItemsController.model = null
|
|
|
|
_refreshUsedAsToolToMake: ->
|
|
@_usedAsToolToMakeController.title = 'Used as Tool to Make'
|
|
@_usedAsToolToMakeController.model = @model.findToolForRecipes()
|
|
|
|
_refreshUsedToMake: ->
|
|
@_usedToMakeController.title = 'Used to Make'
|
|
@_usedToMakeController.model = @model.findComponentInItems()
|
|
|
|
_refreshVideos: ->
|
|
@_videoControllers ?= []
|
|
index = 0
|
|
|
|
videos = @model?.item?.videos or []
|
|
if videos? and videos.length > 0
|
|
@$videosSectionTitle.html if videos.length is 1 then 'Video' else 'Videos'
|
|
|
|
for video in videos
|
|
controller = @_videoControllers[index]
|
|
if not controller?
|
|
controller = new VideoController model:video
|
|
@_videoControllers.push controller
|
|
controller.render()
|
|
@$videosContainer.append controller.$el
|
|
else
|
|
controller.model = video
|
|
index++
|
|
|
|
@show @$videosSection
|
|
else
|
|
@hide @$videosSection
|
|
|
|
while @_videoControllers.length > index
|
|
@_videoControllers.pop().remove()
|
|
|
|
_resolveItemSlug: ->
|
|
return if @model.item?
|
|
|
|
item = @modPack.findItem @_itemSlug, includeDisabled:true
|
|
if item?
|
|
if not ItemSlug.equal item.slug, @_itemSlug
|
|
router.navigate Url.item(modSlug:item.slug.mod, itemSlug:item.slug.item), trigger:true
|
|
return
|
|
|
|
@model.item = item
|
|
item.fetch()
|
|
item.on Event.sync, => @refresh()
|