6369
редагувань
Admin (обговорення | внесок) Немає опису редагування |
Admin (обговорення | внесок) Немає опису редагування |
||
| Рядок 325: | Рядок 325: | ||
// 7. ФІЛЬТРИ НАД ТАБЛИЦЕЮ ІГОР | // 7. ФІЛЬТРИ НАД ТАБЛИЦЕЮ ІГОР | ||
// ============================================================ | // ============================================================ | ||
// 7b. BUILD GAMES FILTERS | // 7b. BUILD GAMES FILTERS | ||
// ============================================================ | // ============================================================ | ||
function buildGamesFilters($container, $table) { | function buildGamesFilters($container, $table) { | ||
// Collect events | |||
// Already added? | |||
if ($container.find('.mcc-games-filters').length) return; | |||
// Find table if not valid | |||
if (!$table || !$table.length) { | |||
$table = $container.find('table').first(); | |||
} | |||
if (!$table.length) return; | |||
// Use ALL tr rows (with or without tbody) | |||
var $rows = $table.find('tr').filter(function () { | |||
return $(this).find('td').length > 0; // only data rows | |||
}); | |||
if (!$rows.length) return; | |||
// Collect unique events from first td | |||
var events = []; | var events = []; | ||
$rows.each(function () { | |||
var ev = $(this).find('td').first().text().trim(); | |||
if (ev && events.indexOf(ev) === -1) events.push(ev); | |||
}); | |||
// Build event options | |||
var opts = '<option value="">Всі події</option>'; | var opts = '<option value="">Всі події</option>'; | ||
events.forEach(function (e) { | events.forEach(function (e) { | ||
| Рядок 343: | Рядок 358: | ||
}); | }); | ||
// Build filter bar | // Build the filter bar HTML | ||
var | var barHTML = '<div class="mcc-games-filters">' | ||
+ '<div class="mcc-filter-group">' | |||
'<div class="mcc-filter-group">' | + '<span class="mcc-filter-label">Подія</span>' | ||
' | + '<select class="mcc-filter-select mcc-fe">' + opts + '</select>' | ||
' | + '</div>' | ||
'</div>' | + '<div class="mcc-filter-group">' | ||
'<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>' | + '<div class="mcc-filter-group">' | ||
'<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>' | + '<div class="mcc-filter-group mcc-duration-group">' | ||
'<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>' | ||
'</div>' | + '<span class="mcc-filter-count mcc-fcnt"></span>' | ||
'<span class="mcc-filter-count mcc-fcnt"></span>' | + '</div>'; | ||
'</div>' | |||
// | // Insert at the very top of the container | ||
$container.prepend( | $container.prepend(barHTML); | ||
// Get reference to the just-added bar | |||
var $bar = $container.find('.mcc-games-filters').first(); | |||
function toMins(s) { | function toMins(s) { | ||
s = (s || '').trim(); | s = (s || '').trim(); | ||
var m1 = s.match(/^(\d+):(\d+)$/); | var m1 = s.match(/^(\d+):(\d+)$/); | ||
var m2 = s.match(/(\d+)\s* | if (m1) return parseInt(m1[1]) + parseInt(m1[2]) / 60; | ||
var m2 = s.match(/(\d+)\s*[хh]\s*[вv]\s*(\d+)/); | |||
if (m2) return parseInt(m2[1]) + parseInt(m2[2]) / 60; | |||
return 999; | return 999; | ||
} | } | ||
function doFilter() { | function doFilter() { | ||
var ev = $bar.find('.mcc-fe').val(); | var ev = $bar.find('.mcc-fe').val() || ''; | ||
var rol = $bar.find('.mcc-fr').val(); | var rol = $bar.find('.mcc-fr').val() || ''; | ||
var res = $bar.find('.mcc-frr').val(); | var res = $bar.find('.mcc-frr').val() || ''; | ||
var dur = | var dur = parseFloat($bar.find('.mcc-dur-rng').val()) || 75; | ||
var n = 0; | var n = 0; | ||
$ | |||
var | $rows.each(function () { | ||
var | var $tds = $(this).find('td'); | ||
var evVal = $tds.eq(0).text().trim(); | |||
&& ( | var rolVal = $tds.eq(1).text().trim(); | ||
&& toMins( | var timeVal = $tds.eq(2).text().trim(); | ||
var resVal = $tds.eq(3).text().trim(); | |||
var show = (ev === '' || evVal.indexOf(ev) !== -1) | |||
&& (rol === '' || rolVal.indexOf(rol) !== -1) | |||
&& (res === '' || resVal.indexOf(res) !== -1) | |||
&& toMins(timeVal) <= dur; | |||
$(this).toggle(show); | $(this).toggle(show); | ||
if (show) n++; | if (show) n++; | ||
| Рядок 410: | Рядок 433: | ||
$bar.find('.mcc-dur-rng').on('input', function () { | $bar.find('.mcc-dur-rng').on('input', function () { | ||
var v = | var v = parseFloat($(this).val()); | ||
$bar.find('.mcc-dur-v').text(v + ':00'); | $bar.find('.mcc-dur-v').text(v + ':00'); | ||
$(this).css('background-size', ((v - 20) / 55 * 100) + '% 100%'); | $(this).css('background-size', ((v - 20) / 55 * 100) + '% 100%'); | ||
doFilter(); | doFilter(); | ||
}); | }); | ||
$bar.find('select').on('change', doFilter); | $bar.find('select').on('change', doFilter); | ||
$bar.find('.mcc-fcnt').text($ | $bar.find('.mcc-fcnt').text($rows.length + '\u00a0ігор'); | ||
$bar.find('.mcc-dur-rng').css('background-size', '100% 100%'); | $bar.find('.mcc-dur-rng').css('background-size', '100% 100%'); | ||
} | } | ||
| Рядок 642: | Рядок 666: | ||
function setRboxTop() { | function setRboxTop() { | ||
var $hdr = $('.header-container.header-chrome'); | var $hdr = $('.header-container.header-chrome'); | ||
var h = $hdr.length ? $hdr | var h = $hdr.length ? ($hdr.outerHeight() + 4) : 66; | ||
$('.r-box, .tournament-box, .series-box').css('top', h + 'px'); | $('.r-box, .tournament-box, .series-box').css('top', h + 'px'); | ||
} | } | ||
setRboxTop(); | |||
setTimeout(setRboxTop, | setTimeout(setRboxTop, 300); | ||
$(window).on('resize', setRboxTop); | $(window).on('resize', setRboxTop); | ||
}); | }); | ||
| Рядок 751: | Рядок 774: | ||
history.replaceState(null, null, window.location.pathname); | history.replaceState(null, null, window.location.pathname); | ||
}); | }); | ||
// ============================================================ | // ============================================================ | ||
// | // FILTERS FOR SEASON "Запис ігор" WIDE TABLE | ||
// Runs on page load for static wiki tables | |||
// ============================================================ | // ============================================================ | ||
$(function () { | $(function () { | ||
var $ | // Target the wide game records table on season/tournament pages | ||
if (!$ | var $table = $('.wikitable.wide-table').first(); | ||
if (!$table.length) $table = $('.wikitable.full-width').first(); | |||
if (!$table.length) return; | |||
// Collect rows (with or without tbody) | |||
var $rows = $table.find('tr').filter(function () { | |||
return $(this).find('td').length > 0; | |||
}); | |||
if (!$rows.length) return; | |||
var $ | var results = []; | ||
var $ | $rows.each(function () { | ||
$ | var tds = $(this).find('td'); | ||
// Result is second-to-last td (before the record button) | |||
var r = tds.eq(tds.length - 2).text().trim(); | |||
if (r && results.indexOf(r) === -1) results.push(r); | |||
}); | |||
// Build filter bar | |||
var resOpts = '<option value="">Всі результати</option>'; | |||
results.forEach(function (r) { | |||
resOpts += '<option value="' + r + '">' + r + '</option>'; | |||
}); | |||
var $bar = $( | |||
'<div class="mcc-games-filters">' + | |||
'<div class="mcc-filter-group">' + | |||
'<span class="mcc-filter-label">Результат</span>' + | |||
'<select class="mcc-filter-select sg-res">' + resOpts + '</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 sg-dur" min="30" max="65" value="65" step="1">' + | |||
'<span class="mcc-slider-val sg-durv">65:00</span>' + | |||
'</div>' + | |||
'</div>' + | |||
'<span class="mcc-filter-count sg-cnt"></span>' + | |||
'</div>' | |||
); | |||
// Insert before the table's scroll wrapper (or table itself) | |||
var $target = $table.closest('.mcc-scroll-outer, .mcc-scroll-inner'); | |||
($target.length ? $target : $table).before($bar); | |||
function toMins(s) { | |||
s = (s || '').trim(); | |||
var m = s.match(/(\d+)\s*хв\s*(\d+)/); | |||
if (m) return parseInt(m[1]) + parseInt(m[2]) / 60; | |||
m = s.match(/^(\d+):(\d+)$/); | |||
if (m) return parseInt(m[1]) + parseInt(m[2]) / 60; | |||
return 999; | |||
} | |||
function | function doFilter() { | ||
var | var res = $bar.find('.sg-res').val(); | ||
var dur = parseInt($bar.find('.sg-dur').val()); | |||
var n = 0; | |||
$rows.each(function () { | |||
var tds = $(this).find('td'); | |||
var timeVal = tds.eq(0).text().trim(); | |||
var resVal = tds.eq(tds.length - 2).text().trim(); | |||
var show = (!res || resVal === res) && toMins(timeVal) <= dur; | |||
$(this).toggle(show); | |||
if (show) n++; | |||
}); | |||
$bar.find('.sg-cnt').text(n + '\u00a0ігор'); | |||
} | } | ||
$ | |||
$ | $bar.find('.sg-dur').on('input', function () { | ||
var v = parseInt($(this).val()); | |||
$bar.find('.sg-durv').text(v + ':00'); | |||
$(this).css('background-size', ((v - 30) / 35 * 100) + '% 100%'); | |||
doFilter(); | |||
}); | |||
$bar.find('.sg-res').on('change', doFilter); | |||
$bar.find('.sg-cnt').text($rows.length + '\u00a0ігор'); | |||
$bar.find('.sg-dur').css('background-size', '100% 100%'); | |||
}); | }); | ||
// ============================================================ | |||
// 17. BANNER SEARCH | |||