Merge branch 'hotfix/21.56.9' into master
[gitter.git] / public / js / collections / groups.js
blob20d0902a7ed253dda23d73fea8ae6724670cf389
1 'use strict';
3 var Backbone = require('backbone');
4 var LiveCollection = require('gitter-realtime-client').LiveCollection;
5 var realtime = require('../components/realtime');
6 var SyncMixin = require('./sync-mixin');
7 var context = require('gitter-web-client-context');
9 var GroupModel = Backbone.Model.extend({
10 defaults: {
11 name: '',
12 uri: '',
13 type: 'org',
14 linkPath: null,
15 defaultRoomName: 'community',
16 unreadItems: false,
17 mentions: false,
18 activity: false,
19 favourite: null
21 sync: SyncMixin.sync
22 });
24 var GroupCollection = LiveCollection.extend({
25 model: GroupModel,
26 urlTemplate: '/v1/user/:userId/groups',
27 contextModel: context.contextModel(),
28 client: function() {
29 return realtime.getClient();
31 sync: SyncMixin.sync,
33 initialize: function() {
34 this.listenTo(this, 'change:favourite', this.reorderFavs);
37 reorderFavs: function(model) {
38 /**
39 * We need to do some special reordering in the model of a favourite being positioned
40 * This is to mirror the changes happening on the server
41 * @see recent-room-service.js@addTroupeAsFavouriteInPosition
44 /* This only applies when a fav has been set */
45 if (!model.changed || !model.changed.favourite || this.reordering) {
46 return;
49 this.reordering = true;
51 var favourite = model.changed.favourite;
53 var forUpdate = this.map(function(room) {
54 return { id: room.id, favourite: room.get('favourite') };
55 }).filter(function(room) {
56 return room.favourite >= favourite && room.id !== model.id;
57 });
59 forUpdate.sort(function(a, b) {
60 return a.favourite - b.favourite;
61 });
63 var next = favourite;
64 for (var i = 0; i < forUpdate.length; i++) {
65 var item = forUpdate[i];
67 if (item.favourite > next) {
68 forUpdate.splice(i, forUpdate.length);
69 break;
72 item.favourite++;
73 next = item.favourite;
76 var self = this;
77 for (var j = forUpdate.length - 1; j >= 0; j--) {
78 var r = forUpdate[j];
79 var id = r.id;
80 var value = r.favourite;
81 var t = self.get(id);
82 t.set('favourite', value, { silent: true });
85 delete this.reordering;
87 });
89 module.exports = {
90 Model: GroupModel,
91 Collection: GroupCollection