1
0
mirror of https://github.com/PanJiaChen/vue-element-admin.git synced 2025-09-09 12:14:06 +08:00
2018-12-19 00:36:51 +08:00

267 lines
7.2 KiB
Vue

<template>
<div class="app-container">
<div>
<el-button @click="getAllSchedules">Get All Schedules</el-button>
<el-select v-model="selectedView">
<el-option v-for="option in viewModeOptions" :key="option" :value="option">
{{ option }}
</el-option>
</el-select>
<el-button @click="moveDate('prev')">prev</el-button>
<el-button @click="moveDate('today')">today</el-button>
<el-button @click="moveDate('next')">next</el-button>
<span>{{ dateRange }}</span>
</div>
<div class="calendar">
<tui-calendar
ref="tuiCal"
:view="selectedView"
:default-schedules="scheduleList"
:calendars="calendarList"
:task-view="taskView"
:schedule-view="scheduleView"
:use-detail-popup="useDetailPopup"
:use-creation-popup="useCreationPopup"
:disable-dbl-click="disableDblClick"
:readonly="readonly"
:month="month"
:week="week"
:timezones="timezones"
:template="templates"
:theme="theme"
:on-create-schedule="onCreateSchedule"
:on-update-schedule="onUpdateSchedule"
:on-delete-schedule="onDeleteSchedule"
@clickSchedule="onClickSchedule"
@afterRenderSchedule="onAfterRenderSchedule"
@clickTimezonesCollapseBtn="onClickTimezonesCollapseBtn"
@clickDayname="onClickDayname"
@clickMore="onClickMore"
/>
</div>
</div>
</template>
<script>
import TuiCalendar from './components/TuiCalendar'
import dayjs from 'dayjs'
import theme from './components/theme'
import 'tui-time-picker/dist/tui-time-picker.css'
import 'tui-date-picker/dist/tui-date-picker.css'
import 'tui-calendar/dist/tui-calendar.css'
export default {
name: 'CalendarDemo',
components: {
TuiCalendar
},
data() {
const scheduleList = [
{
id: '1',
calendarId: '0',
title: 'TOAST UI Calendar',
category: 'time',
dueDateClass: '',
start: dayjs().toDate(),
end: dayjs().add(3, 'hour').toDate()
},
{
id: '2',
calendarId: '1',
title: 'Practice',
category: 'milestone',
dueDateClass: '',
start: dayjs().add(1, 'day').toDate(),
end: dayjs().add(1, 'day').toDate(),
isReadOnly: true
},
{
id: '3',
calendarId: '1',
title: 'FE Workshop',
category: 'allday',
dueDateClass: '',
start: dayjs().subtract(2, 'day').toDate(),
end: dayjs().subtract(1, 'day').toDate(),
isReadOnly: true
},
{
id: '4',
calendarId: '1',
title: 'Report',
category: 'time',
dueDateClass: '',
start: dayjs().toDate(),
end: dayjs().add(1, 'hour').toDate()
}
]
const calendarList = [
{
id: '0',
name: 'Private',
bgColor: '#9e5fff',
borderColor: '#9e5fff'
},
{
id: '1',
name: 'Company',
bgColor: '#00a9ff',
borderColor: '#00a9ff'
}
]
const templates = {
milestone(schedule) {
return `<span style="color:#fff;background-color: ${schedule.bgColor};">${schedule.title}</span>`
},
milestoneTitle() {
return 'Milestone'
},
allday(schedule) {
return `${schedule.title}<i class="fa fa-refresh"></i>`
},
alldayTitle() {
return 'All Day'
}
}
const timezones = [{
timezoneOffset: 480,
displayLabel: 'GMT+08:00',
tooltip: 'China'
}, {
timezoneOffset: -420,
displayLabel: 'GMT-08:00',
tooltip: 'Los Angeles'
}]
return {
dateRange: '',
selectedView: 'month',
viewModeOptions: ['month', 'week', 'day'],
month: {
startDayOfWeek: 0
},
week: {
showTimezoneCollapseButton: true,
timezonesCollapsed: true
},
timezones,
scheduleList,
calendarList,
templates,
taskView: true,
scheduleView: true,
useDetailPopup: true,
useCreationPopup: true,
disableDblClick: true,
readonly: false,
theme
}
},
watch: {
selectedView() {
this.refreshRangeText()
}
},
created() {
document.querySelector('.app-main').style.overflow = 'visible'
},
mounted() {
this.refreshRangeText()
},
beforeDestroy() {
document.querySelector('.app-main').style.overflow = null
},
methods: {
getAllSchedules() {
console.log(this.$refs.tuiCal.getAllSchedules())
},
refreshRangeText() {
this.$nextTick(() => {
const { invoke } = this.$refs.tuiCal
const view = invoke('getViewName')
if (view === 'month') {
const calDate = invoke('getDate')
this.dateRange = dayjs(calDate).format('YYYY-MM')
} else if (view === 'week') {
const rangeStart = invoke('getDateRangeStart')
const rangeEnd = invoke('getDateRangeEnd')
const start = dayjs(rangeStart).format('YYYY-MM-DD')
const end = dayjs(rangeEnd).format('YYYY-MM-DD')
this.dateRange = `${start} ~ ${end}`
} else {
const calDate = invoke('getDate')
this.dateRange = dayjs(calDate).format('YYYY-MM-DD')
}
})
},
onAfterRenderSchedule(payload) {
console.group('onAfterRenderSchedule')
console.log('Schedule Info: ', payload.schedule)
console.groupEnd()
},
onClickSchedule(payload) {
console.group('onClickSchedule')
console.log('MouseEvent: ', payload.event)
console.log('Calendar Info: ', payload.calendar)
console.log('Schedule Info: ', payload.schedule)
console.groupEnd()
},
onClickDayname(payload) {
console.group('onClickSchedule')
console.log('Date: ', payload.date)
console.groupEnd()
},
onClickMore(payload) {
console.group('onClickSchedule')
console.log('target: ', payload.target)
console.log('date: ', payload.date)
console.groupEnd()
},
onClickTimezonesCollapseBtn(timezonesCollapsed) {
console.group('onClickTimezonesCollapseBtn')
console.log('Is Collapsed Timezone? ', timezonesCollapsed)
console.groupEnd()
if (timezonesCollapsed) {
this.theme['week.timegridLeft.width'] = '100px'
this.theme['week.daygridLeft.width'] = '100px'
} else {
this.theme['week.timegridLeft.width'] = '50px'
this.theme['week.daygridLeft.width'] = '50px'
}
},
onCreateSchedule(schedule) {
console.group('onCreateSchedule')
console.log('schedule', schedule)
console.groupEnd()
schedule.id = String(Date.now()).slice(-3)
},
onUpdateSchedule(payload) {
console.group('onUpdateSchedule')
console.log('calendar', payload.calendar)
console.log('schedule', payload.schedule)
console.groupEnd()
},
onDeleteSchedule({ schedule }) {
console.group('onDeleteSchedule')
console.log('schedule', schedule)
console.groupEnd()
},
moveDate(action) {
this.$refs.tuiCal.invoke(action)
this.refreshRangeText()
}
}
}
</script>
<style scoped>
.calendar {
margin-top: 20px;
}
</style>