finished up UX integration for in-topic searching, added mousetrap lib to capture ctrl-F only in topic view, closed #1800

v1.18.x
Julian Lam 11 years ago
parent 5d22806ded
commit 063a4e5628

@ -1,3 +1,4 @@
{
"results_matching": "%1 result(s) matching \"%2\", (%3 seconds)"
"results_matching": "%1 result(s) matching \"%2\", (%3 seconds)",
"no-matches": "No posts found"
}

@ -116,10 +116,14 @@ $(document).ready(function() {
ajaxify.initialLoad = false;
app.refreshTitle(url);
}, animationDuration * 1000 - ((new Date()).getTime() - startTime))
}, animationDuration * 1000 - ((new Date()).getTime() - startTime));
});
});
require(['search'], function(search) {
search.topicDOM.end();
});
});
return true;

@ -419,11 +419,20 @@ var socket,
searchFields = $("#search-fields"),
searchInput = $('#search-fields input');
$('#search-form').on('submit', dismissSearch);
searchInput.on('blur', dismissSearch);
function dismissSearch(){
searchFields.hide();
searchButton.show();
}
function prepareSearch() {
searchFields.removeClass('hide').show();
searchButton.hide();
searchInput.focus();
}
searchButton.on('click', function(e) {
if (!config.loggedIn && !config.allowGuestSearching) {
app.alert({
@ -435,17 +444,11 @@ var socket,
}
e.stopPropagation();
searchFields.removeClass('hide').show();
$(this).hide();
searchInput.focus();
$('#search-form').on('submit', dismissSearch);
searchInput.on('blur', dismissSearch);
prepareSearch();
return false;
});
require(['search'], function(search) {
require(['search', 'mousetrap'], function(search, Mousetrap) {
$('#search-form').on('submit', function (e) {
e.preventDefault();
var input = $(this).find('input'),
@ -464,6 +467,18 @@ var socket,
.on('click', '.next', function() {
search.topicDOM.next();
});
Mousetrap.bind('ctrl+f', function(e) {
// If in topic, open search window and populate, otherwise regular behaviour
var match = ajaxify.currentPage.match(/^topic\/([\d]+)/),
tid;
if (match) {
e.preventDefault();
tid = match[1];
searchInput.val('in:topic-' + tid + ' ');
prepareSearch();
}
});
});
}

@ -51,16 +51,6 @@ define('search', ['navigator'], function(nav) {
};
Search.topicDOM = {};
Search.topicDOM.start = function() {
var topicSearchEl = $('.topic-search');
topicSearchEl.find('.count').html('1 / ' + Search.current.results.length);
topicSearchEl.removeClass('hidden');
Search.checkPagePresence(Search.current.tid, function() {
Search.highlightResult(0);
});
};
Search.topicDOM.prev = function() {
Search.topicDOM.update((Search.current.index === 0) ? Search.current.results.length-1 : Search.current.index-1);
};
@ -71,17 +61,26 @@ define('search', ['navigator'], function(nav) {
Search.topicDOM.update = function(index) {
var topicSearchEl = $('.topic-search');
Search.current.index = index;
topicSearchEl.find('.count').html((index+1) + ' / ' + Search.current.results.length);
topicSearchEl.removeClass('hidden');
Search.checkPagePresence(Search.current.tid, function() {
socket.emit('posts.getPidIndex', Search.current.results[index], function(err, postIndex) {
nav.scrollToPost(postIndex-1, true); // why -1? Ask @barisusakli
if (Search.current.results.length > 0) {
topicSearchEl.find('.count').html((index+1) + ' / ' + Search.current.results.length);
topicSearchEl.removeClass('hidden').find('.prev, .next').removeAttr('disabled');
Search.checkPagePresence(Search.current.tid, function() {
socket.emit('posts.getPidIndex', Search.current.results[index], function(err, postIndex) {
nav.scrollToPost(postIndex-1, true); // why -1? Ask @barisusakli
});
});
});
} else {
translator.translate('[[search:no-matches]]', function(text) {
topicSearchEl.find('.count').html(text);
});
topicSearchEl.removeClass('hidden').find('.prev, .next').attr('disabled', 'disabled');
}
};
Search.topicDOM.end = function() {
$('.topic-search').addClass('hidden');
};
return Search;

@ -0,0 +1,9 @@
/* mousetrap v1.4.6 craig.is/killing/mice */
(function(J,r,f){function s(a,b,d){a.addEventListener?a.addEventListener(b,d,!1):a.attachEvent("on"+b,d)}function A(a){if("keypress"==a.type){var b=String.fromCharCode(a.which);a.shiftKey||(b=b.toLowerCase());return b}return h[a.which]?h[a.which]:B[a.which]?B[a.which]:String.fromCharCode(a.which).toLowerCase()}function t(a){a=a||{};var b=!1,d;for(d in n)a[d]?b=!0:n[d]=0;b||(u=!1)}function C(a,b,d,c,e,v){var g,k,f=[],h=d.type;if(!l[a])return[];"keyup"==h&&w(a)&&(b=[a]);for(g=0;g<l[a].length;++g)if(k=
l[a][g],!(!c&&k.seq&&n[k.seq]!=k.level||h!=k.action||("keypress"!=h||d.metaKey||d.ctrlKey)&&b.sort().join(",")!==k.modifiers.sort().join(","))){var m=c&&k.seq==c&&k.level==v;(!c&&k.combo==e||m)&&l[a].splice(g,1);f.push(k)}return f}function K(a){var b=[];a.shiftKey&&b.push("shift");a.altKey&&b.push("alt");a.ctrlKey&&b.push("ctrl");a.metaKey&&b.push("meta");return b}function x(a,b,d,c){m.stopCallback(b,b.target||b.srcElement,d,c)||!1!==a(b,d)||(b.preventDefault?b.preventDefault():b.returnValue=!1,b.stopPropagation?
b.stopPropagation():b.cancelBubble=!0)}function y(a){"number"!==typeof a.which&&(a.which=a.keyCode);var b=A(a);b&&("keyup"==a.type&&z===b?z=!1:m.handleKey(b,K(a),a))}function w(a){return"shift"==a||"ctrl"==a||"alt"==a||"meta"==a}function L(a,b,d,c){function e(b){return function(){u=b;++n[a];clearTimeout(D);D=setTimeout(t,1E3)}}function v(b){x(d,b,a);"keyup"!==c&&(z=A(b));setTimeout(t,10)}for(var g=n[a]=0;g<b.length;++g){var f=g+1===b.length?v:e(c||E(b[g+1]).action);F(b[g],f,c,a,g)}}function E(a,b){var d,
c,e,f=[];d="+"===a?["+"]:a.split("+");for(e=0;e<d.length;++e)c=d[e],G[c]&&(c=G[c]),b&&"keypress"!=b&&H[c]&&(c=H[c],f.push("shift")),w(c)&&f.push(c);d=c;e=b;if(!e){if(!p){p={};for(var g in h)95<g&&112>g||h.hasOwnProperty(g)&&(p[h[g]]=g)}e=p[d]?"keydown":"keypress"}"keypress"==e&&f.length&&(e="keydown");return{key:c,modifiers:f,action:e}}function F(a,b,d,c,e){q[a+":"+d]=b;a=a.replace(/\s+/g," ");var f=a.split(" ");1<f.length?L(a,f,b,d):(d=E(a,d),l[d.key]=l[d.key]||[],C(d.key,d.modifiers,{type:d.action},
c,a,e),l[d.key][c?"unshift":"push"]({callback:b,modifiers:d.modifiers,action:d.action,seq:c,level:e,combo:a}))}var h={8:"backspace",9:"tab",13:"enter",16:"shift",17:"ctrl",18:"alt",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"ins",46:"del",91:"meta",93:"meta",224:"meta"},B={106:"*",107:"+",109:"-",110:".",111:"/",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},H={"~":"`","!":"1",
"@":"2","#":"3",$:"4","%":"5","^":"6","&":"7","*":"8","(":"9",")":"0",_:"-","+":"=",":":";",'"':"'","<":",",">":".","?":"/","|":"\\"},G={option:"alt",command:"meta","return":"enter",escape:"esc",mod:/Mac|iPod|iPhone|iPad/.test(navigator.platform)?"meta":"ctrl"},p,l={},q={},n={},D,z=!1,I=!1,u=!1;for(f=1;20>f;++f)h[111+f]="f"+f;for(f=0;9>=f;++f)h[f+96]=f;s(r,"keypress",y);s(r,"keydown",y);s(r,"keyup",y);var m={bind:function(a,b,d){a=a instanceof Array?a:[a];for(var c=0;c<a.length;++c)F(a[c],b,d);return this},
unbind:function(a,b){return m.bind(a,function(){},b)},trigger:function(a,b){if(q[a+":"+b])q[a+":"+b]({},a);return this},reset:function(){l={};q={};return this},stopCallback:function(a,b){return-1<(" "+b.className+" ").indexOf(" mousetrap ")?!1:"INPUT"==b.tagName||"SELECT"==b.tagName||"TEXTAREA"==b.tagName||b.isContentEditable},handleKey:function(a,b,d){var c=C(a,b,d),e;b={};var f=0,g=!1;for(e=0;e<c.length;++e)c[e].seq&&(f=Math.max(f,c[e].level));for(e=0;e<c.length;++e)c[e].seq?c[e].level==f&&(g=!0,
b[c[e].seq]=1,x(c[e].callback,d,c[e].combo,c[e].seq)):g||x(c[e].callback,d,c[e].combo);c="keypress"==d.type&&I;d.type!=u||w(a)||c||t(b);I=g&&"keydown"==d.type}};J.Mousetrap=m;"function"===typeof define&&define.amd&&define('mousetrap', m)})(window,document);

@ -36,6 +36,7 @@ module.exports = function(Meta) {
'public/vendor/xregexp/xregexp.js',
'public/vendor/xregexp/unicode/unicode-base.js',
'public/vendor/buzz/buzz.min.js',
'public/vendor/mousetrap/mousetrap.js',
'./node_modules/templates.js/lib/templates.js',
'public/src/utils.js',
'public/src/app.js',

Loading…
Cancel
Save