Bug 7178 follow-up: Fix check_additem when UniqueItemFields is empty
[koha.git] / koha-tmpl / intranet-tmpl / prog / en / js / additem.js
1 function addItem( node, unique_item_fields ) {
2     var index = $(node).parent().attr('id');
3     var current_qty = parseInt($("#quantity").val());
4     var max_qty;
5     if($("#quantity_to_receive").length != 0){
6         max_qty = parseInt($("#quantity_to_receive").val());
7     } else  {
8         max_qty = 99999;
9     }
10     if ( $("#items_list table").find('tr[idblock="' + index + '"]').length == 0 ) {
11         if ( current_qty < max_qty ) {
12             if ( current_qty < max_qty - 1 )
13                 cloneItemBlock(index, unique_item_fields);
14             addItemInList(index, unique_item_fields);
15             $("#" + index).find("a[name='buttonPlus']").text("Update");
16             $("#quantity").val(current_qty + 1).change();
17         } else if ( current_qty >= max_qty ) {
18             alert(window.MSG_ADDITEM_JS_CANT_RECEIVE_MORE_ITEMS
19                 || "You can't receive any more items.");
20         }
21     } else {
22         if ( current_qty < max_qty )
23             cloneItemBlock(index, unique_item_fields);
24         var tr = constructTrNode(index);
25         $("#items_list table").find('tr[idblock="' + index + '"]:first').replaceWith(tr);
26     }
27     $("#" + index).hide();
28 }
29
30 function showItem(index) {
31     $("#outeritemblock").children("div").each(function(){
32         if ( $(this).attr('id') == index ) {
33             $(this).show();
34         } else {
35             if ( $("#items_list table").find('tr[idblock="' + $(this).attr('id') + '"]').length == 0 ) {
36                 $(this).remove();
37             } else {
38                 $(this).hide();
39             }
40         }
41     });
42 }
43
44 function constructTrNode(index, unique_item_fields) {
45     var fields = ['barcode', 'homebranch', 'holdingbranch', 'notforloan',
46         'restricted', 'location', 'itemcallnumber', 'copynumber',
47         'stocknumber', 'ccode', 'itype', 'materials', 'itemnotes'];
48
49     var result = "<tr idblock='" + index + "'>";
50     var edit_link = "<a href='#itemfieldset' style='text-decoration:none' onclick='showItem(\"" + index + "\");'>"
51         + (window.MSG_ADDITEM_JS_EDIT || "Edit") + "</a>";
52     var del_link = "<a style='cursor:pointer' "
53         + "onclick='deleteItemBlock(this, \"" + index + "\", \"" + unique_item_fields + "\");'>"
54         + (window.MSG_ADDITEM_JS_DELETE || "Delete") + "</a>";
55     result += "<td>" + edit_link + "</td>";
56     result += "<td>" + del_link + "</td>";
57     for(i in fields) {
58         var field = fields[i];
59         var field_elt = $("#" + index)
60             .find("[name='kohafield'][value='items."+field+"']")
61             .prevAll("[name='field_value']")[0];
62         var field_value;
63         if($(field_elt).is('select')) {
64             field_value = $(field_elt).find("option:selected").text();
65         } else {
66             field_value = $(field_elt).val();
67         }
68         result += "<td>" + field_value + "</td>";
69     }
70     result += "</tr>";
71
72     return result;
73 }
74
75 function addItemInList(index, unique_item_fields) {
76     $("#items_list").show();
77     var tr = constructTrNode(index, unique_item_fields);
78     $("#items_list table tbody").append(tr);
79 }
80
81 function deleteItemBlock(node_a, index, unique_item_fields) {
82     $("#" + index).remove();
83     var current_qty = parseInt($("#quantity").val());
84     var max_qty;
85     if($("#quantity_to_receive").length != 0) {
86         max_qty = parseInt($("#quantity_to_receive").val());
87     } else {
88         max_qty = 99999;
89     }
90     $("#quantity").val(current_qty - 1).change();
91     $(node_a).parents('tr').remove();
92     if(current_qty - 1 == 0)
93         $("#items_list").hide();
94
95     if ( $("#quantity").val() <= max_qty - 1) {
96         if ( $("#outeritemblock").children("div :visible").length == 0 ) {
97             $("#outeritemblock").children("div:last").show();
98         }
99     }
100     if ( $("#quantity").val() == 0 && $("#outeritemblock > div").length == 0) {
101         cloneItemBlock(0, unique_item_fields);
102     }
103 }
104
105 function cloneItemBlock(index, unique_item_fields) {
106     var original;
107     if(index) {
108         original = $("#" + index); //original <div>
109     }
110     var dont_copy_fields = new Array();
111     if(unique_item_fields) {
112         var dont_copy_fields = unique_item_fields.split(' ');
113         for(i in dont_copy_fields) {
114             dont_copy_fields[i] = "items." + dont_copy_fields[i];
115         }
116     }
117
118     var random = Math.floor(Math.random()*100000); // get a random itemid.
119     var clone = $("<div id='itemblock"+random+"'></div>")
120     $.ajax({
121         url: "/cgi-bin/koha/services/itemrecorddisplay.pl",
122         dataType: 'html',
123         data: {
124             frameworkcode: 'ACQ'
125         },
126         success: function(data, textStatus, jqXHR) {
127             /* Create the item block */
128             $(clone).append(data);
129             /* Change all itemid fields value */
130             $(clone).find("input[name='itemid']").each(function(){
131                 $(this).val(random);
132             });
133             /* Add buttons + and Clear */
134             var buttonPlus = '<a name="buttonPlus" style="cursor:pointer; margin:0 1em;" onclick="addItem(this,\'' + unique_item_fields + '\')">Add</a>';
135             var buttonClear = '<a name="buttonClear" style="cursor:pointer;" onclick="clearItemBlock(this)">' + (window.MSG_ADDITEM_JS_CLEAR || 'Clear') + '</a>';
136             $(clone).append(buttonPlus).append(buttonClear);
137             /* Copy values from the original block (input) */
138             $(original).find("input[name='field_value']").each(function(){
139                 var kohafield = $(this).siblings("input[name='kohafield']").val();
140                 if($(this).val() && dont_copy_fields.indexOf(kohafield) == -1) {
141                     $(this).parent("div").attr("id").match(/^(subfield.)/);
142                     var id = RegExp.$1;
143                     var value = $(this).val();
144                     $(clone).find("div[id^='"+id+"'] input[name='field_value']").val(value);
145                 }
146             });
147             /* Copy values from the original block (select) */
148             $(original).find("select[name='field_value']").each(function(){
149                 var kohafield = $(this).siblings("input[name='kohafield']").val();
150                 if($(this).val() && dont_copy_fields.indexOf(kohafield) == -1) {
151                     $(this).parent("div").attr("id").match(/^(subfield.)/);
152                     var id = RegExp.$1;
153                     var value = $(this).val();
154                     $(clone).find("div[id^='"+id+"'] select[name='field_value']").val(value);
155                 }
156             });
157
158             $("#outeritemblock").append(clone);
159         }
160     });
161 }
162
163 function clearItemBlock(node) {
164     var index = $(node).parent().attr('id');
165     var block = $("#"+index);
166     $(block).find("input[type='text']").each(function(){
167         $(this).val("");
168     });
169     $(block).find("select").each(function(){
170         $(this).find("option:first").attr("selected", true);
171     });
172 }
173
174 function check_additem(unique_item_fields) {
175     var success = true;
176     var data = new Object();
177     data['field'] = new Array();
178     data['value'] = new Array();
179     var array_fields = unique_item_fields.split(' ');
180     $(".error").empty(); // Clear error div
181
182     // Check if a value is duplicated in form
183     for ( field in array_fields ) {
184         var fieldname = array_fields[field];
185         if (fieldname == '') {
186             continue;
187         }
188         var values = new Array();
189         $("[name='kohafield'][value=items."+ fieldname +"]").each(function(){
190             var input = $(this).prevAll("input[name='field_value']")[0];
191             if($(input).val()) {
192                 values.push($(input).val());
193                 data['field'].push(fieldname);
194                 data['value'].push($(input).val());
195             }
196         });
197
198         var sorted_arr = values.sort();
199         for (var i = 0; i < sorted_arr.length - 1; i += 1) {
200             if (sorted_arr[i + 1] == sorted_arr[i]) {
201                 $(".error").append(
202                     fieldname + " '" + sorted_arr[i] + "' "
203                     + (window.MSG_ADDITEM_JS_IS_DUPLICATE || "is duplicated")
204                     + "<br/>");
205                 success = false;
206             }
207         }
208     }
209
210     // If there is a duplication, we raise an error
211     if ( success == false ) {
212         $(".error").show();
213         return false;
214     }
215
216     $.ajax({
217         url: '/cgi-bin/koha/acqui/check_uniqueness.pl',
218         async: false,
219         dataType: 'json',
220         data: data,
221         success: function(data) {
222             for (field in data) {
223                 success = false;
224                 for (var i=0; i < data[field].length; i++) {
225                     var value = data[field][i];
226                     $(".error").append(
227                         field + " '" + value + "' "
228                         + (window.MSG_ADDITEM_JS_ALREADY_EXISTS_IN_DB
229                             || "already exists in database")
230                         + "<br />"
231                     );
232                 }
233             }
234         }
235     });
236
237     if ( success == false ) {
238         $(".error").show();
239     }
240     return success;
241 }
242