314 lines
9 KiB
JavaScript
314 lines
9 KiB
JavaScript
/**
|
|
* @file Miscellaneous JS definitions for <tt>k-fet</tt> app.
|
|
* @copyright 2017 cof-geek
|
|
* @license MIT
|
|
*/
|
|
|
|
/**
|
|
* String method
|
|
* @memberof String
|
|
* @return {String} String formatted as trigramme
|
|
*/
|
|
String.prototype.formatTri = function() {
|
|
return this.toUpperCase().substr(0, 3);
|
|
}
|
|
|
|
|
|
/**
|
|
* String method
|
|
* @global
|
|
* @return {Boolean} true iff String follows trigramme pattern
|
|
*/
|
|
String.prototype.isValidTri = function() {
|
|
var pattern = /^[^a-z]{3}$/;
|
|
return pattern.test(this);
|
|
}
|
|
|
|
|
|
function intCheck(v) {
|
|
return Number.parseInt(v);
|
|
}
|
|
|
|
function floatCheck(v) {
|
|
if (typeof v === 'number')
|
|
return v;
|
|
return Number.parseFloat(v);
|
|
}
|
|
|
|
function booleanCheck(v) {
|
|
return v == true;
|
|
}
|
|
|
|
|
|
/**
|
|
* Get and store K-Psul config from API.
|
|
* <br><br>
|
|
*
|
|
* Config should be accessed statically only.
|
|
*/
|
|
class Config {
|
|
|
|
/**
|
|
* Get or create config object.
|
|
* @private
|
|
* @return {object} object - config keys/values
|
|
*/
|
|
static _get_or_create_config() {
|
|
if (window.config === undefined)
|
|
window.config = {};
|
|
return window.config;
|
|
}
|
|
|
|
/**
|
|
* Get config from API.
|
|
* @param {jQueryAjaxComplete} [callback] - A function to be called when
|
|
* the request finishes.
|
|
*/
|
|
static reset(callback) {
|
|
$.getJSON(Urls['kfet.kpsul.get_settings']())
|
|
.done(function(data) {
|
|
for (var key in data) {
|
|
Config.set(key, data[key]);
|
|
}
|
|
})
|
|
.always(callback);
|
|
}
|
|
|
|
/**
|
|
* Get value for key in config.
|
|
* @param {string} key
|
|
*/
|
|
static get(key) {
|
|
return this._get_or_create_config()[key];
|
|
}
|
|
|
|
/**
|
|
* Set value for key in config.
|
|
* @param {string} key
|
|
* @param {*} value
|
|
*/
|
|
static set(key, value) {
|
|
// API currently returns string for Decimal type
|
|
if (['addcost_amount', 'subvention_cof'].indexOf(key) > -1)
|
|
value = floatCheck(value);
|
|
this._get_or_create_config()[key] = value;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
$(document).ready(function() {
|
|
$(window).scroll(function() {
|
|
if ($(window).width() >= 768 && $(this).scrollTop() > 72.6) {
|
|
$('.col-content-left').css({'position':'fixed', 'top':'50px'});
|
|
$('.col-content-right').addClass('col-sm-offset-4 col-md-offset-3');
|
|
} else {
|
|
$('.col-content-left').css({'position':'relative', 'top':'0'});
|
|
$('.col-content-right').removeClass('col-sm-offset-4 col-md-offset-3');
|
|
}
|
|
});
|
|
|
|
if (typeof Cookies !== 'undefined') {
|
|
// Retrieving csrf token
|
|
csrftoken = Cookies.get('csrftoken');
|
|
// Appending csrf token to ajax post requests
|
|
function csrfSafeMethod(method) {
|
|
// these HTTP methods do not require CSRF protection
|
|
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
|
|
}
|
|
$.ajaxSetup({
|
|
beforeSend: function(xhr, settings) {
|
|
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
|
|
xhr.setRequestHeader("X-CSRFToken", csrftoken);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
});
|
|
|
|
/*
|
|
* Capslock management
|
|
*/
|
|
|
|
window.capslock = -1;
|
|
$(document).on('keypress', function(e) {
|
|
var s = String.fromCharCode(e.which);
|
|
if ((s.toUpperCase() === s && s.toLowerCase() !== s && !e.shiftKey)|| //caps on, shift off
|
|
(s.toUpperCase() !== s && s.toLowerCase() === s && e.shiftKey)) { //caps on, shift on
|
|
$('body').addClass('capslock_on')
|
|
} else if ((s.toLowerCase() === s && s.toUpperCase() !== s && !e.shiftKey)|| //caps off, shift off
|
|
(s.toLowerCase() !== s && s.toUpperCase() === s && e.shiftKey)) { //caps off, shift on
|
|
$('body').removeClass('capslock_on')
|
|
}
|
|
});
|
|
|
|
$(document).on('keydown', function(e) {
|
|
if (e.which == 20) {
|
|
$('body').toggleClass('capslock_on')
|
|
}
|
|
});
|
|
|
|
|
|
|
|
function dateUTCToParis(date) {
|
|
return moment.tz(date, 'UTC').tz('Europe/Paris');
|
|
}
|
|
|
|
function amountDisplay(amount, is_cof=false, tri='') {
|
|
if (tri == 'LIQ')
|
|
return (- amount).toFixed(2) +'€';
|
|
return amountToUKF(amount, is_cof);
|
|
}
|
|
|
|
function amountToUKF(amount, is_cof=false) {
|
|
var coef_cof = is_cof ? 1 + Config.get('subvention_cof') / 100 : 1;
|
|
return Math.round(amount * coef_cof * 10);
|
|
}
|
|
|
|
function isValidTrigramme(trigramme) {
|
|
var pattern = /^[^a-z]{3}$/;
|
|
return trigramme.match(pattern);
|
|
}
|
|
|
|
/**
|
|
* Dialogs with user via jconfirm
|
|
*/
|
|
|
|
class UserDialog {
|
|
|
|
static get default_data() {
|
|
return {'title': '', 'content': '', 'callback_as_dict': false};
|
|
}
|
|
|
|
constructor(data) {
|
|
$.extend(this, this.constructor.default_data, data);
|
|
}
|
|
|
|
open(callback, errors, next_focus) {
|
|
var that = this;
|
|
$.confirm({
|
|
title: this.title,
|
|
content: errors + this.content,
|
|
backgroundDismiss: true,
|
|
animation:'top',
|
|
closeAnimation:'bottom',
|
|
keyboardEnabled: true,
|
|
confirm: function() {
|
|
if (that.callback_as_dict) {
|
|
var inputs = {};
|
|
this.$content.find('input').each(function () {
|
|
inputs[$(this).attr('name')] = $(this).val();
|
|
});
|
|
return callback(inputs);
|
|
} else {
|
|
var input_values = this.$content.find('input').map(function () {
|
|
return $(this).val();
|
|
}).get();
|
|
return callback.apply(null, input_values);
|
|
}
|
|
},
|
|
onOpen: function() {
|
|
var that = this
|
|
this.$content.find('input').on('keydown', function(e) {
|
|
if (e.keyCode == 13) {
|
|
e.preventDefault();
|
|
that.$confirmButton.click();
|
|
}
|
|
});
|
|
},
|
|
onClose: function() { if (next_focus) { this._lastFocused = next_focus; } }
|
|
});
|
|
}
|
|
}
|
|
|
|
function getErrorsHtml(data) {
|
|
var content = '';
|
|
if ('operation_group' in data['errors']) {
|
|
content += 'Général';
|
|
content += '<ul>';
|
|
if (data['errors']['operation_group'].indexOf('on_acc') != -1)
|
|
content += '<li>Pas de compte sélectionné</li>';
|
|
if (data['errors']['operation_group'].indexOf('checkout') != -1)
|
|
content += '<li>Pas de caisse sélectionnée</li>';
|
|
content += '</ul>';
|
|
}
|
|
if ('missing_perms' in data['errors']) {
|
|
content += 'Permissions manquantes';
|
|
content += '<ul>';
|
|
for (var i=0; i<data['errors']['missing_perms'].length; i++)
|
|
content += '<li>'+data['errors']['missing_perms'][i]+'</li>';
|
|
content += '</ul>';
|
|
}
|
|
if ('negative' in data['errors']) {
|
|
if (window.location.pathname.startsWith('/gestion/')) {
|
|
var url_base = '/gestion/k-fet/accounts/';
|
|
} else {
|
|
var url_base = '/k-fet/accounts/';
|
|
}
|
|
for (var i=0; i<data['errors']['negative'].length; i++) {
|
|
content += '<a class="btn btn-primary" href="'+url_base+data['errors']['negative'][i]+'/edit" target="_blank" style="width:100%">Autorisation de négatif requise pour '+data['errors']['negative'][i]+'</a>';
|
|
}
|
|
}
|
|
if ('addcost' in data['errors']) {
|
|
content += '<ul>';
|
|
if (data['errors']['addcost'].indexOf('__all__') != -1)
|
|
content += '<li>Compte invalide</li>';
|
|
if (data['errors']['addcost'].indexOf('amount') != -1)
|
|
content += '<li>Montant invalide</li>';
|
|
content += '</ul>';
|
|
}
|
|
return content;
|
|
}
|
|
|
|
var authDialog = new UserDialog({
|
|
'title': 'Authentification requise',
|
|
'content': '<div class="capslock"><span class="glyphicon glyphicon-lock"></span><input type="password" name="password" autofocus><div>',
|
|
});
|
|
|
|
function api_with_auth(settings, password) {
|
|
if (window.lock == 1)
|
|
return false;
|
|
window.lock = 1;
|
|
|
|
var url = settings.url;
|
|
if (!url)
|
|
return false;
|
|
var data = settings.data || {} ;
|
|
var on_success = settings.on_success || $.noop ;
|
|
var on_400 = settings.on_400 || $.noop ;
|
|
|
|
$.ajax({
|
|
dataType: "json",
|
|
url: url,
|
|
method: "POST",
|
|
data: data,
|
|
beforeSend: function ($xhr) {
|
|
$xhr.setRequestHeader("X-CSRFToken", csrftoken);
|
|
if (password)
|
|
$xhr.setRequestHeader("KFetPassword", password);
|
|
},
|
|
})
|
|
.done(function(data) {
|
|
on_success(data);
|
|
window.lock = 0 ;
|
|
})
|
|
.fail(function($xhr) {
|
|
var response = $xhr.responseJSON;
|
|
switch ($xhr.status) {
|
|
case 403:
|
|
authDialog.open(
|
|
function(password) {
|
|
api_with_auth(settings, password)
|
|
},
|
|
getErrorsHtml(response),
|
|
settings.next_focus
|
|
);
|
|
break;
|
|
case 400:
|
|
on_400(response);
|
|
break;
|
|
}
|
|
window.lock = 0 ;
|
|
});
|
|
}
|