Files
intc-vue3/src/views/invest/accountCalendar/index.vue
2024-08-01 19:04:36 +08:00

292 lines
9.3 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<!-- 这里是自定义头部切换视图类型和切换日期 -->
<div class="calendarHeader">
<div class="header_left">
<h1>{{ type === '3' ? '列表' : calendarTitle }}</h1>
</div>
<div class="header_right">
<!-- <span v-if="type!=='3'&&isShowBack" class="blue-color backToday" @click="getToday()">{{ type==='1'?'返回本月':'返回本周' }}</span>
<el-select v-model="type" placeholder="视图类型" style="width: 80px" size="small" class="header_select" @change="handleChangeType">
<el-option label="月" value="1" />
<el-option label="周" value="2" />
<el-option label="列" value="3" />
</el-select> -->
<!-- 选择月份的日期框 -->
<el-date-picker
v-if="type === '1'"
v-model="showMonth"
type="month"
size="small"
:clearable="false"
placeholder="请选择日期"
style="margin-left: 10px; vertical-align: middle"
@change="changeDate"
/>
<el-button-group v-if="type === '2'" style="margin-left: 10px">
<el-button size="small" class="el-icon-arrow-left" @click="getPrev()">上一周</el-button>
<el-button size="small" @click="getNext()">下一周<i class="el-icon-arrow-right" /></el-button>
</el-button-group>
</div>
</div>
<!-- 月视图和周视图显示列视图显示表格形式 -->
<div v-show="type !== '3'" ref="fullcalendar" class="card" />
</template>
<script>
import { reactive, toRefs, ref, onMounted, getCurrentInstance } from 'vue'
import { Calendar } from '@fullcalendar/core'
import dayGridPlugin from '@fullcalendar/daygrid'
import timeGridPlugin from '@fullcalendar/timegrid'
import listPlugin from '@fullcalendar/list'
import interactionPlugin from '@fullcalendar/interaction'
import dayjs from 'dayjs'
import { getAccountCalendarInfo } from '@/api/invest/accountAnalysis.js'
export default {
name: 'PlanManagement',
components: {},
setup() {
const { proxy } = getCurrentInstance()
const state = reactive({
calendarTitle: new Date().getFullYear() + '年' + Number(new Date().getMonth() + 1) + '月', // 日历头部显示文字
dialogVisiable: false,
showMonth: new Date(), // 显示月份
loading: false,
isShowBack: false, // 是否显示回到当月或当周
planCategoryId: '', // 计划分类Id
type: '1',
dialogType: '',
detailInfo: {},
Tcalendar: null,
drawerVisiable: false,
drawerType: '',
colorJSON: {
// 我这里有类别的概念,不同的类别又有不同的颜色
green: { title: '#00B578', class: 'green' },
red: { title: '#FA5151', class: 'red' },
orange: { title: '#FF8F1F', class: 'orange' },
yellow: { title: '#FFC300', class: 'yellow' },
cyan: { title: '#07B9B9', class: 'cyan' },
blue: { title: '#3662EC', class: 'blue' },
purple: { title: '#8A38F5', class: 'purple' },
magenta: { title: '#EB2F96', class: 'magenta' }
},
fullcalendar: ref(),
queryParams: {
type: null,
time: ''
},
nowDate: new Date(),
infoList: [], // 日历显示的列信息
categoryJSON: {} // 计划分类json
})
onMounted(() => {
initCalendar()
getCalendarList()
})
const initCalendar = () => {
state.Tcalendar = new Calendar(state.fullcalendar, {
plugins: [dayGridPlugin, timeGridPlugin, listPlugin, interactionPlugin],
initialView: 'dayGridMonth',
aspectRatio: 2.2,
locale: 'zh-cn',
handleWindowResize: true,
editable: true, // 允许编辑表格
droppable: true,
// height: 'auto',
// 显示事件开始时间
displayEventTime: false,
// 显示事件结束时间
displayEventEnd: false,
// 关闭全天区域显示
allDaySlot: true,
// 开始时间段
slotMinTime: '00:00:00',
// 结束时间段
slotMaxTime: '00:00:00',
eventOrder: 'type,color,start',
eventDurationEditable: true,
eventResizableFromStart: true,
selectable: true, // 允许用户通过单击和拖动来突出显示多个日期或时间段
firstDay: 1, // 设置一周中显示的第一天是哪天周日是0周一是1类推。
unselectAuto: true, // 当点击页面日历以外的位置时,是否自动取消当前的选中状态
unselectCancel: '.el-drawer',
dayMaxEvents: true,
// eventLimit: true,
headerToolbar: false,
buttonText: {
today: '回到今天',
month: '月',
week: '周',
list: '列',
day: '日'
},
allDayText: '全天',
events: state.infoList,
eventClassNames: function (arg) {
// 添加自定义class
return [arg.event.extendedProps.class]
},
eventContent: function (arg) {
const italicEl = document.createElement('div')
if (arg.event.extendedProps.startDateMinute && state.type === '1') {
const childEl = document.createElement('span')
childEl.innerHTML = arg.event.extendedProps.startDateMinute
italicEl.append(childEl)
}
italicEl.append(arg.event.title)
italicEl.setAttribute('class', `plan_title ${arg.event.extendedProps.class}`)
return { domNodes: [italicEl] }
},
eventDrop: function (info) {
// 拖拽停止时触发
handleDrap(info)
},
eventClick: function (info) {
// 点击查看时触发
handleClick(info)
},
select: function (info) {},
eventResize: function (info) {
handleEventResize(info)
}
})
state.Tcalendar.render()
}
// 上一月、周、日
const getPrev = () => {
state.Tcalendar.prev()
state.calendarTitle = state.Tcalendar.view.title
getCalendarList()
}
// 下一月、周、日
const getNext = () => {
state.Tcalendar.next()
state.calendarTitle = state.Tcalendar.view.title
getCalendarList()
}
// 回到今天
const getToday = () => {
state.Tcalendar.today()
state.calendarTitle = state.Tcalendar.view.title
state.isShowBack = false
state.showMonth = new Date()
getCalendarList()
}
const handleSetting = () => {
state.dialogCategory = true
}
const getCalendarList = () => {
const currentEnd = dayjs(state.Tcalendar.view.currentEnd).add(-1, 'day')
const params = {
startTime: dayjs(state.Tcalendar.view.currentStart).format('YYYY-MM-DD'),
endTime: dayjs(currentEnd).format('YYYY-MM-DD'),
type: state.type
}
state.loading = true
state.Tcalendar.getEventSources().forEach((item) => {
item.remove()
})
getAccountCalendarInfo(params).then((res) => {
state.loading = false
if (res) {
state.infoList = res.data
state.Tcalendar.addEventSource(state.infoList)
}
})
}
// 点击计划查看
const handleClick = (info) => {}
// 列视图点击查看
const handleClickList = (row) => {}
const closeDrawer = (val) => {
state.drawerVisiable = false
if (val) {
getCalendarList()
}
}
// 切换视图类型
const handleChangeType = (val) => {
if (val === '1') {
state.Tcalendar.changeView('dayGridMonth')
state.showMonth = new Date()
} else if (val === '2') {
state.Tcalendar.changeView('timeGridWeek')
} else {
state.Tcalendar.changeView('listMonth')
}
state.isShowBack = false
state.calendarTitle = state.Tcalendar.view.title
getToday()
}
// 切换类型
const handleChangePlanId = () => {
getCalendarList()
}
// 拖拽计划时触发
const handleDrap = (info) => {}
// 调整大小时触发
const handleEventResize = (info) => {}
// 拖拽触发
const handleSelectDate = (info) => {}
// 切换月份和日期
const changeDate = (date) => {
state.Tcalendar.gotoDate(date)
// 判断不是当前月份,显示返回当前月
if (date.getMonth() !== new Date().getMonth() || new Date().getFullYear() !== new Date(date).getFullYear()) {
state.isShowBack = true
} else {
state.isShowBack = false
}
state.calendarTitle = state.Tcalendar.view.title
getCalendarList()
}
return {
...toRefs(state),
changeDate,
getPrev,
handleDrap,
handleClickList,
handleEventResize,
handleChangePlanId,
getNext,
getToday,
closeDrawer,
getCalendarList,
handleSetting,
handleChangeType,
handleClick,
handleSelectDate
}
}
}
</script>
<style lang="scss" scoped>
.calendarHeader {
margin: 20px 30px 10px 20px;
display: flex;
flex-direction: row;
justify-content: space-between;
.header_select {
margin: 0 0 0 10px;
display: inline-block;
vertical-align: middle;
}
}
h1 {
font-size: 20px;
font-weight: 500;
line-height: 32px;
margin: 0 0 0 0;
text-align: left;
vertical-align: middle;
display: inline-block;
color: #303133;
}
// .el-button-group {
// vertical-align: top;
// }
</style>