Проблема в том, что ваше цепное использование next()
и prev()
нацелено на неправильные строки - оно идет в середину целевой группы, а не до или после нее.
Вы можете это исправить и упростить логи c, комбинируя обработчики событий, которые перемещают содержимое и изменяют свое поведение на основе некоторых атрибутов данных. Попробуйте это:
jQuery(function($) {
$(document).on('click', '.order-change', function() {
$('.expandable-row').hide();
var $trigger = $(this)
var $row = $trigger.closest('tr');
var $infoRow = $row.next('tr');
if ($trigger.data('dir') === 'up') {
$row.add($infoRow).insertBefore($row.prev());
} else {
$row.add($infoRow).insertAfter($infoRow.next());
}
});
});
td {
border: 1px solid black;
text-align: center;
}
td div {
cursor: pointer;
}
.expandable-row {
display: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table>
<tbody>
<tr class="project-row" data-project-id="0">
<td>
<div class="order-change" data-dir="up">up</div>
<div class="order-change" data-dir="down">down</div>
</td>
<td>Project 1</td>
</tr>
<tr class="expandable-row" data-project-id="0">
<td>Project 1 info</td>
</tr>
<tr class="project-row" data-project-id="1">
<td>
<div class="order-change" data-dir="up">up</div>
<div class="order-change" data-dir="down">down</div>
</td>
<td>Project 2</td>
</tr>
<tr class="expandable-row" data-project-id="1">
<td>Project 2 info</td>
</tr>
<tr class="project-row" data-project-id="2">
<td>
<div class="order-change" data-dir="up">up</div>
<div class="order-change" data-dir="down">down</div>
</td>
<td>Project 3</td>
</tr>
<tr class="expandable-row" data-project-id="2">
<td>Project 3 info</td>
</tr>
</tbody>
</table>