mirror of https://github.com/gogs/gogs.git
1800 lines
47 KiB
JavaScript
1800 lines
47 KiB
JavaScript
"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,
|
|
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,
|
|
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 initCommentForm() {
|
|
if ($(".comment.form").length == 0) {
|
|
return;
|
|
}
|
|
|
|
initCommentPreviewTab($(".comment.form"));
|
|
|
|
// Labels
|
|
var $list = $(".ui.labels.list");
|
|
var $noSelect = $list.find(".no-select");
|
|
var $labelMenu = $(".select-label .menu");
|
|
var hasLabelUpdateAction = $labelMenu.data("action") == "update";
|
|
|
|
function updateIssueMeta(url, action, id) {
|
|
$.post(url, {
|
|
_csrf: csrf,
|
|
action: action,
|
|
id: id
|
|
});
|
|
}
|
|
|
|
// Add to each unselected label to keep UI looks good.
|
|
// This should be added directly to HTML but somehow just get empty <span> on this page.
|
|
$labelMenu
|
|
.find(".item:not(.no-select) .octicon:not(.octicon-check)")
|
|
.each(function() {
|
|
$(this).html(" ");
|
|
});
|
|
$labelMenu.find(".item:not(.no-select)").click(function() {
|
|
if ($(this).hasClass("checked")) {
|
|
$(this).removeClass("checked");
|
|
$(this)
|
|
.find(".octicon")
|
|
.removeClass("octicon-check")
|
|
.html(" ");
|
|
if (hasLabelUpdateAction) {
|
|
updateIssueMeta(
|
|
$labelMenu.data("update-url"),
|
|
"detach",
|
|
$(this).data("id")
|
|
);
|
|
}
|
|
} else {
|
|
$(this).addClass("checked");
|
|
$(this)
|
|
.find(".octicon")
|
|
.addClass("octicon-check")
|
|
.html("");
|
|
if (hasLabelUpdateAction) {
|
|
updateIssueMeta(
|
|
$labelMenu.data("update-url"),
|
|
"attach",
|
|
$(this).data("id")
|
|
);
|
|
}
|
|
}
|
|
|
|
var labelIds = "";
|
|
$(this)
|
|
.parent()
|
|
.find(".item")
|
|
.each(function() {
|
|
if ($(this).hasClass("checked")) {
|
|
labelIds += $(this).data("id") + ",";
|
|
$($(this).data("id-selector")).removeClass("hide");
|
|
} else {
|
|
$($(this).data("id-selector")).addClass("hide");
|
|
}
|
|
});
|
|
if (labelIds.length == 0) {
|
|
$noSelect.removeClass("hide");
|
|
} else {
|
|
$noSelect.addClass("hide");
|
|
}
|
|
$(
|
|
$(this)
|
|
.parent()
|
|
.data("id")
|
|
).val(labelIds);
|
|
return false;
|
|
});
|
|
$labelMenu.find(".no-select.item").click(function() {
|
|
if (hasLabelUpdateAction) {
|
|
updateIssueMeta($labelMenu.data("update-url"), "clear", "");
|
|
}
|
|
|
|
$(this)
|
|
.parent()
|
|
.find(".item")
|
|
.each(function() {
|
|
$(this).removeClass("checked");
|
|
$(this)
|
|
.find(".octicon")
|
|
.removeClass("octicon-check")
|
|
.html(" ");
|
|
});
|
|
|
|
$list.find(".item").each(function() {
|
|
$(this).addClass("hide");
|
|
});
|
|
$noSelect.removeClass("hide");
|
|
$(
|
|
$(this)
|
|
.parent()
|
|
.data("id")
|
|
).val("");
|
|
});
|
|
|
|
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) {
|
|
updateIssueMeta($menu.data("update-url"), "", $(this).data("id"));
|
|
}
|
|
switch (input_id) {
|
|
case "#milestone_id":
|
|
$list
|
|
.find(".selected")
|
|
.html(
|
|
'<a class="item" href=' +
|
|
$(this).data("href") +
|
|
">" +
|
|
$(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") +
|
|
">" +
|
|
$(this).text() +
|
|
"</a>"
|
|
);
|
|
}
|
|
$(".ui" + select_id + ".list .no-select").addClass("hide");
|
|
$(input_id).val($(this).data("id"));
|
|
});
|
|
$menu.find(".no-select.item").click(function() {
|
|
$(this)
|
|
.parent()
|
|
.find(".item:not(.no-select)")
|
|
.each(function() {
|
|
$(this).removeClass("selected active");
|
|
});
|
|
|
|
if (hasUpdateAction) {
|
|
updateIssueMeta($menu.data("update-url"), "", "");
|
|
}
|
|
|
|
$list.find(".selected").html("");
|
|
$list.find(".no-select").removeClass("hide");
|
|
$(input_id).val("");
|
|
});
|
|
}
|
|
|
|
// Milestone and assignee
|
|
selectItem(".select-milestone", "#milestone_id");
|
|
selectItem(".select-assignee", "#assignee_id");
|
|
}
|
|
|
|
function initRepository() {
|
|
if ($(".repository").length == 0) {
|
|
return;
|
|
}
|
|
|
|
function initFilterSearchDropdown(selector) {
|
|
var $dropdown = $(selector);
|
|
$dropdown.dropdown({
|
|
fullTextSearch: true,
|
|
onChange: function(text, value, $choice) {
|
|
window.location.href = $choice.data("url");
|
|
console.log($choice.data("url"));
|
|
},
|
|
message: { noResults: $dropdown.data("no-results") }
|
|
});
|
|
}
|
|
|
|
// File list and commits
|
|
if (
|
|
$(".repository.file.list").length > 0 ||
|
|
".repository.commits".length > 0
|
|
) {
|
|
initFilterSearchDropdown(".choose.reference .dropdown");
|
|
|
|
$(".reference.column").click(function() {
|
|
$(".choose.reference .scrolling.menu").css("display", "none");
|
|
$(".choose.reference .text").removeClass("black");
|
|
$($(this).data("target")).css("display", "block");
|
|
$(this)
|
|
.find(".text")
|
|
.addClass("black");
|
|
return false;
|
|
});
|
|
}
|
|
|
|
// Wiki
|
|
if ($(".repository.wiki.view").length > 0) {
|
|
initFilterSearchDropdown(".choose.page .dropdown");
|
|
}
|
|
|
|
// Options
|
|
if ($(".repository.settings.options").length > 0) {
|
|
$("#repo_name").keyup(function() {
|
|
var $prompt = $("#repo-name-change-prompt");
|
|
if (
|
|
$(this)
|
|
.val()
|
|
.toString()
|
|
.toLowerCase() !=
|
|
$(this)
|
|
.data("repo-name")
|
|
.toString()
|
|
.toLowerCase()
|
|
) {
|
|
$prompt.show();
|
|
} else {
|
|
$prompt.hide();
|
|
}
|
|
});
|
|
}
|
|
|
|
// Branches
|
|
if ($(".repository.settings.branches").length > 0) {
|
|
initFilterSearchDropdown(".protected-branches .dropdown");
|
|
$(".enable-protection, .enable-whitelist").change(function() {
|
|
if (this.checked) {
|
|
$($(this).data("target")).removeClass("disabled");
|
|
} else {
|
|
$($(this).data("target")).addClass("disabled");
|
|
}
|
|
});
|
|
}
|
|
|
|
// Labels
|
|
if ($(".repository.labels").length > 0) {
|
|
// Create label
|
|
var $newLabelPanel = $(".new-label.segment");
|
|
$(".new-label.button").click(function() {
|
|
$newLabelPanel.show();
|
|
});
|
|
$(".new-label.segment .cancel").click(function() {
|
|
$newLabelPanel.hide();
|
|
});
|
|
|
|
$(".color-picker").each(function() {
|
|
$(this).minicolors();
|
|
});
|
|
$(".precolors .color").click(function() {
|
|
var color_hex = $(this).data("color-hex");
|
|
$(".color-picker").val(color_hex);
|
|
$(".minicolors-swatch-color").css("background-color", color_hex);
|
|
});
|
|
$(".edit-label-button").click(function() {
|
|
$("#label-modal-id").val($(this).data("id"));
|
|
$(".edit-label .new-label-input").val($(this).data("title"));
|
|
$(".edit-label .color-picker").val($(this).data("color"));
|
|
$(".minicolors-swatch-color").css(
|
|
"background-color",
|
|
$(this).data("color")
|
|
);
|
|
$(".edit-label.modal")
|
|
.modal({
|
|
onApprove: function() {
|
|
$(".edit-label.form").submit();
|
|
}
|
|
})
|
|
.modal("show");
|
|
return false;
|
|
});
|
|
}
|
|
|
|
// Milestones
|
|
if ($(".repository.milestones").length > 0) {
|
|
}
|
|
if ($(".repository.new.milestone").length > 0) {
|
|
var $datepicker = $(".milestone.datepicker");
|
|
$datepicker.datetimepicker({
|
|
lang: $datepicker.data("lang"),
|
|
inline: true,
|
|
timepicker: false,
|
|
startDate: $datepicker.data("start-date"),
|
|
formatDate: "Y-m-d",
|
|
onSelectDate: function(ct) {
|
|
$("#deadline").val(ct.dateFormat("Y-m-d"));
|
|
}
|
|
});
|
|
$("#clear-date").click(function() {
|
|
$("#deadline").val("");
|
|
return false;
|
|
});
|
|
}
|
|
|
|
// Issues
|
|
if ($(".repository.view.issue").length > 0) {
|
|
// Edit issue title
|
|
var $issueTitle = $("#issue-title");
|
|
var $editInput = $("#edit-title-input").find("input");
|
|
var editTitleToggle = function() {
|
|
$issueTitle.toggle();
|
|
$(".not-in-edit").toggle();
|
|
$("#edit-title-input").toggle();
|
|
$(".in-edit").toggle();
|
|
$editInput.focus();
|
|
return false;
|
|
};
|
|
$("#edit-title").click(editTitleToggle);
|
|
$("#cancel-edit-title").click(editTitleToggle);
|
|
$("#save-edit-title")
|
|
.click(editTitleToggle)
|
|
.click(function() {
|
|
if (
|
|
$editInput.val().length == 0 ||
|
|
$editInput.val() == $issueTitle.text()
|
|
) {
|
|
$editInput.val($issueTitle.text());
|
|
return false;
|
|
}
|
|
|
|
$.post(
|
|
$(this).data("update-url"),
|
|
{
|
|
_csrf: csrf,
|
|
title: $editInput.val()
|
|
},
|
|
function(data) {
|
|
$editInput.val(data.title);
|
|
$issueTitle.text(data.title);
|
|
}
|
|
);
|
|
return false;
|
|
});
|
|
|
|
// Edit issue or comment content
|
|
$(".edit-content").click(function() {
|
|
var $segment = $(this)
|
|
.parent()
|
|
.parent()
|
|
.parent()
|
|
.next();
|
|
var $editContentZone = $segment.find(".edit-content-zone");
|
|
var $renderContent = $segment.find(".render-content");
|
|
var $rawContent = $segment.find(".raw-content");
|
|
var $textarea;
|
|
|
|
// Setup new form
|
|
if ($editContentZone.html().length == 0) {
|
|
$editContentZone.html($("#edit-content-form").html());
|
|
$textarea = $segment.find("textarea");
|
|
|
|
// Give new write/preview data-tab name to distinguish from others
|
|
var $editContentForm = $editContentZone.find(".ui.comment.form");
|
|
var $tabMenu = $editContentForm.find(".tabular.menu");
|
|
$tabMenu.attr("data-write", $editContentZone.data("write"));
|
|
$tabMenu.attr("data-preview", $editContentZone.data("preview"));
|
|
$tabMenu
|
|
.find(".write.item")
|
|
.attr("data-tab", $editContentZone.data("write"));
|
|
$tabMenu
|
|
.find(".preview.item")
|
|
.attr("data-tab", $editContentZone.data("preview"));
|
|
$editContentForm
|
|
.find(".write.segment")
|
|
.attr("data-tab", $editContentZone.data("write"));
|
|
$editContentForm
|
|
.find(".preview.segment")
|
|
.attr("data-tab", $editContentZone.data("preview"));
|
|
|
|
initCommentPreviewTab($editContentForm);
|
|
|
|
$editContentZone.find(".cancel.button").click(function() {
|
|
$renderContent.show();
|
|
$editContentZone.hide();
|
|
});
|
|
$editContentZone.find(".save.button").click(function() {
|
|
$renderContent.show();
|
|
$editContentZone.hide();
|
|
|
|
$.post(
|
|
$editContentZone.data("update-url"),
|
|
{
|
|
_csrf: csrf,
|
|
content: $textarea.val(),
|
|
context: $editContentZone.data("context")
|
|
},
|
|
function(data) {
|
|
if (data.length == 0) {
|
|
$renderContent.html($("#no-content").html());
|
|
} else {
|
|
$renderContent.html(data.content);
|
|
emojify.run($renderContent[0]);
|
|
$("pre code", $renderContent[0]).each(function(i, block) {
|
|
hljs.highlightBlock(block);
|
|
});
|
|
}
|
|
}
|
|
);
|
|
});
|
|
} else {
|
|
$textarea = $segment.find("textarea");
|
|
}
|
|
|
|
// Show write/preview tab and copy raw content as needed
|
|
$editContentZone.show();
|
|
$renderContent.hide();
|
|
if ($textarea.val().length == 0) {
|
|
$textarea.val($rawContent.text());
|
|
}
|
|
$textarea.focus();
|
|
return false;
|
|
});
|
|
|
|
// Delete comment
|
|
$(".delete-comment").click(function() {
|
|
var $this = $(this);
|
|
if (confirm($this.data("locale"))) {
|
|
$.post($this.data("url"), {
|
|
_csrf: csrf
|
|
}).done(function() {
|
|
$("#" + $this.data("comment-id")).remove();
|
|
});
|
|
}
|
|
return false;
|
|
});
|
|
|
|
// Change status
|
|
var $statusButton = $("#status-button");
|
|
$("#comment-form .edit_area").keyup(function() {
|
|
if ($(this).val().length == 0) {
|
|
$statusButton.text($statusButton.data("status"));
|
|
} else {
|
|
$statusButton.text($statusButton.data("status-and-comment"));
|
|
}
|
|
});
|
|
$statusButton.click(function() {
|
|
$("#status").val($statusButton.data("status-val"));
|
|
$("#comment-form").submit();
|
|
});
|
|
}
|
|
|
|
// Diff
|
|
if ($(".repository.diff").length > 0) {
|
|
var $counter = $(".diff-counter");
|
|
if ($counter.length >= 1) {
|
|
$counter.each(function(i, item) {
|
|
var $item = $(item);
|
|
var addLine = $item.find("span[data-line].add").data("line");
|
|
var delLine = $item.find("span[data-line].del").data("line");
|
|
var addPercent =
|
|
(parseFloat(addLine) / (parseFloat(addLine) + parseFloat(delLine))) *
|
|
100;
|
|
$item.find(".bar .add").css("width", addPercent + "%");
|
|
});
|
|
}
|
|
|
|
$(".diff-file-box .lines-num").click(function() {
|
|
if ($(this).attr("id")) {
|
|
window.location.href = "#" + $(this).attr("id");
|
|
}
|
|
});
|
|
|
|
$(window)
|
|
.on("hashchange", function(e) {
|
|
$(".diff-file-box .lines-code.active").removeClass("active");
|
|
var m = window.location.hash.match(/^#diff-.+$/);
|
|
if (m) {
|
|
$(m[0])
|
|
.siblings(".lines-code")
|
|
.addClass("active");
|
|
}
|
|
})
|
|
.trigger("hashchange");
|
|
}
|
|
|
|
// Quick start and repository home
|
|
$("#repo-clone-ssh").click(function() {
|
|
$(".clone-url").text($(this).data("link"));
|
|
$("#repo-clone-url").val($(this).data("link"));
|
|
$(this).addClass("blue");
|
|
$("#repo-clone-https").removeClass("blue");
|
|
localStorage.setItem("repo-clone-protocol", "ssh");
|
|
});
|
|
$("#repo-clone-https").click(function() {
|
|
$(".clone-url").text($(this).data("link"));
|
|
$("#repo-clone-url").val($(this).data("link"));
|
|
$(this).addClass("blue");
|
|
$("#repo-clone-ssh").removeClass("blue");
|
|
localStorage.setItem("repo-clone-protocol", "https");
|
|
});
|
|
$("#repo-clone-url").click(function() {
|
|
$(this).select();
|
|
});
|
|
|
|
// Pull request
|
|
if ($(".repository.compare.pull").length > 0) {
|
|
initFilterSearchDropdown(".choose.branch .dropdown");
|
|
}
|
|
if ($(".repository.view.pull").length > 0) {
|
|
$(".comment.merge.box input[name=merge_style]").change(function() {
|
|
if ($(this).val() === "create_merge_commit") {
|
|
$(".commit.description.field").show();
|
|
} else {
|
|
$(".commit.description.field").hide();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
function initWikiForm() {
|
|
var $editArea = $(".repository.wiki textarea#edit_area");
|
|
if ($editArea.length > 0) {
|
|
new SimpleMDE({
|
|
autoDownloadFontAwesome: false,
|
|
element: $editArea[0],
|
|
forceSync: true,
|
|
previewRender: function(plainText, preview) {
|
|
// Async method
|
|
setTimeout(function() {
|
|
// FIXME: still send render request when return back to edit mode
|
|
$.post(
|
|
$editArea.data("url"),
|
|
{
|
|
_csrf: csrf,
|
|
mode: "gfm",
|
|
context: $editArea.data("context"),
|
|
text: plainText
|
|
},
|
|
function(data) {
|
|
preview.innerHTML = '<div class="markdown">' + data + "</div>";
|
|
emojify.run($(".editor-preview")[0]);
|
|
}
|
|
);
|
|
}, 0);
|
|
|
|
return "Loading...";
|
|
},
|
|
renderingConfig: {
|
|
singleLineBreaks: false
|
|
},
|
|
indentWithTabs: false,
|
|
tabSize: 4,
|
|
spellChecker: false,
|
|
toolbar: [
|
|
"bold",
|
|
"italic",
|
|
"strikethrough",
|
|
"|",
|
|
"heading-1",
|
|
"heading-2",
|
|
"heading-3",
|
|
"heading-bigger",
|
|
"heading-smaller",
|
|
"|",
|
|
"code",
|
|
"quote",
|
|
"|",
|
|
"unordered-list",
|
|
"ordered-list",
|
|
"|",
|
|
"link",
|
|
"image",
|
|
"table",
|
|
"horizontal-rule",
|
|
"|",
|
|
"clean-block",
|
|
"preview",
|
|
"fullscreen"
|
|
]
|
|
});
|
|
}
|
|
}
|
|
|
|
var simpleMDEditor;
|
|
var codeMirrorEditor;
|
|
|
|
// For IE
|
|
String.prototype.endsWith = function(pattern) {
|
|
var d = this.length - pattern.length;
|
|
return d >= 0 && this.lastIndexOf(pattern) === d;
|
|
};
|
|
|
|
// Adding function to get the cursor position in a text field to jQuery object.
|
|
(function($, undefined) {
|
|
$.fn.getCursorPosition = function() {
|
|
var el = $(this).get(0);
|
|
var pos = 0;
|
|
if ("selectionStart" in el) {
|
|
pos = el.selectionStart;
|
|
} else if ("selection" in document) {
|
|
el.focus();
|
|
var Sel = document.selection.createRange();
|
|
var SelLength = document.selection.createRange().text.length;
|
|
Sel.moveStart("character", -el.value.length);
|
|
pos = Sel.text.length - SelLength;
|
|
}
|
|
return pos;
|
|
};
|
|
})(jQuery);
|
|
|
|
function setSimpleMDE($editArea) {
|
|
if (codeMirrorEditor) {
|
|
codeMirrorEditor.toTextArea();
|
|
codeMirrorEditor = null;
|
|
}
|
|
|
|
if (simpleMDEditor) {
|
|
return true;
|
|
}
|
|
|
|
simpleMDEditor = new SimpleMDE({
|
|
autoDownloadFontAwesome: false,
|
|
element: $editArea[0],
|
|
forceSync: true,
|
|
renderingConfig: {
|
|
singleLineBreaks: false
|
|
},
|
|
indentWithTabs: false,
|
|
tabSize: 4,
|
|
spellChecker: false,
|
|
previewRender: function(plainText, preview) {
|
|
// Async method
|
|
setTimeout(function() {
|
|
// FIXME: still send render request when return back to edit mode
|
|
$.post(
|
|
$editArea.data("url"),
|
|
{
|
|
_csrf: csrf,
|
|
mode: "gfm",
|
|
context: $editArea.data("context"),
|
|
text: plainText
|
|
},
|
|
function(data) {
|
|
preview.innerHTML = '<div class="markdown">' + data + "</div>";
|
|
emojify.run($(".editor-preview")[0]);
|
|
}
|
|
);
|
|
}, 0);
|
|
|
|
return "Loading...";
|
|
},
|
|
toolbar: [
|
|
"bold",
|
|
"italic",
|
|
"strikethrough",
|
|
"|",
|
|
"heading-1",
|
|
"heading-2",
|
|
"heading-3",
|
|
"heading-bigger",
|
|
"heading-smaller",
|
|
"|",
|
|
"code",
|
|
"quote",
|
|
"|",
|
|
"unordered-list",
|
|
"ordered-list",
|
|
"|",
|
|
"link",
|
|
"image",
|
|
"table",
|
|
"horizontal-rule",
|
|
"|",
|
|
"clean-block"
|
|
]
|
|
});
|
|
|
|
return true;
|
|
}
|
|
|
|
function setCodeMirror($editArea) {
|
|
if (simpleMDEditor) {
|
|
simpleMDEditor.toTextArea();
|
|
simpleMDEditor = null;
|
|
}
|
|
|
|
if (codeMirrorEditor) {
|
|
return true;
|
|
}
|
|
|
|
codeMirrorEditor = CodeMirror.fromTextArea($editArea[0], {
|
|
lineNumbers: true
|
|
});
|
|
codeMirrorEditor.on("change", function(cm, change) {
|
|
$editArea.val(cm.getValue());
|
|
});
|
|
|
|
return true;
|
|
}
|
|
|
|
function initEditor() {
|
|
$(".js-quick-pull-choice-option").change(function() {
|
|
if ($(this).val() == "commit-to-new-branch") {
|
|
$(".quick-pull-branch-name").show();
|
|
$(".quick-pull-branch-name input").prop("required", true);
|
|
} else {
|
|
$(".quick-pull-branch-name").hide();
|
|
$(".quick-pull-branch-name input").prop("required", false);
|
|
}
|
|
});
|
|
|
|
var $editFilename = $("#file-name");
|
|
$editFilename
|
|
.keyup(function(e) {
|
|
var $section = $(".breadcrumb span.section");
|
|
var $divider = $(".breadcrumb div.divider");
|
|
if (e.keyCode == 8) {
|
|
if ($(this).getCursorPosition() == 0) {
|
|
if ($section.length > 0) {
|
|
var value = $section
|
|
.last()
|
|
.find("a")
|
|
.text();
|
|
$(this).val(value + $(this).val());
|
|
$(this)[0].setSelectionRange(value.length, value.length);
|
|
$section.last().remove();
|
|
$divider.last().remove();
|
|
}
|
|
}
|
|
}
|
|
if (e.keyCode == 191) {
|
|
var parts = $(this)
|
|
.val()
|
|
.split("/");
|
|
for (var i = 0; i < parts.length; ++i) {
|
|
var value = parts[i];
|
|
if (i < parts.length - 1) {
|
|
if (value.length) {
|
|
$(
|
|
'<span class="section"><a href="#">' + value + "</a></span>"
|
|
).insertBefore($(this));
|
|
$('<div class="divider"> / </div>').insertBefore($(this));
|
|
}
|
|
} else {
|
|
$(this).val(value);
|
|
}
|
|
$(this)[0].setSelectionRange(0, 0);
|
|
}
|
|
}
|
|
var parts = [];
|
|
$(".breadcrumb span.section").each(function(i, element) {
|
|
element = $(element);
|
|
if (element.find("a").length) {
|
|
parts.push(element.find("a").text());
|
|
} else {
|
|
parts.push(element.text());
|
|
}
|
|
});
|
|
if ($(this).val()) {
|
|
parts.push($(this).val());
|
|
}
|
|
|
|
var tree_path = parts.join("/");
|
|
$("#tree_path").val(tree_path);
|
|
$("#preview-tab").data(
|
|
"context",
|
|
$("#preview-tab").data("root-context") +
|
|
tree_path.substring(0, tree_path.lastIndexOf("/") + 1)
|
|
);
|
|
})
|
|
.trigger("keyup");
|
|
|
|
var $editArea = $(".repository.editor textarea#edit_area");
|
|
if (!$editArea.length) return;
|
|
|
|
var markdownFileExts = $editArea.data("markdown-file-exts").split(",");
|
|
var lineWrapExtensions = $editArea.data("line-wrap-extensions").split(",");
|
|
|
|
$editFilename
|
|
.on("keyup", function(e) {
|
|
var val = $editFilename.val(),
|
|
m,
|
|
mode,
|
|
spec,
|
|
extension,
|
|
extWithDot,
|
|
previewLink,
|
|
dataUrl,
|
|
apiCall;
|
|
extension = extWithDot = "";
|
|
if ((m = /.+\.([^.]+)$/.exec(val))) {
|
|
extension = m[1].toLowerCase();
|
|
extWithDot = "." + extension;
|
|
}
|
|
|
|
var info = CodeMirror.findModeByExtension(extension);
|
|
previewLink = $("a[data-tab=preview]");
|
|
if (info) {
|
|
mode = info.mode;
|
|
spec = info.mime;
|
|
apiCall = mode;
|
|
} else {
|
|
apiCall = extension;
|
|
}
|
|
|
|
if (
|
|
previewLink.length &&
|
|
apiCall &&
|
|
previewFileModes &&
|
|
previewFileModes.length &&
|
|
previewFileModes.indexOf(apiCall) >= 0
|
|
) {
|
|
dataUrl = previewLink.data("url");
|
|
previewLink.data("url", dataUrl.replace(/(.*)\/.*/i, "$1/" + mode));
|
|
previewLink.show();
|
|
} else {
|
|
previewLink.hide();
|
|
}
|
|
|
|
// If this file is a Markdown extensions, we will load that editor and return
|
|
if (markdownFileExts.indexOf(extWithDot) >= 0) {
|
|
if (setSimpleMDE($editArea)) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Else we are going to use CodeMirror
|
|
if (!codeMirrorEditor && !setCodeMirror($editArea)) {
|
|
return;
|
|
}
|
|
|
|
if (mode) {
|
|
codeMirrorEditor.setOption("mode", spec);
|
|
CodeMirror.autoLoadMode(codeMirrorEditor, mode);
|
|
}
|
|
|
|
if (lineWrapExtensions.indexOf(extWithDot) >= 0) {
|
|
codeMirrorEditor.setOption("lineWrapping", true);
|
|
} else {
|
|
codeMirrorEditor.setOption("lineWrapping", false);
|
|
}
|
|
|
|
// get the filename without any folder
|
|
var value = $editFilename.val();
|
|
if (value.length === 0) {
|
|
return;
|
|
}
|
|
value = value.split("/");
|
|
value = value[value.length - 1];
|
|
|
|
$.getJSON($editFilename.data("ec-url-prefix") + value, function(
|
|
editorconfig
|
|
) {
|
|
if (editorconfig.indent_style === "tab") {
|
|
codeMirrorEditor.setOption("indentWithTabs", true);
|
|
codeMirrorEditor.setOption("extraKeys", {});
|
|
} else {
|
|
codeMirrorEditor.setOption("indentWithTabs", false);
|
|
// required because CodeMirror doesn't seems to use spaces correctly for {"indentWithTabs": false}:
|
|
// - https://github.com/codemirror/CodeMirror/issues/988
|
|
// - https://codemirror.net/doc/manual.html#keymaps
|
|
codeMirrorEditor.setOption("extraKeys", {
|
|
Tab: function(cm) {
|
|
var spaces = Array(parseInt(cm.getOption("indentUnit")) + 1).join(
|
|
" "
|
|
);
|
|
cm.replaceSelection(spaces);
|
|
}
|
|
});
|
|
}
|
|
codeMirrorEditor.setOption("indentUnit", editorconfig.indent_size || 4);
|
|
codeMirrorEditor.setOption("tabSize", editorconfig.tab_width || 4);
|
|
});
|
|
})
|
|
.trigger("keyup");
|
|
}
|
|
|
|
function initOrganization() {
|
|
if ($(".organization").length == 0) {
|
|
return;
|
|
}
|
|
|
|
// Options
|
|
if ($(".organization.settings.options").length > 0) {
|
|
$("#org_name").keyup(function() {
|
|
var $prompt = $("#org-name-change-prompt");
|
|
if (
|
|
$(this)
|
|
.val()
|
|
.toString()
|
|
.toLowerCase() !=
|
|
$(this)
|
|
.data("org-name")
|
|
.toString()
|
|
.toLowerCase()
|
|
) {
|
|
$prompt.show();
|
|
} else {
|
|
$prompt.hide();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
function initAdmin() {
|
|
if ($(".admin").length == 0) {
|
|
return;
|
|
}
|
|
|
|
// New user
|
|
if ($(".admin.new.user").length > 0 || $(".admin.edit.user").length > 0) {
|
|
$("#login_type").change(function() {
|
|
if (
|
|
$(this)
|
|
.val()
|
|
.substring(0, 1) == "0"
|
|
) {
|
|
$("#login_name").removeAttr("required");
|
|
$(".non-local").hide();
|
|
$(".local").show();
|
|
$("#user_name").focus();
|
|
|
|
if ($(this).data("password") == "required") {
|
|
$("#password").attr("required", "required");
|
|
}
|
|
} else {
|
|
$("#login_name").attr("required", "required");
|
|
$(".non-local").show();
|
|
$(".local").hide();
|
|
$("#login_name").focus();
|
|
|
|
$("#password").removeAttr("required");
|
|
}
|
|
});
|
|
}
|
|
|
|
function onSecurityProtocolChange() {
|
|
if ($("#security_protocol").val() > 0) {
|
|
$(".has-tls").show();
|
|
} else {
|
|
$(".has-tls").hide();
|
|
}
|
|
}
|
|
|
|
// New authentication
|
|
if ($(".admin.new.authentication").length > 0) {
|
|
$("#auth_type").change(function() {
|
|
$(".ldap").hide();
|
|
$(".dldap").hide();
|
|
$(".smtp").hide();
|
|
$(".pam").hide();
|
|
$(".github").hide();
|
|
$(".has-tls").hide();
|
|
|
|
var authType = $(this).val();
|
|
switch (authType) {
|
|
case "2": // LDAP
|
|
$(".ldap").show();
|
|
break;
|
|
case "3": // SMTP
|
|
$(".smtp").show();
|
|
$(".has-tls").show();
|
|
break;
|
|
case "4": // PAM
|
|
$(".pam").show();
|
|
break;
|
|
case "5": // LDAP
|
|
$(".dldap").show();
|
|
break;
|
|
case "6": //GITHUB
|
|
$(".github").show();
|
|
$(".has-tls").show();
|
|
break;
|
|
}
|
|
|
|
if (authType == "2" || authType == "5") {
|
|
onSecurityProtocolChange();
|
|
}
|
|
});
|
|
$("#security_protocol").change(onSecurityProtocolChange);
|
|
}
|
|
// Edit authentication
|
|
if ($(".admin.edit.authentication").length > 0) {
|
|
var authType = $("#auth_type").val();
|
|
if (authType == "2" || authType == "5") {
|
|
$("#security_protocol").change(onSecurityProtocolChange);
|
|
}
|
|
}
|
|
|
|
// Notice
|
|
if ($(".admin.notice")) {
|
|
var $detailModal = $("#detail-modal");
|
|
|
|
// Attach view detail modals
|
|
$(".view-detail").click(function() {
|
|
$detailModal.find(".content p").text($(this).data("content"));
|
|
$detailModal.modal("show");
|
|
return false;
|
|
});
|
|
|
|
// Select actions
|
|
var $checkboxes = $(".select.table .ui.checkbox");
|
|
$(".select.action").click(function() {
|
|
switch ($(this).data("action")) {
|
|
case "select-all":
|
|
$checkboxes.checkbox("check");
|
|
break;
|
|
case "deselect-all":
|
|
$checkboxes.checkbox("uncheck");
|
|
break;
|
|
case "inverse":
|
|
$checkboxes.checkbox("toggle");
|
|
break;
|
|
}
|
|
});
|
|
$("#delete-selection").click(function() {
|
|
var $this = $(this);
|
|
$this.addClass("loading disabled");
|
|
var ids = [];
|
|
$checkboxes.each(function() {
|
|
if ($(this).checkbox("is checked")) {
|
|
ids.push($(this).data("id"));
|
|
}
|
|
});
|
|
$.post($this.data("link"), {
|
|
_csrf: csrf,
|
|
ids: ids
|
|
}).done(function() {
|
|
window.location.href = $this.data("redirect");
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
function buttonsClickOnEnter() {
|
|
$(".ui.button").keypress(function(e) {
|
|
if (e.keyCode == 13 || e.keyCode == 32)
|
|
// enter key or space bar
|
|
$(this).click();
|
|
});
|
|
}
|
|
|
|
function hideWhenLostFocus(body, parent) {
|
|
$(document).click(function(e) {
|
|
var target = e.target;
|
|
if (
|
|
!$(target).is(body) &&
|
|
!$(target)
|
|
.parents()
|
|
.is(parent)
|
|
) {
|
|
$(body).hide();
|
|
}
|
|
});
|
|
}
|
|
|
|
function searchUsers() {
|
|
if (!$("#search-user-box .results").length) {
|
|
return;
|
|
}
|
|
|
|
var $searchUserBox = $("#search-user-box");
|
|
var $results = $searchUserBox.find(".results");
|
|
$searchUserBox.keyup(function() {
|
|
var $this = $(this);
|
|
var keyword = $this.find("input").val();
|
|
if (keyword.length < 2) {
|
|
$results.hide();
|
|
return;
|
|
}
|
|
|
|
$.ajax({
|
|
url: suburl + "/api/v1/users/search?q=" + keyword,
|
|
dataType: "json",
|
|
success: function(response) {
|
|
var notEmpty = function(str) {
|
|
return str && str.length > 0;
|
|
};
|
|
|
|
$results.html("");
|
|
|
|
if (response.ok && response.data.length) {
|
|
var html = "";
|
|
$.each(response.data, function(i, item) {
|
|
html +=
|
|
'<div class="item"><img class="ui avatar image" src="' +
|
|
item.avatar_url +
|
|
'"><span class="username">' +
|
|
item.username +
|
|
"</span>";
|
|
if (notEmpty(item.full_name)) {
|
|
html += " (" + item.full_name + ")";
|
|
}
|
|
html += "</div>";
|
|
});
|
|
$results.html(html);
|
|
$this.find(".results .item").click(function() {
|
|
$this.find("input").val(
|
|
$(this)
|
|
.find(".username")
|
|
.text()
|
|
);
|
|
$results.hide();
|
|
});
|
|
$results.show();
|
|
} else {
|
|
$results.hide();
|
|
}
|
|
}
|
|
});
|
|
});
|
|
$searchUserBox.find("input").focus(function() {
|
|
$searchUserBox.keyup();
|
|
});
|
|
hideWhenLostFocus("#search-user-box .results", "#search-user-box");
|
|
}
|
|
|
|
// FIXME: merge common parts in two functions
|
|
function searchRepositories() {
|
|
if (!$("#search-repo-box .results").length) {
|
|
return;
|
|
}
|
|
|
|
var $searchRepoBox = $("#search-repo-box");
|
|
var $results = $searchRepoBox.find(".results");
|
|
$searchRepoBox.keyup(function() {
|
|
var $this = $(this);
|
|
var keyword = $this.find("input").val();
|
|
if (keyword.length < 2) {
|
|
$results.hide();
|
|
return;
|
|
}
|
|
|
|
$.ajax({
|
|
url:
|
|
suburl +
|
|
"/api/v1/repos/search?q=" +
|
|
keyword +
|
|
"&uid=" +
|
|
$searchRepoBox.data("uid"),
|
|
dataType: "json",
|
|
success: function(response) {
|
|
var notEmpty = function(str) {
|
|
return str && str.length > 0;
|
|
};
|
|
|
|
$results.html("");
|
|
|
|
if (response.ok && response.data.length) {
|
|
var html = "";
|
|
$.each(response.data, function(i, item) {
|
|
html +=
|
|
'<div class="item"><i class="octicon octicon-repo"></i> <span class="fullname">' +
|
|
item.full_name +
|
|
"</span></div>";
|
|
});
|
|
$results.html(html);
|
|
$this.find(".results .item").click(function() {
|
|
$this.find("input").val(
|
|
$(this)
|
|
.find(".fullname")
|
|
.text()
|
|
.split("/")[1]
|
|
);
|
|
$results.hide();
|
|
});
|
|
$results.show();
|
|
} else {
|
|
$results.hide();
|
|
}
|
|
}
|
|
});
|
|
});
|
|
$searchRepoBox.find("input").focus(function() {
|
|
$searchRepoBox.keyup();
|
|
});
|
|
hideWhenLostFocus("#search-repo-box .results", "#search-repo-box");
|
|
}
|
|
|
|
function initCodeView() {
|
|
if ($(".code-view .linenums").length > 0) {
|
|
$(document).on("click", ".lines-num span", function(e) {
|
|
var $select = $(this);
|
|
var $list = $select
|
|
.parent()
|
|
.siblings(".lines-code")
|
|
.find("ol.linenums > li");
|
|
selectRange(
|
|
$list,
|
|
$list.filter("[rel=" + $select.attr("id") + "]"),
|
|
e.shiftKey ? $list.filter(".active").eq(0) : null
|
|
);
|
|
deSelect();
|
|
});
|
|
|
|
$(window)
|
|
.on("hashchange", function(e) {
|
|
var m = window.location.hash.match(/^#(L\d+)\-(L\d+)$/);
|
|
var $list = $(".code-view ol.linenums > li");
|
|
var $first;
|
|
if (m) {
|
|
$first = $list.filter("." + m[1]);
|
|
selectRange($list, $first, $list.filter("." + m[2]));
|
|
$("html, body").scrollTop($first.offset().top - 200);
|
|
return;
|
|
}
|
|
m = window.location.hash.match(/^#(L\d+)$/);
|
|
if (m) {
|
|
$first = $list.filter("." + m[1]);
|
|
selectRange($list, $first);
|
|
$("html, body").scrollTop($first.offset().top - 200);
|
|
}
|
|
})
|
|
.trigger("hashchange");
|
|
}
|
|
}
|
|
|
|
function initUserSettings() {
|
|
console.log("initUserSettings");
|
|
|
|
// Options
|
|
if ($(".user.settings.profile").length > 0) {
|
|
$("#username").keyup(function() {
|
|
var $prompt = $("#name-change-prompt");
|
|
if (
|
|
$(this)
|
|
.val()
|
|
.toString()
|
|
.toLowerCase() !=
|
|
$(this)
|
|
.data("name")
|
|
.toString()
|
|
.toLowerCase()
|
|
) {
|
|
$prompt.show();
|
|
} else {
|
|
$prompt.hide();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
function initRepositoryCollaboration() {
|
|
console.log("initRepositoryCollaboration");
|
|
|
|
// Change collaborator access mode
|
|
$(".access-mode.menu .item").click(function() {
|
|
var $menu = $(this).parent();
|
|
$.post($menu.data("url"), {
|
|
_csrf: csrf,
|
|
uid: $menu.data("uid"),
|
|
mode: $(this).data("value")
|
|
});
|
|
});
|
|
}
|
|
|
|
function initWebhookSettings() {
|
|
$(".events.checkbox input").change(function() {
|
|
if ($(this).is(":checked")) {
|
|
$(".events.fields").show();
|
|
}
|
|
});
|
|
$(".non-events.checkbox input").change(function() {
|
|
if ($(this).is(":checked")) {
|
|
$(".events.fields").hide();
|
|
}
|
|
});
|
|
|
|
// Highlight payload on first click
|
|
$(".hook.history.list .toggle.button").click(function() {
|
|
$($(this).data("target") + " .nohighlight").each(function() {
|
|
var $this = $(this);
|
|
$this.removeClass("nohighlight");
|
|
setTimeout(function() {
|
|
hljs.highlightBlock($this[0]);
|
|
}, 500);
|
|
});
|
|
});
|
|
|
|
// Trigger delivery
|
|
$(".delivery.button, .redelivery.button").click(function() {
|
|
var $this = $(this);
|
|
$this.addClass("loading disabled");
|
|
$.post($this.data("link"), {
|
|
_csrf: csrf
|
|
}).done(
|
|
setTimeout(function() {
|
|
window.location.href = $this.data("redirect");
|
|
}, 5000)
|
|
);
|
|
});
|
|
}
|
|
|
|
$(document).ready(function() {
|
|
csrf = $("meta[name=_csrf]").attr("content");
|
|
suburl = $("meta[name=_suburl]").attr("content");
|
|
|
|
// Set cursor to the end of autofocus input string
|
|
$("input[autofocus]").each(function() {
|
|
$(this).val($(this).val());
|
|
});
|
|
|
|
// Show exact time
|
|
$(".time-since").each(function() {
|
|
$(this)
|
|
.addClass("poping up")
|
|
.attr("data-content", $(this).attr("title"))
|
|
.attr("data-variation", "inverted tiny")
|
|
.attr("title", "");
|
|
});
|
|
|
|
// Semantic UI modules.
|
|
$(".ui.dropdown").dropdown({
|
|
forceSelection: false
|
|
});
|
|
$(".jump.dropdown").dropdown({
|
|
action: "select",
|
|
onShow: function() {
|
|
$(".poping.up").popup("hide");
|
|
}
|
|
});
|
|
$(".slide.up.dropdown").dropdown({
|
|
transition: "slide up"
|
|
});
|
|
$(".upward.dropdown").dropdown({
|
|
direction: "upward"
|
|
});
|
|
$(".ui.accordion").accordion();
|
|
$(".ui.checkbox").checkbox();
|
|
$(".ui.progress").progress({
|
|
showActivity: false
|
|
});
|
|
$(".poping.up").popup();
|
|
$(".top.menu .poping.up").popup({
|
|
onShow: function() {
|
|
if ($(".top.menu .menu.transition").hasClass("visible")) {
|
|
return false;
|
|
}
|
|
}
|
|
});
|
|
$(".tabular.menu .item").tab();
|
|
$(".tabable.menu .item").tab();
|
|
|
|
$(".toggle.button").click(function() {
|
|
$($(this).data("target")).slideToggle(100);
|
|
});
|
|
|
|
// Dropzone
|
|
var $dropzone = $("#dropzone");
|
|
if ($dropzone.length > 0) {
|
|
var filenameDict = {};
|
|
$dropzone.dropzone({
|
|
url: $dropzone.data("upload-url"),
|
|
headers: { "X-CSRF-Token": csrf },
|
|
maxFiles: $dropzone.data("max-file"),
|
|
maxFilesize: $dropzone.data("max-size"),
|
|
acceptedFiles:
|
|
$dropzone.data("accepts") === "*/*" ? null : $dropzone.data("accepts"),
|
|
addRemoveLinks: true,
|
|
dictDefaultMessage: $dropzone.data("default-message"),
|
|
dictInvalidFileType: $dropzone.data("invalid-input-type"),
|
|
dictFileTooBig: $dropzone.data("file-too-big"),
|
|
dictRemoveFile: $dropzone.data("remove-file"),
|
|
init: function() {
|
|
this.on("success", function(file, data) {
|
|
filenameDict[file.name] = data.uuid;
|
|
var input = $(
|
|
'<input id="' + data.uuid + '" name="files" type="hidden">'
|
|
).val(data.uuid);
|
|
$(".files").append(input);
|
|
});
|
|
this.on("removedfile", function(file) {
|
|
if (file.name in filenameDict) {
|
|
$("#" + filenameDict[file.name]).remove();
|
|
}
|
|
if ($dropzone.data("remove-url") && $dropzone.data("csrf")) {
|
|
$.post($dropzone.data("remove-url"), {
|
|
file: filenameDict[file.name],
|
|
_csrf: $dropzone.data("csrf")
|
|
});
|
|
}
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
// Emojify
|
|
emojify.setConfig({
|
|
img_dir: suburl + "/img/emoji",
|
|
ignore_emoticons: true
|
|
});
|
|
var hasEmoji = document.getElementsByClassName("has-emoji");
|
|
for (var i = 0; i < hasEmoji.length; i++) {
|
|
emojify.run(hasEmoji[i]);
|
|
}
|
|
|
|
// Clipboard JS
|
|
var clipboard = new ClipboardJS(".clipboard");
|
|
clipboard.on("success", function(e) {
|
|
e.clearSelection();
|
|
|
|
$("#" + e.trigger.getAttribute("id")).popup("destroy");
|
|
e.trigger.setAttribute(
|
|
"data-content",
|
|
e.trigger.getAttribute("data-success")
|
|
);
|
|
$("#" + e.trigger.getAttribute("id")).popup("show");
|
|
e.trigger.setAttribute(
|
|
"data-content",
|
|
e.trigger.getAttribute("data-original")
|
|
);
|
|
});
|
|
|
|
clipboard.on("error", function(e) {
|
|
$("#" + e.trigger.getAttribute("id")).popup("destroy");
|
|
e.trigger.setAttribute(
|
|
"data-content",
|
|
e.trigger.getAttribute("data-error")
|
|
);
|
|
$("#" + e.trigger.getAttribute("id")).popup("show");
|
|
e.trigger.setAttribute(
|
|
"data-content",
|
|
e.trigger.getAttribute("data-original")
|
|
);
|
|
});
|
|
|
|
// Autosize
|
|
if ($("#description.autosize").length > 0) {
|
|
autosize($("#description"));
|
|
showMessageMaxLength(512, "description", "descLength");
|
|
}
|
|
|
|
// AJAX load buttons
|
|
$(".ajax-load-button").click(function() {
|
|
var $this = $(this);
|
|
$this.addClass("disabled");
|
|
|
|
$.ajax({
|
|
url: $this.data("url"),
|
|
headers: {
|
|
"X-AJAX": "true"
|
|
}
|
|
}).done(function(data, status, request) {
|
|
$(data).insertBefore($this);
|
|
|
|
// Update new URL or remove self if no more feeds
|
|
var url = request.getResponseHeader("X-AJAX-URL");
|
|
if (url) {
|
|
$this.data("url", url);
|
|
$this.removeClass("disabled");
|
|
} else {
|
|
$this.remove();
|
|
}
|
|
});
|
|
});
|
|
|
|
// Helpers
|
|
$(".delete-button").click(function() {
|
|
var $this = $(this);
|
|
$(".delete.modal")
|
|
.modal({
|
|
closable: false,
|
|
onApprove: function() {
|
|
if ($this.data("type") == "form") {
|
|
$($this.data("form")).submit();
|
|
return;
|
|
}
|
|
|
|
$.post($this.data("url"), {
|
|
_csrf: csrf,
|
|
id: $this.data("id")
|
|
}).done(function(data) {
|
|
window.location.href = data.redirect;
|
|
});
|
|
}
|
|
})
|
|
.modal("show");
|
|
return false;
|
|
});
|
|
$(".show-panel.button").click(function() {
|
|
$($(this).data("panel")).show();
|
|
});
|
|
$(".show-modal.button").click(function() {
|
|
$($(this).data("modal")).modal("show");
|
|
});
|
|
$(".delete-post.button").click(function() {
|
|
var $this = $(this);
|
|
$.post($this.data("request-url"), {
|
|
_csrf: csrf
|
|
}).done(function() {
|
|
window.location.href = $this.data("done-url");
|
|
});
|
|
});
|
|
// To make arbitrary form element to behave like a submit button
|
|
$(".submit-button").click(function() {
|
|
$($(this).data("form")).submit();
|
|
});
|
|
|
|
// Check or select on option to enable/disable target region
|
|
$(".enable-system").change(function() {
|
|
if (this.checked) {
|
|
$($(this).data("target")).removeClass("disabled");
|
|
} else {
|
|
$($(this).data("target")).addClass("disabled");
|
|
$($(this).data("uncheck")).prop("checked", false);
|
|
}
|
|
});
|
|
$(".enable-system-radio").change(function() {
|
|
$($(this).data("enable")).removeClass("disabled");
|
|
$($(this).data("disable")).addClass("disabled");
|
|
$($(this).data("uncheck")).prop("checked", false);
|
|
});
|
|
|
|
// Set anchor.
|
|
$(".markdown").each(function() {
|
|
var headers = {};
|
|
$(this)
|
|
.find("h1, h2, h3, h4, h5, h6")
|
|
.each(function() {
|
|
var node = $(this);
|
|
var val = encodeURIComponent(
|
|
node
|
|
.text()
|
|
.toLowerCase()
|
|
.replace(/[^\u00C0-\u1FFF\u2C00-\uD7FF\w\- ]/g, "")
|
|
.replace(/[ ]/g, "-")
|
|
);
|
|
var name = val;
|
|
if (headers[val] > 0) {
|
|
name = val + "-" + headers[val];
|
|
}
|
|
if (headers[val] == undefined) {
|
|
headers[val] = 1;
|
|
} else {
|
|
headers[val] += 1;
|
|
}
|
|
node = node.wrap('<div id="' + name + '" class="anchor-wrap" ></div>');
|
|
node.append(
|
|
'<a class="anchor" href="#' +
|
|
name +
|
|
'"><span class="octicon octicon-link"></span></a>'
|
|
);
|
|
});
|
|
});
|
|
|
|
buttonsClickOnEnter();
|
|
searchUsers();
|
|
searchRepositories();
|
|
|
|
initCommentForm();
|
|
initRepository();
|
|
initWikiForm();
|
|
initEditForm();
|
|
initEditor();
|
|
initOrganization();
|
|
initAdmin();
|
|
initCodeView();
|
|
|
|
// Repo clone url.
|
|
if ($("#repo-clone-url").length > 0) {
|
|
switch (localStorage.getItem("repo-clone-protocol")) {
|
|
case "ssh":
|
|
if ($("#repo-clone-ssh").click().length === 0) {
|
|
$("#repo-clone-https").click();
|
|
}
|
|
break;
|
|
default:
|
|
$("#repo-clone-https").click();
|
|
break;
|
|
}
|
|
}
|
|
|
|
var routes = {
|
|
"div.user.settings": initUserSettings,
|
|
"div.repository.settings.collaboration": initRepositoryCollaboration,
|
|
"div.webhook.settings": initWebhookSettings
|
|
};
|
|
|
|
var selector;
|
|
for (selector in routes) {
|
|
if ($(selector).length > 0) {
|
|
routes[selector]();
|
|
break;
|
|
}
|
|
}
|
|
});
|
|
|
|
function changeHash(hash) {
|
|
if (history.pushState) {
|
|
history.pushState(null, null, hash);
|
|
} else {
|
|
location.hash = hash;
|
|
}
|
|
}
|
|
|
|
function deSelect() {
|
|
if (window.getSelection) {
|
|
window.getSelection().removeAllRanges();
|
|
} else {
|
|
document.selection.empty();
|
|
}
|
|
}
|
|
|
|
function selectRange($list, $select, $from) {
|
|
$list.removeClass("active");
|
|
if ($from) {
|
|
var a = parseInt($select.attr("rel").substr(1));
|
|
var b = parseInt($from.attr("rel").substr(1));
|
|
var c;
|
|
if (a != b) {
|
|
if (a > b) {
|
|
c = a;
|
|
a = b;
|
|
b = c;
|
|
}
|
|
var classes = [];
|
|
for (var i = a; i <= b; i++) {
|
|
classes.push(".L" + i);
|
|
}
|
|
$list.filter(classes.join(",")).addClass("active");
|
|
changeHash("#L" + a + "-" + "L" + b);
|
|
return;
|
|
}
|
|
}
|
|
$select.addClass("active");
|
|
changeHash("#" + $select.attr("rel"));
|
|
}
|
|
|
|
$(function() {
|
|
if ($(".user.signin").length > 0) return;
|
|
$("form").areYouSure();
|
|
});
|
|
|
|
// getByteLen counts bytes in a string's UTF-8 representation.
|
|
function getByteLen(normalVal) {
|
|
// Force string type
|
|
normalVal = String(normalVal);
|
|
|
|
var byteLen = 0;
|
|
for (var i = 0; i < normalVal.length; i++) {
|
|
var c = normalVal.charCodeAt(i);
|
|
byteLen +=
|
|
c < 1 << 7
|
|
? 1
|
|
: c < 1 << 11
|
|
? 2
|
|
: c < 1 << 16
|
|
? 3
|
|
: c < 1 << 21
|
|
? 4
|
|
: c < 1 << 26
|
|
? 5
|
|
: c < 1 << 31
|
|
? 6
|
|
: Number.NaN;
|
|
}
|
|
return byteLen;
|
|
}
|
|
|
|
function showMessageMaxLength(maxLen, textElemId, counterId) {
|
|
var $msg = $("#" + textElemId);
|
|
$("#" + counterId).html(maxLen - getByteLen($msg.val()));
|
|
|
|
var onMessageKey = function(e) {
|
|
var $msg = $(this);
|
|
var text = $msg.val();
|
|
var len = getByteLen(text);
|
|
var remainder = maxLen - len;
|
|
|
|
if (len >= maxLen) {
|
|
$msg.val($msg.val().substr(0, maxLen));
|
|
remainder = 0;
|
|
}
|
|
|
|
$("#" + counterId).html(remainder);
|
|
};
|
|
|
|
$msg.keyup(onMessageKey).keydown(onMessageKey);
|
|
}
|