Add feedback widget

This commit is contained in:
Andrew Miner
2015-01-12 12:35:36 -08:00
parent 1b328a8542
commit c510c5a1da
11 changed files with 294 additions and 11 deletions
@@ -0,0 +1,103 @@
###
Crafting Guide - feedback_controller.coffee
Copyright (c) 2015 by Redwood Labs
All rights reserved.
###
BaseController = require './base_controller'
{Duration} = require '../constants'
EmailClient = require '../models/email_client'
{Key} = require '../constants'
########################################################################################################################
module.exports = class FeedbackController extends BaseController
constructor: (options={})->
options.model ?= new EmailClient
options.templateName = 'feedback'
super options
Object.defineProperty this, 'isOpen', get:-> @$el.offset().left is 0
# Event Methods ################################################################################
onSendClicked: ->
return unless @$commentField.val().length > 0
@$sendButton.attr 'disabled', 'disabled'
message =
subject:'Crafting Guide Feedback'
body:
"""
url: #{window.location.href}
name: #{@$nameField.val()}
email: #{@$emailField.val()}
comment:
#{@$commentField.val()}
"""
@model.send(message)
.then =>
@onToggle()
@$error.slideUp duration:Duration.fast
.catch (error)=>
@$error.slideDown duration:Duration.normal
.finally =>
@$sendButton.removeAttr 'disabled'
onTextChanged: (event)->
if @$commentField.val().length > 0
@$sendButton.removeAttr 'disabled'
else
@$sendButton.attr 'disabled', 'disabled'
if event?.which is Key.Return and @$commentField.val().length > 0
@onSendClicked()
onToggle: ->
@$screen.off 'click'
if @isOpen
@$screen.css display:'none'
@$el.animate {left:-@$el.outerWidth()}, duration:Duration.normal, complete:=>
@$commentField.val ''
@$('input, textarea').blur()
else
@$screen.on 'click', => @onToggle()
@$screen.css display:'block'
@$el.animate {left:0}, duration:Duration.normal, complete:=>
if @$nameField.val().length is 0
@$nameField.focus()
else if @$emailField.val().length is 0
@$emailField.focus()
else
@$commentField.focus()
# BaseController Overrides #####################################################################
onDidRender: ->
@$screen = $('.view__screen')
@$commentField = @$('textarea[name="comment"]')
@$emailField = @$('input[name="email"]')
@$error = @$('.error')
@$nameField = @$('input[name="name"]')
@$sendButton = @$('button[name="send"]')
windowHeight = window.innerHeight
@$el.delay(Duration.slow).animate {left:-@$el.outerWidth()}, Duration.slow
@onTextChanged()
super
# Backbone.View Methods ########################################################################
events:
'click .label': 'onToggle'
'click button': 'onSendClicked'
'input textarea': 'onTextChanged'
'keyup textarea': 'onTextChanged'
+4
View File
@@ -8,6 +8,7 @@ All rights reserved.
require './underscore_mixins'
views = require './views'
FeedbackController = require './controllers/feedback_controller'
Logger = require './logger'
CraftingGuideRouter = require './crafting_guide_router'
@@ -22,5 +23,8 @@ global.views = views
if window.location.hostname is 'localhost'
logger.level = Logger.TRACE
feedbackController = new FeedbackController el:'.view__feedback'
feedbackController.render()
logger.info "CraftingGuide is ready"
Backbone.history.start pushState:true
+57
View File
@@ -0,0 +1,57 @@
###
Crafting Guide - email_client.coffee
Copyright (c) 2015 by Redwood Labs
All rights reserved.
###
########################################################################################################################
module.exports = class EmailClient
constructor: ->
@baseUrl = 'https://mandrillapp.com:443/api/1.0'
@key = 'zaERWIuTVJaq0seCjjgVqw'
# Public Methods ###############################################################################
send: (options={})->
options.body ?= "(no body)"
options.fromAddress ?= "[email protected]"
options.fromName ?= "Crafting Guide Website"
options.subject ?= "(no subject)"
options.toAddress ?= "[email protected]"
options.toName ?= "Crafting Guide"
body =
key: @key
message:
from_email: options.fromAddress
from_name: options.fromName
subject: options.subject
text: options.body
to: [ email:options.toAddress, name:options.toName, type:'to' ]
logger.info "sending email: #{util.inspect(body)}"
w.promise (resolve, reject)=>
onSuccess = (data, status, request)->
logger.info "sending email result: #{util.inspect(data)}, status:#{status}"
data = if _.isArray data then data[0] else data
if data.status isnt "sent"
reject status:data.status, message:data.reject_reason
else
resolve status:data.status
onError = (request, status, error)->
logger.error "sending email failed: #{status}, error:#{error}"
reject status:status, message:error
$.ajax "#{@baseUrl}/messages/send.json",
cache: false
data: body
dataType: 'json'
error: onError
success: onSuccess
type: 'POST'