summaryrefslogtreecommitdiffstats
path: root/web_src
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
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')
-rw-r--r--web_src/js/features/tribute.js118
-rw-r--r--web_src/js/index.js13
-rw-r--r--web_src/js/utils.js5
-rw-r--r--web_src/less/_tribute.less63
-rw-r--r--web_src/less/themes/theme-arc-green.less13
5 files changed, 123 insertions, 89 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;
}
diff --git a/web_src/js/index.js b/web_src/js/index.js
index 4042924b6f..fdc5a926db 100644
--- a/web_src/js/index.js
+++ b/web_src/js/index.js
@@ -14,7 +14,7 @@ import initGitGraph from './features/gitgraph.js';
import initClipboard from './features/clipboard.js';
import initUserHeatmap from './features/userheatmap.js';
import initDateTimePicker from './features/datetimepicker.js';
-import {initTribute, issuesTribute, emojiTribute} from './features/tribute.js';
+import attachTribute from './features/tribute.js';
import createDropzone from './features/dropzone.js';
import highlight from './features/highlight.js';
import ActivityTopAuthors from './components/ActivityTopAuthors.vue';
@@ -891,8 +891,7 @@ async function initRepository() {
if ($editContentZone.html().length === 0) {
$editContentZone.html($('#edit-content-form').html());
$textarea = $editContentZone.find('textarea');
- issuesTribute.attach($textarea.get());
- emojiTribute.attach($textarea.get());
+ attachTribute($textarea.get(), {mentions: true, emoji: true});
let dz;
const $dropzone = $editContentZone.find('.dropzone');
@@ -1496,7 +1495,8 @@ function setCommentSimpleMDE($editArea) {
$(simplemde.codemirror.getInputField()).addClass('js-quick-submit');
simplemde.codemirror.setOption('extraKeys', {
Enter: () => {
- if (!(issuesTribute.isActive || emojiTribute.isActive)) {
+ const tributeContainer = document.querySelector('.tribute-container');
+ if (tributeContainer && tributeContainer.style.display !== 'none') {
return CodeMirror.Pass;
}
},
@@ -1507,8 +1507,7 @@ function setCommentSimpleMDE($editArea) {
cm.execCommand('delCharBefore');
}
});
- issuesTribute.attach(simplemde.codemirror.getInputField());
- emojiTribute.attach(simplemde.codemirror.getInputField());
+ attachTribute(simplemde.codemirror.getInputField(), {mentions: true, emoji: true});
return simplemde;
}
@@ -2431,7 +2430,6 @@ $(document).ready(async () => {
initContextPopups();
initNotificationsTable();
initNotificationCount();
- initTribute();
// Repo clone url.
if ($('#repo-clone-url').length > 0) {
@@ -2473,6 +2471,7 @@ $(document).ready(async () => {
// parallel init of lazy-loaded features
await Promise.all([
highlight(document.querySelectorAll('pre code')),
+ attachTribute(document.querySelectorAll('#content, .emoji-input')),
initGitGraph(),
initClipboard(),
initUserHeatmap(),
diff --git a/web_src/js/utils.js b/web_src/js/utils.js
index b511c9981d..b16b05a1b7 100644
--- a/web_src/js/utils.js
+++ b/web_src/js/utils.js
@@ -23,3 +23,8 @@ export function isObject(obj) {
export function isDarkTheme() {
return document.documentElement.classList.contains('theme-arc-green');
}
+
+// removes duplicate elements in an array
+export function uniq(arr) {
+ return Array.from(new Set(arr));
+}
diff --git a/web_src/less/_tribute.less b/web_src/less/_tribute.less
index d0baaf51e1..5e91e00174 100644
--- a/web_src/less/_tribute.less
+++ b/web_src/less/_tribute.less
@@ -1,34 +1,29 @@
+@import "~tributejs/dist/tribute.css";
+
.tribute-container {
- box-shadow: 0 1px 3px 1px #c7c7c7;
-
- ul {
- background: #ffffff;
- }
-
- li {
- padding: 8px 12px;
- border-bottom: 1px solid #dcdcdc;
-
- img {
- display: inline-block;
- vertical-align: middle;
- width: 28px;
- height: 28px;
- margin-right: 5px;
- }
-
- span.fullname {
- font-weight: normal;
- font-size: .8rem;
- margin-left: 3px;
- }
- }
-
- li.highlight,
- li:hover {
- background: #2185d0;
- color: #ffffff;
- }
+ box-shadow: 0 .25rem .5rem rgba(0, 0, 0, .25);
+ border-radius: .25rem;
+}
+
+.tribute-container ul {
+ margin-top: 0 !important;
+ background: #ffffff !important;
+}
+
+.tribute-container li {
+ padding: 3px .5rem !important;
+}
+
+.tribute-container li span.fullname {
+ font-weight: normal;
+ font-size: .8rem;
+ margin-left: 3px;
+}
+
+.tribute-container li.highlight,
+.tribute-container li:hover {
+ background: #2185d0 !important;
+ color: #ffffff !important;
}
.tribute-item {
@@ -36,6 +31,12 @@
align-items: center;
}
-.tribute-item .emoji {
+.tribute-item .emoji,
+.tribute-item img[src*="/avatar/"] {
margin-right: .5rem;
}
+
+.tribute-container img {
+ width: 1.5rem !important;
+ height: 1.5rem !important;
+}
diff --git a/web_src/less/themes/theme-arc-green.less b/web_src/less/themes/theme-arc-green.less
index e893307c51..a79bbe1ec5 100644
--- a/web_src/less/themes/theme-arc-green.less
+++ b/web_src/less/themes/theme-arc-green.less
@@ -1625,3 +1625,16 @@ footer .container .links > * {
.repository.release #release-list > li .detail .dot {
background-color: #888;
}
+
+.tribute-container {
+ box-shadow: 0 .25rem .5rem rgba(0, 0, 0, .6);
+}
+
+.tribute-container ul {
+ background: #2d303b !important;
+}
+
+.tribute-container li.highlight,
+.tribute-container li:hover {
+ background: #728e5e !important;
+}