mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Port the show more books button
This commit is contained in:
parent
d402de3045
commit
97860d01f0
@ -2,11 +2,16 @@
|
|||||||
# License: GPL v3 Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>
|
# License: GPL v3 Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>
|
||||||
from __python__ import hash_literals
|
from __python__ import hash_literals
|
||||||
|
|
||||||
from dom import add_extra_css, clear, ensure_id
|
import traceback
|
||||||
|
|
||||||
|
from ajax import ajax_send
|
||||||
|
from dom import add_extra_css, clear, ensure_id, set_css
|
||||||
from elementmaker import E
|
from elementmaker import E
|
||||||
from gettext import gettext as _
|
from gettext import gettext as _
|
||||||
|
from modals import error_dialog
|
||||||
from utils import conditional_timeout
|
from utils import conditional_timeout
|
||||||
from session import get_interface_data
|
from session import get_interface_data
|
||||||
|
from widgets import create_button, create_spinner
|
||||||
|
|
||||||
from book_list.globals import get_session_data
|
from book_list.globals import get_session_data
|
||||||
from book_list.cover_grid import cover_grid_css, create_item as create_cover_grid_item, init as init_cover_grid, append_item as cover_grid_append_item
|
from book_list.cover_grid import cover_grid_css, create_item as create_cover_grid_item, init as init_cover_grid, append_item as cover_grid_append_item
|
||||||
@ -24,7 +29,7 @@ add_extra_css(def():
|
|||||||
)
|
)
|
||||||
|
|
||||||
book_list_data = {
|
book_list_data = {
|
||||||
'container_id': None, 'shown_book_ids': set(), 'is_fetching': False, 'mode': None,
|
'container_id': None, 'shown_book_ids': set(), 'mode': None, 'fetching_more_books': None,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -71,14 +76,81 @@ def apply_view_mode(mode=DEFAULT_MODE):
|
|||||||
render_ids()
|
render_ids()
|
||||||
|
|
||||||
|
|
||||||
|
def update_fetching_status():
|
||||||
|
more = document.getElementById(book_list_data.container_id).lastChild
|
||||||
|
if book_list_data.fetching_more_books:
|
||||||
|
more.firstChild.style.display = 'none'
|
||||||
|
more.lastChild.style.display = 'block'
|
||||||
|
elif library_data.search_result.total_num > book_list_data.shown_book_ids.length:
|
||||||
|
more.firstChild.style.display = 'block'
|
||||||
|
more.lastChild.style.display = 'none'
|
||||||
|
else:
|
||||||
|
more.firstChild.style.display = 'none'
|
||||||
|
more.lastChild.style.display = 'none'
|
||||||
|
|
||||||
|
|
||||||
|
def abort_get_more_books(no_update):
|
||||||
|
if book_list_data.fetching_more_books:
|
||||||
|
book_list_data.fetching_more_books.abort()
|
||||||
|
book_list_data.fetching_more_books = None
|
||||||
|
if not no_update:
|
||||||
|
update_fetching_status()
|
||||||
|
|
||||||
|
|
||||||
|
def got_more_books(end_type, xhr, event):
|
||||||
|
if book_list_data.fetching_more_books is not xhr:
|
||||||
|
return # Fetching was aborted
|
||||||
|
book_list_data.fetching_more_books = None
|
||||||
|
update_fetching_status()
|
||||||
|
if end_type is 'load':
|
||||||
|
try:
|
||||||
|
data = JSON.parse(xhr.responseText)
|
||||||
|
for key in data.metadata:
|
||||||
|
library_data.metadata[key] = data.metadata[key]
|
||||||
|
if not data.search_result.book_ids:
|
||||||
|
raise Exception('No books ids object in search result from server')
|
||||||
|
library_data.search_result = data.search_result
|
||||||
|
render_ids(data.search_result.book_ids)
|
||||||
|
except Exception:
|
||||||
|
error_dialog(_('Could not get more books'), _('Server returned an invalid response'), traceback.format_exc())
|
||||||
|
elif end_type is not 'abort':
|
||||||
|
error_dialog(_('Could not get more books'), xhr.error_html)
|
||||||
|
|
||||||
|
|
||||||
|
def get_more_books():
|
||||||
|
data = {'offset':book_list_data.shown_book_ids.length}
|
||||||
|
for key in 'query', 'sort', 'sort_order':
|
||||||
|
data[key] = library_data.search_result[key]
|
||||||
|
book_list_data.fetching_more_books = ajax_send(
|
||||||
|
'interface-data/more-books', data, got_more_books,
|
||||||
|
query={'library_id':current_library_id()}
|
||||||
|
)
|
||||||
|
update_fetching_status()
|
||||||
|
|
||||||
|
|
||||||
|
def create_more_button(more):
|
||||||
|
more.appendChild(create_button(
|
||||||
|
_('Show more books'), 'cloud-download', get_more_books
|
||||||
|
))
|
||||||
|
more.lastChild.setAttribute('rel', 'next')
|
||||||
|
set_css(more.firstChild, display='block', margin_left='auto', margin_right='auto')
|
||||||
|
set_css(more, font_size='1.5rem', padding_top='1.5rem', margin_bottom='1.5rem', text_align='center', display='flex')
|
||||||
|
more.appendChild(E.div(
|
||||||
|
create_spinner(), '\xa0' + _('Fetching metadata for more books, please wait') + '…',
|
||||||
|
style='margin-left:auto; margin-right:auto; display:none')
|
||||||
|
)
|
||||||
|
update_fetching_status()
|
||||||
|
|
||||||
|
|
||||||
def create_books_list(container):
|
def create_books_list(container):
|
||||||
book_list_data.container_id = ensure_id(container)
|
book_list_data.container_id = ensure_id(container)
|
||||||
book_list_data.shown_book_ids = set()
|
book_list_data.shown_book_ids = set()
|
||||||
book_list_data.is_fetching = False
|
|
||||||
book_list_data.mode = None
|
book_list_data.mode = None
|
||||||
|
abort_get_more_books(True)
|
||||||
container.appendChild(E.div(style='display:none'))
|
container.appendChild(E.div(style='display:none'))
|
||||||
container.appendChild(E.div()), container.appendChild(E.div())
|
container.appendChild(E.div()), container.appendChild(E.div())
|
||||||
apply_view_mode(get_session_data().get('view_mode'))
|
apply_view_mode(get_session_data().get('view_mode'))
|
||||||
|
create_more_button(container.lastChild)
|
||||||
|
|
||||||
|
|
||||||
def check_for_books_loaded():
|
def check_for_books_loaded():
|
||||||
|
Loading…
x
Reference in New Issue
Block a user