primeng
Version:
PrimeNG is an open source UI library for Angular featuring a rich set of 80+ components, a theme designer, various theme alternatives such as Material, Bootstrap, Tailwind, premium templates and professional support. In addition, it integrates with PrimeB
1,116 lines (1,068 loc) • 47.2 kB
JavaScript
import { trigger, state, style, transition, animate, query, animateChild } from '@angular/animations';
import * as i1 from '@angular/common';
import { CommonModule } from '@angular/common';
import * as i0 from '@angular/core';
import { Injectable, EventEmitter, inject, numberAttribute, Component, ViewEncapsulation, ChangeDetectionStrategy, Input, Output, ViewChild, booleanAttribute, ContentChild, ContentChildren, NgModule } from '@angular/core';
import { uuid, isEmpty, setAttribute } from '@primeuix/utils';
import { SharedModule, MessageService, PrimeTemplate } from 'primeng/api';
import { BaseComponent } from 'primeng/basecomponent';
import { Button } from 'primeng/button';
import { CheckIcon, ExclamationTriangleIcon, InfoCircleIcon, TimesIcon, TimesCircleIcon } from 'primeng/icons';
import { ZIndexUtils } from 'primeng/utils';
import { BaseStyle } from 'primeng/base';
const theme = ({ dt }) => `
.p-toast {
width: ${dt('toast.width')};
white-space: pre-line;
word-break: break-word;
}
.p-toast-message {
margin: 0 0 1rem 0;
}
.p-toast-message-icon {
flex-shrink: 0;
font-size: ${dt('toast.icon.size')};
width: ${dt('toast.icon.size')};
height: ${dt('toast.icon.size')};
}
.p-toast-message-content {
display: flex;
align-items: flex-start;
padding: ${dt('toast.content.padding')};
gap: ${dt('toast.content.gap')};
}
.p-toast-message-text {
flex: 1 1 auto;
display: flex;
flex-direction: column;
gap: ${dt('toast.text.gap')};
}
.p-toast-summary {
font-weight: ${dt('toast.summary.font.weight')};
font-size: ${dt('toast.summary.font.size')};
}
.p-toast-detail {
font-weight: ${dt('toast.detail.font.weight')};
font-size: ${dt('toast.detail.font.size')};
}
.p-toast-close-button {
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
position: relative;
cursor: pointer;
background: transparent;
transition: background ${dt('toast.transition.duration')}, color ${dt('toast.transition.duration')}, outline-color ${dt('toast.transition.duration')}, box-shadow ${dt('toast.transition.duration')};
outline-color: transparent;
color: inherit;
width: ${dt('toast.close.button.width')};
height: ${dt('toast.close.button.height')};
border-radius: ${dt('toast.close.button.border.radius')};
margin: -25% 0 0 0;
right: -25%;
padding: 0;
border: none;
user-select: none;
}
.p-toast-close-button:dir(rtl) {
margin: -25% 0 0 auto;
left: -25%;
right: auto;
}
.p-toast-message-info,
.p-toast-message-success,
.p-toast-message-warn,
.p-toast-message-error,
.p-toast-message-secondary,
.p-toast-message-contrast {
border-width: ${dt('toast.border.width')};
border-style: solid;
backdrop-filter: blur(${dt('toast.blur')});
border-radius: ${dt('toast.border.radius')};
}
.p-toast-close-icon {
font-size: ${dt('toast.close.icon.size')};
width: ${dt('toast.close.icon.size')};
height: ${dt('toast.close.icon.size')};
}
.p-toast-close-button:focus-visible {
outline-width: ${dt('focus.ring.width')};
outline-style: ${dt('focus.ring.style')};
outline-offset: ${dt('focus.ring.offset')};
}
.p-toast-message-info {
background: ${dt('toast.info.background')};
border-color: ${dt('toast.info.border.color')};
color: ${dt('toast.info.color')};
box-shadow: ${dt('toast.info.shadow')};
}
.p-toast-message-info .p-toast-detail {
color: ${dt('toast.info.detail.color')};
}
.p-toast-message-info .p-toast-close-button:focus-visible {
outline-color: ${dt('toast.info.close.button.focus.ring.color')};
box-shadow: ${dt('toast.info.close.button.focus.ring.shadow')};
}
.p-toast-message-info .p-toast-close-button:hover {
background: ${dt('toast.info.close.button.hover.background')};
}
.p-toast-message-success {
background: ${dt('toast.success.background')};
border-color: ${dt('toast.success.border.color')};
color: ${dt('toast.success.color')};
box-shadow: ${dt('toast.success.shadow')};
}
.p-toast-message-success .p-toast-detail {
color: ${dt('toast.success.detail.color')};
}
.p-toast-message-success .p-toast-close-button:focus-visible {
outline-color: ${dt('toast.success.close.button.focus.ring.color')};
box-shadow: ${dt('toast.success.close.button.focus.ring.shadow')};
}
.p-toast-message-success .p-toast-close-button:hover {
background: ${dt('toast.success.close.button.hover.background')};
}
.p-toast-message-warn {
background: ${dt('toast.warn.background')};
border-color: ${dt('toast.warn.border.color')};
color: ${dt('toast.warn.color')};
box-shadow: ${dt('toast.warn.shadow')};
}
.p-toast-message-warn .p-toast-detail {
color: ${dt('toast.warn.detail.color')};
}
.p-toast-message-warn .p-toast-close-button:focus-visible {
outline-color: ${dt('toast.warn.close.button.focus.ring.color')};
box-shadow: ${dt('toast.warn.close.button.focus.ring.shadow')};
}
.p-toast-message-warn .p-toast-close-button:hover {
background: ${dt('toast.warn.close.button.hover.background')};
}
.p-toast-message-error {
background: ${dt('toast.error.background')};
border-color: ${dt('toast.error.border.color')};
color: ${dt('toast.error.color')};
box-shadow: ${dt('toast.error.shadow')};
}
.p-toast-message-error .p-toast-detail {
color: ${dt('toast.error.detail.color')};
}
.p-toast-message-error .p-toast-close-button:focus-visible {
outline-color: ${dt('toast.error.close.button.focus.ring.color')};
box-shadow: ${dt('toast.error.close.button.focus.ring.shadow')};
}
.p-toast-message-error .p-toast-close-button:hover {
background: ${dt('toast.error.close.button.hover.background')};
}
.p-toast-message-secondary {
background: ${dt('toast.secondary.background')};
border-color: ${dt('toast.secondary.border.color')};
color: ${dt('toast.secondary.color')};
box-shadow: ${dt('toast.secondary.shadow')};
}
.p-toast-message-secondary .p-toast-detail {
color: ${dt('toast.secondary.detail.color')};
}
.p-toast-message-secondary .p-toast-close-button:focus-visible {
outline-color: ${dt('toast.secondary.close.button.focus.ring.color')};
box-shadow: ${dt('toast.secondary.close.button.focus.ring.shadow')};
}
.p-toast-message-secondary .p-toast-close-button:hover {
background: ${dt('toast.secondary.close.button.hover.background')};
}
.p-toast-message-contrast {
background: ${dt('toast.contrast.background')};
border-color: ${dt('toast.contrast.border.color')};
color: ${dt('toast.contrast.color')};
box-shadow: ${dt('toast.contrast.shadow')};
}
.p-toast-message-contrast .p-toast-detail {
color: ${dt('toast.contrast.detail.color')};
}
.p-toast-message-contrast .p-toast-close-button:focus-visible {
outline-color: ${dt('toast.contrast.close.button.focus.ring.color')};
box-shadow: ${dt('toast.contrast.close.button.focus.ring.shadow')};
}
.p-toast-message-contrast .p-toast-close-button:hover {
background: ${dt('toast.contrast.close.button.hover.background')};
}
.p-toast-top-center {
transform: translateX(-50%);
}
.p-toast-bottom-center {
transform: translateX(-50%);
}
.p-toast-center {
min-width: 20vw;
transform: translate(-50%, -50%);
}
.p-toast-message-enter-from {
opacity: 0;
transform: translateY(50%);
}
.p-toast-message-leave-from {
max-height: 1000px;
}
.p-toast .p-toast-message.p-toast-message-leave-to {
max-height: 0;
opacity: 0;
margin-bottom: 0;
overflow: hidden;
}
.p-toast-message-enter-active {
transition: transform 0.3s, opacity 0.3s;
}
.p-toast-message-leave-active {
transition: max-height 0.45s cubic-bezier(0, 1, 0, 1), opacity 0.3s, margin-bottom 0.3s;
}
`;
// Position
const inlineStyles = {
root: ({ instance }) => {
const { _position } = instance;
return {
position: 'fixed',
top: _position === 'top-right' || _position === 'top-left' || _position === 'top-center' ? '20px' : _position === 'center' ? '50%' : null,
right: (_position === 'top-right' || _position === 'bottom-right') && '20px',
bottom: (_position === 'bottom-left' || _position === 'bottom-right' || _position === 'bottom-center') && '20px',
left: _position === 'top-left' || _position === 'bottom-left' ? '20px' : _position === 'center' || _position === 'top-center' || _position === 'bottom-center' ? '50%' : null
};
}
};
const classes = {
root: ({ instance }) => ({ 'p-toast p-component': true, [`p-toast-${instance._position}`]: !!instance._position }),
message: ({ instance }) => ({
'p-toast-message': true,
'p-toast-message-info': instance.message.severity === 'info' || instance.message.severity === undefined,
'p-toast-message-warn': instance.message.severity === 'warn',
'p-toast-message-error': instance.message.severity === 'error',
'p-toast-message-success': instance.message.severity === 'success',
'p-toast-message-secondary': instance.message.severity === 'secondary',
'p-toast-message-contrast': instance.message.severity === 'contrast'
}),
messageContent: 'p-toast-message-content',
messageIcon: ({ instance }) => ({
'p-toast-message-icon': true,
[`pi ${instance.message.icon}`]: !!instance.message.icon
}),
messageText: 'p-toast-message-text',
summary: 'p-toast-summary',
detail: 'p-toast-detail',
closeButton: 'p-toast-close-button',
closeIcon: ({ instance }) => ({
'p-toast-close-icon': true,
[`pi ${instance.message.closeIcon}`]: !!instance.message.closeIcon
})
};
class ToastStyle extends BaseStyle {
name = 'toast';
theme = theme;
classes = classes;
inlineStyles = inlineStyles;
static ɵfac = /*@__PURE__*/ (() => { let ɵToastStyle_BaseFactory; return function ToastStyle_Factory(__ngFactoryType__) { return (ɵToastStyle_BaseFactory || (ɵToastStyle_BaseFactory = i0.ɵɵgetInheritedFactory(ToastStyle)))(__ngFactoryType__ || ToastStyle); }; })();
static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: ToastStyle, factory: ToastStyle.ɵfac });
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ToastStyle, [{
type: Injectable
}], null, null); })();
/**
*
* Toast is used to display messages in an overlay.
*
* [Live Demo](https://www.primeng.org/toast/)
*
* @module toaststyle
*
*/
var ToastClasses;
(function (ToastClasses) {
/**
* Class name of the root element
*/
ToastClasses["root"] = "p-toast";
/**
* Class name of the message element
*/
ToastClasses["message"] = "p-toast-message";
/**
* Class name of the message content element
*/
ToastClasses["messageContent"] = "p-toast-message-content";
/**
* Class name of the message icon element
*/
ToastClasses["messageIcon"] = "p-toast-message-icon";
/**
* Class name of the message text element
*/
ToastClasses["messageText"] = "p-toast-message-text";
/**
* Class name of the summary element
*/
ToastClasses["summary"] = "p-toast-summary";
/**
* Class name of the detail element
*/
ToastClasses["detail"] = "p-toast-detail";
/**
* Class name of the close button element
*/
ToastClasses["closeButton"] = "p-toast-close-button";
/**
* Class name of the close icon element
*/
ToastClasses["closeIcon"] = "p-toast-close-icon";
})(ToastClasses || (ToastClasses = {}));
const _c0 = ["container"];
const _c1 = (a0, a1, a2, a3) => ({ showTransformParams: a0, hideTransformParams: a1, showTransitionParams: a2, hideTransitionParams: a3 });
const _c2 = a0 => ({ value: "visible", params: a0 });
const _c3 = (a0, a1) => ({ $implicit: a0, closeFn: a1 });
const _c4 = a0 => ({ $implicit: a0 });
function ToastItem_Conditional_2_ng_container_0_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainer(0);
} }
function ToastItem_Conditional_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵtemplate(0, ToastItem_Conditional_2_ng_container_0_Template, 1, 0, "ng-container", 3);
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext();
i0.ɵɵproperty("ngTemplateOutlet", ctx_r1.headlessTemplate)("ngTemplateOutletContext", i0.ɵɵpureFunction2(2, _c3, ctx_r1.message, ctx_r1.onCloseIconClick));
} }
function ToastItem_Conditional_3_ng_container_1_span_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "span", 4);
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext(3);
i0.ɵɵproperty("ngClass", ctx_r1.cx("messageIcon"));
} }
function ToastItem_Conditional_3_ng_container_1_span_2_Case_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "CheckIcon");
} if (rf & 2) {
i0.ɵɵattribute("aria-hidden", true)("data-pc-section", "icon");
} }
function ToastItem_Conditional_3_ng_container_1_span_2_Case_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "InfoCircleIcon");
} if (rf & 2) {
i0.ɵɵattribute("aria-hidden", true)("data-pc-section", "icon");
} }
function ToastItem_Conditional_3_ng_container_1_span_2_Case_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "TimesCircleIcon");
} if (rf & 2) {
i0.ɵɵattribute("aria-hidden", true)("data-pc-section", "icon");
} }
function ToastItem_Conditional_3_ng_container_1_span_2_Case_4_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "ExclamationTriangleIcon");
} if (rf & 2) {
i0.ɵɵattribute("aria-hidden", true)("data-pc-section", "icon");
} }
function ToastItem_Conditional_3_ng_container_1_span_2_Case_5_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "InfoCircleIcon");
} if (rf & 2) {
i0.ɵɵattribute("aria-hidden", true)("data-pc-section", "icon");
} }
function ToastItem_Conditional_3_ng_container_1_span_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span", 4);
i0.ɵɵtemplate(1, ToastItem_Conditional_3_ng_container_1_span_2_Case_1_Template, 1, 2, "CheckIcon")(2, ToastItem_Conditional_3_ng_container_1_span_2_Case_2_Template, 1, 2, "InfoCircleIcon")(3, ToastItem_Conditional_3_ng_container_1_span_2_Case_3_Template, 1, 2, "TimesCircleIcon")(4, ToastItem_Conditional_3_ng_container_1_span_2_Case_4_Template, 1, 2, "ExclamationTriangleIcon")(5, ToastItem_Conditional_3_ng_container_1_span_2_Case_5_Template, 1, 2, "InfoCircleIcon");
i0.ɵɵelementEnd();
} if (rf & 2) {
let tmp_7_0;
const ctx_r1 = i0.ɵɵnextContext(3);
i0.ɵɵproperty("ngClass", ctx_r1.cx("messageIcon"));
i0.ɵɵattribute("aria-hidden", true)("data-pc-section", "icon");
i0.ɵɵadvance();
i0.ɵɵconditional((tmp_7_0 = ctx_r1.message.severity) === "success" ? 1 : tmp_7_0 === "info" ? 2 : tmp_7_0 === "error" ? 3 : tmp_7_0 === "warn" ? 4 : 5);
} }
function ToastItem_Conditional_3_ng_container_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainerStart(0);
i0.ɵɵtemplate(1, ToastItem_Conditional_3_ng_container_1_span_1_Template, 1, 1, "span", 7)(2, ToastItem_Conditional_3_ng_container_1_span_2_Template, 6, 4, "span", 7);
i0.ɵɵelementStart(3, "div", 4)(4, "div", 4);
i0.ɵɵtext(5);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(6, "div", 4);
i0.ɵɵtext(7);
i0.ɵɵelementEnd()();
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext(2);
i0.ɵɵadvance();
i0.ɵɵproperty("ngIf", ctx_r1.message.icon);
i0.ɵɵadvance();
i0.ɵɵproperty("ngIf", !ctx_r1.message.icon);
i0.ɵɵadvance();
i0.ɵɵproperty("ngClass", ctx_r1.cx("messageText"));
i0.ɵɵattribute("data-pc-section", "text");
i0.ɵɵadvance();
i0.ɵɵproperty("ngClass", ctx_r1.cx("summary"));
i0.ɵɵattribute("data-pc-section", "summary");
i0.ɵɵadvance();
i0.ɵɵtextInterpolate1(" ", ctx_r1.message.summary, " ");
i0.ɵɵadvance();
i0.ɵɵproperty("ngClass", ctx_r1.cx("detail"));
i0.ɵɵattribute("data-pc-section", "detail");
i0.ɵɵadvance();
i0.ɵɵtextInterpolate(ctx_r1.message.detail);
} }
function ToastItem_Conditional_3_ng_container_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainer(0);
} }
function ToastItem_Conditional_3_Conditional_3_Conditional_1_span_0_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "span", 4);
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext(4);
i0.ɵɵproperty("ngClass", ctx_r1.cx("closeIcon"));
} }
function ToastItem_Conditional_3_Conditional_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵtemplate(0, ToastItem_Conditional_3_Conditional_3_Conditional_1_span_0_Template, 1, 1, "span", 7);
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext(3);
i0.ɵɵproperty("ngIf", ctx_r1.message.closeIcon);
} }
function ToastItem_Conditional_3_Conditional_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "TimesIcon", 4);
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext(3);
i0.ɵɵproperty("ngClass", ctx_r1.cx("closeIcon"));
i0.ɵɵattribute("aria-hidden", true)("data-pc-section", "closeicon");
} }
function ToastItem_Conditional_3_Conditional_3_Template(rf, ctx) { if (rf & 1) {
const _r3 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "p-button", 8);
i0.ɵɵlistener("onClick", function ToastItem_Conditional_3_Conditional_3_Template_p_button_onClick_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onCloseIconClick($event)); })("keydown.enter", function ToastItem_Conditional_3_Conditional_3_Template_p_button_keydown_enter_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onCloseIconClick($event)); });
i0.ɵɵtemplate(1, ToastItem_Conditional_3_Conditional_3_Conditional_1_Template, 1, 1, "span", 4)(2, ToastItem_Conditional_3_Conditional_3_Conditional_2_Template, 1, 3, "TimesIcon", 4);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext(2);
i0.ɵɵproperty("styleClass", ctx_r1.cx("closeButton"));
i0.ɵɵattribute("ariaLabel", ctx_r1.closeAriaLabel)("data-pc-section", "closebutton");
i0.ɵɵadvance();
i0.ɵɵconditional(ctx_r1.message.closeIcon ? 1 : 2);
} }
function ToastItem_Conditional_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 4);
i0.ɵɵtemplate(1, ToastItem_Conditional_3_ng_container_1_Template, 8, 10, "ng-container", 5)(2, ToastItem_Conditional_3_ng_container_2_Template, 1, 0, "ng-container", 3)(3, ToastItem_Conditional_3_Conditional_3_Template, 3, 4, "p-button", 6);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext();
i0.ɵɵclassMap(ctx_r1.message == null ? null : ctx_r1.message.contentStyleClass);
i0.ɵɵproperty("ngClass", ctx_r1.cx("messageContent"));
i0.ɵɵattribute("data-pc-section", "content");
i0.ɵɵadvance();
i0.ɵɵproperty("ngIf", !ctx_r1.template);
i0.ɵɵadvance();
i0.ɵɵproperty("ngTemplateOutlet", ctx_r1.template)("ngTemplateOutletContext", i0.ɵɵpureFunction1(8, _c4, ctx_r1.message));
i0.ɵɵadvance();
i0.ɵɵconditional((ctx_r1.message == null ? null : ctx_r1.message.closable) !== false ? 3 : -1);
} }
const _c5 = ["message"];
const _c6 = ["headless"];
function Toast_p_toastItem_2_Template(rf, ctx) { if (rf & 1) {
const _r1 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "p-toastItem", 3);
i0.ɵɵlistener("onClose", function Toast_p_toastItem_2_Template_p_toastItem_onClose_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onMessageClose($event)); })("@toastAnimation.start", function Toast_p_toastItem_2_Template_p_toastItem_animation_toastAnimation_start_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onAnimationStart($event)); })("@toastAnimation.done", function Toast_p_toastItem_2_Template_p_toastItem_animation_toastAnimation_done_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onAnimationEnd($event)); });
i0.ɵɵelementEnd();
} if (rf & 2) {
const msg_r3 = ctx.$implicit;
const i_r4 = ctx.index;
const ctx_r1 = i0.ɵɵnextContext();
i0.ɵɵproperty("message", msg_r3)("index", i_r4)("life", ctx_r1.life)("template", ctx_r1.template || ctx_r1._template)("headlessTemplate", ctx_r1.headlessTemplate || ctx_r1._headlessTemplate)("@toastAnimation", undefined)("showTransformOptions", ctx_r1.showTransformOptions)("hideTransformOptions", ctx_r1.hideTransformOptions)("showTransitionOptions", ctx_r1.showTransitionOptions)("hideTransitionOptions", ctx_r1.hideTransitionOptions);
} }
class ToastItem extends BaseComponent {
zone;
message;
index;
life;
template;
headlessTemplate;
showTransformOptions;
hideTransformOptions;
showTransitionOptions;
hideTransitionOptions;
onClose = new EventEmitter();
containerViewChild;
_componentStyle = inject(ToastStyle);
timeout;
constructor(zone) {
super();
this.zone = zone;
}
ngAfterViewInit() {
super.ngAfterViewInit();
this.initTimeout();
}
initTimeout() {
if (!this.message?.sticky) {
this.zone.runOutsideAngular(() => {
this.timeout = setTimeout(() => {
this.onClose.emit({
index: this.index,
message: this.message
});
}, this.message?.life || this.life || 3000);
});
}
}
clearTimeout() {
if (this.timeout) {
clearTimeout(this.timeout);
this.timeout = null;
}
}
onMouseEnter() {
this.clearTimeout();
}
onMouseLeave() {
this.initTimeout();
}
onCloseIconClick = (event) => {
this.clearTimeout();
this.onClose.emit({
index: this.index,
message: this.message
});
event.preventDefault();
};
get closeAriaLabel() {
return this.config.translation.aria ? this.config.translation.aria.close : undefined;
}
ngOnDestroy() {
this.clearTimeout();
super.ngOnDestroy();
}
static ɵfac = function ToastItem_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ToastItem)(i0.ɵɵdirectiveInject(i0.NgZone)); };
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ToastItem, selectors: [["p-toastItem"]], viewQuery: function ToastItem_Query(rf, ctx) { if (rf & 1) {
i0.ɵɵviewQuery(_c0, 5);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.containerViewChild = _t.first);
} }, inputs: { message: "message", index: [2, "index", "index", numberAttribute], life: [2, "life", "life", numberAttribute], template: "template", headlessTemplate: "headlessTemplate", showTransformOptions: "showTransformOptions", hideTransformOptions: "hideTransformOptions", showTransitionOptions: "showTransitionOptions", hideTransitionOptions: "hideTransitionOptions" }, outputs: { onClose: "onClose" }, features: [i0.ɵɵProvidersFeature([ToastStyle]), i0.ɵɵInputTransformsFeature, i0.ɵɵInheritDefinitionFeature], decls: 4, vars: 15, consts: [["container", ""], ["role", "alert", "aria-live", "assertive", "aria-atomic", "true", 3, "mouseenter", "mouseleave", "ngClass"], [3, "ngClass", "class"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [3, "ngClass"], [4, "ngIf"], ["rounded", "", "text", "", 3, "styleClass"], [3, "ngClass", 4, "ngIf"], ["rounded", "", "text", "", 3, "onClick", "keydown.enter", "styleClass"]], template: function ToastItem_Template(rf, ctx) { if (rf & 1) {
const _r1 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "div", 1, 0);
i0.ɵɵlistener("mouseenter", function ToastItem_Template_div_mouseenter_0_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onMouseEnter()); })("mouseleave", function ToastItem_Template_div_mouseleave_0_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onMouseLeave()); });
i0.ɵɵtemplate(2, ToastItem_Conditional_2_Template, 1, 5, "ng-container")(3, ToastItem_Conditional_3_Template, 4, 10, "div", 2);
i0.ɵɵelementEnd();
} if (rf & 2) {
i0.ɵɵclassMap(ctx.message == null ? null : ctx.message.styleClass);
i0.ɵɵproperty("ngClass", ctx.cx("message"))("@messageState", i0.ɵɵpureFunction1(13, _c2, i0.ɵɵpureFunction4(8, _c1, ctx.showTransformOptions, ctx.hideTransformOptions, ctx.showTransitionOptions, ctx.hideTransitionOptions)));
i0.ɵɵattribute("id", ctx.message == null ? null : ctx.message.id)("data-pc-name", "toast")("data-pc-section", "root");
i0.ɵɵadvance(2);
i0.ɵɵconditional(ctx.headlessTemplate ? 2 : 3);
} }, dependencies: [CommonModule, i1.NgClass, i1.NgIf, i1.NgTemplateOutlet, CheckIcon, ExclamationTriangleIcon, InfoCircleIcon, TimesIcon, TimesCircleIcon, Button, SharedModule], encapsulation: 2, data: { animation: [
trigger('messageState', [
state('visible', style({
transform: 'translateY(0)',
opacity: 1
})),
transition('void => *', [
style({
transform: '{{showTransformParams}}',
opacity: 0
}),
animate('{{showTransitionParams}}')
]),
transition('* => void', [
animate('{{hideTransitionParams}}', style({
height: 0,
opacity: 0,
transform: '{{hideTransformParams}}'
}))
])
])
] }, changeDetection: 0 });
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ToastItem, [{
type: Component,
args: [{
selector: 'p-toastItem',
standalone: true,
imports: [CommonModule, CheckIcon, ExclamationTriangleIcon, InfoCircleIcon, TimesIcon, TimesCircleIcon, Button, SharedModule],
template: `
<div
#container
[attr.id]="message?.id"
[class]="message?.styleClass"
[ngClass]="cx('message')"
[@messageState]="{
value: 'visible',
params: {
showTransformParams: showTransformOptions,
hideTransformParams: hideTransformOptions,
showTransitionParams: showTransitionOptions,
hideTransitionParams: hideTransitionOptions
}
}"
(mouseenter)="onMouseEnter()"
(mouseleave)="onMouseLeave()"
role="alert"
aria-live="assertive"
aria-atomic="true"
[attr.data-pc-name]="'toast'"
[attr.data-pc-section]="'root'"
>
@if (headlessTemplate) {
<ng-container *ngTemplateOutlet="headlessTemplate; context: { $implicit: message, closeFn: onCloseIconClick }"></ng-container>
} @else {
<div [ngClass]="cx('messageContent')" [class]="message?.contentStyleClass" [attr.data-pc-section]="'content'">
<ng-container *ngIf="!template">
<span *ngIf="message.icon" [ngClass]="cx('messageIcon')"></span>
<span [ngClass]="cx('messageIcon')" *ngIf="!message.icon" [attr.aria-hidden]="true" [attr.data-pc-section]="'icon'">
@switch (message.severity) {
@case ('success') {
<CheckIcon [attr.aria-hidden]="true" [attr.data-pc-section]="'icon'" />
}
@case ('info') {
<InfoCircleIcon [attr.aria-hidden]="true" [attr.data-pc-section]="'icon'" />
}
@case ('error') {
<TimesCircleIcon [attr.aria-hidden]="true" [attr.data-pc-section]="'icon'" />
}
@case ('warn') {
<ExclamationTriangleIcon [attr.aria-hidden]="true" [attr.data-pc-section]="'icon'" />
}
@default {
<InfoCircleIcon [attr.aria-hidden]="true" [attr.data-pc-section]="'icon'" />
}
}
</span>
<div [ngClass]="cx('messageText')" [attr.data-pc-section]="'text'">
<div [ngClass]="cx('summary')" [attr.data-pc-section]="'summary'">
{{ message.summary }}
</div>
<div [ngClass]="cx('detail')" [attr.data-pc-section]="'detail'">{{ message.detail }}</div>
</div>
</ng-container>
<ng-container *ngTemplateOutlet="template; context: { $implicit: message }"></ng-container>
@if (message?.closable !== false) {
<p-button [styleClass]="cx('closeButton')" (onClick)="onCloseIconClick($event)" (keydown.enter)="onCloseIconClick($event)" [attr.ariaLabel]="closeAriaLabel" [attr.data-pc-section]="'closebutton'" rounded text>
@if (message.closeIcon) {
<span *ngIf="message.closeIcon" [ngClass]="cx('closeIcon')"></span>
} @else {
<TimesIcon [ngClass]="cx('closeIcon')" [attr.aria-hidden]="true" [attr.data-pc-section]="'closeicon'" />
}
</p-button>
}
</div>
}
</div>
`,
animations: [
trigger('messageState', [
state('visible', style({
transform: 'translateY(0)',
opacity: 1
})),
transition('void => *', [
style({
transform: '{{showTransformParams}}',
opacity: 0
}),
animate('{{showTransitionParams}}')
]),
transition('* => void', [
animate('{{hideTransitionParams}}', style({
height: 0,
opacity: 0,
transform: '{{hideTransformParams}}'
}))
])
])
],
encapsulation: ViewEncapsulation.None,
changeDetection: ChangeDetectionStrategy.OnPush,
providers: [ToastStyle]
}]
}], () => [{ type: i0.NgZone }], { message: [{
type: Input
}], index: [{
type: Input,
args: [{ transform: numberAttribute }]
}], life: [{
type: Input,
args: [{ transform: numberAttribute }]
}], template: [{
type: Input
}], headlessTemplate: [{
type: Input
}], showTransformOptions: [{
type: Input
}], hideTransformOptions: [{
type: Input
}], showTransitionOptions: [{
type: Input
}], hideTransitionOptions: [{
type: Input
}], onClose: [{
type: Output
}], containerViewChild: [{
type: ViewChild,
args: ['container']
}] }); })();
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ToastItem, { className: "ToastItem", filePath: "toast.ts", lineNumber: 140 }); })();
/**
* Toast is used to display messages in an overlay.
* @group Components
*/
class Toast extends BaseComponent {
/**
* Key of the message in case message is targeted to a specific toast component.
* @group Props
*/
key;
/**
* Whether to automatically manage layering.
* @group Props
*/
autoZIndex = true;
/**
* Base zIndex value to use in layering.
* @group Props
*/
baseZIndex = 0;
/**
* The default time to display messages for in milliseconds.
* @group Props
*/
life = 3000;
/**
* Inline style of the component.
* @group Props
*/
style;
/**
* Inline class of the component.
* @group Props
*/
styleClass;
/**
* Position of the toast in viewport.
* @group Props
*/
get position() {
return this._position;
}
set position(value) {
this._position = value;
this.cd.markForCheck();
}
/**
* It does not add the new message if there is already a toast displayed with the same content
* @group Props
*/
preventOpenDuplicates = false;
/**
* Displays only once a message with the same content.
* @group Props
*/
preventDuplicates = false;
/**
* Transform options of the show animation.
* @group Props
*/
showTransformOptions = 'translateY(100%)';
/**
* Transform options of the hide animation.
* @group Props
*/
hideTransformOptions = 'translateY(-100%)';
/**
* Transition options of the show animation.
* @group Props
*/
showTransitionOptions = '300ms ease-out';
/**
* Transition options of the hide animation.
* @group Props
*/
hideTransitionOptions = '250ms ease-in';
/**
* Object literal to define styles per screen size.
* @group Props
*/
breakpoints;
/**
* Callback to invoke when a message is closed.
* @param {ToastCloseEvent} event - custom close event.
* @group Emits
*/
onClose = new EventEmitter();
/**
* Custom template of message.
* @group Templates
*/
template;
/**
* Custom headless template.
* @group Templates
*/
headlessTemplate;
containerViewChild;
messageSubscription;
clearSubscription;
messages;
messagesArchieve;
_position = 'top-right';
messageService = inject(MessageService);
_componentStyle = inject(ToastStyle);
styleElement;
id = uuid('pn_id_');
templates;
ngOnInit() {
super.ngOnInit();
this.messageSubscription = this.messageService.messageObserver.subscribe((messages) => {
if (messages) {
if (Array.isArray(messages)) {
const filteredMessages = messages.filter((m) => this.canAdd(m));
this.add(filteredMessages);
}
else if (this.canAdd(messages)) {
this.add([messages]);
}
}
});
this.clearSubscription = this.messageService.clearObserver.subscribe((key) => {
if (key) {
if (this.key === key) {
this.messages = null;
}
}
else {
this.messages = null;
}
this.cd.markForCheck();
});
}
_template;
_headlessTemplate;
ngAfterContentInit() {
this.templates?.forEach((item) => {
switch (item.getType()) {
case 'message':
this._template = item.template;
break;
case 'headless':
this._headlessTemplate = item.template;
break;
default:
this._template = item.template;
break;
}
});
}
ngAfterViewInit() {
super.ngAfterViewInit();
if (this.breakpoints) {
this.createStyle();
}
}
add(messages) {
this.messages = this.messages ? [...this.messages, ...messages] : [...messages];
if (this.preventDuplicates) {
this.messagesArchieve = this.messagesArchieve ? [...this.messagesArchieve, ...messages] : [...messages];
}
this.cd.markForCheck();
}
canAdd(message) {
let allow = this.key === message.key;
if (allow && this.preventOpenDuplicates) {
allow = !this.containsMessage(this.messages, message);
}
if (allow && this.preventDuplicates) {
allow = !this.containsMessage(this.messagesArchieve, message);
}
return allow;
}
containsMessage(collection, message) {
if (!collection) {
return false;
}
return (collection.find((m) => {
return m.summary === message.summary && m.detail == message.detail && m.severity === message.severity;
}) != null);
}
onMessageClose(event) {
this.messages?.splice(event.index, 1);
this.onClose.emit({
message: event.message
});
this.cd.detectChanges();
}
onAnimationStart(event) {
if (event.fromState === 'void') {
this.renderer.setAttribute(this.containerViewChild?.nativeElement, this.id, '');
if (this.autoZIndex && this.containerViewChild?.nativeElement.style.zIndex === '') {
ZIndexUtils.set('modal', this.containerViewChild?.nativeElement, this.baseZIndex || this.config.zIndex.modal);
}
}
}
onAnimationEnd(event) {
if (event.toState === 'void') {
if (this.autoZIndex && isEmpty(this.messages)) {
ZIndexUtils.clear(this.containerViewChild?.nativeElement);
}
}
}
createStyle() {
if (!this.styleElement) {
this.styleElement = this.renderer.createElement('style');
this.styleElement.type = 'text/css';
this.renderer.appendChild(this.document.head, this.styleElement);
let innerHTML = '';
for (let breakpoint in this.breakpoints) {
let breakpointStyle = '';
for (let styleProp in this.breakpoints[breakpoint]) {
breakpointStyle += styleProp + ':' + this.breakpoints[breakpoint][styleProp] + ' !important;';
}
innerHTML += `
@media screen and (max-width: ${breakpoint}) {
.p-toast[${this.id}] {
${breakpointStyle}
}
}
`;
}
this.renderer.setProperty(this.styleElement, 'innerHTML', innerHTML);
setAttribute(this.styleElement, 'nonce', this.config?.csp()?.nonce);
}
}
destroyStyle() {
if (this.styleElement) {
this.renderer.removeChild(this.document.head, this.styleElement);
this.styleElement = null;
}
}
ngOnDestroy() {
if (this.messageSubscription) {
this.messageSubscription.unsubscribe();
}
if (this.containerViewChild && this.autoZIndex) {
ZIndexUtils.clear(this.containerViewChild.nativeElement);
}
if (this.clearSubscription) {
this.clearSubscription.unsubscribe();
}
this.destroyStyle();
super.ngOnDestroy();
}
static ɵfac = /*@__PURE__*/ (() => { let ɵToast_BaseFactory; return function Toast_Factory(__ngFactoryType__) { return (ɵToast_BaseFactory || (ɵToast_BaseFactory = i0.ɵɵgetInheritedFactory(Toast)))(__ngFactoryType__ || Toast); }; })();
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: Toast, selectors: [["p-toast"]], contentQueries: function Toast_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {
i0.ɵɵcontentQuery(dirIndex, _c5, 5);
i0.ɵɵcontentQuery(dirIndex, _c6, 5);
i0.ɵɵcontentQuery(dirIndex, PrimeTemplate, 4);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.template = _t.first);
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.headlessTemplate = _t.first);
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.templates = _t);
} }, viewQuery: function Toast_Query(rf, ctx) { if (rf & 1) {
i0.ɵɵviewQuery(_c0, 5);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.containerViewChild = _t.first);
} }, inputs: { key: "key", autoZIndex: [2, "autoZIndex", "autoZIndex", booleanAttribute], baseZIndex: [2, "baseZIndex", "baseZIndex", numberAttribute], life: [2, "life", "life", numberAttribute], style: "style", styleClass: "styleClass", position: "position", preventOpenDuplicates: [2, "preventOpenDuplicates", "preventOpenDuplicates", booleanAttribute], preventDuplicates: [2, "preventDuplicates", "preventDuplicates", booleanAttribute], showTransformOptions: "showTransformOptions", hideTransformOptions: "hideTransformOptions", showTransitionOptions: "showTransitionOptions", hideTransitionOptions: "hideTransitionOptions", breakpoints: "breakpoints" }, outputs: { onClose: "onClose" }, features: [i0.ɵɵProvidersFeature([ToastStyle]), i0.ɵɵInputTransformsFeature, i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 7, consts: [["container", ""], [3, "ngClass", "ngStyle"], [3, "message", "index", "life", "template", "headlessTemplate", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "onClose", 4, "ngFor", "ngForOf"], [3, "onClose", "message", "index", "life", "template", "headlessTemplate", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions"]], template: function Toast_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 1, 0);
i0.ɵɵtemplate(2, Toast_p_toastItem_2_Template, 1, 10, "p-toastItem", 2);
i0.ɵɵelementEnd();
} if (rf & 2) {
i0.ɵɵstyleMap(ctx.style);
i0.ɵɵclassMap(ctx.styleClass);
i0.ɵɵproperty("ngClass", ctx.cx("root"))("ngStyle", ctx.sx("root"));
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngForOf", ctx.messages);
} }, dependencies: [CommonModule, i1.NgClass, i1.NgForOf, i1.NgStyle, ToastItem, SharedModule], encapsulation: 2, data: { animation: [trigger('toastAnimation', [transition(':enter, :leave', [query('@*', animateChild())])])] }, changeDetection: 0 });
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(Toast, [{
type: Component,
args: [{
selector: 'p-toast',
standalone: true,
imports: [CommonModule, ToastItem, SharedModule],
template: `
<div #container [ngClass]="cx('root')" [ngStyle]="sx('root')" [style]="style" [class]="styleClass">
<p-toastItem
*ngFor="let msg of messages; let i = index"
[message]="msg"
[index]="i"
[life]="life"
(onClose)="onMessageClose($event)"
[template]="template || _template"
[headlessTemplate]="headlessTemplate || _headlessTemplate"
@toastAnimation
(@toastAnimation.start)="onAnimationStart($event)"
(@toastAnimation.done)="onAnimationEnd($event)"
[showTransformOptions]="showTransformOptions"
[hideTransformOptions]="hideTransformOptions"
[showTransitionOptions]="showTransitionOptions"
[hideTransitionOptions]="hideTransitionOptions"
></p-toastItem>
</div>
`,
animations: [trigger('toastAnimation', [transition(':enter, :leave', [query('@*', animateChild())])])],
changeDetection: ChangeDetectionStrategy.OnPush,
encapsulation: ViewEncapsulation.None,
providers: [ToastStyle]
}]
}], null, { key: [{
type: Input
}], autoZIndex: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], baseZIndex: [{
type: Input,
args: [{ transform: numberAttribute }]
}], life: [{
type: Input,
args: [{ transform: numberAttribute }]
}], style: [{
type: Input
}], styleClass: [{
type: Input
}], position: [{
type: Input
}], preventOpenDuplicates: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], preventDuplicates: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], showTransformOptions: [{
type: Input
}], hideTransformOptions: [{
type: Input
}], showTransitionOptions: [{
type: Input
}], hideTransitionOptions: [{
type: Input
}], breakpoints: [{
type: Input
}], onClose: [{
type: Output
}], template: [{
type: ContentChild,
args: ['message']
}], headlessTemplate: [{
type: ContentChild,
args: ['headless']
}], containerViewChild: [{
type: ViewChild,
args: ['container']
}], templates: [{
type: ContentChildren,
args: [PrimeTemplate]
}] }); })();
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(Toast, { className: "Toast", filePath: "toast.ts", lineNumber: 261 }); })();
class ToastModule {
static ɵfac = function ToastModule_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ToastModule)(); };
static ɵmod = /*@__PURE__*/ i0.ɵɵdefineNgModule({ type: ToastModule });
static ɵinj = /*@__PURE__*/ i0.ɵɵdefineInjector({ imports: [Toast, SharedModule, SharedModule] });
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ToastModule, [{
type: NgModule,
args: [{
imports: [Toast, SharedModule],
exports: [Toast, SharedModule]
}]
}], null, null); })();
(function () { (typeof ngJitMode === "undefined" || ngJitMode) && i0.ɵɵsetNgModuleScope(ToastModule, { imports: [Toast, SharedModule], exports: [Toast, SharedModule] }); })();
/**
* Generated bundle index. Do not edit.
*/
export { Toast, ToastClasses, ToastItem, ToastModule, ToastStyle };
//# sourceMappingURL=primeng-toast.mjs.map