summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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
commitae9997c29331409fb6405c17c572a1d2919a0ee8 (patch)
tree9ade2794ce0ecdc0f38ff1e5e3cea8856aa3b30b
parentae76035bc7fe939996dfff4e8fc8777c5686e60b (diff)
downloadIshtar-ae9997c29331409fb6405c17c572a1d2919a0ee8.tar.bz2
Ishtar-ae9997c29331409fb6405c17c572a1d2919a0ee8.zip
Manage dynamicaly bookmark list
-rw-r--r--ishtar_common/static/js/ishtar.js27
-rw-r--r--ishtar_common/templates/ishtar/forms/success.html3
-rw-r--r--ishtar_common/templates/widgets/search_input.html7
-rw-r--r--ishtar_common/urls.py5
-rw-r--r--ishtar_common/views.py46
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()]
+ }