1975
1975
}
1976
1976
1977
1977
function generateMonthElement ( date , month ) {
1978
- var range ;
1979
- var startDate = opt . startDate ? moment ( opt . startDate ) . add ( ! opt . singleMonth && month === 'month2' ? 1 : 0 , 'month' ) : false ;
1980
- var endDate = opt . endDate ? moment ( opt . endDate ) . add ( ! opt . singleMonth && month === 'month1' ? - 1 : 0 , 'month' ) : false ;
1981
1978
date = moment ( date ) ;
1979
+ var currentMonth = date . get ( 'month' ) ;
1980
+ var currentMonthName = nameMonth ( currentMonth ) ;
1981
+ var nonSelectableMonth = '<div class="month-element">' + currentMonthName + '</div>' ;
1982
1982
1983
- if ( ! opt . monthSelect ||
1984
- startDate && endDate && startDate . isSame ( endDate , 'month' ) ) {
1985
- return '<div class="month-element">' + nameMonth ( date . get ( 'month' ) ) + '</div>' ;
1986
- }
1983
+ if ( ! opt . monthSelect ) { return nonSelectableMonth ; }
1987
1984
1988
- range = [
1989
- startDate && date . isSame ( startDate , 'year' ) ? startDate . get ( 'month' ) : 0 ,
1990
- date ? date . get ( 'month' ) : 11
1991
- ] ;
1992
-
1993
- if ( range [ 0 ] === range [ 1 ] ) {
1994
- return '<div class="month-element">' + nameMonth ( date . get ( 'month' ) ) + '</div>' ;
1995
- }
1985
+ var startDate = opt . startDate ? moment ( opt . startDate ) . add ( ! opt . singleMonth && month === 'month2' ? 1 : 0 , 'month' ) : false ;
1986
+ var endDate = opt . endDate ? moment ( opt . endDate ) . add ( ! opt . singleMonth && month === 'month1' ? - 1 : 0 , 'month' ) : false ;
1996
1987
1997
- return generateSelect (
1998
- 'month' ,
1999
- generateSelectData (
2000
- range ,
2001
- date . get ( 'month' ) ,
2002
- function ( value ) { return nameMonth ( value ) ; }
2003
- )
2004
- ) ;
1988
+ var minSelectableMonth = startDate && date . isSame ( startDate , 'year' ) ? startDate . get ( 'month' ) : 0 ;
1989
+ var maxSelectableMonth = endDate && date . isSame ( endDate , 'year' ) ? endDate . get ( 'month' ) : 11 ;
1990
+ var minVisibleMonth = Math . min ( minSelectableMonth , currentMonth ) ;
1991
+ var maxVisibleMonth = Math . max ( maxSelectableMonth , currentMonth ) ;
1992
+
1993
+ if ( minVisibleMonth === maxVisibleMonth ) { return nonSelectableMonth ; }
1994
+
1995
+ var selectData = generateSelectData (
1996
+ {
1997
+ minSelectable : minSelectableMonth ,
1998
+ maxSelectable : maxSelectableMonth ,
1999
+ minVisible : minVisibleMonth ,
2000
+ maxVisible : maxVisibleMonth ,
2001
+ } ,
2002
+ currentMonth ,
2003
+ function ( value ) { return nameMonth ( value ) ; }
2004
+ )
2005
+ return generateSelect ( 'month' , selectData ) ;
2005
2006
}
2006
2007
2007
2008
function generateYearElement ( date , month ) {
2008
2009
date = moment ( date ) ;
2009
- var startDate = opt . startDate ? moment ( opt . startDate ) . add ( ! opt . singleMonth && month === 'month2' ? 1 : 0 , 'month' ) : false ;
2010
- var endDate = opt . endDate ? moment ( opt . endDate ) . add ( ! opt . singleMonth && month === 'month1' ? - 1 : 0 , 'month' ) : false ;
2011
- var fullYear = date . get ( 'year' ) ;
2012
- var isYearFunction = opt . yearSelect && typeof opt . yearSelect === 'function' ;
2013
- var range ;
2014
-
2015
- if ( ! opt . yearSelect ||
2016
- startDate && endDate && startDate . isSame ( moment ( endDate ) , 'year' ) ) {
2017
- return '<div class="month-element">' + fullYear + '</div>' ;
2018
- }
2019
-
2020
- range = isYearFunction ? opt . yearSelect ( fullYear ) : opt . yearSelect . slice ( ) ;
2010
+ var currentYear = date . get ( 'year' ) ;
2011
+ var nonSelectableMonth = '<div class="month-element">' + currentYear + '</div>' ;
2021
2012
2022
- range = [
2023
- startDate ? Math . max ( range [ 0 ] , startDate . get ( 'year' ) ) : Math . min ( range [ 0 ] , fullYear ) ,
2024
- endDate ? Math . min ( range [ 1 ] , endDate . get ( 'year' ) ) : Math . max ( range [ 1 ] , fullYear )
2025
- ] ;
2013
+ if ( ! opt . yearSelect ) { return nonSelectableMonth ; }
2026
2014
2027
- return generateSelect ( 'year' , generateSelectData ( range , fullYear ) ) ;
2015
+ var isYearFunction = opt . yearSelect && typeof opt . yearSelect === 'function' ;
2016
+ var startDate = opt . startDate ? moment ( opt . startDate ) . add ( ! opt . singleMonth && month === 'month2' ? 1 : 0 , 'month' ) : false ;
2017
+ var endDate = opt . endDate ? moment ( opt . endDate ) . add ( ! opt . singleMonth && month === 'month1' ? - 1 : 0 , 'month' ) : false ;
2018
+ var range = isYearFunction ? opt . yearSelect ( currentYear ) : opt . yearSelect . slice ( ) ;
2019
+
2020
+ var minSelectableYear = startDate ? Math . max ( range [ 0 ] , startDate . get ( 'year' ) ) : Math . min ( range [ 0 ] , currentYear ) ;
2021
+ var maxSelectableYear = endDate ? Math . min ( range [ 1 ] , endDate . get ( 'year' ) ) : Math . max ( range [ 1 ] , currentYear ) ;
2022
+ var minVisibleYear = Math . min ( minSelectableYear , currentYear ) ;
2023
+ var maxVisibleYear = Math . max ( maxSelectableYear , currentYear ) ;
2024
+
2025
+ if ( minVisibleYear === maxVisibleYear ) { return nonSelectableMonth ; }
2026
+
2027
+ var selectData = generateSelectData (
2028
+ {
2029
+ minSelectable : minSelectableYear ,
2030
+ maxSelectable : maxSelectableYear ,
2031
+ minVisible : minVisibleYear ,
2032
+ maxVisible : maxVisibleYear ,
2033
+ } ,
2034
+ currentYear
2035
+ )
2036
+ return generateSelect ( 'year' , selectData ) ;
2028
2037
}
2029
2038
2030
2039
2031
2040
function generateSelectData ( range , current , valueBeautifier ) {
2032
2041
var data = [ ] ;
2033
2042
valueBeautifier = valueBeautifier || function ( value ) { return value ; } ;
2034
2043
2035
- for ( var i = range [ 0 ] ; i <= range [ 1 ] ; i ++ ) {
2044
+ for ( var i = range . minVisible ; i <= range . maxVisible ; i ++ ) {
2036
2045
data . push ( {
2037
2046
value : i ,
2038
2047
text : valueBeautifier ( i ) ,
2039
- isCurrent : i === current
2048
+ selected : i === current ,
2049
+ disabled : ( ( i < range . minSelectable ) || ( i > range . maxSelectable ) ) ,
2040
2050
} ) ;
2041
2051
}
2042
2052
2048
2058
var current ;
2049
2059
2050
2060
for ( var i = 0 , l = data . length ; i < l ; i ++ ) {
2051
- select += '<option value="' + data [ i ] . value + '"' + ( data [ i ] . isCurrent ? ' selected' : '' ) + '>' ;
2052
- select += data [ i ] . text ;
2053
- select += '</option>' ;
2054
-
2055
- if ( data [ i ] . isCurrent ) {
2056
- current = data [ i ] . text ;
2061
+ var item = data [ i ] ;
2062
+ select += '<option value="' + item . value + '"' +
2063
+ ( item . selected ? ' selected' : '' ) +
2064
+ ( item . disabled ? ' disabled' : '' ) + '>' +
2065
+ item . text + '</option>' ;
2066
+
2067
+ if ( item . selected ) {
2068
+ current = item . text ;
2057
2069
}
2058
2070
}
2059
2071
2586
2598
}
2587
2599
2588
2600
} ;
2589
- } ) ) ;
2601
+ } ) ) ;
0 commit comments