123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877 |
- import Day from './func/day'
- import Week from './func/week'
- import Todo from './func/todo'
- import WxData from './func/wxData'
- import Calendar from './func/render'
- import CalendarConfig from './func/config'
- import convertSolarLunar from './func/convertSolarLunar'
- import {
- Logger,
- GetDate,
- isComponent,
- initialTasks,
- getCurrentPage,
- getComponent,
- getDateTimeStamp
- } from './func/utils'
- let Component = {}
- let logger = new Logger()
- let getDate = new GetDate()
- let dataInstance = null
- /**
- * 全局赋值正在操作的组件实例,方便读/写各自的 data
- * @param {string} componentId 要操作的日历组件ID
- */
- function bindCurrentComponent(componentId) {
- if (componentId) {
- Component = getComponent(componentId)
- }
- return Component
- }
- /**
- * 获取日历内部数据
- * @param {string} key 获取值的键名
- * @param {string} componentId 要操作的日历组件ID
- */
- function getData(key, componentId) {
- bindCurrentComponent(componentId)
- dataInstance = new WxData(Component)
- return dataInstance.getData(key)
- }
- /**
- * 设置日历内部数据
- * @param {object}} data 待设置的数据
- * @param {function} callback 设置成功回调函数
- */
- function setData(data, callback = () => {}) {
- const dataInstance = new WxData(Component)
- return dataInstance.setData(data, callback)
- }
- const conf = {
- /**
- * 渲染日历
- * @param {number} curYear
- * @param {number} curMonth
- * @param {number} curDate
- */
- renderCalendar(curYear, curMonth, curDate) {
- if (isComponent(this)) Component = this
- return new Promise((resolve, reject) => {
- Calendar(Component)
- .renderCalendar(curYear, curMonth, curDate)
- .then((info = {}) => {
- if (!info.firstRender) {
- return resolve({
- year: curYear,
- month: curMonth,
- date: curDate
- })
- }
- mountEventsOnPage(getCurrentPage())
- Component.triggerEvent('afterCalendarRender', Component)
- Component.firstRender = true
- initialTasks.flag = 'finished'
- if (initialTasks.tasks.length) {
- initialTasks.tasks.shift()()
- }
- resolve({
- year: curYear,
- month: curMonth,
- date: curDate
- })
- })
- .catch(err => {
- reject(err)
- })
- })
- },
- /**
- * 当改变月份时触发
- * @param {object} param
- */
- whenChangeDate({ curYear, curMonth, newYear, newMonth }) {
- Component.triggerEvent('whenChangeMonth', {
- current: {
- year: curYear,
- month: curMonth
- },
- next: {
- year: newYear,
- month: newMonth
- }
- })
- },
- /**
- * 多选
- * @param {number} dateIdx 当前选中日期索引值
- */
- whenMulitSelect(dateIdx) {
- if (isComponent(this)) Component = this
- const { calendar = {} } = getData()
- const { days, todoLabels } = calendar
- const config = CalendarConfig(Component).getCalendarConfig()
- let { selectedDay: selectedDays = [] } = calendar
- const currentDay = days[dateIdx]
- if (!currentDay) return
- currentDay.choosed = !currentDay.choosed
- if (!currentDay.choosed) {
- currentDay.cancel = true // 该次点击是否为取消日期操作
- const currentDayStr = getDate.toTimeStr(currentDay)
- selectedDays = selectedDays.filter(
- item => currentDayStr !== getDate.toTimeStr(item)
- )
- if (todoLabels) {
- todoLabels.forEach(item => {
- if (currentDayStr === getDate.toTimeStr(item)) {
- currentDay.showTodoLabel = true
- }
- })
- }
- } else {
- currentDay.cancel = false
- const { showLabelAlways } = getData('calendar')
- if (showLabelAlways && currentDay.showTodoLabel) {
- currentDay.showTodoLabel = true
- } else {
- currentDay.showTodoLabel = false
- }
- if (!config.takeoverTap) {
- selectedDays.push(currentDay)
- }
- }
- if (config.takeoverTap) {
- return Component.triggerEvent('onTapDay', currentDay)
- }
- setData({
- 'calendar.days': days,
- 'calendar.selectedDay': selectedDays
- })
- conf.afterTapDay(currentDay, selectedDays)
- },
- /**
- * 单选
- * @param {number} dateIdx 当前选中日期索引值
- */
- whenSingleSelect(dateIdx) {
- if (isComponent(this)) Component = this
- const { calendar = {} } = getData()
- const { days, selectedDay: selectedDays = [], todoLabels } = calendar
- let shouldMarkerTodoDay = []
- const currentDay = days[dateIdx]
- if (!currentDay) return
- const preSelectedDate = [...selectedDays].pop() || {}
- const { month: dMonth, year: dYear } = days[0] || {}
- const config = CalendarConfig(Component).getCalendarConfig()
- if (config.takeoverTap) {
- return Component.triggerEvent('onTapDay', currentDay)
- }
- conf.afterTapDay(currentDay)
- if (!config.inverse && preSelectedDate.day === currentDay.day) return
- days.forEach((item, idx) => {
- if (+item.day === +preSelectedDate.day) days[idx].choosed = false
- })
- if (todoLabels) {
- // 筛选当月待办事项的日期
- shouldMarkerTodoDay = todoLabels.filter(
- item => +item.year === dYear && +item.month === dMonth
- )
- }
- Todo(Component).showTodoLabels(shouldMarkerTodoDay, days, selectedDays)
- const tmp = {
- 'calendar.days': days
- }
- if (preSelectedDate.day !== currentDay.day) {
- preSelectedDate.choosed = false
- currentDay.choosed = true
- if (!calendar.showLabelAlways || !currentDay.showTodoLabel) {
- currentDay.showTodoLabel = false
- }
- tmp['calendar.selectedDay'] = [currentDay]
- } else if (config.inverse) {
- if (currentDay.choosed) {
- if (currentDay.showTodoLabel && calendar.showLabelAlways) {
- currentDay.showTodoLabel = true
- } else {
- currentDay.showTodoLabel = false
- }
- }
- tmp['calendar.selectedDay'] = []
- }
- if (config.weekMode) {
- tmp['calendar.curYear'] = currentDay.year
- tmp['calendar.curMonth'] = currentDay.month
- }
- setData(tmp)
- },
- gotoSetContinuousDates(start, end) {
- return chooseDateArea([
- `${getDate.toTimeStr(start)}`,
- `${getDate.toTimeStr(end)}`
- ])
- },
- timeRangeHelper(currentDate, selectedDay) {
- const currentDateTimestamp = getDateTimeStamp(currentDate)
- const startDate = selectedDay[0]
- let endDate
- let endDateTimestamp
- let selectedLen = selectedDay.length
- if (selectedLen > 1) {
- endDate = selectedDay[selectedLen - 1]
- endDateTimestamp = getDateTimeStamp(endDate)
- }
- const startTimestamp = getDateTimeStamp(startDate)
- return {
- endDate,
- startDate,
- currentDateTimestamp,
- endDateTimestamp,
- startTimestamp
- }
- },
- /**
- * 计算连续日期选择的开始及结束日期
- * @param {object} currentDate 当前选择日期
- * @param {array} selectedDay 已选择的的日期
- */
- calculateDateRange(currentDate, selectedDay) {
- const {
- endDate,
- startDate,
- currentDateTimestamp,
- endDateTimestamp,
- startTimestamp
- } = this.timeRangeHelper(currentDate, selectedDay)
- let range = []
- let selectedLen = selectedDay.length
- const isWantToChooseOneDate = selectedDay.filter(
- item => getDate.toTimeStr(item) === getDate.toTimeStr(currentDate)
- )
- if (selectedLen === 2 && isWantToChooseOneDate.length) {
- range = [currentDate, currentDate]
- return range
- }
- if (
- currentDateTimestamp >= startTimestamp &&
- endDateTimestamp &&
- currentDateTimestamp <= endDateTimestamp
- ) {
- const currentDateIdxInChoosedDateArea = selectedDay.findIndex(
- item => getDate.toTimeStr(item) === getDate.toTimeStr(currentDate)
- )
- if (selectedLen / 2 > currentDateIdxInChoosedDateArea) {
- range = [currentDate, endDate]
- } else {
- range = [startDate, currentDate]
- }
- } else if (currentDateTimestamp < startTimestamp) {
- range = [currentDate, endDate]
- } else if (currentDateTimestamp > startTimestamp) {
- range = [startDate, currentDate]
- }
- return range
- },
- chooseAreaWhenExistArea(currentDate, selectedDay) {
- return new Promise((resolve, reject) => {
- const range = conf.calculateDateRange(
- currentDate,
- getDate.sortDates(selectedDay)
- )
- conf
- .gotoSetContinuousDates(...range)
- .then(data => {
- resolve(data)
- conf.afterTapDay(currentDate)
- })
- .catch(err => {
- reject(err)
- conf.afterTapDay(currentDate)
- })
- })
- },
- chooseAreaWhenHasOneDate(currentDate, selectedDay, lastChoosedDate) {
- return new Promise((resolve, reject) => {
- const startDate = lastChoosedDate || selectedDay[0]
- let range = [startDate, currentDate]
- const currentDateTimestamp = getDateTimeStamp(currentDate)
- const lastChoosedDateTimestamp = getDateTimeStamp(startDate)
- if (lastChoosedDateTimestamp > currentDateTimestamp) {
- range = [currentDate, startDate]
- }
- conf
- .gotoSetContinuousDates(...range)
- .then(data => {
- resolve(data)
- conf.afterTapDay(currentDate)
- })
- .catch(err => {
- reject(err)
- conf.afterTapDay(currentDate)
- })
- })
- },
- /**
- * 日期范围选择模式
- * @param {number} dateIdx 当前选中日期索引值
- */
- whenChooseArea(dateIdx) {
- return new Promise((resolve, reject) => {
- if (isComponent(this)) Component = this
- if (Component.weekMode) return
- const { days = [], selectedDay, lastChoosedDate } = getData('calendar')
- const currentDate = days[dateIdx]
- if (currentDate.disable) return
- const config = CalendarConfig(Component).getCalendarConfig()
- if (config.takeoverTap) {
- return Component.triggerEvent('onTapDay', currentDate)
- }
- if (selectedDay && selectedDay.length > 1) {
- conf
- .chooseAreaWhenExistArea(currentDate, selectedDay)
- .then(dates => {
- resolve(dates)
- })
- .catch(err => {
- reject(err)
- })
- } else if (lastChoosedDate || (selectedDay && selectedDay.length === 1)) {
- conf
- .chooseAreaWhenHasOneDate(currentDate, selectedDay, lastChoosedDate)
- .then(dates => {
- resolve(dates)
- })
- .catch(err => {
- reject(err)
- })
- } else {
- days.forEach(date => {
- if (+date.day === +currentDate.day) {
- date.choosed = true
- } else {
- date.choosed = false
- }
- })
- const dataInstance = new WxData(Component)
- dataInstance.setData({
- 'calendar.days': [...days],
- 'calendar.lastChoosedDate': currentDate
- })
- }
- })
- },
- /**
- * 点击日期后触发事件
- * @param {object} currentSelected 当前选择的日期
- * @param {array} selectedDates 多选状态下选中的日期
- */
- afterTapDay(currentSelected, selectedDates) {
- const config = CalendarConfig(Component).getCalendarConfig()
- const { multi } = config
- if (!multi) {
- Component.triggerEvent('afterTapDay', currentSelected)
- } else {
- Component.triggerEvent('afterTapDay', {
- currentSelected,
- selectedDates
- })
- }
- },
- /**
- * 跳转至今天
- */
- jumpToToday() {
- return new Promise((resolve, reject) => {
- const { year, month, date } = getDate.todayDate()
- const timestamp = getDate.todayTimestamp()
- const config = CalendarConfig(Component).getCalendarConfig()
- setData({
- 'calendar.curYear': year,
- 'calendar.curMonth': month,
- 'calendar.selectedDay': [
- {
- year: year,
- day: date,
- month: month,
- choosed: true,
- lunar: config.showLunar
- ? convertSolarLunar.solar2lunar(year, month, date)
- : null
- }
- ],
- 'calendar.todayTimestamp': timestamp
- })
- conf
- .renderCalendar(year, month, date)
- .then(() => {
- resolve({ year, month, date })
- })
- .catch(() => {
- reject('jump failed')
- })
- })
- }
- }
- export const whenChangeDate = conf.whenChangeDate
- export const renderCalendar = conf.renderCalendar
- export const whenSingleSelect = conf.whenSingleSelect
- export const whenChooseArea = conf.whenChooseArea
- export const whenMulitSelect = conf.whenMulitSelect
- export const calculatePrevWeekDays = conf.calculatePrevWeekDays
- export const calculateNextWeekDays = conf.calculateNextWeekDays
- /**
- * 获取当前年月
- * @param {string} componentId 要操作的日历组件ID
- */
- export function getCurrentYM(componentId) {
- bindCurrentComponent(componentId)
- return {
- year: getData('calendar.curYear'),
- month: getData('calendar.curMonth')
- }
- }
- /**
- * 获取已选择的日期
- * @param {object } options 日期配置选项 {lunar} 是否返回农历信息
- * @param {string} componentId 要操作的日历组件ID
- */
- export function getSelectedDay(options = {}, componentId) {
- bindCurrentComponent(componentId)
- const config = getCalendarConfig()
- const dates = getData('calendar.selectedDay') || []
- if (options.lunar && !config.showLunar) {
- const datesWithLunar = getDate.convertLunar(dates)
- return datesWithLunar
- } else {
- return dates
- }
- }
- /**
- * 取消选中日期
- * @param {array} dates 需要取消的日期,不传则取消所有已选择的日期
- * @param {string} componentId 要操作的日历组件ID
- */
- export function cancelSelectedDates(dates, componentId) {
- bindCurrentComponent(componentId)
- const { days = [], selectedDay = [] } = getData('calendar') || {}
- if (!dates || !dates.length) {
- days.forEach(item => {
- item.choosed = false
- })
- setData({
- 'calendar.days': days,
- 'calendar.selectedDay': []
- })
- } else {
- const cancelDatesStr = dates.map(
- date => `${+date.year}-${+date.month}-${+date.day}`
- )
- const filterSelectedDates = selectedDay.filter(
- date =>
- !cancelDatesStr.includes(`${+date.year}-${+date.month}-${+date.day}`)
- )
- days.forEach(date => {
- if (
- cancelDatesStr.includes(`${+date.year}-${+date.month}-${+date.day}`)
- ) {
- date.choosed = false
- }
- })
- setData({
- 'calendar.days': days,
- 'calendar.selectedDay': filterSelectedDates
- })
- }
- }
- /**
- * 周视图跳转
- * @param {object} date info
- * @param {boolean} disableSelected 跳转时是否需要选中,周视图切换调用该方法,如未选择日期时不选中日期
- */
- function jumpWhenWeekMode({ year, month, day }, disableSelected) {
- return new Promise((resolve, reject) => {
- Week(Component)
- .jump(
- {
- year: +year,
- month: +month,
- day: +day
- },
- disableSelected
- )
- .then(date => {
- resolve(date)
- Component.triggerEvent('afterCalendarRender', Component)
- })
- .catch(err => {
- reject(err)
- Component.triggerEvent('afterCalendarRender', Component)
- })
- })
- }
- /**
- * 月视图跳转
- * @param {object} date info
- */
- function jumpWhenNormalMode({ year, month, day }) {
- return new Promise((resolve, reject) => {
- if (typeof +year !== 'number' || typeof +month !== 'number') {
- return logger.warn('jump 函数年月日参数必须为数字')
- }
- const timestamp = getDate.todayTimestamp()
- let tmp = {
- 'calendar.curYear': +year,
- 'calendar.curMonth': +month,
- 'calendar.todayTimestamp': timestamp
- }
- setData(tmp, () => {
- conf
- .renderCalendar(+year, +month, +day)
- .then(date => {
- resolve(date)
- })
- .catch(err => {
- reject(err)
- })
- })
- })
- }
- /**
- * 跳转至指定日期
- * @param {number} year
- * @param {number} month
- * @param {number} day
- * @param {string} componentId 要操作的日历组件ID
- */
- export function jump(year, month, day, componentId) {
- return new Promise((resolve, reject) => {
- bindCurrentComponent(componentId)
- const { selectedDay = [] } = getData('calendar') || {}
- const { weekMode } = getData('calendarConfig') || {}
- const { year: y, month: m, day: d } = selectedDay[0] || {}
- if (+y === +year && +m === +month && +d === +day) {
- return
- }
- if (weekMode) {
- let disableSelected = false
- if (!year || !month || !day) {
- const today = getDate.todayDate()
- year = today.year
- month = today.month
- day = today.date
- disableSelected = true
- }
- jumpWhenWeekMode({ year, month, day }, disableSelected)
- .then(date => {
- resolve(date)
- })
- .catch(err => {
- reject(err)
- })
- mountEventsOnPage(getCurrentPage())
- return
- }
- if (year && month) {
- jumpWhenNormalMode({ year, month, day })
- .then(date => {
- resolve(date)
- })
- .catch(err => {
- reject(err)
- })
- } else {
- conf
- .jumpToToday()
- .then(date => {
- resolve(date)
- })
- .catch(err => {
- reject(err)
- })
- }
- })
- }
- /**
- * 设置待办事项日期标记
- * @param {object} todos 待办事项配置
- * @param {string} [todos.pos] 标记显示位置,默认值'bottom' ['bottom', 'top']
- * @param {string} [todos.dotColor] 标记点颜色,backgroundColor 支持的值都行
- * @param {object[]} [todos.days] 需要标记的所有日期,如:[{year: 2015, month: 5, day: 12}],其中年月日字段必填
- * @param {string} componentId 要操作的日历组件ID
- */
- export function setTodoLabels(todos, componentId) {
- bindCurrentComponent(componentId)
- Todo(Component).setTodoLabels(todos)
- }
- /**
- * 删除指定日期待办事项
- * @param {array} todos 需要删除的待办日期数组
- * @param {string} componentId 要操作的日历组件ID
- */
- export function deleteTodoLabels(todos, componentId) {
- bindCurrentComponent(componentId)
- Todo(Component).deleteTodoLabels(todos)
- }
- /**
- * 清空所有待办事项
- * @param {string} componentId 要操作的日历组件ID
- */
- export function clearTodoLabels(componentId) {
- bindCurrentComponent(componentId)
- Todo(Component).clearTodoLabels()
- }
- /**
- * 获取所有待办事项
- * @param {object } options 日期配置选项 {lunar} 是否返回农历信息
- * @param {string} componentId 要操作的日历组件ID
- */
- export function getTodoLabels(options = {}, componentId) {
- bindCurrentComponent(componentId)
- const config = getCalendarConfig()
- const todoDates = Todo(Component).getTodoLabels() || []
- if (options.lunar && !config.showLunar) {
- const todoDatesWithLunar = getDate.convertLunar(todoDates)
- return todoDatesWithLunar
- } else {
- return todoDates
- }
- }
- /**
- * 禁用指定日期
- * @param {array} days 日期
- * @param {number} [days.year]
- * @param {number} [days.month]
- * @param {number} [days.day]
- * @param {string} componentId 要操作的日历组件ID
- */
- export function disableDay(days = [], componentId) {
- bindCurrentComponent(componentId)
- Day(Component).disableDays(days)
- }
- /**
- * 指定可选日期范围
- * @param {array} area 日期访问数组
- * @param {string} componentId 要操作的日历组件ID
- */
- export function enableArea(area = [], componentId) {
- bindCurrentComponent(componentId)
- Day(Component).enableArea(area)
- }
- /**
- * 指定特定日期可选
- * @param {array} days 指定日期数组
- * @param {string} componentId 要操作的日历组件ID
- */
- export function enableDays(days = [], componentId) {
- bindCurrentComponent(componentId)
- Day(Component).enableDays(days)
- }
- /**
- * 设置选中日期(多选模式下)
- * @param {array} selected 需选中日期
- * @param {string} componentId 要操作的日历组件ID
- */
- export function setSelectedDays(selected, componentId) {
- bindCurrentComponent(componentId)
- Day(Component).setSelectedDays(selected)
- }
- /**
- * 获取当前日历配置
- * @param {string} componentId 要操作的日历组件ID
- */
- export function getCalendarConfig(componentId) {
- bindCurrentComponent(componentId)
- return CalendarConfig(Component).getCalendarConfig()
- }
- /**
- * 设置日历配置
- * @param {object} config
- * @param {string} componentId 要操作的日历组件ID
- */
- export function setCalendarConfig(config, componentId) {
- bindCurrentComponent(componentId)
- if (!config || Object.keys(config).length === 0) {
- return logger.warn('setCalendarConfig 参数必须为非空对象')
- }
- const existConfig = getCalendarConfig()
- return new Promise((resolve, reject) => {
- CalendarConfig(Component)
- .setCalendarConfig(config)
- .then(conf => {
- resolve(conf)
- const { date, type } = existConfig.disableMode || {}
- const { _date, _type } = config.disableMode || {}
- if (type !== _type || date !== _date) {
- const { year, month } = getCurrentYM()
- jump(year, month)
- }
- })
- .catch(err => {
- reject(err)
- })
- })
- }
- /**
- * 获取当前日历面板日期
- * @param {object } options 日期配置选项 {lunar} 是否返回农历信息
- * @param {string} componentId 要操作的日历组件ID
- */
- export function getCalendarDates(options = {}, componentId) {
- bindCurrentComponent(componentId)
- const config = getCalendarConfig()
- const dates = getData('calendar.days', componentId) || []
- if (options.lunar && !config.showLunar) {
- const datesWithLunar = getDate.convertLunar(dates)
- return datesWithLunar
- } else {
- return dates
- }
- }
- /**
- * 选择连续日期范围
- * @param {string} componentId 要操作的日历组件ID
- */
- export function chooseDateArea(dateArea, componentId) {
- bindCurrentComponent(componentId)
- return Day(Component).chooseArea(dateArea)
- }
- /**
- * 设置指定日期样式
- * @param {array} dates 待设置特殊样式的日期
- * @param {string} componentId 要操作的日历组件ID
- */
- export function setDateStyle(dates, componentId) {
- if (!dates) return
- bindCurrentComponent(componentId)
- Day(Component).setDateStyle(dates)
- }
- /**
- * 切换周月视图
- * 切换视图时可传入指定日期,如: {year: 2019, month: 1, day: 3}
- * args[0] view 视图模式[week, month]
- * args[1]|args[2]为day object或者 componentId
- */
- export function switchView(...args) {
- return new Promise((resolve, reject) => {
- const view = args[0]
- if (!args[1]) {
- return Week(Component)
- .switchWeek(view)
- .then(resolve)
- .catch(reject)
- }
- if (typeof args[1] === 'string') {
- bindCurrentComponent(args[1], this)
- Week(Component)
- .switchWeek(view, args[2])
- .then(resolve)
- .catch(reject)
- } else if (typeof args[1] === 'object') {
- if (typeof args[2] === 'string') {
- bindCurrentComponent(args[1], this)
- }
- Week(Component)
- .switchWeek(view, args[1])
- .then(resolve)
- .catch(reject)
- }
- })
- }
- /**
- * 绑定日历事件至当前页面实例
- * @param {object} page 当前页面实例
- */
- function mountEventsOnPage(page) {
- page.calendar = {
- jump,
- switchView,
- disableDay,
- enableArea,
- enableDays,
- chooseDateArea,
- getCurrentYM,
- getSelectedDay,
- cancelSelectedDates,
- setDateStyle,
- setTodoLabels,
- getTodoLabels,
- deleteTodoLabels,
- clearTodoLabels,
- setSelectedDays,
- getCalendarConfig,
- setCalendarConfig,
- getCalendarDates
- }
- }
- function setWeekHeader(firstDayOfWeek) {
- let weeksCh = ['日', '一', '二', '三', '四', '五', '六']
- if (firstDayOfWeek === 'Mon') {
- weeksCh = ['一', '二', '三', '四', '五', '六', '日']
- }
- setData({
- 'calendar.weeksCh': weeksCh
- })
- }
- function autoSelectDay(defaultDay) {
- Component.firstRenderWeekMode = true
- if (defaultDay && typeof defaultDay === 'string') {
- const day = defaultDay.split('-')
- if (day.length < 3) {
- return logger.warn('配置 jumpTo 格式应为: 2018-4-2 或 2018-04-02')
- }
- jump(+day[0], +day[1], +day[2])
- } else {
- if (!defaultDay) {
- Component.config.noDefault = true
- setData({
- 'config.noDefault': true
- })
- }
- jump()
- }
- }
- function init(component, config) {
- initialTasks.flag = 'process'
- Component = component
- Component.config = config
- setWeekHeader(config.firstDayOfWeek)
- autoSelectDay(config.defaultDay)
- logger.tips(
- '使用中若遇问题请反馈至 https://github.com/treadpit/wx_calendar/issues ✍️'
- )
- }
- export default (component, config = {}) => {
- if (initialTasks.flag === 'process') {
- return initialTasks.tasks.push(function() {
- init(component, config)
- })
- }
- init(component, config)
- }
|