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;
Небольшая справка по веткам
cnddist – контейнер, в котором хранятся все дистрибутивы всех библиотек и программных пакетов, которые использовались при построении различных версий Contenido. Если какой-то библиотеки в данном хранилище нет, инсталлятор сделает попытку "подтянуть" ее с веба (например, с CPAN). Если библиотека слишком старая, есть очень большая вероятность, что ее там уже нет. Поэтому мы храним весь хлам от всех сборок. Если какой-то дистрибутив вдруг отсутствует в cnddist - напишите нам, мы положим его туда.
koi8 – отмирающая ветка, чей код, выдача и все внутренние библиотеки заточены на кодировку KOI8-R. Вносятся только те дополнения, которые касаются внешнего вида и функционала админки, баги ядра, обязательные обновления портов и мелочи, которые легко скопипастить. В дальнейшем планируется полная остановка поддержки по данной ветке.
utf8 – актуальная ветка, заточенная под UTF-8.
Внутри каждой ветки: core – исходники ядра; install – скрипт установки инсталляции; plugins – плагины; samples – "готовые к употреблению" проекты, которые можно поставить, запустить и посмотреть, как они работают.