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

нема опису редагування
Немає опису редагування
Мітка: Ручний відкіт
Немає опису редагування
Рядок 317: Рядок 317:
// ============================================================
// ============================================================
function injectGamesFilters($container, $table) {
function injectGamesFilters($container, $table) {
    if (!$table || !$table.length) return;
    // Шукаємо таблицю якщо передали контейнер без таблиці
    if (!$table.is('table')) {
        $table = $container.find('table.wikitable, table.sortable').first();
    }
     if (!$table.length) return;
     if (!$table.length) return;
    // Не додаємо двічі
     if ($container.find('.mcc-games-filters').length) return;
     if ($container.find('.mcc-games-filters').length) return;
 
    // Збираємо події з першої колонки
     var events = [];
     var events = [];
     $table.find('tbody tr').each(function () {
     $table.find('tbody tr:visible, tbody tr').each(function () {
         var ev = $(this).find('td').eq(0).text().trim();
         var ev = $(this).find('td').eq(0).text().trim();
         if (ev && events.indexOf(ev) === -1) events.push(ev);
         if (ev && events.indexOf(ev) === -1) events.push(ev);
     });
     });
 
     var opts = '<option value="">Всі події</option>';
     var opts = '<option value="">Всі події</option>';
     events.forEach(function (e) { opts += '<option value="' + e + '">' + e + '</option>'; });
     events.slice(0, 30).forEach(function (e) {
 
        opts += '<option value="' + $('<div>').text(e).html() + '">' + $('<div>').text(e).html() + '</option>';
     $table.before(
    });
     var filtersHtml =
         '<div class="mcc-games-filters">'
         '<div class="mcc-games-filters">'
         + '<div class="mcc-filter-group"><span class="mcc-filter-label">Подія</span>'
         + '<div class="mcc-filter-group">'
         +  '<select class="mcc-filter-select" id="mcc-f-event">' + opts + '</select></div>'
        +  '<span class="mcc-filter-label">Подія</span>'
         + '<div class="mcc-filter-group"><span class="mcc-filter-label">Роль</span>'
         +  '<select class="mcc-filter-select" id="mcc-f-event">' + opts + '</select>'
        + '</div>'
         + '<div class="mcc-filter-group">'
        +  '<span class="mcc-filter-label">Роль</span>'
         +  '<select class="mcc-filter-select" id="mcc-f-role">'
         +  '<select class="mcc-filter-select" id="mcc-f-role">'
         +   '<option value="">Всі ролі</option><option value="Мир">Мирний</option>'
         +     '<option value="">Всі ролі</option>'
         +   '<option value="Шер">Шериф</option><option value="Маф">Мафія</option>'
        +    '<option value="Мир">Мирний</option>'
         +   '<option value="Дон">Дон</option></select></div>'
         +     '<option value="Шер">Шериф</option>'
         + '<div class="mcc-filter-group"><span class="mcc-filter-label">Результат</span>'
        +    '<option value="Маф">Мафія</option>'
         +     '<option value="Дон">Дон</option>'
        +  '</select>'
        + '</div>'
         + '<div class="mcc-filter-group">'
        +  '<span class="mcc-filter-label">Результат</span>'
         +  '<select class="mcc-filter-select" id="mcc-f-result">'
         +  '<select class="mcc-filter-select" id="mcc-f-result">'
         +   '<option value="">Всі</option><option value="В">Перемога</option>'
         +     '<option value="">Всі</option>'
         +   '<option value="П">Поразка</option></select></div>'
        +    '<option value="В">Перемога</option>'
         +     '<option value="П">Поразка</option>'
        +  '</select>'
        + '</div>'
         + '<div class="mcc-filter-group mcc-duration-group">'
         + '<div class="mcc-filter-group mcc-duration-group">'
         +  '<span class="mcc-filter-label">Макс. тривалість</span>'
         +  '<span class="mcc-filter-label">Макс. тривалість</span>'
         +  '<div class="mcc-slider-wrap">'
         +  '<div class="mcc-slider-wrap">'
         +    '<input type="range" class="mcc-duration-range" id="mcc-f-dur" min="20" max="70" value="70" step="1">'
         +    '<input type="range" class="mcc-duration-range" id="mcc-f-dur" min="20" max="75" value="75" step="1">'
         +    '<span class="mcc-slider-val" id="mcc-dur-val">70:00</span>'
         +    '<span class="mcc-slider-val" id="mcc-dur-val">75:00</span>'
         +  '</div></div>'
         +  '</div>'
        + '</div>'
         + '<span class="mcc-filter-count" id="mcc-games-count"></span>'
         + '<span class="mcc-filter-count" id="mcc-games-count"></span>'
         + '</div>'
         + '</div>';
     );
 
    // Вставляємо ПЕРЕД таблицею (або перед mcc-scroll-outer якщо вже загорнута)
    var $scrollOuter = $table.closest('.mcc-scroll-outer');
    if ($scrollOuter.length) {
        $scrollOuter.before(filtersHtml);
     } else {
        $table.before(filtersHtml);
    }
    // ── Логіка фільтрації ──
     function toMins(s) {
     function toMins(s) {
         s = (s || '').trim();
         s = (s || '').trim();
Рядок 360: Рядок 392:
         return 999;
         return 999;
     }
     }
 
     function filter() {
     function applyFilters() {
         var ev  = $('#mcc-f-event').val();
         var ev  = $('#mcc-f-event').val();
         var rol = $('#mcc-f-role').val();
         var rol = $('#mcc-f-role').val();
         var res = $('#mcc-f-result').val();
         var res = $('#mcc-f-result').val();
         var dur = +$('#mcc-f-dur').val();
         var dur = +$('#mcc-f-dur').val();
         var n = 0;
         var n   = 0;
         $table.find('tbody tr').each(function () {
         $table.find('tbody tr').each(function () {
             var td = $(this).find('td');
             var $tds = $(this).find('td');
             var show = (!ev || td.eq(0).text().trim().indexOf(ev) !== -1)
             var evVal  = $tds.eq(0).text().trim();
                     && (!rol || td.eq(1).text().trim().indexOf(rol) !== -1)
            var roleVal = $tds.eq(1).text().trim();
                     && (!res || td.eq(3).text().trim().indexOf(res) !== -1)
            var timeVal = $tds.eq(2).text().trim();
                     && toMins(td.eq(2).text()) <= dur;
            var resVal = $tds.eq(3).text().trim();
            var show = (!ev  || evVal.indexOf(ev)   !== -1)
                     && (!rol || roleVal.indexOf(rol) !== -1)
                     && (!res || resVal.indexOf(res)   !== -1)
                     && toMins(timeVal) <= dur;
             $(this).toggle(show);
             $(this).toggle(show);
             if (show) n++;
             if (show) n++;
         });
         });
         $('#mcc-games-count').text(n + ' ігор');
         $('#mcc-games-count').text(n + ' ігор');
     }
     }
 
    // Slider
     $('#mcc-f-dur').on('input', function () {
     $('#mcc-f-dur').on('input', function () {
         var v = +$(this).val();
         var v = +$(this).val();
         $('#mcc-dur-val').text(v + ':00');
         $('#mcc-dur-val').text(v + ':00');
         $(this).css('background-size', ((v - 20) / 50 * 100) + '% 100%');
         $(this).css('background-size', ((v - 20) / 55 * 100) + '% 100%');
         filter();
         applyFilters();
     });
     });
 
     $container.find('.mcc-filter-select').on('change', filter);
    // Dropdowns
 
     $(document).on('change', '#mcc-f-event, #mcc-f-role, #mcc-f-result', applyFilters);
    // Початковий стан
     var total = $table.find('tbody tr').length;
     var total = $table.find('tbody tr').length;
     $('#mcc-games-count').text(total + ' ігор');
     $('#mcc-games-count').text(total + ' ігор');
     $('#mcc-f-dur').css('background-size', '100% 100%');
     $('#mcc-f-dur').css('background-size', '100% 100%');
}
}
// ============================================================
// ============================================================
// 8. ROLE PILLS
// 8. ROLE PILLS