275 lines
6.5 KiB
Vue
275 lines
6.5 KiB
Vue
<template>
|
|
<view class="wn-calendar">
|
|
<!-- {{ data}} -- {{labels}} -->
|
|
<!-- <view class="head">
|
|
<image @click="onChange('prev')"
|
|
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAAY5JREFUaEPtmEtugzAQhsc3aW5SbhI2SSOVCJ+g6QmoQqWWbspRcpNyELArQojUVqmw52EswYaNH/PNP57xWEHkn4rcflgAQiu4KBC9AsXxYw2qa6CFRutdIw2ECqGirA4K4GkwWp1s26XSECiAl7KyPzxuobGdSSQhaAF6GmEIegBhCB6AS1xZMInOdifOg80KcBbDqlTvNzUXBDvAEFHwrLPtgQNCBIATQgxghIDW1JRpVhSAA0IcgLpqBwKgu3oEBKCp2mEBCKp2eICxardm5ZOdZgMwiOF+9ZgVQN9T5NkmcanY8wKw0OT77SpaAJ+L32wU8In/czVxkev32D8tpedivsaHB+jbT2VSTNMTTgEC4wMq4J4ub0VnAAXojA+gAK3xsgDK1vnjQ+qZqG5OEwmhqJt6TI6foharAtzGs54BCeN5AIgK1JTwwQMcqy9QcHfdTPhlGg/w+v4JVq3HpxLXZmSql/8bhzrE/cJF+Xbf/zEXMgwIGgCzOcXcBYDCi5g1FgUw3qOYG70C39PtD0Aq3TXKAAAAAElFTkSuQmCC"
|
|
class="arrow left" mode="aspectFit"></image>
|
|
<text class="t">{{headText}}</text>
|
|
<image @click="onChange('next')"
|
|
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAAY5JREFUaEPtmEtugzAQhsc3aW5SbhI2SSOVCJ+g6QmoQqWWbspRcpNyELArQojUVqmw52EswYaNH/PNP57xWEHkn4rcflgAQiu4KBC9AsXxYw2qa6CFRutdIw2ECqGirA4K4GkwWp1s26XSECiAl7KyPzxuobGdSSQhaAF6GmEIegBhCB6AS1xZMInOdifOg80KcBbDqlTvNzUXBDvAEFHwrLPtgQNCBIATQgxghIDW1JRpVhSAA0IcgLpqBwKgu3oEBKCp2mEBCKp2eICxardm5ZOdZgMwiOF+9ZgVQN9T5NkmcanY8wKw0OT77SpaAJ+L32wU8In/czVxkev32D8tpedivsaHB+jbT2VSTNMTTgEC4wMq4J4ub0VnAAXojA+gAK3xsgDK1vnjQ+qZqG5OEwmhqJt6TI6foharAtzGs54BCeN5AIgK1JTwwQMcqy9QcHfdTPhlGg/w+v4JVq3HpxLXZmSql/8bhzrE/cJF+Xbf/zEXMgwIGgCzOcXcBYDCi5g1FgUw3qOYG70C39PtD0Aq3TXKAAAAAElFTkSuQmCC"
|
|
class="arrow" mode="aspectFit"></image>
|
|
</view> -->
|
|
|
|
<view class="labels">
|
|
<view class="label-item" v-for="(label) in labels" :key="label">
|
|
<text class="fs-28 bold colccc">{{label}}</text>
|
|
</view>
|
|
</view>
|
|
|
|
<view :class="['row', isBorder ? 'border' : '']" v-for="(row,rowi) in rows" :key="rowi">
|
|
<view @click="onChoose(item)" :class="['day-item', item.show ? 'show' : '']"
|
|
v-for="(item, ind) in days.slice(row*7, (row+1)*7)" :key="item.date">
|
|
<text class="t">{{item.label}}</text>
|
|
<text v-if="item.data" class="data" style="color: #f3a73f;">已打卡</text>
|
|
</view>
|
|
|
|
</view>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
import calendar from './calendar'
|
|
export default {
|
|
name: "w-calendar",
|
|
emits: ['choose', 'change'],
|
|
props: {
|
|
data: {
|
|
type: Array,
|
|
default () {
|
|
return []
|
|
}
|
|
},
|
|
colors: {
|
|
type: Array,
|
|
default () {
|
|
return ['#2979ff', '#18bc37', '#f3a73f', '#e43d33', '#8f939c']
|
|
}
|
|
},
|
|
format: {
|
|
type: String,
|
|
default: ''
|
|
},
|
|
isLess: {
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
isBorder: {
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
isEn: {
|
|
type: Boolean,
|
|
default: false
|
|
}
|
|
},
|
|
computed: {
|
|
headText() {
|
|
if (this.format === '/') {
|
|
return `${this.year}/${this.month}`
|
|
} else {
|
|
if (this.isEn) {
|
|
return `${calendar.getEn(this.month)}, ${this.year}`
|
|
} else {
|
|
return `${this.year}年${this.month}月`
|
|
}
|
|
}
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
labels: this.isEn ? calendar.labels_en : calendar.labels_zh,
|
|
active: '',
|
|
rows: [0, 1, 2, 3, 4, 5, 6],
|
|
days: [],
|
|
year: '',
|
|
month: ''
|
|
|
|
};
|
|
},
|
|
created() {
|
|
this.refresh()
|
|
},
|
|
watch :{
|
|
data:{
|
|
handler(newval){
|
|
// console.log(newval);
|
|
this.refresh()
|
|
}
|
|
}
|
|
},
|
|
mounted() {
|
|
// console.log('mounted',this.data);
|
|
},
|
|
methods: {
|
|
refresh() {
|
|
this.$nextTick(() => {
|
|
const {
|
|
days,
|
|
year,
|
|
month
|
|
} = calendar.getDays(this.year, this.month, this.data, this.isLess)
|
|
this.days = days
|
|
this.year = year
|
|
this.month = month + 1
|
|
})
|
|
},
|
|
onChange(type) {
|
|
this.month = type === 'prev' ? (this.month - 1) : (this.month + 1)
|
|
this.refresh()
|
|
this.$nextTick(() => {
|
|
this.$emit('change', {
|
|
year: this.year,
|
|
month: this.month
|
|
})
|
|
})
|
|
},
|
|
onChoose(item) {
|
|
if (!item.show) return;
|
|
this.active = item.date
|
|
this.$nextTick(() => {
|
|
this.$emit('choose', {
|
|
date: item.date,
|
|
data: item.data
|
|
})
|
|
})
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped>
|
|
.arrow {
|
|
/* #ifndef APP-NVUE */
|
|
box-sizing: border-box;
|
|
/* #endif */
|
|
padding: 4px;
|
|
width: 22px;
|
|
height: 22px;
|
|
background: #f7f7f7;
|
|
border-radius: 22px;
|
|
}
|
|
|
|
.arrow.left {
|
|
transform: rotate(180deg);
|
|
}
|
|
|
|
.wn-calendar {
|
|
min-width: 294px;
|
|
/* background: white; */
|
|
/* width: 702rpx; */
|
|
/* height: 582rpx; */
|
|
background: #FFFFFF;
|
|
box-shadow: 0rpx 6rpx 12rpx 2rpx rgba(0, 0, 0, 0.16);
|
|
border-radius: 20rpx 20rpx 20rpx 20rpx;
|
|
/* opacity: 1; */
|
|
}
|
|
|
|
.head {
|
|
/* #ifndef APP-NVUE */
|
|
display: flex;
|
|
/* #endif */
|
|
flex-direction: row;
|
|
justify-content: center;
|
|
align-items: center;
|
|
padding: 8px 0px;
|
|
}
|
|
|
|
.head .t {
|
|
padding: 0 42px;
|
|
font-size: 16px;
|
|
line-height: 32px;
|
|
color: #3a3a3a;
|
|
}
|
|
|
|
.labels {
|
|
/* #ifndef APP-NVUE */
|
|
box-sizing: border-box;
|
|
display: flex;
|
|
/* #endif */
|
|
flex-direction: row;
|
|
height: 36px;
|
|
align-items: center;
|
|
/* background: #f7f7f7; */
|
|
/* border-top: 1px solid #f0f0f0; */
|
|
/* border-bottom: 1px solid #f0f0f0; */
|
|
}
|
|
|
|
.label-item {
|
|
min-width: 42px;
|
|
flex: 1;
|
|
/* #ifndef APP-NVUE */
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
/* #endif */
|
|
}
|
|
|
|
.label-item .t {
|
|
font-size: 14px;
|
|
text-align: center;
|
|
line-height: 14px;
|
|
color: #3a3a3a;
|
|
}
|
|
|
|
.row {
|
|
/* #ifndef APP-NVUE */
|
|
box-sizing: border-box;
|
|
display: flex;
|
|
/* #endif */
|
|
flex-direction: row;
|
|
border-bottom: 1px solid transparent;
|
|
}
|
|
|
|
.row.border {
|
|
/* border-bottom: 1px solid #f0f0f0; */
|
|
}
|
|
|
|
.day-item {
|
|
/* #ifndef APP-NVUE */
|
|
box-sizing: border-box;
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
/* #endif */
|
|
flex: 1;
|
|
justify-content: center;
|
|
padding: 7px 0px;
|
|
border-radius: 4px;
|
|
height: 42px;
|
|
min-width: 42px;
|
|
}
|
|
|
|
.day-item.show {}
|
|
|
|
.day-item.active {
|
|
background: #ededed !important;
|
|
}
|
|
|
|
.day-item.active .t {
|
|
font-weight: bold !important;
|
|
}
|
|
|
|
.day-item .t {
|
|
font-size: 15px;
|
|
line-height: 15px;
|
|
text-align: center;
|
|
color: #909399;
|
|
}
|
|
|
|
.day-item.show .t {
|
|
color: #3a3a3a;
|
|
}
|
|
|
|
.day-item .data {
|
|
margin-top: 2px;
|
|
font-size: 11px;
|
|
line-height: 11px;
|
|
text-align: center;
|
|
/* #ifdef APP-NVUE */
|
|
text-overflow: clip;
|
|
word-wrap: anywhere;
|
|
/* #endif */
|
|
color: #3a3a3a;
|
|
}
|
|
</style> |