Skip to content

Commit e19fa00

Browse files
authored
Merge pull request #867 from moodlehq/integration
Integration
2 parents f62eacb + 993a7a0 commit e19fa00

File tree

59 files changed

+844
-209
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+844
-209
lines changed

www/addons/frontpage/controllers/frontpage.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ angular.module('mm.addons.frontpage')
2525
$mmCourseHelper) {
2626

2727
// Default values are Site Home and all sections.
28-
var courseId = $mmSite.getInfo().siteid || 1,
28+
var courseId = $mmSite.getSiteHomeId(),
2929
moduleId = $stateParams.moduleid,
3030
sectionsLoaded;
3131

www/addons/frontpage/directives/frontpageitemnews.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ angular.module('mm.addons.frontpage')
3535
if (!newsitems) {
3636
return;
3737
}
38-
var courseId = $mmSite.getInfo().siteid || 1;
38+
var courseId = $mmSite.getSiteHomeId();
3939

4040
$mmaModForum = $mmAddonManager.get('$mmaModForum');
4141
if ($mmaModForum) {

www/addons/frontpage/services/frontpage.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ angular.module('mm.addons.frontpage')
6161
// fails there is a very high chance that frontpage is not available.
6262
$log.debug('Using WS call to check if frontpage is available.');
6363

64-
var siteHomeId = $mmSite.getInfo().siteid || 1;
64+
var siteHomeId = $mmSite.getSiteHomeId();
6565

6666
var hasData = false;
6767

www/addons/grades/controllers/courses.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ angular.module('mm.addons.grades')
3939

4040
fetchCoursesGrades().then(function() {
4141
// Add log in Moodle.
42-
var courseId = $mmSite.getInfo().siteid || 1;
42+
var courseId = $mmSite.getSiteHomeId();
4343
$mmSite.write('gradereport_overview_view_grade_report', {
4444
courseid: courseId,
4545
});

www/addons/messages/controllers/contacts.js

Lines changed: 37 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,13 @@ angular.module('mm.addons.messages')
2121
* @ngdoc controller
2222
* @name mmaMessagesContactsCtrl
2323
*/
24-
.controller('mmaMessagesContactsCtrl', function($scope, $mmaMessages, $mmSite, $mmUtil, $mmApp, mmUserProfileState, $translate) {
24+
.controller('mmaMessagesContactsCtrl', function($scope, $mmaMessages, $mmSite, $mmUtil, $mmApp, mmUserProfileState, $q,
25+
$translate) {
2526

2627
var currentUserId = $mmSite.getUserId(),
2728
searchingMessage = $translate.instant('mm.core.searching'),
28-
loadingMessage = $translate.instant('mm.core.loading');
29+
loadingMessage = $translate.instant('mm.core.loading'),
30+
searchedString;
2931

3032
$scope.loaded = false;
3133
$scope.contactTypes = ['online', 'offline', 'blocked', 'strangers', 'search'];
@@ -38,11 +40,19 @@ angular.module('mm.addons.messages')
3840
$scope.userStateName = mmUserProfileState;
3941

4042
$scope.refresh = function() {
41-
$mmaMessages.invalidateAllContactsCache(currentUserId).then(function() {
42-
return fetchContacts(true).then(function() {
43-
$scope.formData.searchString = '';
43+
var promise;
44+
45+
if (searchedString) {
46+
// User has searched, update the search.
47+
promise = search(searchedString);
48+
} else {
49+
// Update contacts.
50+
promise = $mmaMessages.invalidateAllContactsCache(currentUserId).then(function() {
51+
return fetchContacts(true);
4452
});
45-
}).finally(function() {
53+
}
54+
55+
promise.finally(function() {
4656
$scope.$broadcast('scroll.refreshComplete');
4757
});
4858
};
@@ -52,18 +62,7 @@ angular.module('mm.addons.messages')
5262

5363
$scope.loaded = false;
5464
$scope.loadingMessage = searchingMessage;
55-
return $mmaMessages.searchContacts(query).then(function(result) {
56-
$scope.hasContacts = result.length > 0;
57-
$scope.contacts = {
58-
search: result
59-
};
60-
}).catch(function(error) {
61-
if (typeof error === 'string') {
62-
$mmUtil.showErrorModal(error);
63-
} else {
64-
$mmUtil.showErrorModal('mma.messages.errorwhileretrievingcontacts', true);
65-
}
66-
}).finally(function() {
65+
return search(query).finally(function() {
6766
$scope.loaded = true;
6867
});
6968
};
@@ -75,24 +74,38 @@ angular.module('mm.addons.messages')
7574
});
7675
};
7776

77+
// Search users.
78+
function search(query) {
79+
return $mmaMessages.searchContacts(query).then(function(result) {
80+
$scope.hasContacts = result.length > 0;
81+
searchedString = query;
82+
$scope.contacts = {
83+
search: result
84+
};
85+
}).catch(function(error) {
86+
$mmUtil.showErrorModalDefault(error, 'mma.messages.errorwhileretrievingcontacts', true);
87+
return $q.reject();
88+
});
89+
}
90+
91+
// Fetch contacts.
7892
function fetchContacts() {
7993
$scope.loadingMessage = loadingMessage;
8094
return $mmaMessages.getAllContacts().then(function(contacts) {
8195
$scope.contacts = contacts;
96+
searchedString = false; // Reset searched string.
8297

8398
angular.forEach(contacts, function(contact) {
8499
if (contact.length > 0) {
85100
$scope.hasContacts = true;
86101
}
87102
});
88-
}, function(error) {
89-
if (typeof error === 'string') {
90-
$mmUtil.showErrorModal(error);
91-
} else {
92-
$mmUtil.showErrorModal('mma.messages.errorwhileretrievingcontacts', true);
93-
}
103+
}).catch(function(error) {
104+
$mmUtil.showErrorModalDefault(error, 'mma.messages.errorwhileretrievingcontacts', true);
105+
return $q.reject();
94106
});
95107
}
108+
96109
fetchContacts().finally(function() {
97110
$scope.loaded = true;
98111
});

www/addons/messages/controllers/discussion.js

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ angular.module('mm.addons.messages')
2424
.controller('mmaMessagesDiscussionCtrl', function($scope, $stateParams, $mmApp, $mmaMessages, $mmSite, $timeout, $mmEvents, $window,
2525
$ionicScrollDelegate, mmUserProfileState, $mmUtil, mmaMessagesPollInterval, $interval, $log, $ionicHistory, $ionicPlatform,
2626
mmCoreEventKeyboardShow, mmCoreEventKeyboardHide, mmaMessagesDiscussionLoadedEvent, mmaMessagesDiscussionLeftEvent,
27-
$mmUser, $translate, mmaMessagesNewMessageEvent, mmaMessagesAutomSyncedEvent, $mmaMessagesSync, $q, md5) {
27+
$mmUser, $translate, mmaMessagesNewMessageEvent, mmaMessagesAutomSyncedEvent, $mmaMessagesSync, $q, md5,
28+
mmaMessagesReadChangedEvent) {
2829

2930
$log = $log.getInstance('mmaMessagesDiscussionCtrl');
3031

@@ -38,7 +39,8 @@ angular.module('mm.addons.messages')
3839
canDelete = $mmaMessages.canDeleteMessages(), // Check if user can delete messages.
3940
syncObserver,
4041
scrollKeyboardInitialized = false,
41-
pagesLoaded = 1;
42+
pagesLoaded = 1,
43+
unreadMessageFrom = false;
4244

4345
$scope.showKeyboard = $stateParams.showKeyboard;
4446
$scope.loaded = false;
@@ -91,6 +93,8 @@ angular.module('mm.addons.messages')
9193
return;
9294
}
9395

96+
hideUnreadLabel();
97+
9498
$scope.data.showDelete = false;
9599
$scope.newMessage = ''; // Clear new message.
96100

@@ -280,11 +284,27 @@ angular.module('mm.addons.messages')
280284

281285
// Notify that there can be a new message.
282286
notifyNewMessage();
287+
288+
// Mark retrieved messages as read if they are not.
289+
markMessagesAsRead();
283290
}).finally(function() {
284291
fetching = false;
285292
});
286293
}
287294

295+
// Hide unread label when sending messages.
296+
function hideUnreadLabel() {
297+
if (typeof unreadMessageFrom == 'number') {
298+
angular.forEach($scope.messages, function(message) {
299+
if (message.id == unreadMessageFrom) {
300+
message.unreadFrom = false;
301+
}
302+
});
303+
// Label hidden.
304+
unreadMessageFrom = true;
305+
}
306+
}
307+
288308
// Wait until fetching is false.
289309
function waitForFetch() {
290310
if (!fetching) {
@@ -296,6 +316,48 @@ angular.module('mm.addons.messages')
296316
}, 400);
297317
}
298318

319+
// Mark messages as read.
320+
function markMessagesAsRead() {
321+
var readChanged = false,
322+
previousMessageRead = false,
323+
promises = [];
324+
325+
angular.forEach($scope.messages, function(message) {
326+
327+
if (message.useridfrom != $scope.currentUserId) {
328+
// If the message is unread, call $mmaMessages.markMessageRead.
329+
if (message.read == 0) {
330+
promises.push($mmaMessages.markMessageRead(message.id).then(function() {
331+
readChanged = true;
332+
message.read = 1;
333+
}));
334+
}
335+
336+
// Place unread from message label only once.
337+
if (!unreadMessageFrom) {
338+
message.unreadFrom = message.read == 0 && previousMessageRead;
339+
// Save where the label is placed.
340+
unreadMessageFrom = message.unreadFrom && parseInt(message.id, 10);
341+
previousMessageRead = message.read != 0;
342+
}
343+
}
344+
});
345+
// Do not update the message unread from label on next refresh.
346+
if (!unreadMessageFrom) {
347+
// Using true to indicate the label is not placed but should not be placed.
348+
unreadMessageFrom = true;
349+
}
350+
351+
$q.all(promises).finally(function() {
352+
if (readChanged) {
353+
$mmEvents.trigger(mmaMessagesReadChangedEvent, {
354+
siteid: $mmSite.getId(),
355+
userid: userId
356+
});
357+
}
358+
});
359+
}
360+
299361
// Get a discussion. Can load several "pages".
300362
function getDiscussion(pagesToLoad, lfReceivedUnread, lfReceivedRead, lfSentUnread, lfSentRead) {
301363
lfReceivedUnread = lfReceivedUnread || 0;

www/addons/messages/controllers/discussions.js

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@ angular.module('mm.addons.messages')
2222
* @name mmaMessagesDiscussionsCtrl
2323
*/
2424
.controller('mmaMessagesDiscussionsCtrl', function($scope, $mmUtil, $mmaMessages, $rootScope, $mmEvents, $mmSite, $ionicPlatform,
25-
mmCoreSplitViewLoad, mmaMessagesNewMessageEvent, $mmAddonManager) {
26-
var newMessagesObserver,
25+
mmCoreSplitViewLoad, mmaMessagesNewMessageEvent, $mmAddonManager, mmaMessagesReadChangedEvent,
26+
mmaMessagesReadCronEvent) {
27+
var newMessagesObserver, readChangedObserver, cronObserver,
2728
siteId = $mmSite.getId(),
2829
discussions,
2930
$mmPushNotificationsDelegate = $mmAddonManager.get('$mmPushNotificationsDelegate'),
@@ -36,17 +37,14 @@ angular.module('mm.addons.messages')
3637
discussions = discs;
3738

3839
// Convert to an array for sorting.
39-
var array = [];
40-
angular.forEach(discussions, function(v) {
41-
array.push(v);
40+
var discussionsSorted = [];
41+
angular.forEach(discussions, function(discussion) {
42+
discussion.unread = !!discussion.unread;
43+
discussionsSorted.push(discussion);
4244
});
43-
$scope.discussions = array;
45+
$scope.discussions = discussionsSorted;
4446
}, function(error) {
45-
if (typeof error === 'string') {
46-
$mmUtil.showErrorModal(error);
47-
} else {
48-
$mmUtil.showErrorModal('mma.messages.errorwhileretrievingdiscussions', true);
49-
}
47+
$mmUtil.showErrorModalDefault(error, 'mma.messages.errorwhileretrievingdiscussions', true);
5048
}).finally(function() {
5149
$scope.loaded = true;
5250
});
@@ -60,6 +58,8 @@ angular.module('mm.addons.messages')
6058

6159
$scope.refresh = function() {
6260
refreshData().finally(function() {
61+
// Triggering without userid will avoid loops. This trigger will only update the side menu.
62+
$mmEvents.trigger(mmaMessagesReadChangedEvent, {siteid: siteId});
6363
$scope.$broadcast('scroll.refreshComplete');
6464
});
6565
};
@@ -90,13 +90,32 @@ angular.module('mm.addons.messages')
9090
}
9191
});
9292

93+
readChangedObserver = $mmEvents.on(mmaMessagesReadChangedEvent, function(data) {
94+
if (data && data.siteid == siteId && data.userid) {
95+
var discussion = discussions[data.userid];
96+
97+
if (typeof discussion != 'undefined') {
98+
// A discussion has been read reset counter.
99+
discussion.unread = false;
100+
101+
// Discussions changed, invalidate them.
102+
$mmaMessages.invalidateDiscussionsCache();
103+
}
104+
}
105+
});
106+
107+
cronObserver = $mmEvents.on(mmaMessagesReadCronEvent, function(data) {
108+
if (data && (data.siteid == siteId || !data.siteid)) {
109+
refreshData();
110+
}
111+
});
112+
93113
// If a message push notification is received, refresh the view.
94114
if ($mmPushNotificationsDelegate) {
95115
$mmPushNotificationsDelegate.registerReceiveHandler('mmaMessages:discussions', function(notification) {
96116
if ($mmUtil.isFalseOrZero(notification.notif)) {
97117
// New message received. If it's from current site, refresh the data.
98-
if (notification.site == $mmSite.getId()) {
99-
$scope.loaded = false;
118+
if (notification.site == siteId) {
100119
refreshData();
101120
}
102121
}
@@ -110,9 +129,10 @@ angular.module('mm.addons.messages')
110129
});
111130

112131
$scope.$on('$destroy', function() {
113-
if (newMessagesObserver && newMessagesObserver.off) {
114-
newMessagesObserver.off();
115-
}
132+
newMessagesObserver && newMessagesObserver.off && newMessagesObserver.off();
133+
readChangedObserver && readChangedObserver.off && readChangedObserver.off();
134+
cronObserver && cronObserver.off && cronObserver.off();
135+
116136
if ($mmPushNotificationsDelegate) {
117137
$mmPushNotificationsDelegate.unregisterReceiveHandler('mmaMessages:discussions');
118138
}

www/addons/messages/lang/en.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"messages": "Messages",
2020
"mustbeonlinetosendmessages": "You must be online to send messages",
2121
"newmessage": "New message...",
22+
"newmessages": "New messages",
2223
"nomessages": "No messages.",
2324
"nousersfound": "No users found",
2425
"removecontact": "Remove contact",

www/addons/messages/main.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ angular.module('mm.addons.messages', ['mm.core'])
2525
.constant('mmaMessagesBlockContactPriority', 600)
2626
.constant('mmaMessagesPreferencesPriority', 600)
2727
.constant('mmaMessagesNewMessageEvent', 'mma-messages_new_message')
28+
.constant('mmaMessagesReadChangedEvent', 'mma-messages_read_changed')
29+
.constant('mmaMessagesReadCronEvent', 'mma-messages_read_cron')
2830
.constant('mmaMessagesAutomSyncedEvent', 'mma_messages_autom_synced')
2931

3032
.config(function($stateProvider, $mmUserDelegateProvider, $mmSideMenuDelegateProvider, mmaMessagesSendMessagePriority,
@@ -106,7 +108,8 @@ angular.module('mm.addons.messages', ['mm.core'])
106108
}
107109

108110
// Register sync process.
109-
$mmCronDelegate.register('mmaMessages', '$mmaMessagesHandlers.syncHandler');
111+
$mmCronDelegate.register('mmaMessagesSync', '$mmaMessagesHandlers.syncHandler');
112+
$mmCronDelegate.register('mmaMessagesMenu', '$mmaMessagesHandlers.sideMenuNav');
110113

111114
// Sync some discussions when device goes online.
112115
$mmEvents.on(mmCoreEventOnlineStatusChanged, function(online) {

www/addons/messages/scss/styles.scss

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
$mma-messages-date-badge: "stable" !default;
22

33
// The date displayed in the list.
4-
.mma-messages-date {
4+
.mma-messages-date,
5+
.mma-messages-unreadfrom {
56

67
text-align: center;
78
margin-top: 10px;
@@ -12,6 +13,10 @@ $mma-messages-date-badge: "stable" !default;
1213
}
1314
}
1415

16+
.mma-messages-unreadfrom {
17+
color: $positive;
18+
}
19+
1520
.mma-messages-input-inset {
1621
padding-top: 0;
1722
padding-left: 0;

0 commit comments

Comments
 (0)