diff --git a/package.json b/package.json
index 6bd28e8b6..b62a407e2 100644
--- a/package.json
+++ b/package.json
@@ -36,7 +36,7 @@
"body-parser": "1.17.1",
"client-sessions": "0.8.0",
"cookie-parser": "1.4.3",
- "crafting-guide-common": ">=3.0.0",
+ "crafting-guide-common": ">=5.0.0",
"dotenv": "4.0.0",
"express": "4.15.2",
"express-session": "1.15.2",
diff --git a/src/client/client.coffee b/src/client/client.coffee
index 9c7bbc064..67822d11f 100644
--- a/src/client/client.coffee
+++ b/src/client/client.coffee
@@ -74,11 +74,18 @@ client.startMonitoringStatus()
########################################################################################################################
-SiteController = require './site/site_controller'
-global.site = site = new SiteController client:client, storage:storage
-site.render()
-site.loadDefaultModPack()
-site.loadCurrentUser()
+{http, ModPackStore} = require("crafting-guide-common").api
+modPackBaseUrl = "#{location.protocol}//#{location.hostname}:#{location.port}"
+modPackStore = new ModPackStore http, modPackBaseUrl
-Backbone.history.start pushState:true
-logger.info -> "CraftingGuide is ready"
+########################################################################################################################
+
+modPackStore.load c.modPacks.default
+ .then (modPack)->
+ SiteController = require './site/site_controller'
+ global.site = site = new SiteController client:client, storage:storage, modPack:modPack
+ site.render()
+ site.loadCurrentUser()
+
+ Backbone.history.start pushState:true
+ logger.info -> "CraftingGuide is ready"
diff --git a/src/client/models/site/item_display.coffee b/src/client/models/site/item_display.coffee
new file mode 100644
index 000000000..a42b12cb6
--- /dev/null
+++ b/src/client/models/site/item_display.coffee
@@ -0,0 +1,54 @@
+#
+# Crafting Guide - item_page.coffee
+#
+# Copyright © 2014-2017 by Redwood Labs
+# All rights reserved.
+#
+
+_ = require "../../../common/underscore"
+c = require "../../../common/constants"
+{Inventory} = require("crafting-guide-common").models
+
+########################################################################################################################
+
+module.exports = class ItemDisplay
+
+ constructor: (item)->
+ @item = item
+
+ # Properties ###################################################################################
+
+ Object.defineProperties @prototype,
+
+ craftingUrl:
+ get: ->
+ inventory = new Inventory
+ inventory.add @item
+ c.url.crafting inventoryText:inventory.unparse()
+
+ iconUrl:
+ get: -> return c.url.itemIcon modId:@_item.mod.id, itemSlug:@slug
+ set: -> throw new Error "iconUrl cannot be assigned"
+
+ item:
+ get: -> return @_item
+ set: (item)->
+ if @_item? then throw new Error "item cannot be re-assigned"
+ if not item? then throw new Error "item is required"
+ @_item = item
+
+ modUrl:
+ get: -> return c.url.mod modId:@item.mod.id
+ set: -> throw new Error "modUrl cannot be assigned"
+
+ name:
+ get: -> return @item.displayName
+ set: -> throw new Error "name cannot be assigned"
+
+ slug:
+ get: -> return _.slugify @name
+ set: -> throw new Error "slug cannot be assigned"
+
+ url:
+ get: -> return c.url.item modId:@_item.mod.id, itemSlug:@slug
+ set: -> throw new Error "url cannot be assigned"
diff --git a/src/client/models/site/item_page.coffee b/src/client/models/site/item_page.coffee
index c0a812bd8..92b1388cf 100644
--- a/src/client/models/site/item_page.coffee
+++ b/src/client/models/site/item_page.coffee
@@ -5,53 +5,74 @@
# All rights reserved.
#
-{BaseModel} = require("crafting-guide-common").deprecated
+{Item} = require("crafting-guide-common").models
+ItemDisplay = require "../item_display"
+{Observable} = require("crafting-guide-common").util
########################################################################################################################
-module.exports = class ItemPage extends BaseModel
+module.exports = class ItemPage extends Observable
- constructor: (attributes={}, options={})->
- if not attributes.modPack? then throw new Error 'attributes.modPack is required'
- attributes.item ?= null
- super attributes, options
+ constructor: (item)->
+ if item.constructor isnt Item then throw new Error "item must be an Item instance"
+ @item = item
+ super
+
+ # Properties ###################################################################################
+
+ Object.defineProperties @prototype,
+
+ item:
+ get: -> return @_item
+ set: (item)->
+ if @_item? then throw new Error "item cannot be reassigned"
+ if not item? then throw new Error "item is required"
+ @_item = item
+
+ itemDisplay:
+ get: -> return @_itemDisplay ?= new ItemDisplay @item
+
+ mod:
+ get: -> return @_item.mod
+ set: -> throw new Error "mod cannot be assigned"
+
+ modPack:
+ get: -> return @mod.modPack
+ set: -> throw new Error "modPack cannot be assigned"
# Property Methods #############################################################################
findComponentInItems: ->
- return @_findRecipesMatching (recipe)=> recipe.requires @item.slug
+ return @_findItemsWithMatchingRecipes (recipe)=>
+ recipe.computeQuantityRequired @item
findSimilarItems: ->
- return null unless @item?.modVersion?
+ group = @mod.itemGroups[@item.groupName]
+ return unless group?
- result = []
- @item.modVersion.eachItemInGroup @item.group, (item)=>
- result.push item
+ return null unless group.length > 0
+ return group
- return null unless result.length > 0
- return result
-
- findRecipes: ->
- return @modPack.findRecipes @item?.slug, [], alwaysFromOwningMod:true
-
- findToolForRecipes: ->
- return @_findRecipesMatching (recipe)=> recipe.requiresTool @item.slug
+ findToolForItem: ->
+ return @_findItemsWithMatchingRecipes (recipe)=>
+ return recipe.tools[@item.id]?
# Private Methods ##############################################################################
- _findRecipesMatching: (isAcceptable)->
- return null unless @item?
-
+ _findItemsWithMatchingRecipes: (isMatching)->
result = {}
- @modPack.eachMod (mod)=>
- mod.eachRecipe (recipe)=>
- if isAcceptable recipe
- for outputStack in recipe.output
- continue if recipe.isPassThroughFor outputStack.itemSlug
- outputItem = @modPack.findItem outputStack.itemSlug, includeDisabled:true
- result[outputItem.slug] = outputItem
- result = _.values result
- return null unless result.length > 0
+ for modId, mod of @modPack.mods
+ for itemId, item of mod.items
+ for recipeId, recipe of item.recipes
+ if isMatching(recipe)
+ result[item.id] = item
- return result.sort (a, b)-> a.compareTo b
+ result = (item for itemId, item of result)
+ result.sort (a, b)->
+ if not a?.displayName? and not b?.displayName? then return 0
+ if not b?.displayName? then return +1
+ if not a?.displayName? then return +1
+ return a.displayName.localeCompare b.displayName
+
+ return result
diff --git a/src/client/models/stores/mod_pack_store.coffee b/src/client/models/stores/mod_pack_store.coffee
deleted file mode 100644
index 8184c3e3d..000000000
--- a/src/client/models/stores/mod_pack_store.coffee
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# Crafting Guide - mod_pack_store.coffee
-#
-# Copyright © 2014-2017 by Redwood Labs
-# All rights reserved.
-#
-
-ModPackJsonParser = require "../parsing/mod_pack_json_parser"
-w = require "when"
-
-########################################################################################################################
-
-module.exports = class ModPackStore
-
- constructor: ->
- @_data = {}
- @_loading = {}
- @_parser = new ModPackJsonParser
-
- # Class Methods ################################################################################
-
- Object.defineProperties ModPackStore,
- instance:
- get: ->
- @_instance ?= new ModPackStore
- return @_instance
- set: ->
- throw new Error "cannot assign instance"
-
- # Public Methods ###############################################################################
-
- get: (modPackId)->
- return @_data[modPackId]
-
- load: (modPackId)->
- if not @_loading[modPackId]?
- @_loading[modPackId] = w.promise (resolve, reject)->
- url = c.url.modPackArchive modPackId:modPackId
-
- onError = (xhr, status, message)=>
- logger.error "failed to load mod pack #{modPackId}: #{status} — #{message}"
- reject new Error message
-
- onSuccess = (data, status, xhr)=>
- logger.info "laoded mod pack: #{modPackId}"
- try
- @_parser.reset()
- modPack = @_parser.parse data, url
- @_data[modPack.id] = modPack
- resolve modPack
- catch error
- reject error
-
- $.ajax dataType: "text", error: onError, success: onSuccess, url: url
-
- return @_loading[modPackId]
diff --git a/src/client/site/base_controller.coffee b/src/client/site/base_controller.coffee
index 21564d860..c4fcff5ed 100644
--- a/src/client/site/base_controller.coffee
+++ b/src/client/site/base_controller.coffee
@@ -5,7 +5,8 @@
# All rights reserved.
#
-templates = require './templates'
+{Observable} = require("crafting-guide-common").util
+templates = require './templates'
########################################################################################################################
@@ -84,9 +85,6 @@ module.exports = class BaseController extends Backbone.View
onDidModelChange: ->
@tryRefresh()
- onDidModelSync: ->
- @tryRefresh()
-
onWillRender: -> # do nothing
onDidRender: -> # do nothing
@@ -96,11 +94,12 @@ module.exports = class BaseController extends Backbone.View
onDidShow: -> # do nothing
onWillChangeModel: (oldModel, newModel)->
- if oldModel?.on?
- @stopListening oldModel
- if newModel?.on?
- @listenTo newModel, 'sync', (e)=> @onDidModelSync e
- @listenTo newModel, 'change', (e)=> @onDidModelChange e
+ if oldModel?.isObservable
+ oldModel.off target:this
+
+ if newModel?.isObservable
+ newModel.on Observable::ANY, this, "onDidModelChange"
+
return newModel
# Property Methods #############################################################################
diff --git a/src/client/site/browse_page/browse_page_controller.coffee b/src/client/site/browse_page/browse_page_controller.coffee
index 7baa67088..28c8a648a 100644
--- a/src/client/site/browse_page/browse_page_controller.coffee
+++ b/src/client/site/browse_page/browse_page_controller.coffee
@@ -28,7 +28,6 @@ module.exports = class BrowsePageController extends PageController
@_tileControllers = []
@_client.on c.event.change, => @tryRefresh()
- @_modPack.on c.event.change, => @tryRefresh()
# Property Methods #############################################################################
@@ -81,7 +80,7 @@ module.exports = class BrowsePageController extends PageController
_refreshModTiles: ->
index = 0
- mods = @_modPack.getAllMods()
+ mods = (mod for modId, mod of @_modPack.mods)
for mod in mods
controller = @_tileControllers[index]
if not controller
diff --git a/src/client/site/browse_page/mod_tile/mod_tile_controller.coffee b/src/client/site/browse_page/mod_tile/mod_tile_controller.coffee
index ecb42f375..9c3fe8640 100644
--- a/src/client/site/browse_page/mod_tile/mod_tile_controller.coffee
+++ b/src/client/site/browse_page/mod_tile/mod_tile_controller.coffee
@@ -29,12 +29,12 @@ module.exports = class ModTileController extends BaseController
super
refresh: ->
- @$link.attr 'href', c.url.mod modSlug:@model.slug
- @$logoImage.attr 'src', c.url.modIcon modSlug:@model.slug
- @$title.text @model.name
+ @$link.attr 'href', c.url.mod modId:@model.id
+ @$logoImage.attr 'src', c.url.modIcon modId:@model.id
+ @$title.text @model.displayName
@$description.text @model.description
- if @model.enabled
+ if @model.isEnabled
@$el.removeClass 'disabled'
else
@$el.addClass 'disabled'
diff --git a/src/client/site/common/item_group/item_tile/item_tile_controller.coffee b/src/client/site/common/item_group/item_tile/item_tile_controller.coffee
index ad867f32e..147ed405e 100644
--- a/src/client/site/common/item_group/item_tile/item_tile_controller.coffee
+++ b/src/client/site/common/item_group/item_tile/item_tile_controller.coffee
@@ -5,39 +5,37 @@
# All rights reserved.
#
-BaseController = require '../../../base_controller'
+BaseController = require "../../../base_controller"
+ItemDisplay = require "../../../../models/site/item_display"
########################################################################################################################
module.exports = class ItemTileController extends BaseController
constructor: (options={})->
- if not options.imageLoader? then throw new Error 'options.imageLoader is required'
- 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 = 'common/item_group/item_tile'
+ if not options.imageLoader? then throw new Error "options.imageLoader is required"
+ if not options.model? then throw new Error "options.model is required"
+ options.templateName = "common/item_group/item_tile"
super options
@_imageLoader = options.imageLoader
- @_modPack = options.modPack
+ @_display = new ItemDisplay @model
# BaseController Overrides #####################################################################
onDidRender: ->
- @$icon = @$('img')
- @$name = @$('.itemName')
- @$nameLink = @$('a')
+ @$icon = @$("img")
+ @$name = @$(".itemName")
+ @$nameLink = @$("a")
super
refresh: ->
- display = @_modPack.findItemDisplay @model.slug
-
- @_imageLoader.load display.iconUrl, @$icon
- @$name.html display.itemName
- @$nameLink.attr 'href', display.itemUrl
+ @_imageLoader.load @_display.iconUrl, @$icon
+ @$name.html @_display.name
+ @$nameLink.attr "href", @_display.url
# Backbone.View Overrides ######################################################################
events: ->
return _.extend super,
- 'click a': 'routeLinkClick'
+ "click a": "routeLinkClick"
diff --git a/src/client/site/common/mod_version_selector/mod_version_selector.jade b/src/client/site/common/mod_version_selector/mod_version_selector.jade
index af77d0254..158b81d48 100644
--- a/src/client/site/common/mod_version_selector/mod_version_selector.jade
+++ b/src/client/site/common/mod_version_selector/mod_version_selector.jade
@@ -2,8 +2,5 @@
.toggle
span.checkbox
span.label I have this mod in my modpack
- .version
- span Version:
- select
.warning.
PLEASE NOTE: Crafting plans, search, and other features will ignore items and recipes from this mod.
diff --git a/src/client/site/common/mod_version_selector/mod_version_selector_controller.coffee b/src/client/site/common/mod_version_selector/mod_version_selector_controller.coffee
index 125a8debd..b50805a05 100644
--- a/src/client/site/common/mod_version_selector/mod_version_selector_controller.coffee
+++ b/src/client/site/common/mod_version_selector/mod_version_selector_controller.coffee
@@ -5,97 +5,59 @@
# All rights reserved.
#
-BaseController = require '../../base_controller'
-{Mod} = require('crafting-guide-common').deprecated.game
+BaseController = require "../../base_controller"
+{Mod} = require("crafting-guide-common").models
########################################################################################################################
module.exports = class ModVersionSelectorController extends BaseController
constructor: (options={})->
- if not options.model? then throw new Error 'options.model is required'
- options.templateName = 'common/mod_version_selector'
+ if options.model?.constructor isnt Mod then throw new Error "options.model must be a Mod"
+ options.templateName = "common/mod_version_selector"
super options
# Event Methods ################################################################################
onToggleEnabled: ->
- if @model.activeVersion is Mod.Version.None
- tracker.trackEvent c.tracking.category.modPack, 'toggle-on', @model.slug
- @model.activeVersion = Mod.Version.Latest
+ if not @model.isEnabled
+ tracker.trackEvent c.tracking.category.modPack, "toggle-on", @model.id
+ @model.isEnabled = true
else
- tracker.trackEvent c.tracking.category.modPack, 'toggle-off', @model.slug
- @model.activeVersion = Mod.Version.None
+ tracker.trackEvent c.tracking.category.modPack, "toggle-off", @model.id
+ @model.isEnabled = false
return false
- onVersionChanged: ->
- @model.activeVersion = @$versionSelector.val()
- tracker.trackEvent c.tracking.category.modPack, 'select-version', "#{@model.slug}@#{@model.activeVersion}"
- return false
-
- # Property Methods #############################################################################
-
- Object.defineProperties @prototype,
-
- effectiveModVersion:
- get: ->
- modVersion = @model.activeModVersion
- modVersion ?= @model.getModVersion Mod.Version.Latest
- modVersion.fetch() if modVersion?
- return modVersion
-
# BaseController Overrides #####################################################################
onDidRender: ->
- @$toggleSection = @$('.toggle')
- @$versionSection = @$('.version')
- @$versionSelector = @$('.version select')
- @$warning = @$('.warning')
+ @$toggleSection = @$(".toggle")
+ @$warning = @$(".warning")
super
refresh: ->
+ console.log "refreshing"
@_refreshEnabled()
- @_refreshVersionSelector()
super
# Backbone.View Overrides ######################################################################
events: ->
return _.extend super,
- 'change .version select': 'onVersionChanged'
- 'click .toggle': 'onToggleEnabled'
+ "click .toggle": "onToggleEnabled"
# Private Methods ##############################################################################
_refreshEnabled: ->
- if @model.slug in c.requiredMods
+ if @model.id in c.requiredMods
@hide @$toggleSection
else
@show @$toggleSection
- if @model.activeVersion is Mod.Version.None
- @$toggleSection.removeClass 'enabled'
+ if not @model.isEnabled
+ @$toggleSection.removeClass "enabled"
@show @$warning
else
- @$toggleSection.addClass 'enabled'
+ @$toggleSection.addClass "enabled"
@hide @$warning
-
- _refreshVersionSelector: ->
- modVersions = @model.modVersions
-
- if (@model.activeVersion is Mod.Version.None) or modVersions.length < 2
- @hide @$versionSection
- else
- @show @$versionSection
-
- selectedModVersion = @effectiveModVersion
-
- @$versionSelector.empty()
-
- for modVersion in @model.modVersions
- $option = $("")
- if modVersion is selectedModVersion
- $option.attr 'selected', 'true'
- @$versionSelector.append $option
- @$versionSelector.css display:''
diff --git a/src/client/site/item_page/item_page_controller.coffee b/src/client/site/item_page/item_page_controller.coffee
index 3012c864b..13cb067d9 100644
--- a/src/client/site/item_page/item_page_controller.coffee
+++ b/src/client/site/item_page/item_page_controller.coffee
@@ -5,16 +5,16 @@
# All rights reserved.
#
-EditableFile = require '../../models/site/editable_file'
-{Item} = require('crafting-guide-common').deprecated.game
-ItemGroupController = require '../common/item_group/item_group_controller'
-ItemPage = require '../../models/site/item_page'
-{ItemSlug} = require('crafting-guide-common').deprecated.game
-MarkdownSectionController = require '../common/markdown_section/markdown_section_controller'
-MultiblockViewerController = require './multiblock_viewer/multiblock_viewer_controller'
-PageController = require '../page_controller'
-RecipeDetailController = require './recipe_detail/recipe_detail_controller'
-VideoController = require '../common/video/video_controller'
+EditableFile = require "../../models/site/editable_file"
+{Item} = require("crafting-guide-common").models
+ItemDisplay = require "../../models/site/item_display"
+ItemGroupController = require "../common/item_group/item_group_controller"
+ItemPage = require "../../models/site/item_page"
+MarkdownSectionController = require "../common/markdown_section/markdown_section_controller"
+MultiblockViewerController = require "./multiblock_viewer/multiblock_viewer_controller"
+PageController = require "../page_controller"
+RecipeDetailController = require "./recipe_detail/recipe_detail_controller"
+VideoController = require "../common/video/video_controller"
w = require "when"
########################################################################################################################
@@ -24,34 +24,27 @@ module.exports = class ItemPageController extends PageController
@::FILE_UPLOAD_DELAY = 250
constructor: (options={})->
- if not options.client? then throw new Error 'options.client is required'
- if not options.itemSlug? then throw new Error 'options.itemSlug 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.router? then throw new Error 'options.router is required'
-
- options.model ?= new ItemPage modPack:options.modPack
- options.templateName ?= 'item_page'
+ if not options.model?.constructor is ItemPage then throw new Error "options.model must be an ItemPage instance"
+ if not options.client? then throw new Error "options.client 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.router? then throw new Error "options.router is required"
+ options.templateName ?= "item_page"
super options
@_client = options.client
@_descriptionFile = null
@_enterFeedback = options.enterFeedback
@_imageLoader = options.imageLoader
- @_itemSlug = options.itemSlug
@_modPack = options.modPack
@_router = options.router
@_triggerEditing = options.login
- @_modPack.on c.event.change, =>
- @tryRefresh()
- @trigger c.event.change
-
# Event Methods ################################################################################
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 display.craftingUrl, trigger:true
return false
@@ -59,23 +52,18 @@ module.exports = class ItemPageController extends PageController
# PageController Overrides #####################################################################
getBreadcrumbs: ->
- return [] unless @_itemSlug?
-
- display = @_modPack.findItemDisplay @_itemSlug
- return [] unless display.itemName? and display.modName
-
return [
$("Browse")
- $("#{display.modName}")
- $("#{display.itemName}")
+ $("#{@model.display.modName}")
+ $("#{display.name}")
]
getExtraNav: ->
- itemSlug = @_modPack.chooseRandomItem()
- return null unless itemSlug?
+ item = @_modPack.chooseRandomItem()
+ return null unless item?
- itemDisplay = @_modPack.findItemDisplay itemSlug
- return $("Random Item")
+ display = new ItemDisplay item
+ return $("Random Item")
getMetaDescription: ->
return null unless @_itemSlug?
diff --git a/src/client/site/mod_page/mod_page_controller.coffee b/src/client/site/mod_page/mod_page_controller.coffee
index e8380e89a..86f020672 100644
--- a/src/client/site/mod_page/mod_page_controller.coffee
+++ b/src/client/site/mod_page/mod_page_controller.coffee
@@ -27,27 +27,16 @@ module.exports = class ModPageController extends PageController
@_modPack = options.modPack
@_router = options.router
- # Property Methods #############################################################################
-
- Object.defineProperties @prototype,
-
- effectiveModVersion:
- get: ->
- modVersion = @model.activeModVersion
- modVersion ?= @model.getModVersion Mod.Version.Latest
- modVersion.fetch() if modVersion?
- return modVersion
-
# PageController Overrides #####################################################################
getBreadcrumbs: ->
return [
$('Browse')
- $("#{@model.name}")
+ $("#{@model.displayName}")
]
getTitle: ->
- return @model.name
+ return @model.displayName
# BaseController Overrides #####################################################################
@@ -87,8 +76,8 @@ module.exports = class ModPageController extends PageController
@$documentationLink.attr 'href', @model.documentationUrl
@$downloadLink.attr 'href', @model.downloadUrl
@$homePageLink.attr 'href', @model.homePageUrl
- @$logo.attr 'src', c.url.modIcon modSlug:@model.slug
- @$title.text @model.name
+ @$logo.attr 'src', c.url.modIcon modId:@model.id
+ @$title.text @model.displayName
else
@$author.text ''
@$description.text ''
@@ -101,29 +90,24 @@ module.exports = class ModPageController extends PageController
_refreshItemGroups: ->
@_groupControllers ?= []
groupIndex = 0
- modVersion = @effectiveModVersion
- if modVersion?
- modVersion.eachGroup (group)=>
- controller = @_groupControllers[groupIndex]
- items = modVersion.allItemsInGroup group
- if not controller?
- controller = new ItemGroupController
- imageLoader: @_imageLoader
- model: items
- modPack: @_modPack
- router: @_router
- title: if group is Item.Group.Other then 'Items' else group
+ for groupName, items of @model.itemGroups
+ controller = @_groupControllers[groupIndex]
+ if not controller?
+ controller = new ItemGroupController
+ imageLoader: @_imageLoader
+ model: items
+ modPack: @_modPack
+ router: @_router
+ title: groupName
- _.defer =>
- @_groupControllers.push controller
- @$itemGroups.append controller.$el
- controller.render()
- else
- controller.modVersion = modVersion
- controller.model = items
- controller.refresh()
- groupIndex++
+ @_groupControllers.push controller
+ @$itemGroups.append controller.$el
+ controller.render()
+ else
+ controller.model = items
+ controller.refresh()
+ groupIndex++
while @_groupControllers.length > groupIndex + 1
@_groupControllers.pop().remove()
diff --git a/src/client/site/router.coffee b/src/client/site/router.coffee
index bec2bf4de..b7624a57a 100644
--- a/src/client/site/router.coffee
+++ b/src/client/site/router.coffee
@@ -5,15 +5,16 @@
# All rights reserved.
#
-BrowsePageController = require './browse_page/browse_page_controller'
-CraftPageController = require './craft_page/craft_page_controller'
-ItemPageController = require './item_page/item_page_controller'
-{ItemSlug} = require('crafting-guide-common').deprecated.game
-LoginPageController = require './login_page/login_page_controller'
-ModPageController = require './mod_page/mod_page_controller'
-NewsPageController = require './news_page/news_page_controller'
-TutorialPageController = require './tutorial_page/tutorial_page_controller'
-UrlParams = require './url_params'
+BrowsePageController = require "./browse_page/browse_page_controller"
+CraftPageController = require "./craft_page/craft_page_controller"
+ItemPage = require "../models/site/item_page"
+ItemPageController = require "./item_page/item_page_controller"
+{ItemSlug} = require("crafting-guide-common").deprecated.game
+LoginPageController = require "./login_page/login_page_controller"
+ModPageController = require "./mod_page/mod_page_controller"
+NewsPageController = require "./news_page/news_page_controller"
+TutorialPageController = require "./tutorial_page/tutorial_page_controller"
+UrlParams = require "./url_params"
########################################################################################################################
@@ -34,50 +35,50 @@ module.exports = class Router extends Backbone.Router
tracker.trackPageView()
routes:
- '': 'route__home'
- '/': 'route__home'
- '/index.html': 'route__home'
+ '': 'route__home'
+ '/': 'route__home'
+ '/index.html': 'route__home'
- 'browse': 'route__browse'
- 'browse/': 'route__browse'
- 'browse/index.html': 'route__browse'
+ 'browse': 'route__browse'
+ 'browse/': 'route__browse'
+ 'browse/index.html': 'route__browse'
- 'browse/:modSlug': 'route__browseMod'
- 'browse/:modSlug/': 'route__browseMod'
- 'browse/:modSlug/index.html': 'route__browseMod'
+ 'browse/:modId': 'route__browseMod'
+ 'browse/:modId/': 'route__browseMod'
+ 'browse/:modId/index.html': 'route__browseMod'
- 'browse/:modSlug/:itemSlug': 'route__browseModItem'
- 'browse/:modSlug/:itemSlug/': 'route__browseModItem'
- 'browse/:modSlug/:itemSlug/index.html': 'route__browseModItem'
+ 'browse/:modId/:itemSlug': 'route__browseModItem'
+ 'browse/:modId/:itemSlug/': 'route__browseModItem'
+ 'browse/:modId/:itemSlug/index.html': 'route__browseModItem'
- 'browse/:modSlug/tutorials/:tutorialSlug': 'route__browseTutorial'
- 'browse/:modSlug/tutorials/:tutorialSlug/': 'route__browseTutorial'
- 'browse/:modSlug/tutorials/:tutorialSlug/index.html': 'route__browseTutorial'
+ 'browse/:modId/tutorials/:tutorialSlug': 'route__browseTutorial'
+ 'browse/:modId/tutorials/:tutorialSlug/': 'route__browseTutorial'
+ 'browse/:modId/tutorials/:tutorialSlug/index.html': 'route__browseTutorial'
- 'configure': 'route__configure'
- 'configure/': 'route__configure'
- 'configure/index.html': 'route__configure'
+ 'configure': 'route__configure'
+ 'configure/': 'route__configure'
+ 'configure/index.html': 'route__configure'
- 'craft': 'route__craft'
- 'craft/': 'route__craft'
- 'craft/index.html': 'route__craft'
+ 'craft': 'route__craft'
+ 'craft/': 'route__craft'
+ 'craft/index.html': 'route__craft'
- 'craft/:text': 'route__craft'
- 'craft/:text/': 'route__craft'
- 'craft/:text/index.html': 'route__craft'
+ 'craft/:text': 'route__craft'
+ 'craft/:text/': 'route__craft'
+ 'craft/:text/index.html': 'route__craft'
- 'login': 'route__login'
- 'login/': 'route__login'
- 'login/index.html': 'route__login'
+ 'login': 'route__login'
+ 'login/': 'route__login'
+ 'login/index.html': 'route__login'
- 'news': 'route__news'
- 'news/': 'route__news'
- 'news/index.html': 'route__news'
+ 'news': 'route__news'
+ 'news/': 'route__news'
+ 'news/index.html': 'route__news'
- 'item/:itemSlug': 'deprecated__item'
- 'crafting/(:text)': 'deprecated__crafting'
- 'mod/:modSlug': 'deprecated__mod'
- 'mod/:modSlug/:itemSlug': 'deprecated__modItem'
+ 'item/:itemSlug': 'deprecated__item'
+ 'crafting/(:text)': 'deprecated__crafting'
+ 'mod/:modSlug': 'deprecated__mod'
+ 'mod/:modSlug/:itemSlug': 'deprecated__modItem'
# Route Methods ################################################################################
@@ -92,15 +93,18 @@ module.exports = class Router extends Backbone.Router
route__browse: ->
@_siteController.setPage 'browse', new BrowsePageController @_makeOptions {}
- route__browseMod: (modSlug)->
+ route__browseMod: (modId)->
controller = new ModPageController @_makeOptions()
- controller.model = @_siteController.modPack.getMod modSlug
+ controller.model = @_siteController.modPack.mods[modId]
@_siteController.setPage 'browseMod', controller
- route__browseModItem: (modSlug, itemSlug)->
+ route__browseModItem: (modId, itemSlug)->
+ item = @_siteController.modPack.findItemBySlug itemSlug, modId:modId
+ if not item? then throw new Error "could not find item #{modId}__#{itemSlug}"
+
+ itemPage = new ItemPage item
params = new UrlParams login:{type:'boolean', default:false}
- slug = new ItemSlug modSlug, itemSlug
- controller = new ItemPageController @_makeOptions {itemSlug:slug, login:params.login}
+ controller = new ItemPageController @_makeOptions {model:itemPage, login:params.login}
@_siteController.setPage 'browseModItem', controller
route__browseTutorial: (modSlug, tutorialSlug)->
diff --git a/src/client/site/site_controller.coffee b/src/client/site/site_controller.coffee
index f44ef194b..c0bbeb6cc 100644
--- a/src/client/site/site_controller.coffee
+++ b/src/client/site/site_controller.coffee
@@ -7,6 +7,7 @@
AdsenseController = require './common/adsense/adsense_controller'
BaseController = require './base_controller'
+c = require "../../common/constants"
FeedbackController = require './feedback/feedback_controller'
FileCache = require '../models/site/file_cache'
FooterController = require './footer/footer_controller'
@@ -23,14 +24,14 @@ module.exports = class SiteController extends BaseController
constructor: (options={})->
if not options.client? then throw new Error 'options.client is required'
+ if not options.modPack? then throw new Error 'options.modPack is required'
if not options.storage? then throw new Error 'options.storage is required'
options.el = 'html'
super options
@client = options.client
- @fileCache = new FileCache c.url.modpackArchive()
@imageLoader = new ImageLoader defaultUrl:'/images/unknown.png'
- @modPack = new ModPack {}, fileCache:@fileCache
+ @modPack = options.modPack
@router = new Router this
@storage = options.storage
@@ -41,23 +42,6 @@ module.exports = class SiteController extends BaseController
# Public Methods ###############################################################################
- loadDefaultModPack: ->
- makeResponder = (m)-> return ->
- m.activeModVersion.fetch() if m.activeModVersion?
-
- for modSlug, modData of c.defaultMods
- mod = new Mod {slug:modSlug}, {fileCache:@fileCache}
- mod.on c.event.change + ':activeModVersion', makeResponder mod
- @storage.register "mod:#{mod.slug}", mod, 'activeVersion', modData.defaultVersion
- mod.fetch()
-
- @modPack.addMod mod
-
- if global.env isnt 'prerender'
- @modPack.once c.event.sync, =>
- @$pageContent.removeClass 'hidden'
- @$pageContentLoading.addClass 'hidden'
-
loadCurrentUser: ->
@client.getCurrentUser()
.then (response)=>
@@ -129,6 +113,10 @@ module.exports = class SiteController extends BaseController
@_feedbackController = @addChild FeedbackController, '.view__feedback'
+ if global.env isnt "prerender"
+ @$pageContent.removeClass "hidden"
+ @$pageContentLoading.addClass "hidden"
+
# Private Methods ##############################################################################
setPage: (page, controller)->
diff --git a/src/common/constants.coffee b/src/common/constants.coffee
index 9ba786139..8c1214f7a 100644
--- a/src/common/constants.coffee
+++ b/src/common/constants.coffee
@@ -99,9 +99,6 @@ login.clientIds =
'staging': '3d75ed772ce5004180d6'
'production': 'ce71be7f66926ff6ff38'
-exports.modpack = modpack = {}
-modpack.default = "crafting-guide-default"
-
exports.opacity = opacity = {}
opacity.hidden = 1e-6
opacity.shown = 1