@@ -6,6 +6,8 @@ var NumeralFormatter = function (numeralDecimalMark,
6
6
numeralThousandsGroupStyle ,
7
7
numeralPositiveOnly ,
8
8
stripLeadingZeroes ,
9
+ prefix ,
10
+ signBeforePrefix ,
9
11
delimiter ) {
10
12
var owner = this ;
11
13
@@ -15,6 +17,8 @@ var NumeralFormatter = function (numeralDecimalMark,
15
17
owner . numeralThousandsGroupStyle = numeralThousandsGroupStyle || NumeralFormatter . groupStyle . thousand ;
16
18
owner . numeralPositiveOnly = ! ! numeralPositiveOnly ;
17
19
owner . stripLeadingZeroes = stripLeadingZeroes !== false ;
20
+ owner . prefix = ( prefix || prefix === '' ) ? prefix : '' ;
21
+ owner . signBeforePrefix = ! ! signBeforePrefix ;
18
22
owner . delimiter = ( delimiter || delimiter === '' ) ? delimiter : ',' ;
19
23
owner . delimiterRE = delimiter ? new RegExp ( '\\' + delimiter , 'g' ) : '' ;
20
24
} ;
@@ -32,7 +36,7 @@ NumeralFormatter.prototype = {
32
36
} ,
33
37
34
38
format : function ( value ) {
35
- var owner = this , parts , partInteger , partDecimal = '' ;
39
+ var owner = this , parts , partSign , partSignAndPrefix , partInteger , partDecimal = '' ;
36
40
37
41
// strip alphabet letters
38
42
value = value . replace ( / [ A - Z a - z ] / g, '' )
@@ -60,6 +64,17 @@ NumeralFormatter.prototype = {
60
64
value = value . replace ( / ^ ( - ) ? 0 + (? = \d ) / , '$1' ) ;
61
65
}
62
66
67
+ partSign = value . slice ( 0 , 1 ) === '-' ? '-' : '' ;
68
+ if ( typeof owner . prefix != 'undefined' ) {
69
+ if ( owner . signBeforePrefix ) {
70
+ partSignAndPrefix = partSign + owner . prefix ;
71
+ } else {
72
+ partSignAndPrefix = owner . prefix + partSign ;
73
+ }
74
+ } else {
75
+ partSignAndPrefix = partSign ;
76
+ }
77
+
63
78
partInteger = value ;
64
79
65
80
if ( value . indexOf ( owner . numeralDecimalMark ) >= 0 ) {
@@ -68,8 +83,12 @@ NumeralFormatter.prototype = {
68
83
partDecimal = owner . numeralDecimalMark + parts [ 1 ] . slice ( 0 , owner . numeralDecimalScale ) ;
69
84
}
70
85
86
+ if ( partSign === '-' ) {
87
+ partInteger = partInteger . slice ( 1 ) ;
88
+ }
89
+
71
90
if ( owner . numeralIntegerScale > 0 ) {
72
- partInteger = partInteger . slice ( 0 , owner . numeralIntegerScale + ( value . slice ( 0 , 1 ) === '-' ? 1 : 0 ) ) ;
91
+ partInteger = partInteger . slice ( 0 , owner . numeralIntegerScale ) ;
73
92
}
74
93
75
94
switch ( owner . numeralThousandsGroupStyle ) {
@@ -89,18 +108,34 @@ NumeralFormatter.prototype = {
89
108
break ;
90
109
}
91
110
92
- return partInteger . toString ( ) + ( owner . numeralDecimalScale > 0 ? partDecimal . toString ( ) : '' ) ;
111
+ return partSignAndPrefix + partInteger . toString ( ) + ( owner . numeralDecimalScale > 0 ? partDecimal . toString ( ) : '' ) ;
93
112
}
94
113
} ;
95
114
96
115
var NumeralFormatter_1 = NumeralFormatter ;
97
116
98
- var DateFormatter = function ( datePattern ) {
117
+ var DateFormatter = function ( datePattern , dateMin , dateMax ) {
99
118
var owner = this ;
100
119
101
120
owner . date = [ ] ;
102
121
owner . blocks = [ ] ;
103
122
owner . datePattern = datePattern ;
123
+ owner . dateMin = dateMin
124
+ . split ( '-' )
125
+ . reverse ( )
126
+ . map ( function ( x ) {
127
+ return parseInt ( x , 10 ) ;
128
+ } ) ;
129
+ if ( owner . dateMin . length === 2 ) owner . dateMin . unshift ( 0 ) ;
130
+
131
+ owner . dateMax = dateMax
132
+ . split ( '-' )
133
+ . reverse ( )
134
+ . map ( function ( x ) {
135
+ return parseInt ( x , 10 ) ;
136
+ } ) ;
137
+ if ( owner . dateMax . length === 2 ) owner . dateMax . unshift ( 0 ) ;
138
+
104
139
owner . initBlocks ( ) ;
105
140
} ;
106
141
@@ -219,18 +254,77 @@ DateFormatter.prototype = {
219
254
date = this . getFixedDate ( day , month , year ) ;
220
255
}
221
256
257
+ // mm-yy || yy-mm
258
+ if ( value . length === 4 && ( datePattern [ 0 ] === 'y' || datePattern [ 1 ] === 'y' ) ) {
259
+ monthStartIndex = datePattern [ 0 ] === 'm' ? 0 : 2 ;
260
+ yearStartIndex = 2 - monthStartIndex ;
261
+ month = parseInt ( value . slice ( monthStartIndex , monthStartIndex + 2 ) , 10 ) ;
262
+ year = parseInt ( value . slice ( yearStartIndex , yearStartIndex + 2 ) , 10 ) ;
263
+
264
+ fullYearDone = value . slice ( yearStartIndex , yearStartIndex + 2 ) . length === 2 ;
265
+
266
+ date = [ 0 , month , year ] ;
267
+ }
268
+
269
+ // mm-yyyy || yyyy-mm
270
+ if ( value . length === 6 && ( datePattern [ 0 ] === 'Y' || datePattern [ 1 ] === 'Y' ) ) {
271
+ monthStartIndex = datePattern [ 0 ] === 'm' ? 0 : 4 ;
272
+ yearStartIndex = 2 - 0.5 * monthStartIndex ;
273
+ month = parseInt ( value . slice ( monthStartIndex , monthStartIndex + 2 ) , 10 ) ;
274
+ year = parseInt ( value . slice ( yearStartIndex , yearStartIndex + 4 ) , 10 ) ;
275
+
276
+ fullYearDone = value . slice ( yearStartIndex , yearStartIndex + 4 ) . length === 4 ;
277
+
278
+ date = [ 0 , month , year ] ;
279
+ }
280
+
281
+ date = owner . getRangeFixedDate ( date ) ;
222
282
owner . date = date ;
223
283
224
- return date . length === 0 ? value : datePattern . reduce ( function ( previous , current ) {
284
+ var result = date . length === 0 ? value : datePattern . reduce ( function ( previous , current ) {
225
285
switch ( current ) {
226
286
case 'd' :
227
- return previous + owner . addLeadingZero ( date [ 0 ] ) ;
287
+ return previous + ( date [ 0 ] === 0 ? '' : owner . addLeadingZero ( date [ 0 ] ) ) ;
228
288
case 'm' :
229
- return previous + owner . addLeadingZero ( date [ 1 ] ) ;
230
- default :
231
- return previous + ( fullYearDone ? owner . addLeadingZeroForYear ( date [ 2 ] ) : '' ) ;
289
+ return previous + ( date [ 1 ] === 0 ? '' : owner . addLeadingZero ( date [ 1 ] ) ) ;
290
+ case 'y' :
291
+ return previous + ( fullYearDone ? owner . addLeadingZeroForYear ( date [ 2 ] , false ) : '' ) ;
292
+ case 'Y' :
293
+ return previous + ( fullYearDone ? owner . addLeadingZeroForYear ( date [ 2 ] , true ) : '' ) ;
232
294
}
233
295
} , '' ) ;
296
+
297
+ return result ;
298
+ } ,
299
+
300
+ getRangeFixedDate : function ( date ) {
301
+ var owner = this ,
302
+ datePattern = owner . datePattern ,
303
+ dateMin = owner . dateMin || [ ] ,
304
+ dateMax = owner . dateMax || [ ] ;
305
+
306
+ if ( ! date . length || ( dateMin . length < 3 && dateMax . length < 3 ) ) return date ;
307
+
308
+ if (
309
+ datePattern . find ( function ( x ) {
310
+ return x . toLowerCase ( ) === 'y' ;
311
+ } ) &&
312
+ date [ 2 ] === 0
313
+ ) return date ;
314
+
315
+ if ( dateMax . length && ( dateMax [ 2 ] < date [ 2 ] || (
316
+ dateMax [ 2 ] === date [ 2 ] && ( dateMax [ 1 ] < date [ 1 ] || (
317
+ dateMax [ 1 ] === date [ 1 ] && dateMax [ 0 ] < date [ 0 ]
318
+ ) )
319
+ ) ) ) return dateMax ;
320
+
321
+ if ( dateMin . length && ( dateMin [ 2 ] > date [ 2 ] || (
322
+ dateMin [ 2 ] === date [ 2 ] && ( dateMin [ 1 ] > date [ 1 ] || (
323
+ dateMin [ 1 ] === date [ 1 ] && dateMin [ 0 ] > date [ 0 ]
324
+ ) )
325
+ ) ) ) return dateMin ;
326
+
327
+ return date ;
234
328
} ,
235
329
236
330
getFixedDate : function ( day , month , year ) {
@@ -253,8 +347,12 @@ DateFormatter.prototype = {
253
347
return ( number < 10 ? '0' : '' ) + number ;
254
348
} ,
255
349
256
- addLeadingZeroForYear : function ( number ) {
257
- return ( number < 10 ? '000' : ( number < 100 ? '00' : ( number < 1000 ? '0' : '' ) ) ) + number ;
350
+ addLeadingZeroForYear : function ( number , fullYearMode ) {
351
+ if ( fullYearMode ) {
352
+ return ( number < 10 ? '000' : ( number < 100 ? '00' : ( number < 1000 ? '0' : '' ) ) ) + number ;
353
+ }
354
+
355
+ return ( number < 10 ? '0' : '' ) + number ;
258
356
}
259
357
} ;
260
358
@@ -511,8 +609,7 @@ var CreditCardDetector = {
511
609
visa : [ 4 , 4 , 4 , 4 ] ,
512
610
mir : [ 4 , 4 , 4 , 4 ] ,
513
611
unionPay : [ 4 , 4 , 4 , 4 ] ,
514
- general : [ 4 , 4 , 4 , 4 ] ,
515
- generalStrict : [ 4 , 4 , 4 , 7 ]
612
+ general : [ 4 , 4 , 4 , 4 ]
516
613
} ,
517
614
518
615
re : {
@@ -556,6 +653,14 @@ var CreditCardDetector = {
556
653
unionPay : / ^ 6 2 \d { 0 , 14 } /
557
654
} ,
558
655
656
+ getStrictBlocks : function ( block ) {
657
+ var total = block . reduce ( function ( prev , current ) {
658
+ return prev + current ;
659
+ } , 0 ) ;
660
+
661
+ return block . concat ( 19 - total ) ;
662
+ } ,
663
+
559
664
getInfo : function ( value , strictMode ) {
560
665
var blocks = CreditCardDetector . blocks ,
561
666
re = CreditCardDetector . re ;
@@ -568,24 +673,17 @@ var CreditCardDetector = {
568
673
569
674
for ( var key in re ) {
570
675
if ( re [ key ] . test ( value ) ) {
571
- var block ;
572
-
573
- if ( strictMode ) {
574
- block = blocks . generalStrict ;
575
- } else {
576
- block = blocks [ key ] ;
577
- }
578
-
676
+ var matchedBlocks = blocks [ key ] ;
579
677
return {
580
678
type : key ,
581
- blocks : block
679
+ blocks : strictMode ? this . getStrictBlocks ( matchedBlocks ) : matchedBlocks
582
680
} ;
583
681
}
584
682
}
585
683
586
684
return {
587
- type : 'unknown' ,
588
- blocks : strictMode ? blocks . generalStrict : blocks . general
685
+ type : 'unknown' ,
686
+ blocks : strictMode ? this . getStrictBlocks ( blocks . general ) : blocks . general
589
687
} ;
590
688
}
591
689
} ;
@@ -778,6 +876,18 @@ var Util = {
778
876
} , 1 ) ;
779
877
} ,
780
878
879
+ // Check if input field is fully selected
880
+ checkFullSelection : function ( value ) {
881
+ try {
882
+ var selection = window . getSelection ( ) || document . getSelection ( ) || { } ;
883
+ return selection . toString ( ) . length === value . length ;
884
+ } catch ( ex ) {
885
+ // Ignore
886
+ }
887
+
888
+ return false ;
889
+ } ,
890
+
781
891
setSelection : function ( element , position , doc ) {
782
892
if ( element !== this . getActiveElement ( doc ) ) {
783
893
return ;
@@ -862,6 +972,8 @@ var DefaultProperties = {
862
972
// date
863
973
target . date = ! ! opts . date ;
864
974
target . datePattern = opts . datePattern || [ 'd' , 'm' , 'Y' ] ;
975
+ target . dateMin = opts . dateMin || '' ;
976
+ target . dateMax = opts . dateMax || '' ;
865
977
target . dateFormatter = { } ;
866
978
867
979
// numeral
@@ -872,6 +984,7 @@ var DefaultProperties = {
872
984
target . numeralThousandsGroupStyle = opts . numeralThousandsGroupStyle || 'thousand' ;
873
985
target . numeralPositiveOnly = ! ! opts . numeralPositiveOnly ;
874
986
target . stripLeadingZeroes = opts . stripLeadingZeroes !== false ;
987
+ target . signBeforePrefix = ! ! opts . signBeforePrefix ;
875
988
876
989
// others
877
990
target . numericOnly = target . creditCard || target . date || ! ! opts . numericOnly ;
@@ -1014,6 +1127,8 @@ Cleave.prototype = {
1014
1127
pps . numeralThousandsGroupStyle ,
1015
1128
pps . numeralPositiveOnly ,
1016
1129
pps . stripLeadingZeroes ,
1130
+ pps . prefix ,
1131
+ pps . signBeforePrefix ,
1017
1132
pps . delimiter
1018
1133
) ;
1019
1134
} ,
@@ -1038,7 +1153,7 @@ Cleave.prototype = {
1038
1153
return ;
1039
1154
}
1040
1155
1041
- pps . dateFormatter = new Cleave . DateFormatter ( pps . datePattern ) ;
1156
+ pps . dateFormatter = new Cleave . DateFormatter ( pps . datePattern , pps . dateMin , pps . dateMax ) ;
1042
1157
pps . blocks = pps . dateFormatter . getBlocks ( ) ;
1043
1158
pps . blocksLength = pps . blocks . length ;
1044
1159
pps . maxLength = Cleave . Util . getMaxLength ( pps . blocks ) ;
@@ -1101,11 +1216,13 @@ Cleave.prototype = {
1101
1216
} ,
1102
1217
1103
1218
onCut : function ( e ) {
1219
+ if ( ! Cleave . Util . checkFullSelection ( this . element . value ) ) return ;
1104
1220
this . copyClipboardData ( e ) ;
1105
1221
this . onInput ( '' ) ;
1106
1222
} ,
1107
1223
1108
1224
onCopy : function ( e ) {
1225
+ if ( ! Cleave . Util . checkFullSelection ( this . element . value ) ) return ;
1109
1226
this . copyClipboardData ( e ) ;
1110
1227
} ,
1111
1228
@@ -1163,8 +1280,10 @@ Cleave.prototype = {
1163
1280
1164
1281
// numeral formatter
1165
1282
if ( pps . numeral ) {
1166
- if ( pps . prefix && ( ! pps . noImmediatePrefix || value . length ) ) {
1167
- pps . result = pps . prefix + pps . numeralFormatter . format ( value ) ;
1283
+ // Do not show prefix when noImmediatePrefix is specified
1284
+ // This mostly because we need to show user the native input placeholder
1285
+ if ( pps . prefix && pps . noImmediatePrefix && value . length === 0 ) {
1286
+ pps . result = '' ;
1168
1287
} else {
1169
1288
pps . result = pps . numeralFormatter . format ( value ) ;
1170
1289
}
0 commit comments