Revision 843

Date:
2022/11/01 13:57:31
Author:
ahitrov
Revision Log:
Section multi-item drag-n-drop move

Files:

Legend:

 
Added
 
Removed
 
Modified
  • utf8/core/comps/contenido/ajax/document_move.html

     
    15 15 <%init>
    16 16
    17 17 my %result;
    18 warn Dumper(\%ARGS);
    18 19
    19 if ( $id && $id =~ /^\d+$/ && $s && $s =~ /^\d+$/ && $move && $move =~ /^(up|down|first|last|before|after)$/ && (!$aid || $aid && $aid =~ /^\d+$/) ) {
    20 my $section = $keeper->get_section_by_id( $s );
    21 if ( ref $section ) {
    22 if ( $section->_sorted ) {
    23 if ( $section->dmove( $id, $move, $aid ) ) {
    24 my $position = $section->_get_document_pos( $id );
    25 warn Dumper( $position );
    26 if ( ref $position && exists $position->{index} ) {
    27 if ( exists $position->{before} ) {
    28 $result{before} = $position->{before};
    29 $result{success} = 1;
    30 }
    31 if ( exists $position->{after} ) {
    32 $result{after} = $position->{after};
    33 $result{success} = 1;
    34 }
    35 if ( exists $position->{first} ) {
    36 $result{first} = 1;
    37 $result{success} = 1;
    38 }
    39 if ( exists $position->{last} ) {
    40 $result{last} = 1;
    41 $result{success} = 1;
    42 }
    43 unless ( exists $result{success} ) {
    20 if ( $id && $s && $s =~ /^\d+$/ && $move && $move =~ /^(up|down|first|last|before|after)$/ && (!$aid || $aid && $aid =~ /^\d+$/) ) {
    21 my $check_id = 1;
    22 my @ids;
    23 if ( ref $id eq 'ARRAY' ) {
    24 foreach my $data ( @$id ) {
    25 if ( $data =~ /^\d+$/ ) {
    26 push @ids, $data;
    27 } else {
    28 $check_id = 0;
    29 last;
    30 }
    31 }
    32 } elsif ( $id =~ /^[\d,]+$/ ) {
    33 @ids = split(/,/, $id);
    34 } else {
    35 $check_id = 0;
    36 }
    37 if ( $check_id ) {
    38 my $section = $keeper->get_section_by_id( $s );
    39 if ( ref $section ) {
    40 if ( $section->_sorted ) {
    41 if ( $section->dmove( \@ids, $move, $aid ) ) {
    42 my $position = $section->_get_document_pos( $ids[0] );
    43 warn Dumper( $position );
    44 if ( ref $position && exists $position->{index} ) {
    45 if ( exists $position->{before} ) {
    46 $result{before} = $position->{before};
    47 $result{success} = 1;
    48 }
    49 if ( exists $position->{after} ) {
    50 $result{after} = $position->{after};
    51 $result{success} = 1;
    52 }
    53 if ( exists $position->{first} ) {
    54 $result{first} = 1;
    55 $result{success} = 1;
    56 }
    57 if ( exists $position->{last} ) {
    58 $result{last} = 1;
    59 $result{success} = 1;
    60 }
    61 unless ( exists $result{success} ) {
    62 $result{error} = Encode::decode('utf-8', 'Ошибка индексации. Для разбора полетов обратитесь к разработчикам');
    63 }
    64 } else {
    44 65 $result{error} = Encode::decode('utf-8', 'Ошибка индексации. Для разбора полетов обратитесь к разработчикам');
    45 66 }
    46 67 } else {
    47 $result{error} = Encode::decode('utf-8', 'Ошибка индексации. Для разбора полетов обратитесь к разработчикам');
    68 $result{error} = Encode::decode('utf-8', 'Ошибка перемещения. Для разбора полетов обратитесь к разработчикам');
    48 69 }
    49 70 } else {
    50 $result{error} = Encode::decode('utf-8', 'Ошибка перемещения. Для разбора полетов обратитесь к разработчикам');
    71 $result{error} = Encode::decode('utf-8', 'В данной секции отключен режим ручной сортировки');
    51 72 }
    52 73 } else {
    53 $result{error} = Encode::decode('utf-8', 'В данной секции отключен режим ручной сортировки');
    74 $result{error} = Encode::decode('utf-8', 'Секция не найдена');
    54 75 }
    55 76 } else {
    56 $result{error} = Encode::decode('utf-8', 'Секция не найдена');
    77 $result{error} = Encode::decode('utf-8', 'Переданы неверные параметры');
    57 78 }
    58 79 } else {
    59 80 $result{error} = Encode::decode('utf-8', 'Переданы неверные параметры');
  • utf8/core/comps/contenido/components/section_browse.msn

     
    240 240 if ( sourceID == targetID ) {
    241 241 return;
    242 242 }
    243 var checkedIds = [];
    244 $('tr.data-row').each(function(index){
    245 $checkInput = $(this).find('.common-check');
    246 if ( $(this).data('id') == sourceID ) {
    247 checkedIds.push($(this).data('id'));
    248 $checkInput.prop('checked', true);
    249 } else if ( $checkInput.prop('checked') ) {
    250 checkedIds.push($(this).data('id'));
    251 }
    252 });
    253 if ( sourceID != checkedIds[0] ) {
    254 $source = $('#row-' + checkedIds[0]);
    255 }
    243 256 $.ajax({
    244 257 'url' : '/contenido/ajax/document_move.html',
    245 'data' : { 's' : <% ref $section ? $section->id : 0 %>, 'id' : sourceID, 'move' : 'after', 'aid' : targetID },
    258 'data' : { 's' : <% ref $section ? $section->id : 0 %>, 'id' : checkedIds.join(','), 'move' : 'after', 'aid' : targetID },
    246 259 'dataType' : 'json',
    247 260 'success' : function( data ){
    248 261 if ( data.error ) {
    249 262 alert( data.error );
    250 263 } else if ( data.after ) {
    251 $source.detach().insertAfter($target);
    264 checkedIds.forEach(function(rowID, index, ids) {
    265 $source = $('#row-' + rowID);
    266 $source.detach().insertAfter($target);
    267 $source.find('.common-check').attr('checked', false);
    268 $target = $source;
    269 });
    252 270 console.log('Moved after ' + data.after);
    253 271 }
    254 272 }
  • utf8/core/lib/Contenido/Section.pm

     
    356 356 do { $log->warning("Вызов метода ->dmove() без указания идентификатора секции"); return undef }
    357 357 unless (exists($self->{id}) && ($self->{id} > 0));
    358 358
    359 my @doc_ids = ref $doc_id eq 'ARRAY' ? @$doc_id : ($doc_id);
    360 return undef unless @doc_ids;
    361 my %doc_ids = map { $_ => 1 } @doc_ids;
    359 362 $direction = lc($direction);
    360 363 unless ( $direction eq 'up' || $direction eq 'down' || $direction eq 'first' || $direction eq 'last' || $direction eq 'before' || $direction eq 'after' ) {
    361 364 $log->warning("Направление перемещения документа задано неверно"); return undef
     
    371 374 my $order = $self->_get_document_order;
    372 375 my @new_order;
    373 376 if ( $direction eq 'first' ) {
    374 push @new_order, $doc_id;
    377 push @new_order, @doc_ids;
    375 378 }
    376 379 for ( my $i = 0; $i < scalar @$order; $i++ ) {
    377 if ( ($direction eq 'first' || $direction eq 'last' || $direction eq 'after' || $direction eq 'before') && $order->[$i] == $doc_id ) {
    380 if ( ($direction eq 'first' || $direction eq 'last' || $direction eq 'after' || $direction eq 'before') && exists $doc_ids{$order->[$i]} ) {
    378 381 next;
    379 } elsif ( $direction eq 'up' && $order->[$i] == $doc_id ) {
    382 } elsif ( $direction eq 'up' && $order->[$i] == $doc_ids[0] ) {
    380 383 if ( $i ) {
    381 384 my $id = pop @new_order;
    382 push @new_order, ($doc_id, $id);
    385 push @new_order, (@doc_ids, $id);
    383 386 } else {
    384 push @new_order, $doc_id;
    387 push @new_order, @doc_ids;
    385 388 }
    386 } elsif ( $direction eq 'down' && $order->[$i] == $doc_id ) {
    389 } elsif ( $direction eq 'down' && $order->[$i] == $doc_ids[-1] ) {
    387 390 if ( $i < scalar(@$order) - 1 ) {
    388 push @new_order, ($order->[++$i], $doc_id);
    391 push @new_order, ($order->[++$i], @doc_ids);
    389 392 } else {
    390 push @new_order, $doc_id;
    393 push @new_order, @doc_ids;
    391 394 }
    392 395 } elsif ( $direction eq 'before' && $order->[$i] == $anchor ) {
    393 push @new_order, ($doc_id, $order->[$i]);
    396 push @new_order, (@doc_ids, $order->[$i]);
    394 397 $anchor_flag = 0;
    395 398 } elsif ( $direction eq 'after' && $order->[$i] == $anchor ) {
    396 push @new_order, ($order->[$i], $doc_id);
    399 push @new_order, ($order->[$i], @doc_ids);
    397 400 $anchor_flag = 0;
    398 } else {
    401 } elsif ( !exists $doc_ids{$order->[$i]} ) {
    399 402 push @new_order, $order->[$i];
    400 403 }
    401 404 }
     
    403 406 $log->warning("Неверный вызов функции dmove для направления '$direction'. Не найден якорь [$anchor]"); return undef;
    404 407 }
    405 408 if ( $direction eq 'last' ) {
    406 push @new_order, $doc_id;
    409 push @new_order, @doc_ids;
    407 410 }
    408 411
    409 412 $self->{_sorted_order} = join ',', @new_order;