Koha/koha-tmpl/intranet-tmpl/prog/js/additem.js
Owen Leonard 9d056d0364 Bug 25317: Move translatable strings out of additem.js.inc
This patch moves the definition of translatable strings out of
additem.js.inc and into additem.js using the new JS i81n function.
additem.js.inc is removed, being obsolete.

To test:

When creating an order:

- Go to Administration -> System preferences and set "AcqCreateItem" to
  "when placing an order."
- Apply the patch and go to Acquisitions -> Vendor -> Add to basket ->
  From a new (empty) record.
- In the "Item" section, confirm that the buttons at the bottom of the
  form are correct: "Add item," "Clear," and "Add multiple items."
- Click "Add multiple items." The placeholder in the revealed form field
  should read "Number of items to add." The corresponding button should
  be labeled "Add."
- You should see a note, "NOTE: Fields listed in the 'UniqueItemsFields'
  system preference will not be copied."
- Fill out the item entry form and add a number to the "multiple items"
  field. Click "Add."
- A table of items should be displayed with "Edit" and "Delete" buttons
  for each new item.
- Click one of the "Edit" buttons. The item form should be populated
  with the item's data, with an "Update item" button at the bottom.

When receiving an order:

- Go to Administration -> System preferences and set "AcqCreateItem" to
  "when receiving an order."
- Go to Acquisitions -> Vendor -> Receive shipments.
- Select or create an invoice.
- Click "Receive" on an order which has a quantity greater than 1.
- Add two items, duplicating in each at least one value which is marked
  as unique by the "UniqueItemFields" system preference (e.g. fill in
  the same barcode number for each item).
- Click "Save." You should get an alert about duplicated values, and
  there should be an alert message on the page, "barcode 'XXX' is
  duplicated."
- Edit one of the two items and change the barcode to one which already
  exists in your database.
- Click "Save." An alert message should be shown on the page, "barcode
  'XXX' already exists in the database."
- Note: I was unable to find out how to trigger this error, "You can't
  receive any more items." It may be obsolete.

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/additem.js for translation,
  e.g.:

  msgid "Add multiple items"
  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>
2020-09-29 14:28:18 +02:00

312 lines
12 KiB
JavaScript

