jquery-atwho-rails 1.3.2 → 1.5.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -5
- data/README.md +17 -5
- data/bower.json +2 -2
- data/lib/assets/javascripts/jquery.atwho/jquery.atwho.js +254 -172
- data/lib/assets/stylesheets/jquery.atwho.css +25 -2
- data/lib/jquery-atwho-rails/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 25dacabb78625142ac94373b2d12d7d8fde3090a
|
4
|
+
data.tar.gz: 5aeb2f0904ee79152d8e7bcb7e5bdda9aefe0036
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b3dac3daf434ec2d143fdf5990ee5dbdb9929e898e761df9b31137db58feef997fc7d678b76dd6048c354f06e0b09feff261c82a874415666b411b41d66c6ca6
|
7
|
+
data.tar.gz: c2b0ac76bf5416ef2efc54f4088229d5e108c96366c0f69fba3353b798022fd206493e63a52b2625a964ab104816e2f82ae37904b902b50fb910c490f6125467
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -20,12 +20,24 @@ Issue command line bellow:
|
|
20
20
|
then It will show in `public/[javascript|stylesheets]/` directory.
|
21
21
|
|
22
22
|
#### Rails >= 3.1.x
|
23
|
-
Add this gem in `Gemfile` like this:
|
24
|
-
`gem jquery-atwho-rails`
|
23
|
+
Add this gem in `Gemfile` like this:
|
25
24
|
|
26
|
-
|
27
|
-
|
28
|
-
|
25
|
+
```ruby
|
26
|
+
gem 'jquery-atwho-rails'
|
27
|
+
```
|
28
|
+
|
29
|
+
add in `app/assets/javascripts/application.js`:
|
30
|
+
|
31
|
+
```
|
32
|
+
//= require jquery
|
33
|
+
//= require jquery.atwho
|
34
|
+
```
|
35
|
+
|
36
|
+
and in `app/assets/stylesheets/applications.css`:
|
37
|
+
|
38
|
+
```
|
39
|
+
//=require jquery.atwho
|
40
|
+
```
|
29
41
|
|
30
42
|
#### History Versions
|
31
43
|
All in [At.js](https://github.com/ichord/At.js) project.
|
data/bower.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "jquery-atwho-rails",
|
3
|
-
"version": "1.
|
3
|
+
"version": "1.5.2",
|
4
4
|
"homepage": "https://github.com/ichord/jquery-atwho-rails",
|
5
5
|
"authors": [
|
6
6
|
"ichord <chord.luo@gmail.com>"
|
@@ -14,6 +14,6 @@
|
|
14
14
|
"tests"
|
15
15
|
],
|
16
16
|
"dependencies": {
|
17
|
-
"At.js": "~1.
|
17
|
+
"At.js": "~1.5.2"
|
18
18
|
}
|
19
19
|
}
|
@@ -1,8 +1,9 @@
|
|
1
|
-
|
2
|
-
*
|
3
|
-
*
|
4
|
-
*
|
5
|
-
|
1
|
+
/**
|
2
|
+
* at.js - 1.5.4
|
3
|
+
* Copyright (c) 2017 chord.luo <chord.luo@gmail.com>;
|
4
|
+
* Homepage: http://ichord.github.com/At.js
|
5
|
+
* License: MIT
|
6
|
+
*/
|
6
7
|
(function (root, factory) {
|
7
8
|
if (typeof define === 'function' && define.amd) {
|
8
9
|
// AMD. Register as an anonymous module unless amdModuleId is set
|
@@ -17,14 +18,110 @@
|
|
17
18
|
} else {
|
18
19
|
factory(jQuery);
|
19
20
|
}
|
20
|
-
}(this, function (
|
21
|
+
}(this, function ($) {
|
22
|
+
var DEFAULT_CALLBACKS, KEY_CODE;
|
21
23
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
24
|
+
KEY_CODE = {
|
25
|
+
ESC: 27,
|
26
|
+
TAB: 9,
|
27
|
+
ENTER: 13,
|
28
|
+
CTRL: 17,
|
29
|
+
A: 65,
|
30
|
+
P: 80,
|
31
|
+
N: 78,
|
32
|
+
LEFT: 37,
|
33
|
+
UP: 38,
|
34
|
+
RIGHT: 39,
|
35
|
+
DOWN: 40,
|
36
|
+
BACKSPACE: 8,
|
37
|
+
SPACE: 32
|
38
|
+
};
|
39
|
+
|
40
|
+
DEFAULT_CALLBACKS = {
|
41
|
+
beforeSave: function(data) {
|
42
|
+
return Controller.arrayToDefaultHash(data);
|
43
|
+
},
|
44
|
+
matcher: function(flag, subtext, should_startWithSpace, acceptSpaceBar) {
|
45
|
+
var _a, _y, match, regexp, space;
|
46
|
+
flag = flag.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
|
47
|
+
if (should_startWithSpace) {
|
48
|
+
flag = '(?:^|\\s)' + flag;
|
49
|
+
}
|
50
|
+
_a = decodeURI("%C3%80");
|
51
|
+
_y = decodeURI("%C3%BF");
|
52
|
+
space = acceptSpaceBar ? "\ " : "";
|
53
|
+
regexp = new RegExp(flag + "([A-Za-z" + _a + "-" + _y + "0-9_" + space + "\'\.\+\-]*)$|" + flag + "([^\\x00-\\xff]*)$", 'gi');
|
54
|
+
match = regexp.exec(subtext);
|
55
|
+
if (match) {
|
56
|
+
return match[2] || match[1];
|
57
|
+
} else {
|
58
|
+
return null;
|
59
|
+
}
|
60
|
+
},
|
61
|
+
filter: function(query, data, searchKey) {
|
62
|
+
var _results, i, item, len;
|
63
|
+
_results = [];
|
64
|
+
for (i = 0, len = data.length; i < len; i++) {
|
65
|
+
item = data[i];
|
66
|
+
if (~new String(item[searchKey]).toLowerCase().indexOf(query.toLowerCase())) {
|
67
|
+
_results.push(item);
|
68
|
+
}
|
69
|
+
}
|
70
|
+
return _results;
|
71
|
+
},
|
72
|
+
remoteFilter: null,
|
73
|
+
sorter: function(query, items, searchKey) {
|
74
|
+
var _results, i, item, len;
|
75
|
+
if (!query) {
|
76
|
+
return items;
|
77
|
+
}
|
78
|
+
_results = [];
|
79
|
+
for (i = 0, len = items.length; i < len; i++) {
|
80
|
+
item = items[i];
|
81
|
+
item.atwho_order = new String(item[searchKey]).toLowerCase().indexOf(query.toLowerCase());
|
82
|
+
if (item.atwho_order > -1) {
|
83
|
+
_results.push(item);
|
84
|
+
}
|
85
|
+
}
|
86
|
+
return _results.sort(function(a, b) {
|
87
|
+
return a.atwho_order - b.atwho_order;
|
88
|
+
});
|
89
|
+
},
|
90
|
+
tplEval: function(tpl, map) {
|
91
|
+
var error, error1, template;
|
92
|
+
template = tpl;
|
93
|
+
try {
|
94
|
+
if (typeof tpl !== 'string') {
|
95
|
+
template = tpl(map);
|
96
|
+
}
|
97
|
+
return template.replace(/\$\{([^\}]*)\}/g, function(tag, key, pos) {
|
98
|
+
return map[key];
|
99
|
+
});
|
100
|
+
} catch (error1) {
|
101
|
+
error = error1;
|
102
|
+
return "";
|
103
|
+
}
|
104
|
+
},
|
105
|
+
highlighter: function(li, query) {
|
106
|
+
var regexp;
|
107
|
+
if (!query) {
|
108
|
+
return li;
|
109
|
+
}
|
110
|
+
regexp = new RegExp(">\\s*([^\<]*?)(" + query.replace("+", "\\+") + ")([^\<]*)\\s*<", 'ig');
|
111
|
+
return li.replace(regexp, function(str, $1, $2, $3) {
|
112
|
+
return '> ' + $1 + '<strong>' + $2 + '</strong>' + $3 + ' <';
|
113
|
+
});
|
114
|
+
},
|
115
|
+
beforeInsert: function(value, $li, e) {
|
116
|
+
return value;
|
117
|
+
},
|
118
|
+
beforeReposition: function(offset) {
|
119
|
+
return offset;
|
120
|
+
},
|
121
|
+
afterMatchFailed: function(at, el) {}
|
122
|
+
};
|
26
123
|
|
27
|
-
|
124
|
+
var App;
|
28
125
|
|
29
126
|
App = (function() {
|
30
127
|
function App(inputor) {
|
@@ -45,7 +142,7 @@ App = (function() {
|
|
45
142
|
};
|
46
143
|
|
47
144
|
App.prototype.setupRootElement = function(iframe, asRoot) {
|
48
|
-
var error;
|
145
|
+
var error, error1;
|
49
146
|
if (asRoot == null) {
|
50
147
|
asRoot = false;
|
51
148
|
}
|
@@ -58,8 +155,8 @@ App = (function() {
|
|
58
155
|
this.window = this.document.defaultView || this.document.parentWindow;
|
59
156
|
try {
|
60
157
|
this.iframe = this.window.frameElement;
|
61
|
-
} catch (
|
62
|
-
error =
|
158
|
+
} catch (error1) {
|
159
|
+
error = error1;
|
63
160
|
this.iframe = null;
|
64
161
|
if ($.fn.atwho.debug) {
|
65
162
|
throw new Error("iframe auto-discovery is failed.\nPlease use `setIframe` to set the target iframe manually.\n" + error);
|
@@ -112,11 +209,16 @@ App = (function() {
|
|
112
209
|
if ((ref = _this.controller()) != null) {
|
113
210
|
ref.view.hide();
|
114
211
|
}
|
115
|
-
|
212
|
+
_this.isComposing = true;
|
213
|
+
return null;
|
116
214
|
};
|
117
215
|
})(this)).on('compositionend', (function(_this) {
|
118
216
|
return function(e) {
|
119
|
-
|
217
|
+
_this.isComposing = false;
|
218
|
+
setTimeout(function(e) {
|
219
|
+
return _this.dispatch(e);
|
220
|
+
});
|
221
|
+
return null;
|
120
222
|
};
|
121
223
|
})(this)).on('keyup.atwhoInner', (function(_this) {
|
122
224
|
return function(e) {
|
@@ -192,6 +294,7 @@ App = (function() {
|
|
192
294
|
case KEY_CODE.DOWN:
|
193
295
|
case KEY_CODE.UP:
|
194
296
|
case KEY_CODE.CTRL:
|
297
|
+
case KEY_CODE.ENTER:
|
195
298
|
$.noop();
|
196
299
|
break;
|
197
300
|
case KEY_CODE.P:
|
@@ -266,13 +369,16 @@ App = (function() {
|
|
266
369
|
|
267
370
|
})();
|
268
371
|
|
372
|
+
var Controller,
|
373
|
+
slice = [].slice;
|
374
|
+
|
269
375
|
Controller = (function() {
|
270
376
|
Controller.prototype.uid = function() {
|
271
377
|
return (Math.random().toString(16) + "000000000").substr(2, 8) + (new Date().getTime());
|
272
378
|
};
|
273
379
|
|
274
|
-
function Controller(
|
275
|
-
this.app =
|
380
|
+
function Controller(app, at1) {
|
381
|
+
this.app = app;
|
276
382
|
this.at = at1;
|
277
383
|
this.$inputor = this.app.$inputor;
|
278
384
|
this.id = this.$inputor[0].id || this.uid();
|
@@ -302,12 +408,12 @@ Controller = (function() {
|
|
302
408
|
};
|
303
409
|
|
304
410
|
Controller.prototype.callDefault = function() {
|
305
|
-
var args, error, funcName;
|
411
|
+
var args, error, error1, funcName;
|
306
412
|
funcName = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
|
307
413
|
try {
|
308
414
|
return DEFAULT_CALLBACKS[funcName].apply(this, args);
|
309
|
-
} catch (
|
310
|
-
error =
|
415
|
+
} catch (error1) {
|
416
|
+
error = error1;
|
311
417
|
return $.error(error + " Or maybe At.js doesn't have function " + funcName);
|
312
418
|
}
|
313
419
|
};
|
@@ -328,11 +434,11 @@ Controller = (function() {
|
|
328
434
|
};
|
329
435
|
|
330
436
|
Controller.prototype.getOpt = function(at, default_value) {
|
331
|
-
var e;
|
437
|
+
var e, error1;
|
332
438
|
try {
|
333
439
|
return this.setting[at];
|
334
|
-
} catch (
|
335
|
-
e =
|
440
|
+
} catch (error1) {
|
441
|
+
e = error1;
|
336
442
|
return null;
|
337
443
|
}
|
338
444
|
};
|
@@ -374,6 +480,12 @@ Controller = (function() {
|
|
374
480
|
|
375
481
|
Controller.prototype.lookUp = function(e) {
|
376
482
|
var query, wait;
|
483
|
+
if (e && e.type === 'click' && !this.getOpt('lookUpOnClick')) {
|
484
|
+
return;
|
485
|
+
}
|
486
|
+
if (this.getOpt('suspendOnComposing') && this.app.isComposing) {
|
487
|
+
return;
|
488
|
+
}
|
377
489
|
query = this.catchQuery(e);
|
378
490
|
if (!query) {
|
379
491
|
this.expectedQueryCBId = null;
|
@@ -443,6 +555,10 @@ Controller = (function() {
|
|
443
555
|
|
444
556
|
})();
|
445
557
|
|
558
|
+
var TextareaController,
|
559
|
+
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; },
|
560
|
+
hasProp = {}.hasOwnProperty;
|
561
|
+
|
446
562
|
TextareaController = (function(superClass) {
|
447
563
|
extend(TextareaController, superClass);
|
448
564
|
|
@@ -451,14 +567,18 @@ TextareaController = (function(superClass) {
|
|
451
567
|
}
|
452
568
|
|
453
569
|
TextareaController.prototype.catchQuery = function() {
|
454
|
-
var caretPos, content, end, query, start, subtext;
|
570
|
+
var caretPos, content, end, isString, query, start, subtext;
|
455
571
|
content = this.$inputor.val();
|
456
572
|
caretPos = this.$inputor.caret('pos', {
|
457
573
|
iframe: this.app.iframe
|
458
574
|
});
|
459
575
|
subtext = content.slice(0, caretPos);
|
460
|
-
query = this.callbacks("matcher").call(this, this.at, subtext, this.getOpt('startWithSpace'));
|
461
|
-
|
576
|
+
query = this.callbacks("matcher").call(this, this.at, subtext, this.getOpt('startWithSpace'), this.getOpt("acceptSpaceBar"));
|
577
|
+
isString = typeof query === 'string';
|
578
|
+
if (isString && query.length < this.getOpt('minLen', 0)) {
|
579
|
+
return;
|
580
|
+
}
|
581
|
+
if (isString && query.length <= this.getOpt('maxLen', 20)) {
|
462
582
|
start = caretPos - query.length;
|
463
583
|
end = start + query.length;
|
464
584
|
this.pos = start;
|
@@ -517,6 +637,10 @@ TextareaController = (function(superClass) {
|
|
517
637
|
|
518
638
|
})(Controller);
|
519
639
|
|
640
|
+
var EditableController,
|
641
|
+
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; },
|
642
|
+
hasProp = {}.hasOwnProperty;
|
643
|
+
|
520
644
|
EditableController = (function(superClass) {
|
521
645
|
extend(EditableController, superClass);
|
522
646
|
|
@@ -536,7 +660,7 @@ EditableController = (function(superClass) {
|
|
536
660
|
if (range == null) {
|
537
661
|
range = this._getRange();
|
538
662
|
}
|
539
|
-
if (!range) {
|
663
|
+
if (!(range && node)) {
|
540
664
|
return;
|
541
665
|
}
|
542
666
|
node = $(node)[0];
|
@@ -579,22 +703,12 @@ EditableController = (function(superClass) {
|
|
579
703
|
};
|
580
704
|
|
581
705
|
EditableController.prototype.catchQuery = function(e) {
|
582
|
-
var $inserted, $query, _range, index, inserted, lastNode, matched, offset, query, range;
|
583
|
-
if (this.app.isComposing) {
|
584
|
-
return;
|
585
|
-
}
|
706
|
+
var $inserted, $query, _range, index, inserted, isString, lastNode, matched, offset, query, query_content, range;
|
586
707
|
if (!(range = this._getRange())) {
|
587
708
|
return;
|
588
709
|
}
|
589
|
-
if (
|
590
|
-
|
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;
|
710
|
+
if (!range.collapsed) {
|
711
|
+
return;
|
598
712
|
}
|
599
713
|
if (e.which === KEY_CODE.ENTER) {
|
600
714
|
($query = $(range.startContainer).closest('.atwho-query')).contents().unwrap();
|
@@ -631,23 +745,45 @@ EditableController = (function(superClass) {
|
|
631
745
|
if (!this._movingEvent(e)) {
|
632
746
|
$query.removeClass('atwho-inserted');
|
633
747
|
}
|
748
|
+
if ($query.length > 0) {
|
749
|
+
switch (e.which) {
|
750
|
+
case KEY_CODE.LEFT:
|
751
|
+
this._setRange('before', $query.get(0), range);
|
752
|
+
$query.removeClass('atwho-query');
|
753
|
+
return;
|
754
|
+
case KEY_CODE.RIGHT:
|
755
|
+
this._setRange('after', $query.get(0).nextSibling, range);
|
756
|
+
$query.removeClass('atwho-query');
|
757
|
+
return;
|
758
|
+
}
|
759
|
+
}
|
760
|
+
if ($query.length > 0 && (query_content = $query.attr('data-atwho-at-query'))) {
|
761
|
+
$query.empty().html(query_content).attr('data-atwho-at-query', null);
|
762
|
+
this._setRange('after', $query.get(0), range);
|
763
|
+
}
|
634
764
|
_range = range.cloneRange();
|
635
765
|
_range.setStart(range.startContainer, 0);
|
636
|
-
matched = this.callbacks("matcher").call(this, this.at, _range.toString(), this.getOpt('startWithSpace'));
|
637
|
-
|
766
|
+
matched = this.callbacks("matcher").call(this, this.at, _range.toString(), this.getOpt('startWithSpace'), this.getOpt("acceptSpaceBar"));
|
767
|
+
isString = typeof matched === 'string';
|
768
|
+
if ($query.length === 0 && isString && (index = range.startOffset - this.at.length - matched.length) >= 0) {
|
638
769
|
range.setStart(range.startContainer, index);
|
639
770
|
$query = $('<span/>', this.app.document).attr(this.getOpt("editableAtwhoQueryAttrs")).addClass('atwho-query');
|
640
771
|
range.surroundContents($query.get(0));
|
641
772
|
lastNode = $query.contents().last().get(0);
|
642
|
-
if (
|
643
|
-
|
644
|
-
|
645
|
-
|
646
|
-
|
647
|
-
|
773
|
+
if (lastNode) {
|
774
|
+
if (/firefox/i.test(navigator.userAgent)) {
|
775
|
+
range.setStart(lastNode, lastNode.length);
|
776
|
+
range.setEnd(lastNode, lastNode.length);
|
777
|
+
this._clearRange(range);
|
778
|
+
} else {
|
779
|
+
this._setRange('after', lastNode, range);
|
780
|
+
}
|
648
781
|
}
|
649
782
|
}
|
650
|
-
if (
|
783
|
+
if (isString && matched.length < this.getOpt('minLen', 0)) {
|
784
|
+
return;
|
785
|
+
}
|
786
|
+
if (isString && matched.length <= this.getOpt('maxLen', 20)) {
|
651
787
|
query = {
|
652
788
|
text: matched,
|
653
789
|
el: $query
|
@@ -673,6 +809,9 @@ EditableController = (function(superClass) {
|
|
673
809
|
EditableController.prototype.rect = function() {
|
674
810
|
var $iframe, iframeOffset, rect;
|
675
811
|
rect = this.query.el.offset();
|
812
|
+
if (!(rect && this.query.el[0].getClientRects().length)) {
|
813
|
+
return;
|
814
|
+
}
|
676
815
|
if (this.app.iframe && !this.app.iframeAsRoot) {
|
677
816
|
iframeOffset = ($iframe = $(this.app.iframe)).offset();
|
678
817
|
rect.left += iframeOffset.left - this.$inputor.scrollLeft();
|
@@ -683,13 +822,23 @@ EditableController = (function(superClass) {
|
|
683
822
|
};
|
684
823
|
|
685
824
|
EditableController.prototype.insert = function(content, $li) {
|
686
|
-
var range, suffix, suffixNode;
|
825
|
+
var data, overrides, range, suffix, suffixNode;
|
826
|
+
if (!this.$inputor.is(':focus')) {
|
827
|
+
this.$inputor.focus();
|
828
|
+
}
|
829
|
+
overrides = this.getOpt('functionOverrides');
|
830
|
+
if (overrides.insert) {
|
831
|
+
return overrides.insert.call(this, content, $li);
|
832
|
+
}
|
687
833
|
suffix = (suffix = this.getOpt('suffix')) === "" ? suffix : suffix || "\u00A0";
|
688
|
-
|
834
|
+
data = $li.data('item-data');
|
835
|
+
this.query.el.removeClass('atwho-query').addClass('atwho-inserted').html(content).attr('data-atwho-at-query', "" + data['atwho-at'] + this.query.text).attr('contenteditable', "false");
|
689
836
|
if (range = this._getRange()) {
|
690
|
-
|
837
|
+
if (this.query.el.length) {
|
838
|
+
range.setEndAfter(this.query.el[0]);
|
839
|
+
}
|
691
840
|
range.collapse(false);
|
692
|
-
range.insertNode(suffixNode = this.app.document.createTextNode(suffix));
|
841
|
+
range.insertNode(suffixNode = this.app.document.createTextNode("" + suffix));
|
693
842
|
this._setRange('after', suffixNode, range);
|
694
843
|
}
|
695
844
|
if (!this.$inputor.is(':focus')) {
|
@@ -702,6 +851,8 @@ EditableController = (function(superClass) {
|
|
702
851
|
|
703
852
|
})(Controller);
|
704
853
|
|
854
|
+
var Model;
|
855
|
+
|
705
856
|
Model = (function() {
|
706
857
|
function Model(context) {
|
707
858
|
this.context = context;
|
@@ -766,18 +917,25 @@ Model = (function() {
|
|
766
917
|
|
767
918
|
})();
|
768
919
|
|
920
|
+
var View;
|
921
|
+
|
769
922
|
View = (function() {
|
770
923
|
function View(context) {
|
771
924
|
this.context = context;
|
772
925
|
this.$el = $("<div class='atwho-view'><ul class='atwho-view-ul'></ul></div>");
|
926
|
+
this.$elUl = this.$el.children();
|
773
927
|
this.timeoutID = null;
|
774
928
|
this.context.$el.append(this.$el);
|
775
929
|
this.bindEvent();
|
776
930
|
}
|
777
931
|
|
778
932
|
View.prototype.init = function() {
|
779
|
-
var id;
|
933
|
+
var header_tpl, id;
|
780
934
|
id = this.context.getOpt("alias") || this.context.at.charCodeAt(0);
|
935
|
+
header_tpl = this.context.getOpt("headerTpl");
|
936
|
+
if (header_tpl && this.$el.children().length === 1) {
|
937
|
+
this.$el.prepend(header_tpl);
|
938
|
+
}
|
781
939
|
return this.$el.attr({
|
782
940
|
'id': "at-view-" + id
|
783
941
|
});
|
@@ -788,12 +946,26 @@ View = (function() {
|
|
788
946
|
};
|
789
947
|
|
790
948
|
View.prototype.bindEvent = function() {
|
791
|
-
var $menu;
|
949
|
+
var $menu, lastCoordX, lastCoordY;
|
792
950
|
$menu = this.$el.find('ul');
|
793
|
-
|
794
|
-
|
795
|
-
|
796
|
-
|
951
|
+
lastCoordX = 0;
|
952
|
+
lastCoordY = 0;
|
953
|
+
return $menu.on('mousemove.atwho-view', 'li', (function(_this) {
|
954
|
+
return function(e) {
|
955
|
+
var $cur;
|
956
|
+
if (lastCoordX === e.clientX && lastCoordY === e.clientY) {
|
957
|
+
return;
|
958
|
+
}
|
959
|
+
lastCoordX = e.clientX;
|
960
|
+
lastCoordY = e.clientY;
|
961
|
+
$cur = $(e.currentTarget);
|
962
|
+
if ($cur.hasClass('cur')) {
|
963
|
+
return;
|
964
|
+
}
|
965
|
+
$menu.find('.cur').removeClass('cur');
|
966
|
+
return $cur.addClass('cur');
|
967
|
+
};
|
968
|
+
})(this)).on('click.atwho-view', 'li', (function(_this) {
|
797
969
|
return function(e) {
|
798
970
|
$menu.find('.cur').removeClass('cur');
|
799
971
|
$(e.currentTarget).addClass('cur');
|
@@ -804,7 +976,7 @@ View = (function() {
|
|
804
976
|
};
|
805
977
|
|
806
978
|
View.prototype.visible = function() {
|
807
|
-
return this.$el
|
979
|
+
return $.expr.filters.visible(this.$el[0]);
|
808
980
|
};
|
809
981
|
|
810
982
|
View.prototype.highlighted = function() {
|
@@ -815,7 +987,8 @@ View = (function() {
|
|
815
987
|
var $li, content;
|
816
988
|
if (($li = this.$el.find(".cur")).length) {
|
817
989
|
content = this.context.insertContentFor($li);
|
818
|
-
this.context.
|
990
|
+
this.context._stopDelayedCall();
|
991
|
+
this.context.insert(this.context.callbacks("beforeInsert").call(this.context, content, $li, e), $li);
|
819
992
|
this.context.trigger("inserted", [$li, e]);
|
820
993
|
this.hide(e);
|
821
994
|
}
|
@@ -845,36 +1018,40 @@ View = (function() {
|
|
845
1018
|
};
|
846
1019
|
|
847
1020
|
View.prototype.next = function() {
|
848
|
-
var cur, next;
|
1021
|
+
var cur, next, nextEl, offset;
|
849
1022
|
cur = this.$el.find('.cur').removeClass('cur');
|
850
1023
|
next = cur.next();
|
851
1024
|
if (!next.length) {
|
852
1025
|
next = this.$el.find('li:first');
|
853
1026
|
}
|
854
1027
|
next.addClass('cur');
|
855
|
-
|
1028
|
+
nextEl = next[0];
|
1029
|
+
offset = nextEl.offsetTop + nextEl.offsetHeight + (nextEl.nextSibling ? nextEl.nextSibling.offsetHeight : 0);
|
1030
|
+
return this.scrollTop(Math.max(0, offset - this.$el.height()));
|
856
1031
|
};
|
857
1032
|
|
858
1033
|
View.prototype.prev = function() {
|
859
|
-
var cur, prev;
|
1034
|
+
var cur, offset, prev, prevEl;
|
860
1035
|
cur = this.$el.find('.cur').removeClass('cur');
|
861
1036
|
prev = cur.prev();
|
862
1037
|
if (!prev.length) {
|
863
1038
|
prev = this.$el.find('li:last');
|
864
1039
|
}
|
865
1040
|
prev.addClass('cur');
|
866
|
-
|
1041
|
+
prevEl = prev[0];
|
1042
|
+
offset = prevEl.offsetTop + prevEl.offsetHeight + (prevEl.nextSibling ? prevEl.nextSibling.offsetHeight : 0);
|
1043
|
+
return this.scrollTop(Math.max(0, offset - this.$el.height()));
|
867
1044
|
};
|
868
1045
|
|
869
1046
|
View.prototype.scrollTop = function(scrollTop) {
|
870
1047
|
var scrollDuration;
|
871
1048
|
scrollDuration = this.context.getOpt('scrollDuration');
|
872
1049
|
if (scrollDuration) {
|
873
|
-
return this.$
|
1050
|
+
return this.$elUl.animate({
|
874
1051
|
scrollTop: scrollTop
|
875
1052
|
}, scrollDuration);
|
876
1053
|
} else {
|
877
|
-
return this.$
|
1054
|
+
return this.$elUl.scrollTop(scrollTop);
|
878
1055
|
}
|
879
1056
|
};
|
880
1057
|
|
@@ -942,107 +1119,7 @@ View = (function() {
|
|
942
1119
|
|
943
1120
|
})();
|
944
1121
|
|
945
|
-
|
946
|
-
DOWN: 40,
|
947
|
-
UP: 38,
|
948
|
-
ESC: 27,
|
949
|
-
TAB: 9,
|
950
|
-
ENTER: 13,
|
951
|
-
CTRL: 17,
|
952
|
-
A: 65,
|
953
|
-
P: 80,
|
954
|
-
N: 78,
|
955
|
-
LEFT: 37,
|
956
|
-
UP: 38,
|
957
|
-
RIGHT: 39,
|
958
|
-
DOWN: 40,
|
959
|
-
BACKSPACE: 8,
|
960
|
-
SPACE: 32
|
961
|
-
};
|
962
|
-
|
963
|
-
DEFAULT_CALLBACKS = {
|
964
|
-
beforeSave: function(data) {
|
965
|
-
return Controller.arrayToDefaultHash(data);
|
966
|
-
},
|
967
|
-
matcher: function(flag, subtext, should_startWithSpace, acceptSpaceBar) {
|
968
|
-
var _a, _y, match, regexp, space;
|
969
|
-
flag = flag.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
|
970
|
-
if (should_startWithSpace) {
|
971
|
-
flag = '(?:^|\\s)' + flag;
|
972
|
-
}
|
973
|
-
_a = decodeURI("%C3%80");
|
974
|
-
_y = decodeURI("%C3%BF");
|
975
|
-
space = acceptSpaceBar ? "\ " : "";
|
976
|
-
regexp = new RegExp(flag + "([A-Za-z" + _a + "-" + _y + "0-9_" + space + "\.\+\-]*)$|" + flag + "([^\\x00-\\xff]*)$", 'gi');
|
977
|
-
match = regexp.exec(subtext);
|
978
|
-
if (match) {
|
979
|
-
return match[2] || match[1];
|
980
|
-
} else {
|
981
|
-
return null;
|
982
|
-
}
|
983
|
-
},
|
984
|
-
filter: function(query, data, searchKey) {
|
985
|
-
var _results, i, item, len;
|
986
|
-
_results = [];
|
987
|
-
for (i = 0, len = data.length; i < len; i++) {
|
988
|
-
item = data[i];
|
989
|
-
if (~new String(item[searchKey]).toLowerCase().indexOf(query.toLowerCase())) {
|
990
|
-
_results.push(item);
|
991
|
-
}
|
992
|
-
}
|
993
|
-
return _results;
|
994
|
-
},
|
995
|
-
remoteFilter: null,
|
996
|
-
sorter: function(query, items, searchKey) {
|
997
|
-
var _results, i, item, len;
|
998
|
-
if (!query) {
|
999
|
-
return items;
|
1000
|
-
}
|
1001
|
-
_results = [];
|
1002
|
-
for (i = 0, len = items.length; i < len; i++) {
|
1003
|
-
item = items[i];
|
1004
|
-
item.atwho_order = new String(item[searchKey]).toLowerCase().indexOf(query.toLowerCase());
|
1005
|
-
if (item.atwho_order > -1) {
|
1006
|
-
_results.push(item);
|
1007
|
-
}
|
1008
|
-
}
|
1009
|
-
return _results.sort(function(a, b) {
|
1010
|
-
return a.atwho_order - b.atwho_order;
|
1011
|
-
});
|
1012
|
-
},
|
1013
|
-
tplEval: function(tpl, map) {
|
1014
|
-
var error, template;
|
1015
|
-
template = tpl;
|
1016
|
-
try {
|
1017
|
-
if (typeof tpl !== 'string') {
|
1018
|
-
template = tpl(map);
|
1019
|
-
}
|
1020
|
-
return template.replace(/\$\{([^\}]*)\}/g, function(tag, key, pos) {
|
1021
|
-
return map[key];
|
1022
|
-
});
|
1023
|
-
} catch (_error) {
|
1024
|
-
error = _error;
|
1025
|
-
return "";
|
1026
|
-
}
|
1027
|
-
},
|
1028
|
-
highlighter: function(li, query) {
|
1029
|
-
var regexp;
|
1030
|
-
if (!query) {
|
1031
|
-
return li;
|
1032
|
-
}
|
1033
|
-
regexp = new RegExp(">\\s*(\\w*?)(" + query.replace("+", "\\+") + ")(\\w*)\\s*<", 'ig');
|
1034
|
-
return li.replace(regexp, function(str, $1, $2, $3) {
|
1035
|
-
return '> ' + $1 + '<strong>' + $2 + '</strong>' + $3 + ' <';
|
1036
|
-
});
|
1037
|
-
},
|
1038
|
-
beforeInsert: function(value, $li) {
|
1039
|
-
return value;
|
1040
|
-
},
|
1041
|
-
beforeReposition: function(offset) {
|
1042
|
-
return offset;
|
1043
|
-
},
|
1044
|
-
afterMatchFailed: function(at, el) {}
|
1045
|
-
};
|
1122
|
+
var Api;
|
1046
1123
|
|
1047
1124
|
Api = {
|
1048
1125
|
load: function(at, data) {
|
@@ -1053,7 +1130,7 @@ Api = {
|
|
1053
1130
|
},
|
1054
1131
|
isSelecting: function() {
|
1055
1132
|
var ref;
|
1056
|
-
return (ref = this.controller()) != null ? ref.view.visible() : void 0;
|
1133
|
+
return !!((ref = this.controller()) != null ? ref.view.visible() : void 0);
|
1057
1134
|
},
|
1058
1135
|
hide: function() {
|
1059
1136
|
var ref;
|
@@ -1108,23 +1185,28 @@ $.fn.atwho["default"] = {
|
|
1108
1185
|
data: null,
|
1109
1186
|
displayTpl: "<li>${name}</li>",
|
1110
1187
|
insertTpl: "${atwho-at}${name}",
|
1188
|
+
headerTpl: null,
|
1111
1189
|
callbacks: DEFAULT_CALLBACKS,
|
1190
|
+
functionOverrides: {},
|
1112
1191
|
searchKey: "name",
|
1113
1192
|
suffix: void 0,
|
1114
1193
|
hideWithoutSuffix: false,
|
1115
1194
|
startWithSpace: true,
|
1195
|
+
acceptSpaceBar: false,
|
1116
1196
|
highlightFirst: true,
|
1117
1197
|
limit: 5,
|
1118
1198
|
maxLen: 20,
|
1199
|
+
minLen: 0,
|
1119
1200
|
displayTimeout: 300,
|
1120
1201
|
delay: null,
|
1121
1202
|
spaceSelectsMatch: false,
|
1122
1203
|
tabSelectsMatch: true,
|
1123
1204
|
editableAtwhoQueryAttrs: {},
|
1124
|
-
scrollDuration: 150
|
1205
|
+
scrollDuration: 150,
|
1206
|
+
suspendOnComposing: true,
|
1207
|
+
lookUpOnClick: true
|
1125
1208
|
};
|
1126
1209
|
|
1127
1210
|
$.fn.atwho.debug = false;
|
1128
1211
|
|
1129
|
-
|
1130
1212
|
}));
|
@@ -10,11 +10,32 @@
|
|
10
10
|
border-radius: 3px;
|
11
11
|
box-shadow: 0 0 5px rgba(0,0,0,0.1);
|
12
12
|
min-width: 120px;
|
13
|
-
max-height: 200px;
|
14
|
-
overflow: auto;
|
15
13
|
z-index: 11110 !important;
|
16
14
|
}
|
17
15
|
|
16
|
+
.atwho-view .atwho-header {
|
17
|
+
padding: 5px;
|
18
|
+
margin: 5px;
|
19
|
+
cursor: pointer;
|
20
|
+
border-bottom: solid 1px #eaeff1;
|
21
|
+
color: #6f8092;
|
22
|
+
font-size: 11px;
|
23
|
+
font-weight: bold;
|
24
|
+
}
|
25
|
+
|
26
|
+
.atwho-view .atwho-header .small {
|
27
|
+
color: #6f8092;
|
28
|
+
float: right;
|
29
|
+
padding-top: 2px;
|
30
|
+
margin-right: -5px;
|
31
|
+
font-size: 12px;
|
32
|
+
font-weight: normal;
|
33
|
+
}
|
34
|
+
|
35
|
+
.atwho-view .atwho-header:hover {
|
36
|
+
cursor: default;
|
37
|
+
}
|
38
|
+
|
18
39
|
.atwho-view .cur {
|
19
40
|
background: #3366FF;
|
20
41
|
color: white;
|
@@ -34,6 +55,8 @@
|
|
34
55
|
list-style:none;
|
35
56
|
padding:0;
|
36
57
|
margin:auto;
|
58
|
+
max-height: 200px;
|
59
|
+
overflow-y: auto;
|
37
60
|
}
|
38
61
|
.atwho-view ul li {
|
39
62
|
display: block;
|
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: 1.
|
4
|
+
version: 1.5.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ichord
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-01-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -86,7 +86,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
86
86
|
version: '0'
|
87
87
|
requirements: []
|
88
88
|
rubyforge_project: jquery-atwho-rails
|
89
|
-
rubygems_version: 2.
|
89
|
+
rubygems_version: 2.6.7
|
90
90
|
signing_key:
|
91
91
|
specification_version: 4
|
92
92
|
summary: 'jquery plugin: @mentions'
|