Files
website/src/client/site/common/inventory/inventory_controller.coffee
T

161 lines
5.8 KiB
CoffeeScript

#
# Crafting Guide - inventory_controller.coffee
#
# Copyright © 2014-2017 by Redwood Labs
# All rights reserved.
#
BaseController = require '../../base_controller'
ItemSelectorController = require '../item_selector/item_selector_controller'
StackController = require '../stack/stack_controller'
########################################################################################################################
###
Events:
clear(this)
change(this)
add(this, itemSlug)
button:first(this, itemSlug)
button:second(this, itemSlug)
###
module.exports = class InventoryController extends BaseController
@MAX_QUANTITY = 9999
@ONLY_DIGITS = /^[0-9]*$/
constructor: (options={})->
if not options.imageLoader? then throw new Error 'options.imageLoader is required'
if not options.modPack? then throw new Error 'options.modPack is required'
if not options.router? then throw new Error 'options.router is required'
@_imageLoader = options.imageLoader
@_modPack = options.modPack
@_router = options.router
@_editable = options.editable ?= true
@_icon = options.icon ?= '/images/chest_front.png'
@_firstButtonType = options.firstButtonType ?= null
@_isAcceptable = options.isAcceptable ?= null
@_secondButtonType = options.secondButtonType ?= null
@_shouldEnableButton = options.shouldEnableButton ?= (model, button)-> true
@_trackingContext = options.trackingContext ?= null
options.templateName = 'common/inventory'
super options
@_stackControllers = []
# Event Methods ################################################################################
onClearButtonClicked: ->
return unless @model?
return if @$clearButton.hasClass 'disabled'
tracker.trackEvent @_trackingContext, 'clear'
@model.clear()
@trigger c.event.clear, this
@trigger c.event.change, this
onFirstButtonClicked: (stackController)->
itemId = stackController.model?.item.id
tracker.trackEvent @_trackingContext, 'remove-from', itemId
@trigger c.event.button.first, this, itemId
onItemSelectorButtonClicked: ->
return unless @model?
tracker.trackEvent @_trackingContext, 'launch-add-to'
@_selector.launch()
.then (item)=>
if not item?
tracker.trackEvent @_trackingContext, 'cancel-add-to'
return
tracker.trackEvent @_trackingContext, 'complete-add-to', "#{item.id}"
@model.add item, 1
@trigger c.event.add, this, item.id
@trigger c.event.change, this
onSecondButtonClicked: (stackController)->
itemId = stackController.model?.item.id
@trigger c.event.button.second, this, stackController?.model?.itemSlug
# BaseController Overrides #####################################################################
onDidRender: ->
@_selector = @addChild ItemSelectorController, null, isAcceptable:@_isAcceptable, modPack:@_modPack
@$clearButton = @$('.button.clear')
@$emptyPlaceholder = @$('.empty_placeholder')
@$icon = @$('.icon')
@$itemContainer = @$('.item_container')
@$title = @$('h2 p')
super
refresh: ->
if @_editable
@_selector.show()
@show @$clearButton
else
@_selector.hide()
@hide @$clearButton
@$icon.attr 'src', @_icon
@_refreshStacks()
if not @model or @model.isEmpty
@show @$emptyPlaceholder
@$clearButton.addClass 'disabled'
else
@hide @$emptyPlaceholder
@$clearButton.removeClass 'disabled'
super
# Backbone.View Overrides ######################################################################
events: ->
return _.extend super,
'click .button.item-selector': 'onItemSelectorButtonClicked'
'click .button.clear': 'onClearButtonClicked'
'click button.first': 'onFirstButtonClicked'
'click button.second': 'onSecondButtonClicked'
# Private Methods ##############################################################################
_refreshStacks: ->
@_stackControllers ?= []
index = 0
if @model?
for itemId, stack of @model.stacks
controller = @_stackControllers[index]
if not controller?
controller = new StackController
editable: @_editable
firstButtonType: @_firstButtonType
imageLoader: @_imageLoader
model: stack
modPack: @_modPack
router: @_router
secondButtonType: @_secondButtonType
shouldEnableButton: @_shouldEnableButton
trackingContext: @_trackingContext
controller.on c.event.change, => @trigger c.event.change, this
controller.on c.event.button.first, (c)=> @onFirstButtonClicked(c)
controller.on c.event.button.second, (c)=> @onSecondButtonClicked(c)
controller.render()
@_stackControllers.push controller
@$itemContainer.append controller.$el
else
controller.model = stack
index += 1
while @_stackControllers.length > index
@_stackControllers.pop().remove()