fix: Due date badge in dark mode / compact mode (fix #4386)
Signed-off-by: Julius Härtl <jus@bitgrid.net>
This commit is contained in:
@@ -21,18 +21,31 @@
|
|||||||
-->
|
-->
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div v-if="card" class="duedate">
|
<div v-if="card" class="duedate" :data-due-state="dueState">
|
||||||
<transition name="zoom">
|
<transition name="zoom">
|
||||||
<div v-if="card.duedate" :class="dueIcon" :title="absoluteDate">
|
<div v-if="card.duedate" class="due" :title="absoluteDate">
|
||||||
<span>{{ relativeDate }}</span>
|
<Clock v-if="overdue" :size="16" />
|
||||||
|
<ClockOutline v-else :size="16" />
|
||||||
|
<span v-if="!compactMode" class="due--label">{{ relativeDate }}</span>
|
||||||
</div>
|
</div>
|
||||||
</transition>
|
</transition>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import { mapState } from 'vuex'
|
||||||
import moment from '@nextcloud/moment'
|
import moment from '@nextcloud/moment'
|
||||||
|
import Clock from 'vue-material-design-icons/Clock.vue'
|
||||||
|
import ClockOutline from 'vue-material-design-icons/ClockOutline.vue'
|
||||||
|
import CalendarAlert from 'vue-material-design-icons/CalendarAlert.vue'
|
||||||
|
import CalendarBlank from 'vue-material-design-icons/CalendarBlank.vue'
|
||||||
|
|
||||||
|
const DueState = {
|
||||||
|
Future: 'Future',
|
||||||
|
Next: 'Next',
|
||||||
|
Now: 'Now',
|
||||||
|
Overdue: 'Overdue',
|
||||||
|
}
|
||||||
export default {
|
export default {
|
||||||
name: 'DueDate',
|
name: 'DueDate',
|
||||||
props: {
|
props: {
|
||||||
@@ -41,19 +54,32 @@ export default {
|
|||||||
default: null,
|
default: null,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
components: {
|
||||||
|
Clock,
|
||||||
|
ClockOutline,
|
||||||
|
CalendarAlert,
|
||||||
|
CalendarBlank,
|
||||||
|
},
|
||||||
computed: {
|
computed: {
|
||||||
dueIcon() {
|
...mapState({
|
||||||
|
compactMode: state => state.compactMode,
|
||||||
|
}),
|
||||||
|
dueState() {
|
||||||
const days = Math.floor(moment(this.card.duedate).diff(this.$root.time, 'seconds') / 60 / 60 / 24)
|
const days = Math.floor(moment(this.card.duedate).diff(this.$root.time, 'seconds') / 60 / 60 / 24)
|
||||||
if (days < 0) {
|
if (days < 0) {
|
||||||
return 'icon-calendar due icon overdue'
|
return DueState.Overdue
|
||||||
}
|
}
|
||||||
if (days === 0) {
|
if (days === 0) {
|
||||||
return 'icon-calendar-dark due icon now'
|
return DueState.Now
|
||||||
}
|
}
|
||||||
if (days === 1) {
|
if (days === 1) {
|
||||||
return 'icon-calendar-dark due icon next'
|
return DueState.Overdue
|
||||||
}
|
}
|
||||||
return 'icon-calendar-dark due icon'
|
|
||||||
|
return DueState.Future
|
||||||
|
},
|
||||||
|
overdue() {
|
||||||
|
this.dueState === DueState.Overdue
|
||||||
},
|
},
|
||||||
relativeDate() {
|
relativeDate() {
|
||||||
const diff = moment(this.$root.time).diff(this.card.duedate, 'seconds')
|
const diff = moment(this.$root.time).diff(this.card.duedate, 'seconds')
|
||||||
@@ -63,49 +89,43 @@ export default {
|
|||||||
return moment(this.card.duedate).fromNow()
|
return moment(this.card.duedate).fromNow()
|
||||||
},
|
},
|
||||||
absoluteDate() {
|
absoluteDate() {
|
||||||
return moment(this.card.duedate).format('L')
|
return moment(this.card.duedate).format('LLLL')
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.icon.due {
|
.due {
|
||||||
background-position: 4px center;
|
background-position: 4px center;
|
||||||
border-radius: 3px;
|
border-radius: var(--border-radius-large);
|
||||||
margin-top: 9px;
|
margin-top: 9px;
|
||||||
margin-bottom: 9px;
|
margin-bottom: 9px;
|
||||||
padding: 3px 0 3px 4px;
|
padding: 2px 8px;
|
||||||
font-size: 90%;
|
font-size: 90%;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
flex-shrink: 1;
|
flex-shrink: 1;
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
|
|
||||||
.icon {
|
[data-due-state="Overdue"] & {
|
||||||
background-size: contain;
|
color: var(--color-main-background);
|
||||||
|
background-color: var(--color-error-text);
|
||||||
|
}
|
||||||
|
[data-due-state="Now"] & {
|
||||||
|
color: var(--color-main-background);
|
||||||
|
background-color: var(--color-warning);
|
||||||
}
|
}
|
||||||
|
|
||||||
&.overdue {
|
|
||||||
color: var(--color-error-text);
|
|
||||||
padding: 3px 4px;
|
|
||||||
}
|
|
||||||
&.now {
|
|
||||||
color: var(--color-warning-text);
|
|
||||||
padding: 3px 4px;
|
|
||||||
}
|
|
||||||
&.next {
|
|
||||||
background-color: var(--color-background-dark);
|
|
||||||
padding: 3px 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&::before,
|
|
||||||
span {
|
span {
|
||||||
margin-left: 20px;
|
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.due--label {
|
||||||
|
margin-left: 4px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@media print {
|
@media print {
|
||||||
|
|||||||
Reference in New Issue
Block a user