{#
    Sortable table headers ('<th></th>' blocks)

    If you're using this macro then you must comply with convention and use following query parameters:
        - query - search query
        - page - current page for pager
        - order-by - which column is currently used for orderring
        - order - order direction ('asc' or 'desc')

    'columns' argument must be an associative array like:
        'Human readable column name' => 'propertyName'
#}
{% macro sortable_columns(columns) %}
    {% set route = app.request.attributes.get('_route') %}
    {% set query = app.request.query.get('query') %}
    {% set page = app.request.query.get('page') %}
    {% set orderBy = app.request.query.get('order-by') %}
    {% set order = app.request.query.get('order') %}
    {% for column, property in columns %}
        {% set isCurrent = (property == orderBy) %}
        <th scope="col">
            {% if property is not null %}
            <a href="{{ path(route, {
                'query': query,
                'page': page,
                'order-by': property,
                'order': (order and isCurrent) ? ('desc' == order|lower ? 'asc' : 'desc') : 'desc'
            }) }}">
                {% if order and isCurrent %}
                    <i class="fas fa-sort-{% if 'asc' == order|lower %}down{% elseif 'desc' == order|lower %}up{% endif %}"></i>
                {% endif %}
                {% if isCurrent %}<b>{% endif %}{{ column | raw }}{% if isCurrent %}</b>{% endif %}
            </a>
            {% else %}
                {{ column | raw }}
            {% endif %}
        </th>
    {% endfor %}
{% endmacro %}