Skip to content

Instantly share code, notes, and snippets.

@jeffharnois
Created March 21, 2014 00:25
Show Gist options
  • Save jeffharnois/9676984 to your computer and use it in GitHub Desktop.
Save jeffharnois/9676984 to your computer and use it in GitHub Desktop.
define [
'tpl'
'modal'
'macula/organisms/creative'
'campaign/views/whelp/settings/targeting_form'
'campaign/views/whelp/settings/customTargeting'
'campaign/models/creative'
'macula/molecules/tabs' # load last b/c does not export anything
], (Tpl, ModalView, mCreative, TargetingForm, CustomTargeting, CreativeModel) ->
class LineItemSettings
constructor: (lineItem, @type, cb) ->
listItem = lineItem.collection.otter
mid = 'm-' + lineItem.id + '-' + @type
tabs = {}
heading = new Tpl 'server/views/modules/campaign/consideration_list/modal_header'
targeting = null
creative = null
listItem.collection.getPropertiesConf().done (conf) =>
if @type is 'targeting'
unless listItem.get('isInMediaPlan') or listItem.get('isFinalOffer')
targeting = new TargetingForm
id: mid + '-targeting'
model: lineItem
isCPM: lineItem.get('pricingModel') is 'CPM'
custom: new CustomTargeting mid + '-targeting', conf.customTargetings
targetingsList: conf.geoTargetings
subView = targeting.render().el
else if @type is 'creative'
productSize = window.creativeSizeMap[lineItem.get('productUid')][0]
creativeModel = new CreativeModel
height: productSize.height
width: productSize.width
if /^LI-/.test lineItem.id
creativeModel.set 'lineItemUid', lineItem.id
else
creativeModel.set 'externalId', 'IFA_WHELP_' + lineItem.id
creative = new mCreative creativeModel.attributes, {
urlRoot: '/creatives'
}, {
id: mid + '-creative'
featureDetect: conf.adServerTypes.pop()
}
subView = creative.render().el
creativeModel.fetchForLineItem (models) ->
# future: will have multiple creatives
creative.model.set models[0] if models.length
else
cb false
return false
modal = new ModalView
id: mid
model:
heading: heading.render {
propertyName: listItem.get 'propertyName'
productName: lineItem.get 'productName'
# capitalize the first letter
type: @type.charAt(0).toUpperCase() + @type.slice(1)
}
action: 'Save'
close: 'Cancel'
submit: @submitHandler
type: type
targeting: targeting
creative: creative
modal
.render()
.$('.modal-body').append subView
$('body').append modal.el
if @type is 'targeting'
# drill down into the USA DMAs
modal.$el.modal('show')
.find('.m-js-filtered-list--item[data-id="226"]').first().click().end()
else
modal.$el.modal('show')
console.log "should call back"
cb(modal) # to keep track in parent view
# handle submit of modal in context of its view
submitHandler: (e) ->
@$('button[type="submit"]').prop 'disabled', true
# TODO: detect if creative has changed, skip if has not
saveCreative = (model) ->
# is tag and empty? is file and invalid?
if (model.get('type') is 'TAG' and model.get('tagContent').length is 0) or
(model.get('type') is 'IMAGE_FILE' and (model.get('clickThroughUrl').length is 0 or !model.get('filePath')?))
return true
else
return model.save()
saveTargeting = (targetingForm) =>
return true if targetingForm is null
model = targetingForm.model
customUids = targetingForm.options.custom.collection.toArrayOfUids()
start = @$('.js-fcap-start').val() if @$('.js-fcap-start').val() isnt ""
newAttr =
targetingUids: customUids.concat model.getTargetingUidsFromIds(@$('.js-geo-targeting-selector .m-tag--container').find('.m-tag'))
frequencyCapping: @$('.o-targeting-form--fcap-select').find('.js-frequency-cap').val()
start: start
end: if @options.targeting.options.isCPM
@$('.js-fcap-end').val() unless @$('.js-fcap-end').val() is ""
else
start
if /^LI-/.test model.id
model.set newAttr
else
return model.save newAttr
showError = (errMsg) =>
@$('.modal-body > div').first().prepend "<div class='alert alert-error'>#{errMsg}</div>"
failure = (errorResponse) ->
unexpectedError = false
unexpectedError = errorResponse.status isnt 400
# just show first error
if errorResponse.status is 400 and errorResponse.responseText? and errorResponse.responseText isnt ''
errMsg = """
<strong>Could not save.</strong> #{errorResponse.responseText.replace(/"/g, "")}
"""
errMsg ?= """
<strong>Bollocks!</strong> Something went wrong. Double check
everything and try again. If it all looks right, please email
<a href="mailto:[email protected]">[email protected]</a>
"""
showError errMsg
if @options.type is 'targeting'
$.when(
saveTargeting(@options.targeting)
).done((targetingModelSuccess) =>
@$('.alert-error').remove()
@$el.modal 'hide'
).fail((targetingFail) =>
failure(targetingFail)
e = new Error 'Saving targeting or creative failed'
Raygun.send e, [
targeting:
model: @options.targeting.model.toJSON()
response: targetingFail
]
).always => @$('button[type="submit"]').prop 'disabled', false
else if @options.type is 'creative'
$.when(
saveCreative(@options.creative.model)
).done((creativeModelSuccess) =>
if creativeModelSuccess
@$('.alert-error').remove()
@$el.modal 'hide'
else
showError @options.creative.model.validationError
).fail((creativeFail) =>
failure(creativeFail)
e = new Error 'Saving targeting or creative failed'
Raygun.send e, [
creative:
model: @options.targeting.model.toJSON()
response: creativeFail
]
).always => @$('button[type="submit"]').prop 'disabled', false
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment