jquery-atwho-rails 1.1.0 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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'