Source: PxDataTable.js

/**
 * Created by 212556710 on 6/8/17.
 */

(function () {
    "use strict";

    /**
     * Creates new PxDataTable
     * @class PxDataTable
     */
    var PxDataTable = function () {
        var helper = require("./TestHelper");
        var TestHelperPO = require("./TestHelperPO");
        var logger = require("./Logger.js");
        var section, tableContainer;
        var EC = protractor.ExpectedConditions;
        return {
            /**
             * Sets parent element of table
             * @method initialize
             * @param {Object} sectionElement
             */
            //tested
            initialize: function (sectionElement) {
                section = sectionElement;
                tableContainer = section.element(by.css("div.flex.px-data-table"));
            },

            /**
             * Sets the value of table container
             * @method setContainer
             * @param {Object} containerElement
             */
            //tested
            setContainer: function (containerElement) {
                tableContainer = containerElement;
                logger.info("container set " + containerElement)
            },

            /**
             * Retrieves the value of table container
             * @method getContainer
             * @return {String}
             */
            //tested
            getContainer: function () {
                return tableContainer
            },

            /**
             * Retrieves the number of columns present in table
             * @method getColumnCount
             * @return {Integer}
             */
            //tested
            getColumnCount: function () {
                var deferred = protractor.promise.defer();
                var columnCount = 0;
                var tableheaders = tableContainer.all(by.css("div.flex.header--container"));
                return tableheaders.then(function (columns, callback) {
                    columns.forEach(function (option, index) {
                        columnCount++;
                    });
                    deferred.fulfill(columnCount);
                    return deferred.promise;
                });

            },

            /**
             * Retrieves the number of rows present in table
             * @method getRowCount
             * @return {Integer}
             */
            //tested
            getRowCount: function () {
                var deferred = protractor.promise.defer();
                var rowCount = 0;
                var rows = tableContainer.all(by.css("div.tr.rows.aha-table"));
                return rows.then(function (tablerows, callback) {
                    tablerows.forEach(function (option, index) {
                        rowCount++;
                    });
                    deferred.fulfill(rowCount);
                    return deferred.promise;
                });
            },

            /**
             * Retrieves the value of the current page number
             * @method getCurrentPage
             * @return {Integer}
             */
            //tested
            getCurrentPage: function () {
                var deferred = protractor.promise.defer();
                var currentPageNumber;
                var pageNumbers = tableContainer.all(by.css("px-pagination#pagination span.pager span.btn--pagination--number"));
                return pageNumbers.then(function (pages, callback) {
                    pages.forEach(function (page, index) {
                        page.getText().then(function (pageText) {
                            currentPageNumber=pageText;
                            deferred.fulfill(currentPageNumber);
                        });
                    });
                    return deferred.promise;
                });


            },

            /**
             * Navigates to specified page number
             * @method goToPage
             * @param {Integer} pageNumber
             * @return {Integer}
             */
            //tested
            goToPage: function (pageNumber) {
                var deferred = protractor.promise.defer();
                var currentPageNumbers=[];
                var pageNumbers = tableContainer.all(by.css("px-pagination#pagination span.pager span"));
                return pageNumbers.then(function (pagesElements, callback) {
                    pagesElements.forEach(function (pages, index) {
                        currentPageNumbers.push(pages);

                    });
                    return currentPageNumbers[pageNumber-1].click().then(function (resolve, callback) {
                        deferred.fulfill(resolve);
                        return deferred.promise;
                    });

                });
            },

            /**
             * Navigates to next page
             * @method goToNextPage
             */
            //tested
            goToNextPage: function () {
                var deferred = protractor.promise.defer();
                var currentPageNumbers=[];
                var pageNumbers = tableContainer.all(by.css("px-pagination#pagination span.paging button i.fa-angle-right"));
                return pageNumbers.then(function (pagesElements, callback) {
                    pagesElements.forEach(function (pages, index) {
                        currentPageNumbers.push(pages);

                    });
                    return currentPageNumbers[0].click().then(function (resolve, callback) {
                        deferred.fulfill(resolve);
                        return deferred.promise;
                    });
                });
            },

            /**
             * Navigates to previous page
             * @method goToPreviousPage
             */
            //tested
            goToPreviousPage: function () {
                var deferred = protractor.promise.defer();
                var currentPageNumbers=[];
                var pageNumbers = tableContainer.all(by.css("px-pagination#pagination span.paging button i.fa-angle-left"));
                return pageNumbers.then(function (pagesElements, callback) {
                    pagesElements.forEach(function (pages, index) {
                        currentPageNumbers.push(pages);
                    });
                    return currentPageNumbers[0].click().then(function (resolve, callback) {
                        deferred.fulfill(resolve);
                        return deferred.promise;
                    });
                });


            },

            /**
             * Retrieves current value of row per page field
             * @method getRowPerPageValue
             * @return {Integer}
             */
            getRowPerPageValue: function () {
                var deferred = protractor.promise.defer();
                var selectedOption;
                var rowsPerPage = tableContainer.all(by.css("select#pageSizeSelect option[selected]"));
                return rowsPerPage.getText().then(function (text) {
                    selectedOption = text;
                    deferred.fulfill(selectedOption);
                    return deferred.promise;
                });
            },

            /**
             * Sets value of row per page field
             * @method setRowPerPageValue
             * @param {Integer} selectValue
             */
            setRowPerPageValue: function (selectValue) {
                // var pagination = tableContainer.all(by.css("select#pageSizeSelect"));
                /* pagination.click().then(function (text) {*/
                var options=  tableContainer.element(by.css("select#pageSizeSelect option[value='"+selectValue+"']"));
                return options.click();
            },

            /**
             * Applies filter in precise column
             * @method setFilter
             * @param {String} columName
             * @param {Integer} filterValue
             */
            setFilter: function (columName,filterValue) {
                return this.getFilter(columName).then(function (columnfilters) {
                    return columnfilters.sendKeys(filterValue);
                });
            },

            /**
             * Clears filter applied in precised column
             * @method clearFilter
             * @param {String} columnName
             */
            clearFilter: function (columnName) {
                return this.getFilter(columnName).then(function (columnfilters) {
                    return columnfilters.clear();
                });
            },

            /**
             * Retrieves filter value of precise column
             * @method getFilter
             * @param {String} columnName
             * @return {String}
             */
            //tested
            getFilter: function (columnName) {
                var deferred = protractor.promise.defer();
                var filtersList = [];
                var index;
                return this.getColumnindex(columnName).then(function (colIndex) {
                    index = colIndex;
                    var tablefilters = tableContainer.all(by.css("span.td.style-scope:not([style]) input"));
                    return tablefilters.then(function (filters, callback) {
                        filters.forEach(function (option, index) {
                            filtersList.push(option);
                        });
                        deferred.fulfill(filtersList[index]);
                        return deferred.promise;
                    });
                });
            },

            /**
             * Applies sorting in specified column
             * @method sortColumn
             * @param {String} columnName
             */
            sortColumn: function (columnName) {
                var columnSortElements = [];
                var columnElement;
                var self=this;
                return this.getColumnHeaderElements().then(function (columnElement) {
                    columnSortElements = columnElement;
                    console.log("in sorting getColumnHeaderElements columnSortElements  " +columnSortElements );
                    return self.getColumnindex(columnName).then(function(columnIndex){
                        columnElement= columnSortElements[columnIndex]
                        return columnElement.element(by.css("span.column-head.u-m--")).click();
                    });
                });
            },

            /**
             * Retrieves index value of column
             * @method getColumnindex
             * @param columnName
             * @return {Integer}
             */
            //tested
            getColumnindex: function (columnName) {
                var deferred = protractor.promise.defer();
                var columnIndex;
                var columnns = [];

                return this.getColumnNames().then(function (colNames) {
                    colNames.forEach(function (Names, index) {
                        columnns.push(Names);
                    });
                    columnIndex = columnns.indexOf(columnName);
                    deferred.fulfill(columnIndex);
                    return deferred.promise;
                });
            },

            /**
             * Retrieves column names
             * @method getColumnNames
             * @return {String}
             */
            //tested
            getColumnNames: function () {
                var deferred = protractor.promise.defer();
                var columnNames = [];
                var tableheaders = tableContainer.all(by.css("span.th.style-scope:not([style]) div.flex.header--container"));
                return tableheaders.then(function (columns, callback) {
                    columns.forEach(function (columnElement, index) {
                        columnElement.getText().then(function (elementText) {
                            columnNames.push(elementText);
                        });
                    });
                    deferred.fulfill(columnNames);
                    return deferred.promise;
                });
            },

            /**
             * Retrieves an array of column header elements
             * @method getColumnHeaderElements
             * @return {Array}
             */
            getColumnHeaderElements: function () {
                var deferred = protractor.promise.defer();
                var columnElements = [];
                var tableheaders = tableContainer.all(by.css("span.th.style-scope:not([style]) div.flex.header--container"));
                return tableheaders.then(function (columns, callback) {
                    columns.forEach(function (columnElement, index) {
                        columnElements.push(columnElement);
                    });
                    deferred.fulfill(columnElements);
                    return deferred.promise;
                });

            },

            /**
             * Retrieves text of precise cell by using row and column number or index value as input
             * @method getCellText
             * @param {Integer} row
             * @param {Integer} column
             * @return {String}
             */
            //tested
            getCellText: function (row, column) {
                return this.getCellElement(row, column).then(function (cellElement) {
                    return cellElement.element(by.css("span.cell--value")).getText();
                });

            },

            /**
             * Retrieves text for specified by using cell element value
             * @method getCellElementText
             * @param cellElement
             * @return {String}
             */
            getCellElementText: function (cellElement) {
                return this.getCellElement(row, column).then(function (cellElement) {
                    return cellElement.element(by.css("span.cell--value")).getText();
                });
            },

            /**
             * Retrieves html data for precise cell by using row and column number or index value as input
             * @method getCellHtml
             * @param {Integer} row
             * @param {Integer} column
             * @return {String}
             */
            getCellHtml: function (row,column) {
                var deferred = protractor.promise.defer();
                return this.getCellElement(row, column).then(function (cellElement) {
                    var cellHtml= cellElement.element(by.css("aha-html-echo.px-data-table-cell"));
                    deferred.fulfill(cellHtml);
                    return deferred.promise;
                });
            },

            /**
             * Retrieves all the text value for precise column
             * @method getColumnTextValues
             * @param {String} columnName
             * @return {String}
             */
            //tested
            getColumnTextValues: function (columnName) {
                var deferred = protractor.promise.defer();
                var columnValue = [];
                //var allElements=[];
                var self=this;
                return this.getColumnindex(columnName).then(function (ColumnIndex) {
                    return self.getRowCount().then(function (rowCount) {
                        //return self.getCellElements().then(function (allTableElements) {
                        //allElements = allTableElements;
                        for (var i = 0; i < rowCount; i++) {
                            self.getCellText(i, ColumnIndex).then(function (cellText) {
                                columnValue.push(cellText);
                            });
                        }
                        deferred.fulfill(columnValue);
                        return deferred.promise;
                        //});
                    });
                });
            },

            /**
             * Retrieves all html values for precise column
             * @method getColumnHtmlValues
             * @param {String} columnName
             * @return {String}
             */
            getColumnHtmlValues: function (columnName) {
                var deferred = protractor.promise.defer();
                var allColumnHtml = [];
                //var allElements=[];
                var self=this;
                return this.getColumnindex(columnName).then(function (ColumnIndex) {
                    return self.getRowCount().then(function (rowCount) {
                        //return self.getCellElements().then(function (allTableElements) {
                        //allElements = allTableElements;
                        for (var i = 0; i < rowCount; i++) {
                            self.getCellHtml(i, ColumnIndex).then(function (cellHtml) {
                                allColumnHtml.push(cellHtml);
                            });
                        }
                        deferred.fulfill(allColumnHtml);
                        return deferred.promise;
                        //});
                    });
                });
            },

            /**
             * Retrieves all records of specified column
             * @method getColumnElementValues
             * @param {String} columnName
             * @return {String}
             */
            getColumnElementValues: function (columnName) {
                var deferred = protractor.promise.defer();
                var allColumnElement = [];
                //var allElements=[];
                var self=this;
                return this.getColumnindex(columnName).then(function (colIndex) {
                    return self.getRowCount().then(function (rowCount) {
                        //return self.getCellElements().then(function (allTableElements) {
                        //allElements = allTableElements;
                        for (var i = 0; i < rowCount; i++) {
                            self.getCellElement(i, colIndex).then(function (cellElement) {
                                allColumnElement.push(cellElement);
                            });
                        }
                        deferred.fulfill(allColumnElement);
                        return deferred.promise;
                        //});
                    });
                });



            },

            /**
             * Retrieves all text value of specified row
             * @method getRowTextValues
             * @param {Integer} rowIndex
             * @return {String}
             */
            getRowTextValues: function (rowIndex) {
                var deferred = protractor.promise.defer();
                var allRowText = [];
                //var allElements=[];
                var self=this;
                return this.getColumnCount().then(function (colCount) {
                    //return self.getCellElements().then(function (allTableElements) {
                    //allElements = allTableElements;
                    for (var j = 0; j < colCount; j++) {
                        self.getCellText(rowIndex, j).then(function (cellText) {
                            allRowText.push(cellText);
                        });
                    }
                    deferred.fulfill(allRowText);
                    return deferred.promise;
                    //});
                });
            },

            /**
             * Retrieves all html values of specified row
             * @method getRowHtmlValues
             * @param {Integer} rowIndex
             * @return {String}
             */
            getRowHtmlValues: function (rowIndex) {
                var deferred = protractor.promise.defer();
                var allRowHtml = [];
                //var allElements=[];
                var self=this;
                this.getColumnCount().then(function (colCount) {
                    //return self.getCellElements().then(function (allTableElements) {
                    //allElements = allTableElements;
                    for (var j = 0; j < colCount; j++) {
                        self.getCellHtml(rowIndex, j).then(function (cellHtml) {
                            allRowHtml.push(cellHtml);
                        });
                    }
                    deferred.fulfill(allRowHtml);
                    //});
                });
                return deferred.promise;
            },

            /**
             * Retrieves all records of element value of specified row
             * @method getRowElementValues
             * @param {Integer} rowIndex
             * @return {String}
             */
            getRowElementValues: function (rowIndex) {
                var deferred = protractor.promise.defer();
                var allRowElement = [];
                var allElements=[];
                var self=this;
                return this.getColumnCount().then(function (colCount) {
                    //return self.getCellElements().then(function (allTableElements) {
                    //allElements = allTableElements;
                    for (var j = 0; j < colCount; j++) {
                        self.getCellElement(rowIndex, j).then(function (cellHtml) {
                            allRowElement.push(cellHtml);
                        });
                    }
                    deferred.fulfill(allRowElement);
                    return deferred.promise;
                    //});
                });
            },

            /**
             * Retrieves all cell elements of all table records
             * @method getCellElements
             * @return {String}
             */
            //tested
            getCellElements: function () {
                var deferred = protractor.promise.defer();
                var elems = [];
                var tableElements = [];

                return this.getColumnCount().then(function (columnCount) {
                    return this.getRowCount().then(function (RowCount) {
                        var elementsGrid = tableContainer.all(by.css("div.tr.rows.aha-table px-data-table-cell"));
                        return elementsGrid.then(function (elements, callback) {
                            elements.forEach(function (TabElems, index) {
                                elems.push(TabElems);
                            });
                            var counter = 0;
                            for (var i = 0; i < RowCount; i++) {
                                var columnArray = [];
                                for (var j = 0; j < columnCount; j++) {
                                    columnArray.push(elems[counter]);
                                    counter++;
                                }
                                tableElements.push(columnArray);
                            }
                            deferred.fulfill(tableElements);
                            return deferred.promise;
                        });
                    });
                });
            },

            /**
             * Retrieves cell element value for specified row and column
             * @method getCellElement
             * @param {Integer} rowNumber
             * @param {Integer} columnNumber
             * @return {String}
             */
            //tested
            getCellElement: function (rowNumber, columnNumber) {
                var deferred = protractor.promise.defer();
                //var allElements=[];
                this.getCellElements().then(function (allTableElements) {
                    //allElements = allTableElements;
                    deferred.fulfill(allTableElements[rowNumber][columnNumber]);
                    return deferred.promise;
                });
            },
        }
    };
    module.exports = new PxDataTable
})();