summaryrefslogtreecommitdiffstats
path: root/web_src/js/features/tribute.js
diff options
context:
space:
mode:
authorsilverwind <me@silverwind.io>2020-05-21 04:00:43 +0200
committerGitHub <noreply@github.com>2020-05-20 22:00:43 -0400
commitb02d2c37728491caaf8af3384b8d3b25411e4679 (patch)
tree09dead09d24417c288a16a24a52e772345b2554d /web_src/js/features/tribute.js
parent3eb323901c6ec791294db492783e202558c2824f (diff)
downloadgitea-b02d2c37728491caaf8af3384b8d3b25411e4679.tar.gz
gitea-b02d2c37728491caaf8af3384b8d3b25411e4679.zip
Move tributejs to npm/webpack (#11497)
* Move tributejs to npm/webpack - Move vendored bundle to npm and webpack - Rewrote initialization to single function - Restyled it (made it a bit smaller) - Fixed it for arc-green * fix mention * also include emoji on #content * Update web_src/less/_tribute.less Co-authored-by: mrsdizzie <info@mrsdizzie.com> * rewrite to only use one instance of Tribute * refactor * fix copy/paste error Co-authored-by: mrsdizzie <info@mrsdizzie.com> Co-authored-by: techknowlogick <techknowlogick@gitea.io>
Diffstat (limited to 'web_src/js/features/tribute.js')
-rw-r--r--web_src/js/features/tribute.js118
1 files changed, 67 insertions, 51 deletions
diff --git a/web_src/js/features/tribute.js b/web_src/js/features/tribute.js
index 30afb2b184..851ff74e57 100644
--- a/web_src/js/features/tribute.js
+++ b/web_src/js/features/tribute.js
@@ -1,61 +1,77 @@
import {emojiKeys, emojiHTML, emojiString} from './emoji.js';
+import {uniq} from '../utils.js';
-export const issuesTribute = window.config.Tribute ? new Tribute({
- values: window.config.tributeValues,
- noMatchTemplate() { return null },
- menuItemTemplate(item) {
- const div = $('<div/>');
- div.append($('<img/>', {src: item.original.avatar}));
- div.append($('<span/>', {class: 'name'}).text(item.original.name));
- if (item.original.fullname && item.original.fullname !== '') {
- div.append($('<span/>', {class: 'fullname'}).text(item.original.fullname));
- }
- return div.html();
- }
-}) : null;
-
-export const emojiTribute = window.config.Tribute ? new Tribute({
- collection: [{
- trigger: ':',
- requireLeadingSpace: true,
- values(query, cb) {
- const matches = [];
- for (const name of emojiKeys) {
- if (name.includes(query)) {
- matches.push(name);
- if (matches.length > 5) break;
+function makeCollections({mentions, emoji}) {
+ const collections = [];
+
+ if (mentions) {
+ collections.push({
+ trigger: ':',
+ requireLeadingSpace: true,
+ values: (query, cb) => {
+ const matches = [];
+ for (const name of emojiKeys) {
+ if (name.includes(query)) {
+ matches.push(name);
+ if (matches.length > 5) break;
+ }
}
+ cb(matches);
+ },
+ lookup: (item) => item,
+ selectTemplate: (item) => {
+ if (typeof item === 'undefined') return null;
+ return emojiString(item.original);
+ },
+ menuItemTemplate: (item) => {
+ return `<div class="tribute-item">${emojiHTML(item.original)}<span>${item.original}</span></div>`;
}
- cb(matches);
- },
- lookup(item) {
- return item;
- },
- selectTemplate(item) {
- if (typeof item === 'undefined') return null;
- return emojiString(item.original);
- },
- menuItemTemplate(item) {
- return `<div class="tribute-item">${emojiHTML(item.original)}<span>${item.original}</span></div>`;
- }
- }]
-}) : null;
-
-export function initTribute() {
- if (!window.config.Tribute) return;
-
- let content = document.getElementById('content');
- if (content !== null) {
- issuesTribute.attach(content);
+ });
}
- const emojiInputs = document.querySelectorAll('.emoji-input');
- if (emojiInputs.length > 0) {
- emojiTribute.attach(emojiInputs);
+ if (emoji) {
+ collections.push({
+ values: window.config.tributeValues,
+ noMatchTemplate: () => null,
+ menuItemTemplate: (item) => {
+ return `
+ <div class="tribute-item">
+ <img src="${item.original.avatar}"/>
+ <span class="name">${item.original.name}</span>
+ ${item.original.fullname && item.original.fullname !== '' ? `<span class="fullname">${item.original.fullname}</span>` : ''}
+ </div>
+ `;
+ }
+ });
}
- content = document.getElementById('content');
- if (content !== null) {
- emojiTribute.attach(document.getElementById('content'));
+ return collections;
+}
+
+export default async function attachTribute(elementOrNodeList, {mentions, emoji} = {}) {
+ if (!window.config.Tribute || !elementOrNodeList) return;
+ const nodes = Array.from('length' in elementOrNodeList ? elementOrNodeList : [elementOrNodeList]);
+ if (!nodes.length) return;
+
+ const mentionNodes = nodes.filter((node) => {
+ return mentions || node.id === 'content';
+ });
+ const emojiNodes = nodes.filter((node) => {
+ return emoji || node.id === 'content' || node.classList.contains('emoji-input');
+ });
+ const uniqueNodes = uniq([...mentionNodes, ...emojiNodes]);
+ if (!uniqueNodes.length) return;
+
+ const {default: Tribute} = await import(/* webpackChunkName: "tribute" */'tributejs');
+
+ const collections = makeCollections({
+ mentions: mentions || mentionNodes.length > 0,
+ emoji: emoji || emojiNodes.length > 0,
+ });
+
+ const tribute = new Tribute({collection: collections});
+ for (const node of uniqueNodes) {
+ tribute.attach(node);
}
+ return tribute;
}