aboutsummaryrefslogtreecommitdiff
path: root/data/stuff/js
diff options
context:
space:
mode:
Diffstat (limited to 'data/stuff/js')
-rw-r--r--data/stuff/js/search-field.js79
-rw-r--r--data/stuff/js/util.js15
2 files changed, 94 insertions, 0 deletions
diff --git a/data/stuff/js/search-field.js b/data/stuff/js/search-field.js
new file mode 100644
index 0000000..42bec10
--- /dev/null
+++ b/data/stuff/js/search-field.js
@@ -0,0 +1,79 @@
+jQuery(function($) {
+ "use strict";
+
+ function clear_delay(el) {
+ var ival = el.data('search-interval');
+
+ if (ival) {
+ // clear interval
+ clearInterval(ival);
+ el.data('search-interval', null);
+ }
+ }
+
+ function trigger_search(el, q) {
+ if (q == el.data('q'))
+ return;
+
+ // cache search
+ el.data('q', q);
+
+ // trigger search
+ el.trigger({
+ type: "search-update",
+ query: "",
+ });
+ }
+
+ $('.btn.search-toggle').click(function() {
+ var btn = $(this),
+ bar = btn.parents('.panel').find('.panel-heading.search-toggle'),
+ field = bar.find('input');
+
+ // toggle button highlight
+ btn.toggleClass('btn-primary btn-default')
+ var active = btn.hasClass('btn-primary');
+
+ // clear field
+ field.val('');
+
+ // toggle bar visibility
+ bar.toggleClass('hidden', !active);
+
+ if (active) {
+ setTimeout(function() {
+ // focus text field
+ field.focus();
+ }, 10);
+ } else {
+ // trigger search
+ trigger_search(field, '');
+ }
+ });
+
+ $('.panel-heading.search-toggle input').keydown(function(ev) {
+ var me = $(this),
+ trigger = me.data('search-trigger') || 'delay';
+
+ if (trigger == 'delay') {
+ clear_delay(me);
+
+ setTimeout(function() {
+ clear_delay(me);
+ trigger_search(me, me.val());
+ }, me.data('search-delay') || 100);
+ } else if (trigger == 'enter') {
+ if (ev.which == 13) {
+ setTimeout(function() {
+ trigger_search(me, me.val());
+ }, 10);
+
+ // stop event
+ return false;
+ }
+ } else {
+ // unknown trigger type
+ throw new Error('unknown search trigger: ' + trigger);
+ }
+ });
+});
diff --git a/data/stuff/js/util.js b/data/stuff/js/util.js
index c021499..ed048ec 100644
--- a/data/stuff/js/util.js
+++ b/data/stuff/js/util.js
@@ -1,3 +1,18 @@
+$.fn.reduce = (function() {
+ if (Array.prototype.reduce) {
+ return Array.prototype.reduce;
+ } else {
+ return function(a, cb, r) {
+ a = [].concat(a);
+
+ for (var i = 0, l = a.length; i < l; i++)
+ r = cb(r, a[i]);
+
+ return r;
+ };
+ }
+})();
+
jQuery(function($) {
"use strict";