Initial effort to convert craft page to new models

This commit is contained in:
Andrew Miner
2017-07-01 18:06:11 -07:00
parent 997ff114b4
commit 20119cf8e4
20 changed files with 459 additions and 406 deletions
@@ -5,39 +5,47 @@
# All rights reserved.
#
BaseController = require '../../base_controller'
SlotController = require '../slot/slot_controller'
BaseController = require "../../base_controller"
{Recipe} = require("crafting-guide-common").models
SlotController = require "../slot/slot_controller"
########################################################################################################################
module.exports = class CraftingGridController extends BaseController
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'
# options.model should be a recipe
options.templateName = 'common/crafting_grid'
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"
options.templateName = "common/crafting_grid"
super options
@_imageLoader = options.imageLoader
@_modPack = options.modPack
@_router = options.router
@_modPack.on c.event.change, => @tryRefresh()
# BaseController Methods #######################################################################
onWillChangeModel: (oldModel, newModel)->
if newModel? and (newModel.constructor isnt Recipe) then throw new Error "options.model must be a Recipe"
super
onDidRender: ->
@_slotControllers = []
for el in @$('.view__slot')
for el in @$(".view__slot")
controller = new SlotController el:el, imageLoader:@_imageLoader, modPack:@_modPack, router:@_router
controller.render()
@_slotControllers.push controller
super
refresh: ->
for controller, index in @_slotControllers
controller.model = @model?.getStackAtSlot(index)
index = 0
for y in [0..2]
for x in [0..2]
controller = @_slotControllers[index++]
if @model?
controller.model = @model.getInputAt x, y
else
controller.model = null
super
@@ -47,8 +47,6 @@ module.exports = class InventoryController extends BaseController
@_stackControllers = []
@listenTo @_modPack, c.event.change, => @tryRefresh()
# Event Methods ################################################################################
onClearButtonClicked: ->
@@ -61,31 +59,33 @@ module.exports = class InventoryController extends BaseController
@trigger c.event.change, this
onFirstButtonClicked: (stackController)->
tracker.trackEvent @_trackingContext, 'remove-from', "#{stackController?.model?.itemSlug}"
@trigger c.event.button.first, this, stackController?.model?.itemSlug
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 (itemSlug)=>
if not itemSlug?
.then (item)=>
if not item?
tracker.trackEvent @_trackingContext, 'cancel-add-to'
return
tracker.trackEvent @_trackingContext, 'complete-add-to', "#{itemSlug}"
@model.add itemSlug, 1
@trigger c.event.add, this, itemSlug
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
@_selector = @addChild ItemSelectorController, null, isAcceptable:@_isAcceptable, modPack:@_modPack
@$clearButton = @$('.button.clear')
@$emptyPlaceholder = @$('.empty_placeholder')
@@ -131,7 +131,7 @@ module.exports = class InventoryController extends BaseController
index = 0
if @model?
@model.each (stack)=>
for itemId, stack of @model.stacks
controller = @_stackControllers[index]
if not controller?
controller = new StackController
@@ -153,6 +153,7 @@ module.exports = class InventoryController extends BaseController
@$itemContainer.append controller.$el
else
controller.model = stack
index += 1
while @_stackControllers.length > index
@@ -5,58 +5,63 @@
# All rights reserved.
#
BaseController = require '../../../base_controller'
BaseController = require "../../../base_controller"
ItemDisplay = require "../../../../models/site/item_display"
########################################################################################################################
module.exports = class ElementController extends BaseController
constructor: (options={})->
if not options.model? then throw new Error 'options.model is required'
options.onClicked ?= (controller)-> # do nothing
options.onSelected ?= (controller)-> # do nothing
options.templateName = 'common/item_selector/element'
if not options.model? then throw new Error "options.model is required"
options.templateName = "common/item_selector/element"
options.useAnimations = false
super options
@onClicked = options.onClicked
@onSelected = options.onSelected
@onClicked = options.onClicked or (controller)-> # do nothing
@onSelected = options.onSelected or (controller)-> # do nothing
# Property Methods #############################################################################
isSelected: ->
return @_selected
setSelected: (newSelected)->
oldSelected = @_selected
return if newSelected is oldSelected
@_selected = newSelected
@tryRefresh()
@trigger c.event.change + ':selected', this, oldSelected, newSelected
@trigger c.event.change, this
Object.defineProperties @prototype,
selected: {get:@prototype.isSelected, set:@prototype.setSelected}
display:
get: -> return @_display ?= new ItemDisplay @model
set: -> throw new Error "display cannot be assigned"
isSelected:
get: -> return @_selected
set: (newSelected)->
oldSelected = @_selected
return if newSelected is oldSelected
@_selected = newSelected
@tryRefresh()
@trigger c.event.change + ":selected", this, oldSelected, newSelected
@trigger c.event.change, this
# BaseController Overrides #####################################################################
onDidModelChange: ->
@_display = null
super
onDidRender: ->
@$icon = @$('img')
@$name = @$('.name')
@$modName = @$('.modName')
@$icon = @$("img")
@$name = @$(".name")
@$modName = @$(".modName")
super
refresh: ->
@$icon.attr 'src', @model.iconUrl
@$name.html @model.itemName
@$modName.html @model.modName
@$icon.attr "src", @display.iconUrl
@$name.html @model.displayName
@$modName.html @model.mod.displayName
if @_selected
@$el.addClass 'selected'
@$el.addClass "selected"
else
@$el.removeClass 'selected'
@$el.removeClass "selected"
super
@@ -64,15 +69,15 @@ module.exports = class ElementController extends BaseController
events: ->
return _.extend super,
'click': '_onClick'
'mouseenter': '_onMouseEnter'
"click": "_onClick"
"mouseenter": "_onMouseEnter"
# Private Methods ##############################################################################
_onClick: (event)->
event.preventDefault()
@onClicked this
return false
_onMouseEnter: (event)->
event.preventDefault()
@onSelected this
return false
@@ -5,21 +5,22 @@
# All rights reserved.
#
BaseController = require '../../base_controller'
ItemSelector = require '../../../models/site/item_selector'
ElementController = require './element/element_controller'
BaseController = require "../../base_controller"
ItemDisplay = require "../../../models/site/item_display"
ItemSelector = require "../../../models/site/item_selector"
ElementController = require "./element/element_controller"
w = require "when"
########################################################################################################################
module.exports = class ItemSelectorController extends BaseController
constructor: (options)->
if not options.modPack? then throw new Error 'options.modPack is required'
constructor: (options={})->
if not options.modPack? then throw new Error "options.modPack is required"
options.isAcceptable ?= null
options.model ?= new ItemSelector {}, modPack:options.modPack, isAcceptable:options.isAcceptable
options.model ?= new ItemSelector options.modPack, isAcceptable:options.isAcceptable
options.onChoseItem ?= (item)-> # do nothing
options.templateName = 'common/item_selector'
options.templateName = "common/item_selector"
super options
@_modPack = options.modPack
@@ -29,25 +30,25 @@ module.exports = class ItemSelectorController extends BaseController
# Public Methods ###############################################################################
launch: (hint='')->
launch: (hint="")->
@model.hint = hint
if @rendered then @refresh()
@_disableWindowScrolling()
@$page.addClass 'blur'
@$page.addClass "blur"
@$screen.append @$popup
@$screen.css 'display', ''
@$screen.css "display", ""
@$popup.off c.event.click
@$popup.on c.event.click, (event)=> @onPopupClicked(event)
@$hintField.off 'keyup input'
@$hintField.on 'keyup', (event)=> @onHintKeyPress(event)
@$hintField.on 'input', (event)=> @onHintChanged(event)
@$hintField.off "keyup input"
@$hintField.on "keyup", (event)=> @onHintKeyPress(event)
@$hintField.on "input", (event)=> @onHintChanged(event)
@$hintField.focus()
@$closeButton.one 'click', (event)=> @_close()
@$closeButton.one "click", (event)=> @_close()
@$screen.one c.event.click, (event)=> @onScreenClicked(event)
@@ -85,17 +86,17 @@ module.exports = class ItemSelectorController extends BaseController
return false
onResultClicked: (controller)->
@_session.resolve controller.model.slug
@_session.resolve controller.model
@_session = null
@_close()
return false
onResultSelected: (controller)->
for c in @_elementControllers
c.selected = false
c.isSelected = false
if controller?
controller.selected = true
controller.isSelected = true
return false
@@ -106,14 +107,14 @@ module.exports = class ItemSelectorController extends BaseController
# BaseController Overrides #####################################################################
onDidRender: ->
@$page = $('.page') # find the shared, global page
@$screen = $('.view__screen') # find the shared, global screen
@$page = $(".page") # find the shared, global page
@$screen = $(".view__screen") # find the shared, global screen
@$closeButton = @$('img.close')
@$popup = @$('.view__item_selector_popup')
@$hintField = @$('.view__item_selector_popup input')
@$searchInput = @$('.search input')
@$resultsContainer = @$('.results')
@$closeButton = @$("img.close")
@$popup = @$(".view__item_selector_popup")
@$hintField = @$(".view__item_selector_popup input")
@$searchInput = @$(".search input")
@$resultsContainer = @$(".results")
@$popup.detach()
super
@@ -127,16 +128,16 @@ module.exports = class ItemSelectorController extends BaseController
_chooseSelected: ->
for controller in @_elementControllers
if controller.selected
if controller.isSelected
@onResultClicked controller
return
_close: ->
@_enableWindowScrolling()
@$page.removeClass 'blur'
@$screen.css 'display', 'none'
@$page.removeClass "blur"
@$screen.css "display", "none"
@$popup.detach()
@model.hint = ''
@model.hint = ""
if @_session
@_session.resolve null
@@ -144,28 +145,27 @@ module.exports = class ItemSelectorController extends BaseController
_disableWindowScrolling: ->
@_windowScrollPosition = $(window).scrollTop()
$('body').addClass('scrollDisabled').css('margin-top', -@_windowScrollPosition)
$("body").addClass("scrollDisabled").css("margin-top", -@_windowScrollPosition)
_enableWindowScrolling: ->
$('body').removeClass('scrollDisabled').css('margin-top', 0)
$("body").removeClass("scrollDisabled").css("margin-top", 0)
$(window).scrollTop @_windowScrollPosition
_refreshResults: ->
index = 0
for itemSlug in @model.results
displayModel = @_modPack.findItemDisplay itemSlug
for item in @model.results
controller = @_elementControllers[index]
if not controller?
controller = new ElementController
model: displayModel
model: item
onClicked: (c)=> @onResultClicked(c)
onSelected: (c)=> @onResultSelected(c)
controller.render show:false
@_elementControllers[index] = controller
@$resultsContainer.append controller.$el
else
controller.model = displayModel
controller.model = item
controller.show()
index += 1
@@ -180,14 +180,17 @@ module.exports = class ItemSelectorController extends BaseController
controller = @_elementControllers[i]
nextController = @_elementControllers[i + 1]
if controller.selected
controller.selected = false
nextController.selected = true
if controller.isSelected
controller.isSelected = false
nextController.isSelected = true
@_showElement nextController.$el
return
[..., controller] = @_elementControllers
controller.isSelected = false
controller = @_elementControllers[0]
controller.selected = true
controller.isSelected = true
@_showElement controller.$el
_selectPrevious: ->
@@ -197,14 +200,17 @@ module.exports = class ItemSelectorController extends BaseController
previousController = @_elementControllers[i - 1]
controller = @_elementControllers[i]
if controller.selected
previousController.selected = true
controller.selected = false
if controller.isSelected
previousController.isSelected = true
controller.isSelected = false
@_showElement previousController.$el
return
controller = @_elementControllers[@_elementControllers.length - 1]
controller.selected = true
controller = @_elementControllers[0]
controller.isSelected = false
[..., controller] = @_elementControllers
controller.isSelected = true
@_showElement controller.$el
_showElement: ($el)->
@@ -5,20 +5,21 @@
# All rights reserved.
#
BaseController = require '../../base_controller'
CraftingGridController = require '../crafting_grid/crafting_grid_controller'
SlotController = require '../slot/slot_controller'
{StringBuilder} = require('crafting-guide-common').util
BaseController = require "../../base_controller"
CraftingGridController = require "../crafting_grid/crafting_grid_controller"
ItemDisplay = require "../../../models/site/item_display"
SlotController = require "../slot/slot_controller"
{StringBuilder} = require("crafting-guide-common").util
########################################################################################################################
module.exports = class RecipeController extends BaseController
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'
options.templateName = 'common/recipe'
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"
options.templateName = "common/recipe"
super options
@_imageLoader = options.imageLoader
@@ -29,26 +30,26 @@ module.exports = class RecipeController extends BaseController
# BaseController Overrides #####################################################################
onDidRender: ->
@_gridController = @addChild CraftingGridController, '.view__crafting_grid',
@_gridController = @addChild CraftingGridController, ".view__crafting_grid",
modPack: @_modPack
imageLoader: @_imageLoader
router: @_router
@_outputSlotController = @addChild SlotController, '.output .view__slot',
@_outputSlotController = @addChild SlotController, ".output .view__slot",
imageLoader: @_imageLoader
modPack: @_modPack
router: @_router
@$multiplier = @$('.multiplier')
@$outputImg = @$('.output img')
@$outputLink = @$('.output a')
@$outputQuantity = @$('.quantity')
@$toolContainer = @$('.tool')
@$multiplier = @$(".multiplier")
@$outputImg = @$(".output img")
@$outputLink = @$(".output a")
@$outputQuantity = @$(".quantity")
@$toolContainer = @$(".tool")
super
refresh: ->
@_gridController.model = @model
@_outputSlotController.model = @model?.output?[0]
@_outputSlotController.model = @model?.output
@_refreshMultiplier()
@_refreshTools()
@@ -69,14 +70,14 @@ module.exports = class RecipeController extends BaseController
@_multiplier = newMultiplier
@_refreshMultiplier()
@trigger Event.change + ':multiplier', this, oldMultiplier, newMultiplier
@trigger Event.change + ":multiplier", this, oldMultiplier, newMultiplier
@trigger Event.change, this
# Backbone.View Methods ########################################################################
events: ->
return _.extend super,
'click a': 'routeLinkClick'
"click a": "routeLinkClick"
# Private Methods ##############################################################################
@@ -84,14 +85,15 @@ module.exports = class RecipeController extends BaseController
if @multiplier > 1
@$multiplier.html "x#{@multiplier}"
else
@$multiplier.html ''
@$multiplier.html ""
_refreshTools: ->
@$toolContainer.empty()
return unless @model?
builder = new StringBuilder
builder.loop @model.tools, delimiter:', ', onEach:(b, stack)=>
display = @_modPack.findItemDisplay stack.itemSlug
b.push "<a href=\"#{display.itemUrl}\">#{display.itemName}</a>"
@$toolContainer.html builder.toString()
toolLinks = []
for itemId, item of @model.tools
display = new ItemDisplay item
toolLinks.push "<a href=\"#{display.url}\">#{display.name}</a>"
@$toolContainer.html toolLinks.join ", "
@@ -5,18 +5,19 @@
# All rights reserved.
#
BaseController = require '../../base_controller'
BaseController = require "../../base_controller"
ItemDisplay = require "../../../models/site/item_display"
{Stack} = require("crafting-guide-common").models
########################################################################################################################
module.exports = class SlotController extends BaseController
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'
# options.model should be a Stack
options.templateName = 'common/slot'
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"
options.templateName = "common/slot"
options.useAnimations = false
super options
@@ -27,27 +28,31 @@ module.exports = class SlotController extends BaseController
# BaseController Overrides #####################################################################
onDidRender: ->
@$link = @$('a')
@$image = @$('img')
@$quantity = @$('.quantity')
@$link = @$("a")
@$image = @$("img")
@$quantity = @$(".quantity")
super
onWillChangeModel: (oldModel, newModel)->
if newModel? and (newModel.constructor isnt Stack) then throw new Error "newModel must be a Stack"
super
refresh: ->
if @model?
display = @_modPack.findItemDisplay @model.itemSlug
@$link.attr 'href', display.itemUrl
display = new ItemDisplay @model.item
@$link.attr "href", display.url
@_imageLoader.load display.iconUrl, @$image
if @model.quantity > 1
@$quantity.html @model.quantity
else
@$quantity.html ''
@$quantity.html ""
else
@$link.removeAttr 'href'
@$quantity.html ''
@$link.removeAttr "href"
@$quantity.html ""
@$image.attr 'src', '/images/empty.png'
@$image.attr "src", "/images/empty.png"
super
@@ -55,4 +60,4 @@ module.exports = class SlotController extends BaseController
events: ->
return _.extend super,
'click a': 'routeLinkClick'
"click a": "routeLinkClick"
@@ -6,6 +6,7 @@
#
BaseController = require '../../base_controller'
ItemDisplay = require "../../../models/site/item_display"
########################################################################################################################
@@ -38,8 +39,6 @@ module.exports = class StackController extends BaseController
@_shouldEnableButton = options.shouldEnableButton ?= (model, button)-> true
@_trackingContext = options.trackingContext ?= null
@_modPack.on c.event.change, => @tryRefresh()
# Event Methods ################################################################################
onFirstButtonClicked: (event)->
@@ -71,7 +70,7 @@ module.exports = class StackController extends BaseController
@trigger c.event.change + ':quantity', this, oldQuantity, newQuantity
@trigger c.event.change, this
tracker.trackEvent @_trackingContext, 'update-quantity', @model.itemSlug, @model.quantity
tracker.trackEvent @_trackingContext, 'update-quantity', @model.item.id, @model.quantity
onQuantityFieldChanged: ->
return unless @_editable
@@ -119,10 +118,10 @@ module.exports = class StackController extends BaseController
refresh: ->
if not @model? then throw new Error "must have a model to render"
display = @_modPack.findItemDisplay @model.itemSlug
display = new ItemDisplay @model.item
@_imageLoader.load display.iconUrl, @$image
@$nameLink.html display.itemName
@$nameLink.html display.name
@$nameLink.attr 'href', display.itemUrl
quantityText = if @model.quantity > 10000 then "#{@model.quantity / 1000}k" else "#{@model.quantity}"