mizzkey/src/client/app/desktop/views/components/ui.header.notifications.vue

137 lines
2.7 KiB
Vue
Raw Normal View History

2018-02-12 13:10:16 +01:00
<template>
2018-09-18 19:32:44 +02:00
<div class="notifications" v-hotkey.global="keymap">
<button :data-active="isOpen" @click="toggle" :title="$t('title')">
<i class="bell"><fa :icon="['far', 'bell']"/></i>
<i class="circle" v-if="hasUnreadNotification"><fa icon="circle"/></i>
2018-02-12 13:10:16 +01:00
</button>
2018-02-20 14:53:34 +01:00
<div class="pop" v-if="isOpen">
2018-02-12 13:10:16 +01:00
<mk-notifications/>
</div>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import i18n from '../../../i18n';
2018-02-12 13:10:16 +01:00
import contains from '../../../common/scripts/contains';
export default Vue.extend({
i18n: i18n('desktop/views/components/ui.header.notifications.vue'),
2018-02-12 13:10:16 +01:00
data() {
return {
2018-05-28 18:22:39 +02:00
isOpen: false
2018-02-12 13:10:16 +01:00
};
},
2018-09-18 19:32:44 +02:00
2018-05-28 18:22:39 +02:00
computed: {
hasUnreadNotification(): boolean {
return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadNotification;
2018-09-18 19:32:44 +02:00
},
keymap(): any {
return {
'shift+n': this.toggle
};
2018-02-12 13:10:16 +01:00
}
},
2018-09-18 19:32:44 +02:00
2018-02-12 13:10:16 +01:00
methods: {
toggle() {
this.isOpen ? this.close() : this.open();
},
open() {
this.isOpen = true;
for (const el of Array.from(document.querySelectorAll('body *'))) {
2018-02-12 13:10:16 +01:00
el.addEventListener('mousedown', this.onMousedown);
}
2018-02-12 13:10:16 +01:00
},
close() {
this.isOpen = false;
for (const el of Array.from(document.querySelectorAll('body *'))) {
2018-02-12 13:10:16 +01:00
el.removeEventListener('mousedown', this.onMousedown);
}
2018-02-12 13:10:16 +01:00
},
onMousedown(e) {
e.preventDefault();
if (!contains(this.$el, e.target) && this.$el != e.target) this.close();
return false;
}
}
});
</script>
<style lang="stylus" scoped>
2018-09-27 08:19:11 +02:00
.notifications
2018-02-12 13:10:16 +01:00
> button
display block
margin 0
padding 0
width 32px
2018-09-27 08:19:11 +02:00
color var(--desktopHeaderFg)
2018-02-12 13:10:16 +01:00
border none
background transparent
cursor pointer
*
pointer-events none
&:hover
&[data-active='true']
2018-09-27 08:19:11 +02:00
color var(--desktopHeaderHoverFg)
2018-02-12 13:10:16 +01:00
> i.bell
2018-02-12 13:10:16 +01:00
font-size 1.2em
line-height 48px
> i.circle
2018-02-12 13:10:16 +01:00
margin-left -5px
vertical-align super
font-size 10px
2018-12-30 17:15:32 +01:00
color var(--notificationIndicator)
2019-03-01 06:24:12 +01:00
animation blink 1s infinite
2018-02-12 13:10:16 +01:00
2018-02-20 14:53:34 +01:00
> .pop
2018-09-26 13:28:13 +02:00
$bgcolor = var(--face)
2018-02-12 13:10:16 +01:00
display block
position absolute
top 56px
right -72px
width 300px
2018-04-20 00:45:37 +02:00
background $bgcolor
2018-02-12 13:10:16 +01:00
border-radius 4px
2018-04-29 01:51:17 +02:00
box-shadow 0 1px 4px rgba(#000, 0.25)
2018-02-12 13:10:16 +01:00
&:before
content ""
pointer-events none
display block
position absolute
top -28px
right 74px
border-top solid 14px transparent
border-right solid 14px transparent
2018-04-29 01:51:17 +02:00
border-bottom solid 14px rgba(#000, 0.1)
2018-02-12 13:10:16 +01:00
border-left solid 14px transparent
&:after
content ""
pointer-events none
display block
position absolute
top -27px
right 74px
border-top solid 14px transparent
border-right solid 14px transparent
2018-04-20 00:45:37 +02:00
border-bottom solid 14px $bgcolor
2018-02-12 13:10:16 +01:00
border-left solid 14px transparent
2018-02-16 19:01:00 +01:00
> .mk-notifications
2018-02-12 13:10:16 +01:00
max-height 350px
font-size 1rem
overflow auto
</style>