This article has not been translated, hope that your can PR to translated it. Help us!
notice-icon 通知菜单
用在导航工具栏上,作为整个产品统一的通知中心。
import { NoticeIconModule } from '@delon/abc/notice-icon';
代码演示
通知图标
通常用在导航工具栏上。
import { Component } from '@angular/core';
@Component({
selector: 'components-notice-icon-basic',
template: `
<notice-icon count="5"></notice-icon>
`
})
export class ComponentsNoticeIconBasicComponent {
}
带浮层卡片
点击展开通知卡片,展现多种类型的通知,通常放在导航工具栏。
import { Component } from '@angular/core';
import { NoticeIconList, NoticeItem } from '@delon/abc/notice-icon';
import add from 'date-fns/add';
import formatDistanceToNow from 'date-fns/formatDistanceToNow';
import parse from 'date-fns/parse';
import { NzI18nService } from 'ng-zorro-antd/i18n';
import { NzMessageService } from 'ng-zorro-antd/message';
@Component({
selector: 'components-notice-icon-popover',
template: `
<div
style="text-align: right; height: 64px; line-height: 64px; box-shadow: rgba(0, 21, 41, 0.12) 0 1px 4px; padding: 0 32px; width: 400px;"
>
<notice-icon
[data]="data"
[count]="count"
[loading]="loading"
(select)="select($event)"
(clear)="clear($event)"
(popoverVisibleChange)="loadData()"
></notice-icon>
</div>
`,
})
export class ComponentsNoticeIconPopoverComponent {
data: NoticeItem[] = [
{
title: '通知',
list: [],
emptyText: '你已查看所有通知',
emptyImage: 'https://gw.alipayobjects.com/zos/rmsportal/wAhyIChODzsoKIOBHcBk.svg',
clearText: '清空通知',
},
{
title: '消息',
list: [],
emptyText: '您已读完所有消息',
emptyImage: 'https://gw.alipayobjects.com/zos/rmsportal/sAuJeJzSKbUmHfBQRzmZ.svg',
clearText: '清空消息',
},
{
title: '待办',
list: [],
emptyText: '你已完成所有待办',
emptyImage: 'https://gw.alipayobjects.com/zos/rmsportal/HsIsxMZiWKrNUavQUXqx.svg',
clearText: '清空待办',
},
];
count = 5;
loading = false;
constructor(private msg: NzMessageService, private nzI18n: NzI18nService) {}
updateNoticeData(notices: NoticeIconList[]): NoticeItem[] {
const data = this.data.slice();
data.forEach(i => (i.list = []));
notices.forEach(item => {
const newItem = { ...item };
if (typeof newItem.datetime === 'string') {
newItem.datetime = parse(newItem.datetime, 'yyyy-MM-dd', new Date());
}
if (newItem.datetime) {
newItem.datetime = formatDistanceToNow(newItem.datetime as Date, { locale: this.nzI18n.getDateLocale() });
}
if (newItem.extra && newItem.status) {
newItem.color = ({
todo: undefined,
processing: 'blue',
urgent: 'red',
doing: 'gold',
} as { [key: string]: string | undefined })[newItem.status];
}
data.find(w => w.title === newItem.type)!.list.push(newItem);
});
return data;
}
loadData() {
if (this.loading) return;
this.loading = true;
setTimeout(() => {
const now = new Date();
this.data = this.updateNoticeData([
{
id: '000000001',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png',
title: '你收到了 14 份新周报',
datetime: add(now, { days: 10 }),
type: '通知',
},
{
id: '000000002',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/OKJXDXrmkNshAMvwtvhu.png',
title: '你推荐的 曲妮妮 已通过第三轮面试',
datetime: add(now, { days: -3 }),
type: '通知',
},
{
id: '000000003',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/kISTdvpyTAhtGxpovNWd.png',
title: '这种模板可以区分多种通知类型',
datetime: add(now, { months: -3 }),
read: true,
type: '通知',
},
{
id: '000000004',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png',
title: '左侧图标用于区分不同的类型',
datetime: add(now, { years: -1 }),
type: '通知',
},
{
id: '000000005',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png',
title: '内容不要超过两行字,超出时自动截断',
datetime: '2017-08-07',
type: '通知',
},
{
id: '000000006',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg',
title: '曲丽丽 评论了你',
description: '描述信息描述信息描述信息',
datetime: '2017-08-07',
type: '消息',
},
{
id: '000000007',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg',
title: '朱偏右 回复了你',
description: '这种模板用于提醒谁与你发生了互动,左侧放『谁』的头像',
datetime: '2017-08-07',
type: '消息',
},
{
id: '000000008',
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg',
title: '标题',
description: '这种模板用于提醒谁与你发生了互动,左侧放『谁』的头像',
datetime: '2017-08-07',
type: '消息',
},
{
id: '000000009',
title: '任务名称',
description: '任务需要在 2017-01-12 20:00 前启动',
extra: '未开始',
status: 'todo',
type: '待办',
},
{
id: '000000010',
title: '第三方紧急代码变更',
description: '冠霖提交于 2017-01-06,需在 2017-01-07 前完成代码变更任务',
extra: '马上到期',
status: 'urgent',
type: '待办',
},
{
id: '000000011',
title: '信息安全考试',
description: '指派竹尔于 2017-01-09 前完成更新并发布',
extra: '已耗时 8 天',
status: 'doing',
type: '待办',
},
{
id: '000000012',
title: 'ABCD 版本发布',
description: '冠霖提交于 2017-01-06,需在 2017-01-07 前完成代码变更任务',
extra: '进行中',
status: 'processing',
type: '待办',
},
]);
this.loading = false;
}, 500);
}
clear(type: string) {
this.msg.success(`清空了 ${type}`);
}
select(res: any) {
this.msg.success(`点击了 ${res.title} 的 ${res.item.title}`);
}
}
API
notice-icon
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
[data] | 数据 | NoticeItem[] | - |
[count] | 图标上的消息总数 | number | - |
[loading] | 弹出卡片加载状态 | boolean | false |
(select) | 点击列表项的回调 | EventEmitter<NoticeIconSelect> | - |
(clear) | 点击清空按钮的回调 | EventEmitter<string> | - |
[popoverVisible] | 手动控制Popover显示 | boolean | false |
(popoverVisibleChange) | Popover显隐回调 | EventEmitter<boolean> | - |
NoticeItem
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
[title] | 标题 | string | - |
[list] | 列表数据,格式参照下表 | NoticeIconList[] | - |
[emptyText] | 针对每个 Tab 定制空数据文案 | string | 无通知 |
[emptyImage] | 针对每个 Tab 定制空数据图片 | string | - |
[clearText] | 针对每个 Tab 清空按钮文本 | string | 清空 |
NoticeIconList
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
[avatar] | 头像图片链接 | string | - |
[title] | 标题 | string | - |
[description] | 描述信息 | string | - |
[datetime] | 时间戳 | string | - |
[extra] | 额外信息,在列表项右上角 | string | - |
[read] | 是否已读状态 | boolean | - |
NoticeIconSelect
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
[title] | 标题 | string | - |
[item] | 数据项 | NoticeItem | - |