automatically unfold lines starting or ending an highlight

This commit is contained in:
Damien Mathieu 2014-01-16 12:11:37 +01:00
parent 9571ce09e3
commit 5ef0302243
5 changed files with 67 additions and 14 deletions

View File

@ -48,8 +48,8 @@ Travis.reopen
console.log 'log view: create engine' if Log.DEBUG
@scroll = new Log.Scroll
@engine = Log.create(limit: Log.LIMIT, listeners: [@scroll])
@lineSelector = new Travis.LinesSelector(@$().find('#log'), @scroll)
@logFolder = new Travis.LogFolder(@$().find('#log'))
@lineSelector = new Travis.LinesSelector(@$().find('#log'), @scroll, @logFolder)
@observeParts()
observeParts: ->

View File

@ -10,10 +10,12 @@ class Travis.LinesSelector
element: null
scroll: null
location: null
view: null
last_selected_line: null
constructor: (@element, @scroll, location) ->
constructor: (@element, @scroll, @folder, location) ->
@location = location || @Location
Ember.run.scheduleOnce 'afterRender', this, ->
@last_selected_line = @getSelectedLines()?.first
@highlightLines()
@ -38,6 +40,13 @@ class Travis.LinesSelector
if lines = @getSelectedLines()
@element.find('p:visible').slice(lines.first - 1, lines.last).addClass('highlight')
@scroll.tryScroll()
@unfoldLines()
unfoldLines: ->
if lines = @getSelectedLines()
for index, l of lines
line = @element.find('p:visible').slice(l - 1, l)
@folder.unfold line
setHashValueWithLine: (line, multiple) ->
line_number = @getLineNumberFromElement(line)

View File

@ -1,8 +1,24 @@
class Travis.LogFolder
constructor: (@element) ->
@element.on 'click', '.fold', (event) =>
target = $(event.target).closest('.fold')
target.toggleClass('open')
folder = @getFolderFromLine $(event.target)
@toggle folder
event.preventDefault()
false
fold: (line) ->
folder = @getFolderFromLine(line)
if folder.hasClass('open')
@toggle(folder)
unfold: (line) ->
folder = @getFolderFromLine(line)
unless folder.hasClass('open')
@toggle(folder)
toggle: (folder) ->
folder.toggleClass('open')
getFolderFromLine: (line) ->
line.parent('.fold')

View File

@ -7,6 +7,7 @@ fakeLocation = {
fakeScroll =
tryScroll: sinon.spy()
fakeFolder = {}
element = jQuery('<div id="fakeLog">
<p><a></a>first line</p>
@ -16,6 +17,7 @@ element = jQuery('<div id="fakeLog">
module "Travis.LinesSelector",
setup: ->
fakeFolder.unfold = sinon.spy()
fakeLocation.hash = ''
jQuery('body').append(element)
@ -24,7 +26,7 @@ module "Travis.LinesSelector",
test "defaults to no line selected", ->
Ember.run ->
new Travis.LinesSelector(element, fakeScroll, fakeLocation)
new Travis.LinesSelector(element, fakeScroll, fakeFolder, fakeLocation)
wait().then ->
equal($('#fakeLog p.highlight').length, 0)
@ -32,7 +34,7 @@ test "defaults to no line selected", ->
test "defaults to a single line selected", ->
fakeLocation.hash = '#L2'
Ember.run ->
new Travis.LinesSelector(element, fakeScroll, fakeLocation)
new Travis.LinesSelector(element, fakeScroll, fakeFolder, fakeLocation)
wait().then ->
equal($('#fakeLog p.highlight').length, 1)
@ -41,7 +43,7 @@ test "defaults to a single line selected", ->
test "defaults to multiple lines selected", ->
fakeLocation.hash = '#L2-L3'
Ember.run ->
new Travis.LinesSelector(element, fakeScroll, fakeLocation)
new Travis.LinesSelector(element, fakeScroll, fakeFolder, fakeLocation)
wait().then ->
equal($('#fakeLog p.highlight').length, 2)
@ -50,7 +52,7 @@ test "defaults to multiple lines selected", ->
test "selects a single line", ->
Ember.run ->
new Travis.LinesSelector(element, fakeScroll, fakeLocation)
new Travis.LinesSelector(element, fakeScroll, fakeFolder, fakeLocation)
wait().then ->
equal($('#fakeLog p.highlight').length, 0)
@ -62,7 +64,7 @@ test "selects a single line", ->
test "selects multiple lines", ->
fakeLocation.hash = '#L2'
Ember.run ->
new Travis.LinesSelector(element, fakeScroll, fakeLocation)
new Travis.LinesSelector(element, fakeScroll, fakeFolder, fakeLocation)
wait().then ->
equal($('#fakeLog p.highlight').length, 1)
@ -79,7 +81,7 @@ test "selects multiple lines", ->
test "uses the last selected line as second selection line", ->
selector = null
Ember.run ->
selector = new Travis.LinesSelector(element, fakeScroll, fakeLocation)
selector = new Travis.LinesSelector(element, fakeScroll, fakeFolder, fakeLocation)
wait().then ->
$('#fakeLog p:last a').click()
@ -96,3 +98,11 @@ test "uses the last selected line as second selection line", ->
equal($('#fakeLog p:nth-child(3)').hasClass('highlight'), true)
equal('#L1-L3', fakeLocation.hash)
equal(1, selector.last_selected_line)
test "unfolds the first and last selected lines", ->
fakeLocation.hash = '#L1-L3'
Ember.run ->
new Travis.LinesSelector(element, fakeScroll, fakeFolder, fakeLocation)
wait().then ->
ok(fakeFolder.unfold.calledTwice, 'the first and last lines have been unfolded')

View File

@ -6,23 +6,24 @@ element = jQuery('<div id="fakeLog">
</div>
<p>fourth line</p>
</div>')
logFolder = null
module "Travis.LogFolder",
setup: ->
jQuery('body').append(element)
new Travis.LogFolder jQuery('#fakeLog')
logFolder = new Travis.LogFolder jQuery('#fakeLog')
teardown: ->
element.remove()
test "displays the fold", ->
equal($('#fakeLog .fold.open').length, 0)
$('#fakeLog .fold').click()
$('#fakeLog .fold p:first').click()
equal($('#fakeLog .fold.open').length, 1)
test "hides the fold", ->
$('#fakeLog .fold').addClass('open')
$('#fakeLog .fold').click()
$('#fakeLog .fold p:first').click()
equal($('#fakeLog .fold.open').length, 0)
test "binds new elements", ->
@ -32,5 +33,22 @@ test "binds new elements", ->
jQuery('#fakeLog').append new_element
equal($('#fakeLog .fold.open').length, 0)
$('#fakeLog .fold').click()
$('#fakeLog .fold p:first-child').click()
equal($('#fakeLog .fold.open').length, 2)
test "fold", ->
fold = jQuery('#fakeLog .fold')
line = fold.find('p:first')
fold.addClass('open')
equal(fold.hasClass('open'), true)
logFolder.fold(line)
equal(fold.hasClass('open'), false)
test "unfold", ->
fold = jQuery('#fakeLog .fold')
line = fold.find('p:first')
equal(fold.hasClass('open'), false)
logFolder.unfold(line)
equal(fold.hasClass('open'), true)