Created
March 21, 2014 00:25
-
-
Save jeffharnois/9676984 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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