mirror of
https://github.com/chibicitiberiu/ytsm.git
synced 2024-02-24 05:43:31 +00:00
Implemented pagination for videos.
This commit is contained in:
parent
fa5760de69
commit
042bef7755
@ -58,4 +58,38 @@
|
|||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="pagination row">
|
||||||
|
<div class="btn-toolbar mx-auto">
|
||||||
|
<div class="btn-group mr-2" role="group">
|
||||||
|
<button id="btn_page_first" type="button" class="btn btn-light btn-paging"
|
||||||
|
data-toggle="tooltip" title="First page"
|
||||||
|
{% if videos.has_previous %} data-navigation-page="1" {% else %} disabled {% endif %}>
|
||||||
|
<span class="typcn typcn-chevron-left-outline" aria-hidden="true"></span>
|
||||||
|
</button>
|
||||||
|
<button id="btn_page_prev" type="button" class="btn btn-light btn-paging"
|
||||||
|
data-toggle="tooltip" title="Previous"
|
||||||
|
{% if videos.has_previous %} data-navigation-page="{{ videos.previous_page_number }}" {% else %} disabled {% endif %} >
|
||||||
|
<span class="typcn typcn-chevron-left" aria-hidden="true"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<small class="my-auto mx-2">
|
||||||
|
Page {{ videos.number }} of {{ videos.paginator.num_pages }}
|
||||||
|
</small>
|
||||||
|
|
||||||
|
<div class="btn-group mx-2" role="group">
|
||||||
|
<button id="btn_page_next" type="button" class="btn btn-light btn-paging"
|
||||||
|
data-toggle="tooltip" title="Next"
|
||||||
|
{% if videos.has_next %} data-navigation-page="{{ videos.next_page_number }}" {% else %} disabled {% endif %} >
|
||||||
|
<span class="typcn typcn-chevron-right" aria-hidden="true"></span>
|
||||||
|
</button>
|
||||||
|
<button id="btn_page_last" type="button" class="btn btn-light btn-paging"
|
||||||
|
data-toggle="tooltip" title="Last"
|
||||||
|
{% if videos.has_next %} data-navigation-page="{{ videos.paginator.num_pages }}" {% else %} disabled {% endif %} >
|
||||||
|
<span class="typcn typcn-chevron-right-outline" aria-hidden="true"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
@ -123,16 +123,33 @@ function videos_Reload()
|
|||||||
|
|
||||||
let videos_timeout = null;
|
let videos_timeout = null;
|
||||||
|
|
||||||
function videos_ReloadWithTimer()
|
function videos_ResetPageAndReloadWithTimer()
|
||||||
{
|
{
|
||||||
|
let filters_form = $("#form_video_filter");
|
||||||
|
filters_form.find('input[name=page]').val("1");
|
||||||
|
|
||||||
clearTimeout(videos_timeout);
|
clearTimeout(videos_timeout);
|
||||||
videos_timeout = setTimeout(function()
|
videos_timeout = setTimeout(function()
|
||||||
{
|
{
|
||||||
videos_Submit.call($('#form_video_filter'));
|
videos_Reload();
|
||||||
videos_timeout = null;
|
videos_timeout = null;
|
||||||
}, 200);
|
}, 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function videos_PageClicked()
|
||||||
|
{
|
||||||
|
// Obtain page from button
|
||||||
|
let page = $(this).data('navigation-page');
|
||||||
|
|
||||||
|
// Set page
|
||||||
|
let filters_form = $("#form_video_filter");
|
||||||
|
filters_form.find('input[name=page]').val(page);
|
||||||
|
|
||||||
|
// Reload
|
||||||
|
videos_Reload();
|
||||||
|
$("html, body").animate({ scrollTop: 0 }, "slow");
|
||||||
|
}
|
||||||
|
|
||||||
function videos_Submit(e)
|
function videos_Submit(e)
|
||||||
{
|
{
|
||||||
let loadingDiv = $('#videos-loading');
|
let loadingDiv = $('#videos-loading');
|
||||||
@ -145,6 +162,7 @@ function videos_Submit(e)
|
|||||||
.done(function(result) {
|
.done(function(result) {
|
||||||
$("#videos-wrapper").html(result);
|
$("#videos-wrapper").html(result);
|
||||||
$(".ajax-link").on("click", ajaxLink_Clicked);
|
$(".ajax-link").on("click", ajaxLink_Clicked);
|
||||||
|
$(".btn-paging").on("click", videos_PageClicked);
|
||||||
})
|
})
|
||||||
.fail(function() {
|
.fail(function() {
|
||||||
$("#videos-wrapper").html('<div class="alert alert-danger">An error occurred while retrieving the video list!</div>');
|
$("#videos-wrapper").html('<div class="alert alert-danger">An error occurred while retrieving the video list!</div>');
|
||||||
@ -189,9 +207,11 @@ $(document).ready(function ()
|
|||||||
// Videos filters
|
// Videos filters
|
||||||
let filters_form = $("#form_video_filter");
|
let filters_form = $("#form_video_filter");
|
||||||
filters_form.submit(videos_Submit);
|
filters_form.submit(videos_Submit);
|
||||||
filters_form.find('input[name=query]').on('change', videos_ReloadWithTimer);
|
filters_form.find('input[name=query]').on('change', videos_ResetPageAndReloadWithTimer);
|
||||||
filters_form.find('select[name=sort]').on('change', videos_ReloadWithTimer);
|
filters_form.find('select[name=sort]').on('change', videos_ResetPageAndReloadWithTimer);
|
||||||
filters_form.find('select[name=show_watched]').on('change', videos_ReloadWithTimer);
|
filters_form.find('select[name=show_watched]').on('change', videos_ResetPageAndReloadWithTimer);
|
||||||
filters_form.find('select[name=show_downloaded]').on('change', videos_ReloadWithTimer);
|
filters_form.find('select[name=show_downloaded]').on('change', videos_ResetPageAndReloadWithTimer);
|
||||||
|
filters_form.find('select[name=results_per_page]').on('change', videos_ResetPageAndReloadWithTimer);
|
||||||
|
|
||||||
videos_Reload();
|
videos_Reload();
|
||||||
});
|
});
|
||||||
|
@ -9,6 +9,7 @@ from django.shortcuts import render
|
|||||||
from django.views.generic import CreateView, UpdateView, DeleteView, FormView
|
from django.views.generic import CreateView, UpdateView, DeleteView, FormView
|
||||||
from django.views.generic.edit import FormMixin
|
from django.views.generic.edit import FormMixin
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
from django.core.paginator import Paginator
|
||||||
from YtManagerApp.management.videos import get_videos
|
from YtManagerApp.management.videos import get_videos
|
||||||
from YtManagerApp.models import Subscription, SubscriptionFolder, VIDEO_ORDER_CHOICES, VIDEO_ORDER_MAPPING
|
from YtManagerApp.models import Subscription, SubscriptionFolder, VIDEO_ORDER_CHOICES, VIDEO_ORDER_MAPPING
|
||||||
from YtManagerApp.utils import youtube, subscription_file_parser
|
from YtManagerApp.utils import youtube, subscription_file_parser
|
||||||
@ -36,6 +37,13 @@ class VideoFilterForm(forms.Form):
|
|||||||
'all': None
|
'all': None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CHOICES_RESULT_COUNT = (
|
||||||
|
(25, 25),
|
||||||
|
(50, 50),
|
||||||
|
(100, 100),
|
||||||
|
(200, 200)
|
||||||
|
)
|
||||||
|
|
||||||
query = forms.CharField(label='', required=False)
|
query = forms.CharField(label='', required=False)
|
||||||
sort = forms.ChoiceField(label='Sort:', choices=VIDEO_ORDER_CHOICES, initial='newest')
|
sort = forms.ChoiceField(label='Sort:', choices=VIDEO_ORDER_CHOICES, initial='newest')
|
||||||
show_watched = forms.ChoiceField(label='Show only: ', choices=CHOICES_SHOW_WATCHED, initial='all')
|
show_watched = forms.ChoiceField(label='Show only: ', choices=CHOICES_SHOW_WATCHED, initial='all')
|
||||||
@ -48,6 +56,11 @@ class VideoFilterForm(forms.Form):
|
|||||||
required=False,
|
required=False,
|
||||||
widget=forms.HiddenInput()
|
widget=forms.HiddenInput()
|
||||||
)
|
)
|
||||||
|
page = forms.IntegerField(
|
||||||
|
required=False,
|
||||||
|
widget=forms.HiddenInput()
|
||||||
|
)
|
||||||
|
results_per_page = forms.ChoiceField(label='Results per page: ', choices=CHOICES_RESULT_COUNT, initial=50)
|
||||||
|
|
||||||
def __init__(self, data=None):
|
def __init__(self, data=None):
|
||||||
super().__init__(data, auto_id='form_video_filter_%s')
|
super().__init__(data, auto_id='form_video_filter_%s')
|
||||||
@ -65,7 +78,9 @@ class VideoFilterForm(forms.Form):
|
|||||||
'show_watched',
|
'show_watched',
|
||||||
'show_downloaded',
|
'show_downloaded',
|
||||||
'subscription_id',
|
'subscription_id',
|
||||||
'folder_id'
|
'folder_id',
|
||||||
|
'page',
|
||||||
|
'results_per_page'
|
||||||
)
|
)
|
||||||
|
|
||||||
def clean_sort(self):
|
def clean_sort(self):
|
||||||
@ -147,6 +162,9 @@ def ajax_get_videos(request: HttpRequest):
|
|||||||
only_downloaded=form.cleaned_data['show_downloaded']
|
only_downloaded=form.cleaned_data['show_downloaded']
|
||||||
)
|
)
|
||||||
|
|
||||||
|
paginator = Paginator(videos, form.cleaned_data['results_per_page'])
|
||||||
|
videos = paginator.get_page(form.cleaned_data['page'])
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
'videos': videos
|
'videos': videos
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user