consolidation

Сортировка для объединения предприятий

// ==UserScript==
// @name           consolidation
// @namespace      virtonomica
// @author         ctsigma
// @description    Сортировка для объединения предприятий
// @include        *virtonomica.*/*/window/unit/upgrade/*/consolidation
// @version        1.01
// @grant          none
// ==/UserScript==
var run = function (){

    function sort_col(direction){
        var order = (direction == 'asc') ? 1 : - 1;
        var sortFunc = function(a,b){return (b.val - a.val) * order;};
        units.sort(sortFunc);
        for (var i = units.length - 1; i >= 0; i--) {
            var row = units[i];
            if (row === null) continue;
            $('#' + row.id).appendTo($('.unit-list-2014'));
        }
        $('.asc').find('img').attr('src','/img/up_'+(direction=='asc'?'wh':'gr')+'_sort.png');
        $('.desc').find('img').attr('src','/img/down_'+(direction=='desc'?'wh':'gr')+'_sort.png');
    }

    function NumFormat(N) {
        N += '';
        var parts = N.split('.');
        var int = parts[0];
        var dec = parts.length > 1 ? '.' + parts[1] : '';
        var regexp = /(\d+)(\d{3}(\s|$))/;
        while (regexp.test(int)) {
            int = int.replace(regexp, '$1 $2');
        }
        return int + dec;
    }

    var win = (typeof (unsafeWindow) != 'undefined' ? unsafeWindow : top.window);
    var $ = win.$;

    var asc_btn = $('<div class="asc" title="сортировка по возрастанию"><a><img src="/img/up_gr_sort.png" style="cursor: pointer; display: table-row" id="sort_asc_btn"></a></div>').click(function () {sort_col('asc');});
    var desc_btn = $('<div class="desc" title="сортировка по убыванию"><a><img src="/img/down_gr_sort.png" style="cursor: pointer; display: table-row" id="sort_desc_btn"></a></div>').click(function () {sort_col('desc');});
    var cell = $('.unit-list-2014 th:eq(2)');
    var header = cell.html();
    cell.before($('<th></th>'));
    cell.empty().append($('<div style="display: table-row">').append(header).append($('<div style="display: table-cell">').append(asc_btn).append(desc_btn)));
    var units = [];
    $('.required_employee').after($('<div class="new_required_employee"></div>').css({'color':'red', 'position':'absolute', 'right':'90px', 'top':'35px'}));
    /\/(.+?)\/.+?(\d+)/.exec(location.pathname);
    var unit_id = RegExp.$2;
    var realm = RegExp.$1;
    var apiSummaryUrl = location.origin + '/api/%realm%/main/unit/summary'.replace('%realm%',realm);
    var summary = {};
    var list = {};
    $.ajax({
        url: apiSummaryUrl,
        dataType: 'json',
        async: false,
        data: {id:unit_id},
        success: function(data){
            summary = data;
            if (summary.company_id != null){
                var apiListUrl = location.origin + '/api/%realm%/main/company/units'.replace('%realm%',realm);
                $.ajax({
                    url: apiListUrl,
                    dataType: 'json',
                    async: false,
                    data: {id:summary.company_id, unit_type_id:summary.unit_type_id, pagesize:'9999'},
                    success: function(data){list = data.data;}
                });
            }
        }
    });

    $('.unit-list-2014 input[name*="consolidation"]').closest('tr').each(function (id){
        var cells = $('td', this);
        var size = parseInt($(cells[2]).text().replace(/\D+/g,''));
        // подготовим сортировку
        $(this).attr('id',id);
        units[units.length] = {id:id,val:size};
        // отобразим индикатор отпуска
        var unit_id = $('.info a:eq(0)',this).attr('href').replace(/\D+/g,'');
        var icon = $('<td>');
        if (typeof(list[unit_id]) != 'undefined') {
            if (list[unit_id].productivity == 0) icon = $(icon).append($('<img src="/img/unit_indicator/workers_in_holiday.gif" title="Персонал предприятия в отпуске">'));
        }
        $('td:eq(1)',this).after(icon);
        // подготовим расчет ожидаемого размера
        $('input[name*="consolidation"]',this).change(function() {
            var total = 0;
            $('.unit-list-2014 input[name*="consolidation"]:checked').closest('tr').each(function(){
                var cells = $('td', this);
                total = total + parseInt($(cells[3]).text().replace(/\D+/g,''));
            });
            var new_size = $('.new_required_employee').empty();
            if (total > 0) {
                total = total + parseInt($('.required_employee').text().replace(/\D+/g,''));
                new_size.text('Ожидаемый размер: ' + NumFormat(total));
            }
        });
    });
};
var script = document.createElement('script');
script.textContent = '(' + run.toString() + ')();';
document.documentElement.appendChild(script);