From 9655bd421022dd6488b21184cc9fd0242c6b345e Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Tue, 8 Dec 2009 22:50:45 -0500 Subject: added interesting and ignored tag selectors (works) and per-tag subscription (not tested yet) --- templates/authopenid/complete.html | 1 + templates/base.html | 1 - templates/content/images/close-small-dark.png | Bin 0 -> 226 bytes templates/content/js/com.cnprog.admin.js | 2 +- templates/content/js/com.cnprog.post.js | 174 +++++++++++++++++++++++++- templates/content/js/com.cnprog.utils.js | 2 +- templates/content/js/compress.bat | 3 +- templates/content/js/flot-build.bat | 2 +- templates/content/style/style.css | 32 ++++- templates/index.html | 18 +-- templates/questions.html | 88 ++++++++----- templates/tag_selector.html | 42 +++++++ templates/user_email_subscriptions.html | 3 + templates/user_stats.html | 2 +- 14 files changed, 314 insertions(+), 56 deletions(-) create mode 100644 templates/content/images/close-small-dark.png create mode 100644 templates/tag_selector.html (limited to 'templates') diff --git a/templates/authopenid/complete.html b/templates/authopenid/complete.html index 9a94c3c4..ce5fb7fe 100644 --- a/templates/authopenid/complete.html +++ b/templates/authopenid/complete.html @@ -88,6 +88,7 @@ parameters:

{% trans "receive updates motivational blurb" %}

{% include "edit_user_email_feeds_form.html" %} +

{% trans "Tag filter tool will be your right panel, once you log in." %}

diff --git a/templates/base.html b/templates/base.html index ec0a53d7..daafc3bc 100644 --- a/templates/base.html +++ b/templates/base.html @@ -75,7 +75,6 @@ {% endblock%} -
{% block sidebar%} {% endblock%} diff --git a/templates/content/images/close-small-dark.png b/templates/content/images/close-small-dark.png new file mode 100644 index 00000000..280c1fc7 Binary files /dev/null and b/templates/content/images/close-small-dark.png differ diff --git a/templates/content/js/com.cnprog.admin.js b/templates/content/js/com.cnprog.admin.js index 73b5768f..cb1c1b15 100644 --- a/templates/content/js/com.cnprog.admin.js +++ b/templates/content/js/com.cnprog.admin.js @@ -3,7 +3,7 @@ $().ready( function(){ success: function(a,b){$('.admin #action_status').html($.i18n._('changes saved'));}, dataType:'json', timeout:5000, - url: $.i18n._('/') + $.i18n._('moderate-user/') + viewUserID + '/' + url: scriptUrl + $.i18n._('moderate-user/') + viewUserID + '/' }; var form = $('.admin #moderate_user_form').ajaxForm(options); var box = $('.admin input#id_is_approved').click(function(){ diff --git a/templates/content/js/com.cnprog.post.js b/templates/content/js/com.cnprog.post.js index 5d58ff21..0d4c52d3 100644 --- a/templates/content/js/com.cnprog.post.js +++ b/templates/content/js/com.cnprog.post.js @@ -500,7 +500,7 @@ function createComments(type) { jDiv.append('

' + $.i18n._('to comment, need') + ' ' + + repNeededForComments + ' ' + $.i18n._('community karma points') - + '' + + '' + $.i18n._('please see') + 'faq

'); } } @@ -601,7 +601,7 @@ function createComments(type) { $(this).children().each( function(i){ var comment_id = $(this).attr('id').replace('comment-',''); - var delete_url = $.i18n._('/') + objectType + 's/' + post_id + '/' + var delete_url = scriptUrl + objectType + 's/' + post_id + '/' + $.i18n._('comments/') + comment_id + '/' + $.i18n._('delete/'); var html = $(this).html(); var CommentsClass; @@ -615,12 +615,12 @@ function createComments(type) { delete_icon.click(function(){CommentsClass.deleteComment($(this),comment_id,delete_url);}); delete_icon.unbind('mouseover').bind('mouseover', function(){ - $(this).attr('src',$.i18n._('/') + 'content/images/close-small-hover.png'); + $(this).attr('src',scriptUrl + 'content/images/close-small-hover.png'); } ); delete_icon.unbind('mouseout').bind('mouseout', function(){ - $(this).attr('src',$.i18n._('/') + 'content/images/close-small.png'); + $(this).attr('src',scriptUrl + 'content/images/close-small.png'); } ); } @@ -670,12 +670,178 @@ function createComments(type) { }; } +function pickedTags(){ + + var sendAjax = function(tagname, reason, action, callback){ + url = scriptUrl; + if (action == 'add'){ + url += $.i18n._('mark-tag/'); + if (reason == 'good'){ + url += $.i18n._('interesting/'); + } + else { + url += $.i18n._('ignored/'); + } + } + else { + url += $.i18n._('unmark-tag/'); + } + url = url + tagname + '/'; + + call_settings = { + type:'POST', + url:url + } + if (callback != false){ + call_settings['success'] = callback; + } + $.ajax(call_settings); + } + + + var unpickTag = function(from_target ,tagname, reason, send_ajax){ + //send ajax request to delete tag + var deleteTagLocally = function(){ + from_target[tagname].remove(); + delete from_target[tagname]; + } + if (send_ajax){ + sendAjax(tagname,reason,'remove',deleteTagLocally); + } + else { + deleteTagLocally(); + } + + } + + var setupTagDeleteEvents = function(obj,tag_store,tagname,reason,send_ajax){ + obj.unbind('mouseover').bind('mouseover', function(){ + $(this).attr('src', scriptUrl + 'content/images/close-small-hover.png'); + }); + obj.unbind('mouseout').bind('mouseout', function(){ + $(this).attr('src', scriptUrl + 'content/images/close-small-dark.png'); + }); + obj.click( function(){ + unpickTag(tag_store,tagname,reason,send_ajax); + }); + } + + var handlePickedTag = function(obj,reason){ + var tagname = $.trim($(obj).prev().attr('value')); + to_target = interestingTags; + from_target = ignoredTags; + if (reason == 'bad'){ + to_target = ignoredTags; + from_target = interestingTags; + to_tag_container = $('div .tags.ignored'); + } + else if (reason != 'good'){ + return; + } + else { + to_tag_container = $('div .tags.interesting'); + } + + if (tagname in from_target){ + unpickTag(from_target,tagname,reason,false); + } + + if (!(tagname in to_target)){ + //send ajax request to pick this tag + + sendAjax(tagname,reason,'add',function(){ + new_tag = $(''); + new_tag.addClass('deletable-tag'); + tag_link = $(''); + tag_link.attr('rel','tag'); + tag_link.attr('href', scriptUrl + $.i18n._('tags/') + tagname); + tag_link.html(tagname); + del_link = $(''); + del_link.addClass('delete-icon'); + del_link.attr('src', scriptUrl + 'content/images/close-small-dark.png'); + + setupTagDeleteEvents(del_link, to_target, tagname, reason, true); + + new_tag.append(tag_link); + new_tag.append(del_link); + to_tag_container.append(new_tag); + + to_target[tagname] = new_tag; + }); + } + } + + var collectPickedTags = function(){ + var good_prefix = 'interesting-tag-'; + var bad_prefix = 'ignored-tag-'; + var good_re = RegExp('^' + good_prefix); + var bad_re = RegExp('^' + bad_prefix); + interestingTags = {}; + ignoredTags = {}; + $('.deletable-tag').each( + function(i,item){ + item_id = $(item).attr('id') + if (good_re.test(item_id)){ + tag_name = item_id.replace(good_prefix,''); + tag_store = interestingTags; + reason = 'good'; + } + else if (bad_re.test(item_id)){ + tag_name = item_id.replace(bad_prefix,''); + tag_store = ignoredTags; + reason = 'bad'; + } + else { + return; + } + tag_store[tag_name] = $(item); + setupTagDeleteEvents($(item).find('img'),tag_store,tag_name,reason,true) + } + ); + } + + var setupHideIgnoredQuestionsControl = function(){ + $('#hideIgnoredTagsCb').unbind('click').click(function(){ + $.ajax({ + type: 'POST', + dataType: 'json', + cache: false, + url: scriptUrl + $.i18n._('command/'), + data: {command:'toggle-ignored-questions'} + }); + }); + } + return { + init: function(){ + collectPickedTags(); + setupHideIgnoredQuestionsControl(); + $("#interestingTagInput, #ignoredTagInput").autocomplete(tags, { + minChars: 1, + matchContains: true, + max: 20, + multiple: true, + multipleSeparator: " ", + formatItem: function(row, i, max) { + return row.n + " ("+ row.c +")"; + }, + formatResult: function(row, i, max){ + return row.n; + } + + }); + $("#interestingTagAdd").click(function(){handlePickedTag(this,'good')}); + $("#ignoredTagAdd").click(function(){handlePickedTag(this,'bad')}); + } + }; +} + var questionComments = createComments('question'); var answerComments = createComments('answer'); $().ready(function() { questionComments.init(); answerComments.init(); + pickedTags().init(); }); var commentsFactory = {'question' : questionComments, 'answer' : answerComments}; diff --git a/templates/content/js/com.cnprog.utils.js b/templates/content/js/com.cnprog.utils.js index cf27c8a1..b19b6773 100644 --- a/templates/content/js/com.cnprog.utils.js +++ b/templates/content/js/com.cnprog.utils.js @@ -36,7 +36,7 @@ var notify = function() { function appendLoader(containerSelector) { $(containerSelector).append(''
 		+$.i18n._('loading...')
diff --git a/templates/content/js/compress.bat b/templates/content/js/compress.bat
index 41e1882a..5b2673cf 100644
--- a/templates/content/js/compress.bat
+++ b/templates/content/js/compress.bat
@@ -2,5 +2,4 @@
 #java -jar yuicompressor-2.4.2.jar --type js  --charset utf-8 wmd\showdown.js -o wmd\showdown-min.js
 #java -jar yuicompressor-2.4.2.jar --type js  --charset utf-8 com.cnprog.post.js -o com.cnprog.post.pack.js
 java -jar yuicompressor-2.4.2.jar --type js  --charset utf-8 se_hilite_src.js -o se_hilite.js
-
-pause
\ No newline at end of file
+pause
diff --git a/templates/content/js/flot-build.bat b/templates/content/js/flot-build.bat
index fc715e3a..f9f32cb7 100644
--- a/templates/content/js/flot-build.bat
+++ b/templates/content/js/flot-build.bat
@@ -1,3 +1,3 @@
 java -jar yuicompressor-2.4.2.jar --type js  --charset utf-8 jquery.flot.js -o jquery.flot.pack.js
 
-pause
\ No newline at end of file
+pause
diff --git a/templates/content/style/style.css b/templates/content/style/style.css
index 4038e8a1..47b4dc00 100644
--- a/templates/content/style/style.css
+++ b/templates/content/style/style.css
@@ -162,7 +162,7 @@ blockquote
     border-right:1px solid #b4b48e;
     border-bottom:1px solid #b4b48e;*/
     background: white;/* #f9f7ed;*/
-    margin:10px 0 10px 0;
+    /*margin:10px 0 10px 0;*/
     /*background:url(../images/quest-bg.gif) repeat-x top;*/
 }
 #listA .qstA thumb {float:left; }
@@ -204,7 +204,14 @@ blockquote
     /*border-bottom:1px solid #888a85;*/
 }
 .evenMore {font-size:14px; font-weight:800;}
-.questions-count{font-size:32px;font-family:sans-serif;font-weight:600;padding:0 0 5px 7px;color:#a40000;}
+.questions-count{
+    font-size:32px;
+    font-family:sans-serif;
+    font-weight:600;
+    padding:0 0 5px 0px;
+    color:#a40000;
+    margin-top:3px;
+}
 
 /*内容块*/
 .boxA {background:#888a85; padding:6px; margin-bottom:8px;border 1px solid #babdb6;}
@@ -216,7 +223,7 @@ blockquote
 .boxB .body {border:1px solid #aaaaaa; padding:8px; background:#FFF; font-size:13px; line-height:160%;}
 .boxB .more {padding:1px; text-align:right; font-weight:800;}
 .boxC {
-    background:#babdb6;/*f9f7ed;*/
+    background: #cacdc6;/*f9f7ed;*/
     padding:10px; 
     margin-bottom:8px;
     border-top:1px solid #eeeeec;
@@ -224,6 +231,12 @@ blockquote
     border-right:1px solid #a9aca5;
     border-bottom:1px solid #babdb6;
 }
+.boxC p {
+    margin-bottom:8px;
+}
+.boxC p.nomargin {
+    margin:0px;
+}
 .boxC p.info-box-follow-up-links {
     text-align:right;
     margin:0;
@@ -308,12 +321,14 @@ blockquote
 /*标签*/
 .tag {font-size:13px; font-weight:normal; color:#333; text-decoration:none;background-color:#EEE; border-left:3px solid #777; border-top:1px solid #EEE; border-bottom:1px solid #CCC; border-right:1px solid #CCC; padding:1px 8px 1px 8px;}
 .tags {font-family:sans-serif; line-height:200%; display:block; margin-top:5px;}
-.tags a {font-size:13px; font-weight:normal; color:#333; text-decoration:none;background-color:#EEE; border-left:3px solid #777; border-top:1px solid #EEE; border-bottom:1px solid #CCC; border-right:1px solid #CCC; padding:1px 8px 1px 8px;}
+.tags a {white-space: nowrap; font-size:13px; font-weight:normal; color:#333; text-decoration:none;background-color:#EEE; border-left:3px solid #777; border-top:1px solid #EEE; border-bottom:1px solid #CCC; border-right:1px solid #CCC; padding:1px 8px 1px 8px;}
 .tags a:hover {background-color:#fFF;color:#333;}
 .tagsbox {line-height:200%;}
 .tagsbox a {font-size:13px; font-weight:normal; color:#333; text-decoration:none;background-color:#EEE; border-left:3px solid #777; border-top:1px solid #EEE; border-bottom:1px solid #CCC; border-right:1px solid #CCC; padding:1px 8px 1px 8px;}
 .tagsbox a:hover {background-color:#fFF;color:#333;}
 .tag-number {font-weight:700;font-family:sans-serif;}
+.marked-tags { margin-top: 0px;margin-bottom: 5px; }
+.deletable-tag { margin-right: 3px; white-space:nowrap; }
 
 /*奖牌*/
 a.medal  { font-size:14px; line-height:250%; font-weight:800; color:#333; text-decoration:none; background:url(../images/medala.gif) no-repeat; border-left:1px solid #EEE; border-top:1px solid #EEE; border-bottom:1px solid #CCC; border-right:1px solid #CCC; padding:4px 12px 4px 6px;}
@@ -1422,3 +1437,12 @@ ul.form-horizontal-rows li input {
     text-align:center;
     font-weight:bold;
 }
+#tagSelector {
+    padding-bottom: 2px;
+}
+#hideIgnoredTagsControl {
+    margin: 5px 0 0 0;
+}
+#hideIgnoredTagsCb {
+    margin: 0 2px 0 1px;
+}
diff --git a/templates/index.html b/templates/index.html
index 470612b4..68a13197 100644
--- a/templates/index.html
+++ b/templates/index.html
@@ -10,13 +10,15 @@
         <meta name={% endblock %} {% block forejs %} + var tags = {{ tags_autocomplete|safe }}; + $().ready(function(){ + var tab_id = "{{ tab_id }}"; + $("#"+tab_id).attr('className',"on"); + $("#nav_questions").attr('className',"on"); + }); + + + {% endblock %} {% block content %}
@@ -118,6 +120,8 @@
+{% else %} +{% include "tag_selector.html" %} {% endif %}

{% trans "Recent tags" %}

diff --git a/templates/questions.html b/templates/questions.html index 47bda129..63026dc3 100644 --- a/templates/questions.html +++ b/templates/questions.html @@ -8,16 +8,19 @@ {% block title %}{% spaceless %}{% trans "Questions" %}{% endspaceless %}{% endblock %} {% block forejs %} + var tags = {{ tags_autocomplete|safe }}; + $().ready(function(){ + var tab_id = "{{ tab_id }}"; + $("#"+tab_id).attr('className',"on"); + var on_tab = {% if is_unanswered %}'#nav_unanswered'{% else %}'#nav_questions'{% endif %}; + $(on_tab).attr('className','on'); + Hilite.exact = false; + Hilite.elementid = "listA"; + Hilite.debug_referrer = location.href; + }); + + + {% endblock %} {% block content %}
@@ -32,7 +35,11 @@ {% trans "Found by title" %} {% endif %} {% else %} - {% trans "All questions" %} + {% if is_unanswered %} + {% trans "Unanswered questions" %} + {% else %} + {% trans "All questions" %} + {% endif %} {% endif %} {% endif %}
@@ -45,7 +52,17 @@
{% for question in questions.object_list %} -
+
0 %} + style="background:#ffff99;" + {% else %} + {% if question.ignored_score > 0 %} + style="background:#f3f3f3;" + {% endif %} + {% endif %} + {% endif %} + >

{{ question.get_question_title }}

@@ -134,25 +151,18 @@ {% endblock %} {% block tail %} - -
- {% cnprog_paginator context %} - -
-
- {% cnprog_pagesize context %} -
- +
{% cnprog_paginator context %}
+
{% cnprog_pagesize context %}
{% endblock %} {% block sidebar %}
{% if searchtag %} - {% blocktrans count questions_count as cnt with questions_count|intcomma as q_num and searchtag as tagname %} - have total {{q_num}} questions tagged {{tagname}} - {% plural %} - have total {{q_num}} questions tagged {{tagname}} - {% endblocktrans %} + {% blocktrans count questions_count as cnt with questions_count|intcomma as q_num and searchtag as tagname %} + have total {{q_num}} questions tagged {{tagname}} + {% plural %} + have total {{q_num}} questions tagged {{tagname}} + {% endblocktrans %} {% else %} {% if searchtitle %} {% if settings.USE_SPHINX_SEARCH %} @@ -169,14 +179,22 @@ {% endblocktrans %} {% endif %} {% else %} - {% blocktrans count questions as cnt with questions_count|intcomma as q_num %} - have total {{q_num}} questions - {% plural %} - have total {{q_num}} questions - {% endblocktrans %} + {% if is_unanswered %} + {% blocktrans count questions as cnt with questions_count|intcomma as q_num %} + have total {{q_num}} unanswered questions + {% plural %} + have total {{q_num}} unanswered questions + {% endblocktrans %} + {% else %} + {% blocktrans count questions as cnt with questions_count|intcomma as q_num %} + have total {{q_num}} questions + {% plural %} + have total {{q_num}} questions + {% endblocktrans %} + {% endif %} {% endif %} {% endif %} -

+

{% ifequal tab_id "latest" %} {% trans "latest questions info" %} {% endifequal %} @@ -197,15 +215,17 @@ {% endifequal %}

+{% if request.user.is_authenticated %} +{% include "tag_selector.html" %} +{% endif %}

{% trans "Related tags" %}

{% for tag in tags %} - + × {{ tag.used_count|intcomma }}
{% endfor %} -
diff --git a/templates/tag_selector.html b/templates/tag_selector.html new file mode 100644 index 00000000..6edc5cc8 --- /dev/null +++ b/templates/tag_selector.html @@ -0,0 +1,42 @@ +{% load i18n %} +{% load extra_tags %} +
+

{% trans "Interesting tags" %}

+
+ {% for tag_name in interesting_tag_names %} + {% spaceless %} + + + + + {% endspaceless %} + {% endfor %} +
+ + +

{% trans "Ignored tags" %}

+
+ {% for tag_name in ignored_tag_names %} + {% spaceless %} + + + + + {% endspaceless %} + {% endfor %} +
+ + +

+ + +

+

diff --git a/templates/user_email_subscriptions.html b/templates/user_email_subscriptions.html index 8f27bd2a..c0204cbc 100644 --- a/templates/user_email_subscriptions.html +++ b/templates/user_email_subscriptions.html @@ -13,6 +13,9 @@ {% endif %}
{% include "edit_user_email_feeds_form.html" %} + + {{tag_filter_selection_form}} +
diff --git a/templates/user_stats.html b/templates/user_stats.html index 06f1cd2b..ecc39807 100644 --- a/templates/user_stats.html +++ b/templates/user_stats.html @@ -97,7 +97,7 @@ {% for tag in user_tags%} × {{ tag.user_tag_usage_count|intcomma }}
{% if forloop.counter|divisibleby:"10" %} -- cgit v1.2.3-1-g7c22