Revision 28a7a539
Von Bernd Bleßmann vor etwa 8 Jahren hinzugefügt
SL/Controller/Order.pm | ||
---|---|---|
594 | 594 |
$_[0]->render(\ $longdescription, { type => 'text' }); |
595 | 595 |
} |
596 | 596 |
|
597 |
# load the second row for an item (cvars only for now) |
|
598 |
# |
|
599 |
# This action gets the html code for the items second row by rendering a template for |
|
600 |
# the second row and calls a javascript function with this html code via client js. |
|
601 |
sub action_load_second_row { |
|
602 |
my ($self) = @_; |
|
603 |
|
|
604 |
my $idx = first_index { $_ eq $::form->{item_id} } @{ $::form->{orderitem_ids} }; |
|
605 |
my $item = $self->order->items_sorted->[$idx]; |
|
606 |
|
|
607 |
# Parse values from form (they are formated while rendering (template)). |
|
608 |
# Workaround to pre-parse number-cvars (parse_custom_variable_values does not parse number values). |
|
609 |
# This parsing is not necessary at all, if we assure that the second row/cvars are only loaded once. |
|
610 |
#foreach my $var (@{ $item->cvars_by_config }) { |
|
611 |
# $var->unparsed_value($::form->parse_amount(\%::myconfig, $var->{__unparsed_value})) if ($var->config->type eq 'number' && exists($var->{__unparsed_value})); |
|
612 |
#} |
|
613 |
#$item->parse_custom_variable_values; |
|
614 |
|
|
615 |
my $row_as_html = $self->p->render('order/tabs/_second_row', ITEM => $item); |
|
616 |
|
|
617 |
$self->js |
|
618 |
->html('.row_entry:has(#item_' . $::form->{item_id} . ') [name = "second_row"]', $row_as_html) |
|
619 |
->data('.row_entry:has(#item_' . $::form->{item_id} . ') [name = "second_row"]', 'loaded', 1) |
|
620 |
->render(); |
|
621 |
} |
|
622 |
|
|
597 | 623 |
sub _js_redisplay_linetotals { |
598 | 624 |
my ($self) = @_; |
599 | 625 |
|
... | ... | |
1289 | 1315 |
C<show_multi_items_dialog> does not use the currently inserted string for |
1290 | 1316 |
filtering. |
1291 | 1317 |
|
1292 |
=item * Performance |
|
1293 |
|
|
1294 |
Rendering a 50 items order takes twice as long as the old code. |
|
1295 |
|
|
1296 |
90% of that is rendering the (hidden) second rows, and 50% of those again are |
|
1297 |
checks for is_valid and C<INCLUDE> on the cvar input template. |
|
1298 |
|
|
1299 |
Suggestion: fetch second rows when asked for. |
|
1300 |
|
|
1301 | 1318 |
=back |
1302 | 1319 |
|
1303 | 1320 |
=head1 AUTHOR |
js/kivi.Order.js | ||
---|---|---|
182 | 182 |
html_elt.html(price_str); |
183 | 183 |
}; |
184 | 184 |
|
185 |
ns.load_second_row = function(row) { |
|
186 |
var item_id_dom = $(row).find('[name="orderitem_ids[+]"]'); |
|
187 |
var div_elt = $(row).find('[name="second_row"]'); |
|
188 |
|
|
189 |
if ($(div_elt).data('loaded') == 1) { |
|
190 |
return; |
|
191 |
} |
|
192 |
var data = $('#order_form').serializeArray(); |
|
193 |
data.push({ name: 'action', value: 'Order/load_second_row' }); |
|
194 |
data.push({ name: 'item_id', value: item_id_dom.val() }); |
|
195 |
|
|
196 |
$.post("controller.pl", data, kivi.eval_json_result); |
|
197 |
}; |
|
198 |
|
|
199 |
|
|
185 | 200 |
ns.init_row_handlers = function() { |
186 | 201 |
kivi.run_once_for('.recalc', 'on_change_recalc', function(elt) { |
187 | 202 |
$(elt).change(ns.recalc_amounts_and_taxes); |
... | ... | |
198 | 213 |
|
199 | 214 |
kivi.run_once_for('.row_entry', 'on_kbd_click_show_hide', function(elt) { |
200 | 215 |
$(elt).keydown(function(event) { |
201 |
var row; |
|
202 | 216 |
if(event.keyCode == 40 && event.shiftKey === true) { |
203 | 217 |
// shift arrow down |
204 | 218 |
event.preventDefault(); |
205 |
row = $(event.target).parents(".row_entry").first(); |
|
219 |
var row = $(event.target).parents(".row_entry").first(); |
|
220 |
ns.load_second_row(row); |
|
206 | 221 |
$(row).children().not(':first').show(); |
207 | 222 |
return false; |
208 | 223 |
} |
209 | 224 |
if(event.keyCode == 38 && event.shiftKey === true) { |
210 | 225 |
// shift arrow up |
211 | 226 |
event.preventDefault(); |
212 |
row = $(event.target).parents(".row_entry").first(); |
|
227 |
var row = $(event.target).parents(".row_entry").first();
|
|
213 | 228 |
$(row).children().not(':first').hide(); |
214 | 229 |
return false; |
215 | 230 |
} |
... | ... | |
217 | 232 |
$(elt).dblclick(function(event) { |
218 | 233 |
event.preventDefault(); |
219 | 234 |
var row = $(event.target).parents(".row_entry").first(); |
235 |
ns.load_second_row(row); |
|
220 | 236 |
$(row).children().not(':first').toggle(); |
221 | 237 |
return false; |
222 | 238 |
}); |
templates/webpages/order/tabs/_row.html | ||
---|---|---|
102 | 102 |
|
103 | 103 |
<tr class="listrow1" style="display:none"> |
104 | 104 |
<td colspan="100%"> |
105 |
<table> |
|
106 |
<tr class="listrow1"> |
|
107 |
[%- SET n = 0 %] |
|
108 |
[%- FOREACH var = ITEM.cvars_by_config %] |
|
109 |
[%- NEXT UNLESS (var.config.processed_flags.editable && ITEM.part.cvar_by_name(var.config.name).is_valid) %] |
|
110 |
[%- SET n = n + 1 %] |
|
111 |
<th> |
|
112 |
[% var.config.description %] |
|
113 |
</th> |
|
114 |
<td> |
|
115 |
[% L.hidden_tag('order.orderitems[].custom_variables[+].config_id', var.config.id) %] |
|
116 |
[% L.hidden_tag('order.orderitems[].custom_variables[].id', var.id) %] |
|
117 |
[% L.hidden_tag('order.orderitems[].custom_variables[].sub_module', var.sub_module) %] |
|
118 |
[% INCLUDE 'common/render_cvar_input.html' var_name='order.orderitems[].custom_variables[].unparsed_value' %] |
|
119 |
</td> |
|
120 |
[%- IF (n % (MYCONFIG.form_cvars_nr_cols || 3)) == 0 %] |
|
121 |
</tr><tr class="listrow1"> |
|
122 |
[%- END %] |
|
123 |
[%- END %] |
|
124 |
</tr> |
|
125 |
</table> |
|
105 |
<div name="second_row"> |
|
106 |
[%- LxERP.t8("Loading...") %] |
|
107 |
</div> |
|
126 | 108 |
</td> |
127 | 109 |
</tr> |
128 | 110 |
|
templates/webpages/order/tabs/_second_row.html | ||
---|---|---|
1 |
[%- USE T8 %] |
|
2 |
[%- USE HTML %] |
|
3 |
[%- USE LxERP %] |
|
4 |
[%- USE L %] |
|
5 |
|
|
6 |
<table> |
|
7 |
<tr class="listrow1"> |
|
8 |
[%- SET n = 0 %] |
|
9 |
[%- FOREACH var = ITEM.cvars_by_config %] |
|
10 |
[%- NEXT UNLESS (var.config.processed_flags.editable && ITEM.part.cvar_by_name(var.config.name).is_valid) %] |
|
11 |
[%- SET n = n + 1 %] |
|
12 |
<th> |
|
13 |
[% var.config.description %] |
|
14 |
</th> |
|
15 |
<td> |
|
16 |
[% L.hidden_tag('order.orderitems[].custom_variables[+].config_id', var.config.id) %] |
|
17 |
[% L.hidden_tag('order.orderitems[].custom_variables[].id', var.id) %] |
|
18 |
[% L.hidden_tag('order.orderitems[].custom_variables[].sub_module', var.sub_module) %] |
|
19 |
[% INCLUDE 'common/render_cvar_input.html' var_name='order.orderitems[].custom_variables[].unparsed_value' %] |
|
20 |
</td> |
|
21 |
[%- IF (n % (MYCONFIG.form_cvars_nr_cols || 3)) == 0 %] |
|
22 |
</tr><tr class="listrow1"> |
|
23 |
[%- END %] |
|
24 |
[%- END %] |
|
25 |
</tr> |
|
26 |
</table> |
Auch abrufbar als: Unified diff
Auftrags-Controller: zweite Zeile (im Moment Cvars) nur bei Bedarf laden.