Anton Shestakov <av6@dwimlabs.net>, Wed, 23 Mar 2016 16:55:52 +0800
index: maintain only one contact with type 'self'
This isn't done in an event handler of contacts collection because doing it in
'add' handler would trigger 'sort' event after the model has been added, but
before its 'add' event has propagated, and that's dumb.
js/messages.js
Permissions: -rw-r--r--
// Generated by CoffeeScript 1.10.0 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); return Message.__super__.constructor.apply(this, arguments); Message.prototype.initialize = function() { return this.on('add change:stamp', function() { return this.set('d/mstamp', moment(this.get('stamp'))); return this.unset('d/mstamp'); Tram.Messages = (function(superClass) { extend(Messages, superClass); 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) { 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 (this._splittable(m1, m2)) { return m2.set('d/split', true); } else if (this._foldable(m1, m2)) { return m2.set('d/fold', true); 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; Tram.MessageView = (function(superClass) { extend(MessageView, superClass); return MessageView.__super__.constructor.apply(this, arguments); MessageView.prototype.tagName = 'div'; MessageView.prototype.className = 'message'; MessageView.prototype.template = $('#message-template').html(); MessageView.prototype.initialize = function() { this.$el.html(this.template); this.$avatarColumn = this.$('.avatar-column'); 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)) { av = new Tram.AvatarView({ return this.$avatarColumn.prepend(av.render().el); MessageView.prototype.getHandle = function() { return ((ref = this.model.get('contact')) != null ? ref.get('d/handle') : void 0) || this.model.get('from'); MessageView.prototype.render = function(model) { this.rivet = rivets.bind(this.el, { contact = this.model.get('contact'); av = new Tram.AvatarView({ this.$avatarColumn.prepend(av.render().el); MessageView.prototype.remove = function() { return MessageView.__super__.remove.apply(this, arguments); Tram.LogApp = (function(superClass) { extend(LogApp, superClass); return LogApp.__super__.constructor.apply(this, arguments); LogApp.prototype.initialize = function() { return this.listenTo(this.collection, 'add', this.onAdd); LogApp.prototype.onAdd = function(model, collection) { mi = collection.indexOf(model); view = new Tram.MessageView({ this.$el.children().eq(mi - 1).after(el); LogApp.prototype.bottomed = function() { return this.$el.scrollTop() + this.$el.height() === this.$el.get(0).scrollHeight; LogApp.prototype.scroll = function() { return this.$el.scrollTop(this.$el.get(0).scrollHeight); //# sourceMappingURL=messages.js.map