veui
Version:
Baidu Enterprise UI for Vue.js.
165 lines (140 loc) • 3.59 kB
JavaScript
/* eslint-disable no-labels */
import {
getDaysInMonth,
startOfDay,
startOfWeek,
startOfMonth,
startOfQuarter,
startOfYear,
addDays,
addWeeks,
addMonths,
addQuarters,
addYears
} from 'date-fns'
import { includes, merge } from './range'
export function getMonthDays (year, month) {
return getDaysInMonth(new Date(year, month))
}
export function toDateData (date) {
if (typeof date === 'number') {
date = new Date(date)
}
if (date instanceof Date) {
return {
date: date.getDate(),
month: date.getMonth(),
year: date.getFullYear()
}
}
return date
}
export function toDate (date) {
if (typeof date === 'number') {
return new Date(date)
} else if ('date' in date && 'month' in date && 'year' in date) {
return fromDateData(date)
}
return date
}
export function fromDateData ({ year, month, date }) {
return new Date(year, month, date)
}
export function isSameDay (src, target) {
if (!src || !target) {
return false
}
if (typeof src === 'number' && typeof target === 'number') {
return src === target
}
if (src instanceof Date && target instanceof Date) {
return src.getTime() === target.getTime()
}
let srcData = toDateData(src)
let targetData = toDateData(target)
return (
srcData.date === targetData.date &&
srcData.month === targetData.month &&
srcData.year === targetData.year
)
}
export function isSameMonth (src, target) {
if (!src || !target) {
return false
}
let srcData = toDateData(src)
let targetData = toDateData(target)
return srcData.year === targetData.year && srcData.month === targetData.month
}
export function isSameYear (src, target) {
if (!src || !target) {
return false
}
let srcData = toDateData(src)
let targetData = toDateData(target)
return srcData.year === targetData.year
}
export function isInRange (day, range) {
return includes(range.map(toDate), toDate(day))
}
function prepareRanges (range) {
if (!Array.isArray(range[0])) {
range = range[0] ? [range] : []
}
return range.map((r) => r.map(toDate).sort((d1, d2) => d1 - d2))
}
export function mergeRange (r1, r2, type = 'date', mode = 'xor') {
let inc = {
date: addDays,
month: addMonths,
year: addYears
}[type]
return merge(prepareRanges(r1), prepareRanges(r2), { inc, mode })
}
function subtract (a, b) {
a = a instanceof Date ? a : new Date(a.year, a.month || 0, a.date || 1)
b = b instanceof Date ? b : new Date(b.year, b.month || 0, b.date || 1)
return a - b
}
export function gt (a, b) {
return a && b ? subtract(a, b) > 0 : false
}
export function lt (a, b) {
return a && b ? subtract(a, b) < 0 : false
}
const START_OF_FN_MAP = {
day: startOfDay,
week: startOfWeek,
month: startOfMonth,
quarter: startOfQuarter,
year: startOfYear
}
export function startOf (base, startOf, { weekStartsOn } = {}) {
const impl = START_OF_FN_MAP[startOf]
if (!impl) {
throw new Error(`[veui] Invalid unit for \`startOf\`: ${startOf}`)
}
if (startOf === 'week') {
return impl(base, { weekStartsOn })
}
return impl(base)
}
const ADD_FN_MAP = {
days: addDays,
weeks: addWeeks,
months: addMonths,
quarters: addQuarters,
years: addYears
}
export function add (base, offset) {
return Object.keys(offset).reduce((acc, key) => {
const impl = ADD_FN_MAP[key] || ADD_FN_MAP[`${key}s`]
if (!impl) {
throw new Error(`[veui] Invalid unit for \`add\`: ${key}`)
}
if (offset[key] !== 0) {
return impl(acc, offset[key])
}
return acc
}, base)
}