Skip to content

Moved to latest tagsinput library (1.7.1) #10

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/bootstrap/tagsinput/rails/version.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
module Bootstrap
module Tagsinput
module Rails
VERSION = "0.4.2.1"
VERSION = "0.7.1"
end
end
end
Empty file modified vendor/assets/javascripts/bootstrap-tagsinput-angular.js
100755 → 100644
Empty file.
6 changes: 3 additions & 3 deletions vendor/assets/javascripts/bootstrap-tagsinput-angular.min.js
100755 → 100644

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

111 changes: 80 additions & 31 deletions vendor/assets/javascripts/bootstrap-tagsinput.js
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,17 @@
itemText: function(item) {
return this.itemValue(item);
},
itemTitle: function(item) {
return null;
},
freeInput: true,
addOnBlur: true,
maxTags: undefined,
maxChars: undefined,
confirmKeys: [13, 44],
delimiter: ',',
delimiterRegex: null,
cancelConfirmKeysOnEmpty: false,
onTagExists: function(item, $tag) {
$tag.hide().fadeIn();
},
Expand All @@ -27,6 +33,7 @@
* Constructor function
*/
function TagsInput(element, options) {
this.isInit = true;
this.itemsArray = [];

this.$element = $(element);
Expand All @@ -41,11 +48,10 @@
this.$container = $('<div class="bootstrap-tagsinput"></div>');
this.$input = $('<input type="text" placeholder="' + this.placeholderText + '"/>').appendTo(this.$container);

this.$element.after(this.$container);
this.$element.before(this.$container);

var inputWidth = (this.inputSize < 3 ? 3 : this.inputSize) + "em";
this.$input.get(0).style.cssText = "width: " + inputWidth + " !important;";
this.build(options);
this.isInit = false;
}

