mirror of
https://github.com/discourse/discourse.git
synced 2025-02-05 06:51:44 +08:00
73 lines
1.8 KiB
JavaScript
73 lines
1.8 KiB
JavaScript
import { iconNode } from 'discourse-common/lib/icon-library';
|
|
import { createWidget } from 'discourse/widgets/widget';
|
|
import { h } from 'virtual-dom';
|
|
import { replaceEmoji } from 'discourse/widgets/emoji';
|
|
|
|
export default createWidget('post-links', {
|
|
tagName: 'div.post-links-container',
|
|
buildKey: (attrs) => `post-links-${attrs.id}`,
|
|
|
|
defaultState() {
|
|
return { collapsed: true };
|
|
},
|
|
|
|
linkHtml(link) {
|
|
const linkBody = replaceEmoji(link.title);
|
|
if (link.clicks) {
|
|
linkBody.push(h('span.badge.badge-notification.clicks', link.clicks.toString()));
|
|
}
|
|
|
|
return h('li',
|
|
h('a.track-link', {
|
|
className: 'inbound',
|
|
attributes: { href: link.url }
|
|
}, [iconNode('link'), linkBody])
|
|
);
|
|
},
|
|
|
|
html(attrs, state) {
|
|
if (!this.attrs.links || this.attrs.links.length === 0) {
|
|
// shortcut all work
|
|
return;
|
|
}
|
|
|
|
// only show incoming
|
|
const links = _(this.attrs.links)
|
|
.filter(l => l.reflection)
|
|
.uniq(true, l => l.title)
|
|
.value();
|
|
|
|
if (links.length === 0) { return; }
|
|
|
|
const result = [];
|
|
|
|
// show all links
|
|
if (links.length <= 5 || !state.collapsed) {
|
|
_.each(links, l => result.push(this.linkHtml(l)));
|
|
} else {
|
|
const max = Math.min(5, links.length);
|
|
for (let i = 0; i < max; i++) {
|
|
result.push(this.linkHtml(links[i]));
|
|
}
|
|
// 'show more' link
|
|
if (links.length > max) {
|
|
result.push(h('li', this.attach('link', {
|
|
labelCount: 'post_links.title',
|
|
title: 'post_links.about',
|
|
count: links.length - max,
|
|
action: 'expandLinks',
|
|
className: 'expand-links'
|
|
})));
|
|
}
|
|
}
|
|
|
|
if (result.length) {
|
|
return h('ul.post-links', result);
|
|
}
|
|
},
|
|
|
|
expandLinks() {
|
|
this.state.collapsed = false;
|
|
}
|
|
});
|