fc77ee76d6
The primary license of the project is changing to: AGPL-3.0-or-later WITH Web-Template-Output-Additional-Permission-3.0-or-later The Additional Permission is designed to permit publicly distributed Javascript code to be relicensed under LGPL-3.0-or-later, but not server-side Javascript code. As such, we've relicensed here static Javscript files under LGPL-3.0-or-later, and those that run as part of build and/or server side under AGPL-3.0-or-later. Note that in future, Javascript files may be updated to be stronger copyleft license with the Additional Permission, particularly if they adapted to run on server side and/or turned into templates. Of course, we'd seek public discussion with the contributor community about such changes. This commit is one of the many steps to relicense the entire codebase. Documentation granting permission for this relicensing (from all past contributors who hold copyrights) is on file with Software Freedom Conservancy, Inc.
150 lines
4.6 KiB
JavaScript
150 lines
4.6 KiB
JavaScript
// License: LGPL-3.0-or-later
|
|
if(app.autocomplete) {
|
|
require('../components/address-autocomplete')
|
|
}
|
|
require('../cards/create')
|
|
var request = require('../common/super-agent-promise')
|
|
var create_card = require('../cards/create')
|
|
var format_err = require('../common/format_response_error')
|
|
var path = '/nonprofits/' + app.nonprofit_id + '/events/' + appl.event_id + '/tickets'
|
|
|
|
appl.def('ticket_wiz', {
|
|
|
|
// Placeholder for a callback that is evaluated after the tickets are redeemed
|
|
on_complete: function() {},
|
|
|
|
// Set all the wizard's default data
|
|
set_defaults: function() {
|
|
appl.def('ticket_wiz.post_data', {
|
|
nonprofit_id: app.nonprofit_id,
|
|
tickets: [],
|
|
kind: "",
|
|
supporter_id: "",
|
|
})
|
|
},
|
|
|
|
|
|
// Set/process all the ticket data after submitting the "Tickets" step form
|
|
set_tickets: function(form_obj) {
|
|
hide_err()
|
|
var tickets = []
|
|
var total_amount = 0
|
|
var total_quantity = 0
|
|
for(var key in form_obj.tickets) {
|
|
var ticket = form_obj.tickets[key]
|
|
ticket.quantity = Number(ticket.quantity)
|
|
ticket.amount = Number(ticket.amount)
|
|
total_quantity += ticket.quantity
|
|
total_amount += ticket.quantity * ticket.amount
|
|
if(ticket.quantity > 0) tickets.push({ticket_level_id: ticket.ticket_level_id, quantity: ticket.quantity})
|
|
}
|
|
appl.def('ticket_wiz.post_data.tickets', tickets)
|
|
|
|
// Calculate total quantity and total charge amount
|
|
appl.def('ticket_wiz', {
|
|
total_amount: total_amount,
|
|
total_quantity: total_quantity
|
|
})
|
|
|
|
if(total_amount === 0) {
|
|
appl.def('ticket_wiz.post_data.kind', 'free')
|
|
} else {
|
|
appl.def('ticket_wiz.post_data.kind', 'charge')
|
|
}
|
|
|
|
if(total_quantity > 0) {
|
|
appl.wizard.advance('ticket_wiz')
|
|
} else {
|
|
appl.notify('Please choose at least one ticket.')
|
|
}
|
|
},
|
|
|
|
|
|
check_if_any_ticket_levels: function(i, name, node) {
|
|
var ticket_level_remainder = appl.ticket_levels.data[i].remaining
|
|
var value = appl.prev_elem(node).value
|
|
if(value >= ticket_level_remainder) {
|
|
appl.notify("There are only " + ticket_level_remainder + " tickets remaining for '"
|
|
+ name + "'.")
|
|
appl.prev_elem(node).value = ticket_level_remainder
|
|
}
|
|
},
|
|
|
|
|
|
save_supporter: function(form_obj) {
|
|
appl.ticket_wiz.save_supporter_promise = request
|
|
.post('/nonprofits/' + app.nonprofit_id + '/supporters')
|
|
.send({supporter: form_obj}).perform()
|
|
.then(function(res) {
|
|
appl.ticket_wiz.supporter = res.body
|
|
appl.ticket_wiz.post_data.supporter_id = res.body.id
|
|
return res.body
|
|
})
|
|
.catch(show_err)
|
|
appl.wizard.advance('ticket_wiz')
|
|
},
|
|
|
|
set_kind: function(node) {
|
|
// Tickets creations have a kind of free, offsite, or charge
|
|
// OffsitePayments have a kind of check or cash
|
|
// We need to save each separately
|
|
var op_kind = appl.prev_elem(node).value
|
|
var ticket_kind = appl.prev_elem(node).getAttribute('data-ticket-kind')
|
|
appl.def('ticket_wiz.post_data.kind', ticket_kind)
|
|
appl.def('ticket_wiz.post_data.offsite_payment.kind', op_kind)
|
|
},
|
|
|
|
send_payment: function(form_obj) {
|
|
appl.def('loading', true)
|
|
return appl.ticket_wiz.save_supporter_promise
|
|
.then(function(supporter) {
|
|
return create_card({type: 'Supporter', id: supporter.id, email: supporter.email}, form_obj)
|
|
})
|
|
.catch(show_err)
|
|
.then(function(card) {
|
|
appl.ticket_wiz.post_data.token = card.token
|
|
})
|
|
.then(appl.ticket_wiz.create_tickets)
|
|
},
|
|
|
|
create_tickets: function() {
|
|
appl.def('loading', true)
|
|
return request.post(path)
|
|
.send(appl.ticket_wiz.post_data).perform()
|
|
.then(complete_wizard)
|
|
.then(appl.ticket_wiz.on_complete)
|
|
.catch(show_err)
|
|
},
|
|
|
|
}) // end appl.def('ticket_wiz'...
|
|
|
|
|
|
// To be called when either a free or purchased ticket was successfully
|
|
// redeemed; will show a success/thank-you modal
|
|
function complete_wizard(resp) {
|
|
appl.def('created_ticket_id', resp.body.tickets[0].id)
|
|
appl.def('loading', false)
|
|
appl.open_modal('confirmTicketsModal')
|
|
appl.ticket_wiz.set_defaults()
|
|
appl.wizard.reset("ticket_wiz")
|
|
hide_err()
|
|
}
|
|
|
|
|
|
// Display an error on the ticket wizard
|
|
// Works on the amount step, supporter step, and free ticket confirmation step.
|
|
// The card form step is a special case, it needs some extra state to be set
|
|
function show_err(resp) {
|
|
appl.def('loading', false)
|
|
appl.def('error', format_err(resp))
|
|
appl.def('card_form', {error: true, status: format_err(resp), loading: false, progress_width: '0%'})
|
|
}
|
|
|
|
// Hide any errors in the wizard
|
|
function hide_err() {
|
|
appl.def('loading', false)
|
|
appl.def('error', '')
|
|
appl.def('card_form', {status: '', error: false, loading: false})
|
|
}
|
|
|
|
appl.ticket_wiz.set_defaults()
|