Implement tag cloud on bookmark page
This commit is contained in:
parent
accc360ae5
commit
9323b9da77
|
@ -25,3 +25,20 @@ ul.bookmark-list {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tag-cloud {
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: $alternative-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.group {
|
||||||
|
margin-bottom: 0.4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.group-label {
|
||||||
|
font-weight: bold;
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: $alternative-color-dark;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -5,7 +5,8 @@ $alternative-color: #f45d00;
|
||||||
$alternative-color: #FF84E8;
|
$alternative-color: #FF84E8;
|
||||||
$alternative-color: #98C1D9;
|
$alternative-color: #98C1D9;
|
||||||
$alternative-color: #7B287D;
|
$alternative-color: #7B287D;
|
||||||
$alternative-color: #06c5c2;
|
$alternative-color: #05a6a3;
|
||||||
|
$alternative-color-dark: darken($alternative-color, 5%);
|
||||||
|
|
||||||
// Import Spectre CSS lib
|
// Import Spectre CSS lib
|
||||||
@import "../../node_modules/spectre.css/src/spectre";
|
@import "../../node_modules/spectre.css/src/spectre";
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
{% extends "bookmarks/layout.html" %}
|
{% extends "bookmarks/layout.html" %}
|
||||||
{% load shared %}
|
{% load shared %}
|
||||||
|
{% load bookmarks %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="columns">
|
<div class="columns">
|
||||||
|
@ -65,6 +66,7 @@
|
||||||
<div class="content-area-header">
|
<div class="content-area-header">
|
||||||
<h2>Tags</h2>
|
<h2>Tags</h2>
|
||||||
</div>
|
</div>
|
||||||
|
{% tag_cloud tags %}
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
{% load shared %}
|
||||||
|
|
||||||
|
<div class="tag-cloud">
|
||||||
|
{% for group in groups %}
|
||||||
|
<p class="group">
|
||||||
|
<span class="group-label mr-2">{{ group.char }}</span>
|
||||||
|
{% for tag in group.tags %}
|
||||||
|
<a href="?{% append_query_param q=tag.name %}">
|
||||||
|
<span class="mr-2">{{ tag.name }}</span>
|
||||||
|
</a>
|
||||||
|
{% endfor %}
|
||||||
|
</p>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
|
@ -1,6 +1,8 @@
|
||||||
|
from typing import List
|
||||||
|
|
||||||
from django import template
|
from django import template
|
||||||
|
|
||||||
from bookmarks.models import BookmarkForm
|
from bookmarks.models import BookmarkForm, Tag
|
||||||
|
|
||||||
register = template.Library()
|
register = template.Library()
|
||||||
|
|
||||||
|
@ -10,3 +12,35 @@ def bookmark_form(form: BookmarkForm):
|
||||||
return {
|
return {
|
||||||
'form': form,
|
'form': form,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class TagGroup:
|
||||||
|
def __init__(self, char):
|
||||||
|
self.tags = []
|
||||||
|
self.char = char
|
||||||
|
|
||||||
|
|
||||||
|
def create_tag_groups(tags: List[Tag]):
|
||||||
|
sorted_tags = sorted(tags, key=lambda x: str.lower(x.name))
|
||||||
|
group = None
|
||||||
|
groups = []
|
||||||
|
|
||||||
|
# Group tags that start with a different character than the previous one
|
||||||
|
for tag in sorted_tags:
|
||||||
|
tag_char = tag.name[0].lower()
|
||||||
|
|
||||||
|
if not group or group.char != tag_char:
|
||||||
|
group = TagGroup(tag_char)
|
||||||
|
groups.append(group)
|
||||||
|
|
||||||
|
group.tags.append(tag)
|
||||||
|
|
||||||
|
return groups
|
||||||
|
|
||||||
|
|
||||||
|
@register.inclusion_tag('bookmarks/tag_cloud.html', name='tag_cloud', takes_context=True)
|
||||||
|
def tag_cloud(context, tags: List[Tag]):
|
||||||
|
groups = create_tag_groups(tags)
|
||||||
|
return {
|
||||||
|
'groups': groups,
|
||||||
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@ register = template.Library()
|
||||||
|
|
||||||
@register.simple_tag(takes_context=True)
|
@register.simple_tag(takes_context=True)
|
||||||
def update_query_string(context, **kwargs):
|
def update_query_string(context, **kwargs):
|
||||||
query = context['request'].GET.copy()
|
query = context.request.GET.copy()
|
||||||
|
|
||||||
# Replace query params with the ones from tag parameters
|
# Replace query params with the ones from tag parameters
|
||||||
for key in kwargs:
|
for key in kwargs:
|
||||||
|
@ -16,7 +16,7 @@ def update_query_string(context, **kwargs):
|
||||||
|
|
||||||
@register.simple_tag(takes_context=True)
|
@register.simple_tag(takes_context=True)
|
||||||
def append_query_param(context, **kwargs):
|
def append_query_param(context, **kwargs):
|
||||||
query = context['request'].GET.copy()
|
query = context.request.GET.copy()
|
||||||
|
|
||||||
# Append to or create query param
|
# Append to or create query param
|
||||||
for key in kwargs:
|
for key in kwargs:
|
||||||
|
|
|
@ -4,7 +4,7 @@ from django.shortcuts import render
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
|
|
||||||
from bookmarks import queries
|
from bookmarks import queries
|
||||||
from bookmarks.models import Bookmark, BookmarkForm
|
from bookmarks.models import Bookmark, BookmarkForm, Tag
|
||||||
from bookmarks.services.bookmarks import create_bookmark, update_bookmark
|
from bookmarks.services.bookmarks import create_bookmark, update_bookmark
|
||||||
|
|
||||||
_default_page_size = 30
|
_default_page_size = 30
|
||||||
|
@ -16,6 +16,7 @@ def index(request):
|
||||||
query_set = queries.query_bookmarks(request.user, query_string)
|
query_set = queries.query_bookmarks(request.user, query_string)
|
||||||
paginator = Paginator(query_set, _default_page_size)
|
paginator = Paginator(query_set, _default_page_size)
|
||||||
bookmarks = paginator.get_page(page)
|
bookmarks = paginator.get_page(page)
|
||||||
|
tags = Tag.objects.all()
|
||||||
|
|
||||||
if request.GET.get('tag'):
|
if request.GET.get('tag'):
|
||||||
mod = request.GET.copy()
|
mod = request.GET.copy()
|
||||||
|
@ -24,6 +25,7 @@ def index(request):
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
'bookmarks': bookmarks,
|
'bookmarks': bookmarks,
|
||||||
|
'tags': tags,
|
||||||
'query': query_string if query_string else '',
|
'query': query_string if query_string else '',
|
||||||
}
|
}
|
||||||
return render(request, 'bookmarks/index.html', context)
|
return render(request, 'bookmarks/index.html', context)
|
||||||
|
|
Loading…
Reference in New Issue