Add first half of login process

This commit is contained in:
Andrew Miner
2015-03-30 18:39:37 -07:00
parent d1826c257b
commit 764f835698
17 changed files with 263 additions and 17 deletions
Binary file not shown.
+2 -1
View File
@@ -31,6 +31,7 @@ serveIndex = (request, response)->
app.get '*/$', serveIndex app.get '*/$', serveIndex
app.get '/craft/*', serveIndex app.get '/craft/*', serveIndex
app.get '/login', serveIndex
app.get '*', (request, response)-> app.get '*', (request, response)->
extension = path.extname(request.path) extension = path.extname(request.path)
@@ -49,5 +50,5 @@ app.get '*', (request, response)->
response.set 'Content-Type', contentType response.set 'Content-Type', contentType
response.sendFile request.path, root:ROOT response.sendFile request.path, root:ROOT
server = app.listen 8000, -> server = app.listen 8000, '127.0.0.1', ->
console.log "listening at: #{server.address().address}:#{server.address().port}" console.log "listening at: #{server.address().address}:#{server.address().port}"
+10 -6
View File
@@ -61,6 +61,16 @@ Event.transitionEnd = (->
exports.Key = Key = {} exports.Key = Key = {}
Key.Return = 13 Key.Return = 13
exports.Login = Login = {}
Login.authorizeUrl = _.template "https://github.com/login/oauth/authorize" +
"?client_id=ea419abd2ab96c708815&scope=public_repo&state=<%= state %>" +
exports.ModelState = ModelState = {}
ModelState.unloaded = 'unloaded'
ModelState.loading = 'loading'
ModelState.loaded = 'loaded'
ModelState.failed = 'failed'
exports.Opacity = Opacity = {} exports.Opacity = Opacity = {}
Opacity.hidden = 1e-6 Opacity.hidden = 1e-6
Opacity.shown = 1 Opacity.shown = 1
@@ -69,12 +79,6 @@ exports.ProductionEnvs = [ 'staging', 'production' ]
exports.RequiredMods = [ 'minecraft' ] exports.RequiredMods = [ 'minecraft' ]
exports.ModelState = ModelState = {}
ModelState.unloaded = 'unloaded'
ModelState.loading = 'loading'
ModelState.loaded = 'loaded'
ModelState.failed = 'failed'
exports.Text = Text = {} exports.Text = Text = {}
Text.title = 'The Ultimate Minecraft Crafting Guide' Text.title = 'The Ultimate Minecraft Crafting Guide'
@@ -64,3 +64,4 @@ module.exports = class HeaderController extends BaseController
return _.extend super, return _.extend super,
'click a.logo': 'onLogoClicked' 'click a.logo': 'onLogoClicked'
'click .navBar a': 'onNavItemClicked' 'click .navBar a': 'onNavItemClicked'
'click .login a': 'routeLinkClick'
@@ -0,0 +1,110 @@
###
Crafting Guide - login_page_controller.coffee
Copyright (c) 2015 by Redwood Labs
All rights reserved.
###
PageController = require './page_controller'
{Login} = require '../constants'
########################################################################################################################
module.exports = class LoginPageController extends PageController
@ServerStatus:
Up: 'up'
Down: 'down'
constructor: (options={})->
options.templateName = 'login_page'
super options
@client = options.client
@storage = options.storage
# Event Methods ################################################################################
onExpandReadMore: (event)->
event.preventDefault()
@$readMoreLink.addClass 'hidden'
@$readMoreContent.removeClass 'closed'
onLoginButtonClicked: (event)->
event.preventDefault()
@_redirectToGitHub()
# Property Methods #############################################################################
getLoginSecurityToken: ->
@storage.load 'loginSecurityToken'
setLoginSecurityToken: (value)->
@storage.store 'loginSecurityToken', value
getServerStatus: ->
return @_serverStatus
setServerStatus: (serverStatus)->
@_serverStatus = serverStatus
@tryRefresh()
Object.defineProperties @prototype,
loginSecurityToken: {get:@prototype.getLoginSecurityToken, set:@prototype.setLoginSecurityToken}
serverStatus: {get:@prototype.getServerStatus, set:@prototype.setServerStatus}
# PageController Overrides #####################################################################
getTitle: ->
return "Login"
# BaseController Methods #######################################################################
onWillRender: ->
@_validateServerStatus()
super
onDidRender: ->
@$readMoreLink = @$('a.read-more')
@$readMoreContent = @$('.read-more-content')
@$serviceUpContent = @$('.service-up')
@$serviceDownContent = @$('.service-down')
super
refresh: ->
if @serverStatus is LoginPageController.ServerStatus.Down
@$serviceUpContent.addClass 'hidden'
@$serviceDownContent.removeClass 'hidden'
else
@$serviceUpContent.removeClass 'hidden'
@$serviceDownContent.addClass 'hidden'
super
# Backbone.View Overrides ######################################################################
events: ->
return _.extend super,
'click a.read-more': 'onExpandReadMore'
'click button': 'onLoginButtonClicked'
# Private Methods ##############################################################################
_redirectToGitHub: ->
@loginSecurityToken = _.uuid()
baseUrl = Login.authorizeUrl state:@loginSecurityToken
window.location.href = baseUrl
_validateServerStatus: ->
message = _.uuid()
logger.info "Checking Crafting Guide Server at #{@client.baseUrl}..."
@client.ping message:message
.then (response)=>
if response.json.message is message
@serverStatus = LoginPageController.ServerStatus.Up
logger.info "Crafting Guide Server is up"
else
throw new Error "Invalid server ping response: #{response.json.message} isnt #{message}"
.catch (error)=>
@serverStatus = LoginPageController.ServerStatus.Down
logger.error "Crafting Guide server is down: #{error}"
+8 -1
View File
@@ -13,6 +13,7 @@ HomePageController = require './controllers/home_page_controller'
ImageLoader = require './controllers/image_loader' ImageLoader = require './controllers/image_loader'
ItemPageController = require './controllers/item_page_controller' ItemPageController = require './controllers/item_page_controller'
ItemSlug = require './models/item_slug' ItemSlug = require './models/item_slug'
LoginPageController = require './controllers/login_page_controller'
Mod = require './models/mod' Mod = require './models/mod'
ModPack = require './models/mod_pack' ModPack = require './models/mod_pack'
ModPageController = require './controllers/mod_page_controller' ModPageController = require './controllers/mod_page_controller'
@@ -36,10 +37,11 @@ module.exports = class CraftingGuideRouter extends Backbone.Router
@_lastReported = null @_lastReported = null
super options super options
@client = options.client
@imageLoader = new ImageLoader defaultUrl:'/images/unknown.png' @imageLoader = new ImageLoader defaultUrl:'/images/unknown.png'
@modPack = new ModPack @modPack = new ModPack
@storage = new Storage storage:window.localStorage @storage = new Storage storage:window.localStorage
@_defaultOptions = imageLoader:@imageLoader, modPack:@modPack, storage:@storage @_defaultOptions = client:@client, imageLoader:@imageLoader, modPack:@modPack, storage:@storage
@headerController = new HeaderController el:'.view__header' @headerController = new HeaderController el:'.view__header'
@headerController.render() @headerController.render()
@@ -73,6 +75,7 @@ module.exports = class CraftingGuideRouter extends Backbone.Router
'configure(/)': 'route__configure' 'configure(/)': 'route__configure'
'craft(/)': 'route__craft' 'craft(/)': 'route__craft'
'craft/:text': 'route__craft' 'craft/:text': 'route__craft'
'login(/)': 'route__login'
'item/:itemSlug': 'deprecated__item' 'item/:itemSlug': 'deprecated__item'
'crafting/(:text)': 'deprecated__crafting' 'crafting/(:text)': 'deprecated__crafting'
@@ -114,6 +117,10 @@ module.exports = class CraftingGuideRouter extends Backbone.Router
controller.model.params = inventoryText:text controller.model.params = inventoryText:text
@_setPage 'craft', controller @_setPage 'craft', controller
route__login: ->
controller = new LoginPageController _.extend {}, @_defaultOptions
@_setPage 'login', controller
# Deprecated Route Methods ##################################################################### # Deprecated Route Methods #####################################################################
deprecated__crafting: (text)-> deprecated__crafting: (text)->
+15 -9
View File
@@ -8,10 +8,11 @@ All rights reserved.
require './underscore_mixins' require './underscore_mixins'
require './polyfill' require './polyfill'
CraftingGuideRouter = require './crafting_guide_router' CraftingGuideRouter = require './crafting_guide_router'
FeedbackController = require './controllers/feedback_controller' FeedbackController = require './controllers/feedback_controller'
views = require './views' views = require './views'
{Logger} = require 'crafting-guide-common' {CraftingGuideClient} = require 'crafting-guide-common'
{Logger} = require 'crafting-guide-common'
######################################################################################################################## ########################################################################################################################
@@ -22,17 +23,22 @@ if typeof(global) is 'undefined'
global.logger = new Logger global.logger = new Logger
switch window.location.hostname switch window.location.hostname
when 'localhost' when 'local.crafting-guide.com'
global.env = 'development' global.env = 'development'
logger.level = Logger.DEBUG logger.level = Logger.DEBUG
apiBaseUrl = 'http://localhost:8001'
when 'new.crafting-guide.com' when 'new.crafting-guide.com'
global.env = 'staging' global.env = 'staging'
logger.level = Logger.VERBOSE logger.level = Logger.VERBOSE
apiBaseUrl = 'https://crafting-guide-production.herokuapp.com'
when 'crafting-guide.com' when 'crafting-guide.com'
global.env = 'production' global.env = 'production'
logger.level = Logger.INFO logger.level = Logger.INFO
apiBaseUrl = 'https://crafting-guide-production.herokuapp.com'
else
throw new Error "cannot determine the environment of: #{window.location.hostname}"
global.router = new CraftingGuideRouter global.router = new CraftingGuideRouter client:new CraftingGuideClient baseUrl:apiBaseUrl
global.util = require 'util' global.util = require 'util'
global.views = views global.views = views
global.markdown = global.markdown.markdown global.markdown = global.markdown.markdown
+2
View File
@@ -31,3 +31,5 @@ _.mixin
parts = [ null, parts[0] ] parts = [ null, parts[0] ]
return parts return parts
_.mixin require('crafting-guide-common').stringMixins
+1
View File
@@ -12,6 +12,7 @@
.addthis_sharing_toolbox .addthis_sharing_toolbox
.divider.bottom .divider.bottom
.login: a(href="/login") Login
.navBar .navBar
a(data-page="home", href="/") a(data-page="home", href="/")
+38
View File
@@ -0,0 +1,38 @@
//-
//- Crafting Guide - login_page.jade
//-
//- Copyright (c) 2015 by Redwood Labs
//- All rights reserved.
//-
.view__login_page
.two-thirds-content.hideable.service-up
img.float-right(src="/images/github-login-large.png")
h1 Login with GitHub
p.
Use your GitHub credentials to login and make changes on Crafting Guide. No GitHub account? Don't worry, you
can get one for free. <a class="read-more" href="#">read more...</a>
.read-more-content.slideable.closed
p.
All changes you make on the site get submitted directly to our GitHub repo, and then published through
the same automated deployment process as changes made by anyone else. That way, anyone can contribute
easily: whether developer or end user.
p.
To log in, we redirect you to GitHub's site, and once you're signed in, they'll send you back here. We
never see your credentials, and only get the minimum set of permissions necessary to submit changes to
the Crafting Guide repo on your behalf.
p.
GitHub offers free accounts, so even if you don't already have one, you've got nothing to lose!
.actions
button.huge Login with GitHub
.clear
.two-thirds-content.hideable.hidden.service-down
h1 Sorry!
p.
Our interactive editing service is down right now, but you can always submit a pull request over at
the <a href="https://github.com/andrewminer/crafting-guide">Crafting Guide GitHub Repository</a>. We'll have
the editing service back up soon!
+24
View File
@@ -19,6 +19,10 @@ All rights reserved.
text-align: center; text-align: center;
} }
.clear {
clear: both;
}
.content { .content {
background: $color-content; background: $color-content;
box-shadow: 10px 10px 20px #666; box-shadow: 10px 10px 20px #666;
@@ -32,6 +36,11 @@ All rights reserved.
.error-new { background: $color-error-new !important; } .error-new { background: $color-error-new !important; }
.float-right {
float: right;
margin-left: 3em;
}
.hideable { .hideable {
opacity: 1; opacity: 1;
transition: opacity $animate-normal; transition: opacity $animate-normal;
@@ -111,6 +120,21 @@ All rights reserved.
} }
} }
.slideable {
max-height: 500px;
overflow: hidden;
transition: max-height $animate-normal;
&.closed {
max-height: 0;
}
}
.two-thirds-content {
position: relative; width: 66%;
margin: 5em 16.5%;
}
.videos { .videos {
.panel { .panel {
text-align: center; text-align: center;
+1
View File
@@ -77,6 +77,7 @@ $color-footer-text: #FFFFFF;
$color-link: #0000FF; $color-link: #0000FF;
$color-link-subtle: #545A99; $color-link-subtle: #545A99;
$color-text: #000000; $color-text: #000000;
$color-text-light: #FFFFFF;
// Z-Index Layers ////////////////////////////////////////////////////////////////////////////////// // Z-Index Layers //////////////////////////////////////////////////////////////////////////////////
+5
View File
@@ -29,6 +29,11 @@ button {
margin: 2em 0; margin: 2em 0;
padding: 0.5em 0.5em; padding: 0.5em 0.5em;
} }
&.huge {
font-size: $font-size-large;
padding: 0.5em 3em;
}
} }
h1 { h1 {
+1
View File
@@ -17,6 +17,7 @@ All rights reserved.
@import 'inventory_table'; @import 'inventory_table';
@import 'item'; @import 'item';
@import 'item_page'; @import 'item_page';
@import 'login_page';
@import 'minimal_recipe'; @import 'minimal_recipe';
@import 'mod'; @import 'mod';
@import 'mod_pack'; @import 'mod_pack';
+33
View File
@@ -0,0 +1,33 @@
/*
Crafting Guide - login_page.scss
Copyright (C) 2015 by Redwood Labs
All rights reserved.
*/
.view__login_page {
button {
outline: none;
}
h1 {
font-family: $font-family-header;
font-size: $font-size-x-large;
padding-top: 2em;
}
p {
margin-bottom: 1em;
}
.actions {
margin-top: 4em;
width: 100%;
text-align: center;
}
.read-more {
font-size: 75%;
}
}
+12
View File
@@ -55,6 +55,18 @@ All rights reserved.
.divider { .divider {
background: $color-brick-dark url('/images/stone_brick.png'); background: $color-brick-dark url('/images/stone_brick.png');
position: absolute; bottom: 5em; height: 3.2em; width: 100%; position: absolute; bottom: 5em; height: 3.2em; width: 100%;
.login {
position: absolute; top: 50%; right: 2em;
@include transform(translateY(-50%));
a {
color: $color-text-light;
font-family: $font-family-normal;
font-size: $font-size-normal;
font-weight: bold;
}
}
} }
.navBar { .navBar {
Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB