All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.vaadin.flow.component.gridpro.testbench.GridProElement Maven / Gradle / Ivy

The newest version!
/**
 * Copyright 2000-2024 Vaadin Ltd.
 *
 * This program is available under Vaadin Commercial License and Service Terms.
 *
 * See {@literal } for the full
 * license.
 */
package com.vaadin.flow.component.gridpro.testbench;

import java.util.List;
import java.util.stream.Collectors;

import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;

import com.vaadin.testbench.TestBenchElement;
import com.vaadin.testbench.elementsbase.Element;

/**
 * A TestBench element representing a <vaadin-grid-pro>
 * element.
 */
@Element("vaadin-grid-pro")
public class GridProElement extends TestBenchElement {
    /**
     * Scrolls to the row with the given index.
     *
     * @param row
     *            the row to scroll to
     */
    public void scrollToRow(int row) {
        callFunction("scrollToIndex", row);
    }

    /**
     * Gets the index of the first row which is at least partially visible.
     *
     * @return the index of the first visible row, -1 if Grid is empty
     */
    public int getFirstVisibleRowIndex() {
        Object index = executeScript("return arguments[0]._firstVisibleIndex",
                this);
        if (index != null) {
            return ((Long) index).intValue();
        } else {
            return -1;
        }
    }

    /**
     * Gets the grid cell for the given row and column index.
     * 

* For the column index, only visible columns are taken into account. *

* Automatically scrolls the given row into view * * @param rowIndex * the row index * @param colIndex * the column index * @return the grid cell for the given coordinates */ public GridTHTDElement getCell(int rowIndex, int colIndex) { GridProColumnElement column = getVisibleColumns().get(colIndex); return getCell(rowIndex, column); } /** * Gets the grid cell for the given row and column. *

* Automatically scrolls the given row into view * * @param rowIndex * the row index * @param column * the column element for the column * @return the grid cell for the given coordinates */ public GridTHTDElement getCell(int rowIndex, GridProColumnElement column) { if (!isRowInView(rowIndex)) { scrollToRow(rowIndex); } GridTRElement row = getRow(rowIndex); return row.getCell(column); } /** * Gets the index of the last row which is at least partially visible. * * @return the index of the last visible row, -1 if Grid is empty */ public int getLastVisibleRowIndex() { Object index = executeScript("return arguments[0]._lastVisibleIndex", this); if (index != null) { return ((Long) index).intValue(); } else { return -1; } } /** * Gets the header cell for the given visible column index. * * @param columnIndex * the index of the column * @return a cell element for the header cell */ public GridTHTDElement getHeaderCell(int columnIndex) { return getVisibleColumns().get(columnIndex).getHeaderCell(); } /** * Finds the vaadin-grid-cell-content element for the given row and column * in header. * * @param rowIndex * the index of the row in the header * @param columnIndex * the index of the column in the header * @return the vaadin-grid-cell-content element for the given row and column * in header. */ public TestBenchElement getHeaderCellContent(int rowIndex, int columnIndex) { WebElement thead = $("thead").id("header"); List headerRows = thead.findElements(By.tagName("tr")); List headerCells = headerRows.get(rowIndex) .findElements(By.tagName("th")); String slotName = headerCells.get(columnIndex) .findElement(By.tagName("slot")).getAttribute("name"); return findElement(By.cssSelector( "vaadin-grid-cell-content[slot='" + slotName + "']")); } /** * Checks if the given row is in the visible viewport. * * @param rowIndex * the row to check * @return true if the row is at least partially in view, * false otherwise */ private boolean isRowInView(int rowIndex) { // Private for now because this seems to be slightly incorrect return (getFirstVisibleRowIndex() <= rowIndex && rowIndex <= getLastVisibleRowIndex()); } /** * Gets the tr element for the given row index. * * @param rowIndex * the row index * @return the tr element for the row */ public GridTRElement getRow(int rowIndex) { String script = "var grid = arguments[0];" + "var rowIndex = arguments[1];" + "var rowsInDom = grid.$.items.children;" + "var rowInDom = Array.from(rowsInDom).filter(function(row) { return !row.hidden && row.index == rowIndex;})[0];" + "return rowInDom;"; return ((TestBenchElement) executeScript(script, this, rowIndex)) .wrap(GridTRElement.class); } protected void generatedColumnIdsIfNeeded() { String generateIds = "const grid = arguments[0];" + "if (!grid.__generatedTbId) {"// + " grid.__generatedTbId = 1;"// + "}" // + "grid._getColumns().forEach(function(column) {" + " if (!column.__generatedTbId) {" + " column.__generatedTbId = grid.__generatedTbId++;" // + " }" // + "});"; executeScript(generateIds, this); } /** * Gets the currently visible columns in the grid, including any selection * checkbox column. * * @return a list of grid column elements which can be used to refer to the * given column */ public List getVisibleColumns() { generatedColumnIdsIfNeeded(); String getVisibleColumnsJS = "return arguments[0]._getColumns().filter(function(column) {return !column.hidden;}).sort(function(a,b) { return a._order - b._order;}).map(function(column) { return column.__generatedTbId;});"; List elements = (List) executeScript(getVisibleColumnsJS, this); return elements.stream().map(id -> new GridProColumnElement(id, this)) .collect(Collectors.toList()); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy