primevue-mirror/components/lib/toast/Toast.vue

163 lines
5.1 KiB
Vue
Raw Normal View History

2022-09-06 12:03:37 +00:00
<template>
<Portal>
2023-07-07 12:06:58 +00:00
<div ref="container" :class="cx('root')" :style="sx('root', true, { position })" v-bind="{ ...$attrs, ...ptm('root') }">
2023-08-02 12:02:57 +00:00
<transition-group name="p-toast-message" tag="div" @enter="onEnter" @leave="onLeave" v-bind="{ ...ptm('message'), ...ptm('transition') }">
<ToastMessage
v-for="msg of messages"
:key="msg.id"
:message="msg"
:templates="$slots"
:closeIcon="closeIcon"
:infoIcon="infoIcon"
:warnIcon="warnIcon"
:errorIcon="errorIcon"
:successIcon="successIcon"
:closeButtonProps="closeButtonProps"
@close="remove($event)"
2023-04-28 13:39:19 +00:00
:pt="pt"
/>
2022-09-06 12:03:37 +00:00
</transition-group>
</div>
</Portal>
</template>
<script>
2022-12-08 11:04:25 +00:00
import Portal from 'primevue/portal';
2022-09-06 12:03:37 +00:00
import ToastEventBus from 'primevue/toasteventbus';
import { DomHandler, ObjectUtils, UniqueComponentId, ZIndexUtils } from 'primevue/utils';
import BaseToast from './BaseToast.vue';
2022-09-06 12:03:37 +00:00
import ToastMessage from './ToastMessage.vue';
var messageIdx = 0;
export default {
name: 'Toast',
2023-05-25 21:53:07 +00:00
extends: BaseToast,
2022-09-06 12:03:37 +00:00
inheritAttrs: false,
emits: ['close', 'life-end'],
2022-09-06 12:03:37 +00:00
data() {
return {
messages: []
2022-09-14 11:26:01 +00:00
};
2022-09-06 12:03:37 +00:00
},
styleElement: null,
mounted() {
ToastEventBus.on('add', this.onAdd);
ToastEventBus.on('remove', this.onRemove);
2022-09-06 12:03:37 +00:00
ToastEventBus.on('remove-group', this.onRemoveGroup);
ToastEventBus.on('remove-all-groups', this.onRemoveAllGroups);
if (this.breakpoints) {
this.createStyle();
}
},
beforeUnmount() {
this.destroyStyle();
if (this.$refs.container && this.autoZIndex) {
ZIndexUtils.clear(this.$refs.container);
}
ToastEventBus.off('add', this.onAdd);
ToastEventBus.off('remove', this.onRemove);
2022-09-06 12:03:37 +00:00
ToastEventBus.off('remove-group', this.onRemoveGroup);
ToastEventBus.off('remove-all-groups', this.onRemoveAllGroups);
},
methods: {
add(message) {
if (message.id == null) {
message.id = messageIdx++;
}
this.messages = [...this.messages, message];
},
remove(params) {
2022-09-06 12:03:37 +00:00
let index = -1;
2022-09-14 11:26:01 +00:00
2022-09-06 12:03:37 +00:00
for (let i = 0; i < this.messages.length; i++) {
if (this.messages[i] === params.message) {
2022-09-06 12:03:37 +00:00
index = i;
break;
}
}
this.messages.splice(index, 1);
this.$emit(params.type, { message: params.message });
2022-09-06 12:03:37 +00:00
},
onAdd(message) {
if (this.group == message.group) {
this.add(message);
}
},
onRemove(message) {
this.remove({ message, type: 'close' });
},
2022-09-06 12:03:37 +00:00
onRemoveGroup(group) {
if (this.group === group) {
this.messages = [];
}
},
onRemoveAllGroups() {
this.messages = [];
},
onEnter() {
this.$refs.container.setAttribute(this.attributeSelector, '');
if (this.autoZIndex) {
ZIndexUtils.set('modal', this.$refs.container, this.baseZIndex || this.$primevue.config.zIndex.modal);
}
},
onLeave() {
if (this.$refs.container && this.autoZIndex && ObjectUtils.isEmpty(this.messages)) {
2022-12-08 11:04:25 +00:00
setTimeout(() => {
ZIndexUtils.clear(this.$refs.container);
}, 200);
2022-09-06 12:03:37 +00:00
}
},
createStyle() {
if (!this.styleElement && !this.isUnstyled) {
2022-09-06 12:03:37 +00:00
this.styleElement = document.createElement('style');
this.styleElement.type = 'text/css';
DomHandler.setAttribute(this.styleElement, 'nonce', this.$primevue?.config?.csp?.nonce);
2022-09-06 12:03:37 +00:00
document.head.appendChild(this.styleElement);
let innerHTML = '';
2022-09-14 11:26:01 +00:00
2022-09-06 12:03:37 +00:00
for (let breakpoint in this.breakpoints) {
let breakpointStyle = '';
2022-09-14 11:26:01 +00:00
2022-09-06 12:03:37 +00:00
for (let styleProp in this.breakpoints[breakpoint]) {
breakpointStyle += styleProp + ':' + this.breakpoints[breakpoint][styleProp] + '!important;';
}
2022-09-14 11:26:01 +00:00
2022-09-06 12:03:37 +00:00
innerHTML += `
@media screen and (max-width: ${breakpoint}) {
.p-toast[${this.attributeSelector}] {
${breakpointStyle}
}
}
`;
}
this.styleElement.innerHTML = innerHTML;
}
},
destroyStyle() {
if (this.styleElement) {
document.head.removeChild(this.styleElement);
this.styleElement = null;
}
}
},
computed: {
attributeSelector() {
return UniqueComponentId();
}
2022-09-14 11:26:01 +00:00
},
components: {
ToastMessage: ToastMessage,
Portal: Portal
2022-09-06 12:03:37 +00:00
}
2022-09-14 11:26:01 +00:00
};
2022-09-06 12:03:37 +00:00
</script>