/* global __ */
function addItem( node, unique_item_fields ) {
var index = $(node).closest("div").attr('id');
var current_qty = parseInt($("#quantity").val());
var max_qty;
if($("#quantity_to_receive").length != 0){
max_qty = parseInt($("#quantity_to_receive").val());
} else {
max_qty = 99999;
}
if ( $("#items_list table").find('tr[idblock="' + index + '"]').length == 0 ) {
if ( current_qty < max_qty ) {
if ( current_qty < max_qty - 1 )
cloneItemBlock(index, unique_item_fields);
addItemInList(index, unique_item_fields);
$("#" + index).find("input[name='buttonPlus']").val( __("Update item") );
$("#"+ index).find("input[name='buttonPlusMulti']").remove();
$("#" + index).find("input[name='multiValue']").remove();
$("#quantity").val(current_qty + 1).change();
} else if ( current_qty >= max_qty ) {
alert( __("You can't receive any more items") );
}
} else {
if ( current_qty < max_qty )
cloneItemBlock(index, unique_item_fields);
var tr = constructTrNode(index);
$("#items_list table").find('tr[idblock="' + index + '"]:first').replaceWith(tr);
}
$("#" + index).hide();
}
function addMulti( count, node, unique_item_fields){
var index = $(node).closest("div").attr('id');
var countItemsBefore = $("#items_list tbody tr").length;
var current_qty = parseInt( $('#quantity').val(), 10 );
$("#procModal").modal('show');
$("#" + index).hide();
for(var i=0;i<count;i++){
cloneItemBlock(index, unique_item_fields, function(cloneIndex){
addItemInList(cloneIndex,unique_item_fields, function(){
if( ($("#items_list tbody tr").length-countItemsBefore)==(count)){
$("#multiValue").val('');
$('#'+index).appendTo('#outeritemblock');
$('#'+index).show();
$('#'+index + ' #add_multiple_copies' ).css("visibility","hidden");
$("#procModal").modal('hide');
}
});
$("#" + cloneIndex).find("input[name='buttonPlus']").val( ( __("Update item") ) );
$("#" + cloneIndex).find("input[name='buttonPlusMulti']").remove();
$("#" + cloneIndex).find("input[name='multiValue']").remove();
$("#" + cloneIndex).hide();
current_qty++;
$('#quantity').val( current_qty );
});
}
}
function checkCount(node, unique_item_fields){
var count = parseInt( $("#multiValue").val(), 10 );
if ( isNaN( count ) || count <=0) {
$("#multiCountModal").modal('show');
}
else{
addMulti( count, node, unique_item_fields);
}
}
function showItem(index) {
$("#outeritemblock").children("div").each(function(){
if ( $(this).attr('id') == index ) {
$(this).show();
} else {
if ( $("#items_list table").find('tr[idblock="' + $(this).attr('id') + '"]').length == 0 ) {
$(this).remove();
} else {
$(this).hide();
}
}
});
}
function constructTrNode(index, unique_item_fields) {
var fields = ['barcode', 'homebranch', 'holdingbranch', 'notforloan',
'restricted', 'location', 'itemcallnumber', 'copynumber',
'stocknumber', 'ccode', 'itype', 'materials', 'itemnotes'];
var result = "<tr idblock='" + index + "'>";
var edit_link = "<a href='#itemfieldset' style='text-decoration:none' onclick='showItem(\"" + index + "\");' class='btn btn-default btn-xs'><i class='fa fa-pencil'></i> "
+ ( __("Edit") ) + "</a>";
var del_link = "<a style='cursor:pointer' "
+ "onclick='deleteItemBlock(this, \"" + index + "\", \"" + unique_item_fields + "\");' class='btn btn-default btn-xs'><i class='fa fa-trash'></i> "
+ ( __("Delete") ) + "</a>";
result += "<td class='actions'>" + edit_link + " " + del_link + "</td>";
for(i in fields) {
var field = fields[i];
var field_elt = $("#" + index)
.find("[name='kohafield'][value='items."+field+"']")
.prevAll("[name='field_value']")[0];
var field_value;
if($(field_elt).is('select')) {
field_value = $(field_elt).find("option:selected").text();
} else {
field_value = $(field_elt).val();
}
if (field_value == undefined) {
field_value = '';
}
result += "<td>" + field_value + "</td>";
}
result += "</tr>";
return result;
}
function addItemInList(index, unique_item_fields, callback) {
$("#items_list").show();
var tr = constructTrNode(index, unique_item_fields);
$("#items_list table tbody").append(tr);
if (typeof callback === "function"){
callback();
}
}
function deleteItemBlock(node_a, index, unique_item_fields) {
$("#" + index).remove();
var current_qty = parseInt($("#quantity").val());
var max_qty;
if($("#quantity_to_receive").length != 0) {
max_qty = parseInt($("#quantity_to_receive").val());
} else {
max_qty = 99999;
}
$("#quantity").val(current_qty - 1).change();
$(node_a).parents('tr').remove();
if(current_qty - 1 == 0)
$("#items_list").hide();
if ( $("#quantity").val() <= max_qty - 1) {
if ( $("#outeritemblock").children("div :visible").length == 0 ) {
$("#outeritemblock").children("div:last").show();
}
}
if ( $("#quantity").val() == 0 && $("#outeritemblock > div").length == 0) {
cloneItemBlock(0, unique_item_fields);
}
}
function cloneItemBlock(index, unique_item_fields, callback) {
var original;
if(index) {
original = $("#" + index); //original <div>
}
var dont_copy_fields = new Array();
if(unique_item_fields) {
var dont_copy_fields = unique_item_fields.split('|');
for(i in dont_copy_fields) {
dont_copy_fields[i] = "items." + dont_copy_fields[i];
}
}
$.ajax({
url: "/cgi-bin/koha/services/itemrecorddisplay.pl",
dataType: 'html',
data: {
frameworkcode: 'ACQ'
},
success: function(data, textStatus, jqXHR) {
/* Create the item block */
var random = Math.floor(Math.random()*100000); // get a random itemid.
var clone = $("<div/>", { id: 'itemblock'+random });
$("#outeritemblock").append(clone);
$(clone).append(data);
/* Change all itemid fields value */
$(clone).find("input[name='itemid']").each(function(){
$(this).val(random);
});
/* Add buttons + and Clear */
var buttonPlus = "<fieldset class=\"action\">";
buttonPlus += '<input type="button" class="addItemControl" name="buttonPlus" style="cursor:pointer; margin:0 1em;" onclick="addItem(this,\'' + unique_item_fields + '\')" value="' + ( __("Add item") )+ '" />';
buttonPlus += '<input type="button" class="addItemControl cancel" name="buttonClear" style="cursor:pointer;" onclick="clearItemBlock(this)" value="' + __("Clear") + '" />';
buttonPlus += '<input type="button" class="addItemControl" name="buttonPlusMulti" onclick="javascript:this.nextSibling.style.display=\'inline\'; return false;" style="cursor:pointer; margin:0 1em;" value="' + __("Add multiple items") + '" />';
buttonPlus += '<span id="add_multiple_copies" style="display:none">'
+ '<input type="number" class="addItemControl" id="multiValue" name="multiValue" placeholder="' + __("Number of items to add") + '" />'
+ '<input type="button" class="addItemControl" name=buttonAddMulti" style="cursor:pointer; margin:0 1em;" onclick="checkCount( this ,\'' + unique_item_fields + '\')" value="' + __("Add") + '" />'
+ '<div class="dialog message">' + __("NOTE: Fields listed in the 'UniqueItemsFields' system preference will not be copied") + '</div>'
+ '</span>';
buttonPlus += "</fieldset>";
$(clone).append(buttonPlus);
/* Copy values from the original block (input) */
$(original).find("input[name='field_value']").each(function(){
var kohafield = $(this).siblings("input[name='kohafield']").val();
if($(this).val() && $.inArray(kohafield,dont_copy_fields) == -1) {
$(this).parent("div").attr("id").match(/^(subfield.)/);
var id = RegExp.$1;
var value = $(this).val();
$(clone).find("div[id^='"+id+"'] input[name='field_value']").val(value);
}
});
/* Copy values from the original block (select) */
$(original).find("select[name='field_value']").each(function(){
var kohafield = $(this).siblings("input[name='kohafield']").val();
if($(this).val() && $.inArray(kohafield,dont_copy_fields) == -1) {
$(this).parent("div").attr("id").match(/^(subfield.)/);
var id = RegExp.$1;
var value = $(this).val();
$(clone).find("div[id^='"+id+"'] select[name='field_value']").val(value);
}
});
if (typeof callback === "function"){
var cloneIndex = "itemblock"+random;
callback(cloneIndex);
}
BindPluginEvents(data);
}
});
}
function BindPluginEvents(data) {
// the script tag in data for plugins contains a document ready that binds
// the events for the plugin
// when we append, this code does not get executed anymore; so we do it here
var events= data.match(/BindEventstag_\d+_subfield_._\d+/g);
if ( events == null ) return;
for(var i=0; i<events.length; i++) {
window[events[i]]();
if( i<events.length-1 && events[i]==events[i+1] ) { i++; }
// normally we find the function name twice
}
}
function clearItemBlock(node) {
var index = $(node).closest("div").attr('id');
var block = $("#"+index);
$(block).find("input[type='text']").each(function(){
$(this).val("");
});
$(block).find("select").each(function(){
$(this).find("option:first").attr("selected", true);
});
}
function check_additem(unique_item_fields) {
var success = true;
var data = new Object();
data['field'] = new Array();
data['value'] = new Array();
var array_fields = unique_item_fields.split('|');
$(".order_error").empty(); // Clear error div
// Check if a value is duplicated in form
for ( field in array_fields ) {
var fieldname = array_fields[field];
if (fieldname == '') {
continue;
}
var values = new Array();
$("[name='kohafield'][value='items."+ fieldname +"']").each(function(){
var input = $(this).prevAll("input[name='field_value']")[0];
if($(input).val()) {
values.push($(input).val());
data['field'].push(fieldname);
data['value'].push($(input).val());
}
});
var sorted_arr = values.sort();
for (var i = 0; i < sorted_arr.length - 1; i += 1) {
if (sorted_arr[i + 1] == sorted_arr[i]) {
$(".order_error").append(
fieldname + " '" + sorted_arr[i] + "' "
+ __("is duplicated")
+ "<br/>");
success = false;
}
}
}
// If there is a duplication, we raise an error
if ( success == false ) {
$(".order_error").show();
return false;
}
$.ajax({
url: '/cgi-bin/koha/acqui/check_uniqueness.pl',
async: false,
dataType: 'json',
data: data,
success: function(data) {
for (field in data) {
success = false;
for (var i=0; i < data[field].length; i++) {
var value = data[field][i];
$(".order_error").append(
field + " '" + value + "' "
+ __("already exists in database")
+ "<br />"
);
}
}
}
});
if ( success == false ) {
$(".order_error").show();
}
return success;
}