트리 그리드에서 행 끌 Web Components

    Web Components 트리 그리드의 Ignite UI for Web Components 행 끌기 기능은 쉽게 구성할 수 있으며 마우스를 사용하여 새 위치로 끌어다 놓아 그리드 내의 행을 재정렬하는 데 사용됩니다. 루트 IgcTreeGridComponent 구성 요소에서 초기화되며 입력을 통해 구성할 수 있습니다 rowDraggable.

    Web Components 트리 그리드 행 드래그 예제

    EXAMPLE
    DATA
    TS
    HTML
    CSS

    이 샘플이 마음에 드시나요? 당사의 완전한 Ignite UI for Web Components 툴킷에 액세스하여 몇 분 만에 나만의 앱을 빌드하기 시작하세요. 무료로 다운로드하세요.

    구성

    행 드래그를 IgcTreeGridComponent 활성화하려면 그리드를 rowDraggable​ ​true로 설정하기만 하면 됩니다. 이 기능이 활성화되면 각 행에 행 드래그 핸들이 표시됩니다. 이 핸들은 행 드래그를 시작하는 데 사용할 수 있습니다. 드래그 핸들을 클릭하고 버튼을 누른 상태에서 커서를 움직이 면 그리드의 RowDragStart 이벤트가 발생합니다. 언제든지 클릭을 해제하면 RowDragEnd 이벤트가 발생합니다.

    <igc-tree-grid row-draggable="true">
    </igc-tree-grid>
    html

    드래그 아이콘 템플릿 만들기

    드래그 핸들 아이콘은 그리드의 dragIndicatorIconTemplate 사용하여 템플릿화할 수 있습니다. 우리가 만들고 있는 예제에서 아이콘을 기본 아이콘(drag_indicator)에서 drag_handle로 변경해 보겠습니다.

    이렇게하려면 본문 DragIndicatorIcon 내부에 템플릿을 전달할 수 있습니다. igc-tree-grid

    <igc-tree-grid row-draggable="true" id="grid">
    </igc-tree-grid>
    html
    constructor() {
        var grid = this.grid = document.getElementById('grid') as IgcHierarchicalGridComponent;
        grid.dragIndicatorIconTemplate = this.dragIndicatorIconTemplate;
    }
    
    public dragIndicatorIconTemplate = (ctx: IgcGridEmptyTemplateContext) => {
        return html`<igc-icon name="drag_handle" collection="material"></igc-icon>`;
    }
    ts
    Ignite UI for Web Components | CTA 배너

    애플리케이션 데모

    행 재정렬 데모

    그리드의 행 드래그 이벤트를 사용하면 행을 드래그하여 재정렬할 수 있는 그리드를 생성할 수 있습니다.

    <igc-tree-grid id="tGrid" row-draggable="true" primary-key="ID">
    </igc-tree-grid>
    html
    constructor() {
        var tGrid = this.tGrid = document.getElementById('tGrid') as IgcTreeGridComponent;
        tGrid.addEventListener("rowDragStart", this.webTreeGridReorderRowStartHandler);
        tGrid.addEventListener("rowDragEnd", this.webTreeGridReorderRowHandler);
    }
    ts

    그리드에 대해 기본 키가 지정되어 있는지 확인하세요! 논리에는 행을 올바르게 다시 정렬할 수 있도록 행에 대한 고유 식별자가 필요합니다.

    rowDraggable 활성화되고 드롭 영역이 정의되면 드롭 이벤트에 대한 간단한 핸들러를 구현해야 합니다. 행을 드래그할 때 다음을 확인하세요.

    • 행이 확장되었나요? 그렇다면 접으세요.
    • 행이 그리드 내부에 삭제되었습니까?
    • 그렇다면 드래그된 행이 다른 어느 행에 삭제되었습니까?
    • 대상 행을 찾았으면 data 배열에서 레코드 위치를 바꿉니다.
    • 행이 처음에 선택되었습니까? 그렇다면 선택됨으로 표시하세요.

    아래에서 이것이 구현된 것을 볼 수 있습니다.

    public webTreeGridReorderRowStartHandler(args: CustomEvent<IgcRowDragStartEventArgs){
            const draggedRow = args.detail.dragElement;
            const grid = this.treeGrid;
            const row = grid.getRowByIndex(draggedRow.getAttribute('data-rowindex'));
            if(row.expanded){
                row.expanded = false;
            }
        }
    
        public webTreeGridReorderRowHandler(args: CustomEvent<IgcRowDragEndEventArgs>): void {
            const ghostElement = args.detail.dragDirective.ghostElement;
            const dragElementPos = ghostElement.getBoundingClientRect();
            const grid = this.treeGrid;
            const rows = Array.prototype.slice.call(document.getElementsByTagName("igx-tree-grid-row"));
            const currRowIndex = this.getCurrentRowIndex(rows,
            { x: dragElementPos.x, y: dragElementPos.y });
            if (currRowIndex === -1) { return; }
            const draggedRow = args.detail.dragData.data;
            const childRows = this.findChildRows(grid.data, draggedRow);
            //remove the row that was dragged and place it onto its new location
            grid.deleteRow(args.detail.dragData.key);
            grid.data.splice(currRowIndex, 0, args.detail.dragData.data);
            // reinsert the child rows
            childRows.reverse().forEach(childRow => {
                grid.data.splice(currRowIndex + 1, 0, childRow);
            });
        }
    
        private findChildRows(rows: any[], parent: any): any[] {
            const childRows: any[] = [];
            rows.forEach(row => {
                if (row.ParentID === parent.ID) {
                    childRows.push(row);
                    // Recursively find children of current row
                    const grandchildren = this.findChildRows(rows, row);
                    childRows.push(...grandchildren);
                }
            });
            return childRows;
        }
    
        public 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;
        }
    ts

    이러한 몇 가지 간단한 단계를 통해 드래그/드롭을 통해 행을 재정렬할 수 있는 그리드를 구성했습니다! 다음 데모에서 위 코드가 실제로 작동하는 모습을 볼 수 있습니다.

    또한 행 선택이 활성화되어 있으며 드래그된 행을 삭제할 때 선택이 유지됩니다.

    EXAMPLE
    DATA
    TS
    HTML
    CSS

    제한 사항

    현재 rowDraggable 에는 알려진 제한 사항이 없습니다.

    API 참조

    추가 리소스

    우리 커뮤니티는 활동적이며 항상 새로운 아이디어를 환영합니다.