181 lines
4.9 KiB
JavaScript
181 lines
4.9 KiB
JavaScript
|
// License: LGPL-3.0-or-later
|
||
|
// Utilities!
|
||
|
// XXX remove this whole file and split into modules with specific concerns
|
||
|
const phoneFormatter = require('phone-formatter');
|
||
|
const R = require('ramda')
|
||
|
|
||
|
var utils = {}
|
||
|
|
||
|
module.exports = utils
|
||
|
|
||
|
// XXX remove
|
||
|
utils.capitalize = string =>
|
||
|
string.charAt(0).toUpperCase() + string.slice(1)
|
||
|
|
||
|
// Print a single message for Rails error responses
|
||
|
// XXX remove
|
||
|
utils.print_error = function (response) {
|
||
|
var msg = 'Sorry! We encountered an error.'
|
||
|
if(!response) return msg
|
||
|
if(response.status === 500) return msg
|
||
|
else if(response.status === 404) return "404 - Not found"
|
||
|
else if(response.status === 422 || response.status === 401) {
|
||
|
if(!response.responseJSON) return msg
|
||
|
|
||
|
var json = response.responseJSON
|
||
|
if(json.length) return json[0]
|
||
|
|
||
|
else if(json.errors)
|
||
|
for (var key in json.errors)
|
||
|
return key + ' ' + json.errors[key][0]
|
||
|
|
||
|
else if(json.error) return json.error
|
||
|
|
||
|
else return msg
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Retrieve a URL parameter
|
||
|
// XXX remove
|
||
|
utils.get_param = function(name) {
|
||
|
var param = decodeURI((RegExp(name + '=' + '(.+?)(&|$)').exec(location.search) || [null])[1])
|
||
|
return (param == 'undefined') ? undefined : param
|
||
|
}
|
||
|
|
||
|
// XXX remove
|
||
|
utils.change_url_param = function(key, value) {
|
||
|
if (!history || !history.replaceState) return
|
||
|
history.replaceState({}, "", utils.update_param(key, value))
|
||
|
}
|
||
|
|
||
|
// XXX remove. Depended on only by 'change_url_param' above
|
||
|
utils.update_param = function(key, value, url) {
|
||
|
if(!url) url = window.location.href
|
||
|
var re = new RegExp("([?&])" + key + "=.*?(&|#|$)(.*)", "gi")
|
||
|
|
||
|
if(re.test(url)) {
|
||
|
if(typeof value !== 'undefined' && value !== null)
|
||
|
return url.replace(re, '$1' + key + "=" + value + '$2$3')
|
||
|
else {
|
||
|
var hash = url.split('#')
|
||
|
url = hash[0].replace(re, '$1$3').replace(/(&|\?)$/, '')
|
||
|
if(typeof hash[1] !== 'undefined' && hash[1] !== null)
|
||
|
url += '#' + hash[1]
|
||
|
return url
|
||
|
}
|
||
|
} else {
|
||
|
if (typeof value !== 'undefined' && value !== null) {
|
||
|
var separator = url.indexOf('?') !== -1 ? '&' : '?',
|
||
|
hash = url.split('#')
|
||
|
url = hash[0] + separator + key + '=' + value
|
||
|
if(typeof hash[1] !== 'undefined' && hash[1] !== null)
|
||
|
url += '#' + hash[1]
|
||
|
return url
|
||
|
}
|
||
|
else return url
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Pad a number with leading zeros
|
||
|
// XXX remove
|
||
|
utils.zero_pad = function(num, size) {
|
||
|
var str = num + ""
|
||
|
while (str.length < size) str = "0" + str
|
||
|
return str
|
||
|
}
|
||
|
|
||
|
// for doing an action after the user pauses for a second after an event
|
||
|
// XXX remove
|
||
|
utils.delay = (function() {
|
||
|
var timer = 0
|
||
|
return function(ms, callback) {
|
||
|
clearTimeout(timer)
|
||
|
timer = setTimeout(callback, ms)
|
||
|
}
|
||
|
})()
|
||
|
|
||
|
utils.number_with_commas = function(n) {
|
||
|
return n.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")
|
||
|
}
|
||
|
|
||
|
// Merge x's properties with y (mutating)
|
||
|
utils.merge = function(x, y) {
|
||
|
for (var key in y) { x[key] = y[key]; }
|
||
|
return x
|
||
|
}
|
||
|
|
||
|
var format = require('./format')
|
||
|
utils.dollars_to_cents = format.dollarsToCents
|
||
|
utils.cents_to_dollars = format.centsToDollars
|
||
|
|
||
|
// Create a single FormData object from any number of inputs and forms (not bound to a single form)
|
||
|
// Kind of a re-implementation of: http://www.w3.org/html/wg/drafts/html/master/forms.html#constructing-the-form-data-set
|
||
|
// XXX remove
|
||
|
utils.toFormData = function(form_el) {
|
||
|
var form_data = new FormData()
|
||
|
$(form_el).find('input, select, textarea').each(function(index) {
|
||
|
if(!this.name) return
|
||
|
if(this.files && this.files[0])
|
||
|
form_data.append(this.name, this.files[0])
|
||
|
else if(this.getAttribute("type") === "checkbox")
|
||
|
form_data.append(this.name, this.checked)
|
||
|
else if(this.value)
|
||
|
form_data.append(this.name, this.value)
|
||
|
})
|
||
|
return form_data
|
||
|
}
|
||
|
|
||
|
utils.mergeFormData = function(formData, obj) {
|
||
|
for(var key in obj) formData.append(key, obj[key])
|
||
|
return formData
|
||
|
}
|
||
|
|
||
|
|
||
|
// Given an array of values, return an array only with unique values
|
||
|
// XXX remove
|
||
|
utils.uniq = function(arr) {
|
||
|
var obj = {}
|
||
|
var index
|
||
|
var len = arr.length
|
||
|
var result = [];
|
||
|
for(index = 0; index < len; index += 1) obj[arr[index]] = arr[index];
|
||
|
for(index in obj) result.push(obj[index]);
|
||
|
return result
|
||
|
}
|
||
|
|
||
|
// XXX remove
|
||
|
utils.address_with_commas = function(street, city, state){
|
||
|
var address = [street, city, state]
|
||
|
var pretty_print_add = []
|
||
|
for(var i = 0; i < address.length; i += 1) {
|
||
|
if (address[i] !== '' && address[i] != null) pretty_print_add.push(address[i])
|
||
|
}
|
||
|
return pretty_print_add.join(', ')
|
||
|
}
|
||
|
|
||
|
utils.pretty_phone = function(phone){
|
||
|
if(!phone) {return false}
|
||
|
|
||
|
// first remove any non-digit characters globally
|
||
|
// and get length of phone number
|
||
|
var clean = String(phone).replace(/\D/g, '')
|
||
|
var len = clean.length
|
||
|
|
||
|
var format = "(NNN) NNN-NNNN"
|
||
|
|
||
|
// then format based on length
|
||
|
if(len === 10) {
|
||
|
return phoneFormatter.format(clean, format)
|
||
|
}
|
||
|
if(len > 10) {
|
||
|
var first = clean.substring(0, len - 10)
|
||
|
var last10 = clean.substring(len - 10)
|
||
|
return `+${first} ${phoneFormatter.format(last10, format)}`
|
||
|
}
|
||
|
|
||
|
// if number is less than 10, don't apply any formatting
|
||
|
// and just return it
|
||
|
return clean
|
||
|
}
|
||
|
|