summaryrefslogtreecommitdiff
path: root/app/assets/javascripts
diff options
context:
space:
mode:
Diffstat (limited to 'app/assets/javascripts')
-rw-r--r--app/assets/javascripts/activities.js.coffee2
-rw-r--r--app/assets/javascripts/api.js.coffee29
-rw-r--r--app/assets/javascripts/application.js.coffee47
-rw-r--r--app/assets/javascripts/aside.js.coffee17
-rw-r--r--app/assets/javascripts/autosave.js.coffee33
-rw-r--r--app/assets/javascripts/blob/blob.js.coffee (renamed from app/assets/javascripts/blob.js.coffee)0
-rw-r--r--app/assets/javascripts/blob/edit_blob.js.coffee44
-rw-r--r--app/assets/javascripts/blob/new_blob.js.coffee21
-rw-r--r--app/assets/javascripts/calendar.js.coffee30
-rw-r--r--app/assets/javascripts/diff.js.coffee3
-rw-r--r--app/assets/javascripts/dispatcher.js.coffee20
-rw-r--r--app/assets/javascripts/dropzone_input.js.coffee240
-rw-r--r--app/assets/javascripts/groups_select.js.coffee41
-rw-r--r--app/assets/javascripts/importer_status.js.coffee35
-rw-r--r--app/assets/javascripts/issue.js.coffee11
-rw-r--r--app/assets/javascripts/issues.js.coffee6
-rw-r--r--app/assets/javascripts/markdown_area.js.coffee196
-rw-r--r--app/assets/javascripts/merge_request.js.coffee28
-rw-r--r--app/assets/javascripts/notes.js.coffee125
-rw-r--r--app/assets/javascripts/password_strength.js.coffee31
-rw-r--r--app/assets/javascripts/project.js.coffee8
-rw-r--r--app/assets/javascripts/project_avatar.js.coffee9
-rw-r--r--app/assets/javascripts/project_fork.js.coffee5
-rw-r--r--app/assets/javascripts/project_new.js.coffee14
-rw-r--r--app/assets/javascripts/project_show.js.coffee2
-rw-r--r--app/assets/javascripts/project_users_select.js.coffee2
-rw-r--r--app/assets/javascripts/protected_branches.js.coffee21
-rw-r--r--app/assets/javascripts/sidebar.js.coffee38
-rw-r--r--app/assets/javascripts/stat_graph_contributors_graph.js.coffee4
-rw-r--r--app/assets/javascripts/team_members.js.coffee4
-rw-r--r--app/assets/javascripts/zen_mode.js.coffee12
31 files changed, 673 insertions, 405 deletions
diff --git a/app/assets/javascripts/activities.js.coffee b/app/assets/javascripts/activities.js.coffee
index 4f76d8ce486..777c62dc1b7 100644
--- a/app/assets/javascripts/activities.js.coffee
+++ b/app/assets/javascripts/activities.js.coffee
@@ -12,7 +12,7 @@ class @Activities
toggleFilter: (sender) ->
- sender.parent().toggleClass "inactive"
+ sender.parent().toggleClass "active"
event_filters = $.cookie("event_filter")
filter = sender.attr("id").split("_")[0]
if event_filters
diff --git a/app/assets/javascripts/api.js.coffee b/app/assets/javascripts/api.js.coffee
index fafa5cdfaa4..27d04e7cac6 100644
--- a/app/assets/javascripts/api.js.coffee
+++ b/app/assets/javascripts/api.js.coffee
@@ -1,4 +1,6 @@
@Api =
+ groups_path: "/api/:version/groups.json"
+ group_path: "/api/:version/groups/:id.json"
users_path: "/api/:version/users.json"
user_path: "/api/:version/users/:id.json"
notes_path: "/api/:version/projects/:id/notes.json"
@@ -51,6 +53,33 @@
).done (users) ->
callback(users)
+ group: (group_id, callback) ->
+ url = Api.buildUrl(Api.group_path)
+ url = url.replace(':id', group_id)
+
+ $.ajax(
+ url: url
+ data:
+ private_token: gon.api_token
+ dataType: "json"
+ ).done (group) ->
+ callback(group)
+
+ # Return groups list. Filtered by query
+ # Only active groups retrieved
+ groups: (query, skip_ldap, callback) ->
+ url = Api.buildUrl(Api.groups_path)
+
+ $.ajax(
+ url: url
+ data:
+ private_token: gon.api_token
+ search: query
+ per_page: 20
+ dataType: "json"
+ ).done (groups) ->
+ callback(groups)
+
# Return project users list. Filtered by query
# Only active users retrieved
projectUsers: (project_id, query, callback) ->
diff --git a/app/assets/javascripts/application.js.coffee b/app/assets/javascripts/application.js.coffee
index e9a28c12159..c7acde2afe5 100644
--- a/app/assets/javascripts/application.js.coffee
+++ b/app/assets/javascripts/application.js.coffee
@@ -16,16 +16,16 @@
#= require jquery.scrollTo
#= require jquery.blockUI
#= require jquery.turbolinks
+#= require jquery.sticky-kit.min
#= require turbolinks
+#= require autosave
#= require bootstrap
-#= require password_strength
#= require select2
#= require raphael
#= require g.raphael-min
#= require g.bar-min
#= require chart-lib.min
#= require branch-graph
-#= require highlight.pack
#= require ace/ace
#= require ace/ext-searchbox
#= require d3
@@ -33,7 +33,6 @@
#= require nprogress
#= require nprogress-turbolinks
#= require dropzone
-#= require semantic-ui/sidebar
#= require mousetrap
#= require mousetrap/pause
#= require shortcuts
@@ -41,6 +40,7 @@
#= require shortcuts_dashboard_navigation
#= require shortcuts_issueable
#= require shortcuts_network
+#= require cal-heatmap
#= require_tree .
window.slugify = (text) ->
@@ -51,12 +51,6 @@ window.ajaxGet = (url) ->
window.showAndHide = (selector) ->
-window.errorMessage = (message) ->
- ehtml = $("<p>")
- ehtml.addClass("error_message")
- ehtml.html(message)
- ehtml
-
window.split = (val) ->
return val.split( /,\s*/ )
@@ -82,24 +76,18 @@ window.disableButtonIfEmptyField = (field_selector, button_selector) ->
# Disable button if any input field with given selector is empty
window.disableButtonIfAnyEmptyField = (form, form_selector, button_selector) ->
closest_submit = form.find(button_selector)
- empty = false
- form.find('input').filter(form_selector).each ->
- empty = true if rstrip($(this).val()) is ""
-
- if empty
- closest_submit.disable()
- else
- closest_submit.enable()
-
- form.keyup ->
- empty = false
+ updateButtons = ->
+ filled = true
form.find('input').filter(form_selector).each ->
- empty = true if rstrip($(this).val()) is ""
+ filled = rstrip($(this).val()) != "" || !$(this).attr('required')
- if empty
- closest_submit.disable()
- else
+ if filled
closest_submit.enable()
+ else
+ closest_submit.disable()
+
+ updateButtons()
+ form.keyup(updateButtons)
window.sanitize = (str) ->
return str.replace(/<(?:.|\n)*?>/gm, '')
@@ -115,8 +103,17 @@ window.unbindEvents = ->
$(document).unbind('scroll')
$(document).off('scroll')
+window.shiftWindow = ->
+ scrollBy 0, -50
+
document.addEventListener("page:fetch", unbindEvents)
+# Scroll the window to avoid the topnav bar
+# https://github.com/twitter/bootstrap/issues/1768
+if location.hash
+ setTimeout shiftWindow, 1
+window.addEventListener "hashchange", shiftWindow
+
$ ->
# Click a .one_click_select field, select the contents
$(".one_click_select").on 'click', -> $(@).select()
@@ -185,6 +182,8 @@ $ ->
form = btn.closest("form")
new ConfirmDangerModal(form, text)
+ new Aside()
+
(($) ->
# Disable an element and add the 'disabled' Bootstrap class
$.fn.extend disable: ->
diff --git a/app/assets/javascripts/aside.js.coffee b/app/assets/javascripts/aside.js.coffee
new file mode 100644
index 00000000000..85473101944
--- /dev/null
+++ b/app/assets/javascripts/aside.js.coffee
@@ -0,0 +1,17 @@
+class @Aside
+ constructor: ->
+ $(document).off "click", "a.show-aside"
+ $(document).on "click", 'a.show-aside', (e) ->
+ e.preventDefault()
+ btn = $(e.currentTarget)
+ icon = btn.find('i')
+ console.log('1')
+
+ if icon.hasClass('fa-angle-left')
+ btn.parent().find('section').hide()
+ btn.parent().find('aside').fadeIn()
+ icon.removeClass('fa-angle-left').addClass('fa-angle-right')
+ else
+ btn.parent().find('aside').hide()
+ btn.parent().find('section').fadeIn()
+ icon.removeClass('fa-angle-right').addClass('fa-angle-left')
diff --git a/app/assets/javascripts/autosave.js.coffee b/app/assets/javascripts/autosave.js.coffee
new file mode 100644
index 00000000000..3450f4b55f7
--- /dev/null
+++ b/app/assets/javascripts/autosave.js.coffee
@@ -0,0 +1,33 @@
+class @Autosave
+ constructor: (field, key) ->
+ @field = field
+
+ key = key.join("/") if key.join?
+ @key = "autosave/#{key}"
+
+ @field.data "autosave", this
+
+ @restore()
+
+ @field.on "input", => @save()
+
+ restore: ->
+ return unless window.localStorage?
+
+ text = window.localStorage.getItem @key
+ @field.val text if text?.length > 0
+ @field.trigger "input"
+
+ save: ->
+ return unless window.localStorage?
+
+ text = @field.val()
+ if text?.length > 0
+ window.localStorage.setItem @key, text
+ else
+ @reset()
+
+ reset: ->
+ return unless window.localStorage?
+
+ window.localStorage.removeItem @key \ No newline at end of file
diff --git a/app/assets/javascripts/blob.js.coffee b/app/assets/javascripts/blob/blob.js.coffee
index a5f15f80c5c..a5f15f80c5c 100644
--- a/app/assets/javascripts/blob.js.coffee
+++ b/app/assets/javascripts/blob/blob.js.coffee
diff --git a/app/assets/javascripts/blob/edit_blob.js.coffee b/app/assets/javascripts/blob/edit_blob.js.coffee
new file mode 100644
index 00000000000..6914ca759f6
--- /dev/null
+++ b/app/assets/javascripts/blob/edit_blob.js.coffee
@@ -0,0 +1,44 @@
+class @EditBlob
+ constructor: (assets_path, mode)->
+ ace.config.set "modePath", assets_path + '/ace'
+ ace.config.loadModule "ace/ext/searchbox"
+ if mode
+ ace_mode = mode
+ editor = ace.edit("editor")
+ editor.focus()
+ @editor = editor
+
+ if ace_mode
+ editor.getSession().setMode "ace/mode/" + ace_mode
+
+ disableButtonIfEmptyField "#commit_message", ".js-commit-button"
+ $(".js-commit-button").click ->
+ $("#file-content").val editor.getValue()
+ $(".file-editor form").submit()
+ return
+
+ editModePanes = $(".js-edit-mode-pane")
+ editModeLinks = $(".js-edit-mode a")
+ editModeLinks.click (event) ->
+ event.preventDefault()
+ currentLink = $(this)
+ paneId = currentLink.attr("href")
+ currentPane = editModePanes.filter(paneId)
+ editModeLinks.parent().removeClass "active hover"
+ currentLink.parent().addClass "active hover"
+ editModePanes.hide()
+ if paneId is "#preview"
+ currentPane.fadeIn 200
+ $.post currentLink.data("preview-url"),
+ content: editor.getValue()
+ , (response) ->
+ currentPane.empty().append response
+ return
+
+ else
+ currentPane.fadeIn 200
+ editor.focus()
+ return
+
+ editor: ->
+ return @editor
diff --git a/app/assets/javascripts/blob/new_blob.js.coffee b/app/assets/javascripts/blob/new_blob.js.coffee
new file mode 100644
index 00000000000..a6e27116b40
--- /dev/null
+++ b/app/assets/javascripts/blob/new_blob.js.coffee
@@ -0,0 +1,21 @@
+class @NewBlob
+ constructor: (assets_path, mode)->
+ ace.config.set "modePath", assets_path + '/ace'
+ ace.config.loadModule "ace/ext/searchbox"
+ if mode
+ ace_mode = mode
+ editor = ace.edit("editor")
+ editor.focus()
+ @editor = editor
+
+ if ace_mode
+ editor.getSession().setMode "ace/mode/" + ace_mode
+
+ disableButtonIfEmptyField "#commit_message", ".js-commit-button"
+ $(".js-commit-button").click ->
+ $("#file-content").val editor.getValue()
+ $(".file-editor form").submit()
+ return
+
+ editor: ->
+ return @editor
diff --git a/app/assets/javascripts/calendar.js.coffee b/app/assets/javascripts/calendar.js.coffee
new file mode 100644
index 00000000000..19ea4ccc4cf
--- /dev/null
+++ b/app/assets/javascripts/calendar.js.coffee
@@ -0,0 +1,30 @@
+class @calendar
+ options =
+ month: "short"
+ day: "numeric"
+ year: "numeric"
+
+ constructor: (timestamps, starting_year, starting_month) ->
+ cal = new CalHeatMap()
+ cal.init
+ itemName: ["commit"]
+ data: timestamps
+ start: new Date(starting_year, starting_month)
+ domainLabelFormat: "%b"
+ id: "cal-heatmap"
+ domain: "month"
+ subDomain: "day"
+ range: 12
+ tooltip: true
+ label:
+ position: "top"
+ legend: [
+ 0
+ 1
+ 4
+ 7
+ ]
+ legendCellPadding: 3
+ onClick: (date, count) ->
+ return
+ return
diff --git a/app/assets/javascripts/diff.js.coffee b/app/assets/javascripts/diff.js.coffee
index 52b4208524f..05f5af42571 100644
--- a/app/assets/javascripts/diff.js.coffee
+++ b/app/assets/javascripts/diff.js.coffee
@@ -1,6 +1,7 @@
class @Diff
UNFOLD_COUNT = 20
constructor: ->
+ $(document).off('click', '.js-unfold')
$(document).on('click', '.js-unfold', (event) =>
target = $(event.target)
unfoldBottom = target.hasClass('js-unfold-bottom')
@@ -36,6 +37,8 @@ class @Diff
)
)
+ $('.diff-header').stick_in_parent(recalc_every: 1, offset_top: $('.navbar').height())
+
lineNumbers: (line) ->
return ([0, 0]) unless line.children().length
lines = line.children().slice(0, 2)
diff --git a/app/assets/javascripts/dispatcher.js.coffee b/app/assets/javascripts/dispatcher.js.coffee
index ec4b7ea42cf..ed1bdd6ca33 100644
--- a/app/assets/javascripts/dispatcher.js.coffee
+++ b/app/assets/javascripts/dispatcher.js.coffee
@@ -4,7 +4,6 @@ $ ->
class Dispatcher
constructor: () ->
@initSearch()
- @initHighlight()
@initPageScripts()
initPageScripts: ->
@@ -27,23 +26,26 @@ class Dispatcher
new ZenMode()
when 'projects:milestones:show'
new Milestone()
- when 'projects:milestones:new'
+ when 'projects:milestones:new', 'projects:milestones:edit'
new ZenMode()
when 'projects:issues:new','projects:issues:edit'
GitLab.GfmAutoComplete.setup()
shortcut_handler = new ShortcutsNavigation()
new ZenMode()
+ new DropzoneInput($('.issue-form'))
when 'projects:merge_requests:new', 'projects:merge_requests:edit'
GitLab.GfmAutoComplete.setup()
new Diff()
shortcut_handler = new ShortcutsNavigation()
new ZenMode()
+ new DropzoneInput($('.merge-request-form'))
when 'projects:merge_requests:show'
new Diff()
shortcut_handler = new ShortcutsIssueable()
new ZenMode()
when "projects:merge_requests:diffs"
new Diff()
+ new ZenMode()
when 'projects:merge_requests:index'
shortcut_handler = new ShortcutsNavigation()
when 'dashboard:show'
@@ -52,14 +54,13 @@ class Dispatcher
when 'projects:commit:show'
new Commit()
new Diff()
+ new ZenMode()
shortcut_handler = new ShortcutsNavigation()
when 'projects:commits:show'
shortcut_handler = new ShortcutsNavigation()
when 'groups:show', 'projects:show'
new Activities()
shortcut_handler = new ShortcutsNavigation()
- when 'projects:teams:members:index'
- new TeamMembers()
when 'groups:members'
new GroupMembers()
new UsersSelect()
@@ -77,6 +78,8 @@ class Dispatcher
# Ensure we don't create a particular shortcut handler here. This is
# already created, where the network graph is created.
shortcut_handler = true
+ when 'projects:forks:new'
+ new ProjectFork()
when 'users:show'
new User()
@@ -94,6 +97,7 @@ class Dispatcher
new Profile()
when 'projects'
new Project()
+ new ProjectAvatar()
switch path[1]
when 'edit'
shortcut_handler = new ShortcutsNavigation()
@@ -108,6 +112,7 @@ class Dispatcher
new Wikis()
shortcut_handler = new ShortcutsNavigation()
new ZenMode()
+ new DropzoneInput($('.wiki-form'))
when 'snippets', 'labels', 'graphs'
shortcut_handler = new ShortcutsNavigation()
when 'team_members', 'deploy_keys', 'hooks', 'services', 'protected_branches'
@@ -126,10 +131,3 @@ class Dispatcher
project_ref = opts.data('autocomplete-project-ref')
new SearchAutocomplete(path, project_id, project_ref)
-
- initHighlight: ->
- $('.highlight pre code').each (i, e) ->
- $(e).html($.map($(e).html().split("\n"), (line, i) ->
- "<span class='line' id='LC" + (i + 1) + "'>" + line + "</span>"
- ).join("\n"))
- hljs.highlightBlock(e)
diff --git a/app/assets/javascripts/dropzone_input.js.coffee b/app/assets/javascripts/dropzone_input.js.coffee
new file mode 100644
index 00000000000..06e9f0001ae
--- /dev/null
+++ b/app/assets/javascripts/dropzone_input.js.coffee
@@ -0,0 +1,240 @@
+class @DropzoneInput
+ constructor: (form) ->
+ Dropzone.autoDiscover = false
+ alertClass = "alert alert-danger alert-dismissable div-dropzone-alert"
+ alertAttr = "class=\"close\" data-dismiss=\"alert\"" + "aria-hidden=\"true\""
+ divHover = "<div class=\"div-dropzone-hover\"></div>"
+ divSpinner = "<div class=\"div-dropzone-spinner\"></div>"
+ divAlert = "<div class=\"" + alertClass + "\"></div>"
+ iconPaperclip = "<i class=\"fa fa-paperclip div-dropzone-icon\"></i>"
+ iconSpinner = "<i class=\"fa fa-spinner fa-spin div-dropzone-icon\"></i>"
+ btnAlert = "<button type=\"button\"" + alertAttr + ">&times;</button>"
+ project_uploads_path = window.project_uploads_path or null
+
+ form_textarea = $(form).find("textarea.markdown-area")
+ form_textarea.wrap "<div class=\"div-dropzone\"></div>"
+ form_textarea.bind 'paste', (event) =>
+ handlePaste(event)
+
+ form_dropzone = $(form).find('.div-dropzone')
+ form_dropzone.parent().addClass "div-dropzone-wrapper"
+ form_dropzone.append divHover
+ $(".div-dropzone-hover").append iconPaperclip
+ form_dropzone.append divSpinner
+ $(".div-dropzone-spinner").append iconSpinner
+ $(".div-dropzone-spinner").css
+ "opacity": 0
+ "display": "none"
+
+ # Preview button
+ $(document).off "click", ".js-md-preview-button"
+ $(document).on "click", ".js-md-preview-button", (e) ->
+ ###
+ Shows the Markdown preview.
+
+ Lets the server render GFM into Html and displays it.
+ ###
+ e.preventDefault()
+ form = $(this).closest("form")
+ # toggle tabs
+ form.find(".js-md-write-button").parent().removeClass "active"
+ form.find(".js-md-preview-button").parent().addClass "active"
+
+ # toggle content
+ form.find(".md-write-holder").hide()
+ form.find(".md-preview-holder").show()
+
+ preview = form.find(".js-md-preview")
+ mdText = form.find(".markdown-area").val()
+ if mdText.trim().length is 0
+ preview.text "Nothing to preview."
+ else
+ preview.text "Loading..."
+ $.post($(this).data("url"),
+ md_text: mdText
+ ).success (previewData) ->
+ preview.html previewData
+
+ # Write button
+ $(document).off "click", ".js-md-write-button"
+ $(document).on "click", ".js-md-write-button", (e) ->
+ ###
+ Shows the Markdown textarea.
+ ###
+ e.preventDefault()
+ form = $(this).closest("form")
+ # toggle tabs
+ form.find(".js-md-write-button").parent().addClass "active"
+ form.find(".js-md-preview-button").parent().removeClass "active"
+
+ # toggle content
+ form.find(".md-write-holder").show()
+ form.find(".md-preview-holder").hide()
+
+ dropzone = form_dropzone.dropzone(
+ url: project_uploads_path
+ dictDefaultMessage: ""
+ clickable: true
+ paramName: "file"
+ maxFilesize: 10
+ uploadMultiple: false
+ headers:
+ "X-CSRF-Token": $("meta[name=\"csrf-token\"]").attr("content")
+
+ previewContainer: false
+
+ processing: ->
+ $(".div-dropzone-alert").alert "close"
+
+ dragover: ->
+ form_textarea.addClass "div-dropzone-focus"
+ form.find(".div-dropzone-hover").css "opacity", 0.7
+ return
+
+ dragleave: ->
+ form_textarea.removeClass "div-dropzone-focus"
+ form.find(".div-dropzone-hover").css "opacity", 0
+ return
+
+ drop: ->
+ form_textarea.removeClass "div-dropzone-focus"
+ form.find(".div-dropzone-hover").css "opacity", 0
+ form_textarea.focus()
+ return
+
+ success: (header, response) ->
+ child = $(dropzone[0]).children("textarea")
+ $(child).val $(child).val() + formatLink(response.link) + "\n"
+ return
+
+ error: (temp, errorMessage) ->
+ checkIfMsgExists = $(".error-alert").children().length
+ if checkIfMsgExists is 0
+ $(".error-alert").append divAlert
+ $(".div-dropzone-alert").append btnAlert + errorMessage
+ return
+
+ sending: ->
+ form_dropzone.find(".div-dropzone-spinner").css
+ "opacity": 0.7
+ "display": "inherit"
+ return
+
+ complete: ->
+ $(".dz-preview").remove()
+ $(".markdown-area").trigger "input"
+ $(".div-dropzone-spinner").css
+ "opacity": 0
+ "display": "none"
+ return
+ )
+
+ child = $(dropzone[0]).children("textarea")
+
+ formatLink = (link) ->
+ text = "[#{link.alt}](#{link.url})"
+ text = "!#{text}" if link.is_image
+ text
+
+ handlePaste = (event) ->
+ pasteEvent = event.originalEvent
+ if pasteEvent.clipboardData and pasteEvent.clipboardData.items
+ image = isImage(pasteEvent)
+ if image
+ event.preventDefault()
+
+ filename = getFilename(pasteEvent) or "image.png"
+ text = "{{" + filename + "}}"
+ pasteText(text)
+ uploadFile image.getAsFile(), filename
+
+ isImage = (data) ->
+ i = 0
+ while i < data.clipboardData.items.length
+ item = data.clipboardData.items[i]
+ if item.type.indexOf("image") isnt -1
+ return item
+ i++
+ return false
+
+ pasteText = (text) ->
+ caretStart = $(child)[0].selectionStart
+ caretEnd = $(child)[0].selectionEnd
+ textEnd = $(child).val().length
+
+ beforeSelection = $(child).val().substring 0, caretStart
+ afterSelection = $(child).val().substring caretEnd, textEnd
+ $(child).val beforeSelection + text + afterSelection
+ form_textarea.trigger "input"
+
+ getFilename = (e) ->
+ if window.clipboardData and window.clipboardData.getData
+ value = window.clipboardData.getData("Text")
+ else if e.clipboardData and e.clipboardData.getData
+ value = e.clipboardData.getData("text/plain")
+
+ value = value.split("\r")
+ value.first()
+
+ uploadFile = (item, filename) ->
+ formData = new FormData()
+ formData.append "file", item, filename
+ $.ajax
+ url: project_uploads_path
+ type: "POST"
+ data: formData
+ dataType: "json"
+ processData: false
+ contentType: false
+ headers:
+ "X-CSRF-Token": $("meta[name=\"csrf-token\"]").attr("content")
+
+ beforeSend: ->
+ showSpinner()
+ closeAlertMessage()
+
+ success: (e, textStatus, response) ->
+ insertToTextArea(filename, formatLink(response.responseJSON.link))
+
+ error: (response) ->
+ showError(response.responseJSON.message)
+
+ complete: ->
+ closeSpinner()
+
+ insertToTextArea = (filename, url) ->
+ $(child).val (index, val) ->
+ val.replace("{{" + filename + "}}", url + "\n")
+
+ appendToTextArea = (url) ->
+ $(child).val (index, val) ->
+ val + url + "\n"
+
+ showSpinner = (e) ->
+ form.find(".div-dropzone-spinner").css
+ "opacity": 0.7
+ "display": "inherit"
+
+ closeSpinner = ->
+ form.find(".div-dropzone-spinner").css
+ "opacity": 0
+ "display": "none"
+
+ showError = (message) ->
+ checkIfMsgExists = $(".error-alert").children().length
+ if checkIfMsgExists is 0
+ $(".error-alert").append divAlert
+ $(".div-dropzone-alert").append btnAlert + message
+
+ closeAlertMessage = ->
+ form.find(".div-dropzone-alert").alert "close"
+
+ form.find(".markdown-selector").click (e) ->
+ e.preventDefault()
+ $(@).closest('.gfm-form').find('.div-dropzone').click()
+ return
+
+ formatLink: (link) ->
+ text = "[#{link.alt}](#{link.url})"
+ text = "!#{text}" if link.is_image
+ text \ No newline at end of file
diff --git a/app/assets/javascripts/groups_select.js.coffee b/app/assets/javascripts/groups_select.js.coffee
new file mode 100644
index 00000000000..1084e2a17d1
--- /dev/null
+++ b/app/assets/javascripts/groups_select.js.coffee
@@ -0,0 +1,41 @@
+class @GroupsSelect
+ constructor: ->
+ $('.ajax-groups-select').each (i, select) =>
+ skip_ldap = $(select).hasClass('skip_ldap')
+
+ $(select).select2
+ placeholder: "Search for a group"
+ multiple: $(select).hasClass('multiselect')
+ minimumInputLength: 0
+ query: (query) ->
+ Api.groups query.term, skip_ldap, (groups) ->
+ data = { results: groups }
+ query.callback(data)
+
+ initSelection: (element, callback) ->
+ id = $(element).val()
+ if id isnt ""
+ Api.group(id, callback)
+
+
+ formatResult: (args...) =>
+ @formatResult(args...)
+ formatSelection: (args...) =>
+ @formatSelection(args...)
+ dropdownCssClass: "ajax-groups-dropdown"
+ escapeMarkup: (m) -> # we do not want to escape markup since we are displaying html in results
+ m
+
+ formatResult: (group) ->
+ if group.avatar_url
+ avatar = group.avatar_url
+ else
+ avatar = gon.default_avatar_url
+
+ "<div class='group-result'>
+ <div class='group-name'>#{group.name}</div>
+ <div class='group-path'>#{group.path}</div>
+ </div>"
+
+ formatSelection: (group) ->
+ group.name
diff --git a/app/assets/javascripts/importer_status.js.coffee b/app/assets/javascripts/importer_status.js.coffee
new file mode 100644
index 00000000000..e0e7771ab20
--- /dev/null
+++ b/app/assets/javascripts/importer_status.js.coffee
@@ -0,0 +1,35 @@
+class @ImporterStatus
+ constructor: (@jobs_url, @import_url) ->
+ this.initStatusPage()
+ this.setAutoUpdate()
+
+ initStatusPage: ->
+ $(".js-add-to-import").click (event) =>
+ new_namespace = null
+ tr = $(event.currentTarget).closest("tr")
+ id = tr.attr("id").replace("repo_", "")
+ if tr.find(".import-target input").length > 0
+ new_namespace = tr.find(".import-target input").prop("value")
+ tr.find(".import-target").empty().append(new_namespace + "/" + tr.find(".import-target").data("project_name"))
+ $.post @import_url, {repo_id: id, new_namespace: new_namespace}, dataType: 'script'
+
+ $(".js-import-all").click (event) =>
+ $(".js-add-to-import").each ->
+ $(this).click()
+
+ setAutoUpdate: ->
+ setInterval (=>
+ $.get @jobs_url, (data) =>
+ $.each data, (i, job) =>
+ job_item = $("#project_" + job.id)
+ status_field = job_item.find(".job-status")
+
+ if job.import_status == 'finished'
+ job_item.removeClass("active").addClass("success")
+ status_field.html('<span class="cgreen"><i class="fa fa-check"></i> done</span>')
+ else if job.import_status == 'started'
+ status_field.html("<i class='fa fa-spinner fa-spin'></i> started")
+ else
+ status_field.html(job.import_status)
+
+ ), 4000 \ No newline at end of file
diff --git a/app/assets/javascripts/issue.js.coffee b/app/assets/javascripts/issue.js.coffee
index 597b4695a6d..f2753170478 100644
--- a/app/assets/javascripts/issue.js.coffee
+++ b/app/assets/javascripts/issue.js.coffee
@@ -1,9 +1,9 @@
class @Issue
constructor: ->
$('.edit-issue.inline-update input[type="submit"]').hide()
- $(".issue-box .inline-update").on "change", "select", ->
+ $(".context .inline-update").on "change", "select", ->
$(this).submit()
- $(".issue-box .inline-update").on "change", "#issue_assignee_id", ->
+ $(".context .inline-update").on "change", "#issue_assignee_id", ->
$(this).submit()
if $("a.btn-close").length
@@ -15,3 +15,10 @@ class @Issue
"issue"
updateTaskState
)
+
+ $('.issue-details').waitForImages ->
+ $('.issuable-affix').affix offset:
+ top: ->
+ @top = $('.issue-details').outerHeight(true) + 25
+ bottom: ->
+ @bottom = $('.footer').outerHeight(true)
diff --git a/app/assets/javascripts/issues.js.coffee b/app/assets/javascripts/issues.js.coffee
index 2499ad5ad80..6513f4bcefc 100644
--- a/app/assets/javascripts/issues.js.coffee
+++ b/app/assets/javascripts/issues.js.coffee
@@ -15,7 +15,7 @@
$(this).html totalIssues + 1
else
$(this).html totalIssues - 1
- $("body").on "click", ".issues-filters .dropdown-menu a", ->
+ $("body").on "click", ".issues-other-filters .dropdown-menu a", ->
$('.issues-list').block(
message: null,
overlayCSS:
@@ -77,9 +77,9 @@
ids.push $(value).attr("data-id")
$("#update_issues_ids").val ids
- $(".issues-filters").hide()
+ $(".issues-other-filters").hide()
$(".issues_bulk_update").show()
else
$("#update_issues_ids").val []
$(".issues_bulk_update").hide()
- $(".issues-filters").show()
+ $(".issues-other-filters").show()
diff --git a/app/assets/javascripts/markdown_area.js.coffee b/app/assets/javascripts/markdown_area.js.coffee
deleted file mode 100644
index a0ebfc98ce6..00000000000
--- a/app/assets/javascripts/markdown_area.js.coffee
+++ /dev/null
@@ -1,196 +0,0 @@
-formatLink = (str) ->
- "![" + str.alt + "](" + str.url + ")"
-
-$(document).ready ->
- alertClass = "alert alert-danger alert-dismissable div-dropzone-alert"
- alertAttr = "class=\"close\" data-dismiss=\"alert\"" + "aria-hidden=\"true\""
- divHover = "<div class=\"div-dropzone-hover\"></div>"
- divSpinner = "<div class=\"div-dropzone-spinner\"></div>"
- divAlert = "<div class=\"" + alertClass + "\"></div>"
- iconPicture = "<i class=\"fa fa-picture-o div-dropzone-icon\"></i>"
- iconSpinner = "<i class=\"fa fa-spinner fa-spin div-dropzone-icon\"></i>"
- btnAlert = "<button type=\"button\"" + alertAttr + ">&times;</button>"
- project_image_path_upload = window.project_image_path_upload or null
-
- $("textarea.markdown-area").wrap "<div class=\"div-dropzone\"></div>"
-
- $(".div-dropzone").parent().addClass "div-dropzone-wrapper"
-
- $(".div-dropzone").append divHover
- $(".div-dropzone-hover").append iconPicture
- $(".div-dropzone").append divSpinner
- $(".div-dropzone-spinner").append iconSpinner
- $(".div-dropzone-spinner").css
- "opacity": 0
- "display": "none"
-
- dropzone = $(".div-dropzone").dropzone(
- url: project_image_path_upload
- dictDefaultMessage: ""
- clickable: true
- paramName: "markdown_img"
- maxFilesize: 10
- uploadMultiple: false
- acceptedFiles: "image/jpg,image/jpeg,image/gif,image/png"
- headers:
- "X-CSRF-Token": $("meta[name=\"csrf-token\"]").attr("content")
-
- previewContainer: false
-
- processing: ->
- $(".div-dropzone-alert").alert "close"
-
- dragover: ->
- $(".div-dropzone > textarea").addClass "div-dropzone-focus"
- $(".div-dropzone-hover").css "opacity", 0.7
- return
-
- dragleave: ->
- $(".div-dropzone > textarea").removeClass "div-dropzone-focus"
- $(".div-dropzone-hover").css "opacity", 0
- return
-
- drop: ->
- $(".div-dropzone > textarea").removeClass "div-dropzone-focus"
- $(".div-dropzone-hover").css "opacity", 0
- $(".div-dropzone > textarea").focus()
- return
-
- success: (header, response) ->
- child = $(dropzone[0]).children("textarea")
- $(child).val $(child).val() + formatLink(response.link) + "\n"
- return
-
- error: (temp, errorMessage) ->
- checkIfMsgExists = $(".error-alert").children().length
- if checkIfMsgExists is 0
- $(".error-alert").append divAlert
- $(".div-dropzone-alert").append btnAlert + errorMessage
- return
-
- sending: ->
- $(".div-dropzone-spinner").css
- "opacity": 0.7
- "display": "inherit"
- return
-
- complete: ->
- $(".dz-preview").remove()
- $(".markdown-area").trigger "input"
- $(".div-dropzone-spinner").css
- "opacity": 0
- "display": "none"
- return
- )
-
- child = $(dropzone[0]).children("textarea")
-
- formatLink = (str) ->
- "![" + str.alt + "](" + str.url + ")"
-
- handlePaste = (e) ->
- e.preventDefault()
- my_event = e.originalEvent
-
- if my_event.clipboardData and my_event.clipboardData.items
- processItem(my_event)
-
- processItem = (e) ->
- image = isImage(e)
- if image
- filename = getFilename(e) or "image.png"
- text = "{{" + filename + "}}"
- pasteText(text)
- uploadFile image.getAsFile(), filename
-
- else
- text = e.clipboardData.getData("text/plain")
- pasteText(text)
-
- isImage = (data) ->
- i = 0
- while i < data.clipboardData.items.length
- item = data.clipboardData.items[i]
- if item.type.indexOf("image") isnt -1
- return item
- i++
- return false
-
- pasteText = (text) ->
- caretStart = $(child)[0].selectionStart
- caretEnd = $(child)[0].selectionEnd
- textEnd = $(child).val().length
-
- beforeSelection = $(child).val().substring 0, caretStart
- afterSelection = $(child).val().substring caretEnd, textEnd
- $(child).val beforeSelection + text + afterSelection
- $(".markdown-area").trigger "input"
-
- getFilename = (e) ->
- if window.clipboardData and window.clipboardData.getData
- value = window.clipboardData.getData("Text")
- else if e.clipboardData and e.clipboardData.getData
- value = e.clipboardData.getData("text/plain")
-
- value = value.split("\r")
- value.first()
-
- uploadFile = (item, filename) ->
- formData = new FormData()
- formData.append "markdown_img", item, filename
- $.ajax
- url: project_image_path_upload
- type: "POST"
- data: formData
- dataType: "json"
- processData: false
- contentType: false
- headers:
- "X-CSRF-Token": $("meta[name=\"csrf-token\"]").attr("content")
-
- beforeSend: ->
- showSpinner()
- closeAlertMessage()
-
- success: (e, textStatus, response) ->
- insertToTextArea(filename, formatLink(response.responseJSON.link))
-
- error: (response) ->
- showError(response.responseJSON.message)
-
- complete: ->
- closeSpinner()
-
- insertToTextArea = (filename, url) ->
- $(child).val (index, val) ->
- val.replace("{{" + filename + "}}", url + "\n")
-
- appendToTextArea = (url) ->
- $(child).val (index, val) ->
- val + url + "\n"
-
- showSpinner = (e) ->
- $(".div-dropzone-spinner").css
- "opacity": 0.7
- "display": "inherit"
-
- closeSpinner = ->
- $(".div-dropzone-spinner").css
- "opacity": 0
- "display": "none"
-
- showError = (message) ->
- checkIfMsgExists = $(".error-alert").children().length
- if checkIfMsgExists is 0
- $(".error-alert").append divAlert
- $(".div-dropzone-alert").append btnAlert + message
-
- closeAlertMessage = ->
- $(".div-dropzone-alert").alert "close"
-
- $(".markdown-selector").click (e) ->
- e.preventDefault()
- $(@).closest('.gfm-form').find('.div-dropzone').click()
- return
-
- return
diff --git a/app/assets/javascripts/merge_request.js.coffee b/app/assets/javascripts/merge_request.js.coffee
index 46e06424e5a..d19f3af8c34 100644
--- a/app/assets/javascripts/merge_request.js.coffee
+++ b/app/assets/javascripts/merge_request.js.coffee
@@ -20,15 +20,22 @@ class @MergeRequest
if $("a.btn-close").length
$("li.task-list-item input:checkbox").prop("disabled", false)
+ $('.merge-request-details').waitForImages ->
+ $('.issuable-affix').affix offset:
+ top: ->
+ @top = $('.merge-request-details').outerHeight(true) + 91
+ bottom: ->
+ @bottom = $('.footer').outerHeight(true)
+
# Local jQuery finder
$: (selector) ->
this.$el.find(selector)
initContextWidget: ->
$('.edit-merge_request.inline-update input[type="submit"]').hide()
- $(".issue-box .inline-update").on "change", "select", ->
+ $(".context .inline-update").on "change", "select", ->
$(this).submit()
- $(".issue-box .inline-update").on "change", "#merge_request_assignee_id", ->
+ $(".context .inline-update").on "change", "#merge_request_assignee_id", ->
$(this).submit()
initMergeWidget: ->
@@ -89,6 +96,10 @@ class @MergeRequest
this.$('.merge-request-tabs .diffs-tab').addClass 'active'
this.loadDiff() unless @diffs_loaded
this.$('.diffs').show()
+ $(".diff-header").trigger("sticky_kit:recalc")
+ when 'commits'
+ this.$('.merge-request-tabs .commits-tab').addClass 'active'
+ this.$('.commits').show()
else
this.$('.merge-request-tabs .notes-tab').addClass 'active'
this.$('.notes').show()
@@ -132,3 +143,16 @@ class @MergeRequest
this.$('.automerge_widget').hide()
this.$('.merge-in-progress').hide()
this.$('.automerge_widget.already_cannot_be_merged').show()
+
+ mergeInProgress: ->
+ $.ajax
+ type: 'GET'
+ url: $('.merge-request').data('url')
+ success: (data) =>
+ switch data.state
+ when 'merged'
+ location.reload()
+ else
+ setTimeout(merge_request.mergeInProgress, 3000)
+ dataType: 'json'
+
diff --git a/app/assets/javascripts/notes.js.coffee b/app/assets/javascripts/notes.js.coffee
index 978f83dd442..90e6fd6d154 100644
--- a/app/assets/javascripts/notes.js.coffee
+++ b/app/assets/javascripts/notes.js.coffee
@@ -36,18 +36,9 @@ class @Notes
# delete note attachment
$(document).on "click", ".js-note-attachment-delete", @removeAttachment
- # Preview button
- $(document).on "click", ".js-note-preview-button", @previewNote
-
- # Preview button
- $(document).on "click", ".js-note-write-button", @writeNote
-
# reset main target form after submit
$(document).on "ajax:complete", ".js-main-target-form", @resetMainTargetForm
- # attachment button
- $(document).on "click", ".js-choose-note-attachment-button", @chooseNoteAttachment
-
# update the file name when an attachment is selected
$(document).on "change", ".js-note-attachment-input", @updateFormAttachment
@@ -64,8 +55,9 @@ class @Notes
$(document).on "visibilitychange", @visibilityChange
@notes_forms = '.js-main-target-form textarea, .js-discussion-note-form textarea'
- $(document).on('keypress', @notes_forms, (e)->
- if e.keyCode == 10 || (e.ctrlKey && e.keyCode == 13)
+ # Chrome doesn't fire keypress or keyup for Command+Enter, so we need keydown.
+ $(document).on('keydown', @notes_forms, (e) ->
+ if e.keyCode == 10 || ((e.metaKey || e.ctrlKey) && e.keyCode == 13)
$(@).parents('form').submit()
)
@@ -77,14 +69,11 @@ class @Notes
$(document).off "click", ".note-edit-cancel"
$(document).off "click", ".js-note-delete"
$(document).off "click", ".js-note-attachment-delete"
- $(document).off "click", ".js-note-preview-button"
- $(document).off "click", ".js-note-write-button"
$(document).off "ajax:complete", ".js-main-target-form"
- $(document).off "click", ".js-choose-note-attachment-button"
$(document).off "click", ".js-discussion-reply-button"
$(document).off "click", ".js-add-diff-note-button"
$(document).off "visibilitychange"
- $(document).off "keypress", @notes_forms
+ $(document).off "keydown", @notes_forms
$(document).off "keyup", ".js-note-text"
$(document).off "click", ".js-note-target-reopen"
$(document).off "click", ".js-note-target-close"
@@ -122,10 +111,6 @@ class @Notes
if @isNewNote(note)
@note_ids.push(note.id)
$('ul.main-notes-list').append(note.html)
- code = "#note_" + note.id + " .highlight pre code"
- $(code).each (i, e) ->
- hljs.highlightBlock(e)
-
###
Check if note does not exists on page
@@ -166,47 +151,6 @@ class @Notes
@removeDiscussionNoteForm(form)
###
- Shows write note textarea.
- ###
- writeNote: (e) ->
- e.preventDefault()
- form = $(this).closest("form")
- # toggle tabs
- form.find(".js-note-write-button").parent().addClass "active"
- form.find(".js-note-preview-button").parent().removeClass "active"
-
- # toggle content
- form.find(".note-write-holder").show()
- form.find(".note-preview-holder").hide()
-
- ###
- Shows the note preview.
-
- Lets the server render GFM into Html and displays it.
- ###
- previewNote: (e) ->
- e.preventDefault()
- form = $(this).closest("form")
- # toggle tabs
- form.find(".js-note-write-button").parent().removeClass "active"
- form.find(".js-note-preview-button").parent().addClass "active"
-
- # toggle content
- form.find(".note-write-holder").hide()
- form.find(".note-preview-holder").show()
-
- preview = form.find(".js-note-preview")
- noteText = form.find(".js-note-text").val()
- if noteText.trim().length is 0
- preview.text "Nothing to preview."
- else
- preview.text "Loading..."
- $.post($(this).data("url"),
- note: noteText
- ).success (previewData) ->
- preview.html previewData
-
- ###
Called in response the main target form has been successfully submitted.
Removes any errors.
@@ -220,17 +164,10 @@ class @Notes
form.find(".js-errors").remove()
# reset text and preview
- form.find(".js-note-write-button").click()
+ form.find(".js-md-write-button").click()
form.find(".js-note-text").val("").trigger "input"
- ###
- Called when clicking the "Choose File" button.
-
- Opens the file selection dialog.
- ###
- chooseNoteAttachment: ->
- form = $(this).closest("form")
- form.find(".js-note-attachment-input").click()
+ form.find(".js-note-text").data("autosave").reset()
###
Shows the main form and does some setup on it.
@@ -268,23 +205,34 @@ class @Notes
setupNoteForm: (form) ->
disableButtonIfEmptyField form.find(".js-note-text"), form.find(".js-comment-button")
form.removeClass "js-new-note-form"
+ form.find('.div-dropzone').remove()
# setup preview buttons
- form.find(".js-note-write-button, .js-note-preview-button").tooltip placement: "left"
- previewButton = form.find(".js-note-preview-button")
- form.find(".js-note-text").on "input", ->
+ form.find(".js-md-write-button, .js-md-preview-button").tooltip placement: "left"
+ previewButton = form.find(".js-md-preview-button")
+
+ textarea = form.find(".js-note-text")
+
+ textarea.on "input", ->
if $(this).val().trim() isnt ""
previewButton.removeClass("turn-off").addClass "turn-on"
else
previewButton.removeClass("turn-on").addClass "turn-off"
+ new Autosave textarea, [
+ "Note"
+ form.find("#note_commit_id").val()
+ form.find("#note_line_code").val()
+ form.find("#note_noteable_type").val()
+ form.find("#note_noteable_id").val()
+ ]
# remove notify commit author checkbox for non-commit notes
form.find(".js-notify-commit-author").remove() if form.find("#note_noteable_type").val() isnt "Commit"
GitLab.GfmAutoComplete.setup()
+ new DropzoneInput(form)
form.show()
-
###
Called in response to the new note form being submitted
@@ -308,11 +256,10 @@ class @Notes
Updates the current note field.
###
updateNote: (xhr, note, status) =>
- note_li = $("#note_" + note.id)
+ note_li = $(".note-row-" + note.id)
note_li.replaceWith(note.html)
- code = "#note_" + note.id + " .highlight pre code"
- $(code).each (i, e) ->
- hljs.highlightBlock(e)
+ note_li.find('.note-edit-form').hide()
+ note_li.find('.note-body > .note-text').show()
###
Called in response to clicking the edit note link
@@ -324,12 +271,20 @@ class @Notes
showEditForm: (e) ->
e.preventDefault()
note = $(this).closest(".note")
- note.find(".note-text").hide()
+ note.find(".note-body > .note-text").hide()
+ note.find(".note-header").hide()
+ base_form = note.find(".note-edit-form")
+ form = base_form.clone().insertAfter(base_form)
+ form.addClass('current-note-edit-form')
+ form.find('.div-dropzone').remove()
# Show the attachment delete link
note.find(".js-note-attachment-delete").show()
+
+ # Setup markdown form
GitLab.GfmAutoComplete.setup()
- form = note.find(".note-edit-form")
+ new DropzoneInput(form)
+
form.show()
textarea = form.find("textarea")
textarea.focus()
@@ -343,9 +298,9 @@ class @Notes
cancelEdit: (e) ->
e.preventDefault()
note = $(this).closest(".note")
- note.find(".note-text").show()
- note.find(".js-note-attachment-delete").hide()
- note.find(".note-edit-form").hide()
+ note.find(".note-body > .note-text").show()
+ note.find(".note-header").show()
+ note.find(".current-note-edit-form").remove()
###
Called in response to deleting a note of any kind.
@@ -377,7 +332,7 @@ class @Notes
removeAttachment: ->
note = $(this).closest(".note")
note.find(".note-attachment").remove()
- note.find(".note-text").show()
+ note.find(".note-body > .note-text").show()
note.find(".js-note-attachment-delete").hide()
note.find(".note-edit-form").hide()
@@ -424,7 +379,7 @@ class @Notes
###
addDiffNote: (e) =>
e.preventDefault()
- link = e.target
+ link = e.currentTarget
form = $(".js-new-note-form")
row = $(link).closest("tr")
nextRow = row.next()
@@ -451,6 +406,8 @@ class @Notes
removeDiscussionNoteForm: (form)->
row = form.closest("tr")
+ form.find(".js-note-text").data("autosave").reset()
+
# show the reply button (will only work for replies)
form.prev(".js-discussion-reply-button").show()
if row.is(".js-temp-notes-holder")
diff --git a/app/assets/javascripts/password_strength.js.coffee b/app/assets/javascripts/password_strength.js.coffee
deleted file mode 100644
index 825f5630266..00000000000
--- a/app/assets/javascripts/password_strength.js.coffee
+++ /dev/null
@@ -1,31 +0,0 @@
-#= require pwstrength-bootstrap-1.2.2
-overwritten_messages =
- wordSimilarToUsername: "Your password should not contain your username"
-
-overwritten_rules =
- wordSequences: false
-
-options =
- showProgressBar: false
- showVerdicts: false
- showPopover: true
- showErrors: true
- showStatus: true
- errorMessages: overwritten_messages
-
-$(document).ready ->
- profileOptions = {}
- profileOptions.ui = options
- profileOptions.rules =
- activated: overwritten_rules
-
- deviseOptions = {}
- deviseOptions.common =
- usernameField: "#user_username"
- deviseOptions.ui = options
- deviseOptions.rules =
- activated: overwritten_rules
-
- $("#user_password_profile").pwstrength profileOptions
- $("#user_password_sign_up").pwstrength deviseOptions
- $("#user_password_recover").pwstrength deviseOptions
diff --git a/app/assets/javascripts/project.js.coffee b/app/assets/javascripts/project.js.coffee
index 5a9cc66c8f0..eb8c1fa1426 100644
--- a/app/assets/javascripts/project.js.coffee
+++ b/app/assets/javascripts/project.js.coffee
@@ -16,5 +16,11 @@ class @Project
$('.hide-no-ssh-message').on 'click', (e) ->
path = '/'
$.cookie('hide_no_ssh_message', 'false', { path: path })
- $(@).parents('.no-ssh-key-message').hide()
+ $(@).parents('.no-ssh-key-message').remove()
+ e.preventDefault()
+
+ $('.hide-no-password-message').on 'click', (e) ->
+ path = '/'
+ $.cookie('hide_no_password_message', 'false', { path: path })
+ $(@).parents('.no-password-message').remove()
e.preventDefault()
diff --git a/app/assets/javascripts/project_avatar.js.coffee b/app/assets/javascripts/project_avatar.js.coffee
new file mode 100644
index 00000000000..8bec6e2ccca
--- /dev/null
+++ b/app/assets/javascripts/project_avatar.js.coffee
@@ -0,0 +1,9 @@
+class @ProjectAvatar
+ constructor: ->
+ $('.js-choose-project-avatar-button').bind 'click', ->
+ form = $(this).closest('form')
+ form.find('.js-project-avatar-input').click()
+ $('.js-project-avatar-input').bind 'change', ->
+ form = $(this).closest('form')
+ filename = $(this).val().replace(/^.*[\\\/]/, '')
+ form.find('.js-avatar-filename').text(filename)
diff --git a/app/assets/javascripts/project_fork.js.coffee b/app/assets/javascripts/project_fork.js.coffee
new file mode 100644
index 00000000000..e15a1c4ef76
--- /dev/null
+++ b/app/assets/javascripts/project_fork.js.coffee
@@ -0,0 +1,5 @@
+class @ProjectFork
+ constructor: ->
+ $('.fork-thumbnail a').on 'click', ->
+ $('.fork-namespaces').hide()
+ $('.save-project-loader').show()
diff --git a/app/assets/javascripts/project_new.js.coffee b/app/assets/javascripts/project_new.js.coffee
index f4a2ca813d2..836269c44f9 100644
--- a/app/assets/javascripts/project_new.js.coffee
+++ b/app/assets/javascripts/project_new.js.coffee
@@ -9,17 +9,3 @@ class @ProjectNew
initEvents: ->
disableButtonIfEmptyField '#project_name', '.project-submit'
-
- $('#project_issues_enabled').change ->
- if ($(this).is(':checked') == true)
- $('#project_issues_tracker').removeAttr('disabled')
- else
- $('#project_issues_tracker').attr('disabled', 'disabled')
-
- $('#project_issues_tracker').change()
-
- $('#project_issues_tracker').change ->
- if ($(this).val() == gon.default_issues_tracker || $(this).is(':disabled'))
- $('#project_issues_tracker_id').attr('disabled', 'disabled')
- else
- $('#project_issues_tracker_id').removeAttr('disabled')
diff --git a/app/assets/javascripts/project_show.js.coffee b/app/assets/javascripts/project_show.js.coffee
index 02a7d7b731d..d0eaaad92b8 100644
--- a/app/assets/javascripts/project_show.js.coffee
+++ b/app/assets/javascripts/project_show.js.coffee
@@ -6,7 +6,7 @@ class @ProjectShow
new Flash('Star toggle failed. Try again later.', 'alert')
$("a[data-toggle='tab']").on "shown.bs.tab", (e) ->
- $.cookie "default_view", $(e.target).attr("href")
+ $.cookie "default_view", $(e.target).attr("href"), { expires: 30 }
defaultView = $.cookie("default_view")
if defaultView
diff --git a/app/assets/javascripts/project_users_select.js.coffee b/app/assets/javascripts/project_users_select.js.coffee
index 7fb33926096..885f0d58a6a 100644
--- a/app/assets/javascripts/project_users_select.js.coffee
+++ b/app/assets/javascripts/project_users_select.js.coffee
@@ -15,7 +15,7 @@ class @ProjectUsersSelect
name: 'Unassigned',
avatar: null,
username: 'none',
- id: ''
+ id: -1
}
data.results.unshift(nullUser)
diff --git a/app/assets/javascripts/protected_branches.js.coffee b/app/assets/javascripts/protected_branches.js.coffee
new file mode 100644
index 00000000000..691fd4f10d8
--- /dev/null
+++ b/app/assets/javascripts/protected_branches.js.coffee
@@ -0,0 +1,21 @@
+$ ->
+ $(":checkbox").change ->
+ name = $(this).attr("name")
+ if name == "developers_can_push"
+ id = $(this).val()
+ checked = $(this).is(":checked")
+ url = $(this).data("url")
+ $.ajax
+ type: "PUT"
+ url: url
+ dataType: "json"
+ data:
+ id: id
+ developers_can_push: checked
+
+ success: ->
+ new Flash("Branch updated.", "notice")
+ location.reload true
+
+ error: ->
+ new Flash("Failed to update branch!", "alert")
diff --git a/app/assets/javascripts/sidebar.js.coffee b/app/assets/javascripts/sidebar.js.coffee
index c084d730d62..7febcba0e94 100644
--- a/app/assets/javascripts/sidebar.js.coffee
+++ b/app/assets/javascripts/sidebar.js.coffee
@@ -1,26 +1,14 @@
-responsive_resize = ->
- current_width = $(window).width()
- if current_width < 985
- $('.responsive-side').addClass("ui right wide sidebar")
+$(document).on("click", '.toggle-nav-collapse', (e) ->
+ e.preventDefault()
+ collapsed = 'page-sidebar-collapsed'
+ expanded = 'page-sidebar-expanded'
+
+ if $('.page-with-sidebar').hasClass(collapsed)
+ $('.page-with-sidebar').removeClass(collapsed).addClass(expanded)
+ $('.toggle-nav-collapse i').removeClass('fa-angle-right').addClass('fa-angle-left')
+ $.cookie("collapsed_nav", "false", { path: '/' })
else
- $('.responsive-side').removeClass("ui right wide sidebar")
-
-$ ->
- # Depending on window size, set the sidebar offscreen.
- responsive_resize()
-
- $('.sidebar-expand-button').click ->
- $('.ui.sidebar')
- .sidebar({overlay: true})
- .sidebar('toggle')
-
- # Hide sidebar on click outside of sidebar
- $(document).mouseup (e) ->
- container = $(".ui.sidebar")
- container.sidebar "hide" if not container.is(e.target) and container.has(e.target).length is 0
- return
-
-# On resize, check if sidebar should be offscreen.
-$(window).resize ->
- responsive_resize()
- return
+ $('.page-with-sidebar').removeClass(expanded).addClass(collapsed)
+ $('.toggle-nav-collapse i').removeClass('fa-angle-left').addClass('fa-angle-right')
+ $.cookie("collapsed_nav", "true", { path: '/' })
+)
diff --git a/app/assets/javascripts/stat_graph_contributors_graph.js.coffee b/app/assets/javascripts/stat_graph_contributors_graph.js.coffee
index 9952fa0b00a..8b82d20c6c2 100644
--- a/app/assets/javascripts/stat_graph_contributors_graph.js.coffee
+++ b/app/assets/javascripts/stat_graph_contributors_graph.js.coffee
@@ -46,7 +46,7 @@ class @ContributorsGraph
class @ContributorsMasterGraph extends ContributorsGraph
constructor: (@data) ->
- @width = $('.container').width() - 70
+ @width = $('.container').width() - 345
@height = 200
@x = null
@y = null
@@ -119,7 +119,7 @@ class @ContributorsMasterGraph extends ContributorsGraph
class @ContributorsAuthorGraph extends ContributorsGraph
constructor: (@data) ->
- @width = $('.container').width()/2 - 100
+ @width = $('.container').width()/2 - 225
@height = 200
@x = null
@y = null
diff --git a/app/assets/javascripts/team_members.js.coffee b/app/assets/javascripts/team_members.js.coffee
deleted file mode 100644
index 32486f7da54..00000000000
--- a/app/assets/javascripts/team_members.js.coffee
+++ /dev/null
@@ -1,4 +0,0 @@
-class @TeamMembers
- constructor: ->
- $('.team-members .project-access-select').on "change", ->
- $(this.form).submit()
diff --git a/app/assets/javascripts/zen_mode.js.coffee b/app/assets/javascripts/zen_mode.js.coffee
index 0c9942a4014..0fb8f7ed75f 100644
--- a/app/assets/javascripts/zen_mode.js.coffee
+++ b/app/assets/javascripts/zen_mode.js.coffee
@@ -10,7 +10,15 @@ class @ZenMode
if not @active_checkbox
@scroll_position = window.pageYOffset
- $('body').on 'change', '.zennable input[type=checkbox]', (e) =>
+ $('body').on 'click', '.zen-enter-link', (e) =>
+ e.preventDefault()
+ $(e.currentTarget).closest('.zennable').find('.zen-toggle-comment').prop('checked', true)
+
+ $('body').on 'click', '.zen-leave-link', (e) =>
+ e.preventDefault()
+ $(e.currentTarget).closest('.zennable').find('.zen-toggle-comment').prop('checked', false)
+
+ $('body').on 'change', '.zen-toggle-comment', (e) =>
checkbox = e.currentTarget
if checkbox.checked
# Disable other keyboard shortcuts in ZEN mode
@@ -32,8 +40,6 @@ class @ZenMode
@active_zen_area = @active_checkbox.parent().find('textarea')
@active_zen_area.focus()
window.location.hash = ZenMode.fullscreen_prefix + @active_checkbox.prop('id')
- # Disable dropzone in ZEN mode
- Dropzone.forElement('.div-dropzone').disable()
exitZenMode: =>
if @active_zen_area isnt null