Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Move tributejs to npm/webpack #11497

Merged
merged 9 commits into from
May 21, 2020
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
"svgo-loader": "2.2.1",
"swagger-ui": "3.25.3",
"terser-webpack-plugin": "3.0.1",
"tributejs": "5.1.3",
"vue": "2.6.11",
"vue-bar-graph": "1.2.0",
"vue-calendar-heatmap": "0.8.4",
Expand Down
27 changes: 0 additions & 27 deletions public/vendor/plugins/tribute/tribute.css

This file was deleted.

2 changes: 0 additions & 2 deletions public/vendor/plugins/tribute/tribute.min.js

This file was deleted.

4 changes: 0 additions & 4 deletions templates/base/footer.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,6 @@
<script src='{{ URLJoin .RecaptchaURL "api.js"}}' async></script>
{{end}}
{{end}}
{{if .RequireTribute}}
<script src="{{StaticUrlPrefix}}/vendor/plugins/tribute/tribute.min.js"></script>
{{end}}

<script src="{{StaticUrlPrefix}}/fomantic/semantic.min.js?v={{MD5 AppVer}}"></script>
<script src="{{StaticUrlPrefix}}/js/index.js?v={{MD5 AppVer}}"></script>
{{template "custom/footer" .}}
Expand Down
4 changes: 0 additions & 4 deletions templates/base/head.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -119,10 +119,6 @@
{{if .RequireSimpleMDE}}
<link rel="stylesheet" href="{{StaticUrlPrefix}}/vendor/plugins/simplemde/simplemde.min.css">
{{end}}

{{if .RequireTribute}}
<link rel="stylesheet" href="{{StaticUrlPrefix}}/vendor/plugins/tribute/tribute.css">
{{end}}
<link rel="stylesheet" href="{{StaticUrlPrefix}}/fomantic/semantic.min.css?v={{MD5 AppVer}}">
<link rel="stylesheet" href="{{StaticUrlPrefix}}/css/index.css?v={{MD5 AppVer}}">
<noscript>
Expand Down
2 changes: 1 addition & 1 deletion templates/pwa/serviceworker_js.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ var urlsToCache = [
'{{StaticUrlPrefix}}/js/swagger.js?v={{MD5 AppVer}}',
'{{StaticUrlPrefix}}/js/dropzone.js',
'{{StaticUrlPrefix}}/js/datetimepicker.js',
'{{StaticUrlPrefix}}/js/tribute.js',
'{{StaticUrlPrefix}}/vendor/plugins/codemirror/addon/mode/loadmode.js',
'{{StaticUrlPrefix}}/vendor/plugins/codemirror/mode/meta.js',
'{{StaticUrlPrefix}}/vendor/plugins/jquery.minicolors/jquery.minicolors.min.js',
Expand All @@ -24,7 +25,6 @@ var urlsToCache = [
'{{StaticUrlPrefix}}/vendor/assets/font-awesome/css/font-awesome.min.css',
'{{StaticUrlPrefix}}/vendor/plugins/jquery.minicolors/jquery.minicolors.css',
'{{StaticUrlPrefix}}/vendor/plugins/simplemde/simplemde.min.css',
'{{StaticUrlPrefix}}/vendor/plugins/tribute/tribute.css',
{{if .IsSigned }}
{{ if ne .SignedUser.Theme "gitea" }}
'{{StaticUrlPrefix}}/css/theme-{{.SignedUser.Theme}}.css?v={{MD5 AppVer}}',
Expand Down
109 changes: 60 additions & 49 deletions web_src/js/features/tribute.js
Original file line number Diff line number Diff line change
@@ -1,61 +1,72 @@
import {emojiKeys, emojiHTML, emojiString} from './emoji.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));
function createMentionsTribute(Tribute) {
return new Tribute({
values: window.config.tributeValues,
noMatchTemplate() { return 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>
`;
}
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 createEmojiTribute(Tribute) {
return 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;
}
}
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>`;
}
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;
export 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;

let content = document.getElementById('content');
if (content !== null) {
issuesTribute.attach(content);
}
const {default: Tribute} = await import(/* webpackChunkName: "tribute" */'tributejs');

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 mentionTribute = mentionNodes.length && createMentionsTribute(Tribute);
const emojiTribute = emojiNodes.length && createEmojiTribute(Tribute);

const emojiInputs = document.querySelectorAll('.emoji-input');
if (emojiInputs.length > 0) {
emojiTribute.attach(emojiInputs);
for (const node of mentionNodes || []) {
mentionTribute.attach(node);
}

content = document.getElementById('content');
if (content !== null) {
emojiTribute.attach(document.getElementById('content'));
for (const node of emojiNodes || []) {
emojiTribute.attach(node);
}
}
13 changes: 6 additions & 7 deletions web_src/js/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,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';
Expand Down Expand Up @@ -892,8 +892,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');
Expand Down Expand Up @@ -1497,7 +1496,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;
}
},
Expand All @@ -1508,8 +1508,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;
}

Expand Down Expand Up @@ -2432,7 +2431,6 @@ $(document).ready(async () => {
initContextPopups();
initNotificationsTable();
initNotificationCount();
initTribute();

// Repo clone url.
if ($('#repo-clone-url').length > 0) {
Expand Down Expand Up @@ -2474,6 +2472,7 @@ $(document).ready(async () => {
// parallel init of lazy-loaded features
await Promise.all([
highlight(document.querySelectorAll('pre code')),
attachTribute(document.querySelectorAll('textarea#content, .emoji-input')),
initGitGraph(),
initClipboard(),
initUserHeatmap(),
Expand Down
63 changes: 32 additions & 31 deletions web_src/less/_tribute.less
Original file line number Diff line number Diff line change
@@ -1,41 +1,42 @@
@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 {
display: flex;
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;
}
13 changes: 13 additions & 0 deletions web_src/less/themes/theme-arc-green.less
Original file line number Diff line number Diff line change
Expand Up @@ -1611,3 +1611,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;
}