summaryrefslogtreecommitdiff
path: root/vendor/assets/javascripts
diff options
context:
space:
mode:
authorAleksei Kvitinskii <aleksei.wm@gmail.com>2011-11-04 09:42:36 +0200
committerAleksei Kvitinskii <aleksei.wm@gmail.com>2011-11-04 09:44:43 +0200
commit6977150f04be1bfe365e1cd86e3f8143c34a51bf (patch)
tree2c09cb76264c6ffa66d6a8cac3e04d57c2021099 /vendor/assets/javascripts
parent5d526717d626c072b6eb522e132cc30d9d96d60b (diff)
downloadgitlab-ce-6977150f04be1bfe365e1cd86e3f8143c34a51bf.tar.gz
integrate tags plugins
Diffstat (limited to 'vendor/assets/javascripts')
-rw-r--r--vendor/assets/javascripts/jquery.tagify.js143
1 files changed, 143 insertions, 0 deletions
diff --git a/vendor/assets/javascripts/jquery.tagify.js b/vendor/assets/javascripts/jquery.tagify.js
new file mode 100644
index 00000000000..f22d4c71191
--- /dev/null
+++ b/vendor/assets/javascripts/jquery.tagify.js
@@ -0,0 +1,143 @@
+/* Author: Alicia Liu */
+
+(function ($) {
+
+ $.widget("ui.tagify", {
+ options: {
+ delimiters: [13, 188], // what user can type to complete a tag in char codes: [enter], [comma]
+ outputDelimiter: ',', // delimiter for tags in original input field
+ cssClass: 'tagify-container', // CSS class to style the tagify div and tags, see stylesheet
+ addTagPrompt: 'add tags' // placeholder text
+ },
+
+ _create: function() {
+ var self = this,
+ el = self.element,
+ opts = self.options;
+
+ this.tags = [];
+
+ // hide text field and replace with a div that contains it's own input field for entering tags
+ this.tagInput = $("<input type='text'>")
+ .attr( 'placeholder', opts.addTagPrompt )
+ .keypress( function(e) {
+ var $this = $(this),
+ pressed = e.which;
+
+ for ( i in opts.delimiters ) {
+
+ if (pressed == opts.delimiters[i]) {
+ self.add( $this.val() );
+ e.preventDefault();
+ return false;
+ }
+ }
+ })
+ // for some reason, in Safari, backspace is only recognized on keyup
+ .keyup( function(e) {
+ var $this = $(this),
+ pressed = e.which;
+
+ // if backspace is hit with no input, remove the last tag
+ if (pressed == 8) { // backspace
+ if ( $this.val() == "" ) {
+ self.remove();
+ return false;
+ }
+ return;
+ }
+ });
+
+ this.tagDiv = $("<div></div>")
+ .addClass( opts.cssClass )
+ .click( function() {
+ $(this).children('input').focus();
+ })
+ .append( this.tagInput )
+ .insertAfter( el.hide() );
+
+ // if the field isn't empty, parse the field for tags, and prepopulate existing tags
+ var initVal = $.trim( el.val() );
+
+ if ( initVal ) {
+ var initTags = initVal.split( opts.outputDelimiter );
+ $.each( initTags, function(i, tag) {
+ self.add( tag );
+ });
+ }
+ },
+
+ _setOption: function( key, value ) {
+ options.key = value;
+ },
+
+ // add a tag, public function
+ add: function(text) {
+ var self = this;
+ text = text || self.tagInput.val();
+ if (text) {
+ var tagIndex = self.tags.length;
+
+ var removeButton = $("<a href='#'>x</a>")
+ .click( function() {
+ self.remove( tagIndex );
+ return false;
+ });
+ var newTag = $("<span></span>")
+ .text( text )
+ .append( removeButton );
+
+ self.tagInput.before( newTag );
+ self.tags.push( text );
+ self.tagInput.val('');
+ }
+ },
+
+ // remove a tag by index, public function
+ // if index is blank, remove the last tag
+ remove: function( tagIndex ) {
+ var self = this;
+ if ( tagIndex == null || tagIndex === (self.tags.length - 1) ) {
+ this.tagDiv.children("span").last().remove();
+ self.tags.pop();
+ }
+ if ( typeof(tagIndex) == 'number' ) {
+ // otherwise just hide this tag, and we don't mess up the index
+ this.tagDiv.children( "span:eq(" + tagIndex + ")" ).hide();
+ // we rely on the serialize function to remove null values
+ delete( self.tags[tagIndex] );
+ }
+ },
+
+ // serialize the tags with the given delimiter, and write it back into the tagified field
+ serialize: function() {
+ var self = this;
+ var delim = self.options.outputDelimiter;
+ var tagsStr = self.tags.join( delim );
+
+ // our tags might have deleted entries, remove them here
+ var dupes = new RegExp(delim + delim + '+', 'g'); // regex: /,,+/g
+ var ends = new RegExp('^' + delim + '|' + delim + '$', 'g'); // regex: /^,|,$/g
+ var outputStr = tagsStr.replace( dupes, delim ).replace(ends, '');
+
+ self.element.val(outputStr);
+ return outputStr;
+ },
+
+ inputField: function() {
+ return this.tagInput;
+ },
+
+ containerDiv: function() {
+ return this.tagDiv;
+ },
+
+ // remove the div, and show original input
+ destroy: function() {
+ $.Widget.prototype.destroy.apply(this);
+ this.tagDiv.remove();
+ this.element.show();
+ }
+ });
+
+})(jQuery); \ No newline at end of file