class Xmpp.Models.Contact extends Xmpp.Models.Model namespace: 'app.roster' defaults: jid: '' preferredJid: null name: '' status: 'offline' message: '' avatar: 'assets/avatar.png' belongsTo: [] usingMyApp: false initialize: -> _.bindAll(this) if ! @get('name') @set(name: @get('jid')) @set('id', @get('jid')) firstname: -> @get('name').split(' ')[0] setUsingMyApp: -> @set('usingMyApp', true) setPreferredResource: (jid) -> @set('preferredJid', jid) getPreferredResource: -> @get('preferredJid') || @get('jid') class Xmpp.Collections.ContactsCollection extends Backbone.Collection model: Xmpp.Models.Contact initialize: -> _.bindAll(this) @friendsList = new Xmpp.Views.Contacts.ListView(collection: this, attributes: {title: 'chat.roster.friends', id: 'js-inactive-friends'}) @friendsList.createListContainer() @activeList = new Xmpp.Views.Contacts.ListView(collection: this, attributes: {title: 'chat.roster.chat-group', id: 'js-active-friends'}) @activeList.setAsActiveChatGroup() @on('add', @appendContact) @on('change:belongsTo', @mergeContacts) Backbone.Events.on('openChat', (chat) => @moveToInactiveList('all') # App.debug chat @moveToActiveList(chat.get('withWhom')) ) Backbone.Events.on('closeChat', (chat) => @moveToInactiveList('all') ) appendContact: (contact) -> App.debug ['apppend', contact] @friendsList.appendContact(contact) mergeContacts: (contact) -> App.debug ['merging contacts', contact] #TODO: ak ten isty clovek je vo viacerych rosteroch, treba nastavit spravne belongsTo existingContact = @get(contact.get('id')) if existingContact? alreadyBelongsTo = existingContact.get('belongsTo') willBelongTo = contact.get('belongsTo') existingContact.set(belongsTo: _.union(alreadyBelongsTo, willBelongTo)) else @add(contact) moveToActiveList: (contacts) -> App.debug ['move to active list', contacts]; contacts = [contacts] unless _.isArray(contacts) _.each(contacts, (contact) => @_switchContactBelongingList(@get(contact), @friendsList, @activeList) && @activeList.reOrder() ) moveToInactiveList: (contact) -> if contact == 'all' _.each(@activeList.contactViews, (view) => @_switchContactBelongingList(view.model, @activeList, @friendsList) ) @friendsList.reOrder() else @_switchContactBelongingList(@get(contact), @activeList, @friendsList) && @friendsList.reOrder() updateStatus: (response) -> contact = @get(response.jid) return unless contact contact.set(message: response.status.message, status: response.status.status) if response.status.status == 'offline' contact.setPreferredResource(null) udpateVcard: (response) -> @get(response.jid).set(name: response.vcard.name, avatar: response.vcard.avatar) subscriptionChanged: (newSubscription) -> if (newSubscription.action == 'subscribed') App.debug ['subscribed', newSubscription] newContact = new Xmpp.Models.Contact( id: newSubscription.jid jid: newSubscription.jid belongsTo: [newSubscription.belongsTo] ) @mergeContacts(newContact) else if (newSubscription.action == 'unsubscribed') # TODO: show info and ask if user want to remove him from roster App.debug ['unsubscribed', newSubscription] contact = @get(newSubscription.jid) App.Com.removeContactRemote(contact.get('jid'), newSubscription.belongsTo) nowBelongsTo = _.without(contact.get('belongsTo'), newSubscription.belongsTo) if (nowBelongsTo.length == 0) Backbone.Events.trigger('removeContact', contact) @remove(contact) # ignore 'unsubscribe' type of action # toto sem asi nepatri, ale asi do views. Nic to v skutocnosti nerobi s modelmi. filter: (searchTerm) -> @friendsList.filter(searchTerm) @activeList.filter(searchTerm) findByJid: (jid) -> @get(jid) _switchContactBelongingList: (contact, fromList, toList) -> if !contact? false fromList.detachContact(contact) && toList.appendContact(contact) true