Вход

Просмотр полной версии : Pagination + sortable list


Nexus
25.04.2018, 16:55
Здравствуйте.

Как правильно реализовать сортировку списка перетаскиванием элементов с учетом того, что список выводится постранично?

Элементам списка собираюсь добавить свойство int _index, по которому сортировка и будет осуществляться.
С сортировкой данных в пределах одной страницы никаких проблем нет, но как реализовать её с учетом пагинации - не знаю.

Пока что думаю отслеживать позицию перетаскиваемого элемента и подгружать следующую/предыдущую страницу списка и скрывать "старые" страницы, чтобы не насиловать клиент.
Реализация кажется довольно геморойной.

Есть ли более простые решения?
(отказ от пагинации - не вариант, т.к. элементом может быть ну очень много).

laimas
25.04.2018, 17:06
А как понять "с учетом постранчиной навигации"? Перетаскивание в пределах то какой либо страницы, и без всего списка, в пределах его всего отсортировать не получится. Постраничный вывод уже подразумевает сортировку по какому либо параметру.

Nexus
25.04.2018, 17:08
Перетаскивание в пределах то какой либо страницы, и без всего списка, в пределах его всего отсортировать не получится.
Вот именно отсортировать в пределах всего списка и нужно.

laimas
25.04.2018, 17:19
Вот именно отсортировать в пределах всего списка и нужно.


Ну не имея его как, а тем более перетаскиванием? Пусть это к примеру будет пользовательская сортировка по значению от 0 до макс. Если знаем макс. значение и руками вводим нужную позицию текущему элементу, то даже в этом случае, как ни крути, визуально будем видеть только представление части всего списка, все остальное в уме. :)

рони
25.04.2018, 17:25
Nexus,

:write: согласен с laimas, либо задача невыполнима, либо вы что-то не договариваите.

Nexus
25.04.2018, 17:28
laimas, в шапке в 4-м абзаце описал предполагаемый способ решения задачи.
Если подгружать недостающие элементы на пути drag'а, то задача вполне себе решаемая.

Nexus
25.04.2018, 17:30
рони, что невыполнимого я описал в 4-м абзаце в шапке?)

рони
25.04.2018, 17:36
Nexus,
мне сложно представить перетаскивание элемента со страницы на страницу.(не хочу вам мешать)

Nexus
25.04.2018, 17:45
рони, вы мне не мешаете.
Если бы я желал, чтобы мне не "мешали", то не создал бы эту тему)

Попытаюсь визуализировать описанное в шапке.
Есть условный список:
List
Page-1
Elem-0
Elem-1
Elem-2
Elem-3
Elem-4
Page-2
Elem-5
Elem-6
Elem-7
Elem-8
Elem-9Находясь на странице 2 я желаю "элемент 8" перенести на позицию "элемента 2". Элементов со страницы 1 я не вижу, т.к. текущая страницы = 2. Как только я передвину "элемент 8" на позицию "элемента 7", в начало текущего документа асинхронно подгрузятся элементы со страницы 1. После завершения асинхронного запроса я смогу передвинуть "элемент 8" на вожделенное место "элемента 2".
Вроде бы вполне реализуемая задумка.

laimas
25.04.2018, 17:50
Как только я передвину "элемент 8" на позицию "элемента 7" в начало текущего документа асинхронно подгрузятся элементы со страницы 1.

Это как? Было

List
Page-1
Elem-0
Elem-1
Elem-2
Elem-3
Elem-4
Page-2
Elem-5
Elem-6
Elem-7
Elem-8
Elem-9


станет

List
Page-1
Elem-0
Elem-1
Elem-2
Elem-3
Elem-4
Page-2
Elem-5
Elem-6
Elem-8
Elem-7
Elem-9


Что при этом изменится, что заставит подгрузится элементы с первой страницы?

Я еще понимаю, если тянуть вверх и выйти за пределы списка, что инициалиузирует запрос и загрузит первую страницу и в ней опустить элемент с индексом 8, перед индексом 2, это будет инициализацией обновления в базе. Но чтобы 8 на позицию 7 и показалось нечто с первой страницы ..., этого я не понимаю.

Nexus
25.04.2018, 17:55
Что при этом изменится, что заставит подгрузится элементы с первой страницы?
Изменится позиция перетаскиваемого элемента, это и может послужить триггером.
Какую страницу подгрузить станет понятно сравнив позиции текущего и вытесненного элемента.

