misskey/src/client/app/common/views/widgets/calendar.vue

207 lines
4.4 KiB
Vue
Raw Normal View History

2018-02-15 03:36:42 +00:00
<template>
<div class="mkw-calendar" :data-special="special" :data-mobile="platform == 'mobile'">
2018-05-18 00:40:57 +00:00
<mk-widget-container :naked="props.design == 1" :show-header="false">
<div class="mkw-calendar--body">
<div class="calendar" :data-is-holiday="isHoliday">
<p class="month-and-year">
2018-08-01 21:58:15 +00:00
<span class="year">%i18n:@year-english%{{ year }}%i18n:@year-japanese%</span>
<span class="month">%i18n:@month-english%{{ month }}%i18n:@month-japanese%</span>
2018-05-18 00:40:57 +00:00
</p>
2018-08-01 21:58:15 +00:00
<p class="day">%i18n:@day-english%{{ day }}%i18n:@day-japanese%</p>
<p class="week-day">{{ weekDay }}</p>
2018-02-15 03:36:42 +00:00
</div>
2018-05-18 00:40:57 +00:00
<div class="info">
<div>
2018-08-01 21:58:15 +00:00
<p>%i18n:@today%<b>{{ dayP.toFixed(1) }}%</b></p>
2018-05-18 00:40:57 +00:00
<div class="meter">
<div class="val" :style="{ width: `${dayP}%` }"></div>
</div>
</div>
<div>
2018-08-01 21:58:15 +00:00
<p>%i18n:@this-month%<b>{{ monthP.toFixed(1) }}%</b></p>
2018-05-18 00:40:57 +00:00
<div class="meter">
<div class="val" :style="{ width: `${monthP}%` }"></div>
</div>
</div>
<div>
2018-08-01 21:58:15 +00:00
<p>%i18n:@this-year%<b>{{ yearP.toFixed(1) }}%</b></p>
2018-05-18 00:40:57 +00:00
<div class="meter">
<div class="val" :style="{ width: `${yearP}%` }"></div>
</div>
</div>
2018-02-15 03:36:42 +00:00
</div>
</div>
2018-05-18 00:40:57 +00:00
</mk-widget-container>
2018-02-15 03:36:42 +00:00
</div>
</template>
<script lang="ts">
2018-02-24 15:18:09 +00:00
import define from '../../../common/define-widget';
2018-02-15 03:36:42 +00:00
export default define({
name: 'calendar',
2018-02-21 06:30:03 +00:00
props: () => ({
2018-02-15 03:36:42 +00:00
design: 0
2018-02-21 06:30:03 +00:00
})
2018-02-15 03:36:42 +00:00
}).extend({
data() {
return {
now: new Date(),
year: null,
month: null,
day: null,
weekDay: null,
yearP: null,
dayP: null,
monthP: null,
isHoliday: null,
special: null,
clock: null
};
},
created() {
this.tick();
this.clock = setInterval(this.tick, 1000);
},
beforeDestroy() {
clearInterval(this.clock);
},
methods: {
func() {
if (this.platform == 'mobile') return;
2018-02-15 03:36:42 +00:00
if (this.props.design == 2) {
this.props.design = 0;
} else {
this.props.design++;
}
2018-04-29 08:17:15 +00:00
this.save();
2018-02-15 03:36:42 +00:00
},
tick() {
const now = new Date();
const nd = now.getDate();
const nm = now.getMonth();
const ny = now.getFullYear();
this.year = ny;
this.month = nm + 1;
this.day = nd;
2018-08-01 21:58:15 +00:00
this.weekDay = [
'%i18n:common.weekday.sunday%',
'%i18n:common.weekday.monday%',
'%i18n:common.weekday.tuesday%',
'%i18n:common.weekday.wednesday%',
'%i18n:common.weekday.thursday%',
'%i18n:common.weekday.friday%',
'%i18n:common.weekday.saturday%'
][now.getDay()];
2018-02-15 03:36:42 +00:00
const dayNumer = now.getTime() - new Date(ny, nm, nd).getTime();
const dayDenom = 1000/*ms*/ * 60/*s*/ * 60/*m*/ * 24/*h*/;
const monthNumer = now.getTime() - new Date(ny, nm, 1).getTime();
const monthDenom = new Date(ny, nm + 1, 1).getTime() - new Date(ny, nm, 1).getTime();
const yearNumer = now.getTime() - new Date(ny, 0, 1).getTime();
const yearDenom = new Date(ny + 1, 0, 1).getTime() - new Date(ny, 0, 1).getTime();
this.dayP = dayNumer / dayDenom * 100;
this.monthP = monthNumer / monthDenom * 100;
this.yearP = yearNumer / yearDenom * 100;
this.isHoliday = now.getDay() == 0 || now.getDay() == 6;
this.special =
nm == 0 && nd == 1 ? 'on-new-years-day' :
false;
}
}
});
</script>
<style lang="stylus" scoped>
2018-03-03 04:47:55 +00:00
@import '~const.styl'
2018-04-19 19:51:04 +00:00
root(isDark)
2018-02-15 03:36:42 +00:00
&[data-special='on-new-years-day']
border-color #ef95a0
2018-05-18 00:40:57 +00:00
.mkw-calendar--body
padding 16px 0
color isDark ? #c5ced6 : #777
2018-02-15 03:36:42 +00:00
2018-05-18 00:40:57 +00:00
&:after
content ""
display block
clear both
2018-02-15 03:36:42 +00:00
2018-05-18 00:40:57 +00:00
> .calendar
float left
width 60%
text-align center
2018-02-15 03:36:42 +00:00
2018-05-18 00:40:57 +00:00
&[data-is-holiday]
> .day
color #ef95a0
2018-02-15 03:36:42 +00:00
> p
2018-05-18 00:40:57 +00:00
margin 0
2018-02-15 03:36:42 +00:00
line-height 18px
2018-05-18 00:40:57 +00:00
font-size 14px
2018-02-15 03:36:42 +00:00
2018-05-18 00:40:57 +00:00
> span
margin 0 4px
2018-02-15 03:36:42 +00:00
2018-05-18 00:40:57 +00:00
> .day
margin 10px 0
line-height 32px
font-size 28px
> .info
display block
float left
width 40%
padding 0 16px 0 0
> div
margin-bottom 8px
&:last-child
margin-bottom 4px
> p
margin 0 0 2px 0
font-size 12px
line-height 18px
color isDark ? #7a8692 : #888
> b
margin-left 2px
> .meter
width 100%
overflow hidden
background isDark ? #1c1f25 : #eee
border-radius 8px
> .val
height 4px
background $theme-color
2018-07-18 15:13:58 +00:00
transition width .3s cubic-bezier(0.23, 1, 0.32, 1)
2018-05-18 00:40:57 +00:00
&:nth-child(1)
> .meter > .val
background #f7796c
&:nth-child(2)
> .meter > .val
background #a1de41
&:nth-child(3)
> .meter > .val
background #41ddde
2018-02-15 03:36:42 +00:00
2018-04-19 19:51:04 +00:00
.mkw-calendar[data-darkmode]
root(true)
.mkw-calendar:not([data-darkmode])
root(false)
2018-02-15 03:36:42 +00:00
</style>