jquery-atwho-rails 1.1.0 → 1.3.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f147f6dc894847559d1f5c240cbdb7a46fe14409
4
- data.tar.gz: eabd2f00d29fe2e8480e251848aea0a2041c00f1
3
+ metadata.gz: 80acb080f644075e726726590ef4844a29fcaaf1
4
+ data.tar.gz: 738cc9113f6208dd94674f646d77a6decc0b07f4
5
5
  SHA512:
6
- metadata.gz: c0bc1c81a508bab44cfbc9c927a504e61e7b3410918082b1512a72b0eb9c31b037f955d6cbe2e5f7e583354d5a2cdd7a94c3ef9e65d7af83e6f189dde49f5487
7
- data.tar.gz: 820e7b345bb800961e39a45a6f6f8a877b3579e706758b928a9733b2b927f0bebbfd7f00ecffd93272466b5907c191602148702a2b0bf8025e6e2553e27432b6
6
+ metadata.gz: 6bfd5e521b619a0fb9794c9c03677b6d7dcc27b636da3f8bfda4da0e000818726081880c6a65eca467e2074f5beceb19ca1dc9ecbf49c29b4ae34de11879be78
7
+ data.tar.gz: 9b2daefbe83e0569098e5e46e8feb61f1540312bea3bf13de4bbf2c1943e7b582af0643b6094fd23a7a09f6aa8bc7803a3f0359faa158d528673abc17d7085d2
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "jquery-atwho-rails",
3
+ "version": "1.3.2",
4
+ "homepage": "https://github.com/ichord/jquery-atwho-rails",
5
+ "authors": [
6
+ "ichord <chord.luo@gmail.com>"
7
+ ],
8
+ "license": "MIT",
9
+ "ignore": [
10
+ "**/.*",
11
+ "node_modules",
12
+ "bower_components",
13
+ "test",
14
+ "tests"
15
+ ],
16
+ "dependencies": {
17
+ "At.js": "~1.3.0"
18
+ }
19
+ }
@@ -1,17 +1,17 @@
1
- /*! jquery.atwho - v1.1.0 %>
1
+ /*! jquery.atwho - v1.3.2 %>
2
2
  * Copyright (c) 2015 chord.luo <chord.luo@gmail.com>;
3
3
  * homepage: http://ichord.github.com/At.js
4
4
  * Licensed MIT
5
5
  */
