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/contacts.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.Contact = (function(superClass) { extend(Contact, superClass); return Contact.__super__.constructor.apply(this, arguments); Contact.prototype.idAttribute = 'jid'; Contact.prototype.defaults = { Contact.prototype.initialize = function() { this.on('add change:avatar', function() { avatar = this.get('avatar'); if ((avatar != null ? avatar.mime : void 0) && (avatar != null ? avatar.data : void 0)) { return this.set('d/avatar', "data:" + avatar.mime + ";base64," + avatar.data); return this.unset('d/avatar'); this.on('add change:fullname change:nickname change:jid', function() { return this.set('d/handle', this.get('fullname') || this.get('nickname') || this.get('jid')); return this.on('add change:show change:presence', function() { return this.set('d/pip', this.has('show') ? this.get('show') : this.get('presence')); Tram.Contacts = (function(superClass) { extend(Contacts, superClass); return Contacts.__super__.constructor.apply(this, arguments); Contacts.prototype.model = Tram.Contact; Contacts.prototype.comparator = function(model) { if (model.get('presence') === 'unavailable') { } else if (model.get('type') === 'self') { Contacts.prototype.initialize = function() { return this.on('change:presence change:type', this.sort); Tram.AvatarView = (function(superClass) { extend(AvatarView, superClass); return AvatarView.__super__.constructor.apply(this, arguments); AvatarView.prototype.tagName = 'div'; AvatarView.prototype.className = 'vignette'; AvatarView.prototype.colors = Tram.colors.avatar; AvatarView.prototype.template = $('#avatar-template').html(); AvatarView.prototype.hash = function(string) { for (i = j = 0, ref = string.length; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) { result += string.charCodeAt(i); AvatarView.prototype.getHashedColors = function() { ci = this.hash(this.model.get('bjid')) % this.colors.length; return "color: white; background: " + this.colors[ci] + ";"; AvatarView.prototype.render = function() { this.$el.html(this.template); this.rivet = rivets.bind(this.el, { AvatarView.prototype.remove = function() { return AvatarView.__super__.remove.apply(this, arguments); Tram.ContactView = (function(superClass) { extend(ContactView, superClass); return ContactView.__super__.constructor.apply(this, arguments); ContactView.prototype.tagName = 'li'; ContactView.prototype.className = 'contact'; ContactView.prototype.template = $('#contact-template').html(); ContactView.prototype.colors = Tram.colors.presence; ContactView.prototype.initialize = function() { this.$el.attr('data-jid', this.model.get('jid')); this.$el.html(this.template); this.$avatarColumn = this.$('.avatar-column'); ContactView.prototype.bind = function() {}; ContactView.prototype.getPipStyle = function() { return "background: " + (this.colors[this.model.get('d/pip')] || this.colors['default']) + ";"; ContactView.prototype.render = function() { this.rivet = rivets.bind(this.el, { av = new Tram.AvatarView({ this.$avatarColumn.prepend(av.render().el); ContactView.prototype.remove = function() { return ContactView.__super__.remove.apply(this, arguments); Tram.ContactsApp = (function(superClass) { extend(ContactsApp, superClass); return ContactsApp.__super__.constructor.apply(this, arguments); ContactsApp.prototype.initialize = function() { this.listenTo(this.collection, 'add', this.onAdd); return this.listenTo(this.collection, 'sort', this.onSort); ContactsApp.prototype.onAdd = function(model, collection) { mi = collection.indexOf(model); model.view = new Tram.ContactView({ el = model.view.render().el; return this.$el.prepend(el); return this.$el.children().eq(mi - 1).after(el); ContactsApp.prototype.onSort = function(collection, options) { return collection.each((function(_this) { return _this.$el.append(model.view.el); //# sourceMappingURL=contacts.js.map