{#
{#/**
* @file
* Twitter Bootstrap v4-beta.2 Sliding pagination control implementation.
*
* View that can be used with the pagination module
* from the Twitter Bootstrap CSS Toolkit
* https://getbootstrap.com/docs/4.0/components/pagination/
*
*/
#}
{%- macro _pagination_path(route, query, pageParameterName, page_number) -%}
{%- set city = app.request.attributes.get('city', default_city()) -%}
{%- if page_number == 1 -%}
{%- set _route = route -%}
{%- set _query = query|filter((v, k) => k != pageParameterName) -%}
{%- else -%}
{%- set _route = route~'._pagination' -%}
{%- set _query = query|merge({(pageParameterName): page_number}) -%}
{%- endif -%}
{%- set _query = _query|merge({'city': city.uriIdentity}) -%}
{{- path(_route, _query) -}}
{%- endmacro -%}
{% from _self import _pagination_path %}
<div id="pagination_container">
{% if pageCount > 1 %}
<nav class="pagination">
{% set classAlign = (align is not defined) ? '' : align=='center' ? ' justify-content-center' : (align=='right' ? ' justify-content-end' : '') %}
{% set classSize = (size is not defined) ? '' : size=='large' ? ' pagination-lg' : (size=='small' ? ' pagination-sm' : '') %}
<ul class="pagination__list d-flex">
{% if previous is defined %}
<li class="pagination__item rounding pagination__item-prev">
<a class="pagination__link" rel="prev" href="{{ _pagination_path(route, query, pageParameterName, previous) }}" aria-label="Ссылка на предыдущую страницу" data-page="{{previous}}">{#« {{ 'label_previous'|trans({}, 'KnpPaginatorBundle') }}#}
<svg class="icon">
<use xlink:href="{{ asset('assets_domain/images/icons/svg-library.svg', 'nodomainConfig') }}#icon-arrow-left"></use>
</svg>
</a>
</li>
{% else %}
<li class="pagination__item rounding pagination__item--disabled">
<span class="pagination__link d-flex">
{#« {{ 'label_previous'|trans({}, 'KnpPaginatorBundle') }}#}
<svg class="icon">
<use xlink:href="{{ asset('assets_domain/images/icons/svg-library.svg', 'nodomainConfig') }}#icon-arrow-left"></use>
</svg>
</span>
</li>
{% endif %}
{% if startPage > 1 %}
<li class="pagination__item rounding">
<a class="pagination__link" href="{{ _pagination_path(route, query, pageParameterName, 1) }}" aria-label="Ссылка на первую страницу">1</a>
</li>
{% if startPage == 3 %}
<li class="pagination__item rounding">
<a class="pagination__link" href="{{ _pagination_path(route, query, pageParameterName, 2) }}" aria-label="Ссылка на вторую страницу">2</a>
</li>
{% elseif startPage != 2 %}
<li class="pagination__item rounding pagination__item_spacer">
<div class="pagination__link d-flex">...</div>
</li>
{% endif %}
{% endif %}
{% for page in pagesInRange %}
{% if page != current %}
<li class="pagination__item rounding">
<a class="pagination__link" href="{{ _pagination_path(route, query, pageParameterName, page) }}" aria-label="Ссылка на {{ page }} страницу">{{ page }}</a>
</li>
{% else %}
<li class="pagination__item rounding pagination__item_first pagination__item_active">
<a href="#" class="pagination__link" aria-label="Неактивная ссылка">{{ page }}</a>
</li>
{% endif %}
{% endfor %}
{% if pageCount > endPage %}
{% if pageCount > (endPage + 1) %}
{% if pageCount > (endPage + 2) %}
<li class="pagination__item rounding pagination__item_spacer">
<div class="pagination__link">...</div>
</li>
{% else %}
<li class="pagination__item rounding">
<a class="pagination__link" href="{{ _pagination_path(route, query, pageParameterName, (pageCount - 1)) }}" aria-label="Ссылка на {{ pageCount -1 }} страницу">{{ pageCount -1 }}</a>
</li>
{% endif %}
{% endif %}
<li class="pagination__item rounding" data-show="true">
<a class="pagination__link" href="{{ _pagination_path(route, query, pageParameterName, pageCount) }}" aria-label="Ссылка на {{ pageCount }} страницу">{{ pageCount }}</a>
</li>
{% endif %}
{% if next is defined %}
<li class="pagination__item rounding pagination__item-next">
<a class="pagination__link" rel="next" href="{{ _pagination_path(route, query, pageParameterName, next) }}" aria-label="Ссылка на следующую страницу" data-page="{{next}}">
<svg class="icon">
<use xlink:href="{{ asset('assets_domain/images/icons/svg-library.svg', 'nodomainConfig') }}#icon-arrow-right"></use>
</svg>
</a>
</li>
{% else %}
<li class="pagination__item rounding pagination__item--disabled">
<span class="pagination__link">
<svg class="icon">
<use xlink:href="{{ asset('assets_domain/images/icons/svg-library.svg', 'nodomainConfig') }}#icon-arrow-right"></use>
</svg>
</span>
</li>
{% endif %}
</ul>
</nav>
<script>
function paginationChecked() {
{#
В мобильной версии нам нужно показывать пункты +- 1 от текущей, стрелочки
и точки если пунктов больше в текущем направлении
#}
const paginationList = document.querySelector('.pagination__list');
const activeEl = paginationList.querySelector('.pagination__item_active');
const previousActiveEl = activeEl.previousElementSibling;
const nextActiveEl = activeEl.nextElementSibling;
//const dotMarkup = `<li class="pagination__item rounding pagination__item--dot pagination__item--disabled pagination__item--mobile-active"><span class="pagination__link">…</span></li>`;
[...paginationList.children].forEach(el => {
if (el.dataset.show) el.classList.add('pagination__item--mobile-active');
el.addEventListener('click',() => {
document.dispatchEvent(new CustomEvent("fetchSimilar:trigger", { detail: { type: 'recommendation' }}));
})
})
{#// Проверяем элементы позади#}
if (elementCheck(previousActiveEl, 'pagination__item-prev')) {
if (nextActiveEl) nextActiveEl.classList.add('pagination__item--mobile-active');
const prePreviousActiveEl = previousActiveEl.previousElementSibling;
if (prePreviousActiveEl && elementCheck(prePreviousActiveEl, 'pagination__item-prev') && (+activeEl.innerText > 3) && !prePreviousActiveEl.previousElementSibling.classList.contains('pagination__item--dot')) {
{#// добавить многоточие#}
appendDotPagination(previousActiveEl, false);
}
}
{#// Проверяем элементы впереди#}
if (elementCheck(nextActiveEl, 'pagination__item-next')) {
const nextNextActiveEl = nextActiveEl.nextElementSibling;
if (elementCheck(nextNextActiveEl, 'pagination__item-next') && checkNextPlace(activeEl) && !nextNextActiveEl.nextElementSibling.classList.contains('pagination__item--dot')) {// && (+nextNextActiveEl.innerText < 3)
{#// добавить многоточие#}
appendDotPagination(nextNextActiveEl, true);
}
}
{#/**
* Проверка текущего предыдущего элемента
*
* element - элемент для проверки
* return - элемент соответствует критериям?
*/#}
function elementCheck(element, className) {
if (element && !element.classList.contains(className)) {
element.classList.add('pagination__item--mobile-active');
return true;
}
return false;
}
{#/**
* Генератор многоточия
*
*/#}
function appendDotPagination(element, isNext = false){
const liTemp = document.createElement('li');
element.parentElement.insertBefore(liTemp, isNext ? element.nextElementSibling : element.previousElementSibling);
//liTemp.outerHTML = dotMarkup;
}
{#/**
* Проверка на необходимости вставки многоточия впереди
* Если впереди больше 4 элементов - можно вставлять
*
*/#}
function checkNextPlace(element) {
const countToCheck = 4;
let i = 0;
for (; i < 4; i++){
if (element.nextElementSibling) {
element = element.nextElementSibling;
} else {
break;
}
}
return i === 4
}
}
paginationChecked();
document.addEventListener('showmore:trigger', paginationChecked.bind())
document.addEventListener('ajaxLoadEnd', paginationChecked.bind())
</script>
{% endif %}
</div>