From ab96166601afb9456e7a67a04e2d87128fa76484 Mon Sep 17 00:00:00 2001 From: Andrew Miner Date: Thu, 13 Jul 2017 16:52:51 -0400 Subject: [PATCH] Add missing detail data to item pages --- src/client/client.coffee | 60 ++++++++++--------- src/client/models/site/item_display.coffee | 2 +- src/client/models/site/item_page.coffee | 14 +++++ .../site/common/video/video_controller.coffee | 13 ++-- .../item_page/item_page_controller.coffee | 11 ++-- src/client/site/router.coffee | 2 + src/server/crafting_guide_server.coffee | 1 + src/server/middleware.coffee | 2 +- 8 files changed, 63 insertions(+), 42 deletions(-) diff --git a/src/client/client.coffee b/src/client/client.coffee index 67822d11f..ebf5d2286 100644 --- a/src/client/client.coffee +++ b/src/client/client.coffee @@ -8,81 +8,83 @@ ############################################################################################################ # Allow Node.js-style `global` in addition to `window` -if typeof(global) is 'undefined' +if typeof(global) is "undefined" window.global = window -global._ = require '../common/underscore' -global.$ = require 'jquery' -global.c = require '../common/constants' +global._ = require "../common/underscore" +global.$ = require "jquery" +global.c = require "../common/constants" global.π = Math.PI global.ε = 0.0001 -global.w = require 'when' +global.w = require "when" -{Logger} = require('crafting-guide-common').util +{Logger} = require("crafting-guide-common").util global.logger = new Logger -Tracker = require './tracker' +Tracker = require "./tracker" global.tracker = new Tracker -marked = require 'marked' +marked = require "marked" marked.setOptions sanitize:true -global.Backbone = Backbone = require 'backbone' +global.Backbone = Backbone = require "backbone" Backbone.$ = $ ######################################################################################################################## global.hostName = window.location.hostname switch global.hostName - when 'prerender.crafting-guide.com' - global.env = 'prerender' + when "prerender.crafting-guide.com" + global.env = "prerender" logger.level = Logger.FATAL - apiBaseUrl = 'http://prerender.crafting-guide.com:4347' - when 'local.crafting-guide.com', 'localhost' - global.env = 'local' + apiBaseUrl = "http://prerender.crafting-guide.com:4347" + when "local.crafting-guide.com", "localhost" + global.env = "local" logger.level = Logger.DEBUG apiBaseUrl = "http://#{global.hostName}:4347" - when 'staging.crafting-guide.com' - global.env = 'staging' + when "staging.crafting-guide.com" + global.env = "staging" logger.level = Logger.VERBOSE - apiBaseUrl = 'http://api-staging.crafting-guide.com' - when 'crafting-guide.com' - global.env = 'production' + apiBaseUrl = "http://api-staging.crafting-guide.com" + when "crafting-guide.com" + global.env = "production" logger.level = Logger.INFO tracker.enabled = true - apiBaseUrl = 'http://api.crafting-guide.com' + apiBaseUrl = "http://api.crafting-guide.com" else throw new Error "cannot determine the environment of: #{window.location.hostname}" ######################################################################################################################## -Storage = require './storage' +Storage = require "./storage" storage = new Storage storage:global.localStorage ######################################################################################################################## tracker.trackPageView() -{CraftingGuideClient} = require('crafting-guide-common').api +{CraftingGuideClient} = require("crafting-guide-common").api client = _(new CraftingGuideClient(baseUrl:apiBaseUrl)).extend Backbone.Events client.onStatusChanged = (client, oldStatus, newStatus)-> logger.info "Crafting Guide server status changed from #{oldStatus} to #{newStatus}" - client.trigger 'change:status', client, oldStatus, newStatus - client.trigger 'change', client + client.trigger "change:status", client, oldStatus, newStatus + client.trigger "change", client client.startMonitoringStatus() ######################################################################################################################## -{http, ModPackStore} = require("crafting-guide-common").api -modPackBaseUrl = "#{location.protocol}//#{location.hostname}:#{location.port}" -modPackStore = new ModPackStore http, modPackBaseUrl +{http, ModPackStore, ItemDetailStore} = require("crafting-guide-common").api +storeOptions = http:http, baseUrl:"#{location.protocol}//#{location.hostname}:#{location.port}" +global.stores = + modPack: new ModPackStore storeOptions + itemDetail: new ItemDetailStore storeOptions ######################################################################################################################## -modPackStore.load c.modPacks.default +global.stores.modPack.load c.modPacks.default .then (modPack)-> - SiteController = require './site/site_controller' + SiteController = require "./site/site_controller" global.site = site = new SiteController client:client, storage:storage, modPack:modPack site.render() site.loadCurrentUser() diff --git a/src/client/models/site/item_display.coffee b/src/client/models/site/item_display.coffee index afa5a61db..a35582e0f 100644 --- a/src/client/models/site/item_display.coffee +++ b/src/client/models/site/item_display.coffee @@ -1,5 +1,5 @@ # -# Crafting Guide - item_page.coffee +# Crafting Guide - item_display.coffee # # Copyright © 2014-2017 by Redwood Labs # All rights reserved. diff --git a/src/client/models/site/item_page.coffee b/src/client/models/site/item_page.coffee index 5bbd62b9f..88fcba6ba 100644 --- a/src/client/models/site/item_page.coffee +++ b/src/client/models/site/item_page.coffee @@ -27,7 +27,9 @@ module.exports = class ItemPage extends Observable set: (item)-> if @_item? then throw new Error "item cannot be reassigned" if not item? then throw new Error "item is required" + if @_item? then @_item.off Observable::ANY, this @_item = item + @_item.on Observable::ANY, this, "_onItemChanged" itemDisplay: get: -> return @_itemDisplay ?= new ItemDisplay @item @@ -60,6 +62,14 @@ module.exports = class ItemPage extends Observable return @_findItemsWithMatchingRecipes (recipe)=> return recipe.tools[@item.id]? + loadDetails: -> + stores.itemDetail.loadDetailFor @item + .catch (error)=> + if error.message.indexOf("404") is -1 + logger.error "Could not load details for item #{@item.id}: #{error.message}" + else + logger.info "Item #{@item.id} has no details file." + # Private Methods ############################################################################## _findItemsWithMatchingRecipes: (isMatching)-> @@ -79,3 +89,7 @@ module.exports = class ItemPage extends Observable return a.displayName.localeCompare b.displayName return result + + _onItemChanged: -> + @trigger Observable::CHANGE + diff --git a/src/client/site/common/video/video_controller.coffee b/src/client/site/common/video/video_controller.coffee index f4f72bdab..4d675fa12 100644 --- a/src/client/site/common/video/video_controller.coffee +++ b/src/client/site/common/video/video_controller.coffee @@ -5,30 +5,31 @@ # All rights reserved. # -BaseController = require '../../base_controller' +BaseController = require "../../base_controller" ######################################################################################################################## module.exports = class VideoController extends BaseController constructor: (options={})-> - if not options.model? then throw new Error 'options.model is required' - options.templateName = 'common/video' + if not options.model? then throw new Error "options.model is required" + options.templateName = "common/video" super options # BaseController Overrides ##################################################################### onDidRender: -> - @$iframe = @$('iframe') - @$caption = @$('.caption p') + @$iframe = @$("iframe") + @$caption = @$(".caption p") super refresh: -> @$caption.html @model.name - @$iframe.attr 'src', @_createYouTubeUrl() + @$iframe.attr "src", @_createYouTubeUrl() super # Private ###################################################################################### _createYouTubeUrl: -> return "http://www.youtube.com/embed/#{@model.youTubeId}?modestbranding=1&autohide=1&showinfo=0" + diff --git a/src/client/site/item_page/item_page_controller.coffee b/src/client/site/item_page/item_page_controller.coffee index 8cbce16a3..ce2fc8b63 100644 --- a/src/client/site/item_page/item_page_controller.coffee +++ b/src/client/site/item_page/item_page_controller.coffee @@ -119,8 +119,8 @@ module.exports = class ItemPageController extends PageController @_descriptionController.imageBase = c.url.itemImageDir @model.itemDisplay - if @model.item.officialUrl? - @$officialLink.attr 'href', @model.item.officialUrl + if @model.item.detail?.links.length > 0 + @$officialLink.attr 'href', @model.item.detail.links[0] @show @$aboutLinks else @hide @$aboutLinks @@ -217,8 +217,8 @@ module.exports = class ItemPageController extends PageController throw e _refreshDescription: -> - if @model.item?.description?.length > 0 - @_descriptionController.model = @model.item.description + if @model.item.detail?.description.length > 0 + @_descriptionController.model = @model.item.detail.description @_descriptionController.resetToDefaultState() _refreshMultiblock: -> @@ -284,7 +284,7 @@ module.exports = class ItemPageController extends PageController @_videoControllers ?= [] index = 0 - videos = @model?.item?.videos or [] + videos = @model.item.detail?.videos if videos? and videos.length > 0 @$videosSectionTitle.html if videos.length is 1 then 'Video' else 'Videos' @@ -305,3 +305,4 @@ module.exports = class ItemPageController extends PageController while @_videoControllers.length > index @_videoControllers.pop().remove() + diff --git a/src/client/site/router.coffee b/src/client/site/router.coffee index 39783e41f..74e3412f3 100644 --- a/src/client/site/router.coffee +++ b/src/client/site/router.coffee @@ -103,6 +103,8 @@ module.exports = class Router extends Backbone.Router if not item? then throw new Error "could not find item #{modId}__#{itemSlug}" itemPage = new ItemPage item + itemPage.loadDetails() + params = new UrlParams login:{type:'boolean', default:false} controller = new ItemPageController @_makeOptions {model:itemPage, login:params.login} @_siteController.setPage 'browseModItem', controller diff --git a/src/server/crafting_guide_server.coffee b/src/server/crafting_guide_server.coffee index 3b8cd6423..296e87ba6 100644 --- a/src/server/crafting_guide_server.coffee +++ b/src/server/crafting_guide_server.coffee @@ -41,3 +41,4 @@ module.exports = class CraftingGuideServer console.log "CraftingGuide is shutting down" @httpServer.close() => resolve this + diff --git a/src/server/middleware.coffee b/src/server/middleware.coffee index 200ec9ad1..1887df898 100644 --- a/src/server/middleware.coffee +++ b/src/server/middleware.coffee @@ -26,7 +26,7 @@ exports.installBefore = (app)-> ] exports.installAfter = (app)-> - app.use '/data', express.static '../../crafting-guide-data/data/', etag:false, maxAge: 0 + app.use '/data', express.static '/src/crafting-guide/data/data/', etag:false, maxAge: 0 app.use express.static './static', etag: false, maxAge: 0 # Middleware Functions #####################################################################################