112 lines
2.4 KiB
JavaScript
112 lines
2.4 KiB
JavaScript
import Ember from 'ember';
|
|
|
|
export default (function() {
|
|
function Tailing(window1, tail_selector, log_selector) {
|
|
this.window = window1;
|
|
this.tail_selector = tail_selector;
|
|
this.log_selector = log_selector;
|
|
this.position = this.window.scrollTop();
|
|
this.window.scroll(() => {
|
|
return Ember.run.throttle(this, this.onScroll, [], 200, false);
|
|
});
|
|
return this;
|
|
}
|
|
|
|
Tailing.prototype.options = {
|
|
timeout: 200
|
|
};
|
|
|
|
Tailing.prototype.tail = function() {
|
|
return $(this.tail_selector);
|
|
};
|
|
|
|
Tailing.prototype.log = function() {
|
|
return $(this.log_selector);
|
|
};
|
|
|
|
|
|
|
|
Tailing.prototype.run = function() {
|
|
this.autoScroll();
|
|
this.positionButton();
|
|
if (this.active()) {
|
|
return Ember.run.later(this.run.bind(this), this.options.timeout);
|
|
}
|
|
};
|
|
|
|
Tailing.prototype.toggle = function() {
|
|
if (this.active()) {
|
|
return this.stop();
|
|
} else {
|
|
return this.start();
|
|
}
|
|
};
|
|
|
|
Tailing.prototype.active = function() {
|
|
return this.tail().hasClass('active');
|
|
};
|
|
|
|
Tailing.prototype.start = function() {
|
|
this.tail().addClass('active');
|
|
return this.run();
|
|
};
|
|
|
|
Tailing.prototype.isActive = function() {
|
|
return this.tail().hasClass('active');
|
|
};
|
|
|
|
Tailing.prototype.stop = function() {
|
|
return this.tail().removeClass('active');
|
|
};
|
|
|
|
Tailing.prototype.autoScroll = function() {
|
|
var logBottom, winBottom;
|
|
if (!this.active()) {
|
|
return false;
|
|
}
|
|
logBottom = this.log().offset().top + this.log().outerHeight() + 40;
|
|
winBottom = this.window.scrollTop() + this.window.height();
|
|
if (logBottom - winBottom > 0) {
|
|
this.window.scrollTop(logBottom - this.window.height());
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
};
|
|
|
|
Tailing.prototype.onScroll = function() {
|
|
var position;
|
|
this.positionButton();
|
|
position = this.window.scrollTop();
|
|
if (position < this.position) {
|
|
this.stop();
|
|
}
|
|
return this.position = position;
|
|
};
|
|
|
|
Tailing.prototype.positionButton = function() {
|
|
var max, offset, tail;
|
|
tail = $('#tail');
|
|
if (tail.length === 0) {
|
|
return;
|
|
}
|
|
offset = $(window).scrollTop() - $('#log').offset().top;
|
|
max = $('#log').height() - $('#tail').height() + 5;
|
|
if (offset > max) {
|
|
offset = max;
|
|
}
|
|
if (offset > 0) {
|
|
return tail.css({
|
|
top: offset - 2
|
|
});
|
|
} else {
|
|
return tail.css({
|
|
top: 0
|
|
});
|
|
}
|
|
};
|
|
|
|
return Tailing;
|
|
|
|
})();
|