From 3dc3b056259f35b6fcf6656da6a652c024fee3b5 Mon Sep 17 00:00:00 2001 From: Moritz Bunkus Date: Thu, 7 Mar 2013 13:09:51 +0100 Subject: [PATCH] =?utf8?q?ActsAsList:=20add=5Fto=5Flist()=20auch=20aufrufe?= =?utf8?q?n=20k=C3=B6nnen,=20wenn=20'position'=20noch=20gesetzt=20ist?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- SL/DB/Helper/ActsAsList.pm | 9 ++++++++- t/db_helper/acts_as_list.t | 6 +++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/SL/DB/Helper/ActsAsList.pm b/SL/DB/Helper/ActsAsList.pm index 49f39a9bc..8f3333ef4 100644 --- a/SL/DB/Helper/ActsAsList.pm +++ b/SL/DB/Helper/ActsAsList.pm @@ -65,6 +65,10 @@ sub add_to_list { croak "Invalid parameter 'position'" unless ($params{position} || '') =~ m/^ (?: before | after | first | last ) $/x; + my $column = column_name($self); + + $self->remove_from_list if ($self->$column // -1) != -1; + if ($params{position} eq 'last') { set_position($self); $self->save; @@ -73,7 +77,6 @@ sub add_to_list { my $table = $self->meta->table; my $primary_key_col = ($self->meta->primary_key)[0]; - my $column = column_name($self); my ($group_by, @values) = get_group_by_where($self); $group_by = " AND ${group_by}" if $group_by; my $new_position; @@ -409,6 +412,10 @@ one. The current item will then be inserted either before or after the referenced item by shifting all the appropriate item positions up by one. +If C<$self>'s positional column is already set when this function is +called then L will be called first before anything +else is done. + After this function C<$self>'s positional column has been set and saved to the database. diff --git a/t/db_helper/acts_as_list.t b/t/db_helper/acts_as_list.t index 0d47bb253..2e7b70864 100644 --- a/t/db_helper/acts_as_list.t +++ b/t/db_helper/acts_as_list.t @@ -1,4 +1,4 @@ -use Test::More tests => 50; +use Test::More tests => 51; use Test::Exception; use strict; @@ -206,6 +206,10 @@ reset_state(); $item = get_item(8); $item->remove_from_list; $item->parent_id(3); $item->add_to_list(position => 'first'); test_positions "add_to_list position 'first' in empty", [ 1, undef, 1 ], [ 2, undef, 2 ], [ 3, 1, 1 ], [ 4, 1, 2 ], [ 5, 1, 3 ], [ 6, 4, 1 ], [ 7, 4, 2 ], [ 8, 3, 1 ]; +reset_state(); +$item = get_item(5); $item->add_to_list(position => 'after', reference => 3); +test_positions "add_to_list without prior remove_from_list", [ 1, undef, 1 ], [ 2, undef, 2 ], [ 3, 1, 1 ], [ 5, 1, 2 ], [ 4, 1, 3 ], [ 6, 4, 1 ], [ 7, 4, 2 ], [ 8, 2, 1 ]; + reset_state(); $item = get_item(4); is($item->get_next_in_list->id, 5, 'Next of 4 is 5'); -- 2.20.1