Skip to content

Instantly share code, notes, and snippets.

@dmuskat
Created September 4, 2012 18:51
Show Gist options
  • Select an option

  • Save dmuskat/3624945 to your computer and use it in GitHub Desktop.

Select an option

Save dmuskat/3624945 to your computer and use it in GitHub Desktop.
VIEWS.SPEC.COFFEE
describe "views.Form: view for the page", ->
formView = null
formViewModel = null
formModel = null
formulas = null
formulaIds = null
referenceMenuModel = null
glossaryofterms = null
glossaryoftermsIds = null
referenceMenuModel = null
beforeEach ->
###
if !window.currentForm
window.currentForm = new models.Form
window.currentForm =JSON.parse(window.sessionStorage.getItem 'form')
formModel = new models.Form window.currentForm
formViewModel = new views.models.Form form:formModel, currentItem:1
formView = new views.Form model:formViewModel
###
#
spyOn(window.currentForm, 'get').andCallFake (id) ->
formModel = new models.Form window.currentForm
spyOn(formModel, 'get').andCallFake (id) ->
formViewModel = new views.models.Form form:formModel, currentItem:1
#spyOn(formViewModel, 'get').andCallFake (form) ->
formView = new views.Form model:formViewModel
#
referenceMenuModel = new views.models.Menu htmlId:'reference-menu'
formulas = [{
audiotext: "I am a formula"
id: "11"
image: "UjBsR09EbGhjZ0dTQUxNQUFBUUNBRU1tQ1p0dU1GUXhEUzhi"
label: "Conversions"
value: "conversions_8_PA2.gif"
},
{
audiotext: "I am also a formula"
id: "12"
image: "UjBsR09EbGhjZ0dTQUxNQUFBUUNBRU1tQ1p0dU1GUXhEUzhi"
label: "Formulas"
value: "formulas_8_PA2.gif"
},
{
audiotext: "I am another formula"
id: "13"
image: "UjBsR09EbGhjZ0dTQUxNQUFBUUNBRU1tQ1p0dU1GUXhEUzhi"
label: "Cheatsheets"
value: "cheatsheets_8_PA2.gif"
}]
formulaIds = ["11","13"]
glossaryofterms = [{
audiotext: "I am a glossaryofterm"
id: "44"
image: "UjBsR09EbGhjZ0dTQUxNQUFBUUNBRU1tQ1p0dU1GUXhEUzhi"
label: "Apples"
value: "apples.gif"
},
{
audiotext: "I am aso a glossaryofterm"
id: "55"
image: "UjBsR09EbGhjZ0dTQUxNQUFBUUNBRU1tQ1p0dU1GUXhEUzhi"
label: "Oranges"
value: "oranges.gif"
},
{
audiotext: "I am aso a glossaryofterm"
id: "66"
image: "UjBsR09EbGhjZ0dTQUxNQUFBUUNBRU1tQ1p0dU1GUXhEUzhi"
label: "Pears"
value: "pears.gif"
}]
glossaryoftermsIds = ["44","55","66"]
afterEach ->
formView = null
formulas = null
formulaIds = null
referenceMenuModel = null
glossaryofterms = null
glossaryoftermsIds = null
referenceMenuModel = null
it "should have a working test", ->
expect(true).toBe(true)
it "should locate an id array for formulas/glossaryofterms in a session", ->
session = {
ids: ["11","12"]
}
sessionIds = ["11","12"]
foundIds = formView.locateReferenceSheetIds(session.ids,null)
expect(foundIds).not.toBeNull
expect(foundIds).toEqual(sessionIds)
it "should locate an id array for formulas/glossaryofterms in an item", ->
item = {
ids: ["3","4","5"]
}
itemIds = ["3","4","5"]
foundIds = formView.locateReferenceSheetIds(null, item.ids)
expect(foundIds).not.toBeNull
expect(foundIds).toEqual(itemIds)
it """should return null when it can't locate an id array for
formulas/glossaryofterms in neither a session or an item""", ->
foundIds = formView.locateReferenceSheetIds(null, null)
expect(foundIds).toBeNull
it "should build a referenceMenuView for formulas", ->
formView.buildReferenceSheets(formulaIds,formulas,referenceMenuModel)
options = referenceMenuModel.attributes.options
expect(options[0].get('label')).toEqual('Conversions')
expect(options[1].get('label')).toEqual('Cheatsheets')
it "should build a referenceMenuView for glossaryofterms", ->
formView.buildReferenceSheets(glossaryoftermsIds,
glossaryofterms,
referenceMenuModel)
options = referenceMenuModel.attributes.options
expect(options[0].get('label')).toEqual('Apples')
expect(options[1].get('label')).toEqual('Oranges')
expect(options[2].get('label')).toEqual('Pears')
it """should build a referenceMenuView for both
formulas and glossaryofterms""", ->
formView.buildReferenceSheets(formulaIds,formulas,referenceMenuModel)
options = referenceMenuModel.attributes.options
expect(options[0].get('label')).toEqual('Conversions')
expect(options[1].get('label')).toEqual('Cheatsheets')
formView.buildReferenceSheets(glossaryoftermsIds,
glossaryofterms,
referenceMenuModel)
options = referenceMenuModel.attributes.options
expect(options[2].get('label')).toEqual('Apples')
expect(options[3].get('label')).toEqual('Oranges')
expect(options[4].get('label')).toEqual('Pears')
======================================
MODELS.COFFEE
class models.Form extends SchemaModel
schema: "form"
idAttribute: "drcid"
urlRoot: "/drcETesting/v1/forms"
class models.Item extends SchemaModel
schema: "item"
urlRoot: "/drcETesting/v1/items"
idAttribute: "drcid"
======================================
VIEWS-MODEL.COFFEE
class views.models.Form extends Backbone.Model
initialize: (attributes) ->
self = this
form = self.get('form')
proxyFormChange = ->
form.on 'change', ->
self.trigger.call(self, 'change', arguments...)
@on 'change:form', proxyFormChange
proxyFormChange() if form?
@on 'change:currentItem', ->
currentItem = self.get 'currentItem'
window.router.navigate "items/#{currentItem}" if currentItem?
responseBuffer.flush()
if attributes.currentItem < 1
@set 'currentItem', 1
else if attributes.currentItem > @get('form').get('items').length
@set 'currentItem', @get('form').get('items').length
defaults:
currentItem: 1
form: null
validate: (attributes) ->
if attributes.currentItem < 1
return "Current item may not be less than 1"
else if attributes.currentItem > @get('form').get('items').length
return "Current item may not be greater than the total number of items"
next: ->
currentItem = @get('currentItem')
@set 'currentItem', currentItem + 1
previous: ->
currentItem = @get('currentItem')
@set 'currentItem', currentItem - 1
pause: ->
window.navigate "pauseTest/" + @get('currentItem')
getItem: (id) ->
return new models.Item @get('form').get('items')[id - 1]
getCurrentItem: ->
return @getItem @get('currentItem')
======================================
VIEWS.COFFEE
class views.Form extends Backbone.View
initialize: ->
@hide('#wrapper-reference')
@model.on 'change', => @render()
template: getTemplate 'template-item-page'
events:
'click #bottom-toolbar-review-exit':'reviewAndExit'
reviewAndExit: ->
navigate "reviewItems"
render: ->
#
# main Form view
#
context =
testName: window.studentProfile.get('parts')[window.currentPart].label
studentName: window.studentProfile.get('studentName')
questionNumber: @model.get('currentItem')
@$el.html(@template.render(context))
#
# Item subview
#
itemView = new views.Item model:@model.getCurrentItem()
itemView.render()
@$("#item-container").append(itemView.$el)
MathJax.Hub.Queue(["Typeset", MathJax.Hub, itemView.el])
#
# Previous/Next and Pause buttons
#
@$("#bottom-toolbar-back").on 'click', => @model.previous()
@$("#bottom-toolbar-next").on 'click', => @model.next()
@$("#bottom-toolbar-pause").on 'click', => @model.pause()
#
# Build Tool Button Menus
#
@buildCalculatorMenu()
@buildReferenceSheetMenu()
buildCalculatorMenu: ->
#
# Calculator menu
#
calculatorButtonModel = new views.models.ToggleButton
calculatorButton = new views.ToggleButton
el: @$ '#top-toolbar-calc'
model: calculatorButtonModel
calculatorMenu = new views.models.Menu htmlId:'calculator-menu'
calculatorMenu.addOption htmlId:'basic-calculator', label:'Basic'
calculatorMenu.addOption htmlId:'scientific-calculator', label:'Scientific'
calculatorMenuView = new views.Menu model:calculatorMenu
calculatorMenuView.render()
basicCalculatorPopup = new views.BasicCalculator
calculatorMenuView.on 'menuOptionSelected', (option) ->
calculatorButtonModel.set 'state', 'inactive'
if option.get('htmlId') is 'basic-calculator'
basicCalculatorPopup.show()
@$("#wrapper-calc").append(calculatorMenuView.$el)
calculatorButtonModel.on 'activate', -> calculatorMenuView.show()
calculatorButtonModel.on 'deactivate', -> calculatorMenuView.hide()
buildReferenceSheetMenu: ->
#
# Reference Sheet Menu
#
referenceButtonModel = new views.models.ToggleButton
referenceButton = new views.ToggleButton
el: @$ '#top-toolbar-reference'
model: referenceButtonModel
if window.currentForm.form
form = window.currentForm.form
else
form = currentForm.get('form')
session = form.sessions[0]
idx = @model.get('currentItem')
item = @model.attributes.form.attributes.items[idx-1]
formulaIds = @locateReferenceSheetIds(session.formulaIds, item.formulaIds)
glossaryoftermsIds = @locateReferenceSheetIds(session.glossaryoftermsIds, item.glossaryoftermsIds)
if not formulaIds? and not glossaryoftermsIds?
@hide('#wrapper-reference')
return
@show('#wrapper-reference')
referenceMenuModel = new views.models.Menu htmlId:'reference-menu'
if formulaIds?
@buildReferenceSheets(formulaIds, session.formulas, referenceMenuModel)
if glossaryoftermsIds?
@buildReferenceSheets(glossaryoftermsIds, session.glossaryofterms, referenceMenuModel)
referenceMenuView = new views.Menu model:referenceMenuModel
referenceMenuView.on 'menuOptionSelected', (option) ->
referenceButtonModel.set 'state', 'inactive'
rPopup = views.ReferenceSheet.get(option.get('htmlId'))
rPopup.show()
referenceMenuView.render()
@$("#wrapper-reference").append(referenceMenuView.$el)
referenceButtonModel.on 'activate', -> referenceMenuView.show()
referenceButtonModel.on 'deactivate', -> referenceMenuView.hide()
locateReferenceSheetIds: (sessionIds, itemIds) ->
if sessionIds?
return sessionIds
if itemIds?
return itemIds
return null
buildReferenceSheets: (idArray, contentArray, referenceMenuModel) ->
for id in idArray
for content in contentArray
if content.id is id
referenceMenuModel.addOption
htmlId: content.label + content.id
label: content.label
referenceSheetModel = new views.models.ReferenceSheet content
referenceSheetModel.set('htmlId', content.label + content.id)
referenceSheetPopup = new views.ReferenceSheet
model: referenceSheetModel
hide: (element)->
@$(element).css('visibility', 'hidden');
show: (element)->
@$(element).css('visibility', 'visible');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment