Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbpetering <bpetering@c213334d-75ef-0310-aa23-eaa082d1ae64>2009-07-28 09:17:51 (GMT)
committer bpetering <bpetering@c213334d-75ef-0310-aa23-eaa082d1ae64>2009-07-28 09:17:51 (GMT)
commit611c690629a9846e8592eb4cf193fe48cc78dee6 (patch)
treec5849c48beb1141c03b6ebf8e6770f5dccf592b2
parentb4be43f4c9e5dc91cea943d8dda0e743451165e4 (diff)
[misc/irclog] Cooler nick filtering
git-svn-id: http://svn.pugscode.org/pugs/misc/irclog@27774 c213334d-75ef-0310-aa23-eaa082d1ae64
-rw-r--r--cgi/nickfilter.js198
-rw-r--r--cgi/style.css26
-rw-r--r--cgi/template/day.tmpl9
3 files changed, 181 insertions, 52 deletions
diff --git a/cgi/nickfilter.js b/cgi/nickfilter.js
index 1ff33d0..e84ce21 100644
--- a/cgi/nickfilter.js
+++ b/cgi/nickfilter.js
@@ -1,38 +1,184 @@
-/* Enable filtering the current page to display only messages from a
- single nick, without context. Autocompletes all nicks on current page */
+/* Maybe-helpful filtering-by-nick stuff. */
+
+// Settings
+
+// match _id vars in style.css
+var filterbox_id = 'filterbox';
+var filter_toggle_id = 'filter_toggle'; // match in HTML
+
+var filter_hidden_id = 'filter_hidden';
+var filter_shown_id = 'filter_shown';
+
+var normalnick_id_prefix = 'fn_nick_';
+
+var special_metanick_id = 'fn_specialnick';
+var special_metanick_text = '(SPECIAL)';
+var special_metanick_nick = 'special';
+
+// Globals
+
+var hidden_nicks = new Object();
+var shown_nicks = new Object();
+var show_special = false; // bool
+
+// Set up nick filtering stuff when DOM is ready, i.e. when
+// we have all message rows ready to process
$(document).ready(function() {
var i = 0;
var ac_nicks = new Array();
var nicks_seen = new Object();
var nick;
- $("tr.nick").each(function() {
- var this_class = $(this).attr('class');
- var extr_re = new RegExp("nick_([^\x20]+)");
- var matches = this_class.match(extr_re);
- var nick = matches[1];
- //if (i++ < 5) { alert(nick); }
- ac_nicks.push(nick);
- });
- // uniq
- for (var i=0; i < ac_nicks.length; i++) {
- nicks_seen[ ac_nicks[i] ] = 1;
+ /** Pull nicks from HTML, put in initial store obj */
+ try {
+ $("tr.nick").each(function() {
+ var this_class = $(this).attr("class");
+ var extr_re = new RegExp("nick_([^\x20]+)");
+ var matches = this_class.match(extr_re);
+ if (matches) {
+ var nick = matches[1];
+ //if (i++ < 5) { alert(nick); }
+ hidden_nicks[ nick ] = 1;
+ }
+ });
+ } catch(e) { alert(e) }
+
+ /** Create filter panel/box thingy and add nicks */
+ try {
+ var filterbox = document.createElement("div");
+ $(filterbox).hide().css("position", "absolute");
+ $(filterbox).attr("id", filterbox_id);
+
+ // Add to body element
+ $("body").append(filterbox);
+
+ $(filterbox).append(
+ '<h2>Conversation</h2>'
+ + '<p>"' + special_metanick_text + '" == quits/joins etc</p>'
+
+ + '<div id="hidden_nicks">'
+ + '<h3>Add nicks</h3>'
+ + '<ul id="' + filter_hidden_id + '">'
+ + '</ul>'
+
+ + '<div id="shown_nicks">'
+ + '<h3>Remove nicks</h3>'
+ + '<ul id="' + filter_shown_id + '">'
+ + '</ul>'
+
+ + '<p><a href="javascript:filtering_off()">Filtering Off</a></p>'
+ );
+ } catch(e) { alert(e) }
+
+ $("#"+filter_toggle_id).append('<a href="javascript:filtering_on()">Turn on filtering by nick</a>');
+ $("#"+filter_toggle_id).show();
+
+});
+
+function obj_props(obj) {
+ var ret_array = new Array();
+ for (var i in obj) {
+ ret_array.push(i);
}
- ac_nicks.splice(0, ac_nicks.length); // empty
- for (nick in nicks_seen) {
- ac_nicks.push(nick);
+ return ret_array;
+}
+
+// not going to bother refactoring further ATM
+function render_nicklists() {
+ var hidden_list = obj_props(hidden_nicks);
+ var shown_list = obj_props(shown_nicks);
+
+ $("#"+filter_hidden_id).html('');
+ $("#"+filter_shown_id).html('');
+
+ hidden_list.sort();
+ for (var i=0; i < hidden_list.length; i++) {
+ $("#"+filter_hidden_id).append(gen_fnli_html(hidden_list[i]));
}
- ac_nicks.sort();
- $("#nick").autocomplete('', {}, ac_nicks);
-});
+ shown_list.sort();
+ for (var i=0; i < shown_list.length; i++) {
+ $("#"+filter_shown_id).append(gen_fnli_html(shown_list[i]));
+ }
+}
+
+function gen_fnli_html(nick) {
+ if (nick == special_metanick_nick) {
+ return '<li id="' + special_metanick_id + '">'
+ + '<a href="javascript:toggle_nick(\''
+ + special_metanick_nick + '\')">'
+ + special_metanick_text
+ + '</a></li>'
+ ;
+ }
+ else {
+ return '<li id="' + normalnick_id_prefix + nick + '">'
+ + '<a href="javascript:toggle_nick(\'' + nick + '\')">'
+ + nick
+ + '</a>'
+ + ' (&rarr; <a href="javascript:add_spoken_to(\''
+ + nick
+ + '\')">spoken to</a>)'
+ + '</li>'
+ ;
+ }
+}
-function filter() {
- var nick = $("#nick").val();
- var jq_sel = "tr:not(.nick_" + nick + ")";
- $(jq_sel).hide();
+function toggle_nick(nick) {
+ if (hidden_nicks[nick]) {
+ delete hidden_nicks[nick];
+ shown_nicks[nick] = 1;
+ }
+ else {
+ delete shown_nicks[nick];
+ hidden_nicks[nick] = 1;
+ }
+ filtering_apply();
+ render_nicklists();
}
-function unfilter() {
- $("tr.nick").show();
-} \ No newline at end of file
+// Adds all nicks a given nick spoke to ("$nick:") to conversation
+function add_spoken_to(nick) {
+ var i = 0;
+ alert('adding ST (nick='+nick+')...');
+ $("tr.nick_" + nick + " td.msg").each(function() {
+ var msg = $(this).html();
+ var matches = msg.match(/([^:]+):/);
+ if (matches) {
+ var nick = matches[1];
+
+ // If we can't find them in in hidden Obj, do nothing. Might not
+ // be present on page.
+ if (hidden_nicks[nick]) {
+ toggle_nick(nick);
+ }
+ }
+ });
+}
+
+// These apply/unapply filtering for ALL nicks
+function filtering_apply() {
+ var show_list = obj_props(shown_nicks);
+ $("tr").hide();
+ for (var i = 0; i < show_list.length; i++) {
+ $("tr.nick_"+show_list[i]).show();
+ }
+}
+function filtering_unapply() {
+ $("tr").show();
+}
+
+function filtering_on() {
+ $("#" + filter_toggle_id + " > a").html("Turn off filtering by nick");
+ $("#" + filter_toggle_id + " > a").attr("href", 'javascript:filtering_off()');
+ $("#"+filterbox_id).fadeIn();
+ filtering_apply();
+ render_nicklists();
+}
+
+function filtering_off() {
+ filtering_unapply();
+ $("#"+filterbox_id).fadeOut();
+ $("#" + filter_toggle_id + " > a").html("Turn on filtering by nick");
+ $("#" + filter_toggle_id + " > a").attr("href", 'javascript:filtering_on()');
+}
diff --git a/cgi/style.css b/cgi/style.css
index 36fe15c..d246ec5 100644
--- a/cgi/style.css
+++ b/cgi/style.css
@@ -125,22 +125,12 @@ abbr { cursor: help; }
#log td.msg { text-align: left !important; }
-/* Nick autocomplete */
-.ac_results {
- background: white;
- border: 1px solid #ccc;
-}
-.ac_results ul {
- margin: 0px;
- padding: 0px;
-}
-.ac_results li {
- list-style: none;
- margin: 0px;
- padding: 0px;
- font-family: Consolas,"Lucida Console","Courier New",monospace;
-}
-.ac_results li:hover {
- background: #70709f;
- cursor: default;
+
+#filterbox {
+ width: 300px;
+ top: 50px;
+ right: 50px;
+ padding: 10px;
+ background: #e0e0e0;
+ border: 2px solid #b0b0b0;
}
diff --git a/cgi/template/day.tmpl b/cgi/template/day.tmpl
index 2298620..24ab6f2 100644
--- a/cgi/template/day.tmpl
+++ b/cgi/template/day.tmpl
@@ -40,14 +40,7 @@
<div style="clear:both"></div>
</TMPL_IF>
- <p id="nickfilter"><label>Filter by nick:</label>
- <input type="text" id="nick" />
- <input type="button" value="Filter" onclick="filter()" />
- <input type="button" value="Unfilter" onclick="unfilter()" />
- <noscript><br />Nick filtering requires javascript, which seems to be
- missing or deactivated in your browser.
- </noscript>
- </p>
+ <p style="display: none;" id="filter_toggle"></p>
<table id="log" style="clear:both">
<tr class="head">