houdini/client/js/nonprofits/supporters/index/supporter_details.js

184 lines
5.7 KiB
JavaScript
Raw Normal View History

// License: LGPL-3.0-or-later
var request = require('../../../common/super-agent-promise')
var format_err = require('../../../common/format_response_error')
var create_offline_donation = require('../../../donations/create_offline')
appl.def('supporter_details', {
resource_name: 'supporters',
// Assign the selected supporter to the one clicked on
// Fetch the full data for that supporter with ajax after setting
// Show the side panel
show: function(supporter) {
appl.open_side_panel()
appl.def('supporter_details', supporter)
appl.def('supporters.selected', [supporter])
appl.def('timeline_action', null)
appl.ajax_supporter.fetch(supporter.id)
var path = 'supporters/' + supporter.id + '/'
appl.def('supporter_details.tags.path_prefix', path)
appl.def('supporter_details.activities.path_prefix', path)
appl.def('supporter_details.supporter_notes.path_prefix', path)
appl.def('supporter_details.custom_fields.path_prefix', path)
request.get('/nonprofits/' + app.nonprofit_id + '/supporters/' + supporter.id + '/tag_joins').perform()
.then(function(r) { appl.def('supporter_details.tags', r.body) })
appl.ajax.index('supporter_details.custom_fields')
},
toggle_panel: function(supporter, node) {
appl.close_modal()
var tr = node.parentNode.parentNode
if(tr.hasAttribute('data-selected')) {
appl.close_side_panel()
tr.removeAttribute('data-selected','')
} else {
appl.supporter_details.show(supporter)
$('.mainPanel').find('tr').removeAttr('data-selected')
tr.setAttribute('data-selected','')
// add supporter_id to url param
var path = window.location.pathname + "?sid=" + supporter.id
window.history.pushState({},'supporter id', path)
}
}
})
appl.def('ajax_supporter', {
update: function(id, form_obj, node) {
appl.def('loading', true)
appl.ajax.update('supporter_details', id, form_obj).then(function(resp) {
appl.def('loading', false)
appl.supporters.index()
if(resp.body.deleted) {
appl.find_and_remove('supporters.data', {id: resp.body.id})
appl.close_side_panel()
appl.notify('Supporter successfully deleted')
} else {
appl.find_and_set('supporters.data', {id: resp.id}, resp)
appl.close_modal()
appl.notify('Supporter updated!')
}
})
},
fetch: function(id) {
appl.def('loading', true)
appl.ajax.fetch('supporter_details', id).then(function(resp) {
appl.def('supporter_details.data.name_email_or_id',
resp.body.data.name || resp.body.data.fc_full_name || resp.body.data.email || 'Supporter #' + resp.body.data.id)
appl.def('supporter_details.data.websites',
resp.body.data.fc_websites ? resp.body.data.fc_websites.split(',') : false
)
appl.def('loading', false)
})
fetch_full_contact(id)
}
})
function fetch_full_contact(id){
appl.def('supporter_details.data.full_contact', {photo: false, current_job: false, interests: false, jobs: false, social: false})
request.get('/nonprofits/' + app.nonprofit_id + '/supporters/' + id + '/full_contact').perform()
.then(function(resp){
var data = resp.body.full_contact
if (!data) {
appl.def('supporter_details.data.full_contact', false)
return
}
appl.def('supporter_details.data.full_contact', {
photo : data.photo && data.photo[0] ? data.photo[0].url : false
, current_job : data.orgs ? data.orgs.map(function(d){if (d.current) return d })[0] : false
, interests : data.topics
, jobs: data.orgs
, social: data.profiles
})
})
}
appl.ajax_supporter.create = function(form_obj, node) {
appl.def('supporter_details', {loading: true, error: ''})
return request.post('/nonprofits/' + app.nonprofit_id + '/supporters').send({supporter: form_obj}).perform()
.then(function() {
appl.def('supporter_details', {loading: false})
appl.close_modal()
appl.notify("Supporter successfully created!")
appl.supporters.index()
appl.prev_elem(node).reset()
})
.catch(function(resp) {
appl.def('supporter_details', {error: format_err(resp), loading: false})
})
}
appl.def('supporter_details.tags', {
resource_name: 'tag_joins'
})
appl.def('supporter_details.custom_fields', {
resource_name: 'custom_field_joins'
})
appl.def('supporter_details.activities', {
resource_name: 'activities'
})
appl.def('supporter_details.supporter_notes', {
resource_name: 'supporter_notes'
})
// Override the default 'close_side_panel' function provided by
// panels_layout.js so we can set some extra data
var old_close_fn = appl.close_side_panel
appl.def('close_side_panel', function(){
appl.def('supporters.selected', appl.get_checked_supporters())
old_close_fn.apply(appl)
})
appl.def('delete_selected_supporters', function(id){
appl.supporters.selected.forEach(function(supp) {
appl.ajax_supporter.update(supp.id, {deleted: true})
})
appl.close_side_panel()
})
appl.def('supporter_details.address_with_commas', utils.address_with_commas)
appl.def('create_offline_donation', function(form_obj, el) {
create_offline_donation(form_obj, createDonationUI)
.then(function(resp) {
appl.ajax.index('supporter_details.activities')
appl.prev_elem(el).reset()
})
})
var createDonationUI = {
start: function(){
appl.is_loading()
appl.def('new_offline_donation', {loading: true, error: ''})
},
success: function(){
appl.not_loading()
appl.def('new_offline_donation', {loading: false})
appl.notify("Offline donation created successfully")
appl.close_modal()
},
fail: function(resp){
appl.def('new_offline_donation', {loading: false, error: format_err(resp)})
appl.def('loading', false).def('error', format_err(resp))
}
}
// Initialize the date picker inside the offline donation modal
var Pikaday = require('pikaday')
new Pikaday({
field: document.querySelector('#js-offsiteDonationDate'),
format: 'M/D/YYYY'
})