Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Boxiang Sun
gitlab-ce
Commits
d71d3b8c
Commit
d71d3b8c
authored
Jul 25, 2016
by
Annabel Dunstone
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Convert to javascript
parent
db19e720
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
24 additions
and
411 deletions
+24
-411
app/assets/javascripts/merge_request_tabs.js
app/assets/javascripts/merge_request_tabs.js
+23
-1
app/assets/javascripts/merge_request_tabs.js.coffee
app/assets/javascripts/merge_request_tabs.js.coffee
+0
-266
app/assets/javascripts/merge_request_widget.js
app/assets/javascripts/merge_request_widget.js
+1
-1
app/assets/javascripts/merge_request_widget.js.coffee
app/assets/javascripts/merge_request_widget.js.coffee
+0
-143
No files found.
app/assets/javascripts/merge_request_tabs.js
View file @
d71d3b8c
...
...
@@ -9,6 +9,8 @@
MergeRequestTabs
.
prototype
.
buildsLoaded
=
false
;
MergeRequestTabs
.
prototype
.
pipelinesLoaded
=
false
;
MergeRequestTabs
.
prototype
.
commitsLoaded
=
false
;
function
MergeRequestTabs
(
opts
)
{
...
...
@@ -50,6 +52,9 @@
}
else
if
(
action
===
'
builds
'
)
{
this
.
loadBuilds
(
$target
.
attr
(
'
href
'
));
this
.
expandView
();
}
else
if
(
action
===
'
pipelines
'
)
{
this
.
loadPipelines
(
$target
.
attr
(
'
href
'
));
this
.
expandView
();
}
else
{
this
.
expandView
();
}
...
...
@@ -81,7 +86,7 @@
if
(
action
===
'
show
'
)
{
action
=
'
notes
'
;
}
new_state
=
this
.
_location
.
pathname
.
replace
(
/
\/(
commits|diffs|builds
)(\.
html
)?\/?
$/
,
''
);
new_state
=
this
.
_location
.
pathname
.
replace
(
/
\/(
commits|diffs|builds
|pipelines
)(\.
html
)?\/?
$/
,
''
);
if
(
action
!==
'
notes
'
)
{
new_state
+=
"
/
"
+
action
;
}
...
...
@@ -177,6 +182,23 @@
});
};
MergeRequestTabs
.
prototype
.
loadPipelines
=
function
(
source
)
{
if
(
this
.
pipelinesLoaded
)
{
return
;
}
return
this
.
_get
({
url
:
source
+
"
.json
"
,
success
:
(
function
(
_this
)
{
return
function
(
data
)
{
document
.
querySelector
(
"
div#pipelines
"
).
innerHTML
=
data
.
html
;
gl
.
utils
.
localTimeAgo
(
$
(
'
.js-timeago
'
,
'
div#pipelines
'
));
_this
.
pipelinesLoaded
=
true
;
return
_this
.
scrollToElement
(
"
#pipelines
"
);
};
})(
this
)
});
};
MergeRequestTabs
.
prototype
.
toggleLoading
=
function
(
status
)
{
return
$
(
'
.mr-loading-status .loading
'
).
toggle
(
status
);
};
...
...
app/assets/javascripts/merge_request_tabs.js.coffee
deleted
100644 → 0
View file @
db19e720
# MergeRequestTabs
#
# Handles persisting and restoring the current tab selection and lazily-loading
# content on the MergeRequests#show page.
#
#= require jquery.cookie
#
# ### Example Markup
#
# <ul class="nav-links merge-request-tabs">
# <li class="notes-tab active">
# <a data-action="notes" data-target="#notes" data-toggle="tab" href="/foo/bar/merge_requests/1">
# Discussion
# </a>
# </li>
# <li class="commits-tab">
# <a data-action="commits" data-target="#commits" data-toggle="tab" href="/foo/bar/merge_requests/1/commits">
# Commits
# </a>
# </li>
# <li class="diffs-tab">
# <a data-action="diffs" data-target="#diffs" data-toggle="tab" href="/foo/bar/merge_requests/1/diffs">
# Diffs
# </a>
# </li>
# </ul>
#
# <div class="tab-content">
# <div class="notes tab-pane active" id="notes">
# Notes Content
# </div>
# <div class="commits tab-pane" id="commits">
# Commits Content
# </div>
# <div class="diffs tab-pane" id="diffs">
# Diffs Content
# </div>
# </div>
#
# <div class="mr-loading-status">
# <div class="loading">
# Loading Animation
# </div>
# </div>
#
class
@
MergeRequestTabs
diffsLoaded
:
false
buildsLoaded
:
false
commitsLoaded
:
false
constructor
:
(
@
opts
=
{})
->
# Store the `location` object, allowing for easier stubbing in tests
@
_location
=
location
@
bindEvents
()
@
activateTab
(
@
opts
.
action
)
bindEvents
:
->
$
(
document
).
on
'shown.bs.tab'
,
'.merge-request-tabs a[data-toggle="tab"]'
,
@
tabShown
$
(
document
).
on
'click'
,
'.js-show-tab'
,
@
showTab
showTab
:
(
event
)
=>
event
.
preventDefault
()
@
activateTab
$
(
event
.
target
).
data
(
'action'
)
tabShown
:
(
event
)
=>
$target
=
$
(
event
.
target
)
action
=
$target
.
data
(
'action'
)
if
action
==
'commits'
@
loadCommits
(
$target
.
attr
(
'href'
))
@
expandView
()
else
if
action
==
'diffs'
@
loadDiff
(
$target
.
attr
(
'href'
))
if
bp
?
and
bp
.
getBreakpointSize
()
isnt
'lg'
@
shrinkView
()
navBarHeight
=
$
(
'.navbar-gitlab'
).
outerHeight
()
$
.
scrollTo
(
".merge-request-details .merge-request-tabs"
,
offset
:
-
navBarHeight
)
else
if
action
==
'builds'
@
loadBuilds
(
$target
.
attr
(
'href'
))
@
expandView
()
else
if
action
==
'pipelines'
@
loadPipelines
(
$target
.
attr
(
'href'
))
@
expandView
()
else
@
expandView
()
@
setCurrentAction
(
action
)
scrollToElement
:
(
container
)
->
if
window
.
location
.
hash
navBarHeight
=
$
(
'.navbar-gitlab'
).
outerHeight
()
+
$
(
'.layout-nav'
).
outerHeight
()
$el
=
$
(
"
#{
container
}
#{
window
.
location
.
hash
}
:not(.match)"
)
$
.
scrollTo
(
"
#{
container
}
#{
window
.
location
.
hash
}
:not(.match)"
,
offset
:
-
navBarHeight
)
if
$el
.
length
# Activate a tab based on the current action
activateTab
:
(
action
)
->
action
=
'notes'
if
action
==
'show'
$
(
".merge-request-tabs a[data-action='
#{
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"
#
# Returns the new URL String
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|builds|pipelines)(\.html)?\/?$/
,
''
)
# 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
new_state
loadCommits
:
(
source
)
->
return
if
@
commitsLoaded
@
_get
url
:
"
#{
source
}
.json"
success
:
(
data
)
=>
document
.
querySelector
(
"div#commits"
).
innerHTML
=
data
.
html
gl
.
utils
.
localTimeAgo
(
$
(
'.js-timeago'
,
'div#commits'
))
@
commitsLoaded
=
true
@
scrollToElement
(
"#commits"
)
loadDiff
:
(
source
)
->
return
if
@
diffsLoaded
@
_get
url
:
"
#{
source
}
.json"
+
@
_location
.
search
success
:
(
data
)
=>
$
(
'#diffs'
).
html
data
.
html
gl
.
utils
.
localTimeAgo
(
$
(
'.js-timeago'
,
'div#diffs'
))
$
(
'#diffs .js-syntax-highlight'
).
syntaxHighlight
()
$
(
'#diffs .diff-file'
).
singleFileDiff
()
@
expandViewContainer
()
if
@
diffViewType
()
is
'parallel'
@
diffsLoaded
=
true
@
scrollToElement
(
"#diffs"
)
@
highlighSelectedLine
()
@
filesCommentButton
=
$
(
'.files .diff-file'
).
filesCommentButton
()
$
(
document
)
.
off
'click'
,
'.diff-line-num a'
.
on
'click'
,
'.diff-line-num a'
,
(
e
)
=>
e
.
preventDefault
()
window
.
location
.
hash
=
$
(
e
.
currentTarget
).
attr
'href'
@
highlighSelectedLine
()
@
scrollToElement
(
"#diffs"
)
highlighSelectedLine
:
->
$
(
'.hll'
).
removeClass
'hll'
locationHash
=
window
.
location
.
hash
if
locationHash
isnt
''
hashClassString
=
".
#{
locationHash
.
replace
(
'#'
,
''
)
}
"
$diffLine
=
$
(
"
#{
locationHash
}
:not(.match)"
,
$
(
'#diffs'
))
if
not
$diffLine
.
is
'tr'
$diffLine
=
$
(
'#diffs'
).
find
(
"td
#{
locationHash
}
, td
#{
hashClassString
}
"
)
else
$diffLine
=
$diffLine
.
find
(
'td'
)
if
$diffLine
.
length
$diffLine
.
addClass
'hll'
diffLineTop
=
$diffLine
.
offset
().
top
navBarHeight
=
$
(
'.navbar-gitlab'
).
outerHeight
()
loadBuilds
:
(
source
)
->
return
if
@
buildsLoaded
@
_get
url
:
"
#{
source
}
.json"
success
:
(
data
)
=>
document
.
querySelector
(
"div#builds"
).
innerHTML
=
data
.
html
gl
.
utils
.
localTimeAgo
(
$
(
'.js-timeago'
,
'div#builds'
))
@
buildsLoaded
=
true
@
scrollToElement
(
"#builds"
)
loadPipelines
:
(
source
)
->
return
if
@
pipelinesLoaded
@
_get
url
:
"
#{
source
}
.json"
success
:
(
data
)
=>
document
.
querySelector
(
"div#pipelines"
).
innerHTML
=
data
.
html
gl
.
utils
.
localTimeAgo
(
$
(
'.js-timeago'
,
'div#pipelines'
))
@
pipelinesLoaded
=
true
@
scrollToElement
(
"#pipelines"
)
# Show or hide the loading spinner
#
# status - Boolean, true to show, false to hide
toggleLoading
:
(
status
)
->
$
(
'.mr-loading-status .loading'
).
toggle
(
status
)
_get
:
(
options
)
->
defaults
=
{
beforeSend
:
=>
@
toggleLoading
(
true
)
complete
:
=>
@
toggleLoading
(
false
)
dataType
:
'json'
type
:
'GET'
}
options
=
$
.
extend
({},
defaults
,
options
)
$
.
ajax
(
options
)
# Returns diff view type
diffViewType
:
->
$
(
'.inline-parallel-buttons a.active'
).
data
(
'view-type'
)
expandViewContainer
:
->
$
(
'.container-fluid'
).
removeClass
(
'container-limited'
)
shrinkView
:
->
$gutterIcon
=
$
(
'.js-sidebar-toggle i:visible'
)
# Wait until listeners are set
setTimeout
(
->
# Only when sidebar is expanded
if
$gutterIcon
.
is
(
'.fa-angle-double-right'
)
$gutterIcon
.
closest
(
'a'
).
trigger
(
'click'
,
[
true
])
,
0
)
# Expand the issuable sidebar unless the user explicitly collapsed it
expandView
:
->
return
if
$
.
cookie
(
'collapsed_gutter'
)
==
'true'
$gutterIcon
=
$
(
'.js-sidebar-toggle i:visible'
)
# Wait until listeners are set
setTimeout
(
->
# Only when sidebar is collapsed
if
$gutterIcon
.
is
(
'.fa-angle-double-left'
)
$gutterIcon
.
closest
(
'a'
).
trigger
(
'click'
,
[
true
])
,
0
)
app/assets/javascripts/merge_request_widget.js
View file @
d71d3b8c
...
...
@@ -28,7 +28,7 @@
MergeRequestWidget
.
prototype
.
addEventListeners
=
function
()
{
var
allowedPages
;
allowedPages
=
[
'
show
'
,
'
commits
'
,
'
builds
'
,
'
changes
'
];
allowedPages
=
[
'
show
'
,
'
commits
'
,
'
builds
'
,
'
pipelines
'
,
'
changes
'
];
return
$
(
document
).
on
(
'
page:change.merge_request
'
,
(
function
(
_this
)
{
return
function
()
{
var
page
;
...
...
app/assets/javascripts/merge_request_widget.js.coffee
deleted
100644 → 0
View file @
db19e720
class
@
MergeRequestWidget
# Initialize MergeRequestWidget behavior
#
# check_enable - Boolean, whether to check automerge status
# merge_check_url - String, URL to use to check automerge status
# ci_status_url - String, URL to use to check CI status
#
constructor
:
(
@
opts
)
->
$
(
'#modal_merge_info'
).
modal
(
show
:
false
)
@
firstCICheck
=
true
@
readyForCICheck
=
false
@
cancel
=
false
clearInterval
@
fetchBuildStatusInterval
@
clearEventListeners
()
@
addEventListeners
()
@
getCIStatus
(
false
)
@
pollCIStatus
()
notifyPermissions
()
clearEventListeners
:
->
$
(
document
).
off
'page:change.merge_request'
cancelPolling
:
->
@
cancel
=
true
addEventListeners
:
->
allowedPages
=
[
'show'
,
'commits'
,
'builds'
,
'pipelines'
,
'changes'
]
$
(
document
).
on
'page:change.merge_request'
,
=>
page
=
$
(
'body'
).
data
(
'page'
).
split
(
':'
).
last
()
if
allowedPages
.
indexOf
(
page
)
<
0
clearInterval
@
fetchBuildStatusInterval
@
cancelPolling
()
@
clearEventListeners
()
mergeInProgress
:
(
deleteSourceBranch
=
false
)
->
$
.
ajax
type
:
'GET'
url
:
$
(
'.merge-request'
).
data
(
'url'
)
success
:
(
data
)
=>
if
data
.
state
==
"merged"
urlSuffix
=
if
deleteSourceBranch
then
'?delete_source=true'
else
''
window
.
location
.
href
=
window
.
location
.
pathname
+
urlSuffix
else
if
data
.
merge_error
$
(
'.mr-widget-body'
).
html
(
"<h4>"
+
data
.
merge_error
+
"</h4>"
)
else
callback
=
->
merge_request_widget
.
mergeInProgress
(
deleteSourceBranch
)
setTimeout
(
callback
,
2000
)
dataType
:
'json'
getMergeStatus
:
->
$
.
get
@
opts
.
merge_check_url
,
(
data
)
->
$
(
'.mr-state-widget'
).
replaceWith
(
data
)
ciLabelForStatus
:
(
status
)
->
switch
status
when
'success'
'passed'
when
'success_with_warnings'
'passed with warnings'
else
status
pollCIStatus
:
->
@
fetchBuildStatusInterval
=
setInterval
(
=>
return
if
not
@
readyForCICheck
@
getCIStatus
(
true
)
@
readyForCICheck
=
false
),
10000
getCIStatus
:
(
showNotification
)
->
_this
=
@
$
(
'.ci-widget-fetching'
).
show
()
$
.
getJSON
@
opts
.
ci_status_url
,
(
data
)
=>
return
if
@
cancel
@
readyForCICheck
=
true
if
data
.
status
is
''
return
if
@
firstCICheck
||
data
.
status
isnt
@
opts
.
ci_status
and
data
.
status
?
@
opts
.
ci_status
=
data
.
status
@
showCIStatus
data
.
status
if
data
.
coverage
@
showCICoverage
data
.
coverage
# The first check should only update the UI, a notification
# should only be displayed on status changes
if
showNotification
and
not
@
firstCICheck
status
=
@
ciLabelForStatus
(
data
.
status
)
if
status
is
"preparing"
title
=
@
opts
.
ci_title
.
preparing
status
=
status
.
charAt
(
0
).
toUpperCase
()
+
status
.
slice
(
1
);
message
=
@
opts
.
ci_message
.
preparing
.
replace
(
'{{status}}'
,
status
)
else
title
=
@
opts
.
ci_title
.
normal
message
=
@
opts
.
ci_message
.
normal
.
replace
(
'{{status}}'
,
status
)
title
=
title
.
replace
(
'{{status}}'
,
status
)
message
=
message
.
replace
(
'{{sha}}'
,
data
.
sha
)
message
=
message
.
replace
(
'{{title}}'
,
data
.
title
)
notify
(
title
,
message
,
@
opts
.
gitlab_icon
,
->
@
close
()
Turbolinks
.
visit
_this
.
opts
.
builds_path
)
@
firstCICheck
=
false
showCIStatus
:
(
state
)
->
return
if
not
state
?
$
(
'.ci_widget'
).
hide
()
allowed_states
=
[
"failed"
,
"canceled"
,
"running"
,
"pending"
,
"success"
,
"success_with_warnings"
,
"skipped"
,
"not_found"
]
if
state
in
allowed_states
$
(
'.ci_widget.ci-'
+
state
).
show
()
switch
state
when
"failed"
,
"canceled"
,
"not_found"
@
setMergeButtonClass
(
'btn-danger'
)
when
"running"
@
setMergeButtonClass
(
'btn-warning'
)
when
"success"
,
"success_with_warnings"
@
setMergeButtonClass
(
'btn-create'
)
else
$
(
'.ci_widget.ci-error'
).
show
()
@
setMergeButtonClass
(
'btn-danger'
)
showCICoverage
:
(
coverage
)
->
text
=
'Coverage '
+
coverage
+
'%'
$
(
'.ci_widget:visible .ci-coverage'
).
text
(
text
)
setMergeButtonClass
:
(
css_class
)
->
$
(
'.js-merge-button,.accept-action .dropdown-toggle'
)
.
removeClass
(
'btn-danger btn-warning btn-create'
)
.
addClass
(
css_class
)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment