<%def .list_reorder> <%init> #require Storable; my $sql = qq[SELECT ss_soc, ss_div, ss_order FROM bladberi.pb_ordered_list WHERE pb_id = ? AND quarter_id = ? ORDER BY ss_order]; my $cur_soclist = $dbh->selectall_arrayref($sql, {}, $user_id, $quarter_id); #my $was_soclist = Storable::dclone($cur_soclist); my @newlist; my $slot; $slot = $ARGS{inp_slot} if ($ARGS{inp_slot}); if (defined($ARGS{inp_slot})) { # boundary check 1. return "" if ($slot <= 0); # boundary check 2. return "" if ($slot >= @$cur_soclist); } my $in_array = sub { my $needle = shift; my @haystack = @_; foreach my $straw (@haystack) { return 1 if ($needle eq $straw); } return 0; }; # abstract ašferš: # 1. finna śt hvaša order range viš erum aš vinna meš. # 2. finna hįpunkt og lįgpunkt # 3. finna SOC fyrir gildiš sem upptekur [hįpunkt/lįgpunkt][+/-]1 # 4. constructa nżjan lista žar sem SOC fyrir hįpunkt+1 er stillt meš order lįggildis # 5. incrementa order į öllu range sem į aš breyta # 1. my ($highv,$lowv,$highk,$lowk,$n); $n = 0; foreach my $row (@$cur_soclist) { foreach my $newsoc (@$soclist) { if ($newsoc eq $row->[0]) { unless ($row->[2] <= $highv) { $highv = $row->[2]; $highk = $n; } unless ($row->[2] >= $lowv && $lowv) { $lowv = $row->[2]; $lowk = $n; } } } $newlist[$n] = $row; $n++; } # boundary check 3. return "" if ($highk >= (@$cur_soclist - 1) && $direction eq 'down'); # boundary check 4. return "" if ($lowk <= 1 && $direction eq 'up'); #print "high=$highv (slot:$highk)\n"; #print "low=$lowv (slot:$lowk)\n"; #print "highsoc = " . $newlist[$highk]->[0] . " (order: $lowv)\n"; #print "lowsoc = " . $newlist[$lowk]->[0] . " (order: $highv)\n"; if ($direction eq 'up') { foreach my $row (@newlist) { if ($row->[2] >= $lowv && $row->[2] <= $highv) { # print "working on element: " . $row->[0] . "\n"; $row->[2] -= 1; } } $newlist[$lowk-1]->[2] = $highv; } elsif ($direction eq 'down') { foreach my $row (@newlist) { if ($row->[2] >= $lowv && $row->[2] <= $highv) { # print "working on element: " . $row->[0] . "\n"; $row->[2] += 1; } } $newlist[$highk+1]->[2] = $lowv; } elsif ($direction eq 'slot') { my @targetslots; # print "soclist=" . join(',', @$soclist) . "
\n"; foreach my $row (@$cur_soclist) { # print "working on row:" . $row->[0] . " slot:" . $row->[2] . "
\n"; if ($in_array->($row->[0], @$soclist)) { push(@targetslots, $row->[2]+($slot-$lowv)); # print "added " . $targetslots[@targetslots-1] . " to \@targetslots
\n"; } } @newlist = (); my $j = 1; foreach my $row (@$cur_soclist) { if ($in_array->($row->[0], @$soclist)) { $row->[2] += ($slot-$lowv); push(@newlist, $row); next; } while ($in_array->($j, @targetslots)) { $j++; } $row->[2] = $j++; push(@newlist, $row); } } foreach my $row (@newlist) { # my $was; next if !$row->[0]; $dbh->do("UPDATE bladberi.pb_ordered_list SET ss_order = ? WHERE ss_soc = ? AND ss_div = ? AND pb_id = ? AND quarter_id = ?", {}, $row->[2], $row->[0], $row->[1], $user_id, $quarter_id); }