diff options
author | Richard Mahn <richard_mahn@wycliffeassociates.org> | 2016-08-11 05:48:08 -0700 |
---|---|---|
committer | Unknwon <u@gogs.io> | 2016-08-14 23:52:24 -0700 |
commit | d0a0239bacf02eb004634dfe1bb0a3f7dfe5adb6 (patch) | |
tree | 8459045909d43af85df2afa34f785a0481ae0b9e /public/js | |
parent | 7e7613cdecf6ceaf97ac280ae98bb9541679963f (diff) | |
download | gitea-d0a0239bacf02eb004634dfe1bb0a3f7dfe5adb6.tar.gz gitea-d0a0239bacf02eb004634dfe1bb0a3f7dfe5adb6.zip |
Squashed commit of the following:
commit 0afcb843d7ffd596991c4885cab768273a6eb42c
Author: Richard Mahn <richard_mahn@wycliffeassociates.org>
Date: Sun Jul 31 17:13:29 2016 -0600
Removed Upload stats as the upload table is just a temporary table
commit 7ecd73ff5535612d79d471409173ee7f1fcfa157
Author: Richard Mahn <richard_mahn@wycliffeassociates.org>
Date: Sun Jul 31 08:42:41 2016 -0600
Fix for CodeMirror mode
commit c29b9ab531e2e7af0fb5db24dc17e51027dd1174
Author: Richard Mahn <richard_mahn@wycliffeassociates.org>
Date: Sun Jul 31 08:03:33 2016 -0600
Made tabbing in editor use spaces
commit 23af384c53206a8a40e11e45bf49d7a149c4adcd
Author: Richard Mahn <richard_mahn@wycliffeassociates.org>
Date: Sun Jul 31 07:56:46 2016 -0600
Fix for data-url
commit cfb8a97591cb6fc0a92e49563b7b764c524db0e9
Merge: 7fc8a89 991ce42
Author: Richard Mahn <richard_mahn@wycliffeassociates.org>
Date: Sun Jul 31 07:42:53 2016 -0600
Merge remote-tracking branch 'gogits/develop' into feature-create-and-edit-repo-file
Conflicts:
modules/bindata/bindata.go
public/js/gogs.js
commit 7fc8a89cb495478225b02d613e647f99a1489634
Merge: fd3d86c c03d040
Author: Richard Mahn <richard_mahn@wycliffeassociates.org>
Date: Sun Jul 31 07:40:00 2016 -0600
Merge branch 'feature-create-and-edit-repo-file' of github.com:richmahn/gogs into feature-create-and-edit-repo-file
commit fd3d86ca6bbc02cfda566a504ffd6b03db4f75ef
Author: Richard Mahn <richard_mahn@wycliffeassociates.org>
Date: Sun Jul 31 07:39:44 2016 -0600
Code cleanup
commit c03d0401c1049eeeccc32ab1f9c3303c130be5ee
Author: Richard Mahn <richard_mahn@wycliffeassociates.org>
Date: Fri Jul 29 15:38:23 2016 -0600
Code cleanup
commit 98e1206ccf9f9a4503c020e3a7830cf9f861dfae
Author: Richard Mahn <richard_mahn@wycliffeassociates.org>
Date: Thu Jul 28 18:36:01 2016 -0600
Code cleanup and fixes
commit c2895dc742f25f8412879c9fa15e18f27f42f194
Author: Richard Mahn <richard_mahn@wycliffeassociates.org>
Date: Thu Jul 28 18:24:04 2016 -0600
Fixes per Unknwon's requests
commit 6aa7e46b21ad4c96e562daa2eac26a8fb408f8ef
Merge: 889e9fa ad7ea88
Author: Richard Mahn <richard_mahn@wycliffeassociates.org>
Date: Thu Jul 28 17:13:43 2016 -0600
Merge remote-tracking branch 'gogits/develop' into feature-create-and-edit-repo-file
Conflicts:
modules/bindata/bindata.go
modules/setting/setting.go
commit 889e9faf1bd8559a4979c8f46005d488c1a234d4
Author: Richard Mahn <richard_mahn@wycliffeassociates.org>
Date: Fri Jul 22 14:09:18 2016 -0600
Fix in gogs.js
commit 47603edf223f147b114be65f3bd27bc1e88827a5
Merge: bb57912 cf85e9e
Author: Richard Mahn <richard_mahn@wycliffeassociates.org>
Date: Fri Jul 22 14:07:36 2016 -0600
Merge remote-tracking branch 'gogits/develop' into feature-create-and-edit-repo-file
Conflicts:
modules/bindata/bindata.go
public/js/gogs.js
commit bb5791255867a71c11a77b639db050ad09c597a4
Author: Richard Mahn <richard_mahn@wycliffeassociates.org>
Date: Fri Jul 22 14:02:18 2016 -0600
Update for using CodeMirror mode addon
commit d10d128c51039be19e2af9c66c63db66a9f2ec6d
Author: Richard Mahn <richard_mahn@wycliffeassociates.org>
Date: Tue Jul 19 16:12:57 2016 -0600
Update for Edit
commit 34a34982025144e3225e389f7849eb6273c1d576
Merge: fa1b752 1c7dcdd
Author: Richard Mahn <richard_mahn@wycliffeassociates.org>
Date: Tue Jul 19 11:52:02 2016 -0600
Merge remote-tracking branch 'gogits/develop' into feature-create-and-edit-repo-file
Conflicts:
modules/bindata/bindata.go
commit fa1b752be29cd455c5184ddac2ffe80b3489763e
Author: Richard Mahn <richard_mahn@wycliffeassociates.org>
Date: Fri Jul 15 18:35:42 2016 -0600
Feature for editing, creating, uploading and deleting files
Diffstat (limited to 'public/js')
-rw-r--r-- | public/js/gogs.js | 504 |
1 files changed, 423 insertions, 81 deletions
diff --git a/public/js/gogs.js b/public/js/gogs.js index c6a1b6b624..81425503ba 100644 --- a/public/js/gogs.js +++ b/public/js/gogs.js @@ -28,6 +28,61 @@ function initCommentPreviewTab($form) { buttonsClickOnEnter(); } +var previewTab; +var previewTabApis; + +function initEditPreviewTab($form) { + var $tab_menu = $form.find('.tabular.menu'); + $tab_menu.find('.item').tab(); + previewTab = $tab_menu.find('.item[data-tab="' + $tab_menu.data('preview') + '"]'); + + if (previewTab.length) { + previewTabApis = previewTab.data('preview-apis').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="' + $tab_menu.data('write') + '"] textarea').val() + }, + function (data) { + var $preview_tab = $form.find('.tab.segment[data-tab="' + $tab_menu.data('preview') + '"]'); + $preview_tab.html(data); + emojify.run($preview_tab[0]); + $('pre code', $preview_tab[0]).each(function (i, block) { + hljs.highlightBlock(block); + }); + } + ); + }); + } + + buttonsClickOnEnter(); +} + +function initEditDiffTab($form) { + var $tab_menu = $form.find('.tabular.menu'); + $tab_menu.find('.item').tab(); + $tab_menu.find('.item[data-tab="' + $tab_menu.data('diff') + '"]').click(function () { + var $this = $(this); + $.post($this.data('url'), { + "_csrf": csrf, + "context": $this.data('context'), + "content": $form.find('.tab.segment[data-tab="' + $tab_menu.data('write') + '"] textarea').val() + }, + function (data) { + var $diff_tab = $form.find('.tab.segment[data-tab="' + $tab_menu.data('diff') + '"]'); + $diff_tab.html(data); + emojify.run($diff_tab[0]); + initCodeView() + } + ); + }); + + buttonsClickOnEnter(); +} + function initCommentForm() { if ($('.comment.form').length == 0) { return @@ -145,6 +200,11 @@ function initCommentForm() { selectItem('.select-assignee', '#assignee_id'); } +function initEditForm() { + initEditPreviewTab($('.edit.form')); + initEditDiffTab($('.edit.form')); +} + function initInstall() { if ($('.install').length == 0) { return; @@ -450,7 +510,7 @@ function initRepository() { // Change status var $status_btn = $('#status-button'); - $('#content').keyup(function () { + $('#edit_area').keyup(function () { if ($(this).val().length == 0) { $status_btn.text($status_btn.data('status')) } else { @@ -516,15 +576,10 @@ function initRepositoryCollaboration() { }); } -function initWiki() { - if ($('.repository.wiki').length == 0) { - return; - } - - - if ($('.repository.wiki.new').length > 0) { - var $edit_area = $('#edit-area'); - var simplemde = new SimpleMDE({ +function initWikiForm() { + var $edit_area = $('.repository.wiki textarea#edit_area'); + if ($edit_area.length > 0) { + new SimpleMDE({ autoDownloadFontAwesome: false, element: $edit_area[0], forceSync: true, @@ -549,18 +604,284 @@ function initWiki() { renderingConfig: { singleLineBreaks: false }, - spellChecker: false, + indentWithTabs: false, tabSize: 4, + spellChecker: false, toolbar: ["bold", "italic", "strikethrough", "|", - "heading", "heading-1", "heading-2", "heading-3", "|", + "heading-1", "heading-2", "heading-3", "heading-bigger", "heading-smaller", "|", "code", "quote", "|", "unordered-list", "ordered-list", "|", - "link", "image", "horizontal-rule", "|", - "preview", "fullscreen"] + "link", "image", "table", "horizontal-rule", "|", + "clean-block", "preview", "fullscreen", "side-by-side"] }) } } +function initIssueForm() { + var $edit_area = $('.repository.issue textarea.edit_area'); + if ($edit_area.length > 0) { + $edit_area.each(function (i, edit_area) { + new SimpleMDE({ + autoDownloadFontAwesome: false, + element: edit_area[0], + forceSync: true, + previewRender: function (plainText, preview) { // Async method + setTimeout(function () { + // FIXME: still send render request when return back to edit mode + $.post($edit_area.data('url'), { + "_csrf": csrf, + "mode": "gfm", + "context": $edit_area.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", "|", + "code", "quote", "|", + "unordered-list", "ordered-list", "|", + "link", "image", "table"] + }) + }); + } +} + +var editArea; +var editFilename; +var smdEditor; +var cmEditor; +var mdFileExtensions; +var lineWrapExtensions; + +// 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 objects +(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 initEditor() { + editFilename = $("#file-name"); + editFilename.keyup(function (e) { + var sections = $('.breadcrumb span.section'); + var dividers = $('.breadcrumb div.divider'); + if (e.keyCode == 8) { + if ($(this).getCursorPosition() == 0) { + if (sections.length > 0) { + var value = sections.last().find('a').text(); + $(this).val(value + $(this).val()); + $(this)[0].setSelectionRange(value.length, value.length); + sections.last().remove(); + dividers.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-name').val(parts.join('/')); + }).trigger('keyup'); + + editArea = $('.repository.edit textarea#edit_area'); + + if (!editArea.length) + return; + + mdFileExtensions = editArea.data("md-file-extensions").split(","); + 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 && previewTabApis && previewTabApis.length && previewTabApis.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 (mdFileExtensions.indexOf(extWithDot) >= 0) { + if (setSimpleMDE()) { + return; + } + } + + // Else we are going to use CodeMirror + if (!cmEditor) { + if (!setCodeMirror()) + return; + } + + if (mode) { + cmEditor.setOption("mode", spec); + CodeMirror.autoLoadMode(cmEditor, mode); + } + + if (lineWrapExtensions.indexOf(extWithDot) >= 0) { + cmEditor.setOption("lineWrapping", true); + } + else { + cmEditor.setOption("lineWrapping", false); + } + }).trigger('keyup'); +} + +function setSimpleMDE() { + if (cmEditor) { + cmEditor.toTextArea(); + cmEditor = null; + } + + if (smdEditor) { + return true; + } + + smdEditor = 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() { + if (smdEditor) { + smdEditor.toTextArea(); + smdEditor = null; + } + + if (cmEditor) { + return true; + } + + cmEditor = CodeMirror.fromTextArea(editArea[0], { + lineNumbers: true + }); + cmEditor.on("change", function (cm, change) { + editArea.val(cm.getValue()); + }); + + return true; +} + +function initQuickPull() { + $('.js-quick-pull-choice-option').change(function () { + quickPullChoiceChange(); + }); + quickPullChoiceChange(); +} + +function quickPullChoiceChange() { + var radio = $('.js-quick-pull-choice-option:checked'); + if (radio.val() == 'commit-to-new-branch') + $('.quick-pull-branch-name').show(); + else + $('.quick-pull-branch-name').hide(); +} + function initOrganization() { if ($('.organization').length == 0) { return; @@ -867,6 +1188,37 @@ function searchRepositories() { 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'); + } +} + +var $dropz; + $(document).ready(function () { csrf = $('meta[name=_csrf]').attr("content"); suburl = $('meta[name=_suburl]').attr("content"); @@ -916,12 +1268,12 @@ $(document).ready(function () { } // Dropzone - if ($('#dropzone').length > 0) { + var $dropz = $('#dropzone'); + if ($dropz.length > 0) { // Disable auto discover for all elements: Dropzone.autoDiscover = false; var filenameDict = {}; - var $dropz = $('#dropzone'); $dropz.dropzone({ url: $dropz.data('upload-url'), headers: {"X-Csrf-Token": csrf}, @@ -936,12 +1288,16 @@ $(document).ready(function () { init: function () { this.on("success", function (file, data) { filenameDict[file.name] = data.uuid; - $('.attachments').append('<input id="' + data.uuid + '" name="attachments" type="hidden" value="' + 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 ($dropz.data('remove-url') && $dropz.data('csrf')) { + $.post($dropz.data('remove-url'), {file: filenameDict[file.name], _csrf: $dropz.data('csrf')}); + } }) } }); @@ -975,6 +1331,15 @@ $(document).ready(function () { e.trigger.setAttribute('data-content', e.trigger.getAttribute('data-original')) }); + // Clipboard for copying filename on edit page + if ($('.clipboard-tree-name').length) { + new Clipboard(document.querySelector('.clipboard-tree-name'), { + text: function () { + return $('#tree-name').val(); + } + }); + } + // Helpers. $('.delete-button').click(function () { var $this = $(this); @@ -1038,10 +1403,14 @@ $(document).ready(function () { initCommentForm(); initInstall(); initRepository(); - initWiki(); + initWikiForm(); + initIssueForm(); + initEditForm(); + initEditor(); initOrganization(); initWebhook(); initAdmin(); + initQuickPull(); var routes = { 'div.user.settings': initUserSettings, @@ -1057,76 +1426,50 @@ $(document).ready(function () { } }); -$(window).load(function () { - function changeHash(hash) { - if (history.pushState) { - history.pushState(null, null, hash); - } - else { - location.hash = hash; - } +function changeHash(hash) { + if (history.pushState) { + history.pushState(null, null, hash); } - - function deSelect() { - if (window.getSelection) { - window.getSelection().removeAllRanges(); - } else { - document.selection.empty(); - } + else { + location.hash = hash; } +} - 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 deSelect() { + if (window.getSelection) { + window.getSelection().removeAllRanges(); + } else { + document.selection.empty(); } +} - // Code view. - 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; +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; } - m = window.location.hash.match(/^#(L\d+)$/); - if (m) { - $first = $list.filter('.' + m[1]); - selectRange($list, $first); - $("html, body").scrollTop($first.offset().top - 200); + var classes = []; + for (var i = a; i <= b; i++) { + classes.push('.L' + i); } - }).trigger('hashchange'); + $list.filter(classes.join(',')).addClass('active'); + changeHash('#L' + a + '-' + 'L' + b); + return + } } + $select.addClass('active'); + changeHash('#' + $select.attr('rel')); +} + +$(window).load(function () { + initCodeView(); // Repo clone url. if ($('#repo-clone-url').length > 0) { @@ -1135,7 +1478,6 @@ $(window).load(function () { if ($('#repo-clone-ssh').click().length === 0) { $('#repo-clone-https').click(); } - ; break; default: $('#repo-clone-https').click(); |