Skip to content
Permalink
v0.12.10
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
1798 lines (1654 sloc) 46.7 KB
"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("&nbsp;");
});
$labelMenu.find(".item:not(.no-select)").click(function() {
if ($(this).hasClass("checked")) {
$(this).removeClass("checked");
$(this)
.find(".octicon")
.removeClass("octicon-check")
.html("&nbsp;");
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("&nbsp;");
});
$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();
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);
}