Owen Leonard
912d911db2
This patch removes the definition of translatable strings out of templates and into the JavaScript file, using the new JS i81n function. To test: - Apply the patch, go to acquisitions, and view a vendor. - Click "Uncertain prices" in the sidebar menu. - In the table of orders, enter something in the "price" form field which isn't a valid price. You should get an error message. - Test the validation of fund amounts: Go to Administration -> Budgets and create an active budget if necessary. - Add a fund to that budget. Try to save the fund with a fund amount which exceed the amount in the budget. - You should get an error message: "Fund amount exceeds period allocation" - Add a fund with valid data and then go to Administration -> Funds and locate the fun you just created. - Use the "Actions" menu to add a sub fund to that fund. - Try to save this new fund with an amount which exceeds the amount in the parent fund. - You should get an error message, "Fund amount exceeds parent allocation." Note: I was unable to properly test the error message "New budget-parent is beneath budget." I couldn't figure out how to trigger it. TESTING TRANSLATABILITY - Update a translation, e.g. fr-FR: > cd misc/translator > perl translate update fr-FR - Open the corresponding .po file for JavaScript strings, e.g. misc/translator/po/fr-FR-messages-js.po - Locate strings pulled from koha-tmpl/intranet-tmpl/prog/js/acq.js for translation, e.g.: msgid "Fund amount exceeds period allocation" msgstr "" - Edit the "msgstr" string however you want (it's just for testing). - Install the updated translation: > perl translate install fr-FR - Switch to your newly translated language in the staff client and repeat the test plan above. The translated strings should appear. Signed-off-by: David Nind <david@davidnind.com> Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de> Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
382 lines
12 KiB
JavaScript
382 lines
12 KiB
JavaScript
//=======================================================================
|
|
//input validation:
|
|
// acqui/uncertainprice.tmpl uses this
|
|
function uncheckbox(form, field) {
|
|
var price = new Number(form.elements['price' + field].value);
|
|
var tmpprice = "";
|
|
var errmsg = __("ERROR: Price is not a valid number, please check the price and try again!");
|
|
if (isNaN(price)) {
|
|
alert(errmsg);
|
|
for(var i=0; i<form.elements['price' + field].value.length; ++i) {
|
|
price = new Number(form.elements['price' + field].value[i]);
|
|
if(! isNaN(price) || form.elements['price' + field].value[i] == ".") {
|
|
tmpprice += form.elements['price' + field].value[i];
|
|
}
|
|
}
|
|
form.elements['price' + field].value = tmpprice;
|
|
return false;
|
|
}
|
|
form.elements['uncertainprice' + field].checked = false;
|
|
return true;
|
|
}
|
|
|
|
// returns false if value is empty
|
|
function isNotNull(f,noalert) {
|
|
if (f.value.length ==0) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function isNull(f,noalert) {
|
|
if (f.value.length > 0) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
//Function returns false if v is not a number (if maybenull is 0, it also returns an error if the number is 0)
|
|
function isNum(v,maybenull) {
|
|
var n = new Number(v.value);
|
|
if (isNaN(n)) {
|
|
return false;
|
|
}
|
|
if (maybenull==0 && v.value=='') {
|
|
|
|
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
//a logging function (a bit buggy, might open millions of log pages when initializing, but works fine after...
|
|
function log(message) {
|
|
if (!log.window_ || log.window_.closed) {
|
|
var win = window.open("", null, "width=400,height=200," +
|
|
"scrollbars=yes,resizable=yes,status=no," +
|
|
"location=no,menubar=no,toolbar=no");
|
|
if (!win) return;
|
|
var doc = win.document;
|
|
doc.write("<html><head><title>Debug Log</title></head>" +
|
|
"<body></body></html>");
|
|
doc.close();
|
|
log.window_ = win;
|
|
}
|
|
var logLine = log.window_.document.createElement("div");
|
|
logLine.appendChild(log.window_.document.createTextNode(message));
|
|
log.window_.document.body.appendChild(logLine);
|
|
}
|
|
|
|
//=======================================================================
|
|
function getElementsByClass( searchClass, domNode, tagName) {
|
|
if (domNode == null) domNode = document;
|
|
if (tagName == null) tagName = '*';
|
|
var el = new Array();
|
|
var tags = domNode.getElementsByTagName(tagName);
|
|
var tcl = " "+searchClass+" ";
|
|
for(i=0,j=0; i<tags.length; i++) {
|
|
var test = " " + tags[i].className + " ";
|
|
if (test.indexOf(tcl) != -1)
|
|
el[j++] = tags[i];
|
|
}
|
|
return el;
|
|
}
|
|
|
|
|
|
function calcTotalRow(cell) {
|
|
|
|
var string = cell.name;
|
|
var pos = string.indexOf(",", 0);
|
|
var bud_id = string.substring(0, pos);
|
|
var val1 = cell.value;
|
|
var remainingTotal = document.getElementById("budget_est_"+bud_id);
|
|
var remainingNew =0;
|
|
var budgetTotal = document.getElementById("budget_tot_"+bud_id ).textContent;
|
|
var arr = getElementsByClass(cell.className);
|
|
|
|
budgetTotal = budgetTotal.replace(/\,/, "");
|
|
|
|
//percent strip and convert
|
|
if ( val1.match(/\%/) ) {
|
|
val1 = val1.replace(/\%/, "");
|
|
cell.value = (val1 / 100) * Math.abs(budgetTotal ) ;
|
|
}
|
|
|
|
for ( var i=0, len=arr.length; i<len; ++i ){
|
|
remainingNew += Math.abs(arr[i].value);
|
|
}
|
|
|
|
var cc = new Number(cell.value);
|
|
cell.value = cc.toFixed(2); // TIDYME...
|
|
remainingNew = Math.abs( budgetTotal ) - remainingNew ;
|
|
|
|
if ( remainingNew == 0) {
|
|
remainingTotal.style.color = 'black';
|
|
}
|
|
else if ( remainingNew > 0 ) {
|
|
remainingTotal.style.color = 'green';
|
|
} else { // if its negative, make it red..
|
|
remainingTotal.style.color = 'red';
|
|
}
|
|
|
|
remainingTotal.textContent = remainingNew.toFixed(2) ;
|
|
}
|
|
|
|
function autoFillRow(bud_id) {
|
|
|
|
var remainingTotal = document.getElementById("budget_est_"+bud_id);
|
|
var remainingNew = new Number;
|
|
var budgetTotal = document.getElementById("budget_tot_"+bud_id ).textContent;
|
|
var arr = getElementsByClass("plan_entry_" + bud_id);
|
|
|
|
budgetTotal = budgetTotal.replace(/\,/, "");
|
|
var qty = new Number;
|
|
// get the totals
|
|
var novalueArr = new Array();
|
|
for ( var i=0, len=arr.length; i<len; ++i ) {
|
|
remainingNew += Math.abs (arr[i].value );
|
|
|
|
if ( arr[i].value == 0 ) {
|
|
novalueArr[qty] = arr[i];
|
|
qty += 1;
|
|
}
|
|
}
|
|
|
|
remainingNew = Math.abs( budgetTotal) - remainingNew ;
|
|
var newCell = new Number (remainingNew / qty);
|
|
var rest = new Number (remainingNew - (newCell.toFixed(2) * (novalueArr.length - 1)));
|
|
|
|
for (var i = 0; i<novalueArr.length; ++i) {
|
|
if (i == novalueArr.length - 1) {
|
|
novalueArr[i].value = rest.toFixed(2);
|
|
}else {
|
|
novalueArr[i].value = newCell.toFixed(2);
|
|
}
|
|
}
|
|
|
|
remainingTotal.textContent = '0.00' ;
|
|
remainingTotal.style.color = 'black';
|
|
}
|
|
|
|
|
|
function messenger(X,Y,etc){ // FIXME: unused?
|
|
win=window.open("","mess","height="+X+",width="+Y+",screenX=150,screenY=0");
|
|
win.focus();
|
|
win.document.close();
|
|
win.document.write("<body link='#333333' bgcolor='#ffffff' text='#000000'><font size='2'><p><br />");
|
|
win.document.write(etc);
|
|
win.document.write("<center><form><input type=button onclick='self.close()' value='Close'></form></center>");
|
|
win.document.write("</font></body></html>");
|
|
}
|
|
|
|
|
|
//=======================================================================
|
|
|
|
// NEXT BLOCK IS USED BY NEWORDERBEMPTY
|
|
|
|
function updateCosts(){
|
|
var quantity = new Number($("#quantity").val());
|
|
var discount = new Number($("#discount").val());
|
|
var listprice = new Number($("#listprice").val());
|
|
var currcode = new String($("#currency").val());
|
|
var exchangerate = new Number($("#currency_rate_"+currcode).val());
|
|
var gst_on=false;
|
|
|
|
var rrp = new Number(listprice*exchangerate);
|
|
var rep = new Number(listprice*exchangerate);
|
|
var ecost = rrp;
|
|
if ( 100-discount != 100 ) { //Prevent rounding issues if no discount
|
|
ecost = new Number(Math.floor(rrp * (100 - discount )) / 100);
|
|
}
|
|
var total = new Number( ecost * quantity);
|
|
$("#rrp").val(rrp.toFixed(2));
|
|
$("#replacementprice").val(rep.toFixed(2));
|
|
$("#ecost").val(ecost.toFixed(2));
|
|
$("#total").val(total.toFixed(2));
|
|
$("listprice").val(listprice.toFixed(2));
|
|
|
|
return true;
|
|
}
|
|
|
|
// Calculates total amount in a suggestion
|
|
|
|
function calcNewsuggTotal(){
|
|
//collect values
|
|
var quantity = Number(document.getElementById('quantity').value);
|
|
var currcode = String(document.getElementById('currency').value);
|
|
var price = Number(document.getElementById('price').value);
|
|
var exchangerate = Number(document.getElementById('currency_rate_'+currcode).value);
|
|
|
|
var total = Number(quantity*price*exchangerate);
|
|
|
|
document.getElementById('total').value = total.toFixed(2);
|
|
document.getElementById('price').value = price.toFixed(2);
|
|
return true;
|
|
}
|
|
|
|
function getAuthValueDropbox( name, cat, destination, selected ) {
|
|
if ( typeof(selected) == 'undefined' ) {
|
|
selected = "";
|
|
}
|
|
if (cat == null || cat == "") {
|
|
$(destination).replaceWith(' <input type="text" name="' + name + '" value="' + selected + '" />' );
|
|
return;
|
|
}
|
|
$.ajax({
|
|
url: "/cgi-bin/koha/acqui/ajax-getauthvaluedropbox.pl",
|
|
data: {
|
|
name: name,
|
|
category: cat,
|
|
default: selected
|
|
},
|
|
async: false,
|
|
success: function(data){
|
|
if(data === "0"){
|
|
$(destination).replaceWith(' <input type="text" name="' + name + '" value="' + selected + '" />' );
|
|
}else{
|
|
$(destination).replaceWith(data);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
//USED BY NEWORDEREMPTY.PL
|
|
function totalExceedsBudget(budgetId, total) {
|
|
|
|
var xmlhttp = null;
|
|
xmlhttp = new XMLHttpRequest();
|
|
if ( typeof xmlhttp.overrideMimeType != 'undefined') {
|
|
xmlhttp.overrideMimeType('text/xml');
|
|
}
|
|
|
|
var url = '../acqui/check_budget_total.pl?budget_id=' + budgetId + "&total=" + total;
|
|
xmlhttp.open('GET', url, false);
|
|
xmlhttp.send(null);
|
|
|
|
xmlhttp.onreadystatechange = function() {
|
|
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
|
|
|
|
actTotal = eval ( xmlhttp.responseText );
|
|
|
|
if ( Math.abs(actTotal) < Math.abs(total) ) {
|
|
// if budget is to low :(
|
|
return true ;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//USED BY AQBUDGETS.TMPL
|
|
function budgetExceedsParent(budgetTotal, budgetId, newBudgetParent, periodID) {
|
|
|
|
|
|
var xmlhttp = null;
|
|
xmlhttp = new XMLHttpRequest();
|
|
if ( typeof xmlhttp.overrideMimeType != 'undefined') {
|
|
xmlhttp.overrideMimeType('text/xml');
|
|
}
|
|
|
|
// make the call... yawn
|
|
// var url = '../admin/check_parent_total.pl?budget_id=' + budgetId + '&parent_id=' + newBudgetParent + "&total=" + budgetTotal + "&period_id="+ periodID ;
|
|
|
|
|
|
var url = '../admin/check_parent_total.pl?total=' + budgetTotal + "&period_id="+ periodID ;
|
|
|
|
if (budgetId ) { url += '&budget_id=' + budgetId };
|
|
if ( newBudgetParent ) { url += '&parent_id=' + newBudgetParent};
|
|
|
|
|
|
xmlhttp.open('GET', url, false);
|
|
xmlhttp.send(null);
|
|
|
|
xmlhttp.onreadystatechange = function() {
|
|
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
|
|
// stupid JS...
|
|
} else {
|
|
// wait for the call to complete
|
|
}
|
|
};
|
|
|
|
var result = eval ( xmlhttp.responseText );
|
|
|
|
if (result == '1') {
|
|
return "- " + __("Fund amount exceeds parent allocation") + "\n";
|
|
} else if (result == '2') {
|
|
return "- " + __("Fund amount exceeds period allocation") + "\n";
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
//USED BY AQBUDGETS.TMPL
|
|
function checkBudgetParent(budgetId, newBudgetParent) {
|
|
var xmlhttp = null;
|
|
xmlhttp = new XMLHttpRequest();
|
|
if ( typeof xmlhttp.overrideMimeType != 'undefined') {
|
|
xmlhttp.overrideMimeType('text/xml');
|
|
}
|
|
|
|
var url = '../admin/check_budget_parent.pl?budget_id=' + budgetId + '&new_parent=' + newBudgetParent;
|
|
xmlhttp.open('GET', url, false);
|
|
xmlhttp.send(null);
|
|
|
|
xmlhttp.onreadystatechange = function() {
|
|
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
|
|
// do something with the results
|
|
} else {
|
|
// wait for the call to complete
|
|
}
|
|
};
|
|
|
|
var result = eval ( xmlhttp.responseText );
|
|
|
|
if (result == '1') {
|
|
return "- " + __("New budget-parent is beneath budget") + "\n";
|
|
// } else if (result == '2') {
|
|
// return "- New budget-parent has insufficent funds\n";
|
|
// } else {
|
|
// return false;
|
|
}
|
|
}
|
|
|
|
function hideColumn(num) {
|
|
$("#hideall,#showall").prop("checked", false).parent().removeClass("selected");
|
|
$("#"+num).parent().removeClass("selected");
|
|
var hide = Number(num.replace("col","")) + 2;
|
|
// hide header and cells matching the index
|
|
$("#plan td:nth-child("+hide+"),#plan th:nth-child("+hide+")").toggle();
|
|
}
|
|
|
|
function showColumn(num){
|
|
$("#hideall").prop("checked", false).parent().removeClass("selected");
|
|
$("#"+num).parent().addClass("selected");
|
|
// set the index of the table column to hide
|
|
show = Number(num.replace("col","")) + 2;
|
|
// hide header and cells matching the index
|
|
$("#plan td:nth-child("+show+"),#plan th:nth-child("+show+")").toggle();
|
|
}
|
|
|
|
function showAllColumns(){
|
|
$("#selections").find("input:checkbox").each(function () {
|
|
$(this).prop("checked", true);
|
|
});
|
|
$("#selections span").addClass("selected");
|
|
$("#plan td:nth-child(2),#plan tr th:nth-child(2)").nextAll().show();
|
|
$("#hideall").prop("checked", false).parent().removeClass("selected");
|
|
}
|
|
function hideAllColumns(){
|
|
var allCols = $("#plan th").length;
|
|
$("#selections").find("input:checkbox").each(function () {
|
|
$(this).prop("checked", false);
|
|
});
|
|
$("#selections span").removeClass("selected");
|
|
$("#plan td:nth-child(2),#plan th:nth-child(2)").nextUntil("th:nth-child("+(allCols-1)+"),td:nth-child("+(allCols-1)+")").hide(); // hide all but the last two columns
|
|
$("#hideall").prop("checked", true).parent().addClass("selected");
|
|
}
|