123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- 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)
|