bootstrap-tagsinput-rails 0.3.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ba46d233e976dcfc103aa6f8dc6f240912699d5e
4
+ data.tar.gz: 75fd8a1769bad8e53ae62be25376ee3dcfd9b88e
5
+ SHA512:
6
+ metadata.gz: d9f9d69d7f137571b1b8fe3f4375538c1c89e5de18c4164c0614b63015d9d77c64857d579ed663506dc53098809fc00ff464426bed65ae3d7661f32e2df9acb0
7
+ data.tar.gz: 648af3bc233397d3654e6fbb235b2c2aa03b6e16f04c87934f322d51f57b942dd95fd695f7d7ad2cb085621ec5fc78a17e13bc4596b9a770639c95412f32bfa3
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Hyo Seong Choi
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,53 @@
1
+ # Bootstrap::Tagsinput::Rails
2
+
3
+ Original Git source - https://github.com/timschlechter/bootstrap-tagsinput
4
+
5
+ To gemify the assets of `bootstrap-tagsinput` jQuery plugin for Rails >= 3.1
6
+
7
+ ## Compatibility
8
+
9
+ Designed for Bootstrap 2.3.2 and 3
10
+
11
+ ## Installation
12
+
13
+ Add this line to your application's Gemfile:
14
+
15
+ gem 'bootstrap-tagsinput-rails'
16
+
17
+ And then execute:
18
+
19
+ $ bundle
20
+
21
+ Or install it yourself as:
22
+
23
+ $ gem install bootstrap-tagsinput-rails
24
+
25
+ ## Usage
26
+
27
+ in app/assets/application.js
28
+
29
+ ```
30
+ //= require bootstrap-tagsinput
31
+ ```
32
+
33
+ in app/assets/application.css
34
+
35
+ ```
36
+ *= require bootstrap-tagsinput
37
+ ```
38
+
39
+ in form view, you should add `data-role='tagsinput'` within input tag as the follows: for example, in `simple-form` view template,
40
+
41
+ ```
42
+ <%= f.input :tag_list, input_html:{data:{role:'tagsinput'}} %>
43
+ ```
44
+
45
+ That's it
46
+
47
+ ## Contributing
48
+
49
+ 1. Fork it
50
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
51
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
52
+ 4. Push to the branch (`git push origin my-new-feature`)
53
+ 5. Create new Pull Request
@@ -0,0 +1,10 @@
1
+ require "bootstrap/tagsinput/rails/version"
2
+
3
+ module Bootstrap
4
+ module Tagsinput
5
+ module Rails
6
+ class Engine < ::Rails::Engine
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,7 @@
1
+ module Bootstrap
2
+ module Tagsinput
3
+ module Rails
4
+ VERSION = "0.3.2.0"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,80 @@
1
+ angular.module('bootstrap-tagsinput', [])
2
+ .directive('bootstrapTagsinput', [function() {
3
+
4
+ function getItemProperty(scope, property) {
5
+ if (!property)
6
+ return undefined;
7
+
8
+ if (angular.isFunction(scope.$parent[property]))
9
+ return scope.$parent[property];
10
+
11
+ return function(item) {
12
+ return item[property];
13
+ };
14
+ }
15
+
16
+ return {
17
+ restrict: 'EA',
18
+ scope: {
19
+ model: '=ngModel'
20
+ },
21
+ template: '<select multiple></select>',
22
+ replace: false,
23
+ link: function(scope, element, attrs) {
24
+ $(function() {
25
+ if (!angular.isArray(scope.model))
26
+ scope.model = [];
27
+
28
+ var select = $('select', element);
29
+
30
+ select.tagsinput({
31
+ typeahead : {
32
+ source : angular.isFunction(scope.$parent[attrs.typeaheadSource]) ? scope.$parent[attrs.typeaheadSource] : null
33
+ },
34
+ itemValue: getItemProperty(scope, attrs.itemvalue),
35
+ itemText : getItemProperty(scope, attrs.itemtext),
36
+ tagClass : angular.isFunction(scope.$parent[attrs.tagclass]) ? scope.$parent[attrs.tagclass] : function(item) { return attrs.tagclass; }
37
+ });
38
+
39
+ for (var i = 0; i < scope.model.length; i++) {
40
+ select.tagsinput('add', scope.model[i]);
41
+ }
42
+
43
+ select.on('itemAdded', function(event) {
44
+ if (scope.model.indexOf(event.item) === -1)
45
+ scope.model.push(event.item);
46
+ });
47
+
48
+ select.on('itemRemoved', function(event) {
49
+ var idx = scope.model.indexOf(event.item);
50
+ if (idx !== -1)
51
+ scope.model.splice(idx, 1);
52
+ });
53
+
54
+ // create a shallow copy of model's current state, needed to determine
55
+ // diff when model changes
56
+ var prev = scope.model.slice();
57
+ scope.$watch("model", function() {
58
+ var added = scope.model.filter(function(i) {return prev.indexOf(i) === -1;}),
59
+ removed = prev.filter(function(i) {return scope.model.indexOf(i) === -1;}),
60
+ i;
61
+
62
+ prev = scope.model.slice();
63
+
64
+ // Remove tags no longer in binded model
65
+ for (i = 0; i < removed.length; i++) {
66
+ select.tagsinput('remove', removed[i]);
67
+ }
68
+
69
+ // Refresh remaining tags
70
+ select.tagsinput('refresh');
71
+
72
+ // Add new items in model as tags
73
+ for (i = 0; i < added.length; i++) {
74
+ select.tagsinput('add', added[i]);
75
+ }
76
+ }, true);
77
+ });
78
+ }
79
+ };
80
+ }]);
@@ -0,0 +1,405 @@
1
+ (function ($) {
2
+ "use strict";
3
+
4
+ var defaultOptions = {
5
+ tagClass: function(item) {
6
+ return 'label label-info';
7
+ },
8
+ itemValue: function(item) {
9
+ return item ? item.toString() : item;
10
+ },
11
+ itemText: function(item) {
12
+ return this.itemValue(item);
13
+ },
14
+ freeInput : true
15
+ };
16
+
17
+ function TagsInput(element, options) {
18
+ this.itemsArray = [];
19
+
20
+ this.$element = $(element);
21
+ this.$element.hide();
22
+
23
+ this.isSelect = (element.tagName === 'SELECT');
24
+ this.multiple = (this.isSelect && element.hasAttribute('multiple'));
25
+ this.objectItems = options && options.itemValue;
26
+
27
+ this.$container = $('<div class="bootstrap-tagsinput"></div>');
28
+ this.$input = $('<input size="1" type="text" />').appendTo(this.$container);
29
+
30
+ this.$element.after(this.$container);
31
+
32
+ this.build(options);
33
+ }
34
+
35
+ TagsInput.prototype = {
36
+ constructor: TagsInput,
37
+
38
+ add: function(item, dontPushVal) {
39
+ var self = this;
40
+
41
+ // Ignore falsey values, except false
42
+ if (item !== false && !item)
43
+ return;
44
+
45
+ // Throw an error when trying to add an object while the itemValue option was not set
46
+ if (typeof item === "object" && !self.objectItems)
47
+ throw("Can't add objects when itemValue option is not set");
48
+
49
+ // Ignore strings only containg whitespace
50
+ if (item.toString().match(/^\s*$/))
51
+ return;
52
+
53
+ // If SELECT but not multiple, remove current tag
54
+ if (self.isSelect && !self.multiple && self.itemsArray.length > 0)
55
+ self.remove(self.itemsArray[0]);
56
+
57
+ if (typeof item === "string" && this.$element[0].tagName === 'INPUT') {
58
+ var items = item.split(',');
59
+ if (items.length > 1) {
60
+ for (var i = 0; i < items.length; i++) {
61
+ this.add(items[i], true);
62
+ }
63
+
64
+ if (!dontPushVal)
65
+ self.pushVal();
66
+ return;
67
+ }
68
+ }
69
+
70
+ // Ignore items allready added
71
+ var itemValue = self.options.itemValue(item),
72
+ itemText = self.options.itemText(item),
73
+ tagClass = self.options.tagClass(item);
74
+
75
+ if ($.grep(self.itemsArray, function(item) { return self.options.itemValue(item) === itemValue; } )[0])
76
+ return;
77
+
78
+ // register item in internal array and map
79
+ self.itemsArray.push(item);
80
+
81
+ // add a tag element
82
+ var $tag = $('<span class="tag ' + htmlEncode(tagClass) + '">' + htmlEncode(itemText) + '<span data-role="remove"></span></span>');
83
+ $tag.data('item', item);
84
+ self.$input.before($tag);
85
+
86
+ // add <option /> if item represents a value not present in one of the <select />'s options
87
+ if (self.isSelect && !$('option[value="' + escape(itemValue) + '"]')[0]) {
88
+ var $option = $('<option selected>' + htmlEncode(itemText) + '</option>');
89
+ $option.data('item', item);
90
+ $option.attr('value', itemValue);
91
+ self.$element.append($option);
92
+ }
93
+
94
+ if (!dontPushVal)
95
+ self.pushVal();
96
+
97
+ self.$element.trigger($.Event('itemAdded', { item: item }));
98
+ },
99
+
100
+ remove: function(item, dontPushVal) {
101
+ var self = this;
102
+
103
+ if (self.objectItems) {
104
+ if (typeof item === "object")
105
+ item = $.grep(self.itemsArray, function(other) { return self.options.itemValue(other) == self.options.itemValue(item); } )[0];
106
+ else
107
+ item = $.grep(self.itemsArray, function(other) { return self.options.itemValue(other) == item; } )[0];
108
+ }
109
+
110
+ if (item) {
111
+ $('.tag', self.$container).filter(function() { return $(this).data('item') === item; }).remove();
112
+ $('option', self.$element).filter(function() { return $(this).data('item') === item; }).remove();
113
+ self.itemsArray.splice(self.itemsArray.indexOf(item), 1);
114
+ }
115
+
116
+ if (!dontPushVal)
117
+ self.pushVal();
118
+
119
+ self.$element.trigger($.Event('itemRemoved', { item: item }));
120
+ },
121
+
122
+ removeAll: function() {
123
+ var self = this;
124
+
125
+ $('.tag', self.$container).remove();
126
+ $('option', self.$element).remove();
127
+
128
+ while(self.itemsArray.length > 0)
129
+ self.itemsArray.pop();
130
+
131
+ self.pushVal();
132
+ },
133
+
134
+ refresh: function() {
135
+ var self = this;
136
+ $('.tag', self.$container).each(function() {
137
+ var $tag = $(this),
138
+ item = $tag.data('item'),
139
+ itemValue = self.options.itemValue(item),
140
+ itemText = self.options.itemText(item),
141
+ tagClass = self.options.tagClass(item);
142
+
143
+ // Update tag's class and inner text
144
+ $tag.attr('class', null);
145
+ $tag.addClass('tag ' + htmlEncode(tagClass));
146
+ $tag.contents().filter(function() {
147
+ return this.nodeType == 3;
148
+ })[0].nodeValue = htmlEncode(itemText);
149
+
150
+ if (self.isSelect) {
151
+ var option = $('option', self.$element).filter(function() { return $(this).data('item') === item; });
152
+ option.attr('value', itemValue);
153
+ }
154
+ });
155
+ },
156
+
157
+ // Returns the items added as tags
158
+ items: function() {
159
+ return this.itemsArray;
160
+ },
161
+
162
+ // Assembly value by retrieving the value of each item, and set it on the element.
163
+ pushVal: function() {
164
+ var self = this,
165
+ val = $.map(self.items(), function(item) {
166
+ return self.options.itemValue(item).toString();
167
+ });
168
+
169
+ self.$element.val(val, true).trigger('change');
170
+ },
171
+
172
+ build: function(options) {
173
+ var self = this;
174
+
175
+ self.options = $.extend({}, defaultOptions, options);
176
+ var typeahead = self.options.typeahead || {};
177
+
178
+ // When itemValue is set, freeInput should always be false
179
+ if (self.objectItems)
180
+ self.options.freeInput = false;
181
+
182
+ makeOptionItemFunction(self.options, 'itemValue');
183
+ makeOptionItemFunction(self.options, 'itemText');
184
+ makeOptionItemFunction(self.options, 'tagClass');
185
+
186
+ // for backwards compatibility, self.options.source is deprecated
187
+ if (self.options.source)
188
+ typeahead.source = self.options.source;
189
+
190
+ if (typeahead.source && $.fn.typeahead) {
191
+ makeOptionFunction(typeahead, 'source');
192
+
193
+ self.$input.typeahead({
194
+ source: function (query, process) {
195
+ function processItems(items) {
196
+ var texts = [];
197
+
198
+ for (var i = 0; i < items.length; i++) {
199
+ var text = self.options.itemText(items[i]);
200
+ map[text] = items[i];
201
+ texts.push(text);
202
+ }
203
+ process(texts);
204
+ }
205
+
206
+ this.map = {};
207
+ var map = this.map,
208
+ data = typeahead.source(query);
209
+
210
+ if ($.isFunction(data.success)) {
211
+ // support for Angular promises
212
+ data.success(processItems);
213
+ } else {
214
+ // support for functions and jquery promises
215
+ $.when(data)
216
+ .then(processItems);
217
+ }
218
+ },
219
+ updater: function (text) {
220
+ self.add(this.map[text]);
221
+ },
222
+ matcher: function (text) {
223
+ return (text.toLowerCase().indexOf(this.query.trim().toLowerCase()) !== -1);
224
+ },
225
+ sorter: function (texts) {
226
+ return texts.sort();
227
+ },
228
+ highlighter: function (text) {
229
+ var regex = new RegExp( '(' + this.query + ')', 'gi' );
230
+ return text.replace( regex, "<strong>$1</strong>" );
231
+ }
232
+ });
233
+ }
234
+
235
+ self.$container.on('click', $.proxy(function(event) {
236
+ self.$input.focus();
237
+ }, self));
238
+
239
+ self.$container.on('keydown', 'input', $.proxy(function(event) {
240
+ var $input = $(event.target);
241
+ switch (event.which) {
242
+ // BACKSPACE
243
+ case 8:
244
+ if (doGetCaretPosition($input[0]) === 0) {
245
+ var prev = $input.prev();
246
+ if (prev) {
247
+ self.remove(prev.data('item'));
248
+ }
249
+ }
250
+ break;
251
+
252
+ // DELETE
253
+ case 46:
254
+ if (doGetCaretPosition($input[0]) === 0) {
255
+ var next = $input.next();
256
+ if (next) {
257
+ self.remove(next.data('item'));
258
+ }
259
+ }
260
+ break;
261
+
262
+ // LEFT ARROW
263
+ case 37:
264
+ // Try to move the input before the previous tag
265
+ var $prevTag = $input.prev();
266
+ if ($input.val().length === 0 && $prevTag[0]) {
267
+ $prevTag.before($input);
268
+ $input.focus();
269
+ }
270
+ break;
271
+ // LEFT ARROW
272
+ case 39:
273
+ // Try to move the input before the previous tag
274
+ var $nextTag = $input.next();
275
+ if ($input.val().length === 0 && $nextTag[0]) {
276
+ $nextTag.after($input);
277
+ $input.focus();
278
+ }
279
+ break;
280
+ // ENTER
281
+ case 13:
282
+ if (self.options.freeInput) {
283
+ self.add($input.val());
284
+ $input.val('');
285
+ event.preventDefault();
286
+ }
287
+ break;
288
+
289
+ }
290
+
291
+ $input.attr('size', Math.max(1, $input.val().length));
292
+ }, self));
293
+
294
+ // Remove icon clicked
295
+ self.$container.on('click', '[data-role=remove]', $.proxy(function(event) {
296
+ self.remove($(event.target).closest('.tag').data('item'));
297
+ }, self));
298
+
299
+ if (self.$element[0].tagName === 'INPUT') {
300
+ self.add(self.$element.val());
301
+ } else {
302
+ $('option', self.$element).each(function() {
303
+ self.add($(this).attr('value'), true);
304
+ });
305
+ }
306
+ },
307
+
308
+ destroy: function() {
309
+ var self = this;
310
+
311
+ // Unbind events
312
+ self.$container.off('keypress', 'input');
313
+ self.$container.off('click', '[50role=remove]');
314
+
315
+ self.$container.remove();
316
+ self.$element.removeData('tagsinput');
317
+ self.$element.show();
318
+ },
319
+
320
+ focus: function() {
321
+ this.$input.focus();
322
+ }
323
+ };
324
+
325
+ // Register JQuery plugin
326
+ $.fn.tagsinput = function(arg1, arg2) {
327
+ var results = [];
328
+
329
+ this.each(function() {
330
+ var tagsinput = $(this).data('tagsinput');
331
+
332
+ // Initialize a new tags input
333
+ if (!tagsinput) {
334
+ tagsinput = new TagsInput(this, arg1);
335
+ $(this).data('tagsinput', tagsinput);
336
+ results.push(tagsinput);
337
+
338
+ if (this.tagName === 'SELECT') {
339
+ $('option', $(this)).attr('selected', 'selected');
340
+ }
341
+
342
+ // Init tags from $(this).val()
343
+ $(this).val($(this).val());
344
+ } else {
345
+ // Invoke function on existing tags input
346
+ var retVal = tagsinput[arg1](arg2);
347
+ if (retVal !== undefined)
348
+ results.push(retVal);
349
+ }
350
+ });
351
+
352
+ if ( typeof arg1 == 'string') {
353
+ // Return the results from the invoked function calls
354
+ return results.length > 1 ? results : results[0];
355
+ } else {
356
+ return results;
357
+ }
358
+ };
359
+
360
+ $.fn.tagsinput.Constructor = TagsInput;
361
+
362
+ // Most options support both a string or number as well as a function as
363
+ // option value. This function makes sure that the option with the given
364
+ // key in the given options is wrapped in a function
365
+ function makeOptionItemFunction(options, key) {
366
+ if (typeof options[key] !== 'function') {
367
+ var value = options[key];
368
+ options[key] = function(item) { return item[value]; };
369
+ }
370
+ }
371
+ function makeOptionFunction(options, key) {
372
+ if (typeof options[key] !== 'function') {
373
+ var value = options[key];
374
+ options[key] = function() { return value; };
375
+ }
376
+ }
377
+ // HtmlEncodes the given value
378
+ var htmlEncodeContainer = $('<div />');
379
+ function htmlEncode(value) {
380
+ if (value) {
381
+ return htmlEncodeContainer.text(value).html();
382
+ } else {
383
+ return '';
384
+ }
385
+ }
386
+
387
+ // Returns the position of the caret in the given input field
388
+ // http://flightschool.acylt.com/devnotes/caret-position-woes/
389
+ function doGetCaretPosition(oField) {
390
+ var iCaretPos = 0;
391
+ if (document.selection) {
392
+ oField.focus ();
393
+ var oSel = document.selection.createRange();
394
+ oSel.moveStart ('character', -oField.value.length);
395
+ iCaretPos = oSel.text.length;
396
+ } else if (oField.selectionStart || oField.selectionStart == '0') {
397
+ iCaretPos = oField.selectionStart;
398
+ }
399
+ return (iCaretPos);
400
+ }
401
+
402
+ $(function() {
403
+ $("input[data-role=tagsinput], select[multiple][data-role=tagsinput]").tagsinput();
404
+ });
405
+ })(window.jQuery);
@@ -0,0 +1,8 @@
1
+ /*
2
+ * bootstrap-tagsinput v0.3.2 by Tim Schlechter
3
+ *
4
+ */
5
+ !function(a){"use strict";function b(b,c){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.$container=a('<div class="bootstrap-tagsinput"></div>'),this.$input=a('<input size="1" type="text" />').appendTo(this.$container),this.$element.after(this.$container),this.build(c)}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?h.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}var g={tagClass:function(){return"label label-info"},itemValue:function(a){return a?a.toString():a},itemText:function(a){return this.itemValue(a)},freeInput:!0};b.prototype={constructor:b,add:function(b,c){var d=this;if(b===!1||b){if("object"==typeof b&&!d.objectItems)throw"Can't add objects when itemValue option is not set";if(!b.toString().match(/^\s*$/)){if(d.isSelect&&!d.multiple&&d.itemsArray.length>0&&d.remove(d.itemsArray[0]),"string"==typeof b&&"INPUT"===this.$element[0].tagName){var f=b.split(",");if(f.length>1){for(var g=0;g<f.length;g++)this.add(f[g],!0);return c||d.pushVal(),void 0}}var h=d.options.itemValue(b),i=d.options.itemText(b),j=d.options.tagClass(b);if(!a.grep(d.itemsArray,function(a){return d.options.itemValue(a)===h})[0]){d.itemsArray.push(b);var k=a('<span class="tag '+e(j)+'">'+e(i)+'<span data-role="remove"></span></span>');if(k.data("item",b),d.$input.before(k),d.isSelect&&!a('option[value="'+escape(h)+'"]')[0]){var l=a("<option selected>"+e(i)+"</option>");l.data("item",b),l.attr("value",h),d.$element.append(l)}c||d.pushVal(),d.$element.trigger(a.Event("itemAdded",{item:b}))}}}},remove:function(b,c){var d=this;d.objectItems&&(b="object"==typeof b?a.grep(d.itemsArray,function(a){return d.options.itemValue(a)==d.options.itemValue(b)})[0]:a.grep(d.itemsArray,function(a){return d.options.itemValue(a)==b})[0]),b&&(a(".tag",d.$container).filter(function(){return a(this).data("item")===b}).remove(),a("option",d.$element).filter(function(){return a(this).data("item")===b}).remove(),d.itemsArray.splice(d.itemsArray.indexOf(b),1)),c||d.pushVal(),d.$element.trigger(a.Event("itemRemoved",{item:b}))},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()},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).trigger("change")},build:function(b){var e=this;e.options=a.extend({},g,b);var h=e.options.typeahead||{};e.objectItems&&(e.options.freeInput=!1),c(e.options,"itemValue"),c(e.options,"itemText"),c(e.options,"tagClass"),e.options.source&&(h.source=e.options.source),h.source&&a.fn.typeahead&&(d(h,"source"),e.$input.typeahead({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=h.source(b);a.isFunction(g.success)?g.success(d):a.when(g).then(d)},updater:function(a){e.add(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>")}})),e.$container.on("click",a.proxy(function(){e.$input.focus()},e)),e.$container.on("keydown","input",a.proxy(function(b){var c=a(b.target);switch(b.which){case 8:if(0===f(c[0])){var d=c.prev();d&&e.remove(d.data("item"))}break;case 46:if(0===f(c[0])){var g=c.next();g&&e.remove(g.data("item"))}break;case 37:var h=c.prev();0===c.val().length&&h[0]&&(h.before(c),c.focus());break;case 39:var i=c.next();0===c.val().length&&i[0]&&(i.after(c),c.focus());break;case 13:e.options.freeInput&&(e.add(c.val()),c.val(""),b.preventDefault())}c.attr("size",Math.max(1,c.val().length))},e)),e.$container.on("click","[data-role=remove]",a.proxy(function(b){e.remove(a(b.target).closest(".tag").data("item"))},e)),"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","[50role=remove]"),a.$container.remove(),a.$element.removeData("tagsinput"),a.$element.show()},focus:function(){this.$input.focus()}},a.fn.tagsinput=function(c,d){var e=[];return this.each(function(){var f=a(this).data("tagsinput");if(f){var g=f[c](d);void 0!==g&&e.push(g)}else f=new b(this,c),a(this).data("tagsinput",f),e.push(f),"SELECT"===this.tagName&&a("option",a(this)).attr("selected","selected"),a(this).val(a(this).val())}),"string"==typeof c?e.length>1?e:e[0]:e},a.fn.tagsinput.Constructor=b;var h=a("<div />");a(function(){a("input[data-role=tagsinput], select[multiple][data-role=tagsinput]").tagsinput()})}(window.jQuery);
6
+ /*
7
+ //@ sourceMappingURL=bootstrap-tagsinput.min.js.map
8
+ */
@@ -0,0 +1 @@
1
+ {"version":3,"file":"examples/assets/bootstrap-tagsinput.min.js","sources":["src/bootstrap-tagsinput.js"],"names":["$","TagsInput","element","options","this","itemsArray","$element","hide","isSelect","tagName","multiple","hasAttribute","objectItems","itemValue","$container","$input","appendTo","after","build","makeOptionItemFunction","key","value","item","makeOptionFunction","htmlEncode","htmlEncodeContainer","text","html","doGetCaretPosition","oField","iCaretPos","document","selection","focus","oSel","createRange","moveStart","length","selectionStart","defaultOptions","tagClass","toString","itemText","freeInput","prototype","constructor","add","dontPushVal","self","match","remove","items","split","i","pushVal","grep","push","$tag","data","before","escape","$option","attr","append","trigger","Event","other","filter","splice","indexOf","removeAll","pop","refresh","each","addClass","contents","nodeType","nodeValue","option","val","map","extend","typeahead","source","fn","query","process","processItems","texts","isFunction","success","when","then","updater","matcher","toLowerCase","trim","sorter","sort","highlighter","regex","RegExp","replace","on","proxy","event","target","which","prev","next","$prevTag","$nextTag","preventDefault","Math","max","closest","destroy","off","removeData","show","tagsinput","arg1","arg2","results","retVal","undefined","Constructor","window","jQuery"],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ .bootstrap-tagsinput {
2
+ background-color: #fff;
3
+ border: 1px solid #ccc;
4
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
5
+ display: inline-block;
6
+ padding: 4px 6px;
7
+ margin-bottom: 10px;
8
+ color: #555;
9
+ vertical-align: middle;
10
+ border-radius: 4px;
11
+ max-width: 100%;
12
+ line-height: 22px;
13
+ }
14
+ .bootstrap-tagsinput input {
15
+ border: none;
16
+ box-shadow: none;
17
+ background-color: transparent;
18
+ padding: 0;
19
+ margin: 0;
20
+ width: auto !important;
21
+ max-width: inherit;
22
+ }
23
+ .bootstrap-tagsinput input:focus {
24
+ border: none;
25
+ box-shadow: none;
26
+ }
27
+ .bootstrap-tagsinput .tag {
28
+ margin-right: 5px;
29
+ color: white;
30
+ }
31
+ .bootstrap-tagsinput .tag [data-role="remove"] {
32
+ margin-left: 8px;
33
+ cursor: pointer;
34
+ }
35
+ .bootstrap-tagsinput .tag [data-role="remove"]:after {
36
+ content: "x";
37
+ padding: 0px 2px;
38
+ }
39
+ .bootstrap-tagsinput .tag [data-role="remove"]:hover {
40
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
41
+ }
42
+ .bootstrap-tagsinput .tag [data-role="remove"]:hover:active {
43
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
44
+ }
@@ -0,0 +1,48 @@
1
+ .bootstrap-tagsinput {
2
+ background-color: #fff;
3
+ border: 1px solid #ccc;
4
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
5
+ display: inline-block;
6
+ padding: 4px 6px;
7
+ margin-bottom: 10px;
8
+ color: #555;
9
+ vertical-align: middle;
10
+ border-radius: 4px;
11
+ max-width: 100%;
12
+ line-height: 22px;
13
+
14
+ input {
15
+ border: none;
16
+ box-shadow: none;
17
+ background-color: transparent;
18
+ padding: 0;
19
+ margin: 0;
20
+ width: auto !important;
21
+ max-width: inherit;
22
+
23
+ &:focus {
24
+ border: none;
25
+ box-shadow: none;
26
+ }
27
+ }
28
+
29
+ .tag {
30
+ margin-right: 5px;
31
+ color: white;
32
+
33
+ [data-role="remove"] {
34
+ margin-left:8px;
35
+ cursor:pointer;
36
+ &:after{
37
+ content: "x";
38
+ padding:0px 2px;
39
+ }
40
+ &:hover {
41
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
42
+ &:active {
43
+ box-shadow: inset 0 3px 5px rgba(0,0,0,0.125);
44
+ }
45
+ }
46
+ }
47
+ }
48
+ }
metadata ADDED
@@ -0,0 +1,97 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bootstrap-tagsinput-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Hyo Seong Choi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-08-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: railties
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '3.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '3.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '1.3'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: To gemify bootstrap-tagsinput for assets pipleline
56
+ email:
57
+ - rorlab@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - lib/bootstrap/tagsinput/rails/version.rb
63
+ - lib/bootstrap/tagsinput/rails.rb
64
+ - vendor/assets/javascripts/bootstrap-tagsinput-angular.js
65
+ - vendor/assets/javascripts/bootstrap-tagsinput.js
66
+ - vendor/assets/javascripts/bootstrap-tagsinput.min.js
67
+ - vendor/assets/javascripts/bootstrap-tagsinput.min.js.map
68
+ - vendor/assets/stylesheets/bootstrap-tagsinput.css
69
+ - vendor/assets/stylesheets/bootstrap-tagsinput.less
70
+ - LICENSE.txt
71
+ - README.md
72
+ homepage: http://rorlab.github.io/bootstrap-taginput-rails/
73
+ licenses:
74
+ - MIT
75
+ metadata: {}
76
+ post_install_message:
77
+ rdoc_options: []
78
+ require_paths:
79
+ - lib
80
+ required_ruby_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - '>='
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ required_rubygems_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ requirements: []
91
+ rubyforge_project:
92
+ rubygems_version: 2.0.0
93
+ signing_key:
94
+ specification_version: 4
95
+ summary: Packaging the assets with Bunlder
96
+ test_files: []
97
+ has_rdoc: