|
|
@ -2,24 +2,23 @@ |
|
|
|
/* exported timeAddManual, toggleStopwatch, cancelStopwatch */ |
|
|
|
/* exported toggleDeadlineForm, setDeadline, updateDeadline, deleteDependencyModal, cancelCodeComment, onOAuthLoginClick */ |
|
|
|
|
|
|
|
import './publicPath.js'; |
|
|
|
import './publicpath.js'; |
|
|
|
import './polyfills.js'; |
|
|
|
|
|
|
|
import Vue from 'vue'; |
|
|
|
import 'jquery.are-you-sure'; |
|
|
|
import './vendor/semanticDropdown.js'; |
|
|
|
import { svg } from './utils.js'; |
|
|
|
import './vendor/semanticdropdown.js'; |
|
|
|
import {svg} from './utils.js'; |
|
|
|
|
|
|
|
import initContextPopups from './features/contextPopup.js'; |
|
|
|
import initContextPopups from './features/contextpopup.js'; |
|
|
|
import initHighlight from './features/highlight.js'; |
|
|
|
import initGitGraph from './features/gitGraph.js'; |
|
|
|
import initGitGraph from './features/gitgraph.js'; |
|
|
|
import initClipboard from './features/clipboard.js'; |
|
|
|
import initUserHeatmap from './features/userHeatmap.js'; |
|
|
|
import initUserHeatmap from './features/userheatmap.js'; |
|
|
|
import createDropzone from './features/dropzone.js'; |
|
|
|
|
|
|
|
import ActivityTopAuthors from './components/ActivityTopAuthors.vue'; |
|
|
|
|
|
|
|
const { AppSubUrl, StaticUrlPrefix, csrf } = window.config; |
|
|
|
const {AppSubUrl, StaticUrlPrefix, csrf} = window.config; |
|
|
|
|
|
|
|
function htmlEncode(text) { |
|
|
|
return jQuery('<div />').text(text).html(); |
|
|
@ -99,7 +98,6 @@ function initEditDiffTab($form) { |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function initEditForm() { |
|
|
|
if ($('.edit.form').length === 0) { |
|
|
|
return; |
|
|
@ -184,7 +182,7 @@ function initReactionSelector(parent) { |
|
|
|
reactions = '.reactions > '; |
|
|
|
} |
|
|
|
|
|
|
|
parent.find(`${reactions}a.label`).popup({ position: 'bottom left', metadata: { content: 'title', title: 'none' } }); |
|
|
|
parent.find(`${reactions}a.label`).popup({position: 'bottom left', metadata: {content: 'title', title: 'none'}}); |
|
|
|
|
|
|
|
parent.find(`.select-reaction > .menu > .item, ${reactions}a.label`).on('click', function (e) { |
|
|
|
const vm = this; |
|
|
@ -192,9 +190,7 @@ function initReactionSelector(parent) { |
|
|
|
|
|
|
|
if ($(this).hasClass('disabled')) return; |
|
|
|
|
|
|
|
const actionURL = $(this).hasClass('item') |
|
|
|
? $(this).closest('.select-reaction').data('action-url') |
|
|
|
: $(this).data('action-url'); |
|
|
|
const actionURL = $(this).hasClass('item') ? $(this).closest('.select-reaction').data('action-url') : $(this).data('action-url'); |
|
|
|
const url = `${actionURL}/${$(this).hasClass('blue') ? 'unreact' : 'react'}`; |
|
|
|
$.ajax({ |
|
|
|
type: 'POST', |
|
|
@ -235,9 +231,7 @@ function insertAtCursor(field, value) { |
|
|
|
if (field.selectionStart || field.selectionStart === 0) { |
|
|
|
const startPos = field.selectionStart; |
|
|
|
const endPos = field.selectionEnd; |
|
|
|
field.value = field.value.substring(0, startPos) |
|
|
|
+ value |
|
|
|
+ field.value.substring(endPos, field.value.length); |
|
|
|
field.value = field.value.substring(0, startPos) + value + field.value.substring(endPos, field.value.length); |
|
|
|
field.selectionStart = startPos + value.length; |
|
|
|
field.selectionEnd = startPos + value.length; |
|
|
|
} else { |
|
|
@ -262,13 +256,13 @@ function retrieveImageFromClipboardAsBlob(pasteEvent, callback) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
const { items } = pasteEvent.clipboardData; |
|
|
|
const {items} = pasteEvent.clipboardData; |
|
|
|
if (typeof items === 'undefined') { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
for (let i = 0; i < items.length; i++) { |
|
|
|
if (items[i].type.indexOf('image') === -1) continue; |
|
|
|
if (!items[i].type.includes('image')) continue; |
|
|
|
const blob = items[i].getAsFile(); |
|
|
|
|
|
|
|
if (typeof (callback) === 'function') { |
|
|
@ -282,11 +276,11 @@ function retrieveImageFromClipboardAsBlob(pasteEvent, callback) { |
|
|
|
function uploadFile(file, callback) { |
|
|
|
const xhr = new XMLHttpRequest(); |
|
|
|
|
|
|
|
xhr.onload = function () { |
|
|
|
xhr.addEventListener('load', () => { |
|
|
|
if (xhr.status === 200) { |
|
|
|
callback(xhr.responseText); |
|
|
|
} |
|
|
|
}; |
|
|
|
}); |
|
|
|
|
|
|
|
xhr.open('post', `${AppSubUrl}/attachments`, true); |
|
|
|
xhr.setRequestHeader('X-Csrf-Token', csrf); |
|
|
@ -493,8 +487,8 @@ function initCommentForm() { |
|
|
|
htmlEncode($(this).text())}</a>`); |
|
|
|
break; |
|
|
|
case '#assignee_id': |
|
|
|
$list.find('.selected').html(`<a class="item" href=${$(this).data('href')}>` |
|
|
|
+ `<img class="ui avatar image" src=${$(this).data('avatar')}>${ |
|
|
|
$list.find('.selected').html(`<a class="item" href=${$(this).data('href')}>` + |
|
|
|
`<img class="ui avatar image" src=${$(this).data('avatar')}>${ |
|
|
|
htmlEncode($(this).text())}</a>`); |
|
|
|
} |
|
|
|
$(`.ui${select_id}.list .no-select`).addClass('hide'); |
|
|
@ -654,7 +648,7 @@ function initRepository() { |
|
|
|
window.location.href = $choice.data('url'); |
|
|
|
} |
|
|
|
}, |
|
|
|
message: { noResults: $dropdown.data('no-results') } |
|
|
|
message: {noResults: $dropdown.data('no-results')} |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
@ -797,13 +791,11 @@ function initRepository() { |
|
|
|
$.post(update_url, { |
|
|
|
_csrf: csrf, |
|
|
|
target_branch: targetBranch |
|
|
|
}) |
|
|
|
.success((data) => { |
|
|
|
$branchTarget.text(data.base_branch); |
|
|
|
}) |
|
|
|
.always(() => { |
|
|
|
reload(); |
|
|
|
}); |
|
|
|
}).success((data) => { |
|
|
|
$branchTarget.text(data.base_branch); |
|
|
|
}).always(() => { |
|
|
|
reload(); |
|
|
|
}); |
|
|
|
}; |
|
|
|
|
|
|
|
const pullrequest_target_update_url = $(this).data('target-update-url'); |
|
|
@ -814,8 +806,7 @@ function initRepository() { |
|
|
|
$.post($(this).data('update-url'), { |
|
|
|
_csrf: csrf, |
|
|
|
title: $editInput.val() |
|
|
|
}, |
|
|
|
(data) => { |
|
|
|
}, (data) => { |
|
|
|
$editInput.val(data.title); |
|
|
|
$issueTitle.text(data.title); |
|
|
|
pullrequest_targetbranch_change(pullrequest_target_update_url); |
|
|
@ -887,7 +878,7 @@ function initRepository() { |
|
|
|
const filenameDict = {}; |
|
|
|
dz = await createDropzone($dropzone[0], { |
|
|
|
url: $dropzone.data('upload-url'), |
|
|
|
headers: { 'X-Csrf-Token': csrf }, |
|
|
|
headers: {'X-Csrf-Token': csrf}, |
|
|
|
maxFiles: $dropzone.data('max-file'), |
|
|
|
maxFilesize: $dropzone.data('max-size'), |
|
|
|
acceptedFiles: ($dropzone.data('accepts') === '*/*') ? null : $dropzone.data('accepts'), |
|
|
@ -1142,8 +1133,8 @@ function initMigration() { |
|
|
|
const toggleMigrations = function () { |
|
|
|
const authUserName = $('#auth_username').val(); |
|
|
|
const cloneAddr = $('#clone_addr').val(); |
|
|
|
if (!$('#mirror').is(':checked') && (authUserName && authUserName.length > 0) |
|
|
|
&& (cloneAddr !== undefined && (cloneAddr.startsWith('https://github.com') || cloneAddr.startsWith('http://github.com')))) { |
|
|
|
if (!$('#mirror').is(':checked') && (authUserName && authUserName.length > 0) && |
|
|
|
(cloneAddr !== undefined && (cloneAddr.startsWith('https://github.com') || cloneAddr.startsWith('http://github.com')))) { |
|
|
|
$('#migrate_items').show(); |
|
|
|
} else { |
|
|
|
$('#migrate_items').hide(); |
|
|
@ -1203,8 +1194,7 @@ function initPullRequestReview() { |
|
|
|
.on('mouseenter', function () { |
|
|
|
const parent = $(this).closest('td'); |
|
|
|
$(this).closest('tr').addClass( |
|
|
|
parent.hasClass('lines-num-old') || parent.hasClass('lines-code-old') |
|
|
|
? 'focus-lines-old' : 'focus-lines-new' |
|
|
|
parent.hasClass('lines-num-old') || parent.hasClass('lines-code-old') ? 'focus-lines-old' : 'focus-lines-new' |
|
|
|
); |
|
|
|
}) |
|
|
|
.on('mouseleave', function () { |
|
|
@ -1225,8 +1215,8 @@ function initPullRequestReview() { |
|
|
|
let ntr = tr.next(); |
|
|
|
if (!ntr.hasClass('add-comment')) { |
|
|
|
ntr = $(`<tr class="add-comment">${ |
|
|
|
isSplit ? '<td class="lines-num"></td><td class="lines-type-marker"></td><td class="add-comment-left"></td><td class="lines-num"></td><td class="lines-type-marker"></td><td class="add-comment-right"></td>' |
|
|
|
: '<td class="lines-num"></td><td class="lines-num"></td><td class="lines-type-marker"></td><td class="add-comment-left add-comment-right"></td>' |
|
|
|
isSplit ? '<td class="lines-num"></td><td class="lines-type-marker"></td><td class="add-comment-left"></td><td class="lines-num"></td><td class="lines-type-marker"></td><td class="add-comment-right"></td>' : |
|
|
|
'<td class="lines-num"></td><td class="lines-num"></td><td class="lines-type-marker"></td><td class="add-comment-left add-comment-right"></td>' |
|
|
|
}</tr>`); |
|
|
|
tr.after(ntr); |
|
|
|
} |
|
|
@ -1297,7 +1287,7 @@ function initWikiForm() { |
|
|
|
// FIXME: still send render request when return back to edit mode
|
|
|
|
const render = function () { |
|
|
|
sideBySideChanges = 0; |
|
|
|
if (sideBySideTimeout != null) { |
|
|
|
if (sideBySideTimeout !== null) { |
|
|
|
clearTimeout(sideBySideTimeout); |
|
|
|
sideBySideTimeout = null; |
|
|
|
} |
|
|
@ -1306,8 +1296,7 @@ function initWikiForm() { |
|
|
|
mode: 'gfm', |
|
|
|
context: $editArea.data('context'), |
|
|
|
text: plainText |
|
|
|
}, |
|
|
|
(data) => { |
|
|
|
}, (data) => { |
|
|
|
preview.innerHTML = `<div class="markdown ui segment">${data}</div>`; |
|
|
|
emojify.run($('.editor-preview')[0]); |
|
|
|
$(preview).find('pre code').each((_, e) => { |
|
|
@ -1324,7 +1313,7 @@ function initWikiForm() { |
|
|
|
render(); |
|
|
|
} |
|
|
|
// or delay preview by timeout
|
|
|
|
if (sideBySideTimeout != null) { |
|
|
|
if (sideBySideTimeout !== null) { |
|
|
|
clearTimeout(sideBySideTimeout); |
|
|
|
sideBySideTimeout = null; |
|
|
|
} |
|
|
@ -1479,8 +1468,7 @@ function setSimpleMDE($editArea) { |
|
|
|
mode: 'gfm', |
|
|
|
context: $editArea.data('context'), |
|
|
|
text: plainText |
|
|
|
}, |
|
|
|
(data) => { |
|
|
|
}, (data) => { |
|
|
|
preview.innerHTML = `<div class="markdown ui segment">${data}</div>`; |
|
|
|
emojify.run($('.editor-preview')[0]); |
|
|
|
}); |
|
|
@ -1658,7 +1646,7 @@ function initEditor() { |
|
|
|
apiCall = extension; |
|
|
|
} |
|
|
|
|
|
|
|
if (previewLink.length && apiCall && previewFileModes && previewFileModes.length && previewFileModes.indexOf(apiCall) >= 0) { |
|
|
|
if (previewLink.length && apiCall && previewFileModes && previewFileModes.length && previewFileModes.includes(apiCall)) { |
|
|
|
dataUrl = previewLink.data('url'); |
|
|
|
previewLink.data('url', dataUrl.replace(/(.*)\/.*/i, `$1/${mode}`)); |
|
|
|
previewLink.show(); |
|
|
@ -1667,7 +1655,7 @@ function initEditor() { |
|
|
|
} |
|
|
|
|
|
|
|
// If this file is a Markdown extensions, we will load that editor and return
|
|
|
|
if (markdownFileExts.indexOf(extWithDot) >= 0) { |
|
|
|
if (markdownFileExts.includes(extWithDot)) { |
|
|
|
if (setSimpleMDE($editArea)) { |
|
|
|
return; |
|
|
|
} |
|
|
@ -1683,7 +1671,7 @@ function initEditor() { |
|
|
|
CodeMirror.autoLoadMode(codeMirrorEditor, mode); |
|
|
|
} |
|
|
|
|
|
|
|
if (lineWrapExtensions.indexOf(extWithDot) >= 0) { |
|
|
|
if (lineWrapExtensions.includes(extWithDot)) { |
|
|
|
codeMirrorEditor.setOption('lineWrapping', true); |
|
|
|
} else { |
|
|
|
codeMirrorEditor.setOption('lineWrapping', false); |
|
|
@ -1708,7 +1696,7 @@ function initEditor() { |
|
|
|
// - https://codemirror.net/doc/manual.html#keymaps
|
|
|
|
codeMirrorEditor.setOption('extraKeys', { |
|
|
|
Tab(cm) { |
|
|
|
const spaces = Array(parseInt(cm.getOption('indentUnit')) + 1).join(' '); |
|
|
|
const spaces = new Array(parseInt(cm.getOption('indentUnit')) + 1).join(' '); |
|
|
|
cm.replaceSelection(spaces); |
|
|
|
} |
|
|
|
}); |
|
|
@ -2071,7 +2059,7 @@ function searchUsers() { |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
return { results: items }; |
|
|
|
return {results: items}; |
|
|
|
} |
|
|
|
}, |
|
|
|
searchFields: ['login', 'full_name'], |
|
|
@ -2085,7 +2073,7 @@ function searchTeams() { |
|
|
|
minCharacters: 2, |
|
|
|
apiSettings: { |
|
|
|
url: `${AppSubUrl}/api/v1/orgs/${$searchTeamBox.data('org')}/teams/search?q={query}`, |
|
|
|
headers: { 'X-Csrf-Token': csrf }, |
|
|
|
headers: {'X-Csrf-Token': csrf}, |
|
|
|
onResponse(response) { |
|
|
|
const items = []; |
|
|
|
$.each(response.data, (_i, item) => { |
|
|
@ -2095,7 +2083,7 @@ function searchTeams() { |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
return { results: items }; |
|
|
|
return {results: items}; |
|
|
|
} |
|
|
|
}, |
|
|
|
searchFields: ['name', 'description'], |
|
|
@ -2118,7 +2106,7 @@ function searchRepositories() { |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
return { results: items }; |
|
|
|
return {results: items}; |
|
|
|
} |
|
|
|
}, |
|
|
|
searchFields: ['full_name'], |
|
|
@ -2153,7 +2141,7 @@ function initCodeView() { |
|
|
|
} |
|
|
|
}).trigger('hashchange'); |
|
|
|
} |
|
|
|
$('.fold-code').on('click', ({ target }) => { |
|
|
|
$('.fold-code').on('click', ({target}) => { |
|
|
|
const box = target.closest('.file-content'); |
|
|
|
const folded = box.dataset.folded !== 'true'; |
|
|
|
target.classList.add(`fa-chevron-${folded ? 'right' : 'down'}`); |
|
|
@ -2165,11 +2153,11 @@ function initCodeView() { |
|
|
|
const $row = $blob.parent().parent(); |
|
|
|
$.get(`${$blob.data('url')}?${$blob.data('query')}&anchor=${$blob.data('anchor')}`, (blob) => { |
|
|
|
$row.replaceWith(blob); |
|
|
|
$(`[data-anchor="${$blob.data('anchor')}"]`).on('click', (e) => { insertBlobExcerpt(e); }); |
|
|
|
$(`[data-anchor="${$blob.data('anchor')}"]`).on('click', (e) => { insertBlobExcerpt(e) }); |
|
|
|
$('.diff-detail-box.ui.sticky').sticky(); |
|
|
|
}); |
|
|
|
} |
|
|
|
$('.ui.blob-excerpt').on('click', (e) => { insertBlobExcerpt(e); }); |
|
|
|
$('.ui.blob-excerpt').on('click', (e) => { insertBlobExcerpt(e) }); |
|
|
|
} |
|
|
|
|
|
|
|
function initU2FAuth() { |
|
|
@ -2198,7 +2186,7 @@ function u2fSigned(resp) { |
|
|
|
$.ajax({ |
|
|
|
url: `${AppSubUrl}/user/u2f/sign`, |
|
|
|
type: 'POST', |
|
|
|
headers: { 'X-Csrf-Token': csrf }, |
|
|
|
headers: {'X-Csrf-Token': csrf}, |
|
|
|
data: JSON.stringify(resp), |
|
|
|
contentType: 'application/json; charset=utf-8', |
|
|
|
}).done((res) => { |
|
|
@ -2215,7 +2203,7 @@ function u2fRegistered(resp) { |
|
|
|
$.ajax({ |
|
|
|
url: `${AppSubUrl}/user/settings/security/u2f/register`, |
|
|
|
type: 'POST', |
|
|
|
headers: { 'X-Csrf-Token': csrf }, |
|
|
|
headers: {'X-Csrf-Token': csrf}, |
|
|
|
data: JSON.stringify(resp), |
|
|
|
contentType: 'application/json; charset=utf-8', |
|
|
|
success() { |
|
|
@ -2238,7 +2226,6 @@ function checkError(resp) { |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function u2fError(errorType) { |
|
|
|
const u2fErrors = { |
|
|
|
browser: $('#unsupported-browser'), |
|
|
@ -2259,8 +2246,8 @@ function u2fError(errorType) { |
|
|
|
} |
|
|
|
|
|
|
|
function initU2FRegister() { |
|
|
|
$('#register-device').modal({ allowMultiple: false }); |
|
|
|
$('#u2f-error').modal({ allowMultiple: false }); |
|
|
|
$('#register-device').modal({allowMultiple: false}); |
|
|
|
$('#u2f-error').modal({allowMultiple: false}); |
|
|
|
$('#register-security-key').on('click', (e) => { |
|
|
|
e.preventDefault(); |
|
|
|
u2fApi.ensureSupport() |
|
|
@ -2337,7 +2324,7 @@ function initTemplateSearch() { |
|
|
|
apiSettings: { |
|
|
|
url: `${AppSubUrl}/api/v1/repos/search?q={query}&template=true&priority_owner_id=${$('#uid').val()}`, |
|
|
|
onResponse(response) { |
|
|
|
const filteredResponse = { success: true, results: [] }; |
|
|
|
const filteredResponse = {success: true, results: []}; |
|
|
|
filteredResponse.results.push({ |
|
|
|
name: '', |
|
|
|
value: '' |
|
|
@ -2417,7 +2404,7 @@ $(document).ready(async () => { |
|
|
|
|
|
|
|
await createDropzone('#dropzone', { |
|
|
|
url: $dropzone.data('upload-url'), |
|
|
|
headers: { 'X-Csrf-Token': csrf }, |
|
|
|
headers: {'X-Csrf-Token': csrf}, |
|
|
|
maxFiles: $dropzone.data('max-file'), |
|
|
|
maxFilesize: $dropzone.data('max-size'), |
|
|
|
acceptedFiles: ($dropzone.data('accepts') === '*/*') ? null : $dropzone.data('accepts'), |
|
|
@ -2515,12 +2502,12 @@ $(document).ready(async () => { |
|
|
|
}); |
|
|
|
|
|
|
|
$('.issue-action').click(function () { |
|
|
|
let { action } = this.dataset; |
|
|
|
let { elementId } = this.dataset; |
|
|
|
let {action} = this.dataset; |
|
|
|
let {elementId} = this.dataset; |
|
|
|
const issueIDs = $('.issue-checkbox').children('input:checked').map(function () { |
|
|
|
return this.dataset.issueId; |
|
|
|
}).get().join(); |
|
|
|
const { url } = this.dataset; |
|
|
|
const {url} = this.dataset; |
|
|
|
if (elementId === '0' && url.substr(-9) === '/assignee') { |
|
|
|
elementId = ''; |
|
|
|
action = 'clear'; |
|
|
@ -2529,7 +2516,7 @@ $(document).ready(async () => { |
|
|
|
// NOTICE: This reset of checkbox state targets Firefox caching behaviour, as the checkboxes stay checked after reload
|
|
|
|
if (action === 'close' || action === 'open') { |
|
|
|
// uncheck all checkboxes
|
|
|
|
$('.issue-checkbox input[type="checkbox"]').each((_, e) => { e.checked = false; }); |
|
|
|
$('.issue-checkbox input[type="checkbox"]').each((_, e) => { e.checked = false }); |
|
|
|
} |
|
|
|
reload(); |
|
|
|
}); |
|
|
@ -3031,8 +3018,8 @@ function initFilterBranchTagDropdown(selector) { |
|
|
|
const vm = this; |
|
|
|
|
|
|
|
const items = vm.items.filter((item) => { |
|
|
|
return ((vm.mode === 'branches' && item.branch) || (vm.mode === 'tags' && item.tag)) |
|
|
|
&& (!vm.searchTerm || item.name.toLowerCase().indexOf(vm.searchTerm.toLowerCase()) >= 0); |
|
|
|
return ((vm.mode === 'branches' && item.branch) || (vm.mode === 'tags' && item.tag)) && |
|
|
|
(!vm.searchTerm || item.name.toLowerCase().includes(vm.searchTerm.toLowerCase())); |
|
|
|
}); |
|
|
|
|
|
|
|
vm.active = (items.length === 0 && vm.showCreateNewBranch ? 0 : -1); |
|
|
@ -3226,7 +3213,7 @@ function initTopicbar() { |
|
|
|
if (xhr.responseJSON.invalidTopics.length > 0) { |
|
|
|
topicPrompts.formatPrompt = xhr.responseJSON.message; |
|
|
|
|
|
|
|
const { invalidTopics } = xhr.responseJSON; |
|
|
|
const {invalidTopics} = xhr.responseJSON; |
|
|
|
const topicLables = topicDropdown.children('a.ui.label'); |
|
|
|
|
|
|
|
topics.split(',').forEach((value, index) => { |
|
|
@ -3248,7 +3235,7 @@ function initTopicbar() { |
|
|
|
topicDropdown.dropdown({ |
|
|
|
allowAdditions: true, |
|
|
|
forceSelection: false, |
|
|
|
fields: { name: 'description', value: 'data-value' }, |
|
|
|
fields: {name: 'description', value: 'data-value'}, |
|
|
|
saveRemoteData: false, |
|
|
|
label: { |
|
|
|
transition: 'horizontal flip', |
|
|
@ -3276,20 +3263,20 @@ function initTopicbar() { |
|
|
|
const query = stripTags(this.urlData.query.trim()); |
|
|
|
let found_query = false; |
|
|
|
const current_topics = []; |
|
|
|
topicDropdown.find('div.label.visible.topic,a.label.visible').each((_, e) => { current_topics.push(e.dataset.value); }); |
|
|
|
topicDropdown.find('div.label.visible.topic,a.label.visible').each((_, e) => { current_topics.push(e.dataset.value) }); |
|
|
|
|
|
|
|
if (res.topics) { |
|
|
|
let found = false; |
|
|
|
for (let i = 0; i < res.topics.length; i++) { |
|
|
|
// skip currently added tags
|
|
|
|
if (current_topics.indexOf(res.topics[i].topic_name) !== -1) { |
|
|
|
if (current_topics.includes(res.topics[i].topic_name)) { |
|
|
|
continue; |
|
|
|
} |
|
|
|
|
|
|
|
if (res.topics[i].topic_name.toLowerCase() === query.toLowerCase()) { |
|
|
|
found_query = true; |
|
|
|
} |
|
|
|
formattedResponse.results.push({ description: res.topics[i].topic_name, 'data-value': res.topics[i].topic_name }); |
|
|
|
formattedResponse.results.push({description: res.topics[i].topic_name, 'data-value': res.topics[i].topic_name}); |
|
|
|
found = true; |
|
|
|
} |
|
|
|
formattedResponse.success = found; |
|
|
@ -3297,7 +3284,7 @@ function initTopicbar() { |
|
|
|
|
|
|
|
if (query.length > 0 && !found_query) { |
|
|
|
formattedResponse.success = true; |
|
|
|
formattedResponse.results.unshift({ description: query, 'data-value': query }); |
|
|
|
formattedResponse.results.unshift({description: query, 'data-value': query}); |
|
|
|
} else if (query.length > 0 && found_query) { |
|
|
|
formattedResponse.results.sort((a, b) => { |
|
|
|
if (a.description.toLowerCase() === query.toLowerCase()) return -1; |
|
|
@ -3308,7 +3295,6 @@ function initTopicbar() { |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return formattedResponse; |
|
|
|
}, |
|
|
|
}, |
|
|
@ -3427,7 +3413,7 @@ function initIssueList() { |
|
|
|
apiSettings: { |
|
|
|
url: issueSearchUrl, |
|
|
|
onResponse(response) { |
|
|
|
const filteredResponse = { success: true, results: [] }; |
|
|
|
const filteredResponse = {success: true, results: []}; |
|
|
|
const currIssueId = $('#new-dependency-drop-list').data('issue-id'); |
|
|
|
// Parse the response from the api to work with our dropdown
|
|
|
|
$.each(response, (_i, issue) => { |
|
|
|