diff options
-rw-r--r-- | askbot/skins/common/media/js/live_search.js | 156 | ||||
-rw-r--r-- | askbot/skins/common/media/js/utils.js | 36 | ||||
-rw-r--r-- | askbot/skins/common/templates/widgets/search_bar.html | 2 | ||||
-rw-r--r-- | askbot/skins/default/templates/macros.html | 2 | ||||
-rw-r--r-- | askbot/skins/old/media/js/live_search.js | 2 | ||||
-rw-r--r-- | askbot/views/readers.py | 26 |
6 files changed, 182 insertions, 42 deletions
diff --git a/askbot/skins/common/media/js/live_search.js b/askbot/skins/common/media/js/live_search.js index 73e1453a..55dee5a2 100644 --- a/askbot/skins/common/media/js/live_search.js +++ b/askbot/skins/common/media/js/live_search.js @@ -23,6 +23,7 @@ var liveSearch = function(){ sortMethod = prevSortMethod; } refresh_x_button(); + search_url = askbot['urls']['questions'] + 'reset_query:true/'; reset_query(sortMethod); } ); @@ -189,23 +190,63 @@ var liveSearch = function(){ return user_html; }; - var render_tag = function(tag_name, linkable, deletable){ + var render_tag = function(tag_name, linkable, deletable, query_string){ var tag = new Tag(); tag.setName(tag_name); tag.setDeletable(deletable); tag.setLinkable(linkable); + tag.setUrlParams(query_string); return tag.getElement().outerHTML(); }; - var render_tags = function(tags, linkable, deletable){ + var render_tags = function(tags, linkable, deletable, query_string){ var tags_html = '<ul class="tags">'; $.each(tags, function(idx, item){ - tags_html += render_tag(item, linkable, deletable); + tags_html += render_tag(item, linkable, deletable, query_string); }); tags_html += '</ul>'; return tags_html; }; + var render_question = function(question, query_string){ + var entry_html = + '<div class="short-summary">' + + '<div class="counts">' + + render_counter( + question['views'], + question['views_word'], + 'views', + question['views_class'] + ) + + render_counter( + question['answers'], + question['answers_word'], + 'answers', + question['answers_class'] + ) + + render_counter( + question['votes'], + question['votes_word'], + 'votes', + question['votes_class'] + ) + + '<div style="clear:both"></div>' + + render_user_info(question) + + '</div>' + + render_title(question) + + render_tags(question['tags'], true, false, query_string) + + '</div>'; + return entry_html; + }; + + var render_question_list = function(questions, query_string){ + var output = ''; + for (var i=0; i<questions.length; i++){ + output += render_question(questions[i], query_string); + } + return output; + }; + var render_faces = function(faces){ if (faces.length === 0){ return; @@ -218,13 +259,13 @@ var liveSearch = function(){ $('#contrib-users').append(html); }; - var render_related_tags = function(tags){ + var render_related_tags = function(tags, query_string){ if (tags.length === 0){ return; } var html = ''; for (var i=0; i<tags.length; i++){ - html += render_tag(tags[i]['name'], true, false); + html += render_tag(tags[i]['name'], true, false, query_string); html += '<span class="tag-number">× ' + tags[i]['used_count'] + '</span>' + @@ -283,24 +324,72 @@ var liveSearch = function(){ } }; - var create_relevance_tab = function(){ + var create_relevance_tab = function(query_string){ relevance_tab = $('<a></a>'); - relevance_tab.attr('href', '?sort=relevance-desc'); + href = '/questions/' + replace_in_url(query_string, 'sort:relevance-desc') + relevance_tab.attr('href', href); relevance_tab.attr('id', 'by_relevance'); relevance_tab.html('<span>' + sortButtonData['relevance']['label'] + '</span>'); return relevance_tab; } - var set_active_sort_tab = function(sort_method){ + var replace_in_url = function (query_string, param){ + values = param.split(':') + type = values[0] + value = values[1] + params = query_string.split('/') + url="" + + for (var i = 0; i < params.length; i++){ + if (params[i] !== ''){ + if (params[i].substring(0, type.length) == type){ + url += param + '/' + } + else{ + url += params[i] + '/' + } + } + } + return url + } + + var remove_from_url = function (query_string, type){ + params = query_string.split('/') + url="" + for (var i = 0; i < params.length; i++){ + if (params[i] !== ''){ + if (params[i].substring(0, type.length) !== type){ + url += params[i] + '/' + } + } + } + return url + } + + var set_section_tabs = function(query_string){ + var tabs = $('#section_tabs>a'); + tabs.each(function(index, element){ + var tab = $(element); + var tab_name = tab.attr('id').replace(/^by_/,''); + href = '/questions/' + replace_in_url(query_string, 'section:'+tab_name) + tab.attr( + 'href', + href + ); + }); + }; + + var set_active_sort_tab = function(sort_method, query_string){ var tabs = $('#sort_tabs>a'); tabs.attr('class', 'off'); tabs.each(function(index, element){ var tab = $(element); var tab_name = tab.attr('id').replace(/^by_/,''); if (tab_name in sortButtonData){ + href = '/questions/' + replace_in_url(query_string, 'sort:'+tab_name+'-desc') tab.attr( 'href', - '?sort=' + tab_name + '-desc' + href ); tab.attr( 'title', @@ -320,14 +409,14 @@ var liveSearch = function(){ active_tab.html(sortButtonData[name]['label'] + arrow); }; - var render_relevance_sort_tab = function(){ + var render_relevance_sort_tab = function(query_string){ if (showSortByRelevance === false){ return; } var relevance_tab = $('#by_relevance'); if (prev_text && prev_text.length > 0){ if (relevance_tab.length == 0){ - relevance_tab = create_relevance_tab(); + relevance_tab = create_relevance_tab(query_string); $('#sort_tabs>span').after(relevance_tab); } } @@ -338,22 +427,21 @@ var liveSearch = function(){ } }; - var change_rss_url = function(feed_url){ - if(feed_url){ - $("#ContentLeft a.rss:first").attr("href", feed_url); - } - } - var remove_search_tag = function(tag_name){ $.ajax({ - url: askbot['urls']['questions'], - data: {remove_tag: tag_name}, + url: askbot['urls']['questions']+'remove_tag:'+escape(tag_name)+'/', dataType: 'json', success: render_result, complete: try_again }); }; + var change_rss_url = function(feed_url){ + if(feed_url){ + $("#ContentLeft a.rss:first").attr("href", feed_url); + } + } + var activate_search_tags = function(){ var search_tags = $('#searchTags .tag-left'); $.each(search_tags, function(idx, element){ @@ -418,10 +506,11 @@ var liveSearch = function(){ set_question_count(data['question_counter']); render_search_tags(data['query_data']['tags']); render_faces(data['faces']); - render_related_tags(data['related_tags']); - render_relevance_sort_tab(); + render_related_tags(data['related_tags'], data['query_string']); + render_relevance_sort_tab(data['query_string']); + set_active_sort_tab(sortMethod, data['query_string']); + set_section_tabs(data['query_string']); change_rss_url(data['feed_url']); - set_active_sort_tab(sortMethod); query.focus(); //show new div with a fadeIn effect @@ -431,6 +520,8 @@ var liveSearch = function(){ new_list.fadeIn(400); }); } + var stateObj = { page: data['query_string'] }; + Path.history.pushState(stateObj, "Questions", data['query_string']); } var try_again = function(){ @@ -442,7 +533,7 @@ var liveSearch = function(){ var post_data = {query: query_text}; $.ajax({ url: search_url, - data: {query: query_text, sort: sort_method}, + //data: {query: query_text, sort: sort_method}, dataType: 'json', success: render_result, complete: try_again @@ -453,7 +544,7 @@ var liveSearch = function(){ var reset_query = function(sort_method){ $.ajax({ url: search_url, - data: {reset_query: true, sort: sort_method}, + //data: {reset_query: true, sort: sort_method}, dataType: 'json', success: render_result, complete: try_again @@ -475,7 +566,7 @@ var liveSearch = function(){ query = $('input#keywords'); refresh_main_page(); }, - init: function(mode){ + init: function(mode, query_string){ if (mode === 'main_page'){ //live search for the main page query = $('input#keywords'); @@ -489,11 +580,26 @@ var liveSearch = function(){ sortMethod = 'relevance-desc'; } } + search_url = askbot['urls']['questions']; //resetting search_url every times + params = query_string.split('/') + for (var i = 0; i < params.length; i++){ + if (params[i] !== ''){ + if (params[i].substring(0, 5) == "sort:"){ //change the sort method + search_url += 'sort:'+sortMethod+'/' + search_url += 'query:'+ cur_text.split(' ').join('+') + '/' //we add the query here + } + else{ + search_url += params[i] + '/'; + } + } + } + //search_url = '/questions/'+search_url send_query(cur_text, sortMethod); }; restart_query = function() { reset_sort_method(); refresh_x_button(); + search_url = askbot['urls']['questions'] + 'reset_query:true/'; reset_query(sortMethod); running = true; }; diff --git a/askbot/skins/common/media/js/utils.js b/askbot/skins/common/media/js/utils.js index 0afd03a7..8c048885 100644 --- a/askbot/skins/common/media/js/utils.js +++ b/askbot/skins/common/media/js/utils.js @@ -356,9 +356,41 @@ Tag.prototype.createDom = function(){ this._inner_element = this.makeElement(this._inner_html_tag); if (this.isLinkable()){ var url = askbot['urls']['questions']; - url += '?tags=' + escape(this.getName()); + var flag = false + var author = '' if (this._url_params !== null){ - url += escape('&' + this._url_params); + params = this._url_params.split('/') + for (var i = 0; i < params.length; i++){ + if (params[i] !== ''){ + if (params[i].substring(0, 5) == "tags:"){ + tags = params[i].substr(5).split('+'); + new_tags = '' + for(var j = 0; j < tags.length; j++){ + if(escape(tags[j]) !== escape(this.getName())){ + new_tags += escape(tags[j]) + '+'; + } + } + new_tags += escape(this.getName()) + url += 'tags:'+new_tags+'/' + flag = true + } + else if (params[i].substring(0, 7) == "author:"){ + author = params[i]; + } + else{ + url += params[i] + '/'; + } + } + } + if (flag == false) { + url += 'tags:'+escape(this.getName())+'/' + } + if (author !== '') { + url += author+'/' + } + } + else{ + url += 'tags:' + escape(this.getName()) + '/'; } this._inner_element.attr('href', url); } diff --git a/askbot/skins/common/templates/widgets/search_bar.html b/askbot/skins/common/templates/widgets/search_bar.html index c696fba3..8c3a50c4 100644 --- a/askbot/skins/common/templates/widgets/search_bar.html +++ b/askbot/skins/common/templates/widgets/search_bar.html @@ -8,7 +8,7 @@ {% elif active_tab == "users" %} action="{% url users %}" {% else %} - action="{% url questions %}" + action="{% url questions %}" id="searchForm" {% endif %} method="get"> <input type="submit" value="" name="search" class="searchBtn" /> diff --git a/askbot/skins/default/templates/macros.html b/askbot/skins/default/templates/macros.html index a51b6bc4..0f9eb678 100644 --- a/askbot/skins/default/templates/macros.html +++ b/askbot/skins/default/templates/macros.html @@ -553,7 +553,7 @@ answer {% if answer.accepted %}accepted-answer{% endif %} {% if answer.author_id {% endif %} {%- endmacro -%} -{%- macro paginator(p, position='left') -%}{# p is paginator context dictionary #} +{%- macro paginator(p, position='left', active_tab='') -%}{# p is paginator context dictionary #} {% spaceless %} {% if p.is_paginated %} <div class="paginator" style="float:{{position}}"> diff --git a/askbot/skins/old/media/js/live_search.js b/askbot/skins/old/media/js/live_search.js index bf855e60..62ae5798 100644 --- a/askbot/skins/old/media/js/live_search.js +++ b/askbot/skins/old/media/js/live_search.js @@ -344,9 +344,7 @@ var liveSearch = function(){ } } } - return url - } var remove_from_url = function (query_string, type){ diff --git a/askbot/views/readers.py b/askbot/views/readers.py index 7aeba23b..3e247797 100644 --- a/askbot/views/readers.py +++ b/askbot/views/readers.py @@ -175,6 +175,14 @@ def questions(request, scope=const.DEFAULT_POST_SCOPE, sort=const.DEFAULT_POST_S # Format the url with the QueryDict context_feed_url = '/feeds/rss/?%s' % rss_query_dict.urlencode() + reset_method_count = 0 + if search_state.query: + reset_method_count += 1 + if search_state.tags: + reset_method_count += 1 + if meta_data.get('author_name',None): + reset_method_count += 1 + if request.is_ajax(): q_count = paginator.count @@ -198,10 +206,11 @@ def questions(request, scope=const.DEFAULT_POST_SCOPE, sort=const.DEFAULT_POST_S if q_count > search_state.page_size: paginator_tpl = get_template('main_page/paginator.html', request) #todo: remove this patch on context after all templates are moved to jinja - paginator_context['base_url'] = request.path + '?sort=%s&' % search_state.sort + #paginator_context['base_url'] = request.path + '?sort=%s&' % search_state.sort data = { 'context': extra_tags.cnprog_paginator(paginator_context), - 'questions_count': q_count + 'questions_count': q_count, + 'page_size' : search_state.page_size, } paginator_html = paginator_tpl.render(Context(data)) else: @@ -225,6 +234,7 @@ def questions(request, scope=const.DEFAULT_POST_SCOPE, sort=const.DEFAULT_POST_S 'feed_url': context_feed_url, 'query_string': search_state.query_string(), 'parameters': search_state.make_parameters(), + 'page_size' : search_state.page_size, } badge_levels = dict(const.BADGE_TYPE_CHOICES) @@ -261,24 +271,18 @@ def questions(request, scope=const.DEFAULT_POST_SCOPE, sort=const.DEFAULT_POST_S 'context': paginator_context, 'language_code': translation.get_language(), 'query': search_state.query, + 'reset_method_count': reset_method_count, + 'query_string': search_state.query_string(), } questions_html = questions_tpl.render(Context(data)) + #import pdb; pdb.set_trace() ajax_data['questions'] = questions_html.replace('\n','') return HttpResponse( simplejson.dumps(ajax_data), mimetype = 'application/json' ) - reset_method_count = 0 - if search_state.query: - reset_method_count += 1 - if search_state.tags: - reset_method_count += 1 - if meta_data.get('author_name',None): - reset_method_count += 1 - - template_data = { 'active_tab': 'questions', 'author_name' : meta_data.get('author_name',None), |