Allow items to be grouped on mod detail pages

This commit is contained in:
Andrew Miner
2015-01-30 13:03:10 -08:00
parent a365217890
commit 6e3843731b
11 changed files with 763 additions and 589 deletions
+21
View File
@@ -21,3 +21,24 @@ All rights reserved.
.error { background: $color-error; }
.error-new { background: $color-error-new; }
.section {
margin-top: 3em;
h2 {
font-family: $font-family-header;
font-size: $font-size-large;
margin-bottom: 0.5em;
}
.panel {
background: white;
padding: 1em;
& > div {
position: relative; width: 33%;
display: inline-block;
padding: 0.5em;
}
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,70 @@
###
Crafting Guide - item_group_controller.coffee
Copyright (c) 2015 by Redwood Labs
All rights reserved.
###
BaseController = require './base_controller'
{Duration} = require '../constants'
{Event} = require '../constants'
Item = require '../models/item'
ItemController = require './item_controller'
########################################################################################################################
module.exports = class ItemGroupController extends BaseController
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'
if not options.modVersion? then throw new Error 'options.modVersion is required'
options.templateName = 'item_group'
super options
@modVersion = options.modVersion
@_modPack = options.modPack
@_itemControllers = []
@modVersion.on Event.change, => @refresh()
# BaseController Overrides #####################################################################
onDidRender: ->
@$title = @$('h2')
@$items = @$('.panel')
super
refresh: ->
@$title.html if @model is Item.Group.Other then 'Items' else @model
@_refreshItems()
super
# Private Methods ##############################################################################
_createItemController: (item)->
controller = new ItemController model:item, modPack:@_modPack
controller.$el.hide()
controller.render()
@_itemControllers.push controller
@$items.append controller.$el
controller.$el.slideDown duration:Duration.fast
_refreshItems: ->
controllerIndex = 0
delay = 0
@modVersion.eachItemInGroup @model, (item)=>
controller = @_itemControllers[controllerIndex]
if not controller?
_.delay (=> @_createItemController item), delay
delay += @_delayStep
else
controller.model = item
controller.refresh()
controllerIndex += 1
while @_itemControllers.length > controllerIndex
controller = @_itemControllers.pop()
controller.$el.slideUp duration:Duration.fast, complete:-> @remove()
@@ -5,12 +5,12 @@ Copyright (c) 2015 by Redwood Labs
All rights reserved.
###
BaseController = require './base_controller'
{Duration} = require '../constants'
Mod = require '../models/mod'
ModPack = require '../models/mod_pack'
ItemController = require './item_controller'
{Url} = require '../constants'
BaseController = require './base_controller'
{Duration} = require '../constants'
Mod = require '../models/mod'
ModPack = require '../models/mod_pack'
ItemGroupController = require './item_group_controller'
{Url} = require '../constants'
########################################################################################################################
@@ -24,7 +24,7 @@ module.exports = class ModPageController extends BaseController
@_delayStep = options.delayStep
@_effectiveModVersion = null
@_itemControllers = []
@_groupControllers = []
@_modPack = options.modPack
Object.defineProperties this,
@@ -48,7 +48,7 @@ module.exports = class ModPageController extends BaseController
@$documentationLink = @$('.documentation')
@$downloadLink = @$('.download')
@$homePageLink = @$('.homePage')
@$items = @$('.items .panel')
@$groupContainer = @$('.itemGroups')
@$titleImage = @$('.titleImage img')
@$versionSelector = @$('select.version')
@@ -64,7 +64,7 @@ module.exports = class ModPageController extends BaseController
@_refreshLink @$documentationLink, @model.documentationUrl
@_refreshLink @$downloadLink, @model.downloadUrl
@_refreshItems()
@_refreshItemGroups()
@_refreshVersions()
super
@@ -75,15 +75,6 @@ module.exports = class ModPageController extends BaseController
# Private Methods ##############################################################################
_createItemController: (item)->
controller = new ItemController model:item, modPack:@_modPack
controller.$el.hide()
controller.render()
@_itemControllers.push controller
@$items.append controller.$el
controller.$el.fadeIn duration:Duration.fast
_getEffectiveModVersion: ->
return @_effectiveModVersion if @_effectiveModVersion?
return null unless @model?
@@ -94,6 +85,26 @@ module.exports = class ModPageController extends BaseController
return modVersion
_refreshItemGroups: ->
groupIndex = 0
modVersion = @effectiveModVersion
modVersion.eachGroup (group)=>
controller = @_groupControllers[groupIndex]
if not controller?
controller = new ItemGroupController model:group, modVersion:modVersion, modPack:@_modPack
controller.render()
@$groupContainer.append controller.$el
@_groupControllers[groupIndex] = controller
else
controller.modVersion = modVersion
controller.model = group
controller.refresh()
groupIndex++
while @_groupControllers.length > groupIndex + 1
controller = @_groupControllers.pop()
controller.$el.slideUp duration:Duration.fast, -> @remove()
_refreshLink: ($link, url)->
if url?
$link.fadeIn duration:Duration.fast
@@ -101,28 +112,6 @@ module.exports = class ModPageController extends BaseController
else
$link.fadeOut duration:Duration.fast
_refreshItems: ->
controllerIndex = 0
delay = 0
effectiveModVersion = @effectiveModVersion
if effectiveModVersion?
@$items.show duration:Duration.fast
effectiveModVersion.eachItem (item)=>
controller = @_itemControllers[controllerIndex]
if not controller?
_.delay (=> @_createItemController item), delay
delay += @_delayStep
else
controller.model = item
controllerIndex += 1
else
@$items.hide duration:Duration.fast
while @_itemControllers.length > controllerIndex
controller = @_itemControllers.pop()
controller.$el.slideUp duration:Duration.fast, complete:-> @remove()
_refreshVersions: ->
@$versionSelector.empty()
return unless @model?
+1 -1
View File
@@ -24,7 +24,7 @@ global.logger = new Logger
switch window.location.hostname
when 'localhost'
global.env = 'development'
logger.level = Logger.INFO
logger.level = Logger.DEBUG
when 'new.crafting-guide.com'
global.env = 'staging'
logger.level = Logger.VERBOSE
+3
View File
@@ -14,9 +14,12 @@ Recipe = require './recipe'
module.exports = class Item extends BaseModel
@Group = Other:'Other'
constructor: (attributes={}, options={})->
if not attributes.name? then throw new Error 'attributes.name is required'
attributes.group ?= Item.Group.Other
attributes.isGatherable ?= false
attributes.slug ?= _.slugify attributes.name
options.logEvents ?= false
+19 -4
View File
@@ -21,16 +21,20 @@ module.exports = class ModVersion extends BaseModel
if not attributes.version? then throw new Error 'attributes.version is required'
super attributes, options
@_items = {}
@_names = {}
@_slugs = []
@_groups = {}
@_items = {}
@_names = {}
@_slugs = []
# Public Methods ###############################################################################
addItem: (item)->
if @_items[item.slug]? then throw new Error "duplicate item for #{item.name}"
@_items[item.slug] = item
@_items[item.slug] = item
@_groups[item.group] ?= {}
@_groups[item.group][item.slug] = item
item.modVersion = this
@registerSlug item.slug, item.name
return this
@@ -44,6 +48,10 @@ module.exports = class ModVersion extends BaseModel
return 0
eachGroup: (callback)->
for groupName in _.keys(@_groups).sort()
callback groupName
eachItem: (callback)->
for slug in @_slugs
item = @_items[slug]
@@ -51,6 +59,13 @@ module.exports = class ModVersion extends BaseModel
callback @_items[slug], slug
return this
eachItemInGroup: (group, callback)->
group = @_groups[group]
return unless group?
for slug in _.keys(group).sort()
callback group[slug]
eachName: (callback)->
for slug in @_slugs
callback @_names[slug], slug
@@ -53,10 +53,14 @@ module.exports = class ModVersionParserV1 extends CommandParserVersionBase
@_itemData.gatherable = (gatherable is 'yes')
_command_group: (group)->
if group.length is 0 then throw new Error 'a group name cannot be empty'
@_rawData.group = group
_command_item: (name='')->
if not name.length > 0 then throw new Error 'the item name cannot be empty'
@_itemData = name:name, line:@_lineNumber
@_itemData = name:name, line:@_lineNumber, group:@_rawData.group
@_rawData.items ?= []
@_rawData.items.push @_itemData
@@ -118,7 +122,7 @@ module.exports = class ModVersionParserV1 extends CommandParserVersionBase
itemData.gatherable ?= false
itemData.recipes ?= []
item = new Item name:itemData.name, isGatherable:itemData.gatherable
item = new Item name:itemData.name, isGatherable:itemData.gatherable, group:itemData.group
modVersion.addItem item
for recipeData in itemData.recipes
@@ -186,9 +190,23 @@ module.exports = class ModVersionParserV1 extends CommandParserVersionBase
builder
.line 'schema: ', 1
.line()
.onlyIf itemList.length > 0, =>
builder.loop itemList, delimiter:'\n', onEach:(b, i)=> @_unparseItem(b, i)
.outdent()
modVersion.eachGroup (group)=>
@_unparseGroup builder, modVersion, group
_unparseGroup: (builder, modVersion, group)->
if group isnt Item.Group.Other
builder
.line 'group: ', group
.line()
.indent()
modVersion.eachItemInGroup group, (item)=>
@_unparseItem builder, item
builder.line()
if group isnt Item.Group.Other
builder.outdent()
_unparseItem: (builder, item)->
recipes = []
+10
View File
@@ -0,0 +1,10 @@
//-
//- Crafting Guide - item_group.jade
//-
//- Copyright (c) 2015 by Redwood Labs
//- All rights reserved.
//-
.view__item_group.section
h2
.panel
+1 -3
View File
@@ -18,6 +18,4 @@
.byline: p
.description: p
.section.items
h2 Items
.panel
.itemGroups