diff options
Diffstat (limited to 'syweb/webclient/recents')
-rw-r--r-- | syweb/webclient/recents/recents-controller.js | 53 | ||||
-rw-r--r-- | syweb/webclient/recents/recents-filter.js | 74 | ||||
-rw-r--r-- | syweb/webclient/recents/recents.html | 110 |
3 files changed, 237 insertions, 0 deletions
diff --git a/syweb/webclient/recents/recents-controller.js b/syweb/webclient/recents/recents-controller.js new file mode 100644 index 0000000000..41720d4cb0 --- /dev/null +++ b/syweb/webclient/recents/recents-controller.js @@ -0,0 +1,53 @@ +/* + Copyright 2014 OpenMarket Ltd + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +'use strict'; + +angular.module('RecentsController', ['matrixService', 'matrixFilter']) +.controller('RecentsController', ['$rootScope', '$scope', 'eventHandlerService', 'modelService', 'recentsService', + function($rootScope, $scope, eventHandlerService, modelService, recentsService) { + + // Expose the service to the view + $scope.eventHandlerService = eventHandlerService; + + // retrieve all rooms and expose them + $scope.rooms = modelService.getRooms(); + + // track the selected room ID: the html will use this + $scope.recentsSelectedRoomID = recentsService.getSelectedRoomId(); + $scope.$on(recentsService.BROADCAST_SELECTED_ROOM_ID, function(ngEvent, room_id) { + $scope.recentsSelectedRoomID = room_id; + }); + + // track the list of unread messages: the html will use this + $scope.unreadMessages = recentsService.getUnreadMessages(); + $scope.$on(recentsService.BROADCAST_UNREAD_MESSAGES, function(ngEvent, room_id, unreadCount) { + $scope.unreadMessages = recentsService.getUnreadMessages(); + }); + + // track the list of unread BING messages: the html will use this + $scope.unreadBings = recentsService.getUnreadBingMessages(); + $scope.$on(recentsService.BROADCAST_UNREAD_BING_MESSAGES, function(ngEvent, room_id, event) { + $scope.unreadBings = recentsService.getUnreadBingMessages(); + }); + + $scope.selectRoom = function(room) { + recentsService.markAsRead(room.room_id); + $rootScope.goToPage('room/' + (room.room_alias ? room.room_alias : room.room_id) ); + }; + +}]); + diff --git a/syweb/webclient/recents/recents-filter.js b/syweb/webclient/recents/recents-filter.js new file mode 100644 index 0000000000..cfbc6f4bd8 --- /dev/null +++ b/syweb/webclient/recents/recents-filter.js @@ -0,0 +1,74 @@ +/* + Copyright 2014 OpenMarket Ltd + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +'use strict'; + +angular.module('RecentsController') +.filter('orderRecents', ["matrixService", "eventHandlerService", "modelService", function(matrixService, eventHandlerService, modelService) { + return function(rooms) { + var user_id = matrixService.config().user_id; + + // Transform the dict into an array + // The key, room_id, is already in value objects + var filtered = []; + angular.forEach(rooms, function(room, room_id) { + room.recent = {}; + var meEvent = room.current_room_state.state("m.room.member", user_id); + // Show the room only if the user has joined it or has been invited + // (ie, do not show it if he has been banned) + var member = modelService.getMember(room_id, user_id); + if (member) { + member = member.event; + } + room.recent.me = member; + if (member && ("invite" === member.content.membership || "join" === member.content.membership)) { + if ("invite" === member.content.membership) { + room.recent.inviter = member.user_id; + } + // Count users here + // TODO: Compute it directly in eventHandlerService + room.recent.numUsersInRoom = eventHandlerService.getUsersCountInRoom(room_id); + + filtered.push(room); + } + else if (meEvent && "invite" === meEvent.content.membership) { + // The only information we have about the room is that the user has been invited + filtered.push(room); + } + }); + + // And time sort them + // The room with the latest message at first + filtered.sort(function (roomA, roomB) { + + var lastMsgRoomA = eventHandlerService.getLastMessage(roomA.room_id, true); + var lastMsgRoomB = eventHandlerService.getLastMessage(roomB.room_id, true); + + // Invite message does not have a body message nor ts + // Puth them at the top of the list + if (undefined === lastMsgRoomA) { + return -1; + } + else if (undefined === lastMsgRoomB) { + return 1; + } + else { + return lastMsgRoomB.origin_server_ts - lastMsgRoomA.origin_server_ts; + } + }); + return filtered; + }; +}]); diff --git a/syweb/webclient/recents/recents.html b/syweb/webclient/recents/recents.html new file mode 100644 index 0000000000..0b3a77ca11 --- /dev/null +++ b/syweb/webclient/recents/recents.html @@ -0,0 +1,110 @@ +<div ng-controller="RecentsController"> + <table class="recentsTable"> + <tbody ng-repeat="(index, room) in rooms | orderRecents" + ng-click="selectRoom(room)" + class="recentsRoom" + ng-class="{'recentsRoomSelected': (room.room_id === recentsSelectedRoomID), 'recentsRoomBing': (unreadBings[room.room_id]), 'recentsRoomUnread': (unreadMessages[room.room_id])}"> + <tr> + <td ng-class="room.current_room_state.state('m.room.join_rules').content.join_rule == 'public' ? 'recentsRoomName recentsPublicRoom' : 'recentsRoomName'"> + {{ room.room_id | mRoomName }} + </td> + <td class="recentsRoomSummaryUsersCount"> + <span ng-show="undefined !== room.recent.numUsersInRoom"> + {{ room.recent.numUsersInRoom || '1' }} {{ room.recent.numUsersInRoom == 1 ? 'user' : 'users' }} + </span> + </td> + <td class="recentsRoomSummaryTS"> + <!-- Use a temp var as alias to the last room message. + Declaring it in this way ensures the data-binding --> + {{ lastMsg = eventHandlerService.getLastMessage(room.room_id, true);"" }} + + {{ (lastMsg.origin_server_ts) | date:'MMM d HH:mm' }} + + <img ng-click="leave(room.room_id); $event.stopPropagation();" src="img/close.png" width="10" height="10" style="margin-bottom: -1px; margin-left: 2px;" alt="close"/> + </td> + </tr> + + <tr> + <td colspan="3" class="recentsRoomSummary"> + + <div ng-show="room.recent.me.content.membership === 'invite'"> + {{ room.recent.inviter | mUserDisplayName: room.room_id }} invited you + </div> + + <div ng-hide="room.recent.me.membership === 'invite'" ng-switch="lastMsg.type"> + <div ng-switch-when="m.room.member"> + <span ng-switch="lastMsg.changedKey"> + <span ng-switch-when="membership"> + <span ng-if="'join' === lastMsg.content.membership"> + {{ lastMsg.state_key | mUserDisplayName: room.room_id }} joined + </span> + <span ng-if="'leave' === lastMsg.content.membership"> + <span ng-if="lastMsg.user_id === lastMsg.state_key"> + {{lastMsg.state_key | mUserDisplayName: room.room_id }} left + </span> + <span ng-if="lastMsg.user_id !== lastMsg.state_key && lastMsg.prev_content"> + {{ lastMsg.user_id | mUserDisplayName: room.room_id }} + {{ {"invite": "kicked", "join": "kicked", "ban": "unbanned"}[lastMsg.prev_content.membership] }} + {{ lastMsg.state_key | mUserDisplayName: room.room_id }} + </span> + <span ng-if="lastMsg.prev_content && 'join' === lastMsg.prev_content.membership && lastMsg.content.reason"> + : {{ lastMsg.content.reason }} + </span> + </span> + <span ng-if="'invite' === lastMsg.content.membership || 'ban' === lastMsg.content.membership"> + {{ lastMsg.user_id | mUserDisplayName: room.room_id }} + {{ {"invite": "invited", "ban": "banned"}[lastMsg.content.membership] }} + {{ lastMsg.state_key | mUserDisplayName: room.room_id }} + <span ng-if="lastMsg.prev_content && 'ban' === lastMsg.prev_content.membership && lastMsg.content.reason"> + : {{ lastMsg.content.reason }} + </span> + </span> + </span> + <span ng-switch-when="displayname"> + {{ lastMsg.user_id }} changed their display name from {{ lastMsg.prev_content.displayname }} to {{ lastMsg.content.displayname }} + </span> + </span> + </div> + + <div ng-switch-when="m.room.message"> + <div ng-switch="lastMsg.content.msgtype"> + <div ng-switch-when="m.text"> + {{ lastMsg.user_id | mUserDisplayName: room.room_id }} : + <span ng-bind-html="(lastMsg.content.body) | linky:'_blank'"> + </span> + </div> + + <div ng-switch-when="m.image"> + {{ lastMsg.user_id | mUserDisplayName: room.room_id }} sent an image + </div> + + <div ng-switch-when="m.emote"> + <span ng-bind-html="'* ' + (lastMsg.user_id | mUserDisplayName: room.room_id) + ' ' + lastMsg.content.body | linky:'_blank'"> + </span> + </div> + + <div ng-switch-default> + {{ lastMsg.content }} + </div> + </div> + </div> + + <div ng-switch-when="m.room.topic"> + {{ lastMsg.user_id | mUserDisplayName: room.room_id }} changed the topic to: {{ lastMsg.content.topic }} + </div> + + <div ng-switch-when="m.room.name"> + {{ lastMsg.user_id | mUserDisplayName: room.room_id }} changed the room name to: {{ lastMsg.content.name }} + </div> + + <div ng-switch-default> + <div ng-if="lastMsg.type.indexOf('m.call.') === 0"> + Call + </div> + </div> + </div> + </td> + </tr> + </tbody> + </table> +</div> |