UNPKG

4.75 kBJavaScriptView Raw
1import * as is from '../is';
2import * as util from '../util';
3
4let styfn = {};
5
6// bypasses are applied to an existing style on an element, and just tacked on temporarily
7// returns true iff application was successful for at least 1 specified property
8styfn.applyBypass = function( eles, name, value, updateTransitions ){
9 let self = this;
10 let props = [];
11 let isBypass = true;
12
13 // put all the properties (can specify one or many) in an array after parsing them
14 if( name === '*' || name === '**' ){ // apply to all property names
15
16 if( value !== undefined ){
17 for( let i = 0; i < self.properties.length; i++ ){
18 let prop = self.properties[ i ];
19 let name = prop.name;
20
21 let parsedProp = this.parse( name, value, true );
22
23 if( parsedProp ){
24 props.push( parsedProp );
25 }
26 }
27 }
28
29 } else if( is.string( name ) ){ // then parse the single property
30 let parsedProp = this.parse( name, value, true );
31
32 if( parsedProp ){
33 props.push( parsedProp );
34 }
35 } else if( is.plainObject( name ) ){ // then parse each property
36 let specifiedProps = name;
37 updateTransitions = value;
38
39 let names = Object.keys( specifiedProps );
40
41 for( let i = 0; i < names.length; i++ ){
42 let name = names[i];
43 let value = specifiedProps[ name ];
44
45 if( value === undefined ){ // try camel case name too
46 value = specifiedProps[ util.dash2camel( name ) ];
47 }
48
49 if( value !== undefined ){
50 let parsedProp = this.parse( name, value, true );
51
52 if( parsedProp ){
53 props.push( parsedProp );
54 }
55 }
56 }
57 } else { // can't do anything without well defined properties
58 return false;
59 }
60
61 // we've failed if there are no valid properties
62 if( props.length === 0 ){ return false; }
63
64 // now, apply the bypass properties on the elements
65 let ret = false; // return true if at least one succesful bypass applied
66 for( let i = 0; i < eles.length; i++ ){ // for each ele
67 let ele = eles[ i ];
68 let diffProps = {};
69 let diffProp;
70
71 for( let j = 0; j < props.length; j++ ){ // for each prop
72 let prop = props[ j ];
73
74 if( updateTransitions ){
75 let prevProp = ele.pstyle( prop.name );
76 diffProp = diffProps[ prop.name ] = { prev: prevProp };
77 }
78
79 ret = this.applyParsedProperty( ele, util.copy(prop) ) || ret;
80
81 if( updateTransitions ){
82 diffProp.next = ele.pstyle( prop.name );
83 }
84
85 } // for props
86
87 if( ret ){
88 this.updateStyleHints( ele );
89 }
90
91 if( updateTransitions ){
92 this.updateTransitions( ele, diffProps, isBypass );
93 }
94 } // for eles
95
96 return ret;
97};
98
99// only useful in specific cases like animation
100styfn.overrideBypass = function( eles, name, value ){
101 name = util.camel2dash( name );
102
103 for( let i = 0; i < eles.length; i++ ){
104 let ele = eles[ i ];
105 let prop = ele._private.style[ name ];
106 let type = this.properties[ name ].type;
107 let isColor = type.color;
108 let isMulti = type.mutiple;
109 let oldValue = !prop ? null : prop.pfValue != null ? prop.pfValue : prop.value;
110
111 if( !prop || !prop.bypass ){ // need a bypass if one doesn't exist
112 this.applyBypass( ele, name, value );
113 } else {
114 prop.value = value;
115
116 if( prop.pfValue != null ){
117 prop.pfValue = value;
118 }
119
120 if( isColor ){
121 prop.strValue = 'rgb(' + value.join( ',' ) + ')';
122 } else if( isMulti ){
123 prop.strValue = value.join( ' ' );
124 } else {
125 prop.strValue = '' + value;
126 }
127
128 this.updateStyleHints( ele );
129 }
130
131 this.checkTriggers( ele, name, oldValue, value );
132 }
133};
134
135styfn.removeAllBypasses = function( eles, updateTransitions ){
136 return this.removeBypasses( eles, this.propertyNames, updateTransitions );
137};
138
139styfn.removeBypasses = function( eles, props, updateTransitions ){
140 let isBypass = true;
141
142 for( let j = 0; j < eles.length; j++ ){
143 let ele = eles[ j ];
144 let diffProps = {};
145
146 for( let i = 0; i < props.length; i++ ){
147 let name = props[ i ];
148 let prop = this.properties[ name ];
149 let prevProp = ele.pstyle( prop.name );
150
151 if( !prevProp || !prevProp.bypass ){
152 // if a bypass doesn't exist for the prop, nothing needs to be removed
153 continue;
154 }
155
156 let value = ''; // empty => remove bypass
157 let parsedProp = this.parse( name, value, true );
158 let diffProp = diffProps[ prop.name ] = { prev: prevProp };
159
160 this.applyParsedProperty( ele, parsedProp );
161
162 diffProp.next = ele.pstyle( prop.name );
163 } // for props
164
165 this.updateStyleHints( ele );
166
167 if( updateTransitions ){
168 this.updateTransitions( ele, diffProps, isBypass );
169 }
170 } // for eles
171};
172
173export default styfn;