use travis-web-log/sf-dom
This commit is contained in:
parent
2013492371
commit
c0a4fed836
|
@ -3,19 +3,51 @@ require 'travis/ordered_log'
|
||||||
|
|
||||||
Log.DEBUG = true
|
Log.DEBUG = true
|
||||||
|
|
||||||
Travis.UnorderedLogEngineMixin = Ember.Mixin.create
|
Travis.reopen
|
||||||
setupEngine: ->
|
LogView: Travis.View.extend
|
||||||
console.log 'log view: create engine' if Log.DEBUG
|
templateName: 'jobs/log'
|
||||||
@limit = new Log.Limit
|
logBinding: 'job.log'
|
||||||
@scroll = new Log.Scroll
|
contextBinding: 'job'
|
||||||
@engine = Log.create(listeners: [new Log.FragmentRenderer, new Log.Folds, @scroll])
|
|
||||||
@observeParts()
|
|
||||||
@numberLineOnHover()
|
|
||||||
|
|
||||||
destroyEngine: ->
|
willDestroyElement: ->
|
||||||
|
job = @get('job')
|
||||||
|
job.unsubscribe() if job
|
||||||
|
|
||||||
|
toTop: () ->
|
||||||
|
$(window).scrollTop(0)
|
||||||
|
|
||||||
|
PreView: Em.View.extend(Travis.OrderedLogEngineMixin, {
|
||||||
|
templateName: 'jobs/pre'
|
||||||
|
|
||||||
|
didInsertElement: ->
|
||||||
|
console.log 'log view: did insert' if Log.DEBUG
|
||||||
|
@_super.apply this, arguments
|
||||||
|
@createEngine()
|
||||||
|
@lineNumberDidChange()
|
||||||
|
|
||||||
|
willDestroyElement: ->
|
||||||
|
console.log 'log view: will destroy' if Log.DEBUG
|
||||||
parts = @get('log.parts')
|
parts = @get('log.parts')
|
||||||
parts.removeArrayObserver(@, didChange: 'partsDidChange', willChange: 'noop')
|
parts.removeArrayObserver(@, didChange: 'partsDidChange', willChange: 'noop')
|
||||||
|
|
||||||
|
versionDidChange: (->
|
||||||
|
@rerender() if @get('inDOM')
|
||||||
|
).observes('log.version')
|
||||||
|
|
||||||
|
logDidChange: (->
|
||||||
|
console.log 'log view: log did change: rerender' if Log.DEBUG
|
||||||
|
@rerender() if @get('inDOM')
|
||||||
|
).observes('log')
|
||||||
|
|
||||||
|
createEngine: ->
|
||||||
|
console.log 'log view: create engine' if Log.DEBUG
|
||||||
|
# @limit = new Log.Limit
|
||||||
|
# @scroll = new Log.Scroll
|
||||||
|
# @engine = Log.create(listeners: [new Log.FragmentRenderer, new Log.Folds, @scroll])
|
||||||
|
@engine = new Log
|
||||||
|
@observeParts()
|
||||||
|
@numberLineOnHover()
|
||||||
|
|
||||||
observeParts: ->
|
observeParts: ->
|
||||||
parts = @get('log.parts')
|
parts = @get('log.parts')
|
||||||
parts.addArrayObserver(@, didChange: 'partsDidChange', willChange: 'noop')
|
parts.addArrayObserver(@, didChange: 'partsDidChange', willChange: 'noop')
|
||||||
|
@ -31,172 +63,13 @@ Travis.UnorderedLogEngineMixin = Ember.Mixin.create
|
||||||
@propertyDidChange('limited')
|
@propertyDidChange('limited')
|
||||||
|
|
||||||
lineNumberDidChange: (->
|
lineNumberDidChange: (->
|
||||||
@scroll.set(number) if !@get('isDestroyed') && number = @get('controller.lineNumber')
|
# @scroll.set(number) if !@get('isDestroyed') && number = @get('controller.lineNumber')
|
||||||
).observes('controller.lineNumber')
|
).observes('controller.lineNumber')
|
||||||
|
|
||||||
limited: (->
|
limited: (->
|
||||||
@limit && @limit.limited
|
@limit && @limit.limited
|
||||||
).property()
|
).property()
|
||||||
|
|
||||||
Travis.OrderedLogEngineMixin = Ember.Mixin.create
|
|
||||||
setupEngine: ->
|
|
||||||
@set('logManager', Travis.OrderedLog.create(target: this))
|
|
||||||
|
|
||||||
@get('logManager').append @get('log.parts')
|
|
||||||
|
|
||||||
@get('log.parts').addArrayObserver this,
|
|
||||||
didChange: 'partsDidChange'
|
|
||||||
willChange: 'noop'
|
|
||||||
|
|
||||||
destroyEngine: (view) ->
|
|
||||||
@get('logManager').destroy()
|
|
||||||
@get('log.parts').removeArrayObserver this,
|
|
||||||
didChange: 'partsDidChange'
|
|
||||||
willChange: 'noop'
|
|
||||||
|
|
||||||
partsDidChange: (parts, index, removedCount, addedCount) ->
|
|
||||||
addedParts = parts.slice(index, index + addedCount)
|
|
||||||
@get('logManager').append addedParts
|
|
||||||
|
|
||||||
lineNumberDidChange: (->
|
|
||||||
if number = @get('controller.lineNumber')
|
|
||||||
@tryScrollingToHashLineNumber(number)
|
|
||||||
).observes('controller.lineNumber')
|
|
||||||
|
|
||||||
scrollTo: (id) ->
|
|
||||||
# and this is even more weird, when changing hash in URL in firefox
|
|
||||||
# to other value, for example #L10, it actually scrolls just #main
|
|
||||||
# element... this is probably some CSS issue, I don't have time to
|
|
||||||
# investigate at the moment
|
|
||||||
# TODO: fix this
|
|
||||||
$('#main').scrollTop 0
|
|
||||||
|
|
||||||
# weird, html works in chrome, body in firefox
|
|
||||||
$('html,body').scrollTop $(id).offset().top
|
|
||||||
|
|
||||||
@set 'controller.lineNumber', null
|
|
||||||
|
|
||||||
tryScrollingToHashLineNumber: (number) ->
|
|
||||||
id = "#L#{number}"
|
|
||||||
checker = =>
|
|
||||||
return if @get('isDestroyed')
|
|
||||||
|
|
||||||
if $(id).length
|
|
||||||
@scrollTo(id)
|
|
||||||
else
|
|
||||||
setTimeout checker, 100
|
|
||||||
|
|
||||||
checker()
|
|
||||||
|
|
||||||
appendLog: (payloads) ->
|
|
||||||
url = @get('logUrl')
|
|
||||||
|
|
||||||
leftOut = []
|
|
||||||
cut = false
|
|
||||||
fragment = document.createDocumentFragment()
|
|
||||||
|
|
||||||
# TODO: refactor this loop, it's getting messy
|
|
||||||
for payload in payloads
|
|
||||||
line = payload.content
|
|
||||||
number = payload.number
|
|
||||||
|
|
||||||
if payload.logWasCut
|
|
||||||
cut = true
|
|
||||||
else
|
|
||||||
unless payload.append
|
|
||||||
pathWithNumber = "#{url}#L#{number}"
|
|
||||||
p = document.createElement('p')
|
|
||||||
p.innerHTML = "<a href=\"#{pathWithNumber}\" id=\"L#{number}\"></a>#{line}"
|
|
||||||
line = p
|
|
||||||
|
|
||||||
if payload.fold && !payload.foldContinuation
|
|
||||||
div = document.createElement('div')
|
|
||||||
div.appendChild line
|
|
||||||
div.className = "fold #{payload.fold} show-first-line"
|
|
||||||
line = div
|
|
||||||
|
|
||||||
if payload.replace
|
|
||||||
if link = fragment.querySelector("#L#{number}")
|
|
||||||
link.parentElement.innerHTML = line.innerHTML
|
|
||||||
else
|
|
||||||
this.$("#L#{number}").parent().replaceWith line
|
|
||||||
else if payload.append
|
|
||||||
if link = fragment.querySelector("#L#{number}")
|
|
||||||
link.parentElement.innerHTML += line
|
|
||||||
else
|
|
||||||
this.$("#L#{number}").parent().append line
|
|
||||||
else if payload.foldContinuation
|
|
||||||
folds = fragment.querySelectorAll(".fold.#{payload.fold}")
|
|
||||||
if fold = folds[folds.length - 1]
|
|
||||||
fold.appendChild line
|
|
||||||
else
|
|
||||||
this.$("#log .fold.#{payload.fold}:last").append line
|
|
||||||
else
|
|
||||||
fragment.appendChild(line)
|
|
||||||
|
|
||||||
if payload.openFold
|
|
||||||
folds = fragment.querySelectorAll(".fold.#{payload.openFold}")
|
|
||||||
if fold = folds[folds.length - 1]
|
|
||||||
fold = $(fold)
|
|
||||||
else
|
|
||||||
fold = this.$(".fold.#{payload.openFold}:last")
|
|
||||||
|
|
||||||
fold.removeClass('show-first-line').addClass('open')
|
|
||||||
|
|
||||||
if payload.foldEnd
|
|
||||||
folds = fragment.querySelectorAll(".fold.#{payload.fold}")
|
|
||||||
if fold = folds[folds.length - 1]
|
|
||||||
fold = $(fold)
|
|
||||||
else
|
|
||||||
fold = this.$(".fold.#{payload.fold}:last")
|
|
||||||
|
|
||||||
fold.removeClass('show-first-line')
|
|
||||||
|
|
||||||
this.$('#log')[0].appendChild fragment
|
|
||||||
if cut
|
|
||||||
url = Travis.Urls.plainTextLog(@get('log.id'))
|
|
||||||
this.$("#log").append $("<p class=\"cut\">Log was too long to display. Download the <a href=\"#{url}\">the raw version</a> to get the full log.</p>")
|
|
||||||
|
|
||||||
Travis.reopen
|
|
||||||
LogView: Travis.View.extend
|
|
||||||
templateName: 'jobs/log'
|
|
||||||
logBinding: 'job.log'
|
|
||||||
contextBinding: 'job'
|
|
||||||
|
|
||||||
didInsertElement: ->
|
|
||||||
job = @get('job')
|
|
||||||
job.subscribe() if job && !job.get('isFinished')
|
|
||||||
|
|
||||||
willDestroyElement: ->
|
|
||||||
job = @get('job')
|
|
||||||
job.unsubscribe() if job
|
|
||||||
|
|
||||||
toTop: () ->
|
|
||||||
$(window).scrollTop(0)
|
|
||||||
|
|
||||||
PreView: Em.View.extend(Travis.OrderedLogEngineMixin, {
|
|
||||||
templateName: 'jobs/pre'
|
|
||||||
|
|
||||||
didInsertElement: ->
|
|
||||||
console.log 'log view: did insert' if Log.DEBUG
|
|
||||||
@_super.apply this, arguments
|
|
||||||
@setupEngine()
|
|
||||||
@lineNumberDidChange()
|
|
||||||
|
|
||||||
willDestroyElement: ->
|
|
||||||
console.log 'log view: will destroy' if Log.DEBUG
|
|
||||||
@destroyEngine()
|
|
||||||
|
|
||||||
versionDidChange: (->
|
|
||||||
@rerender() if @get('inDOM')
|
|
||||||
).observes('log.version')
|
|
||||||
|
|
||||||
logDidChange: (->
|
|
||||||
console.log 'log view: log did change: rerender' if Log.DEBUG
|
|
||||||
@rerender() if @get('inDOM')
|
|
||||||
).observes('log')
|
|
||||||
|
|
||||||
|
|
||||||
plainTextLogUrl: (->
|
plainTextLogUrl: (->
|
||||||
Travis.Urls.plainTextLog(id) if id = @get('log.job.id')
|
Travis.Urls.plainTextLog(id) if id = @get('log.job.id')
|
||||||
).property('job.log.id')
|
).property('job.log.id')
|
||||||
|
@ -218,55 +91,42 @@ Travis.reopen
|
||||||
target = $(event.target)
|
target = $(event.target)
|
||||||
target.closest('.fold').toggleClass('open')
|
target.closest('.fold').toggleClass('open')
|
||||||
|
|
||||||
logUrl: (->
|
|
||||||
if item = @get('controller.currentItem')
|
|
||||||
if repo = item.get('repo')
|
|
||||||
name = if item.constructor == Travis.Build
|
|
||||||
'build'
|
|
||||||
else
|
|
||||||
'job'
|
|
||||||
|
|
||||||
Travis.__container__.lookup('router:main').generate(name, repo, item)
|
|
||||||
).property('controller.currentItem.repo', 'controller.currentItem')
|
|
||||||
|
|
||||||
lineNumberClicked: (number) ->
|
lineNumberClicked: (number) ->
|
||||||
path = @get('logUrl') + "#L#{number}"
|
window.history.pushState(null, null, "#{window.location.pathname}#L#{number}");
|
||||||
window.history.replaceState({ path: path }, null, path);
|
|
||||||
@set('controller.lineNumber', number)
|
@set('controller.lineNumber', number)
|
||||||
|
|
||||||
noop: -> # TODO required?
|
noop: -> # TODO required?
|
||||||
})
|
|
||||||
|
|
||||||
Log.Scroll = ->
|
# Log.Scroll = ->
|
||||||
Log.Scroll.prototype = $.extend new Log.Listener,
|
# Log.Scroll.prototype = $.extend new Log.Listener,
|
||||||
set: (number) ->
|
# set: (number) ->
|
||||||
return unless number
|
# return unless number
|
||||||
@number = number
|
# @number = number
|
||||||
@tryScroll()
|
# @tryScroll()
|
||||||
|
#
|
||||||
insert: (log, line, pos) ->
|
# insert: (log, line, pos) ->
|
||||||
@tryScroll() if @number
|
# @tryScroll() if @number
|
||||||
true
|
# true
|
||||||
|
#
|
||||||
tryScroll: ->
|
# tryScroll: ->
|
||||||
if element = $("#log p:visible")[@number - 1]
|
# if element = $("#log p:visible")[@number - 1]
|
||||||
$('#main').scrollTop(0)
|
# $('#main').scrollTop(0)
|
||||||
$('html, body').scrollTop($(element).offset()?.top) # weird, html works in chrome, body in firefox
|
# $('html, body').scrollTop($(element).offset()?.top) # weird, html works in chrome, body in firefox
|
||||||
@highlight(element)
|
# @highlight(element)
|
||||||
@number = undefined
|
# @number = undefined
|
||||||
|
#
|
||||||
highlight: (element) ->
|
# highlight: (element) ->
|
||||||
$('#log p.highlight').removeClass('highlight')
|
# $('#log p.highlight').removeClass('highlight')
|
||||||
$(element).addClass('highlight')
|
# $(element).addClass('highlight')
|
||||||
|
#
|
||||||
Log.Logger = ->
|
# Log.Logger = ->
|
||||||
Log.Logger.prototype = $.extend new Log.Listener,
|
# Log.Logger.prototype = $.extend new Log.Listener,
|
||||||
receive: (log, num, string) ->
|
# receive: (log, num, string) ->
|
||||||
@log("rcv #{num} #{JSON.stringify(string)}")
|
# @log("rcv #{num} #{JSON.stringify(string)}")
|
||||||
true
|
# true
|
||||||
insert: (log, element, pos) ->
|
# insert: (log, element, pos) ->
|
||||||
@log("ins #{element.id}, #{if pos.before then 'before' else 'after'}: #{pos.before || pos.after || '?'}, #{JSON.stringify(element)}")
|
# @log("ins #{element.id}, #{if pos.before then 'before' else 'after'}: #{pos.before || pos.after || '?'}, #{JSON.stringify(element)}")
|
||||||
remove: (log, element) ->
|
# remove: (log, element) ->
|
||||||
@log("rem #{element.id}")
|
# @log("rem #{element.id}")
|
||||||
log: (line) ->
|
# log: (line) ->
|
||||||
console.log(line)
|
# console.log(line)
|
||||||
|
|
2
assets/scripts/vendor/log.js
vendored
2
assets/scripts/vendor/log.js
vendored
File diff suppressed because one or more lines are too long
|
@ -6,6 +6,9 @@
|
||||||
.display-inline
|
.display-inline
|
||||||
display: inline-block !important
|
display: inline-block !important
|
||||||
|
|
||||||
|
.hidden
|
||||||
|
display: none
|
||||||
|
|
||||||
.emoji
|
.emoji
|
||||||
vertical-align: middle
|
vertical-align: middle
|
||||||
width: 20px
|
width: 20px
|
||||||
|
|
Loading…
Reference in New Issue
Block a user