Initial version of mod detail pages
This commit is contained in:
@@ -49,12 +49,13 @@ ModelState.loading = 'loading'
|
||||
ModelState.loaded = 'loaded'
|
||||
ModelState.failed = 'failed'
|
||||
|
||||
exports.Url = Url = {}
|
||||
Url.itemIcon = _.template "/data/<%= modSlug %>/<%= modVersion %>/images/<%= slug %>.png"
|
||||
Url.item = _.template "/item/<%= slug %>"
|
||||
Url.mod = _.template "/mod/<%= modSlug %>"
|
||||
Url.modData = _.template "/data/<%= modSlug %>/mod.cg"
|
||||
Url.modVersion = _.template "/data/<%= modSlug %>/<%= modVersion %>/mod-version.cg"
|
||||
exports.Url = Url = {}
|
||||
Url.itemIcon = _.template "/data/<%= modSlug %>/<%= modVersion %>/images/<%= slug %>.png"
|
||||
Url.item = _.template "/item/<%= slug %>"
|
||||
Url.mod = _.template "/mod/<%= modSlug %>"
|
||||
Url.modData = _.template "/data/<%= modSlug %>/mod.cg"
|
||||
Url.modVersion = _.template "/data/<%= modSlug %>/<%= modVersion %>/mod-version.cg"
|
||||
Url.modLogoImage = _.template "/data/<%= modSlug %>/logo.png"
|
||||
|
||||
exports.UrlParam = UrlParam = {}
|
||||
UrlParam.quantity = 'count'
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
###
|
||||
Crafting Guide - item_controller.coffee
|
||||
|
||||
Copyright (c) 2015 by Redwood Labs
|
||||
All rights reserved.
|
||||
###
|
||||
|
||||
BaseController = require './base_controller'
|
||||
{Url} = require '../constants'
|
||||
|
||||
########################################################################################################################
|
||||
|
||||
module.exports = class ItemController 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'
|
||||
options.templateName = 'item'
|
||||
super options
|
||||
|
||||
@_modPack = options.modPack
|
||||
|
||||
# BaseController Overrides #####################################################################
|
||||
|
||||
onDidRender: ->
|
||||
@$icon = @$('img')
|
||||
@$name = @$('.itemName')
|
||||
@$nameLink = @$('a')
|
||||
super
|
||||
|
||||
refresh: ->
|
||||
display = @_modPack.findItemDisplay @model.slug
|
||||
|
||||
@$icon.attr 'src', Url.itemIcon display
|
||||
@$name.html display.itemName
|
||||
@$nameLink.attr 'href', Url.item display
|
||||
@@ -37,6 +37,7 @@ module.exports = class ModController extends BaseController
|
||||
@$nameLink = @$('.name a')
|
||||
@$nameText = @$('.name p')
|
||||
@$description = @$('.description p')
|
||||
|
||||
super
|
||||
|
||||
refresh: ->
|
||||
@@ -59,7 +60,7 @@ module.exports = class ModController extends BaseController
|
||||
option.attr 'selected', 'selected'
|
||||
@$version.append option
|
||||
|
||||
# @$nameLink.attr 'href', Url.mod modSlug:@model.slug
|
||||
@$nameLink.attr 'href', Url.mod modSlug:@model.slug
|
||||
@$nameText.html @model.name
|
||||
|
||||
@$description.html @model.description
|
||||
|
||||
@@ -5,10 +5,12 @@ Copyright (c) 2015 by Redwood Labs
|
||||
All rights reserved.
|
||||
###
|
||||
|
||||
BaseController = require './base_controller'
|
||||
{Duration} = require '../constants'
|
||||
ModPack = require '../models/mod_pack'
|
||||
RecipeController = require './recipe_controller'
|
||||
BaseController = require './base_controller'
|
||||
{Duration} = require '../constants'
|
||||
Mod = require '../models/mod'
|
||||
ModPack = require '../models/mod_pack'
|
||||
ItemController = require './item_controller'
|
||||
{Url} = require '../constants'
|
||||
|
||||
########################################################################################################################
|
||||
|
||||
@@ -20,52 +22,117 @@ module.exports = class ModPageController extends BaseController
|
||||
options.templateName = 'mod_page'
|
||||
super options
|
||||
|
||||
@_modPack = options.modPack
|
||||
@_recipeControllers = []
|
||||
@_delayStep = options.delayStep
|
||||
@_delayStep = options.delayStep
|
||||
@_effectiveModVersion = null
|
||||
@_itemControllers = []
|
||||
@_modPack = options.modPack
|
||||
|
||||
Object.defineProperties this,
|
||||
effectiveModVersion: {get:@_getEffectiveModVersion}
|
||||
|
||||
# Event Methods ################################################################################
|
||||
|
||||
onVersionChanged: ->
|
||||
version = @$versionSelector.val()
|
||||
logger.debug "new version: #{version}"
|
||||
modVersion = @model.getModVersion version
|
||||
logger.debug "new mod version: #{modVersion}"
|
||||
@_effectiveModVersion = modVersion
|
||||
if modVersion? then modVersion.fetch()
|
||||
@refresh()
|
||||
|
||||
# BaseController Overrides #####################################################################
|
||||
|
||||
onDidRender: ->
|
||||
@$title = @$('h1')
|
||||
@$recipes = @$('.recipes')
|
||||
@$name = @$('.name')
|
||||
@$byline = @$('.byline p')
|
||||
@$description = @$('.description p')
|
||||
@$homePageLink = @$('.homePage')
|
||||
@$items = @$('.items .panel')
|
||||
@$titleImage = @$('.titleImage img')
|
||||
@$versionSelector = @$('select.version')
|
||||
@$wikiLink = @$('.wiki')
|
||||
|
||||
super
|
||||
|
||||
refresh: ->
|
||||
@$title.html if @model? then @model.name else ''
|
||||
|
||||
controllerIndex = 0
|
||||
delay = 0
|
||||
if @model?.activeModVersion?.isLoaded
|
||||
@$recipes.show duration:Duration.fast
|
||||
@model.eachItem (item)=>
|
||||
recipe = item.getPrimaryRecipe()
|
||||
return if not recipe
|
||||
|
||||
item.eachRecipe (recipe)=>
|
||||
controller = @_recipeControllers[controllerIndex]
|
||||
if not controller?
|
||||
_.delay (=> @_createRecipeController recipe), delay
|
||||
delay += @_delayStep
|
||||
else
|
||||
controller.model = recipe
|
||||
controllerIndex += 1
|
||||
else
|
||||
@$recipes.hide duration:Duration.fast
|
||||
|
||||
while @_recipeControllers.length > controllerIndex
|
||||
controller = @_recipeControllers.pop()
|
||||
controller.$el.slideUp duration:Duration.fast, complete:-> @remove()
|
||||
@$name.html if @model? then @model.name else ''
|
||||
@$byline.html if @model? then "by #{@model.author}" else ''
|
||||
@$titleImage.attr 'src', (if @model? then Url.modLogoImage(modSlug:@model.slug) else '')
|
||||
@$description.html if @model? then @model.description else ''
|
||||
|
||||
@_refreshHomePageLink()
|
||||
@_refreshItems()
|
||||
@_refreshVersions()
|
||||
super
|
||||
|
||||
# Backbone.View Methods ########################################################################
|
||||
|
||||
events:
|
||||
'change select.version': 'onVersionChanged'
|
||||
|
||||
# Private Methods ##############################################################################
|
||||
|
||||
_createRecipeController: (recipe)->
|
||||
controller = new RecipeController model:recipe, modPack:@_modPack
|
||||
_createItemController: (item)->
|
||||
controller = new ItemController model:item, modPack:@_modPack
|
||||
controller.$el.hide()
|
||||
controller.render()
|
||||
|
||||
@_recipeControllers.push controller
|
||||
@$recipes.append controller.$el
|
||||
@_itemControllers.push controller
|
||||
@$items.append controller.$el
|
||||
controller.$el.slideDown duration:Duration.fast
|
||||
|
||||
_getEffectiveModVersion: ->
|
||||
return @_effectiveModVersion if @_effectiveModVersion?
|
||||
return null unless @model?
|
||||
|
||||
modVersion = @model.activeModVersion
|
||||
modVersion ?= @model.getModVersion Mod.Version.Latest
|
||||
return modVersion
|
||||
|
||||
_refreshHomePageLink: ->
|
||||
if @model.homePageUrl?
|
||||
@$homePageLink.fadeIn duration:Duration.fast
|
||||
@$homePageLink.attr 'href', @model.homePageUrl
|
||||
else
|
||||
@$homePageLink.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 += @_delayStop
|
||||
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?
|
||||
|
||||
effectiveModVersion = @effectiveModVersion
|
||||
versionCount = 0
|
||||
@model.eachModVersion (modVersion)=>
|
||||
option = $("<option value=\"#{modVersion.version}\">#{modVersion.version}</option>")
|
||||
if modVersion is effectiveModVersion
|
||||
option.attr 'selected', 'selected'
|
||||
@$versionSelector.append option
|
||||
versionCount++
|
||||
|
||||
if versionCount <= 1
|
||||
@$versionSelector.attr 'disabled', 'disabled'
|
||||
else
|
||||
@$versionSelector.removeAttr 'disabled'
|
||||
|
||||
@@ -19,7 +19,7 @@ module.exports = class Mod extends BaseModel
|
||||
attributes.author ?= ''
|
||||
attributes.description ?= ''
|
||||
attributes.name ?= ''
|
||||
attributes.primaryUrl ?= null
|
||||
attributes.homePageUrl ?= null
|
||||
super attributes, options
|
||||
|
||||
@_activeModVersion = null
|
||||
@@ -62,9 +62,18 @@ module.exports = class Mod extends BaseModel
|
||||
return unless @_activeModVersion?
|
||||
@_activeModVersion.eachName callback
|
||||
|
||||
findItem: (slug)->
|
||||
return unless @_activeModVersion?
|
||||
@_activeModVersion.findItem slug
|
||||
findItem: (slug, options={})->
|
||||
options.includeDisabled ?= false
|
||||
|
||||
if not options.includeDisabled
|
||||
return unless @_activeModVersion?
|
||||
return @_activeModVersion.findItem slug
|
||||
else
|
||||
for modVersion in @_modVersions
|
||||
item = modVersion.findItem slug
|
||||
return item if item?
|
||||
|
||||
return null
|
||||
|
||||
findItemByName: (name)->
|
||||
return unless @_activeModVersion?
|
||||
@@ -100,6 +109,14 @@ module.exports = class Mod extends BaseModel
|
||||
for modVersion in @_modVersions
|
||||
callback modVersion
|
||||
|
||||
getModVersion: (version)->
|
||||
return null if version is Mod.Version.None
|
||||
return @_modVersions[@_modVersions.length-1] if version is Mod.Version.Latest
|
||||
|
||||
for modVersion in @_modVersions
|
||||
return modVersion if modVersion.version is version
|
||||
return null
|
||||
|
||||
getActiveVersion: ->
|
||||
return @_activeVersion
|
||||
|
||||
|
||||
@@ -22,10 +22,12 @@ module.exports = class ModPack extends BaseModel
|
||||
|
||||
# Public Methods ###############################################################################
|
||||
|
||||
findItem: (slug)->
|
||||
findItem: (slug, options={})->
|
||||
options.includeDisabled ?= false
|
||||
|
||||
for mod in @_mods
|
||||
continue unless mod.enabled
|
||||
item = mod.findItem slug
|
||||
continue unless mod.enabled or options.includeDisabled
|
||||
item = mod.findItem slug, options
|
||||
return item if item?
|
||||
|
||||
return null
|
||||
@@ -42,7 +44,7 @@ module.exports = class ModPack extends BaseModel
|
||||
|
||||
findItemDisplay: (slug)->
|
||||
result = {}
|
||||
item = @findItem slug
|
||||
item = @findItem slug, includeDisabled:true
|
||||
if item?
|
||||
result.modSlug = item.modVersion.modSlug
|
||||
result.modVersion = item.modVersion.version
|
||||
|
||||
@@ -42,11 +42,11 @@ module.exports = class ModParserV2 extends CommandParserVersionBase
|
||||
if name.length is 0 then throw new Error '"name" cannot be empty'
|
||||
@_rawData.name = name
|
||||
|
||||
_command_url: (url='')->
|
||||
if @_rawData.url? then throw new Error 'duplicate declaration of "url"'
|
||||
if url.length is 0 then throw new Error 'url cannot be empty'
|
||||
_command_homePageUrl: (homePageUrl='')->
|
||||
if @_rawData.homePageUrl? then throw new Error 'duplicate declaration of "homePageUrl"'
|
||||
if homePageUrl.length is 0 then throw new Error 'homePageUrl cannot be empty'
|
||||
|
||||
@_rawData.url = url
|
||||
@_rawData.homePageUrl = homePageUrl
|
||||
|
||||
_command_version: (version='')->
|
||||
if version.length is 0 then throw new Error 'version cannot be empty'
|
||||
@@ -58,13 +58,13 @@ module.exports = class ModParserV2 extends CommandParserVersionBase
|
||||
|
||||
_buildMod: (rawData, model)->
|
||||
if not rawData.name? then throw new Error 'the "name" declaration is required'
|
||||
if not rawData.url? then throw new Error 'the "url" declaration is required'
|
||||
if not rawData.homePageUrl? then throw new Error 'the "homePageUrl" declaration is required'
|
||||
if not rawData.versions? then throw new Error 'at least one "version" declaration is required'
|
||||
|
||||
model.author = rawData.author if rawData.author?
|
||||
model.description = rawData.description if rawData.description?
|
||||
model.name = rawData.name
|
||||
model.primaryUrl = rawData.url
|
||||
model.homePageUrl = rawData.homePageUrl
|
||||
|
||||
for version in rawData.versions
|
||||
model.addModVersion new ModVersion modSlug:model.slug, version:version
|
||||
|
||||
Reference in New Issue
Block a user