bootstrap_tagsinput_rails 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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