diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-07-10 18:22:03 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-08-13 18:26:03 +0200 |
commit | ae9997c29331409fb6405c17c572a1d2919a0ee8 (patch) | |
tree | 9ade2794ce0ecdc0f38ff1e5e3cea8856aa3b30b /ishtar_common | |
parent | ae76035bc7fe939996dfff4e8fc8777c5686e60b (diff) | |
download | Ishtar-ae9997c29331409fb6405c17c572a1d2919a0ee8.tar.bz2 Ishtar-ae9997c29331409fb6405c17c572a1d2919a0ee8.zip |
Manage dynamicaly bookmark list
Diffstat (limited to 'ishtar_common')
-rw-r--r-- | ishtar_common/static/js/ishtar.js | 27 | ||||
-rw-r--r-- | ishtar_common/templates/ishtar/forms/success.html | 3 | ||||
-rw-r--r-- | ishtar_common/templates/widgets/search_input.html | 7 | ||||
-rw-r--r-- | ishtar_common/urls.py | 5 | ||||
-rw-r--r-- | ishtar_common/views.py | 46 |
5 files changed, 79 insertions, 9 deletions
diff --git a/ishtar_common/static/js/ishtar.js b/ishtar_common/static/js/ishtar.js index 81d080801..6e48bf5cf 100644 --- a/ishtar_common/static/js/ishtar.js +++ b/ishtar_common/static/js/ishtar.js @@ -283,6 +283,33 @@ $(document).on("click", '#to_top_arrow', function(){ $("html, body").animate({ scrollTop: 0}, 1000); }); +var bookmark_url = ""; + +var load_bookmark_list = function(){ + if (!bookmark_url) return; + $.get(bookmark_url, function(data) { + var bookmark_list = ""; + for (idx in data['bookmarks']){ + var bookmark = data['bookmarks'][idx]; + bookmark_list += '<span class="dropdown-item input-link" ' + + 'data-query="' + bookmark['query'].replace(/"/g, "''") + + '" href="#">' + bookmark['label'] + '</span>'; + } + $('#bookmark-list').html(bookmark_list); + if (bookmark_list === ""){ + $('#bookmark-list').addClass('disabled'); + } else { + $('#bookmark-list').removeClass('disabled'); + } + $("#bookmark-list span").click(function(){ + $("#id_search_vector").val( + $(this).attr('data-query').replace(/''/g, '"')); + enable_save(); + }); + }, 'json'); +} + + var autorefresh = false; var autorefresh_message_start = ""; var autorefresh_message_end = ""; diff --git a/ishtar_common/templates/ishtar/forms/success.html b/ishtar_common/templates/ishtar/forms/success.html index 125ba62e7..77fa260d1 100644 --- a/ishtar_common/templates/ishtar/forms/success.html +++ b/ishtar_common/templates/ishtar/forms/success.html @@ -3,6 +3,9 @@ $(document).ready(function(){ $("#form-result-div").parent().modal("hide"); + {% if context == 'bookmark' %} + load_bookmark_list(); + {% endif %} }); </script> diff --git a/ishtar_common/templates/widgets/search_input.html b/ishtar_common/templates/widgets/search_input.html index 7f5526b18..842b2bcfb 100644 --- a/ishtar_common/templates/widgets/search_input.html +++ b/ishtar_common/templates/widgets/search_input.html @@ -27,16 +27,20 @@ href="{% url 'save-search-query' app_name model %}"> <i class="fa fa-star-o" aria-hidden="true"></i> </a> - <span class="input-group-text input-link disabled" + <span class="input-group-text input-link dropdown-toggle" + data-toggle="dropdown" title="{% trans 'Bookmarks' %}" id="load-bookmark"> <i class="fa fa-bookmark" aria-hidden="true"></i> </span> + <div class="dropdown-menu" id="bookmark-list"> + </div> </span> </div> <script type="text/javascript"> +var bookmark_url = "{% url 'bookmark-list' app_name model %}"; $(document).ready(function(){ $(".search-widget input").keypress(function(e) { @@ -54,5 +58,6 @@ $(document).ready(function(){ enable_save(); }); enable_save(); + load_bookmark_list(); }); </script> diff --git a/ishtar_common/urls.py b/ishtar_common/urls.py index 6b778ae45..44ebd0f93 100644 --- a/ishtar_common/urls.py +++ b/ishtar_common/urls.py @@ -127,7 +127,10 @@ urlpatterns = [ url(r'^save-search/(?P<app_label>[a-z-]+)/(?P<model>[a-z-]+)/$', views.SearchQueryEdit.as_view(), name='save-search-query'), - url(r'^success/$', + url(r'^bookmarks/(?P<app_label>[a-z-]+)/(?P<model>[a-z-]+)/$', + views.BookmarkList.as_view(), + name='bookmark-list'), + url(r'^success(?:/(?P<context>[a-z-]+))?/$', TemplateView.as_view(template_name="ishtar/forms/success.html"), name='success'), ] diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 586e1f0a1..1f8b46fd6 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -33,7 +33,7 @@ from django.core.urlresolvers import reverse, NoReverseMatch from django.db.models import Q from django.forms.models import modelformset_factory from django.http import HttpResponse, Http404, HttpResponseRedirect, \ - HttpResponseBadRequest + HttpResponseBadRequest, JsonResponse from django.shortcuts import redirect, render from django.utils.decorators import method_decorator from django.utils.translation import ugettext, ugettext_lazy as _ @@ -839,6 +839,20 @@ class IshtarMixin(object): return context +class JSONResponseMixin: + """ + Render a JSON response. + """ + def render_to_response(self, context, **response_kwargs): + return JsonResponse( + self.get_data(context), + **response_kwargs + ) + + def get_data(self, context): + return context + + class LoginRequiredMixin(object): @method_decorator(login_required) def dispatch(self, request, *args, **kwargs): @@ -1662,10 +1676,10 @@ document_deletion_wizard = wizards.DocumentDeletionWizard.as_view( url_name='document_deletion',) -class SearchQueryEdit(LoginRequiredMixin, FormView): - template_name = 'ishtar/forms/search_query.html' - form_class = forms.SearchQueryForm - +class SearchQueryMixin(object): + """ + Manage content type and profile init + """ def dispatch(self, request, *args, **kwargs): if not request.user.pk: raise Http404() @@ -1684,7 +1698,12 @@ class SearchQueryEdit(LoginRequiredMixin, FormView): ) except ContentType.DoesNotExist: raise Http404() - return super(SearchQueryEdit, self).dispatch(request, *args, **kwargs) + return super(SearchQueryMixin, self).dispatch(request, *args, **kwargs) + + +class SearchQueryEdit(SearchQueryMixin, LoginRequiredMixin, FormView): + template_name = 'ishtar/forms/search_query.html' + form_class = forms.SearchQueryForm def get_form_kwargs(self): kwargs = super(SearchQueryEdit, self).get_form_kwargs() @@ -1703,4 +1722,17 @@ class SearchQueryEdit(LoginRequiredMixin, FormView): return HttpResponseRedirect(self.get_success_url()) def get_success_url(self): - return reverse('success') + return reverse('success', args=['bookmark']) + + +class BookmarkList(SearchQueryMixin, JSONResponseMixin, LoginRequiredMixin, + TemplateView): + def get_data(self, context): + q = models.SearchQuery.objects.filter( + content_type=self.content_type, + profile=self.profile + ) + return { + 'bookmarks': [ + {'label': sq.label, 'query': sq.query} for sq in q.all()] + } |