1
+ import jqLiteExtrasRegister from './modules/jqlite-extras-register' ;
2
+
1
3
angular . module ( 'ui.scroll.jqlite' , [ 'ui.scroll' ] )
2
- . service ( 'jqLiteExtras' , [
3
- '$log' ,
4
- '$window' ,
5
- ( console , window ) => {
4
+ . service ( 'jqLiteExtras' , ( ) => {
6
5
return {
7
- registerFor : ( element ) => {
8
- var convertToPx , css , getStyle , isWindow ;
9
- // angular implementation blows up if elem is the window
10
- css = angular . element . prototype . css ;
11
-
12
- element . prototype . css = function ( name , value ) {
13
- let self = this ;
14
- let elem = self [ 0 ] ;
15
- if ( ! ( ! elem || elem . nodeType === 3 || elem . nodeType === 8 || ! elem . style ) ) {
16
- return css . call ( self , name , value ) ;
17
- }
18
- } ;
19
-
20
- // as defined in angularjs v1.0.5
21
- isWindow = ( obj ) => obj && obj . document && obj . location && obj . alert && obj . setInterval ;
22
-
23
- function scrollTo ( self , direction , value ) {
24
- let elem = self [ 0 ] ;
25
- let [ method , prop , preserve ] = {
26
- top : [
27
- 'scrollTop' ,
28
- 'pageYOffset' ,
29
- 'scrollLeft'
30
- ] ,
31
- left : [
32
- 'scrollLeft' ,
33
- 'pageXOffset' ,
34
- 'scrollTop'
35
- ]
36
- } [ direction ] ;
37
-
38
- if ( isWindow ( elem ) ) {
39
- if ( angular . isDefined ( value ) ) {
40
- return elem . scrollTo ( self [ preserve ] . call ( self ) , value ) ;
41
- }
42
-
43
- return ( prop in elem ) ? elem [ prop ] : elem . document . documentElement [ method ] ;
44
- } else {
45
- if ( angular . isDefined ( value ) ) {
46
- elem [ method ] = value ;
47
- }
48
-
49
- return elem [ method ] ;
50
- }
51
- }
52
-
53
- if ( window . getComputedStyle ) {
54
- getStyle = ( elem ) => window . getComputedStyle ( elem , null ) ;
55
- convertToPx = ( elem , value ) => parseFloat ( value ) ;
56
- } else {
57
- getStyle = ( elem ) => elem . currentStyle ;
58
- convertToPx = ( elem , value ) => {
59
- let left , result , rs , rsLeft , style ;
60
- let core_pnum = / [ + - ] ? (?: \d * \. | ) \d + (?: [ e E ] [ + - ] ? \d + | ) / . source ;
61
- let rnumnonpx = new RegExp ( '^(' + core_pnum + ')(?!px)[a-z%]+$' , 'i' ) ;
62
-
63
- if ( ! rnumnonpx . test ( value ) ) {
64
- return parseFloat ( value ) ;
65
- }
66
-
67
- // ported from JQuery
68
- style = elem . style ;
69
- left = style . left ;
70
- rs = elem . runtimeStyle ;
71
- rsLeft = rs && rs . left ;
72
- if ( rs ) {
73
- rs . left = style . left ;
74
- }
75
- // put in the new values to get a computed style out
76
- style . left = value ;
77
- result = style . pixelLeft ;
78
- style . left = left ;
79
- if ( rsLeft ) {
80
- rs . left = rsLeft ;
81
- }
82
- return result ;
83
- } ;
84
- }
85
-
86
- function getMeasurements ( elem , measure ) {
87
- let base , borderA , borderB , computedMarginA , computedMarginB , computedStyle , dirA , dirB , marginA , marginB , paddingA , paddingB ;
88
-
89
- if ( isWindow ( elem ) ) {
90
- base = document . documentElement [ { height : 'clientHeight' , width : 'clientWidth' } [ measure ] ] ;
91
-
92
- return {
93
- base : base ,
94
- padding : 0 ,
95
- border : 0 ,
96
- margin : 0
97
- } ;
98
- }
99
-
100
- // Start with offset property
101
- [
102
- base ,
103
- dirA ,
104
- dirB
105
- ] = {
106
- width : [
107
- elem . offsetWidth ,
108
- 'Left' ,
109
- 'Right'
110
- ] ,
111
- height : [
112
- elem . offsetHeight ,
113
- 'Top' ,
114
- 'Bottom'
115
- ]
116
- } [ measure ] ;
117
-
118
- computedStyle = getStyle ( elem ) ;
119
- paddingA = convertToPx ( elem , computedStyle [ 'padding' + dirA ] ) || 0 ;
120
- paddingB = convertToPx ( elem , computedStyle [ 'padding' + dirB ] ) || 0 ;
121
- borderA = convertToPx ( elem , computedStyle [ 'border' + dirA + 'Width' ] ) || 0 ;
122
- borderB = convertToPx ( elem , computedStyle [ 'border' + dirB + 'Width' ] ) || 0 ;
123
- computedMarginA = computedStyle [ 'margin' + dirA ] ;
124
- computedMarginB = computedStyle [ 'margin' + dirB ] ;
125
-
126
- // I do not care for width for now, so this hack is irrelevant
127
- // if ( !supportsPercentMargin )
128
- // computedMarginA = hackPercentMargin( elem, computedStyle, computedMarginA )
129
- // computedMarginB = hackPercentMargin( elem, computedStyle, computedMarginB )
130
- marginA = convertToPx ( elem , computedMarginA ) || 0 ;
131
- marginB = convertToPx ( elem , computedMarginB ) || 0 ;
132
-
133
- return {
134
- base : base ,
135
- padding : paddingA + paddingB ,
136
- border : borderA + borderB ,
137
- margin : marginA + marginB
138
- } ;
139
- }
140
-
141
- function getWidthHeight ( elem , direction , measure ) {
142
- let computedStyle , result ;
143
-
144
- let measurements = getMeasurements ( elem , direction ) ;
145
-
146
- if ( measurements . base > 0 ) {
147
- return {
148
- base : measurements . base - measurements . padding - measurements . border ,
149
- outer : measurements . base ,
150
- outerfull : measurements . base + measurements . margin
151
- } [ measure ] ;
152
- }
153
-
154
- // Fall back to computed then uncomputed css if necessary
155
- computedStyle = getStyle ( elem ) ;
156
- result = computedStyle [ direction ] ;
157
-
158
- if ( result < 0 || result === null ) {
159
- result = elem . style [ direction ] || 0 ;
160
- }
161
-
162
- // Normalize "", auto, and prepare for extra
163
- result = parseFloat ( result ) || 0 ;
164
-
165
- return {
166
- base : result - measurements . padding - measurements . border ,
167
- outer : result ,
168
- outerfull : result + measurements . padding + measurements . border + measurements . margin
169
- } [ measure ] ;
170
- }
171
-
172
- // define missing methods
173
- return angular . forEach ( {
174
- before ( newElem ) {
175
- var children , elem , i , j , parent , ref , self ;
176
- self = this ;
177
- elem = self [ 0 ] ;
178
- parent = self . parent ( ) ;
179
- children = parent . contents ( ) ;
180
- if ( children [ 0 ] === elem ) {
181
- return parent . prepend ( newElem ) ;
182
- } else {
183
- for ( i = j = 1 , ref = children . length - 1 ; 1 <= ref ? j <= ref : j >= ref ; i = 1 <= ref ? ++ j : -- j ) {
184
- if ( children [ i ] === elem ) {
185
- angular . element ( children [ i - 1 ] ) . after ( newElem ) ;
186
- return ;
187
- }
188
- }
189
- throw new Error ( 'invalid DOM structure ' + elem . outerHTML ) ;
190
- }
191
- } ,
192
- height ( value ) {
193
- var self ;
194
- self = this ;
195
- if ( angular . isDefined ( value ) ) {
196
- if ( angular . isNumber ( value ) ) {
197
- value = value + 'px' ;
198
- }
199
- return css . call ( self , 'height' , value ) ;
200
- } else {
201
- return getWidthHeight ( this [ 0 ] , 'height' , 'base' ) ;
202
- }
203
- } ,
204
- outerHeight ( option ) {
205
- return getWidthHeight ( this [ 0 ] , 'height' , option ? 'outerfull' : 'outer' ) ;
206
- } ,
207
-
208
- /*
209
- The offset setter method is not implemented
210
- */
211
- offset ( value ) {
212
- let docElem , win ;
213
- let self = this ;
214
- let box = {
215
- top : 0 ,
216
- left : 0
217
- } ;
218
- let elem = self [ 0 ] ;
219
- let doc = elem && elem . ownerDocument ;
220
-
221
- if ( arguments . length ) {
222
- if ( value === undefined ) {
223
- return self ;
224
- }
225
- // TODO: implement setter
226
- throw new Error ( 'offset setter method is not implemented' ) ;
227
- }
228
-
229
- if ( ! doc ) {
230
- return ;
231
- }
232
-
233
- docElem = doc . documentElement ;
234
-
235
- // TODO: Make sure it's not a disconnected DOM node
236
-
237
- if ( elem . getBoundingClientRect != null ) {
238
- box = elem . getBoundingClientRect ( ) ;
239
- }
240
-
241
- win = doc . defaultView || doc . parentWindow ;
242
-
243
- return {
244
- top : box . top + ( win . pageYOffset || docElem . scrollTop ) - ( docElem . clientTop || 0 ) ,
245
- left : box . left + ( win . pageXOffset || docElem . scrollLeft ) - ( docElem . clientLeft || 0 )
246
- } ;
247
- } ,
248
- scrollTop ( value ) {
249
- return scrollTo ( this , 'top' , value ) ;
250
- } ,
251
- scrollLeft ( value ) {
252
- return scrollTo ( this , 'left' , value ) ;
253
- }
254
- } , ( value , key ) => {
255
- if ( ! element . prototype [ key ] ) {
256
- return element . prototype [ key ] = value ;
257
- }
258
- } ) ;
259
- }
6
+ registerFor : jqLiteExtrasRegister
260
7
} ;
261
8
}
262
- ] )
9
+ )
263
10
. run ( [
264
11
'$log' ,
265
12
'$window' ,
@@ -269,4 +16,4 @@ angular.module('ui.scroll.jqlite', ['ui.scroll'])
269
16
return jqLiteExtras . registerFor ( angular . element ) ;
270
17
}
271
18
}
272
- ] ) ;
19
+ ] ) ;
0 commit comments