293:6635f14613ba
Anton Shestakov <av6@dwimlabs.net>, Wed, 01 Nov 2017 00:50:57 +0800
Makefile: use file targets more, results in incremental building Less work to do when only some files get changed, but more work when building from scratch. But, multiple compilers can run in parallel.

previous change 291:923afdc60aaf

js/messages.js

Permissions: -rw-r--r--

Other formats: Feeds:
// Generated by CoffeeScript 1.12.7
(function() {
var extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
hasProp = {}.hasOwnProperty;
Tram.Message = (function(superClass) {
extend(Message, superClass);
function Message() {
return Message.__super__.constructor.apply(this, arguments);
}
Message.prototype.defaults = function() {
return {
stamp: new Date()
};
};
Message.prototype.initialize = function() {
return this.on('add change:stamp', function() {
return this.set('d/mstamp', moment(this.get('stamp')));
});
};
return Message;
})(Backbone.Model);
Tram.Messages = (function(superClass) {
extend(Messages, superClass);
function Messages() {
return Messages.__super__.constructor.apply(this, arguments);
}
Messages.prototype.model = Tram.Message;
Messages.prototype.splitThreshold = 30 * 60 * 1000;
Messages.prototype.foldThreshold = 60 * 1000;
Messages.prototype.comparator = function(model) {
return model.get('stamp').valueOf();
};
Messages.prototype.initialize = function() {
return this.on('add', this.onAdd);
};
Messages.prototype.onAdd = function(model) {
var mi, next, prev;
mi = this.indexOf(model);
prev = this.models[mi - 1];
this._splitOrFold(prev, model);
next = this.models[mi + 1];
return this._splitOrFold(model, next);
};
Messages.prototype._splitOrFold = function(m1, m2) {
if (m2 == null) {
return;
}
if (m1 == null) {
m2.unset('d/split');
m2.unset('d/fold');
return;
}
if (this._splittable(m1, m2)) {
return m2.set('d/split', true);
} else {
m2.unset('d/split');
if (this._foldable(m1, m2)) {
return m2.set('d/fold', true);
} else {
return m2.unset('d/fold');
}
}
};
Messages.prototype._splittable = function(m1, m2) {
return Math.abs(m1.get('stamp').valueOf() - m2.get('stamp').valueOf()) > this.splitThreshold;
};
Messages.prototype._foldable = function(m1, m2) {
return m1.get('from') === m2.get('from') && Math.abs(m1.get('stamp').valueOf() - m2.get('stamp').valueOf()) < this.foldThreshold;
};
return Messages;
})(Backbone.Collection);
Tram.MessageView = (function(superClass) {
extend(MessageView, superClass);
function MessageView() {
return MessageView.__super__.constructor.apply(this, arguments);
}
MessageView.prototype.templateEl = $($('#message-template').html());
MessageView.prototype.initialize = function() {
this.setElement(this.templateEl.clone());
this.$avatarColumn = this.$('.avatar-column');
return this.bind();
};
MessageView.prototype.bind = function() {
return this.listenTo(this.model, 'change:contact', this.updateContact);
};
MessageView.prototype.updateContact = function() {
if ((this.model.previous('contact') == null) && (this.model.get('contact') != null)) {
this.av = new Tram.AvatarView({
model: contact
});
return this.$avatarColumn.prepend(this.av.render().el);
}
};
MessageView.prototype.render = function(model) {
var contact;
this.rivet = rivets.bind(this.el, {
message: this.model,
view: this
});
contact = this.model.get('contact');
if (contact) {
this.av = new Tram.AvatarView({
model: contact
});
this.$avatarColumn.prepend(this.av.render().el);
}
return this;
};
MessageView.prototype.remove = function() {
var ref;
if ((ref = this.av) != null) {
ref.remove();
}
this.rivet.unbind();
return MessageView.__super__.remove.apply(this, arguments);
};
return MessageView;
})(Backbone.View);
Tram.LogApp = (function(superClass) {
extend(LogApp, superClass);
function LogApp() {
return LogApp.__super__.constructor.apply(this, arguments);
}
LogApp.prototype.templateEl = $($('#chat-template').html());
LogApp.prototype.initialize = function() {
this.setElement(this.templateEl.clone());
this.$log = this.$('.log');
this.rivet = rivets.bind(this.el, {
model: this.model,
view: this
});
return this.bind();
};
LogApp.prototype.bind = function() {
return this.listenTo(this.collection, 'add', this.onAdd);
};
LogApp.prototype.onAdd = function(model, collection) {
var bottomed, el, mi, view;
bottomed = this.bottomed();
mi = collection.indexOf(model);
view = new Tram.MessageView({
model: model
});
el = view.render().el;
if (mi === 0) {
this.$log.prepend(el);
} else {
this.$log.children().eq(mi - 1).after(el);
}
if (bottomed) {
return this.scroll();
}
};
LogApp.prototype.bottomed = function() {
return this.$el.scrollTop() + this.$el.innerHeight() === this.el.scrollHeight;
};
LogApp.prototype.scroll = function() {
return this.$el.scrollTop(this.el.scrollHeight);
};
LogApp.prototype.remove = function() {
this.rivet.unbind();
return LogApp.__super__.remove.apply(this, arguments);
};
return LogApp;
})(Backbone.View);
}).call(this);
//# sourceMappingURL=messages.js.map