123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277 |
- /**
- * @Author: drfu*
- * @Description: 基础功能
- * @Date: 2020-10-08 21:22:09*
- * @Last Modified by: drfu
- * @Last Modified time: 2020-10-11 13:28:52
- * */
- import { calcJumpData } from '../../core'
- import { renderCalendar } from '../../render'
- import {
- dateUtil,
- getCalendarData,
- setCalendarData,
- getCalendarConfig
- } from '../../utils/index'
- export default () => {
- return {
- name: 'base',
- beforeRender(calendarData = {}, calendarConfig) {
- const calendar = calendarData
- const { selectedDates = [], dates } = calendar
- let _dates = [...dates]
- if (selectedDates.length) {
- const selectedDatesStr = selectedDates.map(date =>
- dateUtil.toTimeStr(date)
- )
- _dates.forEach(date => {
- const dateStr = dateUtil.toTimeStr(date)
- if (selectedDatesStr.includes(dateStr)) {
- date.choosed = true
- }
- })
- }
- return {
- calendarData: {
- ...calendarData,
- dates: _dates
- },
- calendarConfig
- }
- },
- onTapDate(tapedDate, calendarData = {}, calendarConfig = {}) {
- const calendar = {
- ...calendarData
- }
- const dateIndex = dateUtil.findDateIndexInArray(
- tapedDate,
- calendarData.dates
- )
- const { multi, inverse } = calendarConfig
- let dates = [...calendar.dates]
- const { selectedDates = [] } = calendar
- if (!multi) {
- let preSelectedDate = {}
- if (selectedDates.length) {
- preSelectedDate = [...selectedDates].pop() || {}
- }
- const timeStr = dateUtil.toTimeStr
- if (!inverse && timeStr(preSelectedDate) === timeStr(tapedDate)) {
- return calendar
- }
- let _tapedDate = { ...tapedDate, choosed: !tapedDate.choosed }
- dates[dateIndex] = _tapedDate
- if (preSelectedDate.date) {
- const idx = dateUtil.findDateIndexInArray(preSelectedDate, dates)
- const date = dates[idx]
- if (date) {
- date.choosed = false
- }
- }
- if (dates[dateIndex].choosed) {
- calendar.selectedDates = [dates[dateIndex]]
- } else {
- calendar.selectedDates = []
- }
- } else {
- dates[dateIndex] = {
- ...dates[dateIndex],
- choosed: !dates[dateIndex].choosed
- }
- if (!calendar.selectedDates) {
- calendar.selectedDates = []
- }
- if (dates[dateIndex].choosed) {
- calendar.selectedDates.push(dates[dateIndex])
- } else {
- calendar.selectedDates = calendar.selectedDates.filter(
- date =>
- dateUtil.toTimeStr(date) !== dateUtil.toTimeStr(dates[dateIndex])
- )
- }
- }
- return {
- calendarData: {
- ...calendar,
- dates
- },
- calendarConfig
- }
- },
- onSwitchCalendar(date, calendarData = {}, component) {
- const calendarConfig = getCalendarConfig(component)
- if (calendarConfig.weekMode) {
- return calendarData
- }
- const updatedRenderData = calcJumpData({
- dateInfo: date,
- config: calendarConfig
- })
- return {
- ...calendarData,
- ...updatedRenderData
- }
- },
- methods(component) {
- return {
- jump: dateInfo => {
- if (Object.prototype.toString.call(dateInfo) !== '[object Object]')
- return
- const updatedRenderData = calcJumpData({
- dateInfo,
- component
- })
- const existCalendarData = getCalendarData('calendar', component)
- const config = getCalendarConfig(component)
- if (config.autoChoosedWhenJump) {
- const target = updatedRenderData.dates[dateInfo.date - 1]
- if (!updatedRenderData.selectedDates) {
- updatedRenderData.selectedDates = [target]
- } else {
- updatedRenderData.selectedDates.push(target)
- }
- }
- return renderCalendar.call(component, {
- ...existCalendarData,
- ...updatedRenderData
- })
- },
- getCalendarConfig() {
- return getCalendarConfig(component)
- },
- setCalendarConfig(config) {
- return new Promise((resolve, reject) => {
- if (!component || !component.data.config) {
- reject('异常:未找到组件配置信息')
- return
- }
- let conf = { ...component.config, ...config }
- component.config = conf
- setCalendarData({ config: conf }, component)
- .then(resolve)
- .catch(reject)
- })
- },
- cancelSelectedDates(cancelDates = []) {
- const existCalendarData = getCalendarData('calendar', component) || {}
- const { dates = [], selectedDates = [] } = existCalendarData
- let updatedRenderData = {}
- const config = getCalendarConfig(component)
- let chooseAreaData = {}
- if (config.chooseAreaMode) {
- chooseAreaData = {
- chooseAreaTimestamp: [],
- tempChooseAreaTimestamp: []
- }
- }
- if (!cancelDates.length) {
- dates.forEach(item => {
- item.choosed = false
- })
- updatedRenderData = {
- dates,
- selectedDates: []
- }
- } else {
- const cancelDatesStr = cancelDates.map(date =>
- dateUtil.toTimeStr(date)
- )
- const filterSelectedDates = selectedDates.filter(
- date => !cancelDatesStr.includes(dateUtil.toTimeStr(date))
- )
- dates.forEach(date => {
- if (cancelDatesStr.includes(dateUtil.toTimeStr(date))) {
- date.choosed = false
- }
- })
- updatedRenderData = {
- dates,
- selectedDates: filterSelectedDates
- }
- }
- return renderCalendar.call(component, {
- ...existCalendarData,
- ...updatedRenderData,
- ...chooseAreaData
- })
- },
- setSelectedDates: targetDates => {
- const existCalendarData = getCalendarData('calendar', component)
- let { dates, selectedDates = [] } = existCalendarData || {}
- let __selectedDates = []
- let __dates = dates
- if (!targetDates) {
- __dates = dates.map(item => {
- const date = { ...item }
- date.choosed = true
- if (existCalendarData.showLabelAlways && date.showTodoLabel) {
- date.showTodoLabel = true
- } else {
- date.showTodoLabel = false
- }
- return date
- })
- __selectedDates = dates
- } else if (targetDates && targetDates.length) {
- const allSelected = dateUtil.uniqueArrayByDate(
- selectedDates.concat(targetDates)
- )
- const allSelectedDateStr = allSelected.map(d =>
- dateUtil.toTimeStr(d)
- )
- __dates = dates.map(item => {
- const date = { ...item }
- if (allSelectedDateStr.includes(dateUtil.toTimeStr(date))) {
- date.choosed = true
- __selectedDates.push(date)
- }
- if (existCalendarData.showLabelAlways && date.showTodoLabel) {
- date.showTodoLabel = true
- } else {
- date.showTodoLabel = false
- }
- return date
- })
- }
- return renderCalendar.call(component, {
- ...existCalendarData,
- dates: __dates,
- selectedDates: __selectedDates
- })
- },
- setDateStyle: toSetDates => {
- if (!Array.isArray(toSetDates)) return Promise.reject()
- const existCalendarData = getCalendarData('calendar', component)
- const { dates = [], specialStyleDates } = existCalendarData || {}
- if (Array.isArray(specialStyleDates)) {
- toSetDates = dateUtil.uniqueArrayByDate([
- ...specialStyleDates,
- ...toSetDates
- ])
- }
- const toSetDatesStr = toSetDates.map(item => dateUtil.toTimeStr(item))
- const _dates = dates.map(item => {
- const idx = toSetDatesStr.indexOf(dateUtil.toTimeStr(item))
- if (idx > -1) {
- return {
- ...item,
- class: toSetDates[idx].class
- }
- } else {
- return item
- }
- })
- return renderCalendar.call(component, {
- ...existCalendarData,
- dates: _dates,
- specialStyleDates: toSetDates
- })
- }
- }
- }
- }
- }
|