6
6
  (function (root, factory) {
7
7
  if (typeof define === 'function' && define.amd) {
8
- // AMD. Register as an anonymous module.
9
- define(["jquery"], function (jquery) {
10
- return (root.returnExportsGlobal = factory(jquery));
8
+ // AMD. Register as an anonymous module unless amdModuleId is set
9
+ define(["jquery"], function (a0) {
10
+ return (factory(a0));
11
11
  });
12
12
  } else if (typeof exports === 'object') {
13
13
  // Node. Does not work with strict CommonJS, but
14
- // only CommonJS-like enviroments that support module.exports,
14
+ // only CommonJS-like environments that support module.exports,
15
15
  // like Node.
16
16
  module.exports = factory(require("jquery"));
17
17
  } else {
@@ -19,10 +19,12 @@
19
19
  }
20
20
  }(this, function (jquery) {
21
21
 
22
- var Api, App, Controller, DEFAULT_CALLBACKS, EditableController, KEY_CODE, Model, TextareaController, View,
23
- __slice = [].slice,
24
- __hasProp = {}.hasOwnProperty,
25
- __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
22
+ var $, Api, App, Controller, DEFAULT_CALLBACKS, EditableController, KEY_CODE, Model, TextareaController, View,
23
+ slice = [].slice,
24
+ extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
25
+ hasProp = {}.hasOwnProperty;
26
+
27
+ $ = jquery;
26
28
 
27
29
  App = (function() {
28
30
  function App(inputor) {
@@ -35,9 +37,9 @@ App = (function() {
35
37
  }
36
38
 
37
39
  App.prototype.createContainer = function(doc) {
38
- var _ref;
39
- if ((_ref = this.$el) != null) {
40
- _ref.remove();
40
+ var ref;
41
+ if ((ref = this.$el) != null) {
42
+ ref.remove();
41
43
  }
42
44
  return $(doc.body).append(this.$el = $("<div class='atwho-container'></div>"));
43
45
  };
@@ -59,20 +61,22 @@ App = (function() {
59
61
  } catch (_error) {
60
62
  error = _error;
61
63
  this.iframe = null;
62
- throw new Error("iframe auto-discovery is failed.\nPlease use `setIframe` to set the target iframe manually.");
64
+ if ($.fn.atwho.debug) {
65
+ throw new Error("iframe auto-discovery is failed.\nPlease use `setIframe` to set the target iframe manually.\n" + error);
66
+ }
63
67
  }
64
68
  }
65
69
  return this.createContainer((this.iframeAsRoot = asRoot) ? this.document : document);
66
70
  };
67
71
 
68
72
  App.prototype.controller = function(at) {
69
- var c, current, currentFlag, _ref;
73
+ var c, current, currentFlag, ref;
70
74
  if (this.aliasMaps[at]) {
71
75
  current = this.controllers[this.aliasMaps[at]];
72
76
  } else {
73
- _ref = this.controllers;
74
- for (currentFlag in _ref) {
75
- c = _ref[currentFlag];
77
+ ref = this.controllers;
78
+ for (currentFlag in ref) {
79
+ c = ref[currentFlag];
76
80
  if (currentFlag === at) {
77
81
  current = c;
78
82
  break;
@@ -92,8 +96,8 @@ App = (function() {
92
96
  };
93
97
 
94
98
  App.prototype.reg = function(flag, setting) {
95
- var controller, _base;
96
- controller = (_base = this.controllers)[flag] || (_base[flag] = this.$inputor.is('[contentEditable]') ? new EditableController(this, flag) : new TextareaController(this, flag));
99
+ var base, controller;
100
+ controller = (base = this.controllers)[flag] || (base[flag] = this.$inputor.is('[contentEditable]') ? new EditableController(this, flag) : new TextareaController(this, flag));
97
101
  if (setting.alias) {
98
102
  this.aliasMaps[setting.alias] = flag;
99
103
  }
@@ -104,9 +108,9 @@ App = (function() {
104
108
  App.prototype.listen = function() {
105
109
  return this.$inputor.on('compositionstart', (function(_this) {
106
110
  return function(e) {
107
- var _ref;
108
- if ((_ref = _this.controller()) != null) {
109
- _ref.view.hide();
111
+ var ref;
112
+ if ((ref = _this.controller()) != null) {
113
+ ref.view.hide();
110
114
  }
111
115
  return _this.isComposing = true;
112
116
  };
@@ -122,15 +126,11 @@ App = (function() {
122
126
  return function(e) {
123
127
  return _this.onKeydown(e);
124
128
  };
125
- })(this)).on('scroll.atwhoInner', (function(_this) {
126
- return function(e) {
127
- var _ref;
128
- return (_ref = _this.controller()) != null ? _ref.view.hide(e) : void 0;
129
- };
130
129
  })(this)).on('blur.atwhoInner', (function(_this) {
131
130
  return function(e) {
132
131
  var c;
133
132
  if (c = _this.controller()) {
133
+ c.expectedQueryCBId = null;
134
134
  return c.view.hide(e, c.getOpt("displayTimeout"));
135
135
  }
136
136
  };
@@ -138,14 +138,30 @@ App = (function() {
138
138
  return function(e) {
139
139
  return _this.dispatch(e);
140
140
  };
141
- })(this));
141
+ })(this)).on('scroll.atwhoInner', (function(_this) {
142
+ return function() {
143
+ var lastScrollTop;
144
+ lastScrollTop = _this.$inputor.scrollTop();
145
+ return function(e) {
146
+ var currentScrollTop, ref;
147
+ currentScrollTop = e.target.scrollTop;
148
+ if (lastScrollTop !== currentScrollTop) {
149
+ if ((ref = _this.controller()) != null) {
150
+ ref.view.hide(e);
151
+ }
152
+ }
153
+ lastScrollTop = currentScrollTop;
154
+ return true;
155
+ };
156
+ };
157
+ })(this)());
142
158
  };
143
159
 
144
160
  App.prototype.shutdown = function() {
145
- var c, _, _ref;
146
- _ref = this.controllers;
147
- for (_ in _ref) {
148
- c = _ref[_];
161
+ var _, c, ref;
162
+ ref = this.controllers;
163
+ for (_ in ref) {
164
+ c = ref[_];
149
165
  c.destroy();
150
166
  delete this.controllers[_];
151
167
  }
@@ -154,32 +170,23 @@ App = (function() {
154
170
  };
155
171
 
156
172
  App.prototype.dispatch = function(e) {
157
- return $.map(this.controllers, (function(_this) {
158
- return function(c) {
159
- var delay;
160
- if (delay = c.getOpt('delay')) {
161
- clearTimeout(_this.delayedCallback);
162
- return _this.delayedCallback = setTimeout(function() {
163
- if (c.lookUp(e)) {
164
- return _this.setContextFor(c.at);
165
- }
166
- }, delay);
167
- } else {
168
- if (c.lookUp(e)) {
169
- return _this.setContextFor(c.at);
170
- }
171
- }
172
- };
173
- })(this));
173
+ var _, c, ref, results;
174
+ ref = this.controllers;
175
+ results = [];
176
+ for (_ in ref) {
177
+ c = ref[_];
178
+ results.push(c.lookUp(e));
179
+ }
180
+ return results;
174
181
  };
175
182
 
176
183
  App.prototype.onKeyup = function(e) {
177
- var _ref;
184
+ var ref;
178
185
  switch (e.keyCode) {
179
186
  case KEY_CODE.ESC:
180
187
  e.preventDefault();
181
- if ((_ref = this.controller()) != null) {
182
- _ref.view.hide();
188
+ if ((ref = this.controller()) != null) {
189
+ ref.view.hide();
183
190
  }
184
191
  break;
185
192
  case KEY_CODE.DOWN:
@@ -199,8 +206,8 @@ App = (function() {
199
206
  };
200
207
 
201
208
  App.prototype.onKeydown = function(e) {
202
- var view, _ref;
203
- view = (_ref = this.controller()) != null ? _ref.view : void 0;
209
+ var ref, view;
210
+ view = (ref = this.controller()) != null ? ref.view : void 0;
204
211
  if (!(view && view.visible())) {
205
212
  return;
206
213
  }
@@ -240,8 +247,15 @@ App = (function() {
240
247
  if (!this.controller().getOpt('spaceSelectsMatch') && e.keyCode === KEY_CODE.SPACE) {
241
248
  return;
242
249
  }
243
- e.preventDefault();
244
- view.choose(e);
250
+ if (!this.controller().getOpt('tabSelectsMatch') && e.keyCode === KEY_CODE.TAB) {
251
+ return;
252
+ }
253
+ if (view.highlighted()) {
254
+ e.preventDefault();
255
+ view.choose(e);
256
+ } else {
257
+ view.hide(e);
258
+ }
245
259
  break;
246
260
  default:
247
261
  $.noop();
@@ -257,11 +271,12 @@ Controller = (function() {
257
271
  return (Math.random().toString(16) + "000000000").substr(2, 8) + (new Date().getTime());
258
272
  };
259
273
 
260
- function Controller(app, at) {
261
- this.app = app;
262
- this.at = at;
274
+ function Controller(app1, at1) {
275
+ this.app = app1;
276
+ this.at = at1;
263
277
  this.$inputor = this.app.$inputor;
264
278
  this.id = this.$inputor[0].id || this.uid();
279
+ this.expectedQueryCBId = null;
265
280
  this.setting = null;
266
281
  this.query = null;
267
282
  this.pos = 0;
@@ -288,12 +303,12 @@ Controller = (function() {
288
303
 
289
304
  Controller.prototype.callDefault = function() {
290
305
  var args, error, funcName;
291
- funcName = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
306
+ funcName = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
292
307
  try {
293
308
  return DEFAULT_CALLBACKS[funcName].apply(this, args);
294
309
  } catch (_error) {
295
310
  error = _error;
296
- return $.error("" + error + " Or maybe At.js doesn't have function " + funcName);
311
+ return $.error(error + " Or maybe At.js doesn't have function " + funcName);
297
312
  }
298
313
  };
299
314
 
@@ -304,7 +319,7 @@ Controller = (function() {
304
319
  }
305
320
  data.push(this);
306
321
  alias = this.getOpt('alias');
307
- eventName = alias ? "" + name + "-" + alias + ".atwho" : "" + name + ".atwho";
322
+ eventName = alias ? name + "-" + alias + ".atwho" : name + ".atwho";
308
323
  return this.$inputor.trigger(eventName, data);
309
324
  };
310
325
 
@@ -328,7 +343,7 @@ Controller = (function() {
328
343
  data = $.extend({}, $li.data('item-data'), {
329
344
  'atwho-at': this.at
330
345
  });
331
- return this.callbacks("tplEval").call(this, tpl, data);
346
+ return this.callbacks("tplEval").call(this, tpl, data, "onInsert");
332
347
  };
333
348
 
334
349
  Controller.prototype.renderView = function(data) {
@@ -339,46 +354,97 @@ Controller = (function() {
339
354
  };
340
355
 
341
356
  Controller.arrayToDefaultHash = function(data) {
342
- var item, _i, _len, _results;
357
+ var i, item, len, results;
343
358
  if (!$.isArray(data)) {
344
359
  return data;
345
360
  }
346
- _results = [];
347
- for (_i = 0, _len = data.length; _i < _len; _i++) {
348
- item = data[_i];
361
+ results = [];
362
+ for (i = 0, len = data.length; i < len; i++) {
363
+ item = data[i];
349
364
  if ($.isPlainObject(item)) {
350
- _results.push(item);
365
+ results.push(item);
351
366
  } else {
352
- _results.push({
367
+ results.push({
353
368
  name: item
354
369
  });
355
370
  }
356
371
  }
357
- return _results;
372
+ return results;
358
373
  };
359
374
 
360
375
  Controller.prototype.lookUp = function(e) {
361
- var query, _callback;
362
- if (!(query = this.catchQuery(e))) {
363
- return;
376
+ var query, wait;
377
+ query = this.catchQuery(e);
378
+ if (!query) {
379
+ this.expectedQueryCBId = null;
380
+ return query;
381
+ }
382
+ this.app.setContextFor(this.at);
383
+ if (wait = this.getOpt('delay')) {
384
+ this._delayLookUp(query, wait);
385
+ } else {
386
+ this._lookUp(query);
387
+ }
388
+ return query;
389
+ };
390
+
391
+ Controller.prototype._delayLookUp = function(query, wait) {
392
+ var now, remaining;
393
+ now = Date.now ? Date.now() : new Date().getTime();
394
+ this.previousCallTime || (this.previousCallTime = now);
395
+ remaining = wait - (now - this.previousCallTime);
396
+ if ((0 < remaining && remaining < wait)) {
397
+ this.previousCallTime = now;
398
+ this._stopDelayedCall();
399
+ return this.delayedCallTimeout = setTimeout((function(_this) {
400
+ return function() {
401
+ _this.previousCallTime = 0;
402
+ _this.delayedCallTimeout = null;
403
+ return _this._lookUp(query);
404
+ };
405
+ })(this), wait);
406
+ } else {
407
+ this._stopDelayedCall();
408
+ if (this.previousCallTime !== now) {
409
+ this.previousCallTime = 0;
410
+ }
411
+ return this._lookUp(query);
412
+ }
413
+ };
414
+
415
+ Controller.prototype._stopDelayedCall = function() {
416
+ if (this.delayedCallTimeout) {
417
+ clearTimeout(this.delayedCallTimeout);
418
+ return this.delayedCallTimeout = null;
364
419
  }
365
- _callback = function(data) {
420
+ };
421
+
422
+ Controller.prototype._generateQueryCBId = function() {
423
+ return {};
424
+ };
425
+
426
+ Controller.prototype._lookUp = function(query) {
427
+ var _callback;
428
+ _callback = function(queryCBId, data) {
429
+ if (queryCBId !== this.expectedQueryCBId) {
430
+ return;
431
+ }
366
432
  if (data && data.length > 0) {
367
433
  return this.renderView(this.constructor.arrayToDefaultHash(data));
368
434
  } else {
369
435
  return this.view.hide();
370
436
  }
371
437
  };
372
- this.model.query(query.text, $.proxy(_callback, this));
373
- return query;
438
+ this.expectedQueryCBId = this._generateQueryCBId();
439
+ return this.model.query(query.text, $.proxy(_callback, this, this.expectedQueryCBId));
374
440
  };
375
441
 
376
442
  return Controller;
377
443
 
378
444
  })();
379
445
 
380
- TextareaController = (function(_super) {
381
- __extends(TextareaController, _super);
446
+ TextareaController = (function(superClass) {
447
+ extend(TextareaController, superClass);
382
448
 
383
449
  function TextareaController() {
384
450
  return TextareaController.__super__.constructor.apply(this, arguments);
@@ -451,8 +517,8 @@ TextareaController = (function(_super) {
451
517
 
452
518
  })(Controller);
453
519
 
454
- EditableController = (function(_super) {
455
- __extends(EditableController, _super);
520
+ EditableController = (function(superClass) {
521
+ extend(EditableController, superClass);
456
522
 
457
523
  function EditableController() {
458
524
  return EditableController.__super__.constructor.apply(this, arguments);
@@ -491,13 +557,15 @@ EditableController = (function(_super) {
491
557
  range = this._getRange();
492
558
  }
493
559
  sel = this.app.window.getSelection();
494
- sel.removeAllRanges();
495
- return sel.addRange(range);
560
+ if (this.ctrl_a_pressed == null) {
561
+ sel.removeAllRanges();
562
+ return sel.addRange(range);
563
+ }
496
564
  };
497
565
 
498
566
  EditableController.prototype._movingEvent = function(e) {
499
- var _ref;
500
- return e.type === 'click' || ((_ref = e.which) === KEY_CODE.RIGHT || _ref === KEY_CODE.LEFT || _ref === KEY_CODE.UP || _ref === KEY_CODE.DOWN);
567
+ var ref;
568
+ return e.type === 'click' || ((ref = e.which) === KEY_CODE.RIGHT || ref === KEY_CODE.LEFT || ref === KEY_CODE.UP || ref === KEY_CODE.DOWN);
501
569
  };
502
570
 
503
571
  EditableController.prototype._unwrap = function(node) {
@@ -511,13 +579,23 @@ EditableController = (function(_super) {
511
579
  };
512
580
 
513
581
  EditableController.prototype.catchQuery = function(e) {
514
- var $inserted, $query, index, inserted, lastNode, matched, offset, query, range, _range;
582
+ var $inserted, $query, _range, index, inserted, lastNode, matched, offset, query, range;
515
583
  if (this.app.isComposing) {
516
584
  return;
517
585
  }
518
586
  if (!(range = this._getRange())) {
519
587
  return;
520
588
  }
589
+ if (e.which === KEY_CODE.CTRL) {
590
+ this.ctrl_pressed = true;
591
+ } else if (e.which === KEY_CODE.A) {
592
+ if (this.ctrl_pressed == null) {
593
+ this.ctrl_a_pressed = true;
594
+ }
595
+ } else {
596
+ delete this.ctrl_a_pressed;
597
+ delete this.ctrl_pressed;
598
+ }
521
599
  if (e.which === KEY_CODE.ENTER) {
522
600
  ($query = $(range.startContainer).closest('.atwho-query')).contents().unwrap();
523
601
  if ($query.is(':empty')) {
@@ -537,7 +615,7 @@ EditableController = (function(_super) {
537
615
  _range.setStart(range.startContainer, offset);
538
616
  if ($(_range.cloneContents()).contents().last().is('.atwho-inserted')) {
539
617
  inserted = $(range.startContainer).contents().get(offset);
540
- this._setRange("after", $(inserted).contents().last());
618
+ this._setRange('after', $(inserted).contents().last());
541
619
  }
542
620
  } else if (e.which === KEY_CODE.LEFT && range.startContainer.nodeType === document.TEXT_NODE) {
543
621
  $inserted = $(range.startContainer.previousSibling);
@@ -558,7 +636,7 @@ EditableController = (function(_super) {
558
636
  matched = this.callbacks("matcher").call(this, this.at, _range.toString(), this.getOpt('startWithSpace'));
559
637
  if ($query.length === 0 && typeof matched === 'string' && (index = range.startOffset - this.at.length - matched.length) >= 0) {
560
638
  range.setStart(range.startContainer, index);
561
- $query = $("<span/>", this.app.document).attr(this.getOpt("editableAtwhoQueryAttrs")).addClass('atwho-query');
639
+ $query = $('<span/>', this.app.document).attr(this.getOpt("editableAtwhoQueryAttrs")).addClass('atwho-query');
562
640
  range.surroundContents($query.get(0));
563
641
  lastNode = $query.contents().last().get(0);
564
642
  if (/firefox/i.test(navigator.userAgent)) {
@@ -606,7 +684,7 @@ EditableController = (function(_super) {
606
684
 
607
685
  EditableController.prototype.insert = function(content, $li) {
608
686
  var range, suffix, suffixNode;
609
- suffix = (suffix = this.getOpt('suffix')) ? suffix : suffix || "\u00A0";
687
+ suffix = (suffix = this.getOpt('suffix')) === "" ? suffix : suffix || "\u00A0";
610
688
  this.query.el.removeClass('atwho-query').addClass('atwho-inserted').html(content);
611
689
  if (range = this._getRange()) {
612
690
  range.setEndAfter(this.query.el[0]);
@@ -640,7 +718,7 @@ Model = (function() {
640
718
  };
641
719
 
642
720
  Model.prototype.query = function(query, callback) {
643
- var data, searchKey, _remoteFilter;
721
+ var _remoteFilter, data, searchKey;
644
722
  data = this.fetch();
645
723
  searchKey = this.context.getOpt("searchKey");
646
724
  data = this.context.callbacks('filter').call(this.context, query, data, searchKey) || [];
@@ -729,6 +807,10 @@ View = (function() {
729
807
  return this.$el.is(":visible");
730
808
  };
731
809
 
810
+ View.prototype.highlighted = function() {
811
+ return this.$el.find(".cur").length > 0;
812
+ };
813
+
732
814
  View.prototype.choose = function(e) {
733
815
  var $li, content;
734
816
  if (($li = this.$el.find(".cur")).length) {
@@ -743,7 +825,7 @@ View = (function() {
743
825
  };
744
826
 
745
827
  View.prototype.reposition = function(rect) {
746
- var offset, overflowOffset, _ref, _window;
828
+ var _window, offset, overflowOffset, ref;
747
829
  _window = this.context.app.iframeAsRoot ? this.context.app.window : window;
748
830
  if (rect.bottom + this.$el.height() - $(_window).scrollTop() > $(_window).height()) {
749
831
  rect.bottom = rect.top - this.$el.height();
@@ -755,8 +837,8 @@ View = (function() {
755
837
  left: rect.left,
756
838
  top: rect.bottom
757
839
  };
758
- if ((_ref = this.context.callbacks("beforeReposition")) != null) {
759
- _ref.call(this.context, offset);
840
+ if ((ref = this.context.callbacks("beforeReposition")) != null) {
841
+ ref.call(this.context, offset);
760
842
  }
761
843
  this.$el.offset(offset);
762
844
  return this.context.trigger("reposition", [offset]);
@@ -770,9 +852,7 @@ View = (function() {
770
852
  next = this.$el.find('li:first');
771
853
  }
772
854
  next.addClass('cur');
773
- return this.$el.animate({
774
- scrollTop: Math.max(0, cur.innerHeight() * (next.index() + 2) - this.$el.height())
775
- }, 150);
855
+ return this.scrollTop(Math.max(0, cur.innerHeight() * (next.index() + 2) - this.$el.height()));
776
856
  };
777
857
 
778
858
  View.prototype.prev = function() {
@@ -783,9 +863,19 @@ View = (function() {
783
863
  prev = this.$el.find('li:last');
784
864
  }
785
865
  prev.addClass('cur');
786
- return this.$el.animate({
787
- scrollTop: Math.max(0, cur.innerHeight() * (prev.index() + 2) - this.$el.height())
788
- }, 150);
866
+ return this.scrollTop(Math.max(0, cur.innerHeight() * (prev.index() + 2) - this.$el.height()));
867
+ };
868
+
869
+ View.prototype.scrollTop = function(scrollTop) {
870
+ var scrollDuration;
871
+ scrollDuration = this.context.getOpt('scrollDuration');
872
+ if (scrollDuration) {
873
+ return this.$el.animate({
874
+ scrollTop: scrollTop
875
+ }, scrollDuration);
876
+ } else {
877
+ return this.$el.scrollTop(scrollTop);
878
+ }
789
879
  };
790
880
 
791
881
  View.prototype.show = function() {
@@ -824,7 +914,7 @@ View = (function() {
824
914
  };
825
915
 
826
916
  View.prototype.render = function(list) {
827
- var $li, $ul, item, li, tpl, _i, _len;
917
+ var $li, $ul, i, item, len, li, tpl;
828
918
  if (!($.isArray(list) && list.length > 0)) {
829
919
  this.hide();
830
920
  return;
@@ -832,12 +922,12 @@ View = (function() {
832
922
  this.$el.find('ul').empty();
833
923
  $ul = this.$el.find('ul');
834
924
  tpl = this.context.getOpt('displayTpl');
835
- for (_i = 0, _len = list.length; _i < _len; _i++) {
836
- item = list[_i];
925
+ for (i = 0, len = list.length; i < len; i++) {
926
+ item = list[i];
837
927
  item = $.extend({}, item, {
838
928
  'atwho-at': this.context.at
839
929
  });
840
- li = this.context.callbacks("tplEval").call(this.context, tpl, item);
930
+ li = this.context.callbacks("tplEval").call(this.context, tpl, item, "onDisplay");
841
931
  $li = $(this.context.callbacks("highlighter").call(this.context, li, this.context.query.text));
842
932
  $li.data("item-data", item);
843
933
  $ul.append($li);
@@ -859,6 +949,7 @@ KEY_CODE = {
859
949
  TAB: 9,
860
950
  ENTER: 13,
861
951
  CTRL: 17,
952
+ A: 65,
862
953
  P: 80,
863
954
  N: 78,
864
955
  LEFT: 37,
@@ -873,15 +964,16 @@ DEFAULT_CALLBACKS = {
873
964
  beforeSave: function(data) {
874
965
  return Controller.arrayToDefaultHash(data);
875
966
  },
876
- matcher: function(flag, subtext, should_startWithSpace) {
877
- var match, regexp, _a, _y;
967
+ matcher: function(flag, subtext, should_startWithSpace, acceptSpaceBar) {
968
+ var _a, _y, match, regexp, space;
878
969
  flag = flag.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
879
970
  if (should_startWithSpace) {
880
971
  flag = '(?:^|\\s)' + flag;
881
972
  }
882
973
  _a = decodeURI("%C3%80");
883
974
  _y = decodeURI("%C3%BF");
884
- regexp = new RegExp("" + flag + "([A-Za-z" + _a + "-" + _y + "0-9_\.\+\-]*)$|" + flag + "([^\\x00-\\xff]*)$", 'gi');
975
+ space = acceptSpaceBar ? "\ " : "";
976
+ regexp = new RegExp(flag + "([A-Za-z" + _a + "-" + _y + "0-9_" + space + "\.\+\-]*)$|" + flag + "([^\\x00-\\xff]*)$", 'gi');
885
977
  match = regexp.exec(subtext);
886
978
  if (match) {
887
979
  return match[2] || match[1];
@@ -890,10 +982,10 @@ DEFAULT_CALLBACKS = {
890
982
  }
891
983
  },
892
984
  filter: function(query, data, searchKey) {
893
- var item, _i, _len, _results;
985
+ var _results, i, item, len;
894
986
  _results = [];
895
- for (_i = 0, _len = data.length; _i < _len; _i++) {
896
- item = data[_i];
987
+ for (i = 0, len = data.length; i < len; i++) {
988
+ item = data[i];
897
989
  if (~new String(item[searchKey]).toLowerCase().indexOf(query.toLowerCase())) {
898
990
  _results.push(item);
899
991
  }
@@ -902,13 +994,13 @@ DEFAULT_CALLBACKS = {
902
994
  },
903
995
  remoteFilter: null,
904
996
  sorter: function(query, items, searchKey) {
905
- var item, _i, _len, _results;
997
+ var _results, i, item, len;
906
998
  if (!query) {
907
999
  return items;
908
1000
  }
909
1001
  _results = [];
910
- for (_i = 0, _len = items.length; _i < _len; _i++) {
911
- item = items[_i];
1002
+ for (i = 0, len = items.length; i < len; i++) {
1003
+ item = items[i];
912
1004
  item.atwho_order = new String(item[searchKey]).toLowerCase().indexOf(query.toLowerCase());
913
1005
  if (item.atwho_order > -1) {
914
1006
  _results.push(item);
@@ -960,8 +1052,18 @@ Api = {
960
1052
  }
961
1053
  },
962
1054
  isSelecting: function() {
963
- var _ref;
964
- return (_ref = this.controller()) != null ? _ref.view.visible() : void 0;
1055
+ var ref;
1056
+ return (ref = this.controller()) != null ? ref.view.visible() : void 0;
1057
+ },
1058
+ hide: function() {
1059
+ var ref;
1060
+ return (ref = this.controller()) != null ? ref.view.hide() : void 0;
1061
+ },
1062
+ reposition: function() {
1063
+ var c;
1064
+ if (c = this.controller()) {
1065
+ return c.view.reposition(c.rect());
1066
+ }
965
1067
  },
966
1068
  setIframe: function(iframe, asRoot) {
967
1069
  this.setupRootElement(iframe, asRoot);
@@ -977,7 +1079,7 @@ Api = {
977
1079
  };
978
1080
 
979
1081
  $.fn.atwho = function(method) {
980
- var result, _args;
1082
+ var _args, result;
981
1083
  _args = arguments;
982
1084
  result = null;
983
1085
  this.filter('textarea, input, [contenteditable=""], [contenteditable=true]').each(function() {
@@ -990,10 +1092,14 @@ $.fn.atwho = function(method) {
990
1092
  } else if (Api[method] && app) {
991
1093
  return result = Api[method].apply(app, Array.prototype.slice.call(_args, 1));
992
1094
  } else {
993
- return $.error("Method " + method + " does not exist on jQuery.caret");
1095
+ return $.error("Method " + method + " does not exist on jQuery.atwho");
994
1096
  }
995
1097
  });
996
- return result || this;
1098
+ if (result != null) {
1099
+ return result;
1100
+ } else {
1101
+ return this;
1102
+ }
997
1103
  };
998
1104
 
999
1105
  $.fn.atwho["default"] = {
@@ -1013,9 +1119,12 @@ $.fn.atwho["default"] = {
1013
1119
  displayTimeout: 300,
1014
1120
  delay: null,
1015
1121
  spaceSelectsMatch: false,
1016
- editableAtwhoQueryAttrs: {}
1122
+ tabSelectsMatch: true,
1123
+ editableAtwhoQueryAttrs: {},
1124
+ scrollDuration: 150
1017
1125
  };
1018
1126
 
1127
+ $.fn.atwho.debug = false;
1019
1128
 
1020
1129
 
1021
1130
  }));
@@ -1,7 +1,7 @@
1
1
  module Jquery
2
2
  module Atwho
3
3
  module Rails
4
- VERSION = '1.1.0'
4
+ VERSION = '1.3.2'
5
5
  end
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,41 +1,41 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jquery-atwho-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - ichord
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-03 00:00:00.000000000 Z
11
+ date: 2015-06-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: generator_spec
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  description: |-
@@ -47,12 +47,13 @@ executables: []
47
47
  extensions: []
48
48
  extra_rdoc_files: []
49
49
  files:
50
- - .gitignore
50
+ - ".gitignore"
51
51
  - Appraisals
52
52
  - Gemfile
53
53
  - LICENSE-MIT
54
54
  - README.md
55
55
  - Rakefile
56
+ - bower.json
56
57
  - changelog.md
57
58
  - gemfiles/rails30.gemfile
58
59
  - gemfiles/rails30.gemfile.lock
@@ -75,17 +76,17 @@ require_paths:
75
76
  - lib
76
77
  required_ruby_version: !ruby/object:Gem::Requirement
77
78
  requirements:
78
- - - '>='
79
+ - - ">="
79
80
  - !ruby/object:Gem::Version
80
81
  version: '0'
81
82
  required_rubygems_version: !ruby/object:Gem::Requirement
82
83
  requirements:
83
- - - '>='
84
+ - - ">="
84
85
  - !ruby/object:Gem::Version
85
86
  version: '0'
86
87
  requirements: []
87
88
  rubyforge_project: jquery-atwho-rails
88
- rubygems_version: 2.4.6
89
+ rubygems_version: 2.4.8
89
90
  signing_key:
90
91
  specification_version: 4
91
92
  summary: 'jquery plugin: @mentions'