From 8b43c53a9ef264d10df96b692ce820289032138b Mon Sep 17 00:00:00 2001 From: Andrew Miner Date: Thu, 15 Jun 2017 22:39:17 -0700 Subject: [PATCH] WIP --- package.json | 2 +- src/client/client.coffee | 21 ++-- src/client/models/site/item_display.coffee | 54 ++++++++++ src/client/models/site/item_page.coffee | 85 +++++++++------ .../models/stores/mod_pack_store.coffee | 56 ---------- src/client/site/base_controller.coffee | 17 ++- .../browse_page/browse_page_controller.coffee | 3 +- .../mod_tile/mod_tile_controller.coffee | 8 +- .../item_tile/item_tile_controller.coffee | 28 +++-- .../mod_version_selector.jade | 3 - .../mod_version_selector_controller.coffee | 72 +++---------- .../item_page/item_page_controller.coffee | 58 ++++------ .../site/mod_page/mod_page_controller.coffee | 56 ++++------ src/client/site/router.coffee | 100 +++++++++--------- src/client/site/site_controller.coffee | 26 ++--- src/common/constants.coffee | 3 - 16 files changed, 267 insertions(+), 325 deletions(-) create mode 100644 src/client/models/site/item_display.coffee delete mode 100644 src/client/models/stores/mod_pack_store.coffee 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