TagsInput.prototype = {
Expand All @@ -55,7 +61,7 @@
* Adds the given item as a new tag. Pass true to dontPushVal to prevent
* updating the elements val()
*/
add: function(item, dontPushVal) {
add: function(item, dontPushVal, options) {
var self = this;

if (self.options.maxTags && self.itemsArray.length >= self.options.maxTags)
Expand Down Expand Up @@ -83,7 +89,8 @@
self.remove(self.itemsArray[0]);

if (typeof item === "string" && this.$element[0].tagName === 'INPUT') {
var items = item.split(',');
var delimiter = (self.options.delimiterRegex) ? self.options.delimiterRegex : self.options.delimiter;
var items = item.split(delimiter);
if (items.length > 1) {
for (var i = 0; i < items.length; i++) {
this.add(items[i], true);
Expand All @@ -97,7 +104,8 @@

var itemValue = self.options.itemValue(item),
itemText = self.options.itemText(item),
tagClass = self.options.tagClass(item);
tagClass = self.options.tagClass(item),
itemTitle = self.options.itemTitle(item);

// Ignore items allready added
var existing = $.grep(self.itemsArray, function(item) { return self.options.itemValue(item) === itemValue; } )[0];
Expand All @@ -115,7 +123,7 @@
return;

// raise beforeItemAdd arg
var beforeItemAddEvent = $.Event('beforeItemAdd', { item: item, cancel: false });
var beforeItemAddEvent = $.Event('beforeItemAdd', { item: item, cancel: false, options: options});
self.$element.trigger(beforeItemAddEvent);
if (beforeItemAddEvent.cancel)
return;
Expand All @@ -124,13 +132,20 @@
self.itemsArray.push(item);

// add a tag element
var $tag = $('<span class="tag ' + htmlEncode(tagClass) + '">' + htmlEncode(itemText) + '<span data-role="remove"></span></span>');

var $tag = $('<span class="tag ' + htmlEncode(tagClass) + (itemTitle !== null ? ('" title="' + itemTitle) : '') + '">' + htmlEncode(itemText) + '<span data-role="remove"></span></span>');
$tag.data('item', item);
self.findInputWrapper().before($tag);
$tag.after(' ');

// Check to see if the tag exists in its raw or uri-encoded form
var optionExists = (
$('option[value="' + encodeURIComponent(itemValue) + '"]', self.$element).length ||
$('option[value="' + htmlEncode(itemValue) + '"]', self.$element).length
);

// add <option /> if item represents a value not present in one of the <select />'s options
if (self.isSelect && !$('option[value="' + encodeURIComponent(itemValue) + '"]',self.$element)[0]) {
if (self.isSelect && !optionExists) {
var $option = $('<option selected>' + htmlEncode(itemText) + '</option>');
$option.data('item', item);
$option.attr('value', itemValue);
Expand All @@ -144,14 +159,23 @@
if (self.options.maxTags === self.itemsArray.length || self.items().toString().length === self.options.maxInputLength)
self.$container.addClass('bootstrap-tagsinput-max');

self.$element.trigger($.Event('itemAdded', { item: item }));
// If using typeahead, once the tag has been added, clear the typeahead value so it does not stick around in the input.
if ($('.typeahead, .twitter-typeahead', self.$container).length) {
self.$input.typeahead('val', '');
}

if (this.isInit) {
self.$element.trigger($.Event('itemAddedOnInit', { item: item, options: options }));
} else {
self.$element.trigger($.Event('itemAdded', { item: item, options: options }));
}
},

/**
* Removes the given item. Pass true to dontPushVal to prevent updating the
* elements val()
*/
remove: function(item, dontPushVal) {
remove: function(item, dontPushVal, options) {
var self = this;

if (self.objectItems) {
Expand All @@ -164,7 +188,7 @@
}

if (item) {
var beforeItemRemoveEvent = $.Event('beforeItemRemove', { item: item, cancel: false });
var beforeItemRemoveEvent = $.Event('beforeItemRemove', { item: item, cancel: false, options: options });
self.$element.trigger(beforeItemRemoveEvent);
if (beforeItemRemoveEvent.cancel)
return;
Expand All @@ -182,7 +206,7 @@
if (self.options.maxTags > self.itemsArray.length)
self.$container.removeClass('bootstrap-tagsinput-max');

self.$element.trigger($.Event('itemRemoved', { item: item }));
self.$element.trigger($.Event('itemRemoved', { item: item, options: options }));
},

/**
Expand Down Expand Up @@ -261,7 +285,7 @@
makeOptionItemFunction(self.options, 'itemValue');
makeOptionItemFunction(self.options, 'itemText');
makeOptionFunction(self.options, 'tagClass');

// Typeahead Bootstrap version 2.3.2
if (self.options.typeahead) {
var typeahead = self.options.typeahead || {};
Expand Down Expand Up @@ -299,6 +323,7 @@
},
updater: function (text) {
self.add(this.map[text]);
return this.map[text];
},
matcher: function (text) {
return (text.toLowerCase().indexOf(this.query.trim().toLowerCase()) !== -1);
Expand All @@ -315,11 +340,21 @@

// typeahead.js
if (self.options.typeaheadjs) {
var typeaheadjs = self.options.typeaheadjs || {};

self.$input.typeahead(null, typeaheadjs).on('typeahead:selected', $.proxy(function (obj, datum) {
if (typeaheadjs.valueKey)
self.add(datum[typeaheadjs.valueKey]);
var typeaheadConfig = null;
var typeaheadDatasets = {};

// Determine if main configurations were passed or simply a dataset
var typeaheadjs = self.options.typeaheadjs;
if ($.isArray(typeaheadjs)) {
typeaheadConfig = typeaheadjs[0];
typeaheadDatasets = typeaheadjs[1];
} else {
typeaheadDatasets = typeaheadjs;
}

self.$input.typeahead(typeaheadConfig, typeaheadDatasets).on('typeahead:selected', $.proxy(function (obj, datum) {
if (typeaheadDatasets.valueKey)
self.add(datum[typeaheadDatasets.valueKey]);
else
self.add(datum);
self.$input.typeahead('val', '');
Expand All @@ -337,13 +372,16 @@
self.$input.on('focusout', $.proxy(function(event) {
// HACK: only process on focusout when no typeahead opened, to
// avoid adding the typeahead text as tag
if ($('.typeahead, .twitter-typeahead', self.$container).length === 0) {
self.add(self.$input.val());
self.$input.val('');
if ($('.tt-hint', self.$container).length === 0 || $('.tt-hint', self.$container).val().length === 0) {
self.add(self.$input.val());
if (self.options.typeaheadjs) {
self.$input.typeahead('val', '');
self.$input.typeahead('close');
}
}
}, self));
}


self.$container.on('keydown', 'input', $.proxy(function(event) {
var $input = $(event.target),
Expand All @@ -359,7 +397,7 @@
case 8:
if (doGetCaretPosition($input[0]) === 0) {
var prev = $inputWrapper.prev();
if (prev) {
if (prev.length) {
self.remove(prev.data('item'));
}
}
Expand All @@ -369,7 +407,7 @@
case 46:
if (doGetCaretPosition($input[0]) === 0) {
var next = $inputWrapper.next();
if (next) {
if (next.length) {
self.remove(next.data('item'));
}
}
Expand Down Expand Up @@ -415,9 +453,16 @@
var text = $input.val(),
maxLengthReached = self.options.maxChars && text.length >= self.options.maxChars;
if (self.options.freeInput && (keyCombinationInList(event, self.options.confirmKeys) || maxLengthReached)) {
self.add(maxLengthReached ? text.substr(0, self.options.maxChars) : text);
$input.val('');
event.preventDefault();
// Only attempt to add a tag if there is data in the field
if (text.length !== 0) {
self.add(maxLengthReached ? text.substr(0, self.options.maxChars) : text);
$input.val('');
}

// If the field is empty, let the event triggered fire as usual
if (self.options.cancelConfirmKeysOnEmpty === false) {
event.preventDefault();
}
}

// Reset internal input's size
Expand Down Expand Up @@ -493,7 +538,7 @@
/**
* Register JQuery plugin
*/
$.fn.tagsinput = function(arg1, arg2) {
$.fn.tagsinput = function(arg1, arg2, arg3) {
var results = [];

this.each(function() {
Expand All @@ -516,7 +561,11 @@
results.push(tagsinput);
} else if(tagsinput[arg1] !== undefined) {
// Invoke function on existing tags input
var retVal = tagsinput[arg1](arg2);
if(tagsinput[arg1].length === 3 && arg3 !== undefined){
var retVal = tagsinput[arg1](arg2, null, arg3);
}else{
var retVal = tagsinput[arg1](arg2);
}
if (retVal !== undefined)
results.push(retVal);
}
Expand Down Expand Up @@ -579,7 +628,7 @@
}

/**
* Returns boolean indicates whether user has pressed an expected key combination.
* Returns boolean indicates whether user has pressed an expected key combination.
* @param object keyPressEvent: JavaScript event object, refer
* http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
* @param object lookupList: expected key combinations, as in:
Expand Down
Loading