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

assets.js.views.google.GoogleTargetControllerGrid.js Maven / Gradle / Ivy

/* 
 * Serposcope - SEO rank checker https://serposcope.serphacker.com/
 * 
 * Copyright (c) 2016 SERP Hacker
 * @author Pierre Nogues 
 * @license https://opensource.org/licenses/MIT MIT License
 */

/* global serposcope, Slick */

serposcope.googleTargetControllerGrid = function () {

    var UNRANKED = 32767;
    var COL_WIDTH = 21;
    
    var COL_ID = 0;
    var COL_SEARCH = 1;
    var COL_SEARCH_KEYWORD = 0;
    var COL_SEARCH_COUNTRY = 1;
    var COL_SEARCH_DEVICE = 2;
    var COL_SEARCH_LOCAL = 3;
    var COL_SEARCH_DATACENTER = 4;
    var COL_SEARCH_CUSTOM = 5;
    var COL_BEST = 2;
    var COL_BEST_RANK = 0;
    var COL_BEST_DAY = 1;
    var COL_BEST_URL = 2;
    var COL_EVENTS = 3;
    var COL_EVENTS_TITLE=0;
    var COL_EVENTS_DESCRIPTION=1;
    var COL_RANK = 3;
    var COL_RANK_CURRENT = 0;
    var COL_RANK_PREVIOUS = 1;
    var COL_RANK_URL = 2;

    var grid = null;
    var dataView = null;

    var filter = {
        keyword: '',
        country: '',
        device: '',
        local: '',
        datacenter: '',
        custom: ''
    };

    // provided by API
    var days = [];
    var data = [];
    var groupId = 1;
    var startDate;
    var endDate;
    // end    

    var resize = function (height) {
        $('#google-target-table-container').css("min-height", (height) + "px");
        if (grid != null) {
            grid.resizeCanvas();
        }
    };

    var render = function () {
        if (document.getElementById("google-target-table-container") == null) {
            return;
        }
        $('#filter-apply').click(applyFilter);
        $('#filter-reset').click(resetFilter);
        fetchData();
    };
    
    var fetchData = function(){
        groupId = $('#csp-vars').attr('data-group-id');
        startDate = $('#csp-vars').data('start-date');
        endDate = $('#csp-vars').data('end-date');   
        if(startDate == "" || endDate == ""){
            $("#google-target-table-container").html("no data");
            return;
        }        
        var targetId = $('#csp-vars').data('target-id');
        var url = "/google/" + groupId + "/target/" + targetId + "/ranks?startDate=" + startDate + "&endDate=" + endDate;
        $.getJSON(url)
        .done(function (json) {
            $(".ajax-loader").remove();
            data = json[0];
            days = json[1];
            renderGrid();
        }).fail(function (err) {
            $(".ajax-loader").remove();
            console.log("error", err);
            $("#google-target-table-container").html("error");
        });
    };

    var renderGrid = function () {
        var options = {
            explicitInitialization: true,
            enableColumnReorder: false,
            enableTextSelectionOnCells: true
        };

        var columns = [{
                id: "search",
                name: '',
                field: "id", width: 250, formatter: formatSearchCell, sortable: true
            }];
        for (var i = 0; i < days.length; i++) {
            var day = days[i];
            columns.push({
                id: day,
                name: "" + day.split("-")[2] + "",
                field: i,
                sortable: true,
                width: COL_WIDTH,
                formatter: formatGridCell
            });
        }
        columns.push({
            id: "best",
            name: '',
            field: "best", width: COL_WIDTH, formatter: formatBestCell, sortable: true
        });

        dataView = new Slick.Data.DataView();
        grid = new Slick.Grid("#google-target-table-container", dataView, columns, options);
        
        grid.onSort.subscribe(gridSort);

        dataView.onRowCountChanged.subscribe(function (e, args) {
            grid.updateRowCount();
            grid.render();
        });
        dataView.onRowsChanged.subscribe(function (e, args) {
            grid.invalidateRows(args.rows);
            grid.render();
        });

        grid.init();
        dataView.beginUpdate();
        dataView.setItems(data, 0);
        dataView.setFilter(filterGrid);
        dataView.endUpdate();
    };

    var gridSort = function (e, args) {
        var comparer = function (a, b) {
            if (a[COL_ID] == -1) {
                return args.sortAsc ? -1 : 1;
            }
            if (b[COL_ID] == -1) {
                return args.sortAsc ? 1 : -1;
            }
            switch (args.sortCol.field) {
                case "id":
                    return a[COL_SEARCH][COL_SEARCH_KEYWORD] > b[COL_SEARCH][COL_SEARCH_KEYWORD] ? 1 : -1;
                case "best":
                    return a[COL_BEST][COL_BEST_RANK] - b[COL_BEST][COL_BEST_RANK];
                default:
                    var aRank = a[COL_RANK][args.sortCol.field] === 0 ? UNRANKED : a[COL_RANK][args.sortCol.field][COL_RANK_CURRENT];
                    var bRank = b[COL_RANK][args.sortCol.field] === 0 ? UNRANKED : b[COL_RANK][args.sortCol.field][COL_RANK_CURRENT];
                    return aRank - bRank;
            }
        };
        dataView.sort(comparer, args.sortAsc);
    };

    var applyFilter = function () {
        filter.keyword = $('#filter-keyword').val().toLowerCase();
        filter.country = $('#filter-country').val().toLowerCase();
        filter.device = $('#filter-device').val();
        filter.local = $('#filter-local').val().toLowerCase();
        filter.datacenter = $('#filter-datacenter').val().toLowerCase();
        filter.custom = $('#filter-custom').val().toLowerCase();
        dataView.refresh();
    };

    var resetFilter = function () {
        $('#filter-keyword').val('');
        $('#filter-country').val('');
        $('#filter-device').val('');
        $('#filter-local').val('');
        $('#filter-datacenter').val('');
        $('#filter-custom').val('');
        applyFilter();
    };

    var filterGrid = function (item) {
        var search = item[COL_SEARCH];
        if (search === 0) {
            return true;
        }

        if (filter.keyword !== '' && search[COL_SEARCH_KEYWORD].toLowerCase().indexOf(filter.keyword) === -1) {
            return false;
        }

        if (filter.device !== '' && search[COL_SEARCH_DEVICE] != filter.device) {
            return false;
        }

        if (filter.country !== '' && search[COL_SEARCH_COUNTRY].toLowerCase() != filter.country.toLowerCase()) {
            return false;
        }

        if (filter.local !== '' && search[COL_SEARCH_LOCAL].toLowerCase().indexOf(filter.local) === -1) {
            return false;
        }

        if (filter.datacenter !== '' && search[COL_SEARCH_DATACENTER] != filter.datacenter) {
            return false;
        }

        if (filter.custom !== '' && search[COL_SEARCH_CUSTOM].toLowerCase().indexOf(filter.custom) === -1) {
            return false;
        }

        return true;
    };

    var formatSearchCell = function (row, col, unk, colDef, rowData) {
        var search = rowData[COL_SEARCH];
        if (search === 0) {
            return "
  Calendar
"; } var ret = "
"; ret += ""; if (search[COL_SEARCH_DEVICE] === "M") { ret += ""; } if (search[COL_SEARCH_LOCAL] != "") { ret += ""; } if (search[COL_SEARCH_DATACENTER] != "") { ret += ""; } if (search[COL_SEARCH_CUSTOM] != "") { ret += ""; } ret += " " + search[COL_SEARCH_KEYWORD] + ""; ret += "
"; return ret; }; var formatGridCell = function (row, col, unk, colDef, rowData) { if (row == 0) { return formatCalendarCell(row, col, unk, colDef, rowData); } else { return formatRankCell(row, col, unk, colDef, rowData); } }; var formatCalendarCell = function (row, col, unk, colDef, rowData) { var event = rowData[COL_EVENTS][col-1]; if (event === 0) { return null; } return '
' + '' + '
'; }; var formatRankCell = function (row, col, unk, colDef, rowData) { var rank = rowData[COL_RANK][col - 1]; var diffText = "", diffClass = ""; var bestClass = "", bestText = ""; var rankText = ""; if(rank === 0){ rankText = "-"; diffText = "out"; diffClass = "minus"; } else { rankText = rank[COL_RANK_CURRENT]; var rankDiff = rank[COL_RANK_PREVIOUS] - rank[COL_RANK_CURRENT]; if (rank[COL_RANK_PREVIOUS] == UNRANKED && rank[COL_RANK_CURRENT] != UNRANKED) { diffText = "in"; diffClass = "plus"; } else if (rankDiff == 0) { diffText = "="; } else if (rankDiff > 0) { diffText = "+" + rankDiff; diffClass = "plus"; } else { diffText = rankDiff; diffClass = "minus"; } if(rowData[COL_BEST] !== 0 && rowData[COL_BEST][COL_BEST_RANK] == rank[COL_RANK_CURRENT]){ bestClass = "best-cell"; bestText = " (best)"; } } var rankUrl = rank[COL_RANK_URL] == null ? "not provided" : serposcope.utils.escapeHTMLQuotes(rank[COL_RANK_URL]); return '
' + rankText + '
'; }; var formatBestCell = function (row, col, unk, colDef, rowData) { if (row === 0) { return ""; } var best = rowData[COL_BEST]; var rankText = (best[COL_BEST_RANK] == UNRANKED ? "-" : best[COL_BEST_RANK]); return '
' + rankText + '
'; }; var oPublic = { resize: resize, render: render }; return oPublic; }();




© 2015 - 2025 Weber Informatics LLC | Privacy Policy