todo.js 5.05 KB
import WxData from './wxData'
import { Logger, uniqueArrayByDate, GetDate } from './utils'

const logger = new Logger()
const getDate = new GetDate()

class Todo extends WxData {
  constructor(component) {
    super(component)
    this.Component = component
  }
  /**
   * 设置待办事项标志
   * @param {object} options 待办事项配置
   */
  setTodoLabels(options) {
    if (options) this.Component.todoConfig = options
    const calendar = this.getData('calendar')
    if (!calendar || !calendar.days) {
      return logger.warn('请等待日历初始化完成后再调用该方法')
    }
    const dates = [...calendar.days]
    const { curYear, curMonth } = calendar
    const {
      circle,
      dotColor = '',
      pos = 'bottom',
      showLabelAlways,
      days: todoDays = []
    } = options || this.Component.todoConfig || {}
    const { todoLabels = [] } = calendar
    const currentMonthTodoLabels = this.getTodoLabels({
      year: curYear,
      month: curMonth
    })
    let newTodoLabels = todoDays.filter(
      item => +item.year === +curYear && +item.month === +curMonth
    )
    if (this.Component.weekMode) {
      newTodoLabels = todoDays
    }
    const allTodos = currentMonthTodoLabels.concat(newTodoLabels)
    for (let todo of allTodos) {
      let target
      if (this.Component.weekMode) {
        target = dates.find(
          date =>
            +todo.year === +date.year &&
            +todo.month === +date.month &&
            +todo.day === +date.day
        )
      } else {
        target = dates[todo.day - 1]
      }
      if (!target) continue
      if (showLabelAlways) {
        target.showTodoLabel = true
      } else {
        target.showTodoLabel = !target.choosed
      }
      if (target.showTodoLabel) {
        target.todoText = todo.todoText
      }
      target.color = todo.color
    }
    const o = {
      'calendar.days': dates,
      'calendar.todoLabels': uniqueArrayByDate(todoLabels.concat(todoDays))
    }
    if (!circle) {
      o['calendar.todoLabelPos'] = pos
      o['calendar.todoLabelColor'] = dotColor
    }
    o['calendar.todoLabelCircle'] = circle || false
    o['calendar.showLabelAlways'] = showLabelAlways || false
    this.setData(o)
  }
  /**
   *  删除指定日期的待办事项
   * @param {array} todos 需要删除待办事项的日期
   */
  deleteTodoLabels(todos) {
    if (!(todos instanceof Array) || !todos.length) return
    const todoLabels = this.filterTodos(todos)
    const { days: dates, curYear, curMonth } = this.getData('calendar')
    const currentMonthTodoLabels = todoLabels.filter(
      item => curYear === +item.year && curMonth === +item.month
    )
    dates.forEach(item => {
      item.showTodoLabel = false
    })
    currentMonthTodoLabels.forEach(item => {
      dates[item.day - 1].showTodoLabel = !dates[item.day - 1].choosed
    })
    this.setData({
      'calendar.days': dates,
      'calendar.todoLabels': todoLabels
    })
  }
  /**
   * 清空所有待办事项
   */
  clearTodoLabels() {
    const { days = [] } = this.getData('calendar')
    const dates = [].concat(days)
    dates.forEach(item => {
      item.showTodoLabel = false
    })
    this.setData({
      'calendar.days': dates,
      'calendar.todoLabels': []
    })
  }
  /**
   * 获取所有待办事项
   * @param {object} target 指定年月
   * @param {number} [target.year] 年
   * @param {number} [target.month] 月
   */
  getTodoLabels(target) {
    const { todoLabels = [] } = this.getData('calendar')
    if (target) {
      const { year, month } = target
      const _todoLabels = todoLabels.filter(
        item => +item.year === +year && +item.month === +month
      )
      return _todoLabels
    }
    return todoLabels
  }
  /**
   * 过滤将删除的待办事项
   * @param {array} todos 需要删除待办事项
   */
  filterTodos(todos) {
    const todoLabels = this.getData('calendar.todoLabels') || []
    const deleteTodo = todos.map(item => getDate.toTimeStr(item))
    return todoLabels.filter(
      item => !deleteTodo.includes(getDate.toTimeStr(item))
    )
  }
  /**
   * 单选时显示待办事项
   * @param {array} todoDays
   * @param {array} days
   * @param {array} selectedDays
   */
  showTodoLabels(todoDays, days, selectedDays) {
    todoDays.forEach(item => {
      if (this.Component.weekMode) {
        days.forEach((_item, idx) => {
          if (+_item.day === +item.day) {
            const day = days[idx]
            day.hasTodo = true
            day.todoText = item.todoText
            if (
              selectedDays &&
              selectedDays.length &&
              +selectedDays[0].day === +item.day
            ) {
              day.showTodoLabel = true
            }
          }
        })
      } else {
        const day = days[item.day - 1]
        if (!day) return
        day.hasTodo = true
        day.todoText = item.todoText
        if (
          selectedDays &&
          selectedDays.length &&
          +selectedDays[0].day === +item.day
        ) {
          days[selectedDays[0].day - 1].showTodoLabel = true
        }
      }
    })
  }
}

export default component => new Todo(component)