Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 0935b012

Von Bernd Bleßmann vor etwa 8 Jahren hinzugefügt

  • ID 0935b012a57196f883b59ec97bb7fe0882210c5a
  • Vorgänger d8a1906b
  • Nachfolger e09f2da3

Auftrags-Controller: javascript-Code in eigene Datei auslagern

Unterschiede anzeigen:

SL/Controller/Order.pm
189 189
    $::auth->set_session_value("Order::create_pdf-${key}" => $sfile->file_name);
190 190

  
191 191
    $self->js
192
    ->run('download_pdf', $pdf_filename, $key)
192
    ->run('kivi.Order.download_pdf', $pdf_filename, $key)
193 193
    ->flash('info', t8('The PDF has been created'));
194 194

  
195 195
  } elsif ($media eq 'printer') {
......
275 275

  
276 276
  my $dialog_html = $self->render('order/tabs/_email_dialog', { output => 0 });
277 277
  $self->js
278
      ->run('show_email_dialog', $dialog_html)
278
      ->run('kivi.Order.show_email_dialog', $dialog_html)
279 279
      ->reinit_widgets
280 280
      ->render($self);
281 281
}
......
315 315

  
316 316
  $self->js
317 317
      ->val('#order_intnotes', $intnotes)
318
      ->run('close_email_dialog')
318
      ->run('kivi.Order.close_email_dialog')
319 319
      ->render($self);
320 320
}
321 321

  
......
395 395
  $self->_recalc();
396 396

  
397 397
  $self->js
398
    ->run('update_sellprice', $::form->{item_id}, $item->sellprice_as_number);
398
    ->run('kivi.Order.update_sellprice', $::form->{item_id}, $item->sellprice_as_number);
399 399
  $self->_js_redisplay_linetotals;
400 400
  $self->_js_redisplay_amounts_and_taxes;
401 401
  $self->js->render();
......
423 423
  $self->js
424 424
    ->append('#row_table_id', $row_as_html)
425 425
    ->val('.add_item_input', '')
426
    ->run('init_row_handlers')
427
    ->run('row_table_scroll_down')
428
    ->run('renumber_positions')
426
    ->run('kivi.Order.init_row_handlers')
427
    ->run('kivi.Order.row_table_scroll_down')
428
    ->run('kivi.Order.renumber_positions')
429 429
    ->focus('#add_item_parts_id_name');
430 430

  
431 431
  $self->_js_redisplay_amounts_and_taxes;
......
484 484
  }
485 485

  
486 486
  $self->js
487
    ->run('close_multi_items_dialog')
488
    ->run('init_row_handlers')
489
    ->run('row_table_scroll_down')
490
    ->run('renumber_positions')
487
    ->run('kivi.Order.close_multi_items_dialog')
488
    ->run('kivi.Order.init_row_handlers')
489
    ->run('kivi.Order.row_table_scroll_down')
490
    ->run('kivi.Order.renumber_positions')
491 491
    ->focus('#add_item_parts_id_name');
492 492

  
493 493
  $self->_js_redisplay_amounts_and_taxes;
......
523 523
    @to_sort = sort { $b->{order_by} cmp $a->{order_by} } @to_sort;
524 524
  }
525 525
  $self->js
526
    ->run('redisplay_items', \@to_sort)
526
    ->run('kivi.Order.redisplay_items', \@to_sort)
527 527
    ->render;
528 528
}
529 529

  
......
553 553

  
554 554
  my @data = map {$::form->format_amount(\%::myconfig, $_->{linetotal}, 2, 0)} @{ $self->order->items_sorted };
555 555
  $self->js
556
    ->run('redisplay_linetotals', \@data);
556
    ->run('kivi.Order.redisplay_linetotals', \@data);
557 557
}
558 558

  
559 559
sub _js_redisplay_amounts_and_taxes {
......
946 946
                                                } } @all_objects;
947 947
  }
948 948

  
949
  $::request->{layout}->use_javascript("${_}.js")  for qw(kivi.SalesPurchase ckeditor/ckeditor ckeditor/adapters/jquery);
949
  $::request->{layout}->use_javascript("${_}.js")  for qw(kivi.SalesPurchase kivi.Order ckeditor/ckeditor ckeditor/adapters/jquery);
