Neuer Part Controller
[kivitendo-erp.git] / js / kivi.Part.js
1 namespace('kivi.Part', function(ns) {
2
3   ns.open_history_popup = function() {
4     var id = $("#part_id").val();
5     kivi.popup_dialog({
6       url:    'controller.pl?action=Part/history&part.id=' + id,
7       dialog: { title: kivi.t8('History') },
8     });
9   }
10
11   ns.save = function() {
12     var data = $('#ic').serializeArray();
13     data.push({ name: 'action', value: 'Part/save' });
14
15     $.post("controller.pl", data, kivi.eval_json_result);
16   };
17
18   ns.use_as_new = function() {
19     var oldid = $("#part_id").val();
20     $('#ic').attr('action', 'controller.pl?action=Part/use_as_new&old_id=' + oldid);
21     $('#ic').submit();
22   };
23
24   ns.delete = function() {
25     var data = $('#ic').serializeArray();
26     data.push({ name: 'action', value: 'Part/delete' });
27
28     $.post("controller.pl", data, kivi.eval_json_result);
29   };
30
31   ns.reformat_number = function(event) {
32     $(event.target).val(kivi.format_amount(kivi.parse_amount($(event.target).val()), -2));
33   };
34
35   ns.set_tab_active_by_index = function (index) {
36     $("#ic_tabs").tabs({active: index})
37   };
38
39   ns.set_tab_active_by_name= function (name) {
40     var index = $('#ic_tabs a[href=#' + name + ']').parent().index();
41     ns.set_tab_active_by_index(index);
42   };
43
44   ns.reorder_items = function(order_by) {
45     var dir = $('#' + order_by + '_header_id a img').attr("data-sort-dir");
46     var part_type = $("#part_part_type").val();
47
48     var data;
49     if (part_type === 'assortment') {
50       $('#assortment thead a img').remove();
51       data = $('#assortment :input').serializeArray();
52     } else if ( part_type === 'assembly') {
53       $('#assembly thead a img').remove();
54       data = $('#assembly :input').serializeArray();
55     };
56
57     var src;
58     if (dir == "1") {
59       dir = "0";
60       src = "image/up.png";
61     } else {
62       dir = "1";
63       src = "image/down.png";
64     }
65
66     $('#' + order_by + '_header_id a').append('<img border=0 data-sort-dir=' + dir + ' src=' + src + ' alt="' + kivi.t8('sort items') + '">');
67
68     data.push({ name: 'action',    value: 'Part/reorder_items' },
69               { name: 'order_by',  value: order_by             },
70               { name: 'part_type', value: part_type            },
71               { name: 'sort_dir',  value: dir                  });
72
73     $.post("controller.pl", data, kivi.eval_json_result);
74   };
75
76   ns.assortment_recalc = function() {
77     var data = $('#assortment :input').serializeArray();
78     data.push({ name: 'action', value: 'Part/update_item_totals' },
79               { name: 'part_type', value: 'assortment'                   });
80
81     $.post("controller.pl", data, kivi.eval_json_result);
82   };
83
84   ns.assembly_recalc = function() {
85     var data = $('#assembly :input').serializeArray();
86     data.push( { name: 'action',    value: 'Part/update_item_totals' },
87                { name: 'part_type', value: 'assembly'                        });
88
89     $.post("controller.pl", data, kivi.eval_json_result);
90   };
91
92   ns.set_assortment_sellprice = function() {
93     $("#part_sellprice_as_number").val($("#items_sellprice_sum").html());
94     // ns.set_tab_active_by_name('basic_data');
95     // $("#part_sellprice_as_number").focus();
96   };
97
98   ns.set_assortment_lsg_sellprice = function() {
99     $("#items_lsg_sellprice_sum_basic").closest('td').find('input').val($("#items_lsg_sellprice_sum").html());
100   };
101
102   ns.set_assortment_douglas_sellprice = function() {
103     $("#items_douglas_sellprice_sum_basic").closest('td').find('input').val($("#items_douglas_sellprice_sum").html());
104   };
105
106   ns.set_assortment_lastcost = function() {
107     $("#part_lastcost_as_number").val($("#items_lastcost_sum").html());
108     // ns.set_tab_active_by_name('basic_data');
109     // $("#part_lastcost_as_number").focus();
110   };
111
112   ns.set_assembly_sellprice = function() {
113     $("#part_sellprice_as_number").val($("#items_sellprice_sum").html());
114     // ns.set_tab_active_by_name('basic_data');
115     // $("#part_sellprice_as_number").focus();
116   };
117
118   ns.renumber_positions = function() {
119     var part_type = $("#part_part_type").val();
120     var rows;
121     if (part_type === 'assortment') {
122       rows = $('.assortment_item_row [name="position"]');
123     } else if ( part_type === 'assembly') {
124       rows = $('.assembly_item_row [name="position"]');
125     };
126     $(rows).each(function(idx, elt) {
127       $(elt).html(idx+1);
128       var row = $(elt).closest('tr');
129       if ( idx % 2 === 0 ) {
130         if ( row.hasClass('listrow1') ) {
131           row.removeClass('listrow1');
132           row.addClass('listrow0');
133         };
134       } else {
135         if ( row.hasClass('listrow0') ) {
136           row.removeClass('listrow0');
137           row.addClass('listrow1');
138         };
139       };
140     });
141   };
142
143   ns.delete_item_row = function(clicked) {
144     var row = $(clicked).closest('tr');
145     $(row).remove();
146     var part_type = $("#part_part_type").val();
147     ns.renumber_positions();
148     if (part_type === 'assortment') {
149       ns.assortment_recalc();
150     } else if ( part_type === 'assembly') {
151       ns.assembly_recalc();
152     };
153   };
154
155   ns.add_assortment_item = function() {
156     if ($('#add_assortment_item_id').val() === '') return;
157
158     $('#row_table_id thead a img').remove();
159
160     var data = $('#assortment :input').serializeArray();
161     data.push({ name: 'action', value: 'Part/add_assortment_item' },
162               { name: 'part.id', value: $('#part_id').val()       },
163               { name: 'part.part_type', value: 'assortment'       });
164
165     $.post("controller.pl", data, kivi.eval_json_result);
166   };
167
168   ns.add_assembly_item = function() {
169     if ($('#add_assembly_item_id').val() === '') return;
170
171     var data = $('#assembly :input').serializeArray();
172     data.push({ name: 'action', value: 'Part/add_assembly_item' },
173               { name: 'part.id', value: $("#part_id").val()     },
174               { name: 'part.part_type', value: 'assortment'     });
175
176     $.post("controller.pl", data, kivi.eval_json_result);
177   };
178
179   ns.redisplay_items = function(data) {
180     var old_rows;
181     var part_type = $("#part_part_type").val();
182     if (part_type === 'assortment') {
183       old_rows = $('.assortment_item_row').detach();
184     } else if ( part_type === 'assembly') {
185       old_rows = $('.assembly_item_row').detach();
186     };
187     var new_rows = [];
188     $(data).each(function(idx, elt) {
189       new_rows.push(old_rows[elt.old_pos - 1]);
190     });
191     if (part_type === 'assortment') {
192       $(new_rows).appendTo($('#assortment_items'));
193     } else if ( part_type === 'assembly') {
194       $(new_rows).appendTo($('#assembly_items'));
195     };
196     ns.renumber_positions();
197   };
198
199   ns.focus_last_assortment_input = function () {
200     $("#assortment_items tr:last").find('input[type=text]').filter(':visible:first').focus();
201   };
202
203   ns.focus_last_assembly_input = function () {
204     $("#assembly_rows tr:last").find('input[type=text]').filter(':visible:first').focus();
205   };
206
207   ns.show_multi_items_dialog = function(part_type) {
208
209     $('#row_table_id thead a img').remove();
210
211     kivi.popup_dialog({
212       url: 'controller.pl?action=Part/show_multi_items_dialog',
213       data: { callback:         'Part/add_multi_' + part_type + '_items',
214               callback_data_id: 'ic',
215               'part.part_type': part_type,
216             },
217       id: 'jq_multi_items_dialog',
218       dialog: {
219         title: kivi.t8('Add multiple items'),
220         width:  800,
221         height: 800
222       }
223     });
224     return true;
225   };
226
227   ns.close_multi_items_dialog = function() {
228     $('#jq_multi_items_dialog').dialog('close');
229   };
230
231
232   // makemodel
233   ns.makemodel_renumber_positions = function() {
234     $('.makemodel_row [name="position"]').each(function(idx, elt) {
235       $(elt).html(idx+1);
236     });
237   };
238
239   ns.delete_makemodel_row = function(clicked) {
240     var row = $(clicked).closest('tr');
241     $(row).remove();
242
243     ns.makemodel_renumber_positions();
244   };
245
246   ns.add_makemodel_row = function() {
247     if ($('#add_makemodelid').val() === '') return;
248
249     var data = $('#makemodel_table :input').serializeArray();
250     data.push({ name: 'action', value: 'Part/add_makemodel_row' });
251
252     $.post("controller.pl", data, kivi.eval_json_result);
253   };
254
255   ns.focus_last_makemodel_input = function () {
256     $("#makemodel_rows tr:last").find('input[type=text]').filter(':visible:first').focus();
257   };
258
259
260   ns.reload_bin_selection = function() {
261     $.post("controller.pl", { action: 'Part/warehouse_changed', warehouse_id: function(){ return $('#part_warehouse_id').val() } },   kivi.eval_json_result);
262   }
263
264   $(function(){
265
266     // assortment
267     // TODO: allow units for assortment items
268     $('#add_assortment_item_id').on('set_item:PartPicker', function(e,o) { $('#add_item_unit').val(o.unit) });
269
270     $('#ic').on('focusout', '.reformat_number', function(event) {
271        ns.reformat_number(event);
272     })
273
274     $('.add_assortment_item_input').keydown(function(event) {
275       if(event.keyCode == 13) {
276         event.preventDefault();
277         if ($("input[name='add_items[+].parts_id']").val() != '' ) {
278           kivi.Part.show_multi_items_dialog("assortment");
279          // ns.add_assortment_item();
280         };
281         return false;
282       }
283     });
284
285     $('.add_assembly_item_input').keydown(function(event) {
286       if(event.keyCode == 13) {
287         event.preventDefault();
288         if ($("input[name='add_items[+].parts_id']").val() != '' ) {
289           kivi.Part.show_multi_items_dialog("assortment");
290           // ns.add_assembly_item();
291         }
292         return false;
293       }
294     });
295
296     $('.add_makemodel_input').keydown(function(event) {
297       if(event.keyCode == 13) {
298         event.preventDefault();
299         ns.add_makemodel_row();
300         return false;
301       }
302     });
303
304     $('#part_warehouse_id').change(kivi.Part.reload_bin_selection);
305
306   });
307 })