MediaWiki:Common.js: відмінності між версіями

нема опису редагування
Немає опису редагування
Немає опису редагування
Рядок 288: Рядок 288:
                             $content.data('loaded', true);
                             $content.data('loaded', true);


                            // Let DOM render completely before processing
                             setTimeout(function () {
                             setTimeout(function () {
                                 var $table = $content.find('table').first();
                                 var $table = $content.find('table').first();
Рядок 298: Рядок 297:
                                 applyRolePills($content);
                                 applyRolePills($content);
                                 wrapWideTables($content);
                                 wrapWideTables($content);
                                 injectGamesFilters($content, $table);
 
                                 // Inject filters directly at top of content
                                if (!$content.find('.mcc-games-filters').length) {
                                    buildGamesFilters($content, $table);
                                }
                                 $(document).trigger('mcc:content-loaded');
                                 $(document).trigger('mcc:content-loaded');
                             }, 50);
                             }, 100);
                         },
                         },
                         error: function () {
                         error: function () {
Рядок 321: Рядок 324:
// ============================================================
// ============================================================
// 7. ФІЛЬТРИ НАД ТАБЛИЦЕЮ ІГОР
// 7. ФІЛЬТРИ НАД ТАБЛИЦЕЮ ІГОР
// ============================================================
// 7b. BUILD GAMES FILTERS — простий надійний варіант
// Завжди вставляє фільтри на початок $container
// ============================================================
function buildGamesFilters($container, $table) {
    // Collect events
    var events = [];
    if ($table && $table.length) {
        $table.find('tbody tr').each(function () {
            var ev = $(this).find('td').eq(0).text().trim();
            if (ev && events.indexOf(ev) === -1) events.push(ev);
        });
    }
    var opts = '<option value="">Всі події</option>';
    events.forEach(function (e) {
        opts += '<option value="' + e + '">' + e + '</option>';
    });
    // Build filter bar and PREPEND to container
    var $bar = $([
        '<div class="mcc-games-filters" style="display:flex">',
        '<div class="mcc-filter-group">',
        '  <span class="mcc-filter-label">Подія</span>',
        '  <select class="mcc-filter-select mcc-fe">' + opts + '</select>',
        '</div>',
        '<div class="mcc-filter-group">',
        '  <span class="mcc-filter-label">Роль</span>',
        '  <select class="mcc-filter-select mcc-fr">',
        '    <option value="">Всі ролі</option>',
        '    <option value="Мир">Мирний</option>',
        '    <option value="Шер">Шериф</option>',
        '    <option value="Маф">Мафія</option>',
        '    <option value="Дон">Дон</option>',
        '  </select>',
        '</div>',
        '<div class="mcc-filter-group">',
        '  <span class="mcc-filter-label">Результат</span>',
        '  <select class="mcc-filter-select mcc-frr">',
        '    <option value="">Всі</option>',
        '    <option value="В">Перемога</option>',
        '    <option value="П">Поразка</option>',
        '  </select>',
        '</div>',
        '<div class="mcc-filter-group mcc-duration-group">',
        '  <span class="mcc-filter-label">Макс. тривалість</span>',
        '  <div class="mcc-slider-wrap">',
        '    <input type="range" class="mcc-duration-range mcc-dur-rng" min="20" max="75" value="75" step="1">',
        '    <span class="mcc-slider-val mcc-dur-v">75:00</span>',
        '  </div>',
        '</div>',
        '<span class="mcc-filter-count mcc-fcnt"></span>',
        '</div>'
    ].join(''));
    // Prepend to tab content (always visible, before any table)
    $container.prepend($bar);
    if (!$table || !$table.length) return;
    function toMins(s) {
        s = (s || '').trim();
        var m1 = s.match(/^(\d+):(\d+)$/);  if (m1) return +m1[1] + +m1[2]/60;
        var m2 = s.match(/(\d+)\s*хв\s*(\d+)/); if (m2) return +m2[1] + +m2[2]/60;
        return 999;
    }
    function doFilter() {
        var ev  = $bar.find('.mcc-fe').val();
        var rol = $bar.find('.mcc-fr').val();
        var res = $bar.find('.mcc-frr').val();
        var dur = +$bar.find('.mcc-dur-rng').val();
        var n = 0;
        $table.find('tbody tr').each(function () {
            var td  = $(this).find('td');
            var show = (!ev  || td.eq(0).text().trim().indexOf(ev)  !== -1)
                    && (!rol || td.eq(1).text().trim().indexOf(rol) !== -1)
                    && (!res || td.eq(3).text().trim().indexOf(res) !== -1)
                    && toMins(td.eq(2).text()) <= dur;
            $(this).toggle(show);
            if (show) n++;
        });
        $bar.find('.mcc-fcnt').text(n + '\u00a0ігор');
    }
    $bar.find('.mcc-dur-rng').on('input', function () {
        var v = +$(this).val();
        $bar.find('.mcc-dur-v').text(v + ':00');
        $(this).css('background-size', ((v - 20) / 55 * 100) + '% 100%');
        doFilter();
    });
    $bar.find('select').on('change', doFilter);
    $bar.find('.mcc-fcnt').text($table.find('tbody tr').length + '\u00a0ігор');
    $bar.find('.mcc-dur-rng').css('background-size', '100% 100%');
}
// ============================================================
// ============================================================
function injectGamesFilters($container, $table) {
function injectGamesFilters($container, $table) {
Рядок 542: Рядок 641:
$(function () {
$(function () {
     function setRboxTop() {
     function setRboxTop() {
         var h = $('.header-container.header-chrome').outerHeight() || 56;
         var $hdr = $('.header-container.header-chrome');
        var h = $hdr.length ? $hdr[0].getBoundingClientRect().bottom : 64;
        h = Math.max(h, 56);
         $('.r-box, .tournament-box, .series-box').css('top', h + 'px');
         $('.r-box, .tournament-box, .series-box').css('top', h + 'px');
     }
     }
     setRboxTop();
     // Run after full paint
    setTimeout(setRboxTop, 0);
     $(window).on('resize', setRboxTop);
     $(window).on('resize', setRboxTop);
});
});