950 950
}
951 951

  
952 952
sub _create_pdf {
js/kivi.Order.js
1
namespace('kivi.Order', function(ns) {
2
  ns.check_cv = function() {
3
    if ($('#type').val() == 'sales_order') {
4
      if ($('#order_customer_id').val() == '') {
5
        alert(kivi.t8('Please select a customer.'));
6
        return false;
7
      }
8
    } else  {
9
      if ($('#order_vendor_id').val() == '') {
10
        alert(kivi.t8('Please select a vendor.'));
11
        return false;
12
      }
13
    }
14
    return true;
15
  };
16

  
17
  ns.save = function() {
18
    if (!ns.check_cv()) return;
19

  
20
    var data = $('#order_form').serializeArray();
21
    data.push({ name: 'action', value: 'Order/save' });
22

  
23
    $.post("controller.pl", data, kivi.eval_json_result);
24
  };
25

  
26
  ns.save_and_delivery_order = function() {
27
    if (!ns.check_cv()) return;
28

  
29
    var data = $('#order_form').serializeArray();
30
    data.push({ name: 'action', value: 'Order/save_and_delivery_order' });
31

  
32
    $.post("controller.pl", data, kivi.eval_json_result);
33
  };
34

  
35
  ns.delete_order = function() {
36
    var data = $('#order_form').serializeArray();
37
    data.push({ name: 'action', value: 'Order/delete' });
38

  
39
    $.post("controller.pl", data, kivi.eval_json_result);
40
  };
41

  
42
  ns.show_print_options = function() {
43
    if (!ns.check_cv()) return;
44

  
45
    kivi.popup_dialog({
46
      id: 'print_options',
47
      dialog: {
48
        title: kivi.t8('Print options'),
49
        width:  800,
50
        height: 300
51
      }
52
    });
53
  };
54

  
55
  ns.print = function() {
56
    $('#print_options').dialog('close');
57

  
58
    var data = $('#order_form').serializeArray();
59
    data = data.concat($('#print_options_form').serializeArray());
60
    data.push({ name: 'action', value: 'Order/print' });
61

  
62
    $.post("controller.pl", data, kivi.eval_json_result);
63
  };
64

  
65
  ns.download_pdf = function(pdf_filename, key) {
66
    var data = [];
67
    data.push({ name: 'action', value: 'Order/download_pdf' });
68
    data.push({ name: 'type', value: $('#type').val() });
69
    data.push({ name: 'pdf_filename', value: pdf_filename });
70
    data.push({ name: 'key', value: key });
71
    $.download("controller.pl", data);
72
  };
73

  
74
  ns.email = function() {
75
    if (!ns.check_cv()) return;
76
    var data = $('#order_form').serializeArray();
77
    data.push({ name: 'action', value: 'Order/show_email_dialog' });
78

  
79
    $.post("controller.pl", data, kivi.eval_json_result);
80
  };
81

  
82
  var email_dialog;
83

  
84
  ns.show_email_dialog = function(html) {
85
    var id            = 'jqueryui_popup_dialog';
86
    var dialog_params = {
87
      id:     id,
88
      width:  800,
89
      height: 500,
90
      modal:  true,
91
      close: function(event, ui) {
92
        email_dialog.remove();
93
      },
94
    };
95

  
96
    $('#' + id).remove();
97

  
98
    email_dialog = $('<div style="display:none" id="' + id + '"></div>').appendTo('body');
99
    email_dialog.html(html);
100
    email_dialog.dialog(dialog_params);
101

  
102
    $('.cancel').click(ns.close_email_dialog);
103

  
104
    return true;
105
  };
106

  
107
  ns.send_email = function() {
108
    var data = $('#order_form').serializeArray();
109
    data = data.concat($('#email_form').serializeArray());
110
    data.push({ name: 'action', value: 'Order/send_email' });
111
    $.post("controller.pl", data, kivi.eval_json_result);
112
  };
113

  
114
  ns.close_email_dialog = function() {
115
    email_dialog.dialog("close");
116
  };
117

  
118
  ns.reload_cv_dependend_selections = function() {
119
    var data = $('#order_form').serializeArray();
120
    data.push({ name: 'action', value: 'Order/customer_vendor_changed' });
121

  
122
    $.post("controller.pl", data, kivi.eval_json_result);
123
  };
124

  
125
  ns.reformat_number = function(event) {
126
    $(event.target).val(kivi.format_amount(kivi.parse_amount($(event.target).val()), -2));
127
  };
128

  
129
  ns.recalc_amounts_and_taxes = function() {
130
    var data = $('#order_form').serializeArray();
131
    data.push({ name: 'action', value: 'Order/recalc_amounts_and_taxes' });
132

  
133
    $.post("controller.pl", data, kivi.eval_json_result);
134
  };
135

  
136
  ns.unit_change = function(event) {
137
    var row = $(event.target).parents("tbody").first();
138
    var item_id_dom = $(row).find('[name="orderitem_ids[+]"]');
139
    var sellprice_dom = $(row).find('[name="order.orderitems[].sellprice_as_number"]');
140
    var select_elt = $(row).find('[name="order.orderitems[].unit"]');
141

  
142
    var oldval = $(select_elt).data('oldval');
143
    $(select_elt).data('oldval', $(select_elt).val());
144

  
145
    var data = $('#order_form').serializeArray();
146
    data.push({ name: 'action', value: 'Order/unit_changed' });
147
    data.push({ name: 'item_id', value: item_id_dom.val() });
148
    data.push({ name: 'old_unit', value: oldval });
149
    data.push({ name: 'sellprice_dom_id', value: sellprice_dom.attr('id') });
150

  
151
    $.post("controller.pl", data, kivi.eval_json_result);
152
  };
153

  
154
  ns.update_sellprice = function(item_id, price_str) {
155
    var row = $('#item_' + item_id).parents("tbody").first();
156
    var price_elt = $(row).find('[name="order.orderitems[].sellprice_as_number"]');
157
    var html_elt  = $(row).find('[name="sellprice_text"]');
158
    price_elt.val(price_str);
159
    html_elt.html(price_str);
160
  };
161

  
162
  ns.init_row_handlers = function() {
163
    kivi.run_once_for('.recalc', 'on_change_recalc', function(elt) {
164
      $(elt).change(ns.recalc_amounts_and_taxes);
165
    });
166

  
167
    kivi.run_once_for('.reformat_number', 'on_change_reformat', function(elt) {
168
      $(elt).change(ns.reformat_number);
169
    });
170

  
171
    kivi.run_once_for('.unitselect', 'on_change_unit_with_oldval', function(elt) {
172
      $(elt).data('oldval', $(elt).val());
173
      $(elt).change(ns.unit_change);
174
    });
175

  
176
    kivi.run_once_for('.row_entry', 'on_kbd_click_show_hide', function(elt) {
177
      $(elt).keydown(function(event) {
178
        if(event.keyCode == 40 && event.shiftKey == true) {
179
          // shift arrow down
180
          event.preventDefault();
181
          var row = $(event.target).parents(".row_entry").first();
182
          $(row).children().not(':first').show();
183
          return false;
184
        }
185
        if(event.keyCode == 38 && event.shiftKey == true) {
186
          // shift arrow up
187
          event.preventDefault();
188
          var row = $(event.target).parents(".row_entry").first();
189
          $(row).children().not(':first').hide();
190
          return false;
191
        }
192
      });
193
      $(elt).dblclick(function(event) {
194
        event.preventDefault();
195
        var row = $(event.target).parents(".row_entry").first();
196
        $(row).children().not(':first').toggle();
197
        return false;
198
      });
199
    });
200
  };
201

  
202
  ns.redisplay_linetotals = function(data) {
203
    $('.row_entry [name="linetotal"]').each(function(idx, elt) {
204
      $(elt).html(data[idx]);
205
    });
206
  };
207

  
208
  ns.renumber_positions = function() {
209
    $('.row_entry [name="position"]').each(function(idx, elt) {
210
      $(elt).html(idx+1);
211
    });
212
  };
213

  
214
  ns.reorder_items = function(order_by) {
215
    var dir = $('#' + order_by + '_header_id a img').attr("data-sort-dir");
216
    $('#row_table_id thead a img').remove();
217

  
218
    var src;
219
    if (dir == "1") {
220
      dir = "0";
221
      src = "image/up.png";
222
    } else {
223
      dir = "1";
224
      src = "image/down.png";
225
    };
226

  
227
    $('#' + order_by + '_header_id a').append('<img border=0 data-sort-dir=' + dir + ' src=' + src + ' alt="' + kivi.t8('sort items') + '">');
228

  
229
    var data = $('#order_form').serializeArray();
230
    data.push({ name: 'action', value: 'Order/reorder_items' });
231
    data.push({ name: 'order_by', value: order_by });
232
    data.push({ name: 'sort_dir', value: dir });
233

  
234
    $.post("controller.pl", data, kivi.eval_json_result);
235
  };
236

  
237
  ns.redisplay_items = function(data) {
238
    var old_rows = $('.row_entry').detach();
239
    var new_rows = [];
240
    $(data).each(function(idx, elt) {
241
      new_rows.push(old_rows[elt.old_pos - 1]);
242
    });
243
    $(new_rows).appendTo($('#row_table_id'));
244
    ns.renumber_positions();
245
  };
246

  
247
  ns.add_item = function() {
248
    if ($('#add_item_parts_id').val() == '') return;
249
    if (!ns.check_cv()) return;
250

  
251
    $('#row_table_id thead a img').remove();
252

  
253
    var data = $('#order_form').serializeArray();
254
    data.push({ name: 'action', value: 'Order/add_item' });
255

  
256
    $.post("controller.pl", data, kivi.eval_json_result);
257
  };
258

  
259
  ns.show_multi_items_dialog = function() {
260
    if (!ns.check_cv()) return;
261

  
262
    $('#row_table_id thead a img').remove();
263

  
264
    kivi.popup_dialog({
265
      url: 'controller.pl?action=Order/show_multi_items_dialog',
266
      data: { type: $('#type').val(),
267
              callback: 'Order/add_multi_items',
268
              callback_data_id: 'order_form' },
269
      id: 'jq_multi_items_dialog',
270
      dialog: {
271
        title: kivi.t8('Add multiple items'),
272
        width:  800,
273
        height: 500
274
      }
275
    });
276
    return true;
277
  };
278

  
279
  ns.close_multi_items_dialog = function() {
280
    $('#jq_multi_items_dialog').dialog('close');
281
  };
282

  
283
  ns.delete_order_item_row = function(clicked) {
284
    var row = $(clicked).parents("tbody").first();
285
    $(row).remove();
286

  
287
    ns.renumber_positions();
288
    ns.recalc_amounts_and_taxes();
289
  };
290

  
291
  ns.row_table_scroll_down = function() {
292
    $('#row_table_scroll_id').scrollTop($('#row_table_scroll_id')[0].scrollHeight);
293
  };
294

  
295
  ns.show_longdescription_dialog = function(clicked) {
296
    var row = $(clicked).parents("tbody").first();
297
    var position = $(row).find('[name="position"]').html();
298
    var partnumber = $(row).find('[name="partnumber"]').html();
299
    var description_elt = $(row).find('[name="order.orderitems[].description"]');
300
    var description = description_elt.val();
301
    var longdescription_elt = $(row).find('[name="order.orderitems[].longdescription"]');
302
    var longdescription;
303

  
304
    if (!longdescription_elt.length) {
305
      var data = [];
306
      data.push({ name: 'action', value: 'Order/get_item_longdescription' });
307
      data.push({ name: 'type', value: $('#type').val() });
308
      data.push({ name: 'item_id', value: $(row).find('[name="order.orderitems[+].id"]').val() });
309
      data.push({ name: 'parts_id', value: $(row).find('[name="order.orderitems[].parts_id"]').val() });
310
      $.ajax({
311
        url: 'controller.pl',
312
        data: data,
313
        method: "GET",
314
        async: false,
315
        dataType: 'text',
316
        success: function(val){
317
          longdescription = val;
318
        }
319
      });
320
    } else {
321
      longdescription = longdescription_elt.val();
322
    }
323

  
324
    var params = { runningnumber: position,
325
                   partnumber: partnumber,
326
                   description: description,
327
                   default_longdescription: longdescription,
328
                   set_function: function(val){
329
                     longdescription_elt.remove();
330
                     $('<input type="hidden" name="order.orderitems[].longdescription">').insertAfter(description_elt).val(val);
331
                   }
332
                 };
333

  
334
    kivi.SalesPurchase.edit_longdescription_with_params(params);
335
  };
336

  
337
  ns.price_chooser_item_row = function(clicked) {
338
    var row = $(clicked).parents("tbody").first();
339
    var item_id_dom = $(row).find('[name="orderitem_ids[+]"]');
340

  
341
    var data = $('#order_form').serializeArray();
342
    data.push({ name: 'action', value: 'Order/price_popup' });
343
    data.push({ name: 'item_id', value: item_id_dom.val() });
344

  
345
    $.post("controller.pl", data, kivi.eval_json_result);
346
  };
347

  
348
  ns.update_price_source = function(item_id, source, descr, price_str, price_editable) {
349
    var row = $('#item_' + item_id).parents("tbody").first();
350
    var source_elt = $(row).find('[name="order.orderitems[].active_price_source"]');
351
    var button_elt = $(row).find('[name="price_chooser_button"]');
352

  
353
    button_elt.val(button_elt.val().replace(/.*\|/, descr + " |"));
354
    source_elt.val(source);
355

  
356
    var editable_div_elt = $(row).find('[name="editable_price"]');
357
    var not_editable_div_elt = $(row).find('[name="not_editable_price"]');
358
    if (price_editable == 1 && source == '') {
359
      // editable
360
      $(editable_div_elt).show();
361
      $(not_editable_div_elt).hide();
362
      $(editable_div_elt).find(':input').prop("disabled", false);
363
      $(not_editable_div_elt).find(':input').prop("disabled", true);
364
    } else {
365
      // not editable
366
      $(editable_div_elt).hide();
367
      $(not_editable_div_elt).show();
368
      $(editable_div_elt).find(':input').prop("disabled", true);
369
      $(not_editable_div_elt).find(':input').prop("disabled", false);
370
    }
371

  
372
    if (price_str) {
373
      var price_elt = $(row).find('[name="order.orderitems[].sellprice_as_number"]');
374
      var html_elt  = $(row).find('[name="sellprice_text"]');
375
      price_elt.val(price_str);
376
      html_elt.html(price_str);
377
      ns.recalc_amounts_and_taxes();
378
    }
379

  
380
    kivi.io.close_dialog();
381
  };
382

  
383
  ns.update_discount_source = function(item_id, source, descr, discount_str, price_editable) {
384
    var row = $('#item_' + item_id).parents("tbody").first();
385
    var source_elt = $(row).find('[name="order.orderitems[].active_discount_source"]');
386
    var button_elt = $(row).find('[name="price_chooser_button"]');
387

  
388
    button_elt.val(button_elt.val().replace(/\|.*/, "| " + descr));
389
    source_elt.val(source);
390

  
391
    var editable_div_elt = $(row).find('[name="editable_discount"]');
392
    var not_editable_div_elt = $(row).find('[name="not_editable_discount"]');
393
    if (price_editable == 1 && source == '') {
394
      // editable
395
      $(editable_div_elt).show();
396
      $(not_editable_div_elt).hide();
397
      $(editable_div_elt).find(':input').prop("disabled", false);
398
      $(not_editable_div_elt).find(':input').prop("disabled", true);
399
    } else {
400
      // not editable
401
      $(editable_div_elt).hide();
402
      $(not_editable_div_elt).show();
403
      $(editable_div_elt).find(':input').prop("disabled", true);
404
      $(not_editable_div_elt).find(':input').prop("disabled", false);
405
    }
406

  
407
    if (discount_str) {
408
      var discount_elt = $(row).find('[name="order.orderitems[].discount_as_percent"]');
409
      var html_elt     = $(row).find('[name="discount_text"]');
410
      discount_elt.val(discount_str);
411
      html_elt.html(discount_str);
412
      ns.recalc_amounts_and_taxes();
413
    }
414

  
415
    kivi.io.close_dialog();
416
  };
417

  
418
});
419

  
420
$(function(){
421
  if ($('#type').val() == 'sales_order') {
422
    $('#order_customer_id').change(kivi.Order.reload_cv_dependend_selections);
423
  } else {
424
    $('#order_vendor_id').change(kivi.Order.reload_cv_dependend_selections);
425
  }
426

  
427
  if ($('#type').val() == 'sales_order') {
428
    $('#add_item_parts_id').on('set_item:PartPicker', function(e,o) { $('#add_item_sellprice_as_number').val(kivi.format_amount(o.sellprice, -2)) });
429
  } else {
430
    $('#add_item_parts_id').on('set_item:PartPicker', function(e,o) { $('#add_item_sellprice_as_number').val(kivi.format_amount(o.lastcost, -2)) });
431
  }
432
  $('#add_item_parts_id').on('set_item:PartPicker', function(e,o) { $('#add_item_description').val(o.description) });
433
  $('#add_item_parts_id').on('set_item:PartPicker', function(e,o) { $('#add_item_unit').val(o.unit) });
434

  
435
  $('.add_item_input').keydown(function(event) {
436
    if(event.keyCode == 13) {
437
      event.preventDefault();
438
      kivi.Order.add_item();
439
      return false;
440
    }
441
  });
442

  
443
  kivi.Order.init_row_handlers();
444

  
445
  $('#row_table_id').on('sortstop', function(event, ui) {
446
    $('#row_table_id thead a img').remove();
447
    kivi.Order.renumber_positions();
448
  });
449
});
templates/webpages/order/form.html
7 7
  <form method="post" action="controller.pl" id="print_options_form">
8 8
    [% SELF.print_options %]
9 9
    <br>
10
    [% L.button_tag('print()', LxERP.t8('Print')) %]
10
    [% L.button_tag('kivi.Order.print()', LxERP.t8('Print')) %]
11 11
    <a href="#" onclick="$('#print_options').dialog('close');">[% LxERP.t8("Cancel") %]</a>
12 12
  </form>
13 13
</div>
......
43 43

  
44 44
  [% L.hidden_tag('action', 'Order/dispatch') %]
45 45

  
46
  [% L.button_tag('save()', LxERP.t8('Save')) %]
47
  [% L.button_tag('show_print_options()', LxERP.t8('Print')) %]
48
  [% L.button_tag('email()', LxERP.t8('E-mail')) %]
49
  [% L.button_tag('save_and_delivery_order()', LxERP.t8('Save and Delivery Order')) %]
46
  [% L.button_tag('kivi.Order.save()', LxERP.t8('Save')) %]
47
  [% L.button_tag('kivi.Order.show_print_options()', LxERP.t8('Print')) %]
48
  [% L.button_tag('kivi.Order.email()', LxERP.t8('E-mail')) %]
49
  [% L.button_tag('kivi.Order.save_and_delivery_order()', LxERP.t8('Save and Delivery Order')) %]
50 50
[%- IF SELF.order.id && ( (SELF.cv == 'customer' && INSTANCE_CONF.get_sales_order_show_delete) || (SELF.cv == 'vendor' && INSTANCE_CONF.get_purchase_order_show_delete) ) %]
51
  [% L.button_tag('delete_order()', LxERP.t8('Delete'), confirm=LxERP.t8("Are you sure?")) %]
51
  [% L.button_tag('kivi.Order.delete_order()', LxERP.t8('Delete'), confirm=LxERP.t8("Are you sure?")) %]
52 52
[%- END %]
53 53

  
54 54
</form>
55

  
56

  
57
<script type='text/javascript'>
58

  
59
function delete_order() {
60
  var data = $('#order_form').serializeArray();
61
  data.push({ name: 'action', value: 'Order/delete' });
62

  
63
  $.post("controller.pl", data, kivi.eval_json_result);
64
}
65

  
66
function save() {
67
  if (!check_cv()) return;
68
  var data = $('#order_form').serializeArray();
69
  data.push({ name: 'action', value: 'Order/save' });
70

  
71
  $.post("controller.pl", data, kivi.eval_json_result);
72
}
73

  
74
function show_print_options() {
75
  if (!check_cv()) return;
76

  
77
  kivi.popup_dialog({
78
    id: 'print_options',
79
    dialog: {
80
      title: kivi.t8('Print options'),
81
      width:  800,
82
      height: 300
83
    }
84
  });
85
}
86

  
87
function print() {
88
  $('#print_options').dialog('close');
89

  
90
  var data = $('#order_form').serializeArray();
91
  data = data.concat($('#print_options_form').serializeArray());
92
  data.push({ name: 'action', value: 'Order/print' });
93

  
94
  $.post("controller.pl", data, kivi.eval_json_result);
95
}
96

  
97
function download_pdf(pdf_filename, key) {
98
  var data = [];
99
  data.push({ name: 'action', value: 'Order/download_pdf' });
100
  data.push({ name: 'type', value: $('#type').val() });
101
  data.push({ name: 'pdf_filename', value: pdf_filename });
102
  data.push({ name: 'key', value: key });
103
  $.download("controller.pl", data);
104
}
105

  
106
function email() {
107
  if (!check_cv()) return;
108
  var data = $('#order_form').serializeArray();
109
  data.push({ name: 'action', value: 'Order/show_email_dialog' });
110

  
111
  $.post("controller.pl", data, kivi.eval_json_result);
112
}
113

  
114
function save_and_delivery_order() {
115
  if (!check_cv()) return;
116
  var data = $('#order_form').serializeArray();
117
  data.push({ name: 'action', value: 'Order/save_and_delivery_order' });
118

  
119
  $.post("controller.pl", data, kivi.eval_json_result);
120
}
121

  
122
function check_cv() {
123
  if ($('#order_[%- cv_id %]').val() == '') {
124
    [%- IF SELF.cv == 'customer' %]
125
      alert(kivi.t8('Please select a customer.'));
126
    [%- ELSE %]
127
      alert(kivi.t8('Please select a vendor.'));
128
    [%- END %]
129
    return false;
130
  }
131
  return true;
132
}
133
</script>
templates/webpages/order/tabs/_email_dialog.html
49 49

  
50 50
<br>
51 51
[% L.hidden_tag('action', 'Order/dispatch') %]
52
[% L.button_tag('send_email()', LxERP.t8('Continue')) %]
53
<a href="#" onclick="close_email_dialog();">[%- LxERP.t8("Cancel") %]</a>
54

  
55
<script type='text/javascript'>
56
function send_email() {
57
  var data = $('#order_form').serializeArray();
58
  data = data.concat($('#email_form').serializeArray());
59
  data.push({ name: 'action', value: 'Order/send_email' });
60
  $.post("controller.pl", data, kivi.eval_json_result);
61
}
62
</script>
52
[% L.button_tag('kivi.Order.send_email()', LxERP.t8('Continue')) %]
53
<a href="#" onclick="kivi.Order.close_email_dialog();">[%- LxERP.t8("Cancel") %]</a>
63 54

  
64 55
</form>
templates/webpages/order/tabs/_item_input.html
22 22
        </td>
23 23
        <td>[% L.input_tag('add_item.sellprice_as_number', '', size = 10, class="add_item_input numeric") %]</td>
24 24
        <td>[% L.input_tag('add_item.discount_as_percent', '', size = 5, class="add_item_input numeric") %]</td>
25
        <td>[% L.button_tag('add_item()', LxERP.t8('Add part')) %]</td>
25
        <td>[% L.button_tag('kivi.Order.add_item()', LxERP.t8('Add part')) %]</td>
26 26
      </tr>
27 27
    </tbody>
28 28
  </table>
templates/webpages/order/tabs/_multi_items_dialog.html
19 19
<hr>
20 20

  
21 21
[% L.button_tag('add_multi_items()', LxERP.t8('Continue'), id='continue_button') %]
22
<a href="#" onclick="close_multi_items_dialog();">[%- LxERP.t8("Cancel") %]</a>
22
<a href="#" onclick="kivi.Order.close_multi_items_dialog();">[%- LxERP.t8("Cancel") %]</a>
23 23

  
24 24
<script type='text/javascript'>
25 25
function update_result() {
templates/webpages/order/tabs/_price_sources_dialog.html
4 4
[%- USE LxERP %]
5 5
[% SET best_price = price_source.best_price %]
6 6
[% SET best_discount = price_source.best_discount %]
7
[% SET price_editable = AUTH.assert('edit_prices', 1) %]
7 8
  <h2>[% 'Prices' | $T8 %]</h2>
8 9

  
9 10
  <table>
......
16 17
   </tr>
17 18
   <tr class='listrow'>
18 19
[%- IF price_source.record_item.active_price_source %]
19
    <td>[% L.button_tag('update_price_source(\'' _ FORM.item_id _ '\', \'\', \'' _ LxERP.t8('None (PriceSource)') _ '\')', LxERP.t8('Select')) %]</td>
20
    <td>[% L.button_tag('kivi.Order.update_price_source(\'' _ FORM.item_id _ '\', \'\', \'' _ LxERP.t8('None (PriceSource)') _ '\', \'\', ' _ price_editable _ ')', LxERP.t8('Select')) %]</td>
20 21
[%- ELSE %]
21 22
    <td><b>[% 'Selected' | $T8 %]</b></td>
22 23
[%- END %]
......
28 29
   [%- FOREACH price IN price_source.available_prices %]
29 30
    <tr class='listrow'>
30 31
[%- IF price_source.record_item.active_price_source != price.source %]
31
     <td>[% L.button_tag('update_price_source(\'' _ FORM.item_id _ '\', \'' _ price.source _ '\', \'' _ price.source_description _ '\', \'' _ LxERP.format_amount(price.price, -2) _ '\')', LxERP.t8('Select')) %]</td>
32
     <td>[% L.button_tag('kivi.Order.update_price_source(\'' _ FORM.item_id _ '\', \'' _ price.source _ '\', \'' _ price.source_description _ '\', \'' _ LxERP.format_amount(price.price, -2) _ '\', ' _ price_editable _ ')', LxERP.t8('Select')) %]</td>
32 33
[%- ELSIF price_source.record_item.sellprice * 1 != price.price * 1 %]
33
     <td>[% L.button_tag('update_price_source(\'' _ FORM.item_id _ '\', \'' _ price.source _ '\', \'' _ price.source_description _ '\', \'' _ LxERP.format_amount(price.price, -2) _ '\')', LxERP.t8('Update Price')) %]</td>
34
     <td>[% L.button_tag('kivi.Order.update_price_source(\'' _ FORM.item_id _ '\', \'' _ price.source _ '\', \'' _ price.source_description _ '\', \'' _ LxERP.format_amount(price.price, -2) _ '\', ' _ price_editable _ ')', LxERP.t8('Update Price')) %]</td>
34 35
[%- ELSE %]
35 36
    <td><b>[% 'Selected' | $T8 %]</b></td>
36 37
[% END %]
......
58 59
   </tr>
59 60
   <tr class='listrow'>
60 61
[%- IF price_source.record_item.active_discount_source %]
61
    <td>[% L.button_tag('update_discount_source(\'' _ FORM.item_id _ '\', \'\', \'' _ LxERP.t8('None (PriceSource Discount)') _ '\')', LxERP.t8('Select')) %]</td>
62
    <td>[% L.button_tag('kivi.Order.update_discount_source(\'' _ FORM.item_id _ '\', \'\', \'' _ LxERP.t8('None (PriceSource Discount)') _ '\', \'\', ' _ price_editable _ ')', LxERP.t8('Select')) %]</td>
62 63
[%- ELSE %]
63 64
    <td><b>[% 'Selected' | $T8 %]</b></td>
64 65
[%- END %]
......
70 71
   [%- FOREACH price IN price_source.available_discounts %]
71 72
    <tr class='listrow'>
72 73
[%- IF price_source.record_item.active_discount_source != price.source %]
73
     <td>[% L.button_tag('update_discount_source(\'' _ FORM.item_id _ '\', \'' _ price.source _ '\', \'' _ price.source_description _ '\', \'' _ price.discount_as_percent _ '\')', LxERP.t8('Select')) %]</td>
74
     <td>[% L.button_tag('kivi.Order.update_discount_source(\'' _ FORM.item_id _ '\', \'' _ price.source _ '\', \'' _ price.source_description _ '\', \'' _ price.discount_as_percent _ '\', ' _ price_editable _ ')', LxERP.t8('Select')) %]</td>
74 75
[%- ELSIF price_source.record_item.discount * 1 != price.discount * 1 %]
75
     <td>[% L.button_tag('update_discount_source(\'' _ FORM.item_id _ '\', \'' _ price.source _ '\', \'' _ price.source_description _ '\', \'' _ price.discount_as_percent  _ '\')', LxERP.t8('Update Discount')) %]</td>
76
     <td>[% L.button_tag('kivi.Order.update_discount_source(\'' _ FORM.item_id _ '\', \'' _ price.source _ '\', \'' _ price.source_description _ '\', \'' _ price.discount_as_percent  _ '\', ' _ price_editable _ ')', LxERP.t8('Update Discount')) %]</td>
76 77
[%- ELSE %]
77 78
    <td><b>[% 'Selected' | $T8 %]</b></td>
78 79
[% END %]
templates/webpages/order/tabs/_row.html
20 20
      <img src="image/updown.png" alt="[%- LxERP.t8('reorder item') %]" class="dragdrop">
21 21
    </td>
22 22
    <td align="center">
23
      [%- L.button_tag("delete_order_item_row(this)",
23
      [%- L.button_tag("kivi.Order.delete_order_item_row(this)",
24 24
                       LxERP.t8("X"),
25 25
                       confirm=LxERP.t8("Are you sure?")) %]
26 26
    </td>
......
31 31
      [% L.input_tag("order.orderitems[].description",
32 32
                     ITEM.description,
33 33
                     style='width: 300px') %]
34
      [%- L.button_tag("show_longdescription_dialog(this)", LxERP.t8("L")) %]
34
      [%- L.button_tag("kivi.Order.show_longdescription_dialog(this)", LxERP.t8("L")) %]
35 35
    </td>
36 36
    <td>
37 37
      [%- L.input_tag("order.orderitems[].qty_as_number",
......
56 56
                      class = 'unitselect') %]
57 57
    </td>
58 58
    <td>
59
      [%- L.button_tag("price_chooser_item_row(this)",
59
      [%- L.button_tag("kivi.Order.price_chooser_item_row(this)",
60 60
                       ITEM.active_price_source.source_description _ ' | ' _ ITEM.active_discount_source.source_description,
61 61
                       name = "price_chooser_button") %]
62 62
    </td>
templates/webpages/order/tabs/basic_data.html
145 145

  
146 146
  [%- PROCESS order/tabs/_item_input.html %]
147 147

  
148
  [% L.button_tag('show_multi_items_dialog()', LxERP.t8('Add multiple parts')) %]</td>
148
  [% L.button_tag('kivi.Order.show_multi_items_dialog()', LxERP.t8('Add multiple items')) %]</td>
149 149

  
150 150
  <table width="100%">
151 151
    <tr>
......
159 159
                <th class="listheading" nowrap width="3" >[%- 'position'     | $T8 %] </th>
160 160
                <th class="listheading" style='text-align:center' nowrap width="1"><img src="image/updown.png" alt="[%- LxERP.t8('reorder item') %]"></th>
161 161
                <th class="listheading" style='text-align:center' nowrap width="1"><img src="image/close.png" alt="[%- LxERP.t8('delete item') %]"></th>
162
                <th id="partnumber_header_id"  class="listheading" nowrap width="15"><a href='#' onClick='javascript:reorder_items("partnumber")'> [%- 'Partnumber'  | $T8 %]</a></th>
163
                <th id="description_header_id" class="listheading" nowrap           ><a href='#' onClick='javascript:reorder_items("description")'>[%- 'Description' | $T8 %]</a></th>
164
                <th id="qty_header_id"         class="listheading" nowrap width="5" ><a href='#' onClick='javascript:reorder_items("qty")'>        [%- 'Qty'         | $T8 %]</a></th>
162
                <th id="partnumber_header_id"  class="listheading" nowrap width="15"><a href='#' onClick='javascript:kivi.Order.reorder_items("partnumber")'> [%- 'Partnumber'  | $T8 %]</a></th>
163
                <th id="description_header_id" class="listheading" nowrap           ><a href='#' onClick='javascript:kivi.Order.reorder_items("description")'>[%- 'Description' | $T8 %]</a></th>
164
                <th id="qty_header_id"         class="listheading" nowrap width="5" ><a href='#' onClick='javascript:kivi.Order.reorder_items("qty")'>        [%- 'Qty'         | $T8 %]</a></th>
165 165
                <th class="listheading" nowrap width="5" >[%- 'Price Factor' | $T8 %] </th>
166 166
                <th class="listheading" nowrap width="5" >[%- 'Unit'         | $T8 %] </th>
167 167
                <th class="listheading" nowrap width="5" >[%- 'Price Source' | $T8 %] </th>
168
                <th id="sellprice_header_id"   class="listheading" nowrap width="15" ><a href='#' onClick='javascript:reorder_items("sellprice")'> [%- 'Price'       | $T8 %]</a></th>
169
                <th id="discount_header_id"    class="listheading" nowrap width="15" ><a href='#' onClick='javascript:reorder_items("discount")'>  [%- 'Discount'    | $T8 %]</a></th>
168
                <th id="sellprice_header_id"   class="listheading" nowrap width="15" ><a href='#' onClick='javascript:kivi.Order.reorder_items("sellprice")'> [%- 'Price'       | $T8 %]</a></th>
169
                <th id="discount_header_id"    class="listheading" nowrap width="15" ><a href='#' onClick='javascript:kivi.Order.reorder_items("discount")'>  [%- 'Discount'    | $T8 %]</a></th>
170 170
                <th class="listheading" nowrap width="10">[%- 'Extended'     | $T8 %] </th>
171 171
              </tr>
172 172
            </thead>
......
264 264

  
265 265
</div>
266 266

  
267

  
268 267
[% L.sortable_element('#row_table_id') %]
269

  
270
<script type='text/javascript'>
271
function reload_cv_dependend_selections() {
272
  var data = $('#order_form').serializeArray();
273
  data.push({ name: 'action', value: 'Order/customer_vendor_changed' });
274

  
275
  $.post("controller.pl", data, kivi.eval_json_result);
276
}
277

  
278
function unit_change(event) {
279
  var row = $(event.target).parents("tbody").first();
280
  var item_id_dom = $(row).find('[name="orderitem_ids[+]"]');
281
  var sellprice_dom = $(row).find('[name="order.orderitems[].sellprice_as_number"]');
282
  var select_elt = $(row).find('[name="order.orderitems[].unit"]');
283

  
284
  var oldval = $(select_elt).data('oldval');
285
  $(select_elt).data('oldval', $(select_elt).val());
286

  
287
  var data = $('#order_form').serializeArray();
288
  data.push({ name: 'action', value: 'Order/unit_changed' });
289
  data.push({ name: 'item_id', value: item_id_dom.val() });
290
  data.push({ name: 'old_unit', value: oldval });
291
  data.push({ name: 'sellprice_dom_id', value: sellprice_dom.attr('id') });
292

  
293
  $.post("controller.pl", data, kivi.eval_json_result);
294
}
295

  
296
function update_sellprice(item_id, price_str) {
297
  var row = $('#item_' + item_id).parents("tbody").first();
298
  var price_elt = $(row).find('[name="order.orderitems[].sellprice_as_number"]');
299
  var html_elt  = $(row).find('[name="sellprice_text"]');
300
  price_elt.val(price_str);
301
  html_elt.html(price_str);
302
}
303

  
304
function add_item() {
305
  if ($('#add_item_parts_id').val() == '') return;
306
  if (!check_cv()) return;
307

  
308
  $('#row_table_id thead a img').remove();
309

  
310
  var data = $('#order_form').serializeArray();
311
  data.push({ name: 'action', value: 'Order/add_item' });
312

  
313
  $.post("controller.pl", data, kivi.eval_json_result);
314
}
315

  
316
function show_multi_items_dialog() {
317
  if (!check_cv()) return;
318

  
319
  $('#row_table_id thead a img').remove();
320

  
321
  kivi.popup_dialog({
322
    url: 'controller.pl?action=Order/show_multi_items_dialog',
323
    data: { type: $('#type').val(),
324
            callback: 'Order/add_multi_items',
325
            callback_data_id: 'order_form' },
326
    id: 'jq_multi_items_dialog',
327
    dialog: {
328
      title: kivi.t8('Add multiple items'),
329
      width:  800,
330
      height: 500
331
    }
332
  });
333
  return true;
334
}
335

  
336
function close_multi_items_dialog() {
337
  $('#jq_multi_items_dialog').dialog('close');
338
};
339

  
340
function delete_order_item_row(clicked) {
341
  var row = $(clicked).parents("tbody").first();
342
  $(row).remove();
343

  
344
  renumber_positions();
345
  recalc_amounts_and_taxes();
346
}
347

  
348
function price_chooser_item_row(clicked) {
349
  var row = $(clicked).parents("tbody").first();
350
  var item_id_dom = $(row).find('[name="orderitem_ids[+]"]');
351

  
352
  var data = $('#order_form').serializeArray();
353
  data.push({ name: 'action', value: 'Order/price_popup' });
354
  data.push({ name: 'item_id', value: item_id_dom.val() });
355

  
356
  $.post("controller.pl", data, kivi.eval_json_result);
357
}
358

  
359
function update_price_source(item_id, source, descr, price_str) {
360
  var row = $('#item_' + item_id).parents("tbody").first();
361
  var source_elt = $(row).find('[name="order.orderitems[].active_price_source"]');
362
  var button_elt = $(row).find('[name="price_chooser_button"]');
363

  
364
  button_elt.val(button_elt.val().replace(/.*\|/, descr + " |"));
365
  source_elt.val(source);
366

  
367
  var editable_div_elt = $(row).find('[name="editable_price"]');
368
  var not_editable_div_elt = $(row).find('[name="not_editable_price"]');
369
  if ([%- AUTH.assert('edit_prices', 1) %] == 1 && source == '') {
370
    // editable
371
    $(editable_div_elt).show();
372
    $(not_editable_div_elt).hide();
373
    $(editable_div_elt).find(':input').prop("disabled", false);
374
    $(not_editable_div_elt).find(':input').prop("disabled", true);
375
  } else {
376
    // not editable
377
    $(editable_div_elt).hide();
378
    $(not_editable_div_elt).show();
379
    $(editable_div_elt).find(':input').prop("disabled", true);
380
    $(not_editable_div_elt).find(':input').prop("disabled", false);
381
  }
382

  
383
  if (price_str) {
384
    var price_elt = $(row).find('[name="order.orderitems[].sellprice_as_number"]');
385
    var html_elt  = $(row).find('[name="sellprice_text"]');
386
    price_elt.val(price_str);
387
    html_elt.html(price_str);
388
    recalc_amounts_and_taxes();
389
  }
390

  
391
  kivi.io.close_dialog();
392
}
393

  
394
function update_discount_source(item_id, source, descr, discount_str) {
395
  var row = $('#item_' + item_id).parents("tbody").first();
396
  var source_elt = $(row).find('[name="order.orderitems[].active_discount_source"]');
397
  var button_elt = $(row).find('[name="price_chooser_button"]');
398

  
399
  button_elt.val(button_elt.val().replace(/\|.*/, "| " + descr));
400
  source_elt.val(source);
401

  
402
  var editable_div_elt = $(row).find('[name="editable_discount"]');
403
  var not_editable_div_elt = $(row).find('[name="not_editable_discount"]');
404
  if ([%- AUTH.assert('edit_prices', 1) %] == 1 && source == '') {
405
    // editable
406
    $(editable_div_elt).show();
407
    $(not_editable_div_elt).hide();
408
    $(editable_div_elt).find(':input').prop("disabled", false);
409
    $(not_editable_div_elt).find(':input').prop("disabled", true);
410
  } else {
411
    // not editable
412
    $(editable_div_elt).hide();
413
    $(not_editable_div_elt).show();
414
    $(editable_div_elt).find(':input').prop("disabled", true);
415
    $(not_editable_div_elt).find(':input').prop("disabled", false);
416
  }
417

  
418
  if (discount_str) {
419
    var discount_elt = $(row).find('[name="order.orderitems[].discount_as_percent"]');
420
    var html_elt     = $(row).find('[name="discount_text"]');
421
    discount_elt.val(discount_str);
422
    html_elt.html(discount_str);
423
    recalc_amounts_and_taxes();
424
  }
425

  
426
  kivi.io.close_dialog();
427
}
428

  
429
function reformat_number(event) {
430
  $(event.target).val(kivi.format_amount(kivi.parse_amount($(event.target).val()), -2));
431
}
432

  
433
function recalc_amounts_and_taxes() {
434
  var data = $('#order_form').serializeArray();
435
  data.push({ name: 'action', value: 'Order/recalc_amounts_and_taxes' });
436

  
437
  $.post("controller.pl", data, kivi.eval_json_result);
438
}
439

  
440
function redisplay_linetotals(data) {
441
  $('.row_entry [name="linetotal"]').each(function(idx, elt) {
442
    $(elt).html(data[idx]);
443
  });
444
}
445

  
446
function row_table_scroll_down() {
447
  $('#row_table_scroll_id').scrollTop($('#row_table_scroll_id')[0].scrollHeight);
448
}
449

  
450
var email_dialog;
451

  
452
function show_email_dialog(html) {
453
  var id            = 'jqueryui_popup_dialog';
454
  var dialog_params = {
455
    id:     id,
456
    width:  800,
457
    height: 500,
458
    modal:  true,
459
    close: function(event, ui) {
460
      email_dialog.remove();
461
    },
462
  };
463

  
464
  $('#' + id).remove();
465

  
466
  email_dialog = $('<div style="display:none" id="' + id + '"></div>').appendTo('body');
467
  email_dialog.html(html);
468
  email_dialog.dialog(dialog_params);
469

  
470
  $('.cancel').click(close_email_dialog);
471

  
472
  return true;
473
}
474

  
475
close_email_dialog = function() {
476
  email_dialog.dialog("close");
477
}
478

  
479
function renumber_positions() {
480
  $('.row_entry [name="position"]').each(function(idx, elt) {
481
    $(elt).html(idx+1);
482
  });
483
}
484

  
485
function reorder_items(order_by) {
486
  var dir = $('#' + order_by + '_header_id a img').attr("data-sort-dir");
487
  $('#row_table_id thead a img').remove();
488

  
489
  var src;
490
  if (dir == "1") {
491
    dir = "0";
492
    src = "image/up.png";
493
  } else {
494
    dir = "1";
495
    src = "image/down.png";
496
  };
497

  
498
  $('#' + order_by + '_header_id a').append('<img border=0 data-sort-dir=' + dir + ' src=' + src + ' alt="[%- LxERP.t8('sort items') %]">');
499

  
500
  var data = $('#order_form').serializeArray();
501
  data.push({ name: 'action', value: 'Order/reorder_items' });
502
  data.push({ name: 'order_by', value: order_by });
503
  data.push({ name: 'sort_dir', value: dir });
504

  
505
  $.post("controller.pl", data, kivi.eval_json_result);
506
}
507

  
508
function redisplay_items(data) {
509
  var old_rows = $('.row_entry').detach();
510
  var new_rows = [];
511
  $(data).each(function(idx, elt) {
512
    new_rows.push(old_rows[elt.old_pos - 1]);
513
  });
514
  $(new_rows).appendTo($('#row_table_id'));
515
  renumber_positions();
516
}
517

  
518
function show_longdescription_dialog(clicked) {
519
  var row = $(clicked).parents("tbody").first();
520
  var position = $(row).find('[name="position"]').html();
521
  var partnumber = $(row).find('[name="partnumber"]').html();
522
  var description_elt = $(row).find('[name="order.orderitems[].description"]');
523
  var description = description_elt.val();
524
  var longdescription_elt = $(row).find('[name="order.orderitems[].longdescription"]');
525
  var longdescription;
526

  
527
  if (!longdescription_elt.length) {
528
    var data = [];
529
    data.push({ name: 'action', value: 'Order/get_item_longdescription' });
530
    data.push({ name: 'type', value: $('#type').val() });
531
    data.push({ name: 'item_id', value: $(row).find('[name="order.orderitems[+].id"]').val() });
532
    data.push({ name: 'parts_id', value: $(row).find('[name="order.orderitems[].parts_id"]').val() });
533
    $.ajax({
534
      url: 'controller.pl',
535
      data: data,
536
      method: "GET",
537
      async: false,
538
      dataType: 'text',
539
      success: function(val){
540
        longdescription = val;
541
      }
542
    });
543
  } else {
544
    longdescription = longdescription_elt.val();
545
  }
546

  
547
  var params = { runningnumber: position,
548
                 partnumber: partnumber,
549
                 description: description,
550
                 default_longdescription: longdescription,
551
                 set_function: function(val){
552
                   longdescription_elt.remove();
553
                   $('<input type="hidden" name="order.orderitems[].longdescription">').insertAfter(description_elt).val(val);
554
                 }
555
               };
556

  
557
  kivi.SalesPurchase.edit_longdescription_with_params(params);
558
}
559

  
560
function init_row_handlers() {
561
  kivi.run_once_for('.recalc', 'on_change_recalc', function(elt) {
562
    $(elt).change(recalc_amounts_and_taxes);
563
  });
564

  
565
  kivi.run_once_for('.reformat_number', 'on_change_reformat', function(elt) {
566
    $(elt).change(reformat_number);
567
  });
568

  
569
  kivi.run_once_for('.unitselect', 'on_change_unit_with_oldval', function(elt) {
570
    $(elt).data('oldval', $(elt).val());
571
    $(elt).change(unit_change);
572
  });
573

  
574
  kivi.run_once_for('.row_entry', 'on_kbd_click_show_hide', function(elt) {
575
    $(elt).keydown(function(event) {
576
      if(event.keyCode == 40 && event.shiftKey == true) {
577
        // shift arrow down
578
        event.preventDefault();
579
        var row = $(event.target).parents(".row_entry").first();
580
        $(row).children().not(':first').show();
581
        return false;
582
      }
583
      if(event.keyCode == 38 && event.shiftKey == true) {
584
        // shift arrow up
585
        event.preventDefault();
586
        var row = $(event.target).parents(".row_entry").first();
587
        $(row).children().not(':first').hide();
588
        return false;
589
      }
590
    });
591
    $(elt).dblclick(function(event) {
592
      event.preventDefault();
593
      var row = $(event.target).parents(".row_entry").first();
594
      $(row).children().not(':first').toggle();
595
      return false;
596
    });
597
  });
598
}
599

  
600

  
601
$(function(){
602
  $('#order_[%- cv_id %]').change(reload_cv_dependend_selections);
603
  [%- IF SELF.cv == 'customer' %]
604
    $('#add_item_parts_id').on('set_item:PartPicker', function(e,o) { $('#add_item_sellprice_as_number').val(kivi.format_amount(o.sellprice, -2)) });
605
  [%- ELSE %]
606
    $('#add_item_parts_id').on('set_item:PartPicker', function(e,o) { $('#add_item_sellprice_as_number').val(kivi.format_amount(o.lastcost, -2)) });
607
  [%- END %]
608
  $('#add_item_parts_id').on('set_item:PartPicker', function(e,o) { $('#add_item_description').val(o.description) });
609
  $('#add_item_parts_id').on('set_item:PartPicker', function(e,o) { $('#add_item_unit').val(o.unit) });
610
  $('.add_item_input').keydown(function(event) {
611
    if(event.keyCode == 13) {
612
      event.preventDefault();
613
      add_item();
614
      return false;
615
    }
616
  });
617
  init_row_handlers();
618
});
619

  
620
$('#row_table_id').on('sortstop', function(event, ui) {
621
  $('#row_table_id thead a img').remove();
622
  renumber_positions();
623
});
624
</script>

Auch abrufbar als: Unified diff