From da1419d6b688140a33e18039983480d54f8b3a2e Mon Sep 17 00:00:00 2001 From: Andrew Miner Date: Sat, 7 May 2016 12:25:21 -0700 Subject: [PATCH] Add a "Random Item" link to the breadcrumb bar fixes #216 --- src/client/models/game/mod.coffee | 6 ++ src/client/models/game/mod_pack.coffee | 6 ++ src/client/models/game/mod_version.coffee | 4 ++ src/client/site/header/header.jade | 4 +- src/client/site/header/header.scss | 63 ++++++++++--------- .../site/header/header_controller.coffee | 25 ++++++-- .../item_page/item_page_controller.coffee | 13 ++++ src/client/site/page_controller.coffee | 4 ++ 8 files changed, 87 insertions(+), 38 deletions(-) diff --git a/src/client/models/game/mod.coffee b/src/client/models/game/mod.coffee index aebfe2148..e5e058564 100644 --- a/src/client/models/game/mod.coffee +++ b/src/client/models/game/mod.coffee @@ -93,6 +93,12 @@ module.exports = class Mod extends BaseModel # Item Methods ################################################################################# + chooseRandomItem: -> + effectiveModVersion = @_activeModVersion or @getModVersion Mod.Version.Latest + return null unless effectiveModVersion? + + return effectiveModVersion.chooseRandomItem() + eachItem: (callback)-> effectiveModVersion = @_activeModVersion or @getModVersion Mod.Version.Latest effectiveModVersion.eachItem callback diff --git a/src/client/models/game/mod_pack.coffee b/src/client/models/game/mod_pack.coffee index 10aba6bd3..08cd54df7 100644 --- a/src/client/models/game/mod_pack.coffee +++ b/src/client/models/game/mod_pack.coffee @@ -25,6 +25,12 @@ module.exports = class ModPack extends BaseModel # Item Methods ################################################################################# + chooseRandomItem: -> + return null unless @_mods.length > 0 + + modIndex = Math.floor Math.random() * @_mods.length + return @_mods[modIndex].chooseRandomItem() + findItem: (itemSlug, options={})-> options.includeDisabled ?= false diff --git a/src/client/models/game/mod_version.coffee b/src/client/models/game/mod_version.coffee index d2c1503f8..466361538 100644 --- a/src/client/models/game/mod_version.coffee +++ b/src/client/models/game/mod_version.coffee @@ -59,6 +59,10 @@ module.exports = class ModVersion extends BaseModel return null if result.length is 0 return result + chooseRandomItem: -> + itemIndex = Math.floor Math.random() * @_slugs.length + return @_slugs[itemIndex] + eachItem: (callback)-> for slug in @_slugs item = @findItem slug diff --git a/src/client/site/header/header.jade b/src/client/site/header/header.jade index ebe30e327..55a1329ac 100644 --- a/src/client/site/header/header.jade +++ b/src/client/site/header/header.jade @@ -21,4 +21,6 @@ .button.search: .bezel: p Search .button.login: .bezel: p Login - .breadcrumbs + .breadcrumb-bar + .breadcrumbs + .extra-nav diff --git a/src/client/site/header/header.scss b/src/client/site/header/header.scss index 65aec891f..d9b782a90 100644 --- a/src/client/site/header/header.scss +++ b/src/client/site/header/header.scss @@ -15,10 +15,6 @@ display : flex; align-items : center; - @include screen-size(mobile) { - display : none; - } - a { flex : 0 0 auto; height : $size-minecraft-block * 1.5; @@ -29,30 +25,15 @@ position : relative; height : $size-minecraft-block * 1.5; width : $size-minecraft-block * 1.5; - - @include screen-size(desktop) { - top : -$size-minecraft-block * 0.5; - left : -$size-minecraft-block * 0.5; - height : $size-minecraft-block * 2.0; - width : $size-minecraft-block * 2.0; - } } } h1 { flex: 1 1 auto; white-space: nowrap; - - @include screen-size(tablet) { - font-size : $font-size-xlarge; - } } .addthis_sharing_toolbox { - @include screen-size(mobile) { - display: none; - } - flex : 0 0 auto; min-height : 37px; // actual size of addthis component min-width : 144px; @@ -97,26 +78,40 @@ } } - .breadcrumbs { + .breadcrumb-bar { background: $color-screen; + padding: 0 ($size-margin-medium + $size-margin-large); + font-family: $font-family-control; font-size: $font-size-medium; - - padding-left: $size-margin-medium + $size-margin-large; line-height: $font-size-medium + 2 * $size-margin-small; - text-indent: -$size-margin-large; - &:before { - content: "⟩"; - margin-right: $size-margin-medium; + display: flex; + + .breadcrumbs { + flex: 1 1 75%; + + text-indent: -$size-margin-large; + + &:before { + content: "⟩"; + margin-right: $size-margin-medium; + } + + a { + text-decoration: underline; + } + + span { + margin: 0 $size-margin-medium; + } } - a { - text-decoration: underline; - } + .extra-nav { + flex: 1 1 25%; + align-self: flex-end; - span { - margin: 0 $size-margin-medium; + text-align: right; } } } @@ -157,5 +152,11 @@ display: none; } } + + .breadcrumb-bar { + .extra-nav { + display: none; + } + } } } diff --git a/src/client/site/header/header_controller.coffee b/src/client/site/header/header_controller.coffee index c3d4842b8..b8f8780b5 100644 --- a/src/client/site/header/header_controller.coffee +++ b/src/client/site/header/header_controller.coffee @@ -64,6 +64,7 @@ module.exports = class HeaderController extends BaseController @$('.addthis_sharing_toolbox').addClass 'placeholder' @$breadcrumbs = @$('.breadcrumbs') + @$extraNav = @$('.extra-nav') @$loginButtonLabel = @$('.button.login p') @$title = $('title') super @@ -77,6 +78,7 @@ module.exports = class HeaderController extends BaseController @$loginButtonLabel.text if global.site.user? then "Logout" else "Login" @_refreshBreadcrumbs() + @_refreshExtraNav() @_refreshSelectedNavButton() @_refreshTitle() super @@ -85,12 +87,12 @@ module.exports = class HeaderController extends BaseController events: -> _.extend super, - 'click .craft': 'onCraft' - 'click .browse': 'onBrowse' - 'click .login': 'onLogin' - 'click .news': 'onNews' - 'click .search': 'onSearch' - 'click .breadcrumbs a': 'routeLinkClick' + 'click .craft': 'onCraft' + 'click .browse': 'onBrowse' + 'click .login': 'onLogin' + 'click .news': 'onNews' + 'click .search': 'onSearch' + 'click .breadcrumb-bar a': 'routeLinkClick' # Private Methods ############################################################################## @@ -109,6 +111,17 @@ module.exports = class HeaderController extends BaseController else @hide @$breadcrumbs + _refreshExtraNav: -> + extraNavContent = @model?.controller?.getExtraNav() + + if extraNavContent? + @$extraNav.empty() + @$extraNav.append extraNavContent + @show @$extraNav + else + @hide @$extraNav + + _refreshSelectedNavButton: -> return unless @model?.page? diff --git a/src/client/site/item_page/item_page_controller.coffee b/src/client/site/item_page/item_page_controller.coffee index f2d996547..9fb5ee978 100644 --- a/src/client/site/item_page/item_page_controller.coffee +++ b/src/client/site/item_page/item_page_controller.coffee @@ -68,6 +68,15 @@ module.exports = class ItemPageController extends PageController $("#{display.itemName}") ] + getExtraNav: -> + console.warn "getExtraNav()" + itemSlug = @_modPack.chooseRandomItem() + console.warn " itemSlug: #{itemSlug}" + return null unless itemSlug? + + itemDisplay = @_modPack.findItemDisplay itemSlug + return $("Random Item") + getMetaDescription: -> return null unless @_itemSlug? display = @_modPack.findItemDisplay @_itemSlug @@ -83,6 +92,10 @@ module.exports = class ItemPageController extends PageController # BaseController Overrides ##################################################################### + onDidModelChange: -> + @trigger c.event.change + super + onDidRender: -> options = imageLoader:@_imageLoader, modPack:@_modPack, router:@_router, show:false @_multiblockController = @addChild MultiblockViewerController, '.view__multiblock_viewer', options diff --git a/src/client/site/page_controller.coffee b/src/client/site/page_controller.coffee index 7dea8aa73..593e18a9b 100644 --- a/src/client/site/page_controller.coffee +++ b/src/client/site/page_controller.coffee @@ -19,6 +19,10 @@ module.exports = class PageController extends BaseController getBreadcrumbs: -> return [] + getExtraNav: -> + # subclasses may override this to provide extra content in the right-hand side of the breadcrumb bar + return null + getMetaDescription: -> # subclasses should override this to return the page-specific text for the meta description tag return null