'use strict'; var csrf; var suburl; function initCommentPreviewTab($form) { var $tabMenu = $form.find('.tabular.menu'); $tabMenu.find('.item').tab(); $tabMenu.find('.item[data-tab="' + $tabMenu.data('preview') + '"]').click(function () { var $this = $(this); $.post($this.data('url'), { "_csrf": csrf, "mode": "gfm", "context": $this.data('context'), "text": $form.find('.tab.segment[data-tab="' + $tabMenu.data('write') + '"] textarea').val() }, function (data) { var $previewPanel = $form.find('.tab.segment[data-tab="' + $tabMenu.data('preview') + '"]'); $previewPanel.html(data); emojify.run($previewPanel[0]); $('pre code', $previewPanel[0]).each(function (i, block) { hljs.highlightBlock(block); }); } ); }); buttonsClickOnEnter(); } var previewFileModes; function initEditPreviewTab($form) { var $tabMenu = $form.find('.tabular.menu'); $tabMenu.find('.item').tab(); var $previewTab = $tabMenu.find('.item[data-tab="' + $tabMenu.data('preview') + '"]'); if ($previewTab.length) { previewFileModes = $previewTab.data('preview-file-modes').split(','); $previewTab.click(function () { var $this = $(this); $.post($this.data('url'), { "_csrf": csrf, "mode": "gfm", "context": $this.data('context'), "text": $form.find('.tab.segment[data-tab="' + $tabMenu.data('write') + '"] textarea').val() }, function (data) { var $previewPanel = $form.find('.tab.segment[data-tab="' + $tabMenu.data('preview') + '"]'); $previewPanel.html(data); emojify.run($previewPanel[0]); $('pre code', $previewPanel[0]).each(function (i, block) { hljs.highlightBlock(block); }); } ); }); } } function initEditDiffTab($form) { var $tabMenu = $form.find('.tabular.menu'); $tabMenu.find('.item').tab(); $tabMenu.find('.item[data-tab="' + $tabMenu.data('diff') + '"]').click(function () { var $this = $(this); $.post($this.data('url'), { "_csrf": csrf, "context": $this.data('context'), "content": $form.find('.tab.segment[data-tab="' + $tabMenu.data('write') + '"] textarea').val() }, function (data) { var $diffPreviewPanel = $form.find('.tab.segment[data-tab="' + $tabMenu.data('diff') + '"]'); $diffPreviewPanel.html(data); emojify.run($diffPreviewPanel[0]); } ); }); } function initEditForm() { if ($('.edit.form').length == 0) { return; } initEditPreviewTab($('.edit.form')); initEditDiffTab($('.edit.form')); } function initBranchSelector() { var $selectBranch = $('.ui.select-branch') var $branchMenu = $selectBranch.find('.reference-list-menu'); $branchMenu.find('.item:not(.no-select)').click(function () { var selectedValue = $(this).data('id'); $($(this).data('id-selector')).val(selectedValue); $selectBranch.find('.ui .branch-name').text(selectedValue); }); $selectBranch.find('.reference.column').click(function () { $selectBranch.find('.scrolling.reference-list-menu').css('display', 'none'); $selectBranch.find('.reference .text').removeClass('black'); $($(this).data('target')).css('display', 'block'); $(this).find('.text').addClass('black'); return false; }); } function updateIssuesMeta(url, action, issueIds, elementId, afterSuccess) { $.ajax({ type: "POST", url: url, data: { "_csrf": csrf, "action": action, "issue_ids": issueIds, "id": elementId }, success: afterSuccess }) } function initReactionSelector(parent) { var reactions = ''; if (!parent) { parent = $(document); reactions = '.reactions > '; } 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){ var vm = this; e.preventDefault(); if ($(this).hasClass('disabled')) return; var actionURL = $(this).hasClass('item') ? $(this).closest('.select-reaction').data('action-url') : $(this).data('action-url'); var url = actionURL + '/' + ($(this).hasClass('blue') ? 'unreact' : 'react'); $.ajax({ type: 'POST', url: url, data: { '_csrf': csrf, 'content': $(this).data('content') } }).done(function(resp) { if (resp && (resp.html || resp.empty)) { var content = $(vm).closest('.content'); var react = content.find('.segment.reactions'); if (react.length > 0) { react.remove(); } if (!resp.empty) { react = $('
'); var attachments = content.find('.segment.bottom:first'); if (attachments.length > 0) { react.insertBefore(attachments); } else { react.appendTo(content); } react.html(resp.html); var hasEmoji = react.find('.has-emoji'); for (var i = 0; i < hasEmoji.length; i++) { emojify.run(hasEmoji.get(i)); } react.find('.dropdown').dropdown(); initReactionSelector(react); } } }); }); } function insertAtCursor(field, value) { if (field.selectionStart || field.selectionStart === 0) { var startPos = field.selectionStart; var endPos = field.selectionEnd; 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 { field.value += value; } } function replaceAndKeepCursor(field, oldval, newval) { if (field.selectionStart || field.selectionStart === 0) { var startPos = field.selectionStart; var endPos = field.selectionEnd; field.value = field.value.replace(oldval, newval); field.selectionStart = startPos + newval.length - oldval.length; field.selectionEnd = endPos + newval.length - oldval.length; } else { field.value = field.value.replace(oldval, newval); } } function retrieveImageFromClipboardAsBlob(pasteEvent, callback){ if (!pasteEvent.clipboardData) { return; } var items = pasteEvent.clipboardData.items; if (typeof(items) === "undefined") { return; } for (var i = 0; i < items.length; i++) { if (items[i].type.indexOf("image") === -1) continue; var blob = items[i].getAsFile(); if (typeof(callback) === "function") { pasteEvent.preventDefault(); pasteEvent.stopPropagation(); callback(blob); } } } function uploadFile(file, callback) { var xhr = new XMLHttpRequest(); xhr.onload = function() { if (xhr.status == 200) { callback(xhr.responseText); } }; xhr.open("post", suburl + "/attachments", true); xhr.setRequestHeader("X-Csrf-Token", csrf); var formData = new FormData(); formData.append('file', file, file.name); xhr.send(formData); } function initImagePaste(target) { target.each(function(i, field) { field.addEventListener('paste', function(event){ retrieveImageFromClipboardAsBlob(event, function(img) { var name = img.name.substr(0, img.name.lastIndexOf('.')); insertAtCursor(field, '![' + name + ']()'); uploadFile(img, function(res) { var data = JSON.parse(res); replaceAndKeepCursor(field, '![' + name + ']()', '![' + name + '](' + suburl + '/attachments/' + data.uuid + ')'); var input = $('').val(data.uuid); $('.files').append(input); }); }); }, false); }); } function initCommentForm() { if ($('.comment.form').length == 0) { return } initBranchSelector(); initCommentPreviewTab($('.comment.form')); initImagePaste($('.comment.form textarea')); // Listsubmit function initListSubmits(selector, outerSelector) { var $list = $('.ui.' + outerSelector + '.list'); var $noSelect = $list.find('.no-select'); var $listMenu = $('.' + selector + ' .menu'); var hasLabelUpdateAction = $listMenu.data('action') == 'update'; $('.' + selector).dropdown('setting', 'onHide', function(){ hasLabelUpdateAction = $listMenu.data('action') == 'update'; // Update the var if (hasLabelUpdateAction) { location.reload(); } }); $listMenu.find('.item:not(.no-select)').click(function () { // we don't need the action attribute when updating assignees if (selector == 'select-assignees-modify') { // UI magic. We need to do this here, otherwise it would destroy the functionality of // adding/removing labels if ($(this).hasClass('checked')) { $(this).removeClass('checked'); $(this).find('.octicon').removeClass('octicon-check'); } else { $(this).addClass('checked'); $(this).find('.octicon').addClass('octicon-check'); } updateIssuesMeta( $listMenu.data('update-url'), "", $listMenu.data('issue-id'), $(this).data('id') ); $listMenu.data('action', 'update'); // Update to reload the page when we updated items return false; } if ($(this).hasClass('checked')) { $(this).removeClass('checked'); $(this).find('.octicon').removeClass('octicon-check'); if (hasLabelUpdateAction) { updateIssuesMeta( $listMenu.data('update-url'), "detach", $listMenu.data('issue-id'), $(this).data('id') ); } } else { $(this).addClass('checked'); $(this).find('.octicon').addClass('octicon-check'); if (hasLabelUpdateAction) { updateIssuesMeta( $listMenu.data('update-url'), "attach", $listMenu.data('issue-id'), $(this).data('id') ); } } var listIds = []; $(this).parent().find('.item').each(function () { if ($(this).hasClass('checked')) { listIds.push($(this).data('id')); $($(this).data('id-selector')).removeClass('hide'); } else { $($(this).data('id-selector')).addClass('hide'); } }); if (listIds.length == 0) { $noSelect.removeClass('hide'); } else { $noSelect.addClass('hide'); } $($(this).parent().data('id')).val(listIds.join(",")); return false; }); $listMenu.find('.no-select.item').click(function () { if (hasLabelUpdateAction || selector == 'select-assignees-modify') { updateIssuesMeta( $listMenu.data('update-url'), "clear", $listMenu.data('issue-id'), "" ); $listMenu.data('action', 'update'); // Update to reload the page when we updated items } $(this).parent().find('.item').each(function () { $(this).removeClass('checked'); $(this).find('.octicon').removeClass('octicon-check'); }); $list.find('.item').each(function () { $(this).addClass('hide'); }); $noSelect.removeClass('hide'); $($(this).parent().data('id')).val(''); }); } // Init labels and assignees initListSubmits('select-label', 'labels'); initListSubmits('select-assignees', 'assignees'); initListSubmits('select-assignees-modify', 'assignees'); function selectItem(select_id, input_id) { var $menu = $(select_id + ' .menu'); var $list = $('.ui' + select_id + '.list'); var hasUpdateAction = $menu.data('action') == 'update'; $menu.find('.item:not(.no-select)').click(function () { $(this).parent().find('.item').each(function () { $(this).removeClass('selected active') }); $(this).addClass('selected active'); if (hasUpdateAction) { updateIssuesMeta( $menu.data('update-url'), "", $menu.data('issue-id'), $(this).data('id'), function() { location.reload(); } ); } switch (input_id) { case '#milestone_id': $list.find('.selected').html('' + $(this).text() + ''); break; case '#assignee_id': $list.find('.selected').html('' + '