Add notification UI component
This commit is contained in:
parent
5e4aca66c5
commit
55fbd30699
130
src/csui/NotificationUi.vue
Normal file
130
src/csui/NotificationUi.vue
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
<template>
|
||||||
|
<div v-if="showNotification" class="root-window flex flex-column overflow-hidden">
|
||||||
|
<div class="notification-popup flex flex-row">
|
||||||
|
<div v-if="notificationIcon" class="flex-nogrow flex-noshrink notification-icon">
|
||||||
|
<Icon
|
||||||
|
class="flex-nogrow flex-noshrink"
|
||||||
|
:icon="notificationIcon"
|
||||||
|
@click="closeNotification()"
|
||||||
|
>
|
||||||
|
</Icon>
|
||||||
|
</div>
|
||||||
|
<div class="notification-context flex-grow flex-shrink flex flex-column">
|
||||||
|
<div
|
||||||
|
class="notification-text"
|
||||||
|
v-html="notificationText"
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-if="notificationActions"
|
||||||
|
class="action-buttons flex flex-row"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
v-for="action of notificationActions"
|
||||||
|
:key="action"
|
||||||
|
@click="action.command"
|
||||||
|
>
|
||||||
|
<Icon v-if="action.icon" :icon="action.icon"></Icon>{{action.label}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="notification-icon">
|
||||||
|
<Icon
|
||||||
|
class="flex-nogrow flex-noshrink"
|
||||||
|
icon="x"
|
||||||
|
@click="closeNotification()"
|
||||||
|
>
|
||||||
|
</Icon>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import Icon from '../common/components/Icon';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
Icon,
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
// notificationIcon: null,
|
||||||
|
// notificationText: null,
|
||||||
|
// notificationActions: null,
|
||||||
|
// showNotification: false,
|
||||||
|
notificationTimeout: null,
|
||||||
|
notificationIcon: "exclamation-triangle",
|
||||||
|
notificationText: "this is a test notification <b>with some html for bold measure</b>",
|
||||||
|
notificationActions: null,
|
||||||
|
showNotification: true,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
...mapState([
|
||||||
|
'notificationConfig'
|
||||||
|
]),
|
||||||
|
watch: {
|
||||||
|
/**
|
||||||
|
* Sets new notification config. Currently, we can only show one notification at a time.
|
||||||
|
*
|
||||||
|
* We expect a config object like this:
|
||||||
|
* {
|
||||||
|
* timeout: number — how long we'll be displaying the notification. If empty, 10s. -1: until user dismisses it
|
||||||
|
* icon: string — what icon we're gonna show. We're using bootstrap icons. Can be empty.
|
||||||
|
* text: — notification text. Supports HTML.
|
||||||
|
* notificationActions: [
|
||||||
|
* {
|
||||||
|
* command: function that gets executed upon clicking the button.
|
||||||
|
* label: label of the button
|
||||||
|
* icon: icon of the button
|
||||||
|
* }
|
||||||
|
* ]
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
notificationConfig(newConfig) {
|
||||||
|
if (newConfig) {
|
||||||
|
this.notificationText = newConfig.text;
|
||||||
|
this.notificationActions = newConfig.notificationActions;
|
||||||
|
this.notificationIcon = newConfig.icon;
|
||||||
|
|
||||||
|
this.showNotification = true;
|
||||||
|
|
||||||
|
if (newConfig.timeout !== -1) {
|
||||||
|
this.notificationTimeout = setTimeout(() => this.closeNotification(), newConfig.timeout ?? 10000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
closeNotification() {
|
||||||
|
clearTimeout(this.notificationTimeout);
|
||||||
|
|
||||||
|
this.showNotification = false;
|
||||||
|
this.notificationIcon = null;
|
||||||
|
this.notificationText = null;
|
||||||
|
this.notificationActions = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.root-window {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.notification-popup {
|
||||||
|
position: absolute;
|
||||||
|
z-index: 99999999;
|
||||||
|
background-color: rgba(0,0,0,0.88);
|
||||||
|
top: 2rem;
|
||||||
|
left: 2rem;
|
||||||
|
width: 15rem;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.notification-icon {
|
||||||
|
font-size: 3rem;
|
||||||
|
}
|
||||||
|
</style>
|
Loading…
Reference in New Issue
Block a user