Finally fixed pager behavior.
This commit is contained in:
parent
d55539192e
commit
52bd0d4c91
3 changed files with 34 additions and 25 deletions
|
|
@ -55,34 +55,32 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</nav>
|
</nav>
|
||||||
#}
|
#}
|
||||||
<nav class="mt-3">
|
{% set p = page|int %}
|
||||||
|
{% set pg = pages|int %}
|
||||||
|
{% set prev = [1, p-1]|max %}
|
||||||
|
{% set nxt = [pg, p+1]|min %}
|
||||||
|
|
||||||
|
<nav class="mt-3" aria-label="Pagination">
|
||||||
<ul class="pagination justify-content-center bg-white">
|
<ul class="pagination justify-content-center bg-white">
|
||||||
<li class="page-item {%- if page <= 1 %} disabled{% endif %}">
|
<li class="page-item{{ ' disabled' if p <= 1 }}">
|
||||||
<a class="page-link"
|
<a class="page-link"
|
||||||
hx-get="/ui/{{ model }}/frag/rows?page={{ page - 1 }}&per_page={{ per_page }}{% if sort %}&sort={{ sort }}{% endif %}{% if fields_csv %}&fields_csv={{ fields_csv|urlencode }}{% endif %}{% for k,v in filters.items() %}&{{k}}={{ v|urlencode }}{% endfor %}"
|
hx-get="/ui/{{ model }}/frag/rows?page={{ prev }}&per_page={{ per_page }}{% if sort %}&sort={{ sort }}{% endif %}{% if fields_csv %}&fields_csv={{ fields_csv|urlencode }}{% endif %}{% for k,v in (filters or {}).items() %}&{{k}}={{ v|urlencode }}{% endfor %}"
|
||||||
hx-target="#rows" hx-swap="innerHTML" {%- if page <=1 %} hx-disable{% endif %}
|
hx-target="#rows" hx-swap="innerHTML"
|
||||||
hx-on:click="document.querySelector('#pager-state input[name=page]').value='{{ max(1, page-1) }}'">Prev</a>
|
hx-on:click="document.querySelector('#pager-state input[name=page]').value='{{ prev }}'">
|
||||||
|
Prev
|
||||||
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="page-item {%- if page <= 1 %} disabled{% endif %}">
|
|
||||||
|
<li class="page-item{{ ' disabled' if p >= pg }}">
|
||||||
<a class="page-link"
|
<a class="page-link"
|
||||||
hx-get="/ui/{{ model }}/frag/rows?page=1&per_page={{ per_page }}{% if sort %}&sort={{ sort }}{% endif %}{% if fields_csv %}&fields_csv={{ fields_csv|urlencode }}{% endif %}{% for k,v in filters.items() %}&{{k}}={{ v|urlencode }}{% endfor %}"
|
hx-get="/ui/{{ model }}/frag/rows?page={{ nxt }}&per_page={{ per_page }}{% if sort %}&sort={{ sort }}{% endif %}{% if fields_csv %}&fields_csv={{ fields_csv|urlencode }}{% endif %}{% for k,v in (filters or {}).items() %}&{{k}}={{ v|urlencode }}{% endfor %}"
|
||||||
hx-target="#rows" hx-swap="innerHTML" {%- if page <=1 %} hx-disable{% endif %}>1</a>
|
hx-target="#rows" hx-swap="innerHTML"
|
||||||
</li>
|
hx-on:click="document.querySelector('#pager-state input[name=page]').value='{{ nxt }}'">
|
||||||
{% if pages > 1 %}
|
Next
|
||||||
<li class="page-item"><a class="page-link">...</a></li>
|
</a>
|
||||||
<li class="page-item"><a class="page-link">...</a></li>
|
|
||||||
<li class="page-item {%- if page >= pages %} disabled{% endif %}">
|
|
||||||
<a class="page-link"
|
|
||||||
hx-get="/ui/{{ model }}/frag/rows?page={{ pages }}&per_page={{ per_page }}{% if sort %}&sort={{ sort }}{% endif %}{% if fields_csv %}&fields_csv={{ fields_csv|urlencode }}{% endif %}{% for k,v in filters.items() %}&{{k}}={{ v|urlencode }}{% endfor %}"
|
|
||||||
hx-target="#rows" hx-swap="innerHTML" {%- if page>= pages %} hx-disable{% endif %}>{{ pages }}</a>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
<li class="page-item {%- if page >= pages %} disabled{% endif %}">
|
|
||||||
<a class="page-link"
|
|
||||||
hx-get="/ui/{{ model }}/frag/rows?page={{ page + 1 }}&per_page={{ per_page }}{% if sort %}&sort={{ sort }}{% endif %}{% if fields_csv %}&fields_csv={{ fields_csv|urlencode }}{% endif %}{% for k,v in filters.items() %}&{{k}}={{ v|urlencode }}{% endfor %}"
|
|
||||||
hx-target="#rows" hx-swap="innerHTML" {%- if page>= pages %} hx-disable{% endif %}>Next</a>
|
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
<span>Page {{ p }} / {{ pg }}</span>
|
||||||
</nav>
|
</nav>
|
||||||
{%- endmacro %}
|
{%- endmacro %}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,8 @@ from ..service import CrudService
|
||||||
from ..eager import default_eager_policy
|
from ..eager import default_eager_policy
|
||||||
from .type_map import build_form_schema
|
from .type_map import build_form_schema
|
||||||
|
|
||||||
|
Session = None
|
||||||
|
|
||||||
def make_fragments_blueprint(db_session_factory, registry: Dict[str, Any], *, name="frags"):
|
def make_fragments_blueprint(db_session_factory, registry: Dict[str, Any], *, name="frags"):
|
||||||
"""
|
"""
|
||||||
HTML fragments for HTMX/Alpine. No base pages. Pure partials:
|
HTML fragments for HTMX/Alpine. No base pages. Pure partials:
|
||||||
|
|
@ -20,8 +22,18 @@ def make_fragments_blueprint(db_session_factory, registry: Dict[str, Any], *, na
|
||||||
GET /<model>/frag/rows -> <tr>...</tr> + pager markup if wanted
|
GET /<model>/frag/rows -> <tr>...</tr> + pager markup if wanted
|
||||||
GET /<model>/frag/form -> <form>...</form> (auto-generated)
|
GET /<model>/frag/form -> <form>...</form> (auto-generated)
|
||||||
"""
|
"""
|
||||||
|
global Session
|
||||||
|
if Session is None:
|
||||||
|
Session = scoped_session(db_session_factory)
|
||||||
|
|
||||||
bp = Blueprint(name, __name__, template_folder="templates")
|
bp = Blueprint(name, __name__, template_folder="templates")
|
||||||
def session(): return scoped_session(db_session_factory)()
|
|
||||||
|
def session():
|
||||||
|
return Session
|
||||||
|
|
||||||
|
@bp.teardown_app_request
|
||||||
|
def remove_session(exc=None):
|
||||||
|
Session.remove()
|
||||||
|
|
||||||
def _parse_filters(args):
|
def _parse_filters(args):
|
||||||
reserved = {"page", "per_page", "sort", "expand", "fields", "value", "label", "label_tpl", "fields_csv", "li_label", "li_sublabel"}
|
reserved = {"page", "per_page", "sort", "expand", "fields", "value", "label", "label_tpl", "fields_csv", "li_label", "li_sublabel"}
|
||||||
|
|
|
||||||
|
|
@ -77,8 +77,7 @@ refresh_url=none, model=none, sort=none) %}
|
||||||
</thead>
|
</thead>
|
||||||
<tbody id="rows"
|
<tbody id="rows"
|
||||||
hx-get="/ui/{{ model }}/frag/rows?page={{ page }}&per_page={{ per_page }}&fields_csv={{ fields|join(',') }}"
|
hx-get="/ui/{{ model }}/frag/rows?page={{ page }}&per_page={{ per_page }}&fields_csv={{ fields|join(',') }}"
|
||||||
hx-trigger="load" hx-target="#rows" hx-swap="innerHTML">
|
hx-trigger="load" hx-target="#rows" hx-swap="innerHTML"></tbody>
|
||||||
</tbody>
|
|
||||||
</table>
|
</table>
|
||||||
<div id="pager-state">
|
<div id="pager-state">
|
||||||
<input type="hidden" name="page" value="{{ page }}">
|
<input type="hidden" name="page" value="{{ page }}">
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue