bootstrap_tagsinput_rails 0.3.0 → 0.4.0

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: ea009f89e2026b4586be79ddd76c99b467606d2e
4
- data.tar.gz: 5f9fa1230f7170cd33905f874e72a951927e5b32
3
+ metadata.gz: 8aae1b6f00d4a943cc37dab41fc857f95f3b1f22
4
+ data.tar.gz: 11f4b2d3ee3598ab827804540a5571ed3b28e01f
5
5
  SHA512:
6
- metadata.gz: 293cdff1345451c37c5f0fa5e9f91c4c3556bec825f66937e7ecc79f5308487f2dc1c6b4aa65b8c3f66f6f524d778f5651ae7e7337fdf151ed909a2279df6b1b
7
- data.tar.gz: 67c1a1305aa870f3b59420857a959604d6a0f614ab3121cc719c0059357c6589d0fdfdb2dc4c69ef4e55af38b2915e03f74e7248ad702e99d6ddd4b2d9bbdaf7
6
+ metadata.gz: c2c979f218700d0a24cc7bd4720fbf1c65b0eb88a3ab513fd2af0aafc7b181da82d3c17497072ee96c3c323c02d217bec08dd5d54910f5b768cf3e88e8721212
7
+ data.tar.gz: 04904c840cdf0719e52bec32e25e6370a750ec27243670e8e325008b58dd5534ca8f0afc3071b3e76dc1e8ae78005230cf0efa40b430aab512e2f305c1ec739d
data/.gitignore CHANGED
@@ -7,3 +7,4 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ .DS_Store
@@ -1,3 +1,3 @@
1
1
  module BootstrapTagsinputRails
2
- VERSION = "0.3.0"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -0,0 +1,92 @@
1
+ /*
2
+ * bootstrap-tagsinput v0.8.0
3
+ *
4
+ */
5
+
6
+ angular.module('bootstrap-tagsinput', [])
7
+ .directive('bootstrapTagsinput', [function() {
8
+
9
+ function getItemProperty(scope, property) {
10
+ if (!property)
11
+ return undefined;
12
+
13
+ if (angular.isFunction(scope.$parent[property]))
14
+ return scope.$parent[property];
15
+
16
+ return function(item) {
17
+ return item[property];
18
+ };
19
+ }
20
+
21
+ return {
22
+ restrict: 'EA',
23
+ scope: {
24
+ model: '=ngModel'
25
+ },
26
+ template: '<select multiple></select>',
27
+ replace: false,
28
+ link: function(scope, element, attrs) {
29
+ $(function() {
30
+ if (!angular.isArray(scope.model))
31
+ scope.model = [];
32
+
33
+ var select = $('select', element);
34
+ var typeaheadSourceArray = attrs.typeaheadSource ? attrs.typeaheadSource.split('.') : null;
35
+ var typeaheadSource = typeaheadSourceArray ?
36
+ (typeaheadSourceArray.length > 1 ?
37
+ scope.$parent[typeaheadSourceArray[0]][typeaheadSourceArray[1]]
38
+ : scope.$parent[typeaheadSourceArray[0]])
39
+ : null;
40
+
41
+ select.tagsinput(scope.$parent[attrs.options || ''] || {
42
+ typeahead : {
43
+ source : angular.isFunction(typeaheadSource) ? typeaheadSource : null
44
+ },
45
+ itemValue: getItemProperty(scope, attrs.itemvalue),
46
+ itemText : getItemProperty(scope, attrs.itemtext),
47
+ confirmKeys : getItemProperty(scope, attrs.confirmkeys) ? JSON.parse(attrs.confirmkeys) : [13],
48
+ tagClass : angular.isFunction(scope.$parent[attrs.tagclass]) ? scope.$parent[attrs.tagclass] : function(item) { return attrs.tagclass; }
49
+ });
50
+
51
+ for (var i = 0; i < scope.model.length; i++) {
52
+ select.tagsinput('add', scope.model[i]);
53
+ }
54
+
55
+ select.on('itemAdded', function(event) {
56
+ if (scope.model.indexOf(event.item) === -1)
57
+ scope.model.push(event.item);
58
+ });
59
+
60
+ select.on('itemRemoved', function(event) {
61
+ var idx = scope.model.indexOf(event.item);
62
+ if (idx !== -1)
63
+ scope.model.splice(idx, 1);
64
+ });
65
+
66
+ // create a shallow copy of model's current state, needed to determine
67
+ // diff when model changes
68
+ var prev = scope.model.slice();
69
+ scope.$watch("model", function() {
70
+ var added = scope.model.filter(function(i) {return prev.indexOf(i) === -1;}),
71
+ removed = prev.filter(function(i) {return scope.model.indexOf(i) === -1;}),
72
+ i;
73
+
74
+ prev = scope.model.slice();
75
+
76
+ // Remove tags no longer in binded model
77
+ for (i = 0; i < removed.length; i++) {
78
+ select.tagsinput('remove', removed[i]);
79
+ }
80
+
81
+ // Refresh remaining tags
82
+ select.tagsinput('refresh');
83
+
84
+ // Add new items in model as tags
85
+ for (i = 0; i < added.length; i++) {
86
+ select.tagsinput('add', added[i]);
87
+ }
88
+ }, true);
89
+ });
90
+ }
91
+ };
92
+ }]);
@@ -0,0 +1,7 @@
1
+ /*
2
+ * bootstrap-tagsinput v0.8.0
3
+ *
4
+ */
5
+
6
+ angular.module("bootstrap-tagsinput",[]).directive("bootstrapTagsinput",[function(){function a(a,b){return b?angular.isFunction(a.$parent[b])?a.$parent[b]:function(a){return a[b]}:void 0}return{restrict:"EA",scope:{model:"=ngModel"},template:"<select multiple></select>",replace:!1,link:function(b,c,d){$(function(){angular.isArray(b.model)||(b.model=[]);var e=$("select",c),f=d.typeaheadSource?d.typeaheadSource.split("."):null,g=f?f.length>1?b.$parent[f[0]][f[1]]:b.$parent[f[0]]:null;e.tagsinput(b.$parent[d.options||""]||{typeahead:{source:angular.isFunction(g)?g:null},itemValue:a(b,d.itemvalue),itemText:a(b,d.itemtext),confirmKeys:a(b,d.confirmkeys)?JSON.parse(d.confirmkeys):[13],tagClass:angular.isFunction(b.$parent[d.tagclass])?b.$parent[d.tagclass]:function(a){return d.tagclass}});for(var h=0;h<b.model.length;h++)e.tagsinput("add",b.model[h]);e.on("itemAdded",function(a){-1===b.model.indexOf(a.item)&&b.model.push(a.item)}),e.on("itemRemoved",function(a){var c=b.model.indexOf(a.item);-1!==c&&b.model.splice(c,1)});var i=b.model.slice();b.$watch("model",function(){var a,c=b.model.filter(function(a){return-1===i.indexOf(a)}),d=i.filter(function(a){return-1===b.model.indexOf(a)});for(i=b.model.slice(),a=0;a<d.length;a++)e.tagsinput("remove",d[a]);for(e.tagsinput("refresh"),a=0;a<c.length;a++)e.tagsinput("add",c[a])},!0)})}}}]);
7
+ //# sourceMappingURL=bootstrap-tagsinput-angular.min.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bootstrap-tagsinput-angular.js"],"names":["angular","module","directive","getItemProperty","scope","property","isFunction","$parent","item","undefined","restrict","model","template","replace","link","element","attrs","$","isArray","select","typeaheadSourceArray","typeaheadSource","split","length","tagsinput","options","typeahead","source","itemValue","itemvalue","itemText","itemtext","confirmKeys","confirmkeys","JSON","parse","tagClass","tagclass","i","on","event","indexOf","push","idx","splice","prev","slice","$watch","added","filter","removed"],"mappings":";;;;;AAAAA,QAAQC,OAAO,0BACdC,UAAU,sBAAuB,WAEhC,QAASC,GAAgBC,EAAOC,GAC9B,MAAKA,GAGDL,QAAQM,WAAWF,EAAMG,QAAQF,IAC5BD,EAAMG,QAAQF,GAEhB,SAASG,GACd,MAAOA,GAAKH,IANLI,OAUX,OACEC,SAAU,KACVN,OACEO,MAAO,YAETC,SAAU,6BACVC,SAAS,EACTC,KAAM,SAASV,EAAOW,EAASC,GAC7BC,EAAE,WACKjB,QAAQkB,QAAQd,EAAMO,SACzBP,EAAMO,SAER,IAAIQ,GAASF,EAAE,SAAUF,GACrBK,EAAuBJ,EAAMK,gBAAkBL,EAAMK,gBAAgBC,MAAM,KAAO,KAClFD,EAAkBD,EACjBA,EAAqBG,OAAS,EAC3BnB,EAAMG,QAAQa,EAAqB,IAAIA,EAAqB,IAC1DhB,EAAMG,QAAQa,EAAqB,IACvC,IAEND,GAAOK,UAAUpB,EAAMG,QAAQS,EAAMS,SAAW,MAC9CC,WACEC,OAAW3B,QAAQM,WAAWe,GAAmBA,EAAkB,MAErEO,UAAWzB,EAAgBC,EAAOY,EAAMa,WACxCC,SAAW3B,EAAgBC,EAAOY,EAAMe,UACxCC,YAAc7B,EAAgBC,EAAOY,EAAMiB,aAAeC,KAAKC,MAAMnB,EAAMiB,cAAgB,IAC3FG,SAAWpC,QAAQM,WAAWF,EAAMG,QAAQS,EAAMqB,WAAajC,EAAMG,QAAQS,EAAMqB,UAAY,SAAS7B,GAAQ,MAAOQ,GAAMqB,WAG/H,KAAK,GAAIC,GAAI,EAAGA,EAAIlC,EAAMO,MAAMY,OAAQe,IACtCnB,EAAOK,UAAU,MAAOpB,EAAMO,MAAM2B,GAGtCnB,GAAOoB,GAAG,YAAa,SAASC,GACU,KAApCpC,EAAMO,MAAM8B,QAAQD,EAAMhC,OAC5BJ,EAAMO,MAAM+B,KAAKF,EAAMhC,QAG3BW,EAAOoB,GAAG,cAAe,SAASC,GAChC,GAAIG,GAAMvC,EAAMO,MAAM8B,QAAQD,EAAMhC,KACxB,MAARmC,GACFvC,EAAMO,MAAMiC,OAAOD,EAAK,IAK5B,IAAIE,GAAOzC,EAAMO,MAAMmC,OACvB1C,GAAM2C,OAAO,QAAS,WACpB,GAEIT,GAFAU,EAAQ5C,EAAMO,MAAMsC,OAAO,SAASX,GAAI,MAA2B,KAApBO,EAAKJ,QAAQH,KAC5DY,EAAUL,EAAKI,OAAO,SAASX,GAAI,MAAkC,KAA3BlC,EAAMO,MAAM8B,QAAQH,IAMlE,KAHAO,EAAOzC,EAAMO,MAAMmC,QAGdR,EAAI,EAAGA,EAAIY,EAAQ3B,OAAQe,IAC9BnB,EAAOK,UAAU,SAAU0B,EAAQZ,GAOrC,KAHAnB,EAAOK,UAAU,WAGZc,EAAI,EAAGA,EAAIU,EAAMzB,OAAQe,IAC5BnB,EAAOK,UAAU,MAAOwB,EAAMV,MAE/B","file":"bootstrap-tagsinput-angular.min.js"}
@@ -0,0 +1,682 @@
1
+ /*
2
+ * bootstrap-tagsinput v0.8.0
3
+ *
4
+ */
5
+
6
+ (function ($) {
7
+ "use strict";
8
+
9
+ var defaultOptions = {
10
+ tagClass: function(item) {
11
+ return 'label label-info';
12
+ },
13
+ focusClass: 'focus',
14
+ itemValue: function(item) {
15
+ return item ? item.toString() : item;
16
+ },
17
+ itemText: function(item) {
18
+ return this.itemValue(item);
19
+ },
20
+ itemTitle: function(item) {
21
+ return null;
22
+ },
23
+ freeInput: true,
24
+ addOnBlur: true,
25
+ maxTags: undefined,
26
+ maxChars: undefined,
27
+ confirmKeys: [13, 44],
28
+ delimiter: ',',
29
+ delimiterRegex: null,
30
+ cancelConfirmKeysOnEmpty: false,
31
+ onTagExists: function(item, $tag) {
32
+ $tag.hide().fadeIn();
33
+ },
34
+ trimValue: false,
35
+ allowDuplicates: false,
36
+ triggerChange: true
37
+ };
38
+
39
+ /**
40
+ * Constructor function
41
+ */
42
+ function TagsInput(element, options) {
43
+ this.isInit = true;
44
+ this.itemsArray = [];
45
+
46
+ this.$element = $(element);
47
+ this.$element.hide();
48
+
49
+ this.isSelect = (element.tagName === 'SELECT');
50
+ this.multiple = (this.isSelect && element.hasAttribute('multiple'));
51
+ this.objectItems = options && options.itemValue;
52
+ this.placeholderText = element.hasAttribute('placeholder') ? this.$element.attr('placeholder') : '';
53
+ this.inputSize = Math.max(1, this.placeholderText.length);
54
+
55
+ this.$container = $('<div class="bootstrap-tagsinput"></div>');
56
+ this.$input = $('<input type="text" placeholder="' + this.placeholderText + '"/>').appendTo(this.$container);
57
+
58
+ this.$element.before(this.$container);
59
+
60
+ this.build(options);
61
+ this.isInit = false;
62
+ }
63
+
64
+ TagsInput.prototype = {
65
+ constructor: TagsInput,
66
+
67
+ /**
68
+ * Adds the given item as a new tag. Pass true to dontPushVal to prevent
69
+ * updating the elements val()
70
+ */
71
+ add: function(item, dontPushVal, options) {
72
+ var self = this;
73
+
74
+ if (self.options.maxTags && self.itemsArray.length >= self.options.maxTags)
75
+ return;
76
+
77
+ // Ignore falsey values, except false
78
+ if (item !== false && !item)
79
+ return;
80
+
81
+ // Trim value
82
+ if (typeof item === "string" && self.options.trimValue) {
83
+ item = $.trim(item);
84
+ }
85
+
86
+ // Throw an error when trying to add an object while the itemValue option was not set
87
+ if (typeof item === "object" && !self.objectItems)
88
+ throw("Can't add objects when itemValue option is not set");
89
+
90
+ // Ignore strings only containg whitespace
91
+ if (item.toString().match(/^\s*$/))
92
+ return;
93
+
94
+ // If SELECT but not multiple, remove current tag
95
+ if (self.isSelect && !self.multiple && self.itemsArray.length > 0)
96
+ self.remove(self.itemsArray[0]);
97
+
98
+ if (typeof item === "string" && this.$element[0].tagName === 'INPUT') {
99
+ var delimiter = (self.options.delimiterRegex) ? self.options.delimiterRegex : self.options.delimiter;
100
+ var items = item.split(delimiter);
101
+ if (items.length > 1) {
102
+ for (var i = 0; i < items.length; i++) {
103
+ this.add(items[i], true);
104
+ }
105
+
106
+ if (!dontPushVal)
107
+ self.pushVal(self.options.triggerChange);
108
+ return;
109
+ }
110
+ }
111
+
112
+ var itemValue = self.options.itemValue(item),
113
+ itemText = self.options.itemText(item),
114
+ tagClass = self.options.tagClass(item),
115
+ itemTitle = self.options.itemTitle(item);
116
+
117
+ // Ignore items allready added
118
+ var existing = $.grep(self.itemsArray, function(item) { return self.options.itemValue(item) === itemValue; } )[0];
119
+ if (existing && !self.options.allowDuplicates) {
120
+ // Invoke onTagExists
121
+ if (self.options.onTagExists) {
122
+ var $existingTag = $(".tag", self.$container).filter(function() { return $(this).data("item") === existing; });
123
+ self.options.onTagExists(item, $existingTag);
124
+ }
125
+ return;
126
+ }
127
+
128
+ // if length greater than limit
129
+ if (self.items().toString().length + item.length + 1 > self.options.maxInputLength)
130
+ return;
131
+
132
+ // raise beforeItemAdd arg
133
+ var beforeItemAddEvent = $.Event('beforeItemAdd', { item: item, cancel: false, options: options});
134
+ self.$element.trigger(beforeItemAddEvent);
135
+ if (beforeItemAddEvent.cancel)
136
+ return;
137
+
138
+ // register item in internal array and map
139
+ self.itemsArray.push(item);
140
+
141
+ // add a tag element
142
+
143
+ var $tag = $('<span class="tag ' + htmlEncode(tagClass) + (itemTitle !== null ? ('" title="' + itemTitle) : '') + '">' + htmlEncode(itemText) + '<span data-role="remove"></span></span>');
144
+ $tag.data('item', item);
145
+ self.findInputWrapper().before($tag);
146
+ $tag.after(' ');
147
+
148
+ // Check to see if the tag exists in its raw or uri-encoded form
149
+ var optionExists = (
150
+ $('option[value="' + encodeURIComponent(itemValue) + '"]', self.$element).length ||
151
+ $('option[value="' + htmlEncode(itemValue) + '"]', self.$element).length
152
+ );
153
+
154
+ // add <option /> if item represents a value not present in one of the <select />'s options
155
+ if (self.isSelect && !optionExists) {
156
+ var $option = $('<option selected>' + htmlEncode(itemText) + '</option>');
157
+ $option.data('item', item);
158
+ $option.attr('value', itemValue);
159
+ self.$element.append($option);
160
+ }
161
+
162
+ if (!dontPushVal)
163
+ self.pushVal(self.options.triggerChange);
164
+
165
+ // Add class when reached maxTags
166
+ if (self.options.maxTags === self.itemsArray.length || self.items().toString().length === self.options.maxInputLength)
167
+ self.$container.addClass('bootstrap-tagsinput-max');
168
+
169
+ // If using typeahead, once the tag has been added, clear the typeahead value so it does not stick around in the input.
170
+ if ($('.typeahead, .twitter-typeahead', self.$container).length) {
171
+ self.$input.typeahead('val', '');
172
+ }
173
+
174
+ if (this.isInit) {
175
+ self.$element.trigger($.Event('itemAddedOnInit', { item: item, options: options }));
176
+ } else {
177
+ self.$element.trigger($.Event('itemAdded', { item: item, options: options }));
178
+ }
179
+ },
180
+
181
+ /**
182
+ * Removes the given item. Pass true to dontPushVal to prevent updating the
183
+ * elements val()
184
+ */
185
+ remove: function(item, dontPushVal, options) {
186
+ var self = this;
187
+
188
+ if (self.objectItems) {
189
+ if (typeof item === "object")
190
+ item = $.grep(self.itemsArray, function(other) { return self.options.itemValue(other) == self.options.itemValue(item); } );
191
+ else
192
+ item = $.grep(self.itemsArray, function(other) { return self.options.itemValue(other) == item; } );
193
+
194
+ item = item[item.length-1];
195
+ }
196
+
197
+ if (item) {
198
+ var beforeItemRemoveEvent = $.Event('beforeItemRemove', { item: item, cancel: false, options: options });
199
+ self.$element.trigger(beforeItemRemoveEvent);
200
+ if (beforeItemRemoveEvent.cancel)
201
+ return;
202
+
203
+ $('.tag', self.$container).filter(function() { return $(this).data('item') === item; }).remove();
204
+ $('option', self.$element).filter(function() { return $(this).data('item') === item; }).remove();
205
+ if($.inArray(item, self.itemsArray) !== -1)
206
+ self.itemsArray.splice($.inArray(item, self.itemsArray), 1);
207
+ }
208
+
209
+ if (!dontPushVal)
210
+ self.pushVal(self.options.triggerChange);
211
+
212
+ // Remove class when reached maxTags
213
+ if (self.options.maxTags > self.itemsArray.length)
214
+ self.$container.removeClass('bootstrap-tagsinput-max');
215
+
216
+ self.$element.trigger($.Event('itemRemoved', { item: item, options: options }));
217
+ },
218
+
219
+ /**
220
+ * Removes all items
221
+ */
222
+ removeAll: function() {
223
+ var self = this;
224
+
225
+ $('.tag', self.$container).remove();
226
+ $('option', self.$element).remove();
227
+
228
+ while(self.itemsArray.length > 0)
229
+ self.itemsArray.pop();
230
+
231
+ self.pushVal(self.options.triggerChange);
232
+ },
233
+
234
+ /**
235
+ * Refreshes the tags so they match the text/value of their corresponding
236
+ * item.
237
+ */
238
+ refresh: function() {
239
+ var self = this;
240
+ $('.tag', self.$container).each(function() {
241
+ var $tag = $(this),
242
+ item = $tag.data('item'),
243
+ itemValue = self.options.itemValue(item),
244
+ itemText = self.options.itemText(item),
245
+ tagClass = self.options.tagClass(item);
246
+
247
+ // Update tag's class and inner text
248
+ $tag.attr('class', null);
249
+ $tag.addClass('tag ' + htmlEncode(tagClass));
250
+ $tag.contents().filter(function() {
251
+ return this.nodeType == 3;
252
+ })[0].nodeValue = htmlEncode(itemText);
253
+
254
+ if (self.isSelect) {
255
+ var option = $('option', self.$element).filter(function() { return $(this).data('item') === item; });
256
+ option.attr('value', itemValue);
257
+ }
258
+ });
259
+ },
260
+
261
+ /**
262
+ * Returns the items added as tags
263
+ */
264
+ items: function() {
265
+ return this.itemsArray;
266
+ },
267
+
268
+ /**
269
+ * Assembly value by retrieving the value of each item, and set it on the
270
+ * element.
271
+ */
272
+ pushVal: function() {
273
+ var self = this,
274
+ val = $.map(self.items(), function(item) {
275
+ return self.options.itemValue(item).toString();
276
+ });
277
+
278
+ self.$element.val(val, true);
279
+
280
+ if (self.options.triggerChange)
281
+ self.$element.trigger('change');
282
+ },
283
+
284
+ /**
285
+ * Initializes the tags input behaviour on the element
286
+ */
287
+ build: function(options) {
288
+ var self = this;
289
+
290
+ self.options = $.extend({}, defaultOptions, options);
291
+ // When itemValue is set, freeInput should always be false
292
+ if (self.objectItems)
293
+ self.options.freeInput = false;
294
+
295
+ makeOptionItemFunction(self.options, 'itemValue');
296
+ makeOptionItemFunction(self.options, 'itemText');
297
+ makeOptionFunction(self.options, 'tagClass');
298
+
299
+ // Typeahead Bootstrap version 2.3.2
300
+ if (self.options.typeahead) {
301
+ var typeahead = self.options.typeahead || {};
302
+
303
+ makeOptionFunction(typeahead, 'source');
304
+
305
+ self.$input.typeahead($.extend({}, typeahead, {
306
+ source: function (query, process) {
307
+ function processItems(items) {
308
+ var texts = [];
309
+
310
+ for (var i = 0; i < items.length; i++) {
311
+ var text = self.options.itemText(items[i]);
312
+ map[text] = items[i];
313
+ texts.push(text);
314
+ }
315
+ process(texts);
316
+ }
317
+
318
+ this.map = {};
319
+ var map = this.map,
320
+ data = typeahead.source(query);
321
+
322
+ if ($.isFunction(data.success)) {
323
+ // support for Angular callbacks
324
+ data.success(processItems);
325
+ } else if ($.isFunction(data.then)) {
326
+ // support for Angular promises
327
+ data.then(processItems);
328
+ } else {
329
+ // support for functions and jquery promises
330
+ $.when(data)
331
+ .then(processItems);
332
+ }
333
+ },
334
+ updater: function (text) {
335
+ self.add(this.map[text]);
336
+ return this.map[text];
337
+ },
338
+ matcher: function (text) {
339
+ return (text.toLowerCase().indexOf(this.query.trim().toLowerCase()) !== -1);
340
+ },
341
+ sorter: function (texts) {
342
+ return texts.sort();
343
+ },
344
+ highlighter: function (text) {
345
+ var regex = new RegExp( '(' + this.query + ')', 'gi' );
346
+ return text.replace( regex, "<strong>$1</strong>" );
347
+ }
348
+ }));
349
+ }
350
+
351
+ // typeahead.js
352
+ if (self.options.typeaheadjs) {
353
+ var typeaheadConfig = null;
354
+ var typeaheadDatasets = {};
355
+
356
+ // Determine if main configurations were passed or simply a dataset
357
+ var typeaheadjs = self.options.typeaheadjs;
358
+ if ($.isArray(typeaheadjs)) {
359
+ typeaheadConfig = typeaheadjs[0];
360
+ typeaheadDatasets = typeaheadjs[1];
361
+ } else {
362
+ typeaheadDatasets = typeaheadjs;
363
+ }
364
+
365
+ self.$input.typeahead(typeaheadConfig, typeaheadDatasets).on('typeahead:selected', $.proxy(function (obj, datum) {
366
+ if (typeaheadDatasets.valueKey)
367
+ self.add(datum[typeaheadDatasets.valueKey]);
368
+ else
369
+ self.add(datum);
370
+ self.$input.typeahead('val', '');
371
+ }, self));
372
+ }
373
+
374
+ self.$container.on('click', $.proxy(function(event) {
375
+ if (! self.$element.attr('disabled')) {
376
+ self.$input.removeAttr('disabled');
377
+ }
378
+ self.$input.focus();
379
+ }, self));
380
+
381
+ if (self.options.addOnBlur && self.options.freeInput) {
382
+ self.$input.on('focusout', $.proxy(function(event) {
383
+ // HACK: only process on focusout when no typeahead opened, to
384
+ // avoid adding the typeahead text as tag
385
+ if ($('.typeahead, .twitter-typeahead', self.$container).length === 0) {
386
+ self.add(self.$input.val());
387
+ self.$input.val('');
388
+ }
389
+ }, self));
390
+ }
391
+
392
+ // Toggle the 'focus' css class on the container when it has focus
393
+ self.$container.on({
394
+ focusin: function() {
395
+ self.$container.addClass(self.options.focusClass);
396
+ },
397
+ focusout: function() {
398
+ self.$container.removeClass(self.options.focusClass);
399
+ },
400
+ });
401
+
402
+ self.$container.on('keydown', 'input', $.proxy(function(event) {
403
+ var $input = $(event.target),
404
+ $inputWrapper = self.findInputWrapper();
405
+
406
+ if (self.$element.attr('disabled')) {
407
+ self.$input.attr('disabled', 'disabled');
408
+ return;
409
+ }
410
+
411
+ switch (event.which) {
412
+ // BACKSPACE
413
+ case 8:
414
+ if (doGetCaretPosition($input[0]) === 0) {
415
+ var prev = $inputWrapper.prev();
416
+ if (prev.length) {
417
+ self.remove(prev.data('item'));
418
+ }
419
+ }
420
+ break;
421
+
422
+ // DELETE
423
+ case 46:
424
+ if (doGetCaretPosition($input[0]) === 0) {
425
+ var next = $inputWrapper.next();
426
+ if (next.length) {
427
+ self.remove(next.data('item'));
428
+ }
429
+ }
430
+ break;
431
+
432
+ // LEFT ARROW
433
+ case 37:
434
+ // Try to move the input before the previous tag
435
+ var $prevTag = $inputWrapper.prev();
436
+ if ($input.val().length === 0 && $prevTag[0]) {
437
+ $prevTag.before($inputWrapper);
438
+ $input.focus();
439
+ }
440
+ break;
441
+ // RIGHT ARROW
442
+ case 39:
443
+ // Try to move the input after the next tag
444
+ var $nextTag = $inputWrapper.next();
445
+ if ($input.val().length === 0 && $nextTag[0]) {
446
+ $nextTag.after($inputWrapper);
447
+ $input.focus();
448
+ }
449
+ break;
450
+ default:
451
+ // ignore
452
+ }
453
+
454
+ // Reset internal input's size
455
+ var textLength = $input.val().length,
456
+ wordSpace = Math.ceil(textLength / 5),
457
+ size = textLength + wordSpace + 1;
458
+ $input.attr('size', Math.max(this.inputSize, $input.val().length));
459
+ }, self));
460
+
461
+ self.$container.on('keypress', 'input', $.proxy(function(event) {
462
+ var $input = $(event.target);
463
+
464
+ if (self.$element.attr('disabled')) {
465
+ self.$input.attr('disabled', 'disabled');
466
+ return;
467
+ }
468
+
469
+ var text = $input.val(),
470
+ maxLengthReached = self.options.maxChars && text.length >= self.options.maxChars;
471
+ if (self.options.freeInput && (keyCombinationInList(event, self.options.confirmKeys) || maxLengthReached)) {
472
+ // Only attempt to add a tag if there is data in the field
473
+ if (text.length !== 0) {
474
+ self.add(maxLengthReached ? text.substr(0, self.options.maxChars) : text);
475
+ $input.val('');
476
+ }
477
+
478
+ // If the field is empty, let the event triggered fire as usual
479
+ if (self.options.cancelConfirmKeysOnEmpty === false) {
480
+ event.preventDefault();
481
+ }
482
+ }
483
+
484
+ // Reset internal input's size
485
+ var textLength = $input.val().length,
486
+ wordSpace = Math.ceil(textLength / 5),
487
+ size = textLength + wordSpace + 1;
488
+ $input.attr('size', Math.max(this.inputSize, $input.val().length));
489
+ }, self));
490
+
491
+ // Remove icon clicked
492
+ self.$container.on('click', '[data-role=remove]', $.proxy(function(event) {
493
+ if (self.$element.attr('disabled')) {
494
+ return;
495
+ }
496
+ self.remove($(event.target).closest('.tag').data('item'));
497
+ }, self));
498
+
499
+ // Only add existing value as tags when using strings as tags
500
+ if (self.options.itemValue === defaultOptions.itemValue) {
501
+ if (self.$element[0].tagName === 'INPUT') {
502
+ self.add(self.$element.val());
503
+ } else {
504
+ $('option', self.$element).each(function() {
505
+ self.add($(this).attr('value'), true);
506
+ });
507
+ }
508
+ }
509
+ },
510
+
511
+ /**
512
+ * Removes all tagsinput behaviour and unregsiter all event handlers
513
+ */
514
+ destroy: function() {
515
+ var self = this;
516
+
517
+ // Unbind events
518
+ self.$container.off('keypress', 'input');
519
+ self.$container.off('click', '[role=remove]');
520
+
521
+ self.$container.remove();
522
+ self.$element.removeData('tagsinput');
523
+ self.$element.show();
524
+ },
525
+
526
+ /**
527
+ * Sets focus on the tagsinput
528
+ */
529
+ focus: function() {
530
+ this.$input.focus();
531
+ },
532
+
533
+ /**
534
+ * Returns the internal input element
535
+ */
536
+ input: function() {
537
+ return this.$input;
538
+ },
539
+
540
+ /**
541
+ * Returns the element which is wrapped around the internal input. This
542
+ * is normally the $container, but typeahead.js moves the $input element.
543
+ */
544
+ findInputWrapper: function() {
545
+ var elt = this.$input[0],
546
+ container = this.$container[0];
547
+ while(elt && elt.parentNode !== container)
548
+ elt = elt.parentNode;
549
+
550
+ return $(elt);
551
+ }
552
+ };
553
+
554
+ /**
555
+ * Register JQuery plugin
556
+ */
557
+ $.fn.tagsinput = function(arg1, arg2, arg3) {
558
+ var results = [];
559
+
560
+ this.each(function() {
561
+ var tagsinput = $(this).data('tagsinput');
562
+ // Initialize a new tags input
563
+ if (!tagsinput) {
564
+ tagsinput = new TagsInput(this, arg1);
565
+ $(this).data('tagsinput', tagsinput);
566
+ results.push(tagsinput);
567
+
568
+ if (this.tagName === 'SELECT') {
569
+ $('option', $(this)).attr('selected', 'selected');
570
+ }
571
+
572
+ // Init tags from $(this).val()
573
+ $(this).val($(this).val());
574
+ } else if (!arg1 && !arg2) {
575
+ // tagsinput already exists
576
+ // no function, trying to init
577
+ results.push(tagsinput);
578
+ } else if(tagsinput[arg1] !== undefined) {
579
+ // Invoke function on existing tags input
580
+ if(tagsinput[arg1].length === 3 && arg3 !== undefined){
581
+ var retVal = tagsinput[arg1](arg2, null, arg3);
582
+ }else{
583
+ var retVal = tagsinput[arg1](arg2);
584
+ }
585
+ if (retVal !== undefined)
586
+ results.push(retVal);
587
+ }
588
+ });
589
+
590
+ if ( typeof arg1 == 'string') {
591
+ // Return the results from the invoked function calls
592
+ return results.length > 1 ? results : results[0];
593
+ } else {
594
+ return results;
595
+ }
596
+ };
597
+
598
+ $.fn.tagsinput.Constructor = TagsInput;
599
+
600
+ /**
601
+ * Most options support both a string or number as well as a function as
602
+ * option value. This function makes sure that the option with the given
603
+ * key in the given options is wrapped in a function
604
+ */
605
+ function makeOptionItemFunction(options, key) {
606
+ if (typeof options[key] !== 'function') {
607
+ var propertyName = options[key];
608
+ options[key] = function(item) { return item[propertyName]; };
609
+ }
610
+ }
611
+ function makeOptionFunction(options, key) {
612
+ if (typeof options[key] !== 'function') {
613
+ var value = options[key];
614
+ options[key] = function() { return value; };
615
+ }
616
+ }
617
+ /**
618
+ * HtmlEncodes the given value
619
+ */
620
+ var htmlEncodeContainer = $('<div />');
621
+ function htmlEncode(value) {
622
+ if (value) {
623
+ return htmlEncodeContainer.text(value).html();
624
+ } else {
625
+ return '';
626
+ }
627
+ }
628
+
629
+ /**
630
+ * Returns the position of the caret in the given input field
631
+ * http://flightschool.acylt.com/devnotes/caret-position-woes/
632
+ */
633
+ function doGetCaretPosition(oField) {
634
+ var iCaretPos = 0;
635
+ if (document.selection) {
636
+ oField.focus ();
637
+ var oSel = document.selection.createRange();
638
+ oSel.moveStart ('character', -oField.value.length);
639
+ iCaretPos = oSel.text.length;
640
+ } else if (oField.selectionStart || oField.selectionStart == '0') {
641
+ iCaretPos = oField.selectionStart;
642
+ }
643
+ return (iCaretPos);
644
+ }
645
+
646
+ /**
647
+ * Returns boolean indicates whether user has pressed an expected key combination.
648
+ * @param object keyPressEvent: JavaScript event object, refer
649
+ * http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
650
+ * @param object lookupList: expected key combinations, as in:
651
+ * [13, {which: 188, shiftKey: true}]
652
+ */
653
+ function keyCombinationInList(keyPressEvent, lookupList) {
654
+ var found = false;
655
+ $.each(lookupList, function (index, keyCombination) {
656
+ if (typeof (keyCombination) === 'number' && keyPressEvent.which === keyCombination) {
657
+ found = true;
658
+ return false;
659
+ }
660
+
661
+ if (keyPressEvent.which === keyCombination.which) {
662
+ var alt = !keyCombination.hasOwnProperty('altKey') || keyPressEvent.altKey === keyCombination.altKey,
663
+ shift = !keyCombination.hasOwnProperty('shiftKey') || keyPressEvent.shiftKey === keyCombination.shiftKey,
664
+ ctrl = !keyCombination.hasOwnProperty('ctrlKey') || keyPressEvent.ctrlKey === keyCombination.ctrlKey;
665
+ if (alt && shift && ctrl) {
666
+ found = true;
667
+ return false;
668
+ }
669
+ }
670
+ });
671
+
672
+ return found;
673
+ }
674
+
675
+ /**
676
+ * Initialize tagsinput behaviour on inputs and selects which have
677
+ * data-role=tagsinput
678
+ */
679
+ $(function() {
680
+ $("input[data-role=tagsinput], select[multiple][data-role=tagsinput]").tagsinput();
681
+ });
682
+ })(window.jQuery);
@@ -0,0 +1,7 @@
1
+ /*
2
+ * bootstrap-tagsinput v0.8.0
3
+ *
4
+ */
5
+
6
+ !function(a){"use strict";function b(b,c){this.isInit=!0,this.itemsArray=[],this.$element=a(b),this.$element.hide(),this.isSelect="SELECT"===b.tagName,this.multiple=this.isSelect&&b.hasAttribute("multiple"),this.objectItems=c&&c.itemValue,this.placeholderText=b.hasAttribute("placeholder")?this.$element.attr("placeholder"):"",this.inputSize=Math.max(1,this.placeholderText.length),this.$container=a('<div class="bootstrap-tagsinput"></div>'),this.$input=a('<input type="text" placeholder="'+this.placeholderText+'"/>').appendTo(this.$container),this.$element.before(this.$container),this.build(c),this.isInit=!1}function c(a,b){if("function"!=typeof a[b]){var c=a[b];a[b]=function(a){return a[c]}}}function d(a,b){if("function"!=typeof a[b]){var c=a[b];a[b]=function(){return c}}}function e(a){return a?i.text(a).html():""}function f(a){var b=0;if(document.selection){a.focus();var c=document.selection.createRange();c.moveStart("character",-a.value.length),b=c.text.length}else(a.selectionStart||"0"==a.selectionStart)&&(b=a.selectionStart);return b}function g(b,c){var d=!1;return a.each(c,function(a,c){if("number"==typeof c&&b.which===c)return d=!0,!1;if(b.which===c.which){var e=!c.hasOwnProperty("altKey")||b.altKey===c.altKey,f=!c.hasOwnProperty("shiftKey")||b.shiftKey===c.shiftKey,g=!c.hasOwnProperty("ctrlKey")||b.ctrlKey===c.ctrlKey;if(e&&f&&g)return d=!0,!1}}),d}var h={tagClass:function(a){return"label label-info"},focusClass:"focus",itemValue:function(a){return a?a.toString():a},itemText:function(a){return this.itemValue(a)},itemTitle:function(a){return null},freeInput:!0,addOnBlur:!0,maxTags:void 0,maxChars:void 0,confirmKeys:[13,44],delimiter:",",delimiterRegex:null,cancelConfirmKeysOnEmpty:!1,onTagExists:function(a,b){b.hide().fadeIn()},trimValue:!1,allowDuplicates:!1,triggerChange:!0};b.prototype={constructor:b,add:function(b,c,d){var f=this;if(!(f.options.maxTags&&f.itemsArray.length>=f.options.maxTags)&&(b===!1||b)){if("string"==typeof b&&f.options.trimValue&&(b=a.trim(b)),"object"==typeof b&&!f.objectItems)throw"Can't add objects when itemValue option is not set";if(!b.toString().match(/^\s*$/)){if(f.isSelect&&!f.multiple&&f.itemsArray.length>0&&f.remove(f.itemsArray[0]),"string"==typeof b&&"INPUT"===this.$element[0].tagName){var g=f.options.delimiterRegex?f.options.delimiterRegex:f.options.delimiter,h=b.split(g);if(h.length>1){for(var i=0;i<h.length;i++)this.add(h[i],!0);return void(c||f.pushVal(f.options.triggerChange))}}var j=f.options.itemValue(b),k=f.options.itemText(b),l=f.options.tagClass(b),m=f.options.itemTitle(b),n=a.grep(f.itemsArray,function(a){return f.options.itemValue(a)===j})[0];if(!n||f.options.allowDuplicates){if(!(f.items().toString().length+b.length+1>f.options.maxInputLength)){var o=a.Event("beforeItemAdd",{item:b,cancel:!1,options:d});if(f.$element.trigger(o),!o.cancel){f.itemsArray.push(b);var p=a('<span class="tag '+e(l)+(null!==m?'" title="'+m:"")+'">'+e(k)+'<span data-role="remove"></span></span>');p.data("item",b),f.findInputWrapper().before(p),p.after(" ");var q=a('option[value="'+encodeURIComponent(j)+'"]',f.$element).length||a('option[value="'+e(j)+'"]',f.$element).length;if(f.isSelect&&!q){var r=a("<option selected>"+e(k)+"</option>");r.data("item",b),r.attr("value",j),f.$element.append(r)}c||f.pushVal(f.options.triggerChange),(f.options.maxTags===f.itemsArray.length||f.items().toString().length===f.options.maxInputLength)&&f.$container.addClass("bootstrap-tagsinput-max"),a(".typeahead, .twitter-typeahead",f.$container).length&&f.$input.typeahead("val",""),this.isInit?f.$element.trigger(a.Event("itemAddedOnInit",{item:b,options:d})):f.$element.trigger(a.Event("itemAdded",{item:b,options:d}))}}}else if(f.options.onTagExists){var s=a(".tag",f.$container).filter(function(){return a(this).data("item")===n});f.options.onTagExists(b,s)}}}},remove:function(b,c,d){var e=this;if(e.objectItems&&(b="object"==typeof b?a.grep(e.itemsArray,function(a){return e.options.itemValue(a)==e.options.itemValue(b)}):a.grep(e.itemsArray,function(a){return e.options.itemValue(a)==b}),b=b[b.length-1]),b){var f=a.Event("beforeItemRemove",{item:b,cancel:!1,options:d});if(e.$element.trigger(f),f.cancel)return;a(".tag",e.$container).filter(function(){return a(this).data("item")===b}).remove(),a("option",e.$element).filter(function(){return a(this).data("item")===b}).remove(),-1!==a.inArray(b,e.itemsArray)&&e.itemsArray.splice(a.inArray(b,e.itemsArray),1)}c||e.pushVal(e.options.triggerChange),e.options.maxTags>e.itemsArray.length&&e.$container.removeClass("bootstrap-tagsinput-max"),e.$element.trigger(a.Event("itemRemoved",{item:b,options:d}))},removeAll:function(){var b=this;for(a(".tag",b.$container).remove(),a("option",b.$element).remove();b.itemsArray.length>0;)b.itemsArray.pop();b.pushVal(b.options.triggerChange)},refresh:function(){var b=this;a(".tag",b.$container).each(function(){var c=a(this),d=c.data("item"),f=b.options.itemValue(d),g=b.options.itemText(d),h=b.options.tagClass(d);if(c.attr("class",null),c.addClass("tag "+e(h)),c.contents().filter(function(){return 3==this.nodeType})[0].nodeValue=e(g),b.isSelect){var i=a("option",b.$element).filter(function(){return a(this).data("item")===d});i.attr("value",f)}})},items:function(){return this.itemsArray},pushVal:function(){var b=this,c=a.map(b.items(),function(a){return b.options.itemValue(a).toString()});b.$element.val(c,!0),b.options.triggerChange&&b.$element.trigger("change")},build:function(b){var e=this;if(e.options=a.extend({},h,b),e.objectItems&&(e.options.freeInput=!1),c(e.options,"itemValue"),c(e.options,"itemText"),d(e.options,"tagClass"),e.options.typeahead){var i=e.options.typeahead||{};d(i,"source"),e.$input.typeahead(a.extend({},i,{source:function(b,c){function d(a){for(var b=[],d=0;d<a.length;d++){var g=e.options.itemText(a[d]);f[g]=a[d],b.push(g)}c(b)}this.map={};var f=this.map,g=i.source(b);a.isFunction(g.success)?g.success(d):a.isFunction(g.then)?g.then(d):a.when(g).then(d)},updater:function(a){return e.add(this.map[a]),this.map[a]},matcher:function(a){return-1!==a.toLowerCase().indexOf(this.query.trim().toLowerCase())},sorter:function(a){return a.sort()},highlighter:function(a){var b=new RegExp("("+this.query+")","gi");return a.replace(b,"<strong>$1</strong>")}}))}if(e.options.typeaheadjs){var j=null,k={},l=e.options.typeaheadjs;a.isArray(l)?(j=l[0],k=l[1]):k=l,e.$input.typeahead(j,k).on("typeahead:selected",a.proxy(function(a,b){k.valueKey?e.add(b[k.valueKey]):e.add(b),e.$input.typeahead("val","")},e))}e.$container.on("click",a.proxy(function(a){e.$element.attr("disabled")||e.$input.removeAttr("disabled"),e.$input.focus()},e)),e.options.addOnBlur&&e.options.freeInput&&e.$input.on("focusout",a.proxy(function(b){0===a(".typeahead, .twitter-typeahead",e.$container).length&&(e.add(e.$input.val()),e.$input.val(""))},e)),e.$container.on({focusin:function(){e.$container.addClass(e.options.focusClass)},focusout:function(){e.$container.removeClass(e.options.focusClass)}}),e.$container.on("keydown","input",a.proxy(function(b){var c=a(b.target),d=e.findInputWrapper();if(e.$element.attr("disabled"))return void e.$input.attr("disabled","disabled");switch(b.which){case 8:if(0===f(c[0])){var g=d.prev();g.length&&e.remove(g.data("item"))}break;case 46:if(0===f(c[0])){var h=d.next();h.length&&e.remove(h.data("item"))}break;case 37:var i=d.prev();0===c.val().length&&i[0]&&(i.before(d),c.focus());break;case 39:var j=d.next();0===c.val().length&&j[0]&&(j.after(d),c.focus())}var k=c.val().length;Math.ceil(k/5);c.attr("size",Math.max(this.inputSize,c.val().length))},e)),e.$container.on("keypress","input",a.proxy(function(b){var c=a(b.target);if(e.$element.attr("disabled"))return void e.$input.attr("disabled","disabled");var d=c.val(),f=e.options.maxChars&&d.length>=e.options.maxChars;e.options.freeInput&&(g(b,e.options.confirmKeys)||f)&&(0!==d.length&&(e.add(f?d.substr(0,e.options.maxChars):d),c.val("")),e.options.cancelConfirmKeysOnEmpty===!1&&b.preventDefault());var h=c.val().length;Math.ceil(h/5);c.attr("size",Math.max(this.inputSize,c.val().length))},e)),e.$container.on("click","[data-role=remove]",a.proxy(function(b){e.$element.attr("disabled")||e.remove(a(b.target).closest(".tag").data("item"))},e)),e.options.itemValue===h.itemValue&&("INPUT"===e.$element[0].tagName?e.add(e.$element.val()):a("option",e.$element).each(function(){e.add(a(this).attr("value"),!0)}))},destroy:function(){var a=this;a.$container.off("keypress","input"),a.$container.off("click","[role=remove]"),a.$container.remove(),a.$element.removeData("tagsinput"),a.$element.show()},focus:function(){this.$input.focus()},input:function(){return this.$input},findInputWrapper:function(){for(var b=this.$input[0],c=this.$container[0];b&&b.parentNode!==c;)b=b.parentNode;return a(b)}},a.fn.tagsinput=function(c,d,e){var f=[];return this.each(function(){var g=a(this).data("tagsinput");if(g)if(c||d){if(void 0!==g[c]){if(3===g[c].length&&void 0!==e)var h=g[c](d,null,e);else var h=g[c](d);void 0!==h&&f.push(h)}}else f.push(g);else g=new b(this,c),a(this).data("tagsinput",g),f.push(g),"SELECT"===this.tagName&&a("option",a(this)).attr("selected","selected"),a(this).val(a(this).val())}),"string"==typeof c?f.length>1?f:f[0]:f},a.fn.tagsinput.Constructor=b;var i=a("<div />");a(function(){a("input[data-role=tagsinput], select[multiple][data-role=tagsinput]").tagsinput()})}(window.jQuery);
7
+ //# sourceMappingURL=bootstrap-tagsinput.min.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bootstrap-tagsinput.js"],"names":["$","TagsInput","element","options","this","isInit","itemsArray","$element","hide","isSelect","tagName","multiple","hasAttribute","objectItems","itemValue","placeholderText","attr","inputSize","Math","max","length","$container","$input","appendTo","before","build","makeOptionItemFunction","key","propertyName","item","makeOptionFunction","value","htmlEncode","htmlEncodeContainer","text","html","doGetCaretPosition","oField","iCaretPos","document","selection","focus","oSel","createRange","moveStart","selectionStart","keyCombinationInList","keyPressEvent","lookupList","found","each","index","keyCombination","which","alt","hasOwnProperty","altKey","shift","shiftKey","ctrl","ctrlKey","defaultOptions","tagClass","focusClass","toString","itemText","itemTitle","freeInput","addOnBlur","maxTags","undefined","maxChars","confirmKeys","delimiter","delimiterRegex","cancelConfirmKeysOnEmpty","onTagExists","$tag","fadeIn","trimValue","allowDuplicates","triggerChange","prototype","constructor","add","dontPushVal","self","trim","match","remove","items","split","i","pushVal","existing","grep","maxInputLength","beforeItemAddEvent","Event","cancel","trigger","push","data","findInputWrapper","after","optionExists","encodeURIComponent","$option","append","addClass","typeahead","$existingTag","filter","other","beforeItemRemoveEvent","inArray","splice","removeClass","removeAll","pop","refresh","contents","nodeType","nodeValue","option","val","map","extend","source","query","process","processItems","texts","isFunction","success","then","when","updater","matcher","toLowerCase","indexOf","sorter","sort","highlighter","regex","RegExp","replace","typeaheadjs","typeaheadConfig","typeaheadDatasets","isArray","on","proxy","obj","datum","valueKey","event","removeAttr","focusin","focusout","target","$inputWrapper","prev","next","$prevTag","$nextTag","textLength","ceil","maxLengthReached","substr","preventDefault","closest","destroy","off","removeData","show","input","elt","container","parentNode","fn","tagsinput","arg1","arg2","arg3","results","retVal","Constructor","window","jQuery"],"mappings":"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","file":"bootstrap-tagsinput.min.js"}
@@ -0,0 +1,54 @@
1
+ /*
2
+ * bootstrap-tagsinput v0.8.0
3
+ *
4
+ */
5
+
6
+ .twitter-typeahead .tt-query,
7
+ .twitter-typeahead .tt-hint {
8
+ margin-bottom: 0;
9
+ }
10
+
11
+ .twitter-typeahead .tt-hint
12
+ {
13
+ display: none;
14
+ }
15
+
16
+ .tt-menu {
17
+ position: absolute;
18
+ top: 100%;
19
+ left: 0;
20
+ z-index: 1000;
21
+ display: none;
22
+ float: left;
23
+ min-width: 160px;
24
+ padding: 5px 0;
25
+ margin: 2px 0 0;
26
+ list-style: none;
27
+ font-size: 14px;
28
+ background-color: #ffffff;
29
+ border: 1px solid #cccccc;
30
+ border: 1px solid rgba(0, 0, 0, 0.15);
31
+ border-radius: 4px;
32
+ -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
33
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
34
+ background-clip: padding-box;
35
+ cursor: pointer;
36
+ }
37
+
38
+ .tt-suggestion {
39
+ display: block;
40
+ padding: 3px 20px;
41
+ clear: both;
42
+ font-weight: normal;
43
+ line-height: 1.428571429;
44
+ color: #333333;
45
+ white-space: nowrap;
46
+ }
47
+
48
+ .tt-suggestion:hover,
49
+ .tt-suggestion:focus {
50
+ color: #ffffff;
51
+ text-decoration: none;
52
+ outline: 0;
53
+ background-color: #428bca;
54
+ }
@@ -0,0 +1,60 @@
1
+ /*
2
+ * bootstrap-tagsinput v0.8.0
3
+ *
4
+ */
5
+
6
+ .bootstrap-tagsinput {
7
+ background-color: #fff;
8
+ border: 1px solid #ccc;
9
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
10
+ display: inline-block;
11
+ padding: 4px 6px;
12
+ color: #555;
13
+ vertical-align: middle;
14
+ border-radius: 4px;
15
+ max-width: 100%;
16
+ line-height: 22px;
17
+ cursor: text;
18
+ }
19
+ .bootstrap-tagsinput input {
20
+ border: none;
21
+ box-shadow: none;
22
+ outline: none;
23
+ background-color: transparent;
24
+ padding: 0 6px;
25
+ margin: 0;
26
+ width: auto;
27
+ max-width: inherit;
28
+ }
29
+ .bootstrap-tagsinput.form-control input::-moz-placeholder {
30
+ color: #777;
31
+ opacity: 1;
32
+ }
33
+ .bootstrap-tagsinput.form-control input:-ms-input-placeholder {
34
+ color: #777;
35
+ }
36
+ .bootstrap-tagsinput.form-control input::-webkit-input-placeholder {
37
+ color: #777;
38
+ }
39
+ .bootstrap-tagsinput input:focus {
40
+ border: none;
41
+ box-shadow: none;
42
+ }
43
+ .bootstrap-tagsinput .tag {
44
+ margin-right: 2px;
45
+ color: white;
46
+ }
47
+ .bootstrap-tagsinput .tag [data-role="remove"] {
48
+ margin-left: 8px;
49
+ cursor: pointer;
50
+ }
51
+ .bootstrap-tagsinput .tag [data-role="remove"]:after {
52
+ content: "x";
53
+ padding: 0px 2px;
54
+ }
55
+ .bootstrap-tagsinput .tag [data-role="remove"]:hover {
56
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
57
+ }
58
+ .bootstrap-tagsinput .tag [data-role="remove"]:hover:active {
59
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
60
+ }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bootstrap_tagsinput_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Le
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-03-23 00:00:00.000000000 Z
11
+ date: 2016-03-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -57,6 +57,14 @@ files:
57
57
  - bootstrap_tagsinput_rails.gemspec
58
58
  - lib/bootstrap_tagsinput_rails.rb
59
59
  - lib/bootstrap_tagsinput_rails/version.rb
60
+ - vendor/assets/javascripts/bootstrap-tagsinput-angular.js
61
+ - vendor/assets/javascripts/bootstrap-tagsinput-angular.min.js
62
+ - vendor/assets/javascripts/bootstrap-tagsinput-angular.min.js.map
63
+ - vendor/assets/javascripts/bootstrap-tagsinput.js
64
+ - vendor/assets/javascripts/bootstrap-tagsinput.min.js
65
+ - vendor/assets/javascripts/bootstrap-tagsinput.min.js.map
66
+ - vendor/assets/stylesheets/bootstrap-tagsinput-typeahead.css
67
+ - vendor/assets/stylesheets/bootstrap-tagsinput.css
60
68
  homepage: https://github.com/bootstrap-tagsinput/bootstrap-tagsinput
61
69
  licenses:
62
70
  - MIT