@@ -343,40 +343,12 @@ class Calendar extends Framework7Class {
343343 }
344344
345345 function onYearSelectorClick ( ) {
346- $el . append ( calendar . renderYearPicker ( ) ) ;
347- const $currentEl = $el . find ( '.calendar-year-picker-item-current' ) ;
348- const $yearPickerEl = $el . find ( '.calendar-year-picker' ) ;
349- if ( ! $currentEl || ! $currentEl . length ) return ;
350- $yearPickerEl . scrollTop (
351- $currentEl [ 0 ] . offsetTop -
352- $yearPickerEl [ 0 ] . offsetHeight / 2 +
353- $currentEl [ 0 ] . offsetHeight / 2 ,
354- ) ;
355- }
356-
357- function onYearSelectorItemClick ( ) {
358- const $clickedEl = $ ( this ) ;
359- if ( $clickedEl . hasClass ( 'calendar-year-picker-item-current' ) ) {
360- $el . find ( '.calendar-year-picker' ) . remove ( ) ;
361- return ;
362- }
363- $el
364- . find ( '.calendar-year-picker-item-current' )
365- . add ( $clickedEl )
366- . toggleClass ( 'calendar-year-picker-item-current' ) ;
367- const year = parseInt ( $clickedEl . attr ( 'data-year' ) , 10 ) ;
368- calendar . setYearMonth ( year , undefined , 0 ) ;
369- setTimeout ( ( ) => {
370- $el . find ( '.calendar-year-picker' ) . remove ( ) ;
371- } , 200 ) ;
346+ calendar . openYearPicker ( ) ;
372347 }
373348
374349 function onTimeSelectorClick ( ) {
375350 calendar . openTimePicker ( ) ;
376351 }
377- function onTimePickerCloseClick ( ) {
378- calendar . closeTimePicker ( ) ;
379- }
380352
381353 const passiveListener =
382354 app . touchEvents . start === 'touchstart' && getSupport ( ) . passiveListener
@@ -393,11 +365,9 @@ class Calendar extends Framework7Class {
393365 }
394366 if ( calendar . params . yearPicker ) {
395367 $el . find ( '.current-year-value' ) . on ( 'click' , onYearSelectorClick ) ;
396- $el . on ( 'click' , '.calendar-year-picker-item' , onYearSelectorItemClick ) ;
397368 }
398369 if ( calendar . hasTimePicker ) {
399370 $el . find ( '.calendar-time-selector a' ) . on ( 'click' , onTimeSelectorClick ) ;
400- $el . on ( 'click' , '.calendar-time-picker-close' , onTimePickerCloseClick ) ;
401371 }
402372 // Day clicks
403373 $wrapperEl . on ( 'click' , handleDayClick ) ;
@@ -419,11 +389,9 @@ class Calendar extends Framework7Class {
419389 }
420390 if ( calendar . params . yearPicker ) {
421391 $el . find ( '.current-year-value' ) . off ( 'click' , onYearSelectorClick ) ;
422- $el . off ( 'click' , '.calendar-year-picker-item' , onYearSelectorItemClick ) ;
423392 }
424393 if ( calendar . hasTimePicker ) {
425394 $el . find ( '.calendar-time-selector a' ) . off ( 'click' , onTimeSelectorClick ) ;
426- $el . off ( 'click' , '.calendar-time-picker-close' , onTimePickerCloseClick ) ;
427395 }
428396 $wrapperEl . off ( 'click' , handleDayClick ) ;
429397 if ( calendar . params . touchMove ) {
@@ -1466,37 +1434,6 @@ class Calendar extends Framework7Class {
14661434 ) ;
14671435 }
14681436
1469- renderYearPicker ( ) {
1470- const calendar = this ;
1471- const currentYear = calendar . currentYear ;
1472- let yearMin = calendar . params . yearPickerMin || new Date ( ) . getFullYear ( ) - 100 ;
1473- if ( calendar . params . minDate ) {
1474- yearMin = Math . max ( yearMin , new Date ( calendar . params . minDate ) . getFullYear ( ) ) ;
1475- }
1476- let yearMax = calendar . params . yearPickerMax || new Date ( ) . getFullYear ( ) + 100 ;
1477- if ( calendar . params . maxDate ) {
1478- yearMax = Math . min ( yearMax , new Date ( calendar . params . maxDate ) . getFullYear ( ) ) ;
1479- }
1480- const years = [ ] ;
1481- for ( let i = yearMin ; i <= yearMax ; i += 1 ) {
1482- years . push ( i ) ;
1483- }
1484- return (
1485- < div class = "calendar-year-picker" >
1486- { years . map ( ( year ) => (
1487- < div
1488- data-year = { year }
1489- class = { `calendar-year-picker-item ${
1490- year === currentYear ? 'calendar-year-picker-item-current' : ''
1491- } `}
1492- >
1493- < span > { calendar . yearFormatter ( new Date ( ) . setFullYear ( year ) ) } </ span >
1494- </ div >
1495- ) ) }
1496- </ div >
1497- ) ;
1498- }
1499-
15001437 // eslint-disable-next-line
15011438 renderTimeSelector ( ) {
15021439 const calendar = this ;
@@ -1653,6 +1590,80 @@ class Calendar extends Framework7Class {
16531590 return calendar . renderInline ( ) ;
16541591 }
16551592
1593+ openYearPicker ( ) {
1594+ const calendar = this ;
1595+ const { $el, app } = calendar ;
1596+ if ( ! $el || ! $el . length ) return ;
1597+
1598+ $el . append (
1599+ '<div class="popover calendar-popover calendar-year-picker-popover"><div class="popover-inner"><div class="calendar-year-picker"></div></div></div>' ,
1600+ ) ;
1601+
1602+ if ( calendar . modal ) {
1603+ calendar . modal . params . closeByOutsideClick = false ;
1604+ }
1605+
1606+ calendar . yearPickerPopover = app . popover . create ( {
1607+ el : $el . find ( '.calendar-year-picker-popover' ) ,
1608+ targetEl : $el . find ( '.calendar-year-selector' ) ,
1609+ backdrop : true ,
1610+ backdropUnique : true ,
1611+ on : {
1612+ close ( ) {
1613+ calendar . closeYearPicker ( ) ;
1614+ } ,
1615+ closed ( ) {
1616+ if ( calendar . modal ) {
1617+ calendar . modal . params . closeByOutsideClick = true ;
1618+ }
1619+ if ( calendar . yearPickerPopover . $el ) calendar . yearPickerPopover . $el . remove ( ) ;
1620+ calendar . yearPickerPopover . destroy ( ) ;
1621+ if ( calendar . yearPickerInstance ) {
1622+ calendar . yearPickerInstance . close ( ) ;
1623+ calendar . yearPickerInstance . destroy ( ) ;
1624+ }
1625+ delete calendar . yearPickerInstance ;
1626+ delete calendar . yearPickerPopover ;
1627+ } ,
1628+ } ,
1629+ } ) ;
1630+ calendar . yearPickerPopover . open ( ) ;
1631+
1632+ const currentYear = calendar . currentYear ;
1633+ let yearMin = calendar . params . yearPickerMin || new Date ( ) . getFullYear ( ) - 100 ;
1634+ if ( calendar . params . minDate ) {
1635+ yearMin = Math . max ( yearMin , new Date ( calendar . params . minDate ) . getFullYear ( ) ) ;
1636+ }
1637+ let yearMax = calendar . params . yearPickerMax || new Date ( ) . getFullYear ( ) + 100 ;
1638+ if ( calendar . params . maxDate ) {
1639+ yearMax = Math . min ( yearMax , new Date ( calendar . params . maxDate ) . getFullYear ( ) ) ;
1640+ }
1641+ const years = [ ] ;
1642+ for ( let i = yearMin ; i <= yearMax ; i += 1 ) {
1643+ years . push ( i ) ;
1644+ }
1645+
1646+ calendar . yearPickerInstance = app . picker . create ( {
1647+ containerEl : calendar . yearPickerPopover . $el . find ( '.calendar-year-picker' ) ,
1648+ value : [ currentYear ] ,
1649+ toolbar : false ,
1650+ rotateEffect : false ,
1651+ toolbarCloseText : calendar . params . toolbarCloseText ,
1652+ cols : [
1653+ {
1654+ values : years ,
1655+ } ,
1656+ ] ,
1657+ } ) ;
1658+ }
1659+
1660+ closeYearPicker ( ) {
1661+ const calendar = this ;
1662+ if ( calendar . yearPickerPopover && calendar . yearPickerPopover . opened )
1663+ calendar . yearPickerPopover . close ( ) ;
1664+ calendar . setYearMonth ( calendar . yearPickerInstance . value [ 0 ] , undefined , 0 ) ;
1665+ }
1666+
16561667 openTimePicker ( ) {
16571668 const calendar = this ;
16581669 const { $el, app, is12HoursFormat } = calendar ;
@@ -1681,7 +1692,7 @@ class Calendar extends Framework7Class {
16811692 if ( value [ 0 ] > 12 ) value [ 0 ] -= 12 ;
16821693 if ( value [ 0 ] === 0 ) value [ 0 ] = 12 ;
16831694 }
1684- if ( calendar . isPopover ( ) ) {
1695+ if ( calendar . modal ) {
16851696 calendar . modal . params . closeByOutsideClick = false ;
16861697 }
16871698
@@ -1695,7 +1706,7 @@ class Calendar extends Framework7Class {
16951706 calendar . closeTimePicker ( ) ;
16961707 } ,
16971708 closed ( ) {
1698- if ( calendar . isPopover ( ) ) {
1709+ if ( calendar . modal ) {
16991710 calendar . modal . params . closeByOutsideClick = true ;
17001711 }
17011712 if ( calendar . timePickerPopover . $el ) calendar . timePickerPopover . $el . remove ( ) ;
0 commit comments