< template>  
    < div  class = " el-quarter-wrap" >  
      < el-popover  width = " 280"   v-model = " visible" >  
        < template  #reference >  
          < el-input  v-model = " quarterDate"   placeholder = " 请选择季度"   clearable  :prefix-icon = " Calendar"   readonly 
           @change = " quarterDateChange"   style = " width :  300px; " >  
            < template  #suffix >  
              < el-icon  v-if = " quarterDate"   class = " el-quarter-clear"   @click = " clearData" >  
                < Close  />  
              </ el-icon>  
            </ template>  
          </ el-input>  
        </ template>  
        < div  class = " el-quarter__header" >  
          < span  class = " el-quarter-btn el-quarter-btn__pre"   @click = " changeShowYear(-1)" >  
            < el-icon>  
              < DArrowLeft  />  
            </ el-icon>  
          </ span>  
          < div  class = " el-quarter__header-text"   @click = " showYearList" >  
            {{ quarterTitle }}
          </ div>  
  
          < span  class = " el-quarter-btn el-quarter-btn__next"   @click = " changeShowYear(1)" >  
            < el-icon>  
              < DArrowRight  />  
            </ el-icon>  
          </ span>  
        </ div>  
  
        < div  class = " el-quarter__content"   v-if = " !isEditYear" >  
          < div  class = " el-quarter__row" >  
            < span  
                class = " quarter-index"   
                :class = " { 'is-active': showYear === pickerYear && quarterIndex === index }"   
                @click = " pickerQuarte(index)"  
                v-for = " (item, index) in ['第一季度', '第二季度','第三季度','第四季度',]"  
            >  {{ item }}</ span>  
          </ div>  
        </ div>  
  
        < div  class = " el-year__content"   v-else >  
          < div  class = " el-year-item"   v-for = " item in yearList" >  
            < div  class = " cell"   :class = " { 'is-active': showYear == item }"   @click = " selectYear(item)" >  
              {{ item }}
            </ div>  
          </ div>  
        </ div>  
  
      </ el-popover>  
    </ div>  
  </ template>  
  
  < script  lang = " ts"   setup > 
  import  {  DArrowLeft,  DArrowRight,  Close,  Calendar }  from  '@element-plus/icons-vue' 
  import  {  computed,  onMounted,  reactive,  ref }  from  'vue' 
  let  visible =  ref ( false ) 
  
  let  quarterDate =  ref ( '' ) 
  let  pickerYear =  ref ( '' )  as  any
  let  showYear =  ref ( '' )  as  any
  let  quarterIndex =  ref ( - 1 ) 
  let  isEditYear =  ref ( false ) 
  let  startYear =  ref ( '' )  as  any
  let  yearList =  reactive ( [ ]  as  any) 
  
  const  quarterTitle =  computed ( ( )  =>  { 
    if ( isEditYear. value)  { 
      return  startYear. value+  "年 - "  +  ( startYear. value +  9 )  +  "年" 
    }  else  { 
      return  showYear. value +  '年' 
    } 
  } ) 
  function  pickerQuarte ( index : number)  { 
    quarterIndex. value =  index
    pickerYear. value =  showYear. value
    quarterDate. value =  pickerYear. value +  "-Q"  +  index
  } 
  function  changeShowYear ( num :  number)  { 
    if ( isEditYear. value)  { 
      startYear. value =  startYear. value +  ( num *  10 ) 
      changeYearList ( ) 
    }  else  { 
      showYear. value =  showYear. value +  num
    } 
  } 
  
  function  clearData ( )  { 
    quarterDate. value =  '' 
    pickerYear. value =  '' 
    showYear. value =  new  Date ( ) . getFullYear ( ) 
    quarterIndex. value =  0 
  } 
  function  quarterDateChange ( value : any)  { 
    const  splitArray =  value. split ( '-Q' ) 
    if  ( splitArray. length <  2 )  { 
      pickerYear. value =  '' 
      showYear. value =  new  Date ( ) . getFullYear ( ) 
      quarterIndex. value =  0 
    }  else  { 
      pickerYear. value =  splitArray[ 0 ] 
      showYear. value =  splitArray[ 0 ] 
      quarterIndex. value =  splitArray[ 1 ] 
    } 
  } 
  function  changeYearList ( )  { 
    yearList =  [ ] 
    let  year =  startYear. value
    for  ( let  i =  0 ;  i <  10 ;  i++ )  { 
      yearList. push ( year++ ) 
    } 
  } 
  
  function  showYearList ( )  { 
    if ( ! isEditYear. value)  { 
      startYear. value =  Number ( Math. floor ( showYear. value /  10 )  +  '0' ) 
      changeYearList ( ) 
      isEditYear. value =  true 
    }  else  { 
      isEditYear. value =  false 
    } 
   
  } 
  function  selectYear ( item : any)  { 
    showYear. value =  item
    isEditYear. value =  false 
  } 
  
  onMounted ( ( )  =>  { 
    showYear. value =  new  Date ( ) . getFullYear ( ) 
    startYear. value =  Number ( Math. floor ( showYear. value /  10 )  +  '0' ) 
    changeYearList ( ) 
  } ) 
   </ script>  
  < style  lang = " scss" > 
  .el-quarter__header  { 
    padding-bottom :  12px; 
    border-bottom :  1px solid #ebeef5; 
    display :  flex; 
    align-items :  center; 
    justify-content :  space-between; 
    .el-quarter-btn  { 
      font-size :  12px; 
    } 
    .el-quarter__header-text  { 
      font-size :  16px; 
      font-weight :  500; 
      text-align :  center; 
      cursor :  pointer; 
    } 
  } 
  .el-quarter__content  { 
    min-height :  60px; 
    box-sizing :  border-box; 
    display :  flex; 
    flex-direction :  column; 
    justify-content :  space-around; 
    .el-quarter__row  { 
      display :  flex; 
      justify-content :  space-around; 
      flex-wrap :  wrap; 
      .quarter-index  { 
        display :  block; 
        padding :  4px 10px; 
        width :  50%; 
        text-align :  center; 
        cursor :  pointer; 
        &:hover  { 
          color :  #337ecc
        } 
      } 
      .is-active  { 
        color :  #409eff
      } 
    } 
  } 
  .el-quarter-clear  { 
    position :  relative; 
    color :  #909399; 
    display :  none; 
    height :  12px; 
    width :  12px; 
    cursor :  pointer; 
    &::after  { 
      content :  '' ; 
      position :  absolute; 
      height :  14px; 
      width :  14px; 
      margin :  auto; 
      border-radius :  50%; 
      border :  1px solid #909399
    } 
  } 
  .el-input  { 
    &:hover  { 
      .el-quarter-clear  { 
        display :  flex; 
      } 
    } 
  } 
  .el-year__content  { 
    min-height :  100px; 
    display :  flex; 
    padding :  10px 0; 
    flex-wrap :  wrap; 
    .el-year-item  { 
      width :  calc ( 100% / 4) ; 
      display :  flex; 
      align-items :  center; 
      justify-content :  center; 
      .cell  { 
        padding :  4px 10px; 
        width :  fit-content; 
        cursor :  pointer; 
        cursor :  pointer; 
        white-space :  nowrap; 
        &:hover  { 
          color :  #337ecc
        } 
      } 
      .is-active  { 
        color :  #409eff
      } 
    } 
  }  </ style>