jquery-atwho-rails 0.3.0 → 0.3.1
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.
- data/lib/assets/javascripts/jquery.atwho.js +283 -257
- data/lib/jquery-atwho-rails/version.rb +1 -1
- metadata +2 -2
@@ -18,152 +18,112 @@
|
|
18
18
|
return factory(window.jQuery);
|
19
19
|
}
|
20
20
|
})(function($) {
|
21
|
-
var $CONTAINER, Api, Controller, DEFAULT_CALLBACKS, DEFAULT_TPL, KEY_CODE, Model, View;
|
22
|
-
|
23
|
-
DOWN: 40,
|
24
|
-
UP: 38,
|
25
|
-
ESC: 27,
|
26
|
-
TAB: 9,
|
27
|
-
ENTER: 13
|
28
|
-
};
|
29
|
-
DEFAULT_CALLBACKS = {
|
30
|
-
before_save: function(data) {
|
31
|
-
var item, _i, _len, _results;
|
32
|
-
if (!$.isArray(data)) {
|
33
|
-
return data;
|
34
|
-
}
|
35
|
-
_results = [];
|
36
|
-
for (_i = 0, _len = data.length; _i < _len; _i++) {
|
37
|
-
item = data[_i];
|
38
|
-
if ($.isPlainObject(item)) {
|
39
|
-
_results.push(item);
|
40
|
-
} else {
|
41
|
-
_results.push({
|
42
|
-
name: item
|
43
|
-
});
|
44
|
-
}
|
45
|
-
}
|
46
|
-
return _results;
|
47
|
-
},
|
48
|
-
matcher: function(flag, subtext) {
|
49
|
-
var match, regexp;
|
50
|
-
flag = '(?:^|\\s)' + flag.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
|
51
|
-
regexp = new RegExp(flag + '([A-Za-z0-9_\+\-]*)$|' + flag + '([^\\x00-\\xff]*)$', 'gi');
|
52
|
-
match = regexp.exec(subtext);
|
53
|
-
if (match) {
|
54
|
-
return match[2] || match[1];
|
55
|
-
} else {
|
56
|
-
return null;
|
57
|
-
}
|
58
|
-
},
|
59
|
-
filter: function(query, data, search_key) {
|
60
|
-
var item, _i, _len, _results;
|
61
|
-
_results = [];
|
62
|
-
for (_i = 0, _len = data.length; _i < _len; _i++) {
|
63
|
-
item = data[_i];
|
64
|
-
if (~item[search_key].toLowerCase().indexOf(query)) {
|
65
|
-
_results.push(item);
|
66
|
-
}
|
67
|
-
}
|
68
|
-
return _results;
|
69
|
-
},
|
70
|
-
remote_filter: null,
|
71
|
-
sorter: function(query, items, search_key) {
|
72
|
-
var item, _i, _len, _results;
|
73
|
-
if (!query) {
|
74
|
-
return items;
|
75
|
-
}
|
76
|
-
_results = [];
|
77
|
-
for (_i = 0, _len = items.length; _i < _len; _i++) {
|
78
|
-
item = items[_i];
|
79
|
-
item.atwho_order = item[search_key].toLowerCase().indexOf(query);
|
80
|
-
if (item.atwho_order > -1) {
|
81
|
-
_results.push(item);
|
82
|
-
}
|
83
|
-
}
|
84
|
-
return _results.sort(function(a, b) {
|
85
|
-
return a.atwho_order - b.atwho_order;
|
86
|
-
});
|
87
|
-
},
|
88
|
-
tpl_eval: function(tpl, map) {
|
89
|
-
try {
|
90
|
-
return tpl.replace(/\$\{([^\}]*)\}/g, function(tag, key, pos) {
|
91
|
-
return map[key];
|
92
|
-
});
|
93
|
-
} catch (error) {
|
94
|
-
return "";
|
95
|
-
}
|
96
|
-
},
|
97
|
-
highlighter: function(li, query) {
|
98
|
-
var regexp;
|
99
|
-
if (!query) {
|
100
|
-
return li;
|
101
|
-
}
|
102
|
-
regexp = new RegExp(">\\s*(\\w*)(" + query.replace("+", "\\+") + ")(\\w*)\\s*<", 'ig');
|
103
|
-
return li.replace(regexp, function(str, $1, $2, $3) {
|
104
|
-
return '> ' + $1 + '<strong>' + $2 + '</strong>' + $3 + ' <';
|
105
|
-
});
|
106
|
-
},
|
107
|
-
before_insert: function(value, $li) {
|
108
|
-
return value;
|
109
|
-
}
|
110
|
-
};
|
111
|
-
Model = (function() {
|
112
|
-
var _storage;
|
113
|
-
|
114
|
-
_storage = {};
|
21
|
+
var $CONTAINER, Api, App, Controller, DEFAULT_CALLBACKS, DEFAULT_TPL, KEY_CODE, Model, View;
|
22
|
+
App = (function() {
|
115
23
|
|
116
|
-
function
|
117
|
-
this.
|
118
|
-
this.
|
24
|
+
function App(inputor) {
|
25
|
+
this.current_flag = null;
|
26
|
+
this.controllers = {};
|
27
|
+
this.$inputor = $(inputor);
|
28
|
+
this.listen();
|
119
29
|
}
|
120
30
|
|
121
|
-
|
122
|
-
return this.
|
31
|
+
App.prototype.controller = function(key) {
|
32
|
+
return this.controllers[key || this.current_flag];
|
123
33
|
};
|
124
34
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
search_key = this.context.get_opt("search_key");
|
129
|
-
callback(data = this.context.callbacks('filter').call(this.context, query, data, search_key));
|
130
|
-
if (!(data && data.length > 0)) {
|
131
|
-
return (_ref = this.context.callbacks('remote_filter')) != null ? _ref.call(this.context, query, callback) : void 0;
|
132
|
-
}
|
35
|
+
App.prototype.set_context_for = function(key) {
|
36
|
+
this.current_flag = key;
|
37
|
+
return this;
|
133
38
|
};
|
134
39
|
|
135
|
-
|
136
|
-
|
40
|
+
App.prototype.reg = function(flag, setting) {
|
41
|
+
var controller, _base;
|
42
|
+
controller = (_base = this.controllers)[flag] || (_base[flag] = new Controller(this, flag));
|
43
|
+
if (setting.alias) {
|
44
|
+
this.controllers[setting.alias] = controller;
|
45
|
+
}
|
46
|
+
controller.init(setting);
|
47
|
+
return this;
|
137
48
|
};
|
138
49
|
|
139
|
-
|
140
|
-
|
50
|
+
App.prototype.listen = function() {
|
51
|
+
var _this = this;
|
52
|
+
return this.$inputor.on('keyup.atwho', function(e) {
|
53
|
+
return _this.on_keyup(e);
|
54
|
+
}).on('keydown.atwho', function(e) {
|
55
|
+
return _this.on_keydown(e);
|
56
|
+
}).on('scroll.atwho', function(e) {
|
57
|
+
var _ref;
|
58
|
+
return (_ref = _this.controller()) != null ? _ref.view.hide() : void 0;
|
59
|
+
}).on('blur.atwho', function(e) {
|
60
|
+
var c;
|
61
|
+
if (c = _this.controller()) {
|
62
|
+
return c.view.hide(c.get_opt("display_timeout"));
|
63
|
+
}
|
64
|
+
});
|
141
65
|
};
|
142
66
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
67
|
+
App.prototype.dispatch = function() {
|
68
|
+
var _this = this;
|
69
|
+
return $.map(this.controllers, function(c) {
|
70
|
+
if (c.look_up()) {
|
71
|
+
return _this.set_context_for(c.key);
|
72
|
+
}
|
73
|
+
});
|
147
74
|
};
|
148
75
|
|
149
|
-
|
150
|
-
|
76
|
+
App.prototype.on_keyup = function(e) {
|
77
|
+
var _ref;
|
78
|
+
switch (e.keyCode) {
|
79
|
+
case KEY_CODE.ESC:
|
80
|
+
e.preventDefault();
|
81
|
+
if ((_ref = this.controller()) != null) {
|
82
|
+
_ref.view.hide();
|
83
|
+
}
|
84
|
+
break;
|
85
|
+
case KEY_CODE.DOWN:
|
86
|
+
case KEY_CODE.UP:
|
87
|
+
$.noop();
|
88
|
+
break;
|
89
|
+
default:
|
90
|
+
this.dispatch();
|
91
|
+
}
|
151
92
|
};
|
152
93
|
|
153
|
-
|
154
|
-
var
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
94
|
+
App.prototype.on_keydown = function(e) {
|
95
|
+
var view, _ref;
|
96
|
+
view = (_ref = this.controller()) != null ? _ref.view : void 0;
|
97
|
+
if (!(view && view.visible())) {
|
98
|
+
return;
|
99
|
+
}
|
100
|
+
switch (e.keyCode) {
|
101
|
+
case KEY_CODE.ESC:
|
102
|
+
e.preventDefault();
|
103
|
+
view.hide();
|
104
|
+
break;
|
105
|
+
case KEY_CODE.UP:
|
106
|
+
e.preventDefault();
|
107
|
+
view.prev();
|
108
|
+
break;
|
109
|
+
case KEY_CODE.DOWN:
|
110
|
+
e.preventDefault();
|
111
|
+
view.next();
|
112
|
+
break;
|
113
|
+
case KEY_CODE.TAB:
|
114
|
+
case KEY_CODE.ENTER:
|
115
|
+
if (!view.visible()) {
|
116
|
+
return;
|
117
|
+
}
|
118
|
+
e.preventDefault();
|
119
|
+
view.choose();
|
120
|
+
break;
|
121
|
+
default:
|
122
|
+
$.noop();
|
163
123
|
}
|
164
124
|
};
|
165
125
|
|
166
|
-
return
|
126
|
+
return App;
|
167
127
|
|
168
128
|
})();
|
169
129
|
Controller = (function() {
|
@@ -175,57 +135,22 @@
|
|
175
135
|
return _uuid += 1;
|
176
136
|
};
|
177
137
|
|
178
|
-
function Controller(
|
179
|
-
this.
|
180
|
-
this.
|
181
|
-
this
|
182
|
-
this.
|
138
|
+
function Controller(app, key) {
|
139
|
+
this.app = app;
|
140
|
+
this.key = key;
|
141
|
+
this.$inputor = this.app.$inputor;
|
142
|
+
this.id = this.$inputor[0].id || uuid();
|
143
|
+
this.setting = null;
|
183
144
|
this.query = null;
|
184
|
-
this.
|
185
|
-
this._views = {};
|
186
|
-
this._models = {};
|
187
|
-
this.$inputor = $(inputor);
|
145
|
+
this.pos = 0;
|
188
146
|
$CONTAINER.append(this.$el = $("<div id='atwho-ground-" + this.id + "'></div>"));
|
189
|
-
this.
|
147
|
+
this.model = new Model(this);
|
148
|
+
this.view = new View(this);
|
190
149
|
}
|
191
150
|
|
192
|
-
Controller.prototype.
|
193
|
-
|
194
|
-
return this
|
195
|
-
return _this.on_keyup(e);
|
196
|
-
}).on('keydown.atwho', function(e) {
|
197
|
-
return _this.on_keydown(e);
|
198
|
-
}).on('scroll.atwho', function(e) {
|
199
|
-
var _ref;
|
200
|
-
return (_ref = _this.view) != null ? _ref.hide() : void 0;
|
201
|
-
}).on('blur.atwho', function(e) {
|
202
|
-
var _ref;
|
203
|
-
return (_ref = _this.view) != null ? _ref.hide(_this.get_opt("display_timeout")) : void 0;
|
204
|
-
});
|
205
|
-
};
|
206
|
-
|
207
|
-
Controller.prototype.set_context_for = function(flag) {
|
208
|
-
flag = this.current_flag = this.the_flag[flag];
|
209
|
-
this.view = this._views[flag];
|
210
|
-
this.model = this._models[flag];
|
211
|
-
return this;
|
212
|
-
};
|
213
|
-
|
214
|
-
Controller.prototype.reg = function(flag, settings) {
|
215
|
-
var setting;
|
216
|
-
setting = this.settings[flag] = $.extend({}, this.settings[flag] || $.fn.atwho["default"], settings);
|
217
|
-
this.set_context_for(flag = (setting.alias ? this.the_flag[setting.alias] = flag : void 0, this.the_flag[flag] = flag));
|
218
|
-
(this._models[flag] = new Model(this, flag)).reload(setting.data);
|
219
|
-
this._views[flag] = new View(this, flag);
|
220
|
-
return this;
|
221
|
-
};
|
222
|
-
|
223
|
-
Controller.prototype.trigger = function(name, data) {
|
224
|
-
var alias, event_name;
|
225
|
-
data.push(this);
|
226
|
-
alias = this.get_opt('alias');
|
227
|
-
event_name = alias ? "" + name + "-" + alias + ".atwho" : "" + name + ".atwho";
|
228
|
-
return this.$inputor.trigger(event_name, data);
|
151
|
+
Controller.prototype.init = function(setting) {
|
152
|
+
this.setting = $.extend({}, this.setting || $.fn.atwho["default"], setting);
|
153
|
+
return this.model.reload(this.setting.data);
|
229
154
|
};
|
230
155
|
|
231
156
|
Controller.prototype.super_call = function() {
|
@@ -238,44 +163,32 @@
|
|
238
163
|
}
|
239
164
|
};
|
240
165
|
|
166
|
+
Controller.prototype.trigger = function(name, data) {
|
167
|
+
var alias, event_name;
|
168
|
+
data.push(this);
|
169
|
+
alias = this.get_opt('alias');
|
170
|
+
event_name = alias ? "" + name + "-" + alias + ".atwho" : "" + name + ".atwho";
|
171
|
+
return this.$inputor.trigger(event_name, data);
|
172
|
+
};
|
173
|
+
|
241
174
|
Controller.prototype.callbacks = function(func_name) {
|
242
175
|
return this.get_opt("callbacks")[func_name] || DEFAULT_CALLBACKS[func_name];
|
243
176
|
};
|
244
177
|
|
245
178
|
Controller.prototype.get_opt = function(key, default_value) {
|
246
179
|
try {
|
247
|
-
return this.
|
180
|
+
return this.setting[key];
|
248
181
|
} catch (e) {
|
249
182
|
return null;
|
250
183
|
}
|
251
184
|
};
|
252
185
|
|
253
|
-
Controller.prototype.rect = function() {
|
254
|
-
var c, scale_bottom;
|
255
|
-
c = this.$inputor.caret('offset', this.pos - 1);
|
256
|
-
scale_bottom = document.selection ? 0 : 2;
|
257
|
-
return {
|
258
|
-
left: c.left,
|
259
|
-
top: c.top,
|
260
|
-
bottom: c.top + c.height + scale_bottom
|
261
|
-
};
|
262
|
-
};
|
263
|
-
|
264
186
|
Controller.prototype.catch_query = function() {
|
265
|
-
var caret_pos, content, end, query, start, subtext
|
266
|
-
_this = this;
|
187
|
+
var caret_pos, content, end, query, start, subtext;
|
267
188
|
content = this.$inputor.val();
|
268
189
|
caret_pos = this.$inputor.caret('pos');
|
269
190
|
subtext = content.slice(0, caret_pos);
|
270
|
-
query =
|
271
|
-
$.map(this.settings, function(setting) {
|
272
|
-
var _result;
|
273
|
-
_result = _this.callbacks("matcher").call(_this, setting.at, subtext);
|
274
|
-
if (_result != null) {
|
275
|
-
query = _result;
|
276
|
-
return _this.set_context_for(setting.at);
|
277
|
-
}
|
278
|
-
});
|
191
|
+
query = this.callbacks("matcher").call(this, this.key, subtext);
|
279
192
|
if (typeof query === "string" && query.length <= this.get_opt('max_len', 20)) {
|
280
193
|
start = caret_pos - query.length;
|
281
194
|
end = start + query.length;
|
@@ -285,21 +198,30 @@
|
|
285
198
|
'head_pos': start,
|
286
199
|
'end_pos': end
|
287
200
|
};
|
288
|
-
this.trigger("matched", [this.
|
201
|
+
this.trigger("matched", [this.key, query.text]);
|
289
202
|
} else {
|
290
|
-
|
291
|
-
_ref.hide();
|
292
|
-
}
|
203
|
+
this.view.hide();
|
293
204
|
}
|
294
205
|
return this.query = query;
|
295
206
|
};
|
296
207
|
|
208
|
+
Controller.prototype.rect = function() {
|
209
|
+
var c, scale_bottom;
|
210
|
+
c = this.$inputor.caret('offset', this.pos - 1);
|
211
|
+
scale_bottom = document.selection ? 0 : 2;
|
212
|
+
return {
|
213
|
+
left: c.left,
|
214
|
+
top: c.top,
|
215
|
+
bottom: c.top + c.height + scale_bottom
|
216
|
+
};
|
217
|
+
};
|
218
|
+
|
297
219
|
Controller.prototype.insert = function(str) {
|
298
220
|
var $inputor, flag_len, source, start_str, text;
|
299
221
|
$inputor = this.$inputor;
|
300
222
|
str = '' + str;
|
301
223
|
source = $inputor.val();
|
302
|
-
flag_len = this.get_opt("display_flag") ? 0 : this.
|
224
|
+
flag_len = this.get_opt("display_flag") ? 0 : this.key.length;
|
303
225
|
start_str = source.slice(0, (this.query['head_pos'] || 0) - flag_len);
|
304
226
|
text = "" + start_str + str + " " + (source.slice(this.query['end_pos'] || 0));
|
305
227
|
$inputor.val(text);
|
@@ -307,52 +229,6 @@
|
|
307
229
|
return $inputor.change();
|
308
230
|
};
|
309
231
|
|
310
|
-
Controller.prototype.on_keyup = function(e) {
|
311
|
-
switch (e.keyCode) {
|
312
|
-
case KEY_CODE.ESC:
|
313
|
-
e.preventDefault();
|
314
|
-
this.view.hide();
|
315
|
-
break;
|
316
|
-
case KEY_CODE.DOWN:
|
317
|
-
case KEY_CODE.UP:
|
318
|
-
$.noop();
|
319
|
-
break;
|
320
|
-
default:
|
321
|
-
this.look_up();
|
322
|
-
}
|
323
|
-
};
|
324
|
-
|
325
|
-
Controller.prototype.on_keydown = function(e) {
|
326
|
-
var _ref;
|
327
|
-
if (!((_ref = this.view) != null ? _ref.visible() : void 0)) {
|
328
|
-
return;
|
329
|
-
}
|
330
|
-
switch (e.keyCode) {
|
331
|
-
case KEY_CODE.ESC:
|
332
|
-
e.preventDefault();
|
333
|
-
this.view.hide();
|
334
|
-
break;
|
335
|
-
case KEY_CODE.UP:
|
336
|
-
e.preventDefault();
|
337
|
-
this.view.prev();
|
338
|
-
break;
|
339
|
-
case KEY_CODE.DOWN:
|
340
|
-
e.preventDefault();
|
341
|
-
this.view.next();
|
342
|
-
break;
|
343
|
-
case KEY_CODE.TAB:
|
344
|
-
case KEY_CODE.ENTER:
|
345
|
-
if (!this.view.visible()) {
|
346
|
-
return;
|
347
|
-
}
|
348
|
-
e.preventDefault();
|
349
|
-
this.view.choose();
|
350
|
-
break;
|
351
|
-
default:
|
352
|
-
$.noop();
|
353
|
-
}
|
354
|
-
};
|
355
|
-
|
356
232
|
Controller.prototype.render_view = function(data) {
|
357
233
|
var search_key;
|
358
234
|
search_key = this.get_opt("search_key");
|
@@ -372,17 +248,76 @@
|
|
372
248
|
return this.view.hide();
|
373
249
|
}
|
374
250
|
};
|
375
|
-
|
251
|
+
this.model.query(query.text, $.proxy(_callback, this));
|
252
|
+
return query;
|
376
253
|
};
|
377
254
|
|
378
255
|
return Controller;
|
379
256
|
|
257
|
+
})();
|
258
|
+
Model = (function() {
|
259
|
+
var _storage;
|
260
|
+
|
261
|
+
_storage = {};
|
262
|
+
|
263
|
+
function Model(context) {
|
264
|
+
this.context = context;
|
265
|
+
this.key = this.context.key;
|
266
|
+
}
|
267
|
+
|
268
|
+
Model.prototype.saved = function() {
|
269
|
+
return this.fetch() > 0;
|
270
|
+
};
|
271
|
+
|
272
|
+
Model.prototype.query = function(query, callback) {
|
273
|
+
var data, search_key, _ref;
|
274
|
+
data = this.fetch();
|
275
|
+
search_key = this.context.get_opt("search_key");
|
276
|
+
callback(data = this.context.callbacks('filter').call(this.context, query, data, search_key));
|
277
|
+
if (!(data && data.length > 0)) {
|
278
|
+
return (_ref = this.context.callbacks('remote_filter')) != null ? _ref.call(this.context, query, callback) : void 0;
|
279
|
+
}
|
280
|
+
};
|
281
|
+
|
282
|
+
Model.prototype.fetch = function() {
|
283
|
+
return _storage[this.key] || [];
|
284
|
+
};
|
285
|
+
|
286
|
+
Model.prototype.save = function(data) {
|
287
|
+
return _storage[this.key] = this.context.callbacks("before_save").call(this.context, data || []);
|
288
|
+
};
|
289
|
+
|
290
|
+
Model.prototype.load = function(data) {
|
291
|
+
if (!(this.saved() || !data)) {
|
292
|
+
return this._load(data);
|
293
|
+
}
|
294
|
+
};
|
295
|
+
|
296
|
+
Model.prototype.reload = function(data) {
|
297
|
+
return this._load(data);
|
298
|
+
};
|
299
|
+
|
300
|
+
Model.prototype._load = function(data) {
|
301
|
+
var _this = this;
|
302
|
+
if (typeof data === "string") {
|
303
|
+
return $.ajax(data, {
|
304
|
+
dataType: "json"
|
305
|
+
}).done(function(data) {
|
306
|
+
return _this.save(data);
|
307
|
+
});
|
308
|
+
} else {
|
309
|
+
return this.save(data);
|
310
|
+
}
|
311
|
+
};
|
312
|
+
|
313
|
+
return Model;
|
314
|
+
|
380
315
|
})();
|
381
316
|
View = (function() {
|
382
317
|
|
383
|
-
function View(context
|
318
|
+
function View(context) {
|
384
319
|
this.context = context;
|
385
|
-
this.key = key;
|
320
|
+
this.key = this.context.key;
|
386
321
|
this.id = this.context.get_opt("alias") || ("at-view-" + (this.key.charCodeAt(0)));
|
387
322
|
this.$el = $("<div id='" + this.id + "' class='atwho-view'><ul id='" + this.id + "-ul' class='atwho-view-url'></ul></div>");
|
388
323
|
this.timeout_id = null;
|
@@ -493,22 +428,113 @@
|
|
493
428
|
return View;
|
494
429
|
|
495
430
|
})();
|
431
|
+
KEY_CODE = {
|
432
|
+
DOWN: 40,
|
433
|
+
UP: 38,
|
434
|
+
ESC: 27,
|
435
|
+
TAB: 9,
|
436
|
+
ENTER: 13
|
437
|
+
};
|
438
|
+
DEFAULT_CALLBACKS = {
|
439
|
+
before_save: function(data) {
|
440
|
+
var item, _i, _len, _results;
|
441
|
+
if (!$.isArray(data)) {
|
442
|
+
return data;
|
443
|
+
}
|
444
|
+
_results = [];
|
445
|
+
for (_i = 0, _len = data.length; _i < _len; _i++) {
|
446
|
+
item = data[_i];
|
447
|
+
if ($.isPlainObject(item)) {
|
448
|
+
_results.push(item);
|
449
|
+
} else {
|
450
|
+
_results.push({
|
451
|
+
name: item
|
452
|
+
});
|
453
|
+
}
|
454
|
+
}
|
455
|
+
return _results;
|
456
|
+
},
|
457
|
+
matcher: function(flag, subtext) {
|
458
|
+
var match, regexp;
|
459
|
+
flag = '(?:^|\\s)' + flag.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
|
460
|
+
regexp = new RegExp(flag + '([A-Za-z0-9_\+\-]*)$|' + flag + '([^\\x00-\\xff]*)$', 'gi');
|
461
|
+
match = regexp.exec(subtext);
|
462
|
+
if (match) {
|
463
|
+
return match[2] || match[1];
|
464
|
+
} else {
|
465
|
+
return null;
|
466
|
+
}
|
467
|
+
},
|
468
|
+
filter: function(query, data, search_key) {
|
469
|
+
var item, _i, _len, _results;
|
470
|
+
_results = [];
|
471
|
+
for (_i = 0, _len = data.length; _i < _len; _i++) {
|
472
|
+
item = data[_i];
|
473
|
+
if (~item[search_key].toLowerCase().indexOf(query)) {
|
474
|
+
_results.push(item);
|
475
|
+
}
|
476
|
+
}
|
477
|
+
return _results;
|
478
|
+
},
|
479
|
+
remote_filter: null,
|
480
|
+
sorter: function(query, items, search_key) {
|
481
|
+
var item, _i, _len, _results;
|
482
|
+
if (!query) {
|
483
|
+
return items;
|
484
|
+
}
|
485
|
+
_results = [];
|
486
|
+
for (_i = 0, _len = items.length; _i < _len; _i++) {
|
487
|
+
item = items[_i];
|
488
|
+
item.atwho_order = item[search_key].toLowerCase().indexOf(query);
|
489
|
+
if (item.atwho_order > -1) {
|
490
|
+
_results.push(item);
|
491
|
+
}
|
492
|
+
}
|
493
|
+
return _results.sort(function(a, b) {
|
494
|
+
return a.atwho_order - b.atwho_order;
|
495
|
+
});
|
496
|
+
},
|
497
|
+
tpl_eval: function(tpl, map) {
|
498
|
+
try {
|
499
|
+
return tpl.replace(/\$\{([^\}]*)\}/g, function(tag, key, pos) {
|
500
|
+
return map[key];
|
501
|
+
});
|
502
|
+
} catch (error) {
|
503
|
+
return "";
|
504
|
+
}
|
505
|
+
},
|
506
|
+
highlighter: function(li, query) {
|
507
|
+
var regexp;
|
508
|
+
if (!query) {
|
509
|
+
return li;
|
510
|
+
}
|
511
|
+
regexp = new RegExp(">\\s*(\\w*)(" + query.replace("+", "\\+") + ")(\\w*)\\s*<", 'ig');
|
512
|
+
return li.replace(regexp, function(str, $1, $2, $3) {
|
513
|
+
return '> ' + $1 + '<strong>' + $2 + '</strong>' + $3 + ' <';
|
514
|
+
});
|
515
|
+
},
|
516
|
+
before_insert: function(value, $li) {
|
517
|
+
return value;
|
518
|
+
}
|
519
|
+
};
|
496
520
|
DEFAULT_TPL = "<li data-value='${name}'>${name}</li>";
|
497
521
|
Api = {
|
498
522
|
init: function(options) {
|
499
523
|
var $this, app;
|
500
524
|
app = ($this = $(this)).data("atwho");
|
501
525
|
if (!app) {
|
502
|
-
$this.data('atwho', (app = new
|
526
|
+
$this.data('atwho', (app = new App(this)));
|
503
527
|
}
|
504
528
|
return app.reg(options.at, options);
|
505
529
|
},
|
506
|
-
load: function(
|
507
|
-
|
508
|
-
|
530
|
+
load: function(key, data) {
|
531
|
+
var c;
|
532
|
+
if (c = this.controller(key)) {
|
533
|
+
return c.model.load(data);
|
534
|
+
}
|
509
535
|
},
|
510
536
|
run: function() {
|
511
|
-
return this.
|
537
|
+
return this.dispatch();
|
512
538
|
}
|
513
539
|
};
|
514
540
|
$CONTAINER = $("<div id='atwho-container'></div>");
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jquery-atwho-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-06-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|