laimas
25.04.2018, 17:58
Изменится позиция перетаскиваемого элемента, это и может послужить триггером.

Какой триггер, если у вас изменили позицию элементы в пределах одной страницы?

Nexus
25.04.2018, 18:49
Какой триггер, если у вас изменили позицию элементы в пределах одной страницы?
Что вас смущает?
Да, элемент остался на той же странице, однако пользователь вполне может потянуть его дальше в начало документа, так и не сделать этого.
Если потянул, то я покажу ему предыдущую страницу, нет - скрою её.

laimas
25.04.2018, 19:00
однако пользователь вполне может потянуть его дальше в начало документа

Ту так это нужно перетянуть его за пределы списка текущей страницы, но не при смене же как, в примере, позиции 8 на позицию 7! Это не только не смущает, от этого волосы дыбом. )

Я редактировал, пост, добавил, если не читали:

Я еще понимаю, если тянуть вверх и выйти за пределы списка, что инициалиузирует запрос и загрузит первую страницу и в ней опустить элемент с индексом 8, перед индексом 2, это будет инициализацией обновления в базе. Но чтобы 8 на позицию 7 и показалось нечто с первой страницы ..., этого я не понимаю.

Это другое дело, но опять таки, если это перемещение в небольших пределах, но если большой список ... врагу не пожелаешь такой сортировки. :)

laimas
25.04.2018, 20:17
Nexus,
такая задача не редко возникает в админках. Мне как-то пришлось решать такой вопрос, и ждать пока "перемотает", это утомительно, да и заказчика волновал всегда вопрос цены - не надо наворотов, чем дешевле тем лучше.

Это без наворотов и использую зачастую. Все элементы навигатора (страницы) доступны из панели внизу. Ее состояние по умолчанию - одна строка кнопок страниц, в которой текущая страница. При наведении мыши она выезжает на всю высоту.

В списке щелчком выбирается (подсвечивается) перемещаемый элемент, затем на панель навигатора, он раскрывается, подводим мышь под нужную страницу, раскрывается список с кнопками элементов в нем, выбираем в нем позицию. Эти две позиции отправляются на сервер.

Nexus
26.04.2018, 10:10
в примере, позиции 8 на позицию 7! Это не только не смущает, от этого волосы дыбом.
Это я грубо написал, разумеется грузить след. страницу, когда пользователь передвинул элемент на 1 позицию - глупость, а добавить какие-то условия - не столь сложно будет.

врагу не пожелаешь такой сортировки.
Это да, не подумал о подобном. 10 Страниц элемент тащить - то еще удовольствие :)

В списке щелчком выбирается (подсвечивается) перемещаемый элемент, затем на панель навигатора, он раскрывается, подводим мышь под нужную страницу, раскрывается список с кнопками элементов в нем, выбираем в нем позицию. Эти две позиции отправляются на сервер.
Гениально! Спасибо за ответ, именно так и сделаю :)

laimas
26.04.2018, 11:11
именно так и сделаю

Тогда по полной делать: перемещение от одного до множества по выбору индивидуальному или диапазона с Shift. Серверу всегда отдается два ключа: from - коллекция перемещаемых, to - позиция перемещения.

Nexus
26.04.2018, 11:17
laimas, перемещение на новую позицию нескольких элементов единовременно, вероятно, самая непопулярная операция.
Но спасибо за подсказку )

laimas
26.04.2018, 11:43
перемещение на новую позицию нескольких элементов единовременно, вероятно, самая непопулярная операция

Это почему?

Nexus
26.04.2018, 11:56
Это почему?
Ни разу не было необходимости перенести несколько элементов сразу на одну и туже позицию. В основном переносится 1 элемент, да и не то чтобы очень далеко, просто потому что он теперь должен выводится до определенного элемента.

laimas
26.04.2018, 12:07
Ни разу не было необходимости перенести несколько элементов сразу на одну и туже позицию.

Перенос нескольких не будет на одну и туже позицию, это будут новые позиции группы элементов начиная с указанной. Если не было еще такой необходимости, значит мало было "контактов" с различными данными.

Бывают необходимости переносов не только в контексте сортировки, но и переносов узлов дерева в дереве, что как раз удобно делать посредством drag & drop.