From 5bd864493e531e5600c5ca989825d89cc3ee1487 Mon Sep 17 00:00:00 2001 From: Radek Czajka Date: Tue, 29 Nov 2022 15:55:47 +0100 Subject: [PATCH 1/1] Tag intersections. --- src/catalogue/static/2022/book/filter.js | 7 ++ .../catalogue/2022/author_detail.html | 30 ++++- src/catalogue/templatetags/catalogue_tags.py | 104 ++++++++++-------- src/catalogue/views.py | 13 ++- .../static/2022/styles/local.scss | 51 +++++++++ 5 files changed, 153 insertions(+), 52 deletions(-) diff --git a/src/catalogue/static/2022/book/filter.js b/src/catalogue/static/2022/book/filter.js index 15d4e3492..ac2674996 100644 --- a/src/catalogue/static/2022/book/filter.js +++ b/src/catalogue/static/2022/book/filter.js @@ -2,6 +2,13 @@ $(".quick-filter").each(function() { let bookList = $('#' + $(this).data('for')); + let filterList = $('.' + $(this).data('filters')); + $(this).on('focus', function() { + filterList.addClass('filters-enabled'); + }); + $(this).on('blur', function() { + filterList.removeClass('filters-enabled'); + }); $(this).on('input propertychange', function() { let search = $(this).val().toLowerCase(); bookList.children().each(function() { diff --git a/src/catalogue/templates/catalogue/2022/author_detail.html b/src/catalogue/templates/catalogue/2022/author_detail.html index 17514ed98..c063d9e9b 100644 --- a/src/catalogue/templates/catalogue/2022/author_detail.html +++ b/src/catalogue/templates/catalogue/2022/author_detail.html @@ -1,11 +1,12 @@ {% extends '2022/base.html' %} +{% load catalogue_tags %} {% load choose_cites from social_tags %} {% block breadcrumbs %} Katalog - Autor + {{ tags.0.get_category_display|title }} {% endblock %} {% block main %} @@ -24,7 +25,19 @@
- + +
+ {% for tag in tags %} + {% if forloop.counter > 1 %} + + {{ tag }} + ✖ + + {% endif %} + {% endfor %} +
+ +
Sortuj: @@ -36,6 +49,19 @@
+
+ +
+

{% nice_title_from_tags tags categories %}

+
+ {% for tag in suggest %} + + {{ tag }} + + {% endfor %} +
+
+
diff --git a/src/catalogue/templatetags/catalogue_tags.py b/src/catalogue/templatetags/catalogue_tags.py index 7189e9523..718ffd358 100644 --- a/src/catalogue/templatetags/catalogue_tags.py +++ b/src/catalogue/templatetags/catalogue_tags.py @@ -65,66 +65,78 @@ def book_title_html(book): @register.simple_tag def title_from_tags(tags): + # TODO: Remove this after adding flection mechanism + return simple_title(tags) + + +@register.simple_tag +def nice_title_from_tags(tags, related_tags): def split_tags(tags): result = {} for tag in tags: - result[tag.category] = tag + result.setdefault(tag.category, []).append(tag) return result - # TODO: Remove this after adding flection mechanism - return simple_title(tags) - - class Flection(object): - def get_case(self, name, flection): - return name - flection = Flection() - self = split_tags(tags) - title = '' - - # Specjalny przypadek oglądania wszystkich lektur na danej półce - if len(self) == 1 and 'set' in self: - return 'Półka %s' % self['set'] - - # Specjalny przypadek "Twórczość w pozytywizmie", wtedy gdy tylko epoka - # jest wybrana przez użytkownika - if 'epoch' in self and len(self) == 1: - text = 'Twórczość w %s' % flection.get_case(str(self['epoch']), 'miejscownik') - return capfirst(text) - - # Specjalny przypadek "Dramat w twórczości Sofoklesa", wtedy gdy podane - # są tylko rodzaj literacki i autor - if 'kind' in self and 'author' in self and len(self) == 2: - text = '%s w twórczości %s' % ( - str(self['kind']), flection.get_case(str(self['author']), 'dopełniacz')) - return capfirst(text) - - # Przypadki ogólniejsze - if 'theme' in self: - title += 'Motyw %s' % str(self['theme']) + pieces = [] + plural = True + epoch_reduntant = False if 'genre' in self: - if 'theme' in self: - title += ' w %s' % flection.get_case(str(self['genre']), 'miejscownik') + pieces.append([ + t.plural or t.name for t in self['genre'] + ]) + epoch_reduntant = self['genre'][-1].genre_epoch_specific + else: + # If we don't have genre, + # look if maybe we only have one genre in this context? + if 'genre' in related_tags and len(related_tags['genre']) == 1: + pieces.append([ + t.plural or t.name for t in related_tags['genre'] + ]) + epoch_reduntant = related_tags['genre'][-1].genre_epoch_specific + elif 'kind' in self: + # Only use kind if not talking about genre. + pieces.append([ + t.collective_noun or t.name for t in self['kind'] + ]) + plural = False + elif 'kind' in related_tags and len(related_tags['kind']) == 1: + # No info on genre, but there's only one kind related. + subpieces = [] + pieces.append([ + t.collective_noun or t.name for t in self['kind'] + ]) + plural = False else: - title += str(self['genre']) + # We can't say anything about genre or kind. + pieces.append(['Twórczość']) + plural = False - if 'kind' in self or 'author' in self or 'epoch' in self: - if 'genre' in self or 'theme' in self: - if 'kind' in self: - title += ' w %s ' % flection.get_case(str(self['kind']), 'miejscownik') - else: - title += ' w twórczości ' + if not epoch_reduntant and 'epoch' in self: + if plural: + form = lambda t: t.adjective_nonmasculine_plural or t.name else: - title += '%s ' % str(self.get('kind', 'twórczość')) + form = lambda t: t.adjective_feminine_singular or t.name + pieces.append([ + form(t) for t in self['epoch'] + ]) if 'author' in self: - title += flection.get_case(str(self['author']), 'dopełniacz') - elif 'epoch' in self: - title += flection.get_case(str(self['epoch']), 'dopełniacz') - - return capfirst(title) + pieces.append([ + t.genitive or t.name for t in self['author'] + ]) + + p = [] + for sublist in pieces: + for item in sublist[:-2]: + p.append(item) + ',' + for item in sublist[-2:-1]: + p.append(item) + ' i' + p.append(sublist[-1]) + + return ' '.join(p) @register.simple_tag diff --git a/src/catalogue/views.py b/src/catalogue/views.py index d1fc0c9cd..8c66af717 100644 --- a/src/catalogue/views.py +++ b/src/catalogue/views.py @@ -122,6 +122,10 @@ def object_list(request, objects, fragments=None, related_tags=None, tags=None, objects = prefetch_relations(objects, 'author') categories = split_tags(*related_tag_lists) + suggest = [] + for c in ['author', 'epoch', 'kind', 'genre']: + if len(categories.get(c, [])) > 1: + suggest.extend(categories[c][:4]) objects = list(objects) @@ -137,6 +141,7 @@ def object_list(request, objects, fragments=None, related_tags=None, tags=None, result = { 'object_list': objects, 'categories': categories, + 'suggest': suggest, 'list_type': list_type, 'tags': tags, @@ -147,16 +152,16 @@ def object_list(request, objects, fragments=None, related_tags=None, tags=None, if extra: result.update(extra) - is_author = len(tags) == 1 and tags[0].category == 'author' is_set = len(tags) == 1 and tags[0].category == 'set' is_theme = len(tags) == 1 and tags[0].category == 'theme' new_layout = request.EXPERIMENTS['layout'] - if is_author and new_layout.value: - template = 'catalogue/2022/author_detail.html' - elif is_set and new_layout.value: + + if is_set and new_layout.value: template = 'catalogue/2022/set_detail.html' elif is_theme and new_layout.value: template = 'catalogue/2022/theme_detail.html' + elif new_layout.value: + template = 'catalogue/2022/author_detail.html' else: template = 'catalogue/tagged_object_list.html' diff --git a/src/wolnelektury/static/2022/styles/local.scss b/src/wolnelektury/static/2022/styles/local.scss index 5f6327550..1dea8ca03 100644 --- a/src/wolnelektury/static/2022/styles/local.scss +++ b/src/wolnelektury/static/2022/styles/local.scss @@ -179,3 +179,54 @@ $teal: #007880; } } } + + +.filter-container { + position: absolute; + top: 15px; + bottom: 25px; + + display: flex; + align-items: center; + + .filter { + background: #FBC40F; + padding: 5px 10px; + margin-left: 5px; + border-radius: 15px; + } +} + +.with-filter { + padding: 20px 0 0; + position: relative; + + h2 { + margin-bottom: 0; + } +} +.with-filter .row div.filter-container { + background: white; + top: 0; + bottom: 100%; + opacity: 0; + overflow: hidden; + + transition: opacity .2s, all .3s; + +} +.with-filter.filters-enabled { + .row div.filter-container{ + top: 15px; + bottom: 5px; + opacity: 1; + } +} + +.l-books__input .filter-container { + top: 0; + bottom: 0; + right: 10px; + padding: 10px 0; + +} -- 2.20.1