Arrastar linha em React grade hierárquica
O recurso Ignite UI for React arrastar linha em React grade hierárquica é facilmente configurável e é usado para reorganizar linhas dentro da grade arrastando e soltando-as em uma nova posição usando o mouse. Ele é inicializado no componente raiz IgrHierarchicalGrid
e é configurável por meio da rowDraggable
entrada.
React Hierarchical Grid Row Drag Example
Configuration
Para habilitar o arrasto de linha para você IgrHierarchicalGrid
, tudo o que você precisa fazer é definir a grade rowDraggable
como true. Depois que isso estiver ativado, uma alça de arrastar linha será exibida em cada linha. Essa alça pode ser usada para iniciar o arrasto de linha. Clicar na alça de arrastar e mover o cursor enquanto mantém pressionado o botão fará com que o evento da RowDragStart
grade seja acionado. Liberar o clique a qualquer momento fará com que RowDragEnd
o evento seja acionado.
<IgrHierarchicalGrid rowDraggable={true}>
</IgrHierarchicalGrid>
Templating the Drag Icon
O ícone da alça de arrastar pode ser modelado usando o da grade dragIndicatorIconTemplate
. No exemplo que estamos criando, vamos alterar o ícone do padrão (drag_indicator) para drag_handle.
const dragIndicatorIconTemplate = (ctx: IgrGridEmptyTemplateContext) => {
return (
<>
<IgrIcon name="drag_handle" collection="material" />
</>
);
}
<IgrHierarchicalGrid rowDraggable={true} dragIndicatorIconTemplate={dragIndicatorIconTemplate}>
</IgrHierarchicalGrid>
Application Demo
Row Reordering Demo
Com a ajuda dos eventos de arrastar linha da grade, você pode criar uma grade que permite reordenar as linhas arrastando-as.
<IgrHierarchicalGrid rowDraggable={true} primaryKey="ID" onRowDragEnd={webHierarchicalGridReorderRowHandler}>
</IgHierarchicalGrid>
[!Note] Make sure that there is a
primaryKey
specified for the grid! The logic needs an unique identifier for the rows so they can be properly reordered.
Uma vez rowDraggable
habilitado e uma zona de queda definida, você precisa implementar um manipulador simples para o evento de queda. Quando uma linha é arrastada, verifique o seguinte:
- A linha é expandida? Em caso afirmativo, recolha-o.
- A linha foi lançada dentro da grade?
- Em caso afirmativo, em qual outra linha a linha arrastada foi solta?
- Depois de encontrar a linha de destino, troque os lugares dos registros na
data
matriz - A linha foi inicialmente selecionada? Em caso afirmativo, marque-o como selecionado.
Abaixo, você pode ver isso implementado:
const webHierarchicalGridReorderRowHandler = (args: IgrRowDragEndEventArgs): void => {
const ghostElement = args.detail.dragDirective.ghostElement;
const dragElementPos = ghostElement.getBoundingClientRect();
hierarchicalGridRef.current.collapseAll();
const rows = Array.prototype.slice.call(document.getElementsByTagName("igx-hierarchical-grid-row"));
const currRowIndex = getCurrentRowIndex(rows,
{ x: dragElementPos.x, y: dragElementPos.y });
if (currRowIndex === -1) { return; }
// remove the row that was dragged and place it onto its new location
hierarchicalGridRef.current.deleteRow(args.detail.dragData.key);
hierarchicalGridRef.current.data.splice(currRowIndex, 0, args.detail.dragData.data);
}
const getCurrentRowIndex = (rowList: any[], cursorPosition: any) => {
for (const row of rowList) {
const rowRect = row.getBoundingClientRect();
if (cursorPosition.y > rowRect.top + window.scrollY && cursorPosition.y < rowRect.bottom + window.scrollY &&
cursorPosition.x > rowRect.left + window.scrollX && cursorPosition.x < rowRect.right + window.scrollX) {
// return the index of the targeted row
return parseInt(row.attributes["data-rowindex"].value);
}
}
return -1;
}
Com essas etapas fáceis, você configurou uma grade que permite reordenar linhas por meio de arrastar/soltar! Você pode ver o código acima em ação na demonstração a seguir.
Observe que também temos a seleção de linha habilitada e preservamos a seleção ao soltar a linha arrastada.
Limitations
Atualmente, não há limitações conhecidas para o rowDraggable
.
API References
rowDraggable
RowDragStart
RowDragEnd
IgrHierarchicalGrid
Additional Resources
Nossa comunidade é ativa e sempre acolhedora para novas ideias.