Update item detail page to new models

This commit is contained in:
Andrew Miner
2017-07-04 22:52:01 -07:00
parent 20119cf8e4
commit f6f736f8be
8 changed files with 75 additions and 91 deletions
+11 -7
View File
@@ -24,10 +24,10 @@ module.exports = class ItemDisplay
get: -> get: ->
inventory = new Inventory inventory = new Inventory
inventory.add @item inventory.add @item
c.url.crafting inventoryText:inventory.unparse() c.url.crafting inventoryText:inventory.toUrlString()
iconUrl: iconUrl:
get: -> return c.url.itemIcon modId:@_item.mod.id, itemSlug:@slug get: -> return c.url.itemIcon this
set: -> throw new Error "iconUrl cannot be assigned" set: -> throw new Error "iconUrl cannot be assigned"
item: item:
@@ -37,10 +37,18 @@ module.exports = class ItemDisplay
if not item? then throw new Error "item is required" if not item? then throw new Error "item is required"
@_item = item @_item = item
itemSlug:
get: -> return _.slugify @name
set: -> throw new Error "slug cannot be assigned"
mod: mod:
get: -> return @_item.mod get: -> return @_item.mod
set: -> throw new Error "mod cannot be assigned" set: -> throw new Error "mod cannot be assigned"
modId:
get: -> return @_item.mod.id
set: -> throw new Error "modId cannot be assigned"
modUrl: modUrl:
get: -> return c.url.mod modId:@item.mod.id get: -> return c.url.mod modId:@item.mod.id
set: -> throw new Error "modUrl cannot be assigned" set: -> throw new Error "modUrl cannot be assigned"
@@ -49,10 +57,6 @@ module.exports = class ItemDisplay
get: -> return @item.displayName get: -> return @item.displayName
set: -> throw new Error "name cannot be assigned" set: -> throw new Error "name cannot be assigned"
slug:
get: -> return _.slugify @name
set: -> throw new Error "slug cannot be assigned"
url: url:
get: -> return c.url.item modId:@_item.mod.id, itemSlug:@slug get: -> return c.url.item this
set: -> throw new Error "url cannot be assigned" set: -> throw new Error "url cannot be assigned"
+4 -1
View File
@@ -46,6 +46,9 @@ module.exports = class ItemPage extends Observable
return @_findItemsWithMatchingRecipes (recipe)=> return @_findItemsWithMatchingRecipes (recipe)=>
recipe.computeQuantityRequired @item recipe.computeQuantityRequired @item
findRecipes: ->
return (recipe for recipeId, recipe of @item.recipes)
findSimilarItems: -> findSimilarItems: ->
group = @mod.itemGroups[@item.groupName] group = @mod.itemGroups[@item.groupName]
return unless group? return unless group?
@@ -53,7 +56,7 @@ module.exports = class ItemPage extends Observable
return null unless group.length > 0 return null unless group.length > 0
return group return group
findToolForItem: -> findToolForItems: ->
return @_findItemsWithMatchingRecipes (recipe)=> return @_findItemsWithMatchingRecipes (recipe)=>
return recipe.tools[@item.id]? return recipe.tools[@item.id]?
@@ -7,6 +7,7 @@
BaseController = require '../../base_controller' BaseController = require '../../base_controller'
convertMarkdown = require 'marked' convertMarkdown = require 'marked'
ItemDisplay = require "../../../models/site/item_display"
MarkdownImageListController = require './markdown_image_list/markdown_image_list_controller' MarkdownImageListController = require './markdown_image_list/markdown_image_list_controller'
######################################################################################################################## ########################################################################################################################
@@ -219,8 +220,8 @@ module.exports = class MarkdownSectionController extends BaseController
result = match result = match
item = @_modPack.findItemByName name item = @_modPack.findItemByName name
if item? if item?
display = @_modPack.findItemDisplay item.slug display = new ItemDisplay item
result = "[#{name}](#{display.itemUrl})" result = "[#{name}](#{display.url})"
return result return result
@@ -122,7 +122,7 @@ module.exports = class StackController extends BaseController
@_imageLoader.load display.iconUrl, @$image @_imageLoader.load display.iconUrl, @$image
@$nameLink.html display.name @$nameLink.html display.name
@$nameLink.attr 'href', display.itemUrl @$nameLink.attr 'href', display.url
quantityText = if @model.quantity > 10000 then "#{@model.quantity / 1000}k" else "#{@model.quantity}" quantityText = if @model.quantity > 10000 then "#{@model.quantity / 1000}k" else "#{@model.quantity}"
@$quantityField.val quantityText @$quantityField.val quantityText
@@ -6,6 +6,7 @@
# #
BaseController = require '../base_controller' BaseController = require '../base_controller'
ItemDisplay = require "../../models/site/item_display"
ItemSelectorController = require '../common/item_selector/item_selector_controller' ItemSelectorController = require '../common/item_selector/item_selector_controller'
UrlParams = require '../url_params' UrlParams = require '../url_params'
@@ -52,14 +53,14 @@ module.exports = class HeaderController extends BaseController
onSearch: (event, hint='')-> onSearch: (event, hint='')->
tracker.trackEvent c.tracking.category.search, 'launch' tracker.trackEvent c.tracking.category.search, 'launch'
@_selector.launch hint @_selector.launch hint
.then (itemSlug)=> .then (item)=>
if not itemSlug? if not item?
tracker.trackEvent c.tracking.category.search, 'cancel', itemSlug tracker.trackEvent c.tracking.category.search, 'cancel', item.slug
return return
tracker.trackEvent c.tracking.category.search, 'complete', itemSlug tracker.trackEvent c.tracking.category.search, 'complete', item.slug
itemDisplay = @_modPack.findItemDisplay itemSlug itemDisplay = new ItemDisplay item
@router.navigate itemDisplay.itemUrl, trigger:true @router.navigate itemDisplay.url, trigger:true
return false return false
# BaseController Overrides ##################################################################### # BaseController Overrides #####################################################################
@@ -45,8 +45,7 @@ module.exports = class ItemPageController extends PageController
craftingPlanButtonClicked: -> craftingPlanButtonClicked: ->
tracker.trackEvent c.tracking.category.craft, "view-crafting-plan", @model.item.slug tracker.trackEvent c.tracking.category.craft, "view-crafting-plan", @model.item.slug
display = @_modPack.findItemDisplay @model.item.slug @_router.navigate @model.itemDisplay.craftingUrl, trigger:true
@_router.navigate display.craftingUrl, trigger:true
return false return false
# PageController Overrides ##################################################################### # PageController Overrides #####################################################################
@@ -54,8 +53,8 @@ module.exports = class ItemPageController extends PageController
getBreadcrumbs: -> getBreadcrumbs: ->
return [ return [
$("<a href='/browse'>Browse</a>") $("<a href='/browse'>Browse</a>")
$("<a href='#{@model.display.modUrl}'>#{@model.display.modName}</a>") $("<a href='#{@model.itemDisplay.modUrl}'>#{@model.itemDisplay.mod.displayName}</a>")
$("<b>#{display.name}</b>") $("<b>#{@model.itemDisplay.name}</b>")
] ]
getExtraNav: -> getExtraNav: ->
@@ -66,17 +65,11 @@ module.exports = class ItemPageController extends PageController
return $("<a href='#{display.url}'>Random Item</a>") return $("<a href='#{display.url}'>Random Item</a>")
getMetaDescription: -> getMetaDescription: ->
return null unless @_itemSlug? data = itemName:@model.item.displayName, modName:@model.item.mod.displayName
display = @_modPack.findItemDisplay @_itemSlug return c.text.itemDescription data
return c.text.itemDescription display
getTitle: -> getTitle: ->
return null unless @_itemSlug? return "#{@model.item.displayName} from #{@model.item.mod.displayName}"
display = @_modPack.findItemDisplay @_itemSlug
return null unless display.itemName? and display.modName?
return "#{display.itemName} from #{display.modName}"
# BaseController Overrides ##################################################################### # BaseController Overrides #####################################################################
@@ -120,14 +113,11 @@ module.exports = class ItemPageController extends PageController
super super
refresh: -> refresh: ->
@_resolveItemSlug()
if @model.item? if @model.item?
display = @_modPack.findItemDisplay @model.item.slug @_imageLoader.load @model.itemDisplay.iconUrl, @$aboutImage
@_imageLoader.load display.iconUrl, @$aboutImage @$name.text @model.itemDisplay.name
@$name.text display.itemName
@_descriptionController.imageBase = c.url.itemImageDir display @_descriptionController.imageBase = c.url.itemImageDir @model.itemDisplay
if @model.item.officialUrl? if @model.item.officialUrl?
@$officialLink.attr 'href', @model.item.officialUrl @$officialLink.attr 'href', @model.item.officialUrl
@@ -182,7 +172,7 @@ module.exports = class ItemPageController extends PageController
if not @model.item? if not @model.item?
return w.reject new Error 'must have an item' return w.reject new Error 'must have an item'
pathArgs = modSlug:@_itemSlug.mod, itemSlug:@_itemSlug.item pathArgs = modSlug:@model.item.mod.id, itemSlug:@model.itemDisplay.itemSlug
attributes = attributes =
fileName: c.gitHub.file.itemDescription.fileName pathArgs fileName: c.gitHub.file.itemDescription.fileName pathArgs
path: c.gitHub.file.itemDescription.path pathArgs path: c.gitHub.file.itemDescription.path pathArgs
@@ -232,8 +222,8 @@ module.exports = class ItemPageController extends PageController
@_descriptionController.resetToDefaultState() @_descriptionController.resetToDefaultState()
_refreshMultiblock: -> _refreshMultiblock: ->
if @model.item?.multiblock? if @model.item.isMultiblock
@_multiblockController.model = @model.item.multiblock @_multiblockController.model = @model.item.getMultiblockRecipe()
@show @$multiblockSection @show @$multiblockSection
else else
@hide @$multiblockSection @hide @$multiblockSection
@@ -246,7 +236,7 @@ module.exports = class ItemPageController extends PageController
if recipes?.length > 0 if recipes?.length > 0
@$recipesSectionTitle.html if recipes.length is 1 then 'Recipe' else 'Recipes' @$recipesSectionTitle.html if recipes.length is 1 then 'Recipe' else 'Recipes'
for recipe in @model.findRecipes() for recipe in recipes
controller = @_recipeControllers[index] controller = @_recipeControllers[index]
if not controller? if not controller?
controller = new RecipeDetailController controller = new RecipeDetailController
@@ -269,26 +259,22 @@ module.exports = class ItemPageController extends PageController
@_recipeControllers.pop().remove() @_recipeControllers.pop().remove()
_refreshSimilarItems: -> _refreshSimilarItems: ->
group = @model.item?.group group = @model.item.group
if group? and group isnt Item.Group.Other if group? and group isnt Item::DEFAULT_GROUP_NAME
@_similarItemsController.title = "Other #{group}" @_similarItemsController.title = "Other #{group}"
@_similarItemsController.model = @model.findSimilarItems() @_similarItemsController.model = @model.findSimilarItems()
else else
@_similarItemsController.model = null @_similarItemsController.model = null
_refreshSourceMod: -> _refreshSourceMod: ->
mod = @model.item?.modVersion?.mod mod = @model.item.mod
if mod?.name?.length > 0 @$sourceModLink.attr 'href', c.url.mod @model.itemDisplay
@$sourceModLink.attr 'href', c.url.mod modSlug:mod.slug
@$sourceModLink.text mod.name @$sourceModLink.text mod.name
@show @$sourceModLink @show @$sourceModLink
else
@hide @$sourceModLink
_refreshUsedAsToolToMake: -> _refreshUsedAsToolToMake: ->
@_usedAsToolToMakeController.title = 'Used as Tool to Make' @_usedAsToolToMakeController.title = 'Used as Tool to Make'
@_usedAsToolToMakeController.model = @model.findToolForRecipes() @_usedAsToolToMakeController.model = @model.findToolForItems()
_refreshUsedToMake: -> _refreshUsedToMake: ->
@_usedToMakeController.title = 'Used to Make' @_usedToMakeController.title = 'Used to Make'
@@ -319,16 +305,3 @@ module.exports = class ItemPageController extends PageController
while @_videoControllers.length > index while @_videoControllers.length > index
@_videoControllers.pop().remove() @_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 c.url.item(modSlug:item.slug.mod, itemSlug:item.slug.item), trigger:true
return
@model.item = item
item.fetch()
item.on c.event.sync, => @refresh()
@@ -6,6 +6,7 @@ All rights reserved.
### ###
BaseController = require '../../../base_controller' BaseController = require '../../../base_controller'
ItemDisplay = require "../../../../models/site/item_display"
######################################################################################################################## ########################################################################################################################
@@ -143,7 +144,7 @@ module.exports = class MultiblockController extends BaseController
move = false move = false
if stack? if stack?
itemDisplay = @_modPack.findItemDisplay stack.itemSlug itemDisplay = new ItemDisplay stack.item
if not $block? if not $block?
$block = $("<img alt='#{itemDisplay.itemName}' class='block' />") $block = $("<img alt='#{itemDisplay.itemName}' class='block' />")
@@ -5,21 +5,22 @@
# All rights reserved. # All rights reserved.
# #
BaseController = require '../../base_controller' BaseController = require "../../base_controller"
CraftingGridController = require '../../common/crafting_grid/crafting_grid_controller' CraftingGridController = require "../../common/crafting_grid/crafting_grid_controller"
{Inventory} = require('crafting-guide-common').deprecated.game {Inventory} = require("crafting-guide-common").models
InventoryController = require '../../common/inventory/inventory_controller' InventoryController = require "../../common/inventory/inventory_controller"
{StringBuilder} = require('crafting-guide-common').util ItemDisplay = require "../../../models/site/item_display"
{StringBuilder} = require("crafting-guide-common").util
######################################################################################################################## ########################################################################################################################
module.exports = class RecipeDetailController extends BaseController module.exports = class RecipeDetailController extends BaseController
constructor: (options={})-> constructor: (options={})->
if not options.imageLoader? then throw new Error 'options.imageLoader 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' if not options.modPack? then throw new Error "options.modPack is required"
if not options.router? then throw new Error 'options.router is required' if not options.router? then throw new Error "options.router is required"
options.templateName = 'item_page/recipe_detail' options.templateName = "item_page/recipe_detail"
super options super options
@_imageLoader = options.imageLoader @_imageLoader = options.imageLoader
@@ -29,26 +30,26 @@ module.exports = class RecipeDetailController extends BaseController
# BaseController Overrides ##################################################################### # BaseController Overrides #####################################################################
onDidRender: -> onDidRender: ->
@gridController = @addChild CraftingGridController, '.view__crafting_grid', @gridController = @addChild CraftingGridController, ".view__crafting_grid",
imageLoader: @_imageLoader imageLoader: @_imageLoader
modPack: @_modPack modPack: @_modPack
router: @_router router: @_router
@inputController = @addChild InventoryController, '.input .view__inventory', @inputController = @addChild InventoryController, ".input .view__inventory",
editable: false editable: false
imageLoader: @_imageLoader imageLoader: @_imageLoader
model: new Inventory model: new Inventory
modPack: @_modPack modPack: @_modPack
router: @_router router: @_router
@outputController = @addChild InventoryController, '.output .view__inventory', @outputController = @addChild InventoryController, ".output .view__inventory",
editable: false editable: false
imageLoader: @_imageLoader imageLoader: @_imageLoader
model: new Inventory model: new Inventory
modPack: @_modPack modPack: @_modPack
router: @_router router: @_router
@$toolContainer = @$('.tool') @$toolContainer = @$(".tool")
super super
refresh: -> refresh: ->
@@ -67,33 +68,33 @@ module.exports = class RecipeDetailController extends BaseController
events: -> events: ->
return _.extend super, return _.extend super,
'click a': 'routeLinkClick' "click a": "routeLinkClick"
# Private Methods ############################################################################## # Private Methods ##############################################################################
_refreshInputs: -> _refreshInputs: ->
inputs = @inputController.model inputs = @inputController.model
inputs.clear() inputs.clear()
return unless @model?
if @model? for itemId, item of @model.inputs
for stack in @model.input inputs.add item, @model.computeQuantityRequired item
inputs.add stack.itemSlug, @model.getQuantityRequired stack.itemSlug
_refreshOutputs: -> _refreshOutputs: ->
outputs = @outputController.model outputs = @outputController.model
outputs.clear() outputs.clear()
return unless @model?
if @model? outputs.add @model.output.item, @model.output.quantity
for stack in @model.output for itemId, item of @model.extras
outputs.add stack.itemSlug, @model.getQuantityProduced stack.itemSlug outputs.add item, @model.computeQuantityProduced item
_refreshTools: -> _refreshTools: ->
@$toolContainer.empty() @$toolContainer.empty()
return unless @model? return unless @model?
builder = new StringBuilder toolLinks = []
builder.loop @model.tools, delimiter:', ', onEach:(b, stack)=> for itemId, item of @model.tools
display = @_modPack.findItemDisplay stack.itemSlug display = new ItemDisplay item
b.push "<a href=\"#{display.itemUrl}\">#{display.itemName}</a>" toolLinks.push "<a href=\"#{display.url}\">#{display.name}</a>"
@$toolContainer.html builder.toString() @$toolContainer.html toolLinks.join ", "