mirror of
https://github.com/codeninjasllc/discourse.git
synced 2024-12-11 08:11:15 -05:00
219 lines
6.1 KiB
JavaScript
219 lines
6.1 KiB
JavaScript
import { createWidget } from 'discourse/widgets/widget';
|
|
import { h } from 'virtual-dom';
|
|
import { avatarImg, avatarFor } from 'discourse/widgets/post';
|
|
import { dateNode, numberNode } from 'discourse/helpers/node';
|
|
|
|
const LINKS_SHOWN = 5;
|
|
|
|
function renderParticipants(userFilters, participants) {
|
|
if (!participants) { return; }
|
|
|
|
userFilters = userFilters || [];
|
|
return participants.map(p => {
|
|
return this.attach('topic-participant', p, { state: { toggled: userFilters.contains(p.username) } });
|
|
});
|
|
}
|
|
|
|
createWidget('topic-map-show-links', {
|
|
tagName: 'div.link-summary',
|
|
html(attrs) {
|
|
return h('a', I18n.t('topic_map.links_shown', { totalLinks: attrs.totalLinks }));
|
|
},
|
|
|
|
click() {
|
|
this.sendWidgetAction('showAllLinks');
|
|
}
|
|
});
|
|
|
|
createWidget('topic-participant', {
|
|
html(attrs, state) {
|
|
const linkContents = [avatarImg('medium', { username: attrs.username, template: attrs.avatar_template })];
|
|
|
|
if (attrs.post_count > 2) {
|
|
linkContents.push(h('span.post-count', attrs.post_count.toString()));
|
|
}
|
|
|
|
return h('a.poster', { className: state.toggled ? 'toggled' : null, attributes: { title: attrs.username } },
|
|
linkContents
|
|
);
|
|
},
|
|
|
|
click() {
|
|
this.sendWidgetAction('toggleParticipant', this.attrs);
|
|
}
|
|
});
|
|
|
|
createWidget('topic-map-summary', {
|
|
tagName: 'section.map',
|
|
|
|
buildClasses(attrs, state) {
|
|
if (state.collapsed) { return 'map-collapsed'; }
|
|
},
|
|
|
|
html(attrs, state) {
|
|
const contents = [];
|
|
contents.push(h('li',
|
|
[
|
|
h('h4', I18n.t('created_lowercase')),
|
|
avatarFor('tiny', { username: attrs.createdByUsername, template: attrs.createdByAvatarTemplate }),
|
|
dateNode(attrs.topicCreatedAt)
|
|
]
|
|
));
|
|
contents.push(h('li',
|
|
h('a', { attributes: { href: attrs.lastPostUrl } }, [
|
|
h('h4', I18n.t('last_reply_lowercase')),
|
|
avatarFor('tiny', { username: attrs.lastPostUsername, template: attrs.lastPostAvatarTemplate }),
|
|
dateNode(attrs.lastPostAt)
|
|
])
|
|
));
|
|
contents.push(h('li', [
|
|
numberNode(attrs.topicReplyCount),
|
|
h('h4', I18n.t('replies_lowercase', { count: attrs.topicReplyCount }))
|
|
]));
|
|
contents.push(h('li.secondary', [
|
|
numberNode(attrs.topicViews, { className: attrs.topicViewsHeat }),
|
|
h('h4', I18n.t('views_lowercase', { count: attrs.topicViews }))
|
|
]));
|
|
contents.push(h('li.secondary', [
|
|
numberNode(attrs.participantCount),
|
|
h('h4', I18n.t('users_lowercase', { count: attrs.participantCount }))
|
|
]));
|
|
|
|
if (attrs.topicLikeCount) {
|
|
contents.push(h('li.secondary', [
|
|
numberNode(attrs.likeCount),
|
|
h('h4', I18n.t('likes_lowercase', { count: attrs.likeCount }))
|
|
]));
|
|
}
|
|
|
|
if (attrs.topicLinkLength > 0) {
|
|
contents.push(h('li.secondary', [
|
|
numberNode(attrs.topicLinkLength),
|
|
h('h4', I18n.t('links_lowercase', { count: attrs.topicLinkLength }))
|
|
]));
|
|
}
|
|
|
|
if (state.collapsed && attrs.topicPostsCount > 2 && attrs.participants.length > 0) {
|
|
const participants = renderParticipants.call(this, attrs.userFilters, attrs.participants.slice(0, 3));
|
|
contents.push(h('li.avatars', participants));
|
|
}
|
|
|
|
return h('ul.clearfix', contents);
|
|
}
|
|
});
|
|
|
|
createWidget('topic-map-link', {
|
|
tagName: 'a.topic-link.track-link',
|
|
|
|
buildClasses(attrs) {
|
|
if (attrs.attachment) { return 'attachment'; }
|
|
},
|
|
|
|
buildAttributes(attrs) {
|
|
return { href: attrs.url,
|
|
target: "_blank",
|
|
'data-user-id': attrs.user_id,
|
|
'data-ignore-post-id': 'true',
|
|
title: attrs.url };
|
|
},
|
|
|
|
html(attrs) {
|
|
if (attrs.title) { return attrs.title; }
|
|
return attrs.url;
|
|
}
|
|
});
|
|
|
|
createWidget('topic-map-expanded', {
|
|
tagName: 'section.topic-map-expanded',
|
|
|
|
defaultState() {
|
|
return { allLinksShown: false };
|
|
},
|
|
|
|
html(attrs, state) {
|
|
const avatars = h('section.avatars.clearfix', [
|
|
h('h3', I18n.t('topic_map.participants_title')),
|
|
renderParticipants.call(this, attrs.userFilters, attrs.participants)
|
|
]);
|
|
|
|
const result = [avatars];
|
|
if (attrs.topicLinks) {
|
|
|
|
const toShow = state.allLinksShown ? attrs.topicLinks : attrs.topicLinks.slice(0, LINKS_SHOWN);
|
|
const links = toShow.map(l => {
|
|
|
|
let host = '';
|
|
if (l.title && l.title.length) {
|
|
const domain = l.domain;
|
|
if (domain && domain.length) {
|
|
const s = domain.split('.');
|
|
host = h('span.domain', s[s.length-2] + "." + s[s.length-1]);
|
|
}
|
|
}
|
|
|
|
return h('tr', [
|
|
h('td',
|
|
h('span.badge.badge-notification.clicks', {
|
|
attributes: { title: I18n.t('topic_map.clicks', { count: l.clicks }) }
|
|
}, l.clicks.toString())
|
|
),
|
|
h('td', [this.attach('topic-map-link', l), ' ', host])
|
|
]);
|
|
});
|
|
|
|
const showAllLinksContent = [
|
|
h('h3', I18n.t('topic_map.links_title')),
|
|
h('table.topic-links', links)
|
|
];
|
|
|
|
if (!state.allLinksShown && links.length < attrs.topicLinks.length) {
|
|
showAllLinksContent.push(this.attach('topic-map-show-links', { totalLinks: attrs.topicLinks.length }));
|
|
}
|
|
|
|
const section = h('section.links', showAllLinksContent);
|
|
result.push(section);
|
|
}
|
|
return result;
|
|
},
|
|
|
|
showAllLinks() {
|
|
this.state.allLinksShown = true;
|
|
}
|
|
});
|
|
|
|
export default createWidget('topic-map', {
|
|
tagName: 'div.topic-map',
|
|
buildKey: attrs => `topic-map-${attrs.id}`,
|
|
|
|
defaultState(attrs) {
|
|
return { collapsed: !attrs.hasTopicSummary };
|
|
},
|
|
|
|
html(attrs, state) {
|
|
const nav = h('nav.buttons', this.attach('button', {
|
|
title: 'topic.toggle_information',
|
|
icon: state.collapsed ? 'chevron-down' : 'chevron-up',
|
|
action: 'toggleMap',
|
|
className: 'btn',
|
|
}));
|
|
|
|
const contents = [nav, this.attach('topic-map-summary', attrs, { state })];
|
|
|
|
if (!state.collapsed) {
|
|
contents.push(this.attach('topic-map-expanded', attrs));
|
|
}
|
|
|
|
if (attrs.hasTopicSummary) {
|
|
contents.push(this.attach('toggle-topic-summary', attrs));
|
|
}
|
|
|
|
if (attrs.showPMMap) {
|
|
contents.push(this.attach('private-message-map', attrs));
|
|
}
|
|
return contents;
|
|
},
|
|
|
|
toggleMap() {
|
|
this.state.collapsed = !this.state.collapsed;
|
|
}
|
|
});
|