jquery-atwho-rails 0.4.7 → 0.4.11

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: f4711b0cee4422713ce5672944e44588dcc560e8
4
- data.tar.gz: a96d6fc2ee15c7d549f55e83aa855793f801b73b
3
+ metadata.gz: edd22436434bb09eecdc9e926d6a14a1f1f9a177
4
+ data.tar.gz: bbd43f1b9adf1c0294327d166f7b33d1b5b5a961
5
5
  SHA512:
6
- metadata.gz: da25e5bd13ae5af69b9037d6851c498ce3febed96b2074dbf2d6ab98132c74ae7b8118f9a2a15aab50fe48a06f107bc80e04162b32b8a2521021a8167afe46b4
7
- data.tar.gz: 8c71f0f82b185ead06af5a8c3311b1e59192fe451e8dcede7be675ae41668b158c082489b48ebbe6ac9c2f402475e3bc35d29ff99ceb4f93882884b685d62726
6
+ metadata.gz: 7b51f3042fb10491bfb2b09ed3c5df937b9006086a7e40e898111b730c7fc48ae14907ff44214c5ce5daee8c82724b90083f7be603384ac74ae43ab89bb3e879
7
+ data.tar.gz: d4a0286f34a546f694f46ee7d93b27cf98687db0bc724056129b863804a1b0b0a1d3da21f31da6a996f9dd17c2420db31f50aaeca043a0669152dbe2e6b0644a
data/README.md CHANGED
@@ -22,9 +22,8 @@ Add this gem in `Gemfile` like this:
22
22
  `gem jquery-atwho-rails`
23
23
 
24
24
  then add
25
- ` //= require jquery.atwho `
26
- to `app/assets/javascripts/application.js`
27
- and `app/assets/stylesheets/applications.css`
25
+ ` //= require jquery.atwho/index ` to `app/assets/javascripts/application.js`
26
+ and add ` //=require jquery.atwho ` to `app/assets/stylesheets/applications.css`
28
27
 
29
28
  #### History Versions
