Initial implementation of the InventoryController
This commit is contained in:
@@ -0,0 +1,164 @@
|
||||
###
|
||||
Crafting Guide - inventory_controller.coffee
|
||||
|
||||
Copyright (c) 2014-2015 by Redwood Labs
|
||||
All rights reserved.
|
||||
###
|
||||
|
||||
BaseController = require './base_controller'
|
||||
{Duration} = require '../constants'
|
||||
{Key} = require '../constants'
|
||||
StackController = require './stack_controller'
|
||||
|
||||
########################################################################################################################
|
||||
|
||||
module.exports = class InventoryController extends BaseController
|
||||
|
||||
@ONLY_DIGITS = /^[0-9]*$/
|
||||
|
||||
constructor: (options={})->
|
||||
if not options.model? then throw new Error 'options.model is required'
|
||||
if not options.modPack? then throw new Error 'options.modPack is required'
|
||||
|
||||
options.icon ?= '/images/chest_front.png'
|
||||
options.editable ?= true
|
||||
options.templateName = 'inventory'
|
||||
options.title ?= 'Inventory'
|
||||
super options
|
||||
|
||||
@editable = options.editable
|
||||
@icon = options.icon
|
||||
@modPack = options.modPack
|
||||
@title = options.title
|
||||
|
||||
@_stackControllers = []
|
||||
|
||||
@listenTo @modPack, 'change', => @refresh()
|
||||
|
||||
# Event Methods ################################################################################
|
||||
|
||||
onAddButtonClicked: ->
|
||||
item = @modPack.findItemByName @$nameField.val()
|
||||
return unless item?
|
||||
|
||||
@model.add item.slug, parseInt(@$quantityField.val())
|
||||
@$nameField.val ''
|
||||
@$quantityField.val '1'
|
||||
|
||||
@$scrollbox.scrollTop @$scrollbox.prop 'scrollHeight'
|
||||
|
||||
onClearButtonClicked: ->
|
||||
@model.clear()
|
||||
|
||||
onNameFieldBlur: ->
|
||||
item = @modPack.findItemByName @$nameField.val()
|
||||
@$nameField.val if item? then item.name else ''
|
||||
@onNameFieldChanged()
|
||||
|
||||
onNameFieldChanged: ->
|
||||
item = @modPack.findItemByName @$nameField.val()
|
||||
@_updateButtonState()
|
||||
|
||||
onNameFieldFocused: ->
|
||||
@$nameField.val ''
|
||||
@$nameField.autocomplete('search')
|
||||
|
||||
onNameFieldKeyUp: (event)->
|
||||
if event.which is Key.Return
|
||||
@onAddButtonClicked()
|
||||
|
||||
onQuantityFieldBlur: ->
|
||||
value = @$quantityField.val().replace /[^0-9]/g, ''
|
||||
if value.length is 0 then value = '1'
|
||||
@$quantityField.val value
|
||||
@onQuantityFieldChanged()
|
||||
|
||||
onQuantityFieldChanged: ->
|
||||
if not @$quantityField.val().match /^[0-9]*$/
|
||||
@$quantityField.addClass 'error', 0
|
||||
@$quantityField.addClass 'error-new', 0
|
||||
@$quantityField.removeClass 'error-new', Duration.slow
|
||||
@$quantityField.focus()
|
||||
return
|
||||
|
||||
@$quantityField.removeClass 'error', Duration.fast
|
||||
@$quantityField.removeClass 'error-new', Duration.fast
|
||||
@_updateButtonState()
|
||||
|
||||
# BaseController Overrides #####################################################################
|
||||
|
||||
onDidRender: ->
|
||||
@$addButton = @$('button[name="add"]')
|
||||
@$clearButton = @$('button[name="clear"]')
|
||||
@$icon = @$('.icon')
|
||||
@$editPanel = @$('.edit')
|
||||
@$nameField = @$('input[name="name"]')
|
||||
@$quantityField = @$('input[name="quantity"]')
|
||||
@$scrollbox = @$('.scrollbox')
|
||||
@$table = @$('table')
|
||||
@$title = @$('.title')
|
||||
super
|
||||
|
||||
refresh: ->
|
||||
display = if @editable then 'block' else 'none'
|
||||
@$clearButton.css display:(if @editable then 'block' else 'none')
|
||||
@$editPanel.css display:(if @editable then 'table-row' else 'none')
|
||||
|
||||
@$icon.attr 'src', @icon
|
||||
@$title.html @title
|
||||
|
||||
if _.isEmpty(@$quantityField.val()) then @$quantityField.val '1'
|
||||
|
||||
@$table.find('tr:not(:last-child)').remove()
|
||||
$lastRow = @$table.find 'tr:last-child'
|
||||
@_stackControllers = []
|
||||
@model.each (stack)=>
|
||||
options =
|
||||
model: stack
|
||||
modPack: @modPack
|
||||
onRemove: if not @editable then null else (stack)=> @_removeStack(stack)
|
||||
|
||||
controller = new StackController options
|
||||
controller.render()
|
||||
controller.$el.insertBefore $lastRow
|
||||
@_stackControllers.push controller
|
||||
|
||||
@_updateNameAutocomplete()
|
||||
@_updateButtonState()
|
||||
|
||||
super
|
||||
|
||||
# Backbone.View Overrides ######################################################################
|
||||
|
||||
events:
|
||||
'blur input[name="name"]': 'onNameFieldBlur'
|
||||
'blur input[name="quantity"]': 'onQuantityFieldBlur'
|
||||
'click button[name="add"]': 'onAddButtonClicked'
|
||||
'click button[name="clear"]': 'onClearButtonClicked'
|
||||
'focus input[name="name"]': 'onNameFieldFocused'
|
||||
'input input[name="name"]': 'onNameFieldChanged'
|
||||
'input input[name="quantity"]': 'onQuantityFieldChanged'
|
||||
'keyup input[name="name"]': 'onNameFieldKeyUp'
|
||||
|
||||
# Private Methods ##############################################################################
|
||||
|
||||
_removeStack: (stack)->
|
||||
|
||||
_updateNameAutocomplete: ->
|
||||
onChanged = => @onNameFieldChanged()
|
||||
|
||||
@$nameField.autocomplete
|
||||
source: @modPack.gatherRecipeNames()
|
||||
delay: 0
|
||||
minLength: 0
|
||||
change: onChanged
|
||||
close: onChanged
|
||||
select: onChanged
|
||||
|
||||
_updateButtonState: ->
|
||||
if @model.isEmpty then @$clearButton.attr('disabled', 'disabled') else @$clearButton.removeAttr('disabled')
|
||||
|
||||
itemValid = @modPack.findItemByName(@$nameField.val())?
|
||||
quantityValid = @$quantityField.val().match(InventoryController.ONLY_DIGITS)
|
||||
disable = not (itemValid and quantityValid)
|
||||
if disable then @$addButton.attr('disabled', 'disabled') else @$addButton.removeAttr('disabled')
|
||||
@@ -7,8 +7,9 @@ All rights reserved.
|
||||
|
||||
BaseController = require './base_controller'
|
||||
CraftingTableController = require './crafting_table_controller'
|
||||
ItemPage = require '../models/item_page'
|
||||
ModPackController = require './mod_pack_controller'
|
||||
InventoryController = require './inventory_controller'
|
||||
ItemPage = require '../models/item_page'
|
||||
ModPackController = require './mod_pack_controller'
|
||||
|
||||
########################################################################################################################
|
||||
|
||||
@@ -28,6 +29,17 @@ module.exports = class ItemPageController extends BaseController
|
||||
# BaseController Overrides #####################################################################
|
||||
|
||||
onDidRender: ->
|
||||
options = model:@model.table.have, modPack:@model.modPack, editable:true
|
||||
@haveController = @addChild InventoryController, '.view__inventory.have', options
|
||||
|
||||
options =
|
||||
editable: false
|
||||
icon: '/images/workbench_top.png',
|
||||
model: @model.table.want,
|
||||
modPack: @model.modPack,
|
||||
title: 'Items to Craft'
|
||||
@wantController = @addChild InventoryController, '.view__inventory.want', options
|
||||
|
||||
@modPackController = @addChild ModPackController, '.view__mod_pack', model:@model.modPack
|
||||
@tableController = @addChild CraftingTableController, '.view__crafting_table', model:@model.table
|
||||
super
|
||||
|
||||
@@ -21,6 +21,7 @@ module.exports = class CraftingTable extends BaseModel
|
||||
attributes.includingTools ?= false
|
||||
attributes.have ?= new Inventory
|
||||
attributes.plan ?= null
|
||||
attributes.want ?= new Inventory
|
||||
super attributes, options
|
||||
|
||||
# Public Methods ###############################################################################
|
||||
|
||||
@@ -44,6 +44,7 @@ module.exports = class Inventory extends BaseModel
|
||||
clear: ->
|
||||
@_stacks = {}
|
||||
@_slugs = []
|
||||
@trigger 'change', self
|
||||
|
||||
clone: ->
|
||||
inventory = new Inventory
|
||||
|
||||
Reference in New Issue
Block a user