123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 |
- /**
- * @Author: drfu*
- * @Description: 禁用、启用日期选择
- * @Date: 2020-10-08 21:22:09*
- * @Last Modified by: drfu
- * @Last Modified time: 2020-10-08 21:25:00
- * */
- import { getCalendarData, dateUtil, logger } from '../utils/index'
- import { renderCalendar } from '../render'
- function convertEnableAreaToTimestamp(timearea = []) {
- const start = timearea[0].split('-')
- const end = timearea[1].split('-')
- if (start.length !== 3 || end.length !== 3) {
- logger.warn('enableArea() 参数格式为: ["2018-2-1", "2018-3-1"]')
- return {}
- }
- const startTimestamp = dateUtil
- .newDate(start[0], start[1], start[2])
- .getTime()
- const endTimestamp = dateUtil.newDate(end[0], end[1], end[2]).getTime()
- return {
- start,
- end,
- startTimestamp,
- endTimestamp
- }
- }
- function isValiditeOfDateArea(dateArea) {
- const {
- start,
- end,
- startTimestamp,
- endTimestamp
- } = convertEnableAreaToTimestamp(dateArea)
- if (!start || !end) return
- const datesCountOfStart = dateUtil.getDatesCountOfMonth(start[0], start[1])
- const datesCountOfEnd = dateUtil.getDatesCountOfMonth(end[0], end[1])
- if (start[2] > datesCountOfStart || start[2] < 1) {
- logger.warn('enableArea() 开始日期错误,指定日期不在指定月份天数范围内')
- return false
- } else if (start[1] > 12 || start[1] < 1) {
- logger.warn('enableArea() 开始日期错误,月份超出1-12月份')
- return false
- } else if (end[2] > datesCountOfEnd || end[2] < 1) {
- logger.warn('enableArea() 截止日期错误,指定日期不在指定月份天数范围内')
- return false
- } else if (end[1] > 12 || end[1] < 1) {
- logger.warn('enableArea() 截止日期错误,月份超出1-12月份')
- return false
- } else if (startTimestamp > endTimestamp) {
- logger.warn('enableArea()参数最小日期大于了最大日期')
- return false
- } else {
- return true
- }
- }
- function handleDisableMode(calendarConfig) {
- const { disableMode } = calendarConfig
- if (!disableMode) return {}
- const disableBound =
- dateUtil.getTimeStamp(disableMode.date) || dateUtil.todayTimestamp()
- return {
- disableBound,
- disableType: disableMode.type
- }
- }
- function disabledByConfig(dateInfo, currentDate, calendarConfig) {
- const date = { ...dateInfo }
- const { disableType, disableBound } = handleDisableMode(calendarConfig)
- if (
- (disableType === 'before' && disableBound && currentDate < disableBound) ||
- (disableType === 'after' && disableBound && currentDate > disableBound)
- ) {
- date.disable = true
- } else {
- date.disable = false
- }
- return date
- }
- export default () => {
- return {
- name: 'enable',
- beforeRender(calendarData = {}, calendarConfig = {}) {
- const {
- dates,
- enableArea,
- enableDates,
- disableDates,
- renderCausedBy
- } = calendarData
- const _dates = [...dates].map(date => {
- let item = { ...date }
- const timeStr = dateUtil.toTimeStr(date)
- const timestamp = +dateUtil.getTimeStamp(item)
- if (renderCausedBy === 'enableDates') {
- if (enableDates && enableDates.length) {
- if (enableDates.includes(timeStr)) {
- item.disable = false
- } else {
- item.disable = true
- }
- return item
- }
- } else if (renderCausedBy === 'enableArea') {
- if (enableArea && enableArea.length) {
- const [startTimestamp, endTimestamp] = enableArea || []
- const ifOutofArea =
- +startTimestamp > timestamp || timestamp > +endTimestamp
- item.disable = ifOutofArea
- return item
- }
- } else if (renderCausedBy === 'disableDates') {
- if (disableDates && disableDates.length) {
- if (disableDates && disableDates.includes(timeStr)) {
- item.disable = true
- } else {
- item.disable = false
- }
- return item
- }
- }
- return disabledByConfig(item, timestamp, calendarConfig)
- })
- return {
- calendarData: {
- ...calendarData,
- dates: _dates
- },
- calendarConfig
- }
- },
- methods(component) {
- return {
- enableArea: (dateArea = []) => {
- if (dateArea.length === 2) {
- const validate = isValiditeOfDateArea(dateArea)
- if (validate) {
- const existCalendarData = getCalendarData('calendar', component)
- const {
- startTimestamp,
- endTimestamp
- } = convertEnableAreaToTimestamp(dateArea)
- return renderCalendar.call(component, {
- ...existCalendarData,
- renderCausedBy: 'enableArea',
- enableArea: [startTimestamp, endTimestamp]
- })
- }
- } else {
- return Promise.inject(
- 'enableArea()参数需为时间范围数组,形如:["2018-8-4" , "2018-8-24"]'
- )
- }
- },
- enableDates: (toSet = []) => {
- if (!toSet.length) return
- const existCalendarData = getCalendarData('calendar', component)
- const { enableDates = [] } = existCalendarData || {}
- let toSetDates = toSet.map(item => {
- let date = { ...item }
- if (typeof date === 'string') {
- return dateUtil.transformDateRow2Dict(item)
- }
- return item
- })
- if (enableDates.length) {
- toSetDates = dateUtil.uniqueArrayByDate([
- ...toSetDates,
- ...enableDates.map(d => dateUtil.transformDateRow2Dict(d))
- ])
- }
- return renderCalendar.call(component, {
- ...existCalendarData,
- renderCausedBy: 'enableDates',
- enableDates: toSetDates.map(date => {
- if (typeof date !== 'string') {
- return dateUtil.toTimeStr(date)
- }
- return date
- })
- })
- },
- disableDates: toSet => {
- const existCalendarData = getCalendarData('calendar', component)
- const { disableDates = [], dates = [] } = existCalendarData || {}
- let toSetDates = toSet.map(item => {
- let date = { ...item }
- if (typeof date === 'string') {
- return dateUtil.transformDateRow2Dict(item)
- }
- return item
- })
- if (disableDates && disableDates.length) {
- toSetDates = dateUtil.uniqueArrayByDate([
- ...toSetDates,
- ...disableDates.map(d => dateUtil.transformDateRow2Dict(d))
- ])
- }
- return renderCalendar.call(component, {
- ...existCalendarData,
- renderCausedBy: 'disableDates',
- dates,
- disableDates: toSetDates.map(date => {
- if (typeof date !== 'string') {
- return dateUtil.toTimeStr(date)
- }
- return date
- })
- })
- }
- }
- }
- }
- }
|