30
29
  All in [At.js](https://github.com/ichord/At.js) project.
@@ -1,4 +1,4 @@
1
- /*! jquery.atwho - v0.4.7 - 2014-02-22
1
+ /*! jquery.atwho - v0.4.11 - 2014-04-27
2
2
  * Copyright (c) 2014 chord.luo <chord.luo@gmail.com>;
3
3
  * homepage: http://ichord.github.com/At.js
4
4
  * Licensed MIT
@@ -22,9 +22,29 @@ App = (function() {
22
22
  this.controllers = {};
23
23
  this.alias_maps = {};
24
24
  this.$inputor = $(inputor);
25
+ this.iframe = null;
26
+ this.setIframe();
25
27
  this.listen();
26
28
  }
27
29
 
30
+ App.prototype.setIframe = function(iframe) {
31
+ var error;
32
+ if (iframe) {
33
+ this.window = iframe.contentWindow;
34
+ this.document = iframe.contentDocument || this.window.document;
35
+ this.iframe = iframe;
36
+ return this;
37
+ } else {
38
+ this.document = this.$inputor[0].ownerDocument;
39
+ this.window = this.document.defaultView || this.document.parentWindow;
40
+ try {
41
+ return this.iframe = this.window.frameElement;
42
+ } catch (_error) {
43
+ error = _error;
44
+ }
45
+ }
46
+ };
47
+
28
48
  App.prototype.controller = function(at) {
29
49
  return this.controllers[this.alias_maps[at] || at || this.current_flag];
30
50
  };
@@ -74,6 +94,7 @@ App = (function() {
74
94
  for (_ in _ref) {
75
95
  c = _ref[_];
76
96
  c.destroy();
97
+ delete this.controllers[_];
77
98
  }
78
99
  return this.$inputor.off('.atwhoInner');
79
100
  };
@@ -81,8 +102,18 @@ App = (function() {
81
102
  App.prototype.dispatch = function() {
82
103
  return $.map(this.controllers, (function(_this) {
83
104
  return function(c) {
84
- if (c.look_up()) {
85
- return _this.set_context_for(c.at);
105
+ var delay;
106
+ if (delay = c.get_opt('delay')) {
107
+ clearTimeout(_this.delayedCallback);
108
+ return _this.delayedCallback = setTimeout(function() {
109
+ if (c.look_up()) {
110
+ return _this.set_context_for(c.at);
111
+ }
112
+ }, delay);
113
+ } else {
114
+ if (c.look_up()) {
115
+ return _this.set_context_for(c.at);
116
+ }
86
117
  }
87
118
  };
88
119
  })(this));
@@ -99,8 +130,15 @@ App = (function() {
99
130
  break;
100
131
  case KEY_CODE.DOWN:
101
132
  case KEY_CODE.UP:
133
+ case KEY_CODE.CTRL:
102
134
  $.noop();
103
135
  break;
136
+ case KEY_CODE.P:
137
+ case KEY_CODE.N:
138
+ if (!e.ctrlKey) {
139
+ this.dispatch();
140
+ }
141
+ break;
104
142
  default:
105
143
  this.dispatch();
106
144
  }
@@ -125,6 +163,20 @@ App = (function() {
125
163
  e.preventDefault();
126
164
  view.next();
127
165
  break;
166
+ case KEY_CODE.P:
167
+ if (!e.ctrlKey) {
168
+ return;
169
+ }
170
+ e.preventDefault();
171
+ view.prev();
172
+ break;
173
+ case KEY_CODE.N:
174
+ if (!e.ctrlKey) {
175
+ return;
176
+ }
177
+ e.preventDefault();
178
+ view.next();
179
+ break;
128
180
  case KEY_CODE.TAB:
129
181
  case KEY_CODE.ENTER:
130
182
  if (!view.visible()) {
@@ -143,21 +195,15 @@ App = (function() {
143
195
  })();
144
196
 
145
197
  Controller = (function() {
146
- var uuid, _uuid;
147
-
148
- _uuid = 0;
149
-
150
- uuid = function() {
151
- return _uuid += 1;
198
+ Controller.prototype.uid = function() {
199
+ return (Math.random().toString(16) + "000000000").substr(2, 8) + (new Date().getTime());
152
200
  };
153
201
 
154
202
  function Controller(app, at) {
155
203
  this.app = app;
156
204
  this.at = at;
157
205
  this.$inputor = this.app.$inputor;
158
- this.oDocument = this.$inputor[0].ownerDocument;
159
- this.oWindow = this.oDocument.defaultView || this.oDocument.parentWindow;
160
- this.id = this.$inputor[0].id || uuid();
206
+ this.id = this.$inputor[0].id || this.uid();
161
207
  this.setting = null;
162
208
  this.query = null;
163
209
  this.pos = 0;
@@ -177,7 +223,8 @@ Controller = (function() {
177
223
  Controller.prototype.destroy = function() {
178
224
  this.trigger('beforeDestroy');
179
225
  this.model.destroy();
180
- return this.view.destroy();
226
+ this.view.destroy();
227
+ return this.$el.remove();
181
228
  };
182
229
 
183
230
  Controller.prototype.call_default = function() {
@@ -235,12 +282,13 @@ Controller = (function() {
235
282
  end = start + query.length;
236
283
  this.pos = start;
237
284
  query = {
238
- 'text': query.toLowerCase(),
285
+ 'text': query,
239
286
  'head_pos': start,
240
287
  'end_pos': end
241
288
  };
242
289
  this.trigger("matched", [this.at, query.text]);
243
290
  } else {
291
+ query = null;
244
292
  this.view.hide();
245
293
  }
246
294
  return this.query = query;
@@ -248,13 +296,15 @@ Controller = (function() {
248
296
 
249
297
  Controller.prototype.rect = function() {
250
298
  var c, scale_bottom;
251
- if (!(c = this.$inputor.caret('offset', this.pos - 1))) {
299
+ if (!(c = this.$inputor.caret({
300
+ iframe: this.app.iframe
301
+ }).caret('offset', this.pos - 1))) {
252
302
  return;
253
303
  }
254
304
  if (this.$inputor.attr('contentEditable') === 'true') {
255
305
  c = (this.cur_rect || (this.cur_rect = c)) || c;
256
306
  }
257
- scale_bottom = document.selection ? 0 : 2;
307
+ scale_bottom = this.app.document.selection ? 0 : 2;
258
308
  return {
259
309
  left: c.left,
260
310
  top: c.top,
@@ -270,11 +320,11 @@ Controller = (function() {
270
320
 
271
321
  Controller.prototype.mark_range = function() {
272
322
  if (this.$inputor.attr('contentEditable') === 'true') {
273
- if (this.oWindow.getSelection) {
274
- this.range = this.oWindow.getSelection().getRangeAt(0);
323
+ if (this.app.window.getSelection) {
324
+ this.range = this.app.window.getSelection().getRangeAt(0);
275
325
  }
276
- if (this.oDocument.selection) {
277
- return this.ie8_range = this.oDocument.selection.createRange();
326
+ if (this.app.document.selection) {
327
+ return this.ie8_range = this.app.document.selection.createRange();
278
328
  }
279
329
  }
280
330
  };
@@ -300,9 +350,9 @@ Controller = (function() {
300
350
  class_name = "atwho-view-flag atwho-view-flag-" + (this.get_opt('alias') || this.at);
301
351
  content_node = "" + content + "<span contenteditable='false'>&nbsp;<span>";
302
352
  insert_node = "<span contenteditable='false' class='" + class_name + "'>" + content_node + "</span>";
303
- $insert_node = $(insert_node, this.oDocument).data('atwho-data-item', $li.data('item-data'));
304
- if (this.oDocument.selection) {
305
- $insert_node = $("<span contenteditable='true'></span>", this.oDocument).html($insert_node);
353
+ $insert_node = $(insert_node, this.app.document).data('atwho-data-item', $li.data('item-data'));
354
+ if (this.app.document.selection) {
355
+ $insert_node = $("<span contenteditable='true'></span>", this.app.document).html($insert_node);
306
356
  }
307
357
  }
308
358
  if ($inputor.is('textarea, input')) {
@@ -319,7 +369,7 @@ Controller = (function() {
319
369
  range.deleteContents();
320
370
  range.insertNode($insert_node[0]);
321
371
  range.collapse(false);
322
- sel = this.oWindow.getSelection();
372
+ sel = this.app.window.getSelection();
323
373
  sel.removeAllRanges();
324
374
  sel.addRange(range);
325
375
  } else if (range = this.ie8_range) {
@@ -466,15 +516,16 @@ View = (function() {
466
516
 
467
517
  View.prototype.choose = function() {
468
518
  var $li, content;
469
- $li = this.$el.find(".cur");
470
- content = this.context.insert_content_for($li);
471
- this.context.insert(this.context.callbacks("before_insert").call(this.context, content, $li), $li);
472
- this.context.trigger("inserted", [$li]);
473
- return this.hide();
519
+ if (($li = this.$el.find(".cur")).length) {
520
+ content = this.context.insert_content_for($li);
521
+ this.context.insert(this.context.callbacks("before_insert").call(this.context, content, $li), $li);
522
+ this.context.trigger("inserted", [$li]);
523
+ return this.hide();
524
+ }
474
525
  };
475
526
 
476
527
  View.prototype.reposition = function(rect) {
477
- var offset;
528
+ var offset, _ref;
478
529
  if (rect.bottom + this.$el.height() - $(window).scrollTop() > $(window).height()) {
479
530
  rect.bottom = rect.top - this.$el.height();
480
531
  }
@@ -482,6 +533,9 @@ View = (function() {
482
533
  left: rect.left,
483
534
  top: rect.bottom
484
535
  };
536
+ if ((_ref = this.context.callbacks("before_reposition")) != null) {
537
+ _ref.call(this.context, offset);
538
+ }
485
539
  this.$el.offset(offset);
486
540
  return this.context.trigger("reposition", [offset]);
487
541
  };
@@ -511,6 +565,7 @@ View = (function() {
511
565
  this.context.mark_range();
512
566
  if (!this.visible()) {
513
567
  this.$el.show();
568
+ this.context.trigger('shown');
514
569
  }
515
570
  if (rect = this.context.rect()) {
516
571
  return this.reposition(rect);
@@ -521,7 +576,8 @@ View = (function() {
521
576
  var callback;
522
577
  if (isNaN(time && this.visible())) {
523
578
  this.context.reset_rect();
524
- return this.$el.hide();
579
+ this.$el.hide();
580
+ return this.context.trigger('hidden');
525
581
  } else {
526
582
  callback = (function(_this) {
527
583
  return function() {
@@ -553,7 +609,9 @@ View = (function() {
553
609
  $ul.append($li);
554
610
  }
555
611
  this.show();
556
- return $ul.find("li:first").addClass("cur");
612
+ if (this.context.get_opt('highlight_first')) {
613
+ return $ul.find("li:first").addClass("cur");
614
+ }
557
615
  };
558
616
 
559
617
  return View;
@@ -565,7 +623,10 @@ KEY_CODE = {
565
623
  UP: 38,
566
624
  ESC: 27,
567
625
  TAB: 9,
568
- ENTER: 13
626
+ ENTER: 13,
627
+ CTRL: 17,
628
+ P: 80,
629
+ N: 78
569
630
  };
570
631
 
571
632
  DEFAULT_CALLBACKS = {
@@ -606,7 +667,7 @@ DEFAULT_CALLBACKS = {
606
667
  _results = [];
607
668
  for (_i = 0, _len = data.length; _i < _len; _i++) {
608
669
  item = data[_i];
609
- if (~item[search_key].toLowerCase().indexOf(query)) {
670
+ if (~item[search_key].toLowerCase().indexOf(query.toLowerCase())) {
610
671
  _results.push(item);
611
672
  }
612
673
  }
@@ -621,7 +682,7 @@ DEFAULT_CALLBACKS = {
621
682
  _results = [];
622
683
  for (_i = 0, _len = items.length; _i < _len; _i++) {
623
684
  item = items[_i];
624
- item.atwho_order = item[search_key].toLowerCase().indexOf(query);
685
+ item.atwho_order = item[search_key].toLowerCase().indexOf(query.toLowerCase());
625
686
  if (item.atwho_order > -1) {
626
687
  _results.push(item);
627
688
  }
@@ -691,6 +752,9 @@ Api = {
691
752
  getInsertedIDs: function(at) {
692
753
  return Api.getInsertedItemsWithIDs.apply(this, [at])[0];
693
754
  },
755
+ setIframe: function(iframe) {
756
+ return this.setIframe(iframe);
757
+ },
694
758
  run: function() {
695
759
  return this.dispatch();
696
760
  },
@@ -743,9 +807,11 @@ $.fn.atwho["default"] = {
743
807
  callbacks: DEFAULT_CALLBACKS,
744
808
  search_key: "name",
745
809
  start_with_space: true,
810
+ highlight_first: true,
746
811
  limit: 5,
747
812
  max_len: 20,
748
- display_timeout: 300
813
+ display_timeout: 300,
814
+ delay: null
749
815
  };
750
816
 
751
817
  });
@@ -24,7 +24,7 @@
24
24
  }
25
25
  })(function($) {
26
26
  "use strict";
27
- var EditableCaret, InputCaret, Mirror, Utils, methods, oDocument, oFrame, oWindow, pluginName;
27
+ var EditableCaret, InputCaret, Mirror, Utils, configure, methods, oDocument, oFrame, oWindow, pluginName, setContextBy;
28
28
  pluginName = 'caret';
29
29
  EditableCaret = (function() {
30
30
  function EditableCaret($inputor) {
@@ -290,7 +290,7 @@
290
290
  };
291
291
  methods = {
292
292
  pos: function(pos) {
293
- if (pos) {
293
+ if (pos || pos === 0) {
294
294
  return this.setPos(pos);
295
295
  } else {
296
296
  return this.getPos();
@@ -317,13 +317,36 @@
317
317
  oDocument = null;
318
318
  oWindow = null;
319
319
  oFrame = null;
320
+ setContextBy = function(iframe) {
321
+ oFrame = iframe;
322
+ oWindow = iframe.contentWindow;
323
+ return oDocument = iframe.contentDocument || oWindow.document;
324
+ };
325
+ configure = function($dom, settings) {
326
+ var error, iframe;
327
+ if ($.isPlainObject(settings) && (iframe = settings.iframe)) {
328
+ $dom.data('caret-iframe', iframe);
329
+ return setContextBy(iframe);
330
+ } else if (iframe = $dom.data('caret-iframe')) {
331
+ return setContextBy(iframe);
332
+ } else {
333
+ oDocument = $dom[0].ownerDocument;
334
+ oWindow = oDocument.defaultView || oDocument.parentWindow;
335
+ try {
336
+ return oFrame = oWindow.frameElement;
337
+ } catch (_error) {
338
+ error = _error;
339
+ }
340
+ }
341
+ };
320
342
  $.fn.caret = function(method) {
321
343
  var caret;
322
- oDocument = this[0].ownerDocument;
323
- oWindow = oDocument.defaultView || oDocument.parentWindow;
324
- oFrame = oWindow.frameElement;
325
- caret = Utils.contentEditable(this) ? new EditableCaret(this) : new InputCaret(this);
326
- if (methods[method]) {
344
+ if (typeof method === 'object') {
345
+ configure(this, method);
346
+ return this;
347
+ } else if (methods[method]) {
348
+ configure(this);
349
+ caret = Utils.contentEditable(this) ? new EditableCaret(this) : new InputCaret(this);
327
350
  return methods[method].apply(caret, Array.prototype.slice.call(arguments, 1));
328
351
  } else {
329
352
  return $.error("Method " + method + " does not exist on jQuery.caret");
@@ -1,7 +1,7 @@
1
1
  module Jquery
2
2
  module Atwho
3
3
  module Rails
4
- VERSION = "0.4.7"
4
+ VERSION = "0.4.11"
5
5
  end
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jquery-atwho-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.7
4
+ version: 0.4.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - ichord
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-25 00:00:00.000000000 Z
11
+ date: 2014-05-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -82,7 +82,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
82
82
  version: '0'
83
83
  requirements: []
84
84
  rubyforge_project: jquery-atwho-rails
85
- rubygems_version: 2.0.3
85
+ rubygems_version: 2.2.2
86
86
  signing_key:
87
87
  specification_version: 4
88
88
  summary: 'jquery plugin: @mentions'