package org.lightadmin.component; import com.google.common.collect.Lists; import org.lightadmin.SeleniumContext; import org.lightadmin.page.EditPage; import org.lightadmin.util.WebElementTransformer; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.internal.Locatable; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; public class DataTableComponent extends StaticComponent { private final WebElement dataTableElement; private Map<String, Column> columns = new LinkedHashMap<>(); public DataTableComponent( final WebElement dataTableElement, final SeleniumContext seleniumContext ) { super( seleniumContext ); this.dataTableElement = dataTableElement; setColumnHeaders(); } private Map<String, Column> setColumnHeaders() { List<WebElement> columnElements = dataTableElement.findElements(By.xpath(".//div[contains(@class, 'dataTables_scrollHeadInner')]//thead//th[contains(@class, 'header')]/div")); for ( WebElement columnElement : columnElements ) { Column column = new Column(columnElement); columns.put( column.getName(), column ); } return columns; } public String getValueAt( int rowIndex, int columnIndex ) { return getCells( rowIndex ).get( columnIndex ); } public List<String> getCells( int rowIndex ) { return WebElementTransformer.transform( cellElements( dataRowElement( rowIndex ) ) ); } public QuickViewComponent showQuickViewFor( int itemId ) { return new QuickViewComponent( itemId, getRowForItem( itemId ), seleniumContext ).get(); } public QuickViewComponent showQuickViewFor( String itemName ) { int itemId = getItemIdByName( itemName ); return new QuickViewComponent( itemId, getRowForItem( itemId ), seleniumContext ).get(); } public int getRowCount() { return dataRowElements().size(); } public int getColumnCount() { return columns.size(); } public Column getColumn( String name ) { return columns.get( name ); } public String getColumnName( int columnIndex ) { return Lists.newArrayList( columns.keySet() ).get( columnIndex ); } private WebElement getRowForItem( int itemId ) { return dataTableElement.findElement( By.xpath( ".//div[contains(@class, 'dataTables_scrollBody')]//tbody/tr[td[text()=" + itemId + "]]" ) ); } public WebElement getRowForItem( String itemName ) { return getRowForItem( getItemIdByName( itemName ) ); } private int getItemIdByName( String itemName ) { return Integer.parseInt( dataTableElement.findElement( By.xpath( ".//div[contains(@class, 'dataTables_scrollBody')]//tbody/tr[td[contains(text(), '" + itemName + "')]]/td[2]" ) ).getText() ); } private WebElement dataRowElement( int rowIndex ) { return dataRowElements().get( rowIndex ); } private List<WebElement> dataRowElements() { return dataTableElement.findElements( By.xpath( ".//div[contains(@class, 'dataTables_scrollBody')]//tbody/tr[td[contains(@class, 'data-cell')]]" ) ); } private List<WebElement> cellElements( WebElement rowElement ) { return rowElement.findElements( By.xpath( "td[contains(@class,'data-cell')]" ) ); } public EditPage editItem(int itemId, String domainName) { final WebElement row = getRowForItem(itemId); ((Locatable) row).getCoordinates().inViewPort(); row.findElement(By.xpath(".//a[@title='Edit']")).click(); return new EditPage(seleniumContext, domainName, itemId).get(); } public void deleteItemByName( String itemName ) { new DeletionDialog( getRowForItem( itemName ), seleniumContext ).confirm(); } public class Column { private WebElement headerElement; private String currentSorting; public Column( WebElement headerElement ) { this.headerElement = headerElement; } public void sortDescending() { setCurrentSorting(); if ( isNotSorted() ) { sort(); sort(); } else if ( isSortedAscending() ) { sort(); } } public void sortAscending() { setCurrentSorting(); if ( !isSortedAscending() ) { sort(); } } private void sort() { headerElement.click(); setCurrentSorting(); } private void setCurrentSorting() { currentSorting = headerElement.getAttribute( "class" ); } private boolean isNotSorted() { return currentSorting.endsWith( "sorting" ); } private boolean isSortedAscending() { return currentSorting.endsWith( "sorting_asc" ); } public String getName() { return headerElement.getText(); } } }