gitlab-org--gitlab-foss/app/assets/javascripts/merge_request_tabs.js.coffee

109 lines
3.4 KiB
CoffeeScript
Raw Normal View History

class @MergeRequestTabs
diffsLoaded: false
commitsLoaded: false
constructor: (@opts) ->
@bindEvents()
@activateTabFromPath()
switch @opts.action
when 'commits' then @commitsLoaded = true
when 'diffs' then @diffsLoaded = true
bindEvents: ->
$(document).on 'shown.bs.tab', '.merge-request-tabs a[data-toggle="tab"]', @tabShow
tabShow: (event) =>
$target = $(event.target)
action = $target.data('action')
# Lazy-load commits
2015-06-21 22:57:04 +00:00
if action == 'commits' && !@commitsLoaded
@loadCommits()
# Lazy-load diffs
2015-06-21 22:57:04 +00:00
if action == 'diffs' && !@diffsLoaded
@loadDiff()
@setCurrentAction(action)
# Activate a tab based on the current URL path
#
# If the current action is 'show' or 'new' (i.e., initial page load),
# activates the first tab, otherwise activates the tab corresponding to the
# current action (diffs, commits).
activateTabFromPath: ->
if @opts.action == 'show' || @opts.action == 'new'
$('.merge-request-tabs a[data-toggle="tab"]:first').tab('show')
else
$(".merge-request-tabs a[data-action='#{@opts.action}']").tab('show')
# Replaces the current Merge Request-specific action in the URL with a new one
#
# If the action is "notes", the URL is reset to the standard
# `MergeRequests#show` route.
#
# Examples:
#
# location.pathname # => "/namespace/project/merge_requests/1"
# setCurrentAction('diffs')
# location.pathname # => "/namespace/project/merge_requests/1/diffs"
#
# location.pathname # => "/namespace/project/merge_requests/1/diffs"
# setCurrentAction('notes')
# location.pathname # => "/namespace/project/merge_requests/1"
#
# location.pathname # => "/namespace/project/merge_requests/1/diffs"
# setCurrentAction('commits')
# location.pathname # => "/namespace/project/merge_requests/1/commits"
setCurrentAction: (action) ->
# Normalize action, just to be safe
action = 'notes' if action == 'show'
# Remove a trailing '/commits' or '/diffs'
new_state = location.pathname.replace(/\/(commits|diffs)\/?$/, '')
# Append the new action if we're on a tab other than 'notes'
unless action == 'notes'
new_state += "/#{action}"
# Ensure parameters and hash come along for the ride
new_state += location.search + location.hash
# Replace the current history state with the new one without breaking
# Turbolinks' history.
#
# See https://github.com/rails/turbolinks/issues/363
history.replaceState {turbolinks: true, url: new_state}, document.title, new_state
loadCommits: ->
$.ajax
type: 'GET'
dataType: 'json'
url: $('.merge-request-tabs .commits-tab a').attr('href') + ".json"
beforeSend: @toggleLoading
complete: =>
@commits_loaded = true
@toggleLoading()
success: (data) =>
document.getElementById('commits').innerHTML = data.html
$('.js-timeago').timeago()
loadDiff: ->
$.ajax
type: 'GET'
dataType: 'json'
url: $('.merge-request-tabs .diffs-tab a').attr('href') + ".json"
beforeSend: => @toggleLoading()
complete: =>
@diffs_loaded = true
@toggleLoading()
success: (data) =>
document.getElementById('diffs').innerHTML = data.html
$('.diff-header').trigger('sticky_kit:recalc')
toggleLoading: ->
$('.mr-loading-status .loading').toggle()