@ -1,14 +1,14 @@
var $ = require ( 'jquery' ) ;
var $ = require ( 'jquery' ) ;
var _ = require ( 'underscore' ) ;
var TagCollection = require ( '../Tags/TagCollection' ) ;
var TagModel = require ( '../Tags/TagModel' ) ;
require ( 'bootstrap.tagsinput' ) ;
var substringMatcher = function ( tag Collection ) {
var substringMatcher = function ( tag s, selector ) {
return function findMatches ( q , cb ) {
q = q . replace ( /[^-_a-z0-9]/gi , '' ) . toLowerCase ( ) ;
var matches = _ . select ( tag Collection. toJSON ( ) , function ( tag ) {
return tag. label . toLowerCase ( ) . indexOf ( q ) > - 1 ;
var matches = _ . select ( tag s , function ( tag ) {
return selector( tag ) . toLowerCase ( ) . indexOf ( q ) > - 1 ;
} ) ;
cb ( matches ) ;
} ;
@ -108,49 +108,91 @@ $.fn.tagsinput.Constructor.prototype.build = function(options) {
} ;
$ . fn . tagInput = function ( options ) {
options = $ . extend ( { } , { allowNew : true } , options ) ;
var input = this ;
var model = options . model ;
var property = options . property ;
var tagInput = $ ( this ) . tagsinput ( {
tagCollection : TagCollection ,
freeInput : true ,
allowNew : options . allowNew ,
itemValue : 'id' ,
itemText : 'label' ,
trimValue : true ,
typeaheadjs : {
name : 'tags' ,
displayKey : 'label' ,
source : substringMatcher ( TagCollection )
}
} ) ;
//Override the free input being set to false because we're using objects
$ ( tagInput ) [ 0 ] . options . freeInput = true ;
this . each ( function ( ) {
if ( model ) {
var tag s = getExistingTags ( model . get ( property ) ) ;
var input = $ ( this ) ;
var tagInput = null ;
//Remove any existing tags and re-add them
$ ( this ) . tagsinput ( 'removeAll' ) ;
_ . each ( tags , function ( tag ) {
$ ( input ) . tagsinput ( 'add' , tag ) ;
} ) ;
$ ( this ) . tagsinput ( 'refresh' ) ;
$ ( this ) . on ( 'itemAdded' , function ( event ) {
var tags = model . get ( property ) ;
tags . push ( event . item . id ) ;
model . set ( property , tags ) ;
} ) ;
$ ( this ) . on ( 'itemRemoved' , function ( event ) {
if ( ! event . item ) {
return ;
if ( input [ 0 ] . hasAttribute ( 'tag-source' ) ) {
var listItems = JSON . parse ( input . attr ( 'tag-source' ) ) ;
tagInput = input . tagsinput ( {
freeInput : false ,
allowNew : false ,
allowDuplicates : false ,
itemValue : 'value' ,
itemText : 'name' ,
typeaheadjs : {
displayKey : 'name' ,
source : substringMatcher ( listItems , function ( t ) { return t . name ; } )
}
} ) ;
var origValue = input . val ( ) ;
input . tagsinput ( 'removeAll' ) ;
if ( origValue ) {
_ . each ( origValue . split ( ',' ) , function ( v ) {
var parsed = parseInt ( v ) ;
var found = _ . find ( listItems , function ( t ) { return t . value === parsed ; } ) ;
if ( found ) {
input . tagsinput ( 'add' , found ) ;
}
} ) ;
}
var tags = _ . without ( model . get ( property ) , event . item . id ) ;
model . set ( property , tags ) ;
} ) ;
}
}
else {
options = $ . extend ( { } , { allowNew : true } , options ) ;
var model = options . model ;
var property = options . property ;
tagInput = input . tagsinput ( {
tagCollection : TagCollection ,
freeInput : true ,
allowNew : options . allowNew ,
itemValue : 'id' ,
itemText : 'label' ,
trimValue : true ,
typeaheadjs : {
name : 'tags' ,
displayKey : 'label' ,
source : substringMatcher ( TagCollection . toJSON ( ) , function ( t ) { return t . label ; } )
}
} ) ;
//Override the free input being set to false because we're using objects
$ ( tagInput ) [ 0 ] . options . freeInput = true ;
if ( model ) {
var tags = getExistingTags ( model . get ( property ) ) ;
//Remove any existing tags and re-add them
input . tagsinput ( 'removeAll' ) ;
_ . each ( tags , function ( tag ) {
input . tagsinput ( 'add' , tag ) ;
} ) ;
input . tagsinput ( 'refresh' ) ;
input . on ( 'itemAdded' , function ( event ) {
var tags = model . get ( property ) ;
tags . push ( event . item . id ) ;
model . set ( property , tags ) ;
} ) ;
input . on ( 'itemRemoved' , function ( event ) {
if ( ! event . item ) {
return ;
}
var tags = _ . without ( model . get ( property ) , event . item . id ) ;
model . set ( property , tags ) ;
} ) ;
}
}
} ) ;
} ;