¿Cuál es la mejor manera de administrar el orden de clasificación de los elementos de la lista con la interfaz de usuario de arrastrar y soltar?

10

Tengo una lista de estudiantes que debo mostrar al usuario en una página web en formato tabular.
Los elementos se almacenan en la base de datos junto con la información de Ordenar.

En la página web, el usuario puede reorganizar el orden de la lista arrastrando y soltando los elementos en el orden de clasificación deseado, similar a esta publicación .

A continuación se muestra una captura de pantalla de mi página de prueba.
ingrese la descripción de la imagen aquí

En el ejemplo anterior, cada fila tiene información de orden de clasificación adjunta. Cuando coloco a John Doe (Id. De estudiante 10) sobre la fila Id. De estudiante 1, el orden de la lista ahora debe ser: 2, 10, 1, 8, 11.

¿Cuál es la forma optimista (que consume menos recursos) de almacenar y actualizar la información del orden de clasificación?

Mi única idea por ahora es que, para cada cambio en el orden de clasificación de la lista, se debe actualizar el valor SortOrder de cada objeto, lo que en mi opinión consume muchos recursos.

Solo para tu información: podría tener como máximo 25 filas en mi tabla.

Alejandro
fuente
1
¿Necesita que este orden de clasificación persista en el lado del servidor o es suficiente tenerlo solo en el lado del cliente?
determinar
1
Debería almacenar el pedido en el lado del servidor. No importa si el pedido se almacena en cada arrastrar y soltar o haciendo clic en un botón de una vez por todas.
Alexander

Respuestas:

10

Se me ocurrió algo que puede reducir sus consultas. Aquí, en mi ejemplo, he agregado una nueva columnpara ordenar llamada pos. Entonces, inicialmente sin arrastrar tu tabla será como:

Estado inicial

Ahora, consideremos que arrastraste Item 4entre Item 1& Item 2. Ahora, será un nuevo posvalor para , que es . Por lo tanto, solo necesitará actualizar una sola fila en la base de datos. Y obtendrás ...Item 4(20 + 10) / 215

Después de arrastrar

Aquí hay un diagrama de flujo con los casos extremos. ies el nuevo índice de matriz de su fila después de arrastrarlo -

Diagrama de flujo

Este diagrama de flujo no maneja ArrayOutOfBoundcheques. Y, para casos extremos, necesitará más de una consulta.

Como solo tiene 25 filas, puede tomar un valor muy grande (p 10,000. Ej. ) Para la diferencia de posición (tomé 10para este ejemplo). Cuanto mayor sea el valor, menos chocará.

Rifat
fuente
Este es un buen enfoque. Tenga en cuenta que tendrá que volver a calcular la totalidad (o una gran parte de) la información de pedido si no hay espacio para no insertar un elemento. Sería un evento bastante raro de soportar.
9000
@ 9000 puede usar decimal en lugar de entero para evitar el problema.
Rifat
Si tiene Item Acon la posición 123 y Item Ccon la posición 124, no hay una manera fácil de poner Item B entre ellos. Una solución sería usar números fraccionarios (por ejemplo, flotantes), pero también tienen una precisión limitada. A veces es mejor renumerar, normalizar los intervalos y mantener las cosas simples.
9000
Entonces, cuando haces i--, solo restas por 1. ¿No hay un intervalo diferente al que puedas restar para evitar colisiones eventuales?
muttley91
@Rifat incluso los decimales tienen una precisión limitada, por lo que también colisionarán.
SCI
3

Personalmente, devolvería una matriz JSON para los datos del back-end. Luego usaría JavaScript (JQuery o knockout) para mostrar y ordenar y volver a ordenar los datos. De esa manera, la ordenación tiene carga cero en el servidor.

Tom Squires
fuente
0

Está buscando una manera amigable con los recursos para manejar esto, pero también es imprescindible una perspectiva amigable para el usuario. Recomiendo solicitudes individuales después de cada artículo reordenado. Cada llamada le permite verificar si fue aceptada o fallida.

  • Las respuestas fallidas restablecerán la vista y mostrarán un mensaje al usuario final.
  • Las solicitudes aceptadas simples permiten la edición continua.

Alternativamente, usar un objeto JSON (@ tom-squires) es una buena idea para reducir la sobrecarga de HTTP y el procesamiento del lado del servidor, pero finalmente requiere más código para manejar las solicitudes en el lado del servidor y del cliente. Si eso está bien, pasar el objeto al servidor es técnicamente más eficiente. También permite un retraso de un par de segundos para permitir múltiples pedidos antes de una sola solicitud, si lo desea.

Tenga en cuenta que, para proporcionar al usuario un comentario de las solicitudes fallidas, deberá analizar un objeto JSON de respuesta del servidor para averiguar qué elemento falló y restablecer la IU en función de eso.

David Garza
fuente
-1

Algo así en el controlador de eventos drop, donde e es el evento DnD.

        ....
        if (e.Action == DragAction.Drop)
        {
            foreach(var item in Items)
            {
                if (e.NewIndex == e.OldIndex) // Dropped in same place
                    return;
                if(e.OldIndex > e.NewIndex) // Moved Up
                {
                    if (item.SortOrder >= e.NewIndex && item.SortOrder < e.OldIndex)
                    {
                        item.SortOrder ++;
                    }
                }
                else // Moved Down
                {
                    if (item.SortOrder> e.OldIndex && item.SortOrder < e.NewIndex) 
                    {
                        item.SortOrder --;
                    }
                }   
            }
            ((Student)e.ItemData).SortOrder = e.NewIndex;
        }
    ...
Adelante
fuente