UNPKG

hae

Version:

Mobile web UI based on Vux

215 lines (194 loc) 5.32 kB
import format from '../datetime/format' export function zero (n) { return n < 10 ? '0' + n : n } export function splitValue (value) { let split = value.split('-') return { year: parseInt(split[0], 10), month: parseInt(split[1], 10) - 1, day: parseInt(split[2], 10) } } export function getPrevTime (year, month) { if (month === 0) { return { month: 11, year: year - 1 } } else { return { year, month: month - 1 } } } export function getNextTime (year, month) { if (month === 11) { return { month: 0, year: year + 1 } } else { return { year, month: month + 1 } } } function getTime (str) { if (typeof str === 'number') { return str } return typeof str === 'string' ? new Date(str.replace(/-/g, '/')).getTime() : str.getTime() } export function isBetween (value, disablePast, disableFuture, rangeBegin, rangeEnd) { const { start, end } = getRange(disablePast, disableFuture, rangeBegin, rangeEnd) value = getTime(value) let isGte = start ? value >= getTime(start) : true let isLte = end ? value <= getTime(end) : true return isGte && isLte } function getRange (disablePast = false, disableFuture = false, rangeBegin, rangeEnd) { let startOfToday = new Date() startOfToday.setHours(0, 0, 0, 0) if (disablePast) { if (!rangeBegin) { rangeBegin = startOfToday } else { rangeBegin = Math.max(startOfToday.getTime(), getTime(rangeBegin)) } } if (disableFuture) { if (!rangeEnd) { rangeEnd = startOfToday } else { rangeEnd = Math.min(startOfToday.getTime(), getTime(rangeEnd)) } } return { start: rangeBegin, end: rangeEnd } } export function getDays ({year, month, value, rangeBegin, rangeEnd, returnSixRows = true}) { let today = format(new Date(), 'YYYY-MM-DD') let _splitValue = splitValue(value || today) // if year or month is not specified, get them from value if (typeof year !== 'number' || typeof month !== 'number' || month < 0) { year = _splitValue.year month = _splitValue.month } var firstDayOfMonth = new Date(year, month, 1).getDay() var lastDateOfMonth = new Date(year, month + 1, 0).getDate() var lastDayOfLastMonth = new Date(year, month, 0).getDate() var i var line = 0 var temp = [] for (i = 1; i <= lastDateOfMonth; i++) { var dow = new Date(year, month, i).getDay() // 第一行 if (dow === 0) { temp[line] = [] } else if (i === 1) { temp[line] = [] var k = lastDayOfLastMonth - firstDayOfMonth + 1 for (let j = 0; j < firstDayOfMonth; j++) { let rs = getPrevTime(year, month) temp[line].push({ year: rs.year, month: rs.month, month_str: rs.month + 1, day: k, isLastMonth: true }) k++ } } let _format = format(new Date(year + '/' + (month + 1) + '/' + i), 'YYYY/MM/DD') let options = { year: year, month: month, month_str: month + 1, day: i, isCurrent: value && format(new Date(value), 'YYYY/MM/DD') === _format, isToday: format(new Date(), 'YYYY/MM/DD') === _format } temp[line].push(options) if (dow === 6) { line++ } else if (i === lastDateOfMonth) { let k = 1 for (dow; dow < 6; dow++) { let rs = getNextTime(year, month) temp[line].push({ year: rs.year, month: rs.month, month_str: rs.month + 1, day: k, isNextMonth: true }) k++ } } } if (returnSixRows && temp.length === 5) { let rs = getNextTime(year, month) let start = temp[4][6].isNextMonth ? temp[4][6].day : 0 temp[5] = [] for (let i = 0; i < 7; i++) { let day = ++start temp[5].push({ year: rs.year, month: rs.month, month_str: rs.month + 1, day: day, isNextMonth: true }) } } // 2026-02, there is only 4 lines if (returnSixRows && temp.length === 4) { let rs = getNextTime(year, month) let start = 0 temp[4] = [] temp[5] = [] for (let i = 0; i < 7; i++) { let day = ++start temp[4].push({ year: rs.year, month: rs.month, month_str: rs.month + 1, day: day, isNextMonth: true }) day = ++start temp[5].push({ year: rs.year, month: rs.month, month_str: rs.month + 1, day: day, isNextMonth: true }) } } return { year: year, month: month, month_str: month + 1, days: temp.map(line => { /** * https://github.com/airyland/vux/issues/1361 * @todo day will be changed to weekDay after v3.0 */ line.map((item, index) => { item.date = item.day item.weekDay = index item.isWeekend = index === 0 || index === 6 item.formatedDate = format(new Date(`${item.year}/${item.month_str}/${item.date}`), 'YYYY-MM-DD') return item }) return line }) } }