UNPKG

3.33 kBJavaScriptView Raw
1import Set from '../set';
2import * as is from '../is';
3
4let elesfn = ({
5 classes: function( classes ){
6 let self = this;
7
8 if( classes === undefined ){
9 let ret = [];
10
11 self[0]._private.classes.forEach(cls => ret.push(cls));
12
13 return ret;
14 } else if( !is.array( classes ) ){
15 // extract classes from string
16 classes = ( classes || '' ).match( /\S+/g ) || [];
17 }
18
19 let changed = [];
20 let classesSet = new Set( classes );
21
22 // check and update each ele
23 for( let j = 0; j < self.length; j++ ){
24 let ele = self[ j ];
25 let _p = ele._private;
26 let eleClasses = _p.classes;
27 let changedEle = false;
28
29 // check if ele has all of the passed classes
30 for( let i = 0; i < classes.length; i++ ){
31 let cls = classes[i];
32 let eleHasClass = eleClasses.has(cls);
33
34 if( !eleHasClass ){
35 changedEle = true;
36 break;
37 }
38 }
39
40 // check if ele has classes outside of those passed
41 if( !changedEle ){
42 changedEle = eleClasses.size !== classes.length;
43 }
44
45 if( changedEle ){
46 _p.classes = classesSet;
47
48 changed.push( ele );
49 }
50 }
51
52 // trigger update style on those eles that had class changes
53 if( changed.length > 0 ){
54 this.spawn( changed )
55 .updateStyle()
56 .emit( 'class' )
57 ;
58 }
59
60 return self;
61 },
62
63 addClass: function( classes ){
64 return this.toggleClass( classes, true );
65 },
66
67 hasClass: function( className ){
68 let ele = this[0];
69 return ( ele != null && ele._private.classes.has(className) );
70 },
71
72 toggleClass: function( classes, toggle ){
73 if( !is.array( classes ) ){
74 // extract classes from string
75 classes = classes.match( /\S+/g ) || [];
76 }
77 let self = this;
78 let toggleUndefd = toggle === undefined;
79 let changed = []; // eles who had classes changed
80
81 for( let i = 0, il = self.length; i < il; i++ ){
82 let ele = self[ i ];
83 let eleClasses = ele._private.classes;
84 let changedEle = false;
85
86 for( let j = 0; j < classes.length; j++ ){
87 let cls = classes[ j ];
88 let hasClass = eleClasses.has(cls);
89 let changedNow = false;
90
91 if( toggle || (toggleUndefd && !hasClass) ){
92 eleClasses.add(cls);
93 changedNow = true;
94 } else if( !toggle || (toggleUndefd && hasClass) ){
95 eleClasses.delete(cls);
96 changedNow = true;
97 }
98
99 if( !changedEle && changedNow ){
100 changed.push( ele );
101 changedEle = true;
102 }
103
104 } // for j classes
105 } // for i eles
106
107 // trigger update style on those eles that had class changes
108 if( changed.length > 0 ){
109 this.spawn( changed )
110 .updateStyle()
111 .emit( 'class' )
112 ;
113 }
114
115 return self;
116 },
117
118 removeClass: function( classes ){
119 return this.toggleClass( classes, false );
120 },
121
122 flashClass: function( classes, duration ){
123 let self = this;
124
125 if( duration == null ){
126 duration = 250;
127 } else if( duration === 0 ){
128 return self; // nothing to do really
129 }
130
131 self.addClass( classes );
132 setTimeout( function(){
133 self.removeClass( classes );
134 }, duration );
135
136 return self;
137 }
138});
139
140elesfn.className = elesfn.classNames = elesfn.classes;
141
142export default elesfn;