summaryrefslogtreecommitdiffstats
path: root/public/js/index.js
diff options
context:
space:
mode:
authorJoubert RedRat <me+github@redrat.com.br>2016-11-03 16:31:05 -0200
committerJoubert RedRat <me+github@redrat.com.br>2016-11-04 08:53:18 -0200
commitff54e4d929722eb28e053b25fd353ea869ec2f45 (patch)
tree9ecbf93cb841f435ba57d8530971335cbf0f8c3f /public/js/index.js
parentfc55182a4c7dc884e64db1a3e1ed045ac3f6bf9b (diff)
downloadgitea-ff54e4d929722eb28e053b25fd353ea869ec2f45.tar.gz
gitea-ff54e4d929722eb28e053b25fd353ea869ec2f45.zip
Set default less and css to new default name
Diffstat (limited to 'public/js/index.js')
-rw-r--r--public/js/index.js1453
1 files changed, 1453 insertions, 0 deletions
diff --git a/public/js/index.js b/public/js/index.js
new file mode 100644
index 0000000000..d7fca17423
--- /dev/null
+++ b/public/js/index.js
@@ -0,0 +1,1453 @@
+'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 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
+ });
+ }
+
+ $labelMenu.find('.item:not(.no-select)').click(function () {
+ if ($(this).hasClass('checked')) {
+ $(this).removeClass('checked');
+ $(this).find('.octicon').removeClass('octicon-check');
+ if (hasLabelUpdateAction) {
+ updateIssueMeta($labelMenu.data('update-url'), "detach", $(this).data('id'));
+ }
+ } else {
+ $(this).addClass('checked');
+ $(this).find('.octicon').addClass('octicon-check');
+ 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');
+ });
+
+ $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 initInstall() {
+ if ($('.install').length == 0) {
+ return;
+ }
+
+ // Database type change detection.
+ $("#db_type").change(function () {
+ var sqliteDefault = 'data/gogs.db';
+ var tidbDefault = 'data/gogs_tidb';
+
+ var dbType = $(this).val();
+ if (dbType === "SQLite3" || dbType === "TiDB") {
+ $('#sql_settings').hide();
+ $('#pgsql_settings').hide();
+ $('#sqlite_settings').show();
+
+ if (dbType === "SQLite3" && $('#db_path').val() == tidbDefault) {
+ $('#db_path').val(sqliteDefault);
+ } else if (dbType === "TiDB" && $('#db_path').val() == sqliteDefault) {
+ $('#db_path').val(tidbDefault);
+ }
+ return;
+ }
+
+ var mysqlDefault = '127.0.0.1:3306';
+ var postgresDefault = '127.0.0.1:5432';
+
+ $('#sqlite_settings').hide();
+ $('#sql_settings').show();
+ if (dbType === "PostgreSQL") {
+ $('#pgsql_settings').show();
+ if ($('#db_host').val() == mysqlDefault) {
+ $('#db_host').val(postgresDefault);
+ }
+ } else {
+ $('#pgsql_settings').hide();
+ if ($('#db_host').val() == postgresDefault) {
+ $('#db_host').val(mysqlDefault);
+ }
+ }
+ });
+
+ // TODO: better handling of exclusive relations.
+ $('#offline-mode input').change(function () {
+ if ($(this).is(':checked')) {
+ $('#disable-gravatar').checkbox('check');
+ $('#federated-avatar-lookup').checkbox('uncheck');
+ }
+ });
+ $('#disable-gravatar input').change(function () {
+ if ($(this).is(':checked')) {
+ $('#federated-avatar-lookup').checkbox('uncheck');
+ } else {
+ $('#offline-mode').checkbox('uncheck');
+ }
+ });
+ $('#federated-avatar-lookup input').change(function () {
+ if ($(this).is(':checked')) {
+ $('#disable-gravatar').checkbox('uncheck');
+ $('#offline-mode').checkbox('uncheck');
+ }
+ });
+ $('#disable-registration input').change(function () {
+ if ($(this).is(':checked')) {
+ $('#enable-captcha').checkbox('uncheck');
+ }
+ });
+ $('#enable-captcha input').change(function () {
+ if ($(this).is(':checked')) {
+ $('#disable-registration').checkbox('uncheck');
+ }
+ });
+}
+
+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();
+ }
+ });
+
+ // Enable or select internal/external wiki system and issue tracker.
+ $('.enable-system').change(function () {
+ if (this.checked) {
+ $($(this).data('target')).removeClass('disabled');
+ } else {
+ $($(this).data('target')).addClass('disabled');
+ }
+ });
+ $('.enable-system-radio').change(function () {
+ if (this.value == 'false') {
+ $($(this).data('target')).addClass('disabled');
+ } else if (this.value == 'true') {
+ $($(this).data('target')).removeClass('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 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
+ }).success(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 + "%");
+ });
+ }
+ }
+
+ // 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');
+ }
+}
+
+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 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", "preview", "fullscreen", "side-by-side"]
+ });
+
+ 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());
+ $('#tree_path').val(parts.join('/'));
+ }).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];
+ 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 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 initWebhook() {
+ if ($('.new.webhook').length == 0) {
+ return;
+ }
+
+ $('.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();
+ }
+ });
+
+ // Test delivery
+ $('#test-delivery').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)
+ )
+ });
+}
+
+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();
+ $('.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;
+ }
+
+ 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="icon 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');
+ }
+}
+
+$(document).ready(function () {
+ csrf = $('meta[name=_csrf]').attr("content");
+ suburl = $('meta[name=_suburl]').attr("content");
+
+ // 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.
+ $('.dropdown').dropdown();
+ $('.jump.dropdown').dropdown({
+ action: 'hide',
+ 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);
+ });
+
+ // Highlight JS
+ if (typeof hljs != 'undefined') {
+ hljs.initHighlightingOnLoad();
+ }
+
+ // Dropzone
+ var $dropzone = $('#dropzone');
+ if ($dropzone.length > 0) {
+ // Disable auto discover for all elements:
+ Dropzone.autoDiscover = false;
+
+ 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 Clipboard('.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'))
+ });
+
+ // 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');
+ });
+ });
+
+ // 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(/[^\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();
+ initInstall();
+ initRepository();
+ initWikiForm();
+ initEditForm();
+ initEditor();
+ initOrganization();
+ initWebhook();
+ 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
+ };
+
+ 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();
+});