You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

239 lines
4.8 KiB

import dayjs from 'dayjs'
import store from './store.js'
// add function for iso
import isoWeek from 'dayjs/plugin/isoWeek'
dayjs.extend(isoWeek)
// getting local data for names
import localeData from 'dayjs/plugin/localeData'
dayjs.extend(localeData)
/**
* Mixin for extends Riot-Component
*
* @author Björn Hase
* @license http://opensource.org/licenses/MIT The MIT License
* @link https://gitea.node001.net/tiny-components/datepicker
*
*/
export default {
state: {
date: false,
weeks: [],
firstDayOfMonth: false,
firstDayOfWeek: false,
lastDayOfMonth: false,
weekdaysNames: [],
monthNames: [],
weekFormat: 'isoWeek',
isoFormat: true
},
/**
*
*
*/
onBeforeMount() {
this.state.monthNames = dayjs.months()
this.state.weekdaysNames = dayjs.weekdaysShort()
if (this.props.date) {
this.state.date = dayjs(this.props.date)
} else {
this.state.date = dayjs()
}
// change
if (this.props.isoFormat === 0) {
this.state.isoFormat = false
this.state.weekFormat = 'week'
} else {
this.state.weekdaysNames.push(this.state.weekdaysNames.shift())
}
store.on('update', (data) => {
this.state.date = dayjs(data.date)
})
this.createWeeksAndDays()
},
/**
*
*
*/
onBeforeUpdate() {
store.trigger('change', {
date: this.state.date
})
},
/**
* create weeks and days
*
*
*/
createWeeksAndDays() {
this.state.weeks = []
// getting first day of Month
this.state.firstDayOfMonth = this.state.date.startOf('month')
this.state.firstDayOfWeek = this.state.firstDayOfMonth.startOf(this.state.weekFormat)
this.state.lastDayOfMonth = this.state.date.endOf('month')
const lastDayOfWeek = this.state.lastDayOfMonth.endOf(this.state.weekFormat).startOf('day')
let day = this.state.firstDayOfWeek.clone()
do {
day = this.fillWeek(day)
} while (day.isBefore(lastDayOfWeek))
},
/**
* fill week with days
*
* @param {object} day
*
*/
fillWeek(day) {
const days = []
days.push(day)
do {
day = day.add(1, 'day')
days.push(day)
} while (days.length <= 6)
this.state.weeks.push(days)
// raise day for start of week
return day.add(1, 'day')
},
/**
* select single day
*
* @param {object} event
* @param {object} day
*
*/
handleSelectDay(event, day) {
if (day.isSame(this.state.date)) {
return false
}
this.state.date = day
this.update()
},
/**
* select month
*
* @param {object} event
*
*/
handleSelectMonth(event) {
this.state.date = this.state.date.month(event.target.value)
this.createWeeksAndDays()
this.update()
},
/**
* select year
*
* @param {object} event
*
*/
handleSelectYear(event) {
this.state.date = this.state.date.year(event.target.value)
this.createWeeksAndDays()
this.update()
},
/**
* previous month
*
* @param {object} event
* @param {object} day
*
*/
handlePreviousMonth(event) {
this.state.date = this.state.date.subtract(1, 'month')
this.createWeeksAndDays()
this.update()
},
/**
* next month
*
* @param {object} event
* @param {object} day
*
*/
handleNextMonth(event) {
this.state.date = this.state.date.add(1, 'month')
this.createWeeksAndDays()
this.update()
},
/**
* previous year
*
* @param {object} event
*
*/
handlePreviousYear(event) {
this.state.date = this.state.date.subtract(1, 'year')
this.createWeeksAndDays()
this.update()
},
/**
* next year
*
* @param {object} event
*
*/
handleNextYear(event) {
this.state.date = this.state.date.add(1, 'year')
this.createWeeksAndDays()
this.update()
},
/**
* getting classes for single day
*
* @param {object} event
* @param {array} classes
* @return {string}
*/
addClassDay(day, classes) {
if (day.isSame(this.state.date, 'day')) {
classes.push('tiny-datepicker__day--current')
}
if (day.isBefore(this.state.firstDayOfMonth) || day.isAfter(this.state.lastDayOfMonth)) {
classes.push('tiny-datepicker__day--not-current')
}
return classes.join(' ')
}
}