From 15e1e670920b742e9ff3fadd9e767fdf5775094f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Tue, 18 Oct 2016 13:48:46 +0200 Subject: [PATCH 1/5] MOBILE-1824 rte: Do not undo resize if maximized --- www/core/directives/richtexteditor.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/www/core/directives/richtexteditor.js b/www/core/directives/richtexteditor.js index 13779867653..8b20339978e 100644 --- a/www/core/directives/richtexteditor.js +++ b/www/core/directives/richtexteditor.js @@ -414,14 +414,16 @@ angular.module('mm.core') editorHeightWithoutResize = editorInitialHeight + toolbarHeight, contentVisibleHeight, editorContentNewHeight, - screenSmallerThanEditor; + screenSmallerThanEditor, + editorMaximized; if (typeof fixedBarsHeight == 'undefined') { fixedBarsHeight = calculateFixedBarsHeight(editorEl); } + editorMaximized = !!editorEl.querySelector('.cke_maximized'); contentVisibleHeight = $window.innerHeight - fixedBarsHeight; - screenSmallerThanEditor = contentVisibleHeight > 0 && contentVisibleHeight < editorHeightWithoutResize; + screenSmallerThanEditor = !editorMaximized && contentVisibleHeight > 0 && contentVisibleHeight < editorHeightWithoutResize; editorContentNewHeight = contentVisibleHeight - toolbarHeight; if (resized && !screenSmallerThanEditor) { From 9abfb2873b848e89233a0475a1829ce8fa37256a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Tue, 18 Oct 2016 14:18:08 +0200 Subject: [PATCH 2/5] MOBILE-1824 quiz: Maintain text opacity on quiz review --- www/core/components/question/scss/styles.scss | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/www/core/components/question/scss/styles.scss b/www/core/components/question/scss/styles.scss index 65e40b7ac25..07b31738a92 100644 --- a/www/core/components/question/scss/styles.scss +++ b/www/core/components/question/scss/styles.scss @@ -28,6 +28,7 @@ li.mm-question-answer-correct, .mm-question-comment, .mm-question-comment p { color: $mm-question-correct-color; + -webkit-text-fill-color: $mm-question-correct-color; /* Override iOS / Android font color change */ background-color: #dff0d8; } @@ -53,6 +54,7 @@ li.mm-question-answer-incorrect, .mm-question-incorrect, .mm-question-incorrect p { color: $mm-question-incorrect-color; + -webkit-text-fill-color: $mm-question-incorrect-color; /* Override iOS / Android font color change */ background-color: #f2dede; } @@ -62,6 +64,11 @@ li.mm-question-answer-incorrect, border-color: $mm-question-incorrect-color; } +.mm-question-answer-correct input:disabled, +.mm-question-answer-incorrect input:disabled { + opacity: 1; +} + .mm-question-feedback-container { background-color: #fcf8e3; color: #8a6d3b; From 80655d599563ca8dbec02f0e998033041e3156f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Tue, 18 Oct 2016 15:52:32 +0200 Subject: [PATCH 3/5] MOBILE-1824 search: Fix error searching text --- www/core/components/courses/controllers/search.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/core/components/courses/controllers/search.js b/www/core/components/courses/controllers/search.js index 6ffb52c86ba..4bb3d93b7bc 100644 --- a/www/core/components/courses/controllers/search.js +++ b/www/core/components/courses/controllers/search.js @@ -50,7 +50,7 @@ angular.module('mm.core.courses') if (message) { $mmUtil.showErrorModal(message); } else { - $mmUtil.showErrorModal('mma.searchcourses.errorsearching', true); + $mmUtil.showErrorModal('mm.courses.errorsearching', true); } return $q.reject(); }); From 422da22c095a1819674767d9aa93eebd046185ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Wed, 19 Oct 2016 11:17:59 +0200 Subject: [PATCH 4/5] MOBILE-1824 login: Prevent opening change password modal twice --- .../components/login/controllers/sites.js | 6 +-- www/core/components/login/main.js | 29 +++++++---- www/core/components/login/services/helper.js | 20 +++++++- www/core/lib/sitesfactory.js | 19 +++++++- www/core/lib/sitesmanager.js | 48 +++++++++++++------ www/core/lib/util.js | 17 ------- 6 files changed, 95 insertions(+), 44 deletions(-) diff --git a/www/core/components/login/controllers/sites.js b/www/core/components/login/controllers/sites.js index 92a4e2e77bd..9517505355f 100644 --- a/www/core/components/login/controllers/sites.js +++ b/www/core/components/login/controllers/sites.js @@ -64,14 +64,14 @@ angular.module('mm.core.login') }); }; - $scope.login = function(siteid) { + $scope.login = function(siteId) { var modal = $mmUtil.showModalLoading(); - $mmSitesManager.loadSite(siteid).then(function() { + $mmSitesManager.loadSite(siteId).then(function() { $ionicHistory.nextViewOptions({disableBack: true}); return $mmLoginHelper.goToSiteInitialPage(); }, function(error) { - $log.error('Error loading site '+siteid); + $log.error('Error loading site ' + siteId); error = error || 'Error loading site.'; $mmUtil.showErrorModal(error); }).finally(function() { diff --git a/www/core/components/login/main.js b/www/core/components/login/main.js index 244892a7cb5..010b2802eff 100644 --- a/www/core/components/login/main.js +++ b/www/core/components/login/main.js @@ -14,6 +14,8 @@ angular.module('mm.core.login', []) +.constant('mmCoreLoginTokenChangePassword', '*changepassword*') + .config(function($stateProvider, $urlRouterProvider, $mmInitDelegateProvider, mmInitDelegateMaxAddonPriority) { $stateProvider @@ -96,11 +98,12 @@ angular.module('mm.core.login', []) .run(function($log, $state, $mmUtil, $translate, $mmSitesManager, $rootScope, $mmSite, $mmURLDelegate, $ionicHistory, $timeout, $mmEvents, $mmLoginHelper, mmCoreEventSessionExpired, $mmApp, $ionicPlatform, mmCoreConfigConstants, - mmCoreEventPasswordChangeForced) { + mmCoreEventPasswordChangeForced, mmCoreLoginTokenChangePassword) { $log = $log.getInstance('mmLogin'); - var isSSOConfirmShown, + var isSSOConfirmShown = false, + isChangePasswordConfirmShown = false, waitingForBrowser = false; // Listen for sessionExpired event to reconnect the user. @@ -230,19 +233,29 @@ angular.module('mm.core.login', []) } // Expire user token for the site. - $mmSitesManager.updateSiteToken(siteUrl, site.infos.username, 'expired'); + $log.debug('Expiring token for site ' + siteId); + $mmSitesManager.updateSiteTokenBySiteId(siteId, mmCoreLoginTokenChangePassword); // Site that triggered the event is not current site. if (siteId !== $mmSite.getId()) { return; } - // User password change forced, invalidate all site caches. - site.invalidateWsCache(); + if (!isChangePasswordConfirmShown && !waitingForBrowser) { + isChangePasswordConfirmShown = true; + + // User password change forced, invalidate all site caches. + site.invalidateWsCache(); - $mmEvents.trigger(mmCoreEventSessionExpired, siteId); - // Session expired, trigger event. - $mmUtil.openChangePassword(siteUrl, $translate.instant('mm.core.nopasswordchangeforced')); + $mmEvents.trigger(mmCoreEventSessionExpired, siteId); + + // Session expired, trigger event. + $mmLoginHelper.openChangePassword(siteUrl, $translate.instant('mm.core.nopasswordchangeforced')).then(function() { + waitingForBrowser = true; + }).finally(function() { + isChangePasswordConfirmShown = false; + }); + } }); } diff --git a/www/core/components/login/services/helper.js b/www/core/components/login/services/helper.js index dca72c430f6..fc883b09773 100644 --- a/www/core/components/login/services/helper.js +++ b/www/core/components/login/services/helper.js @@ -248,11 +248,29 @@ angular.module('mm.core.login') if (typeof error == 'string') { $mmUtil.showErrorModal(error); } else if (error.errorcode == 'forcepasswordchangenotice') { - $mmUtil.openChangePassword(siteurl, error.error); + self.openChangePassword(siteurl, error.error); } else { $mmUtil.showErrorModal(error.error); } }; + /** + * Convenient helper to open change password page. + * + * @module mm.core.login + * @ngdoc method + * @name $mmLoginHelper#openChangePassword + * @param {String} siteurl Site URL to construct change password URL. + * @param {String} error Error message. + */ + self.openChangePassword = function(siteurl, error) { + var message = error + "
" + $translate.instant('mm.login.visitchangepassword'); + return $mmUtil.showConfirm(message, $translate.instant('mm.core.notice')).then(function() { + var changepasswordurl = siteurl + "/login/change_password.php"; + $mmUtil.openInApp(changepasswordurl); + return $q.when(); + }); + }; + return self; }); diff --git a/www/core/lib/sitesfactory.js b/www/core/lib/sitesfactory.js index c43eb272c7c..9da99e37929 100644 --- a/www/core/lib/sitesfactory.js +++ b/www/core/lib/sitesfactory.js @@ -117,7 +117,8 @@ angular.module('mm.core') this.$get = function($http, $q, $mmWS, $mmDB, $log, md5, $mmApp, $mmLang, $mmUtil, $mmFS, mmCoreWSCacheStore, mmCoreWSPrefix, mmCoreSessionExpired, $mmEvents, mmCoreEventSessionExpired, mmCoreUserDeleted, mmCoreEventUserDeleted, - $mmText, $translate, mmCoreConfigConstants, mmCoreUserPasswordChangeForced, mmCoreEventPasswordChangeForced) { + $mmText, $translate, mmCoreConfigConstants, mmCoreUserPasswordChangeForced, mmCoreEventPasswordChangeForced, + mmCoreLoginTokenChangePassword) { $log = $log.getInstance('$mmSite'); @@ -254,6 +255,15 @@ angular.module('mm.core') this.token = token; }; + /** + * Check if token is already expired using local data. + * + * @return {Boolean} is token is expired or not. + */ + Site.prototype.isTokenExpired = function() { + return this.token == mmCoreLoginTokenChangePassword; + }; + /** * Set site info. * @@ -425,6 +435,13 @@ angular.module('mm.core') initialToken = site.token; data = data || {}; + // Prevent calls with expired tokens. + if (site.isTokenExpired()) { + $log.debug('Token expired, rejecting.'); + $mmEvents.trigger(mmCoreEventSessionExpired, site.id); + return $mmLang.translateAndReject('mm.login.reconnectdescription'); + } + // Get the method to use based on the available ones. method = site.getCompatibleFunction(method); diff --git a/www/core/lib/sitesmanager.js b/www/core/lib/sitesmanager.js index de3013552f7..0ad7bcb63bc 100644 --- a/www/core/lib/sitesmanager.js +++ b/www/core/lib/sitesmanager.js @@ -109,7 +109,7 @@ angular.module('mm.core') } return $mmLang.translateAndReject('mm.login.checksiteversion'); }); - });; + }); } }; @@ -159,7 +159,7 @@ angular.module('mm.core') return {siteurl: siteurl, code: data.code, warning: data.warning}; }); }); - }; + } /** * Check if a site exists. @@ -410,23 +410,29 @@ angular.module('mm.core') * @module mm.core * @ngdoc method * @name $mmSitesManager#loadSite - * @param {String} siteid ID of the site to load. + * @param {String} siteId ID of the site to load. * @return {Promise} Promise to be resolved when the site is loaded. */ - self.loadSite = function(siteid) { - $log.debug('Load site '+siteid); + self.loadSite = function(siteId) { + $log.debug('Load site ' + siteId); - return self.getSite(siteid).then(function(site) { + return self.getSite(siteId).then(function(site) { currentSite = site; - self.login(siteid); + self.login(siteId); + + if (site.isTokenExpired()) { + $log.debug('Token expired, rejecting.'); + $mmEvents.trigger(mmCoreEventSessionExpired, siteId); + return $mmLang.translateAndReject('mm.login.reconnectdescription'); + } // Check if local_mobile was installed to Moodle. return site.checkIfLocalMobileInstalledAndNotUsed().then(function() { // Local mobile was added. Throw invalid session to force reconnect and create a new token. - $mmEvents.trigger(mmCoreEventSessionExpired, siteid); + $mmEvents.trigger(mmCoreEventSessionExpired, siteId); }, function() { // Update site info. We don't block the UI. - self.updateSiteInfo(siteid).finally(function() { + self.updateSiteInfo(siteId).finally(function() { var infos = site.getInfo(), validation = validateSiteInfo(infos); if (validation !== true) { @@ -670,18 +676,32 @@ angular.module('mm.core') * @module mm.core * @ngdoc method * @name $mmSitesManager#updateSiteToken - * @param {String} siteurl Site's URL. + * @param {String} siteUrl Site's URL. * @param {String} username Username. * @param {String} token User's new token. * @return {Promise} A promise to be resolved when the site is updated. */ - self.updateSiteToken = function(siteurl, username, token) { - var siteid = self.createSiteID(siteurl, username); - return self.getSite(siteid).then(function(site) { + self.updateSiteToken = function(siteUrl, username, token) { + var siteId = self.createSiteID(siteUrl, username); + return self.updateSiteTokenBySiteId(siteId, token); + }; + + /** + * Updates a site's token usign siteId. + * + * @module mm.core + * @ngdoc method + * @name $mmSitesManager#updateSiteTokenBySiteId + * @param {String} siteId Site Id. + * @param {String} token User's new token. + * @return {Promise} A promise to be resolved when the site is updated. + */ + self.updateSiteTokenBySiteId = function(siteId, token) { + return self.getSite(siteId).then(function(site) { site.token = token; return $mmApp.getDB().insert(mmCoreSitesStore, { - id: siteid, + id: siteId, siteurl: site.getURL(), token: token, infos: site.getInfo() diff --git a/www/core/lib/util.js b/www/core/lib/util.js index e314d5c0b67..abab9d513ff 100644 --- a/www/core/lib/util.js +++ b/www/core/lib/util.js @@ -1652,23 +1652,6 @@ angular.module('mm.core') return error && localErrors.indexOf(error) == -1; }; - /** - * Convenient helper to open change password page. - * - * @module mm.core - * @ngdoc method - * @name $mmUtil#openChangePassword - * @param {String} siteurl Site URL to construct change password URL. - * @param {String} error Error message. - */ - self.openChangePassword = function(siteurl, error) { - var message = error + "
" + $translate.instant('mm.login.visitchangepassword'); - self.showConfirm(message, $translate.instant('mm.core.notice')).then(function() { - var changepasswordurl = siteurl + "/login/change_password.php"; - self.openInApp(changepasswordurl); - }); - }; - /** * Focus an element and open keyboard. * From c4c3d694042e1d05b1bf4bd983372a7d8422087d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Wed, 19 Oct 2016 11:53:22 +0200 Subject: [PATCH 5/5] MOBILE-1824 wiki: Fix navigation to offline page --- www/addons/mod/wiki/controllers/index.js | 1 + www/core/scss/styles.scss | 1 + 2 files changed, 2 insertions(+) diff --git a/www/addons/mod/wiki/controllers/index.js b/www/addons/mod/wiki/controllers/index.js index 42a30f47b71..3ca83656780 100644 --- a/www/addons/mod/wiki/controllers/index.js +++ b/www/addons/mod/wiki/controllers/index.js @@ -73,6 +73,7 @@ angular.module('mm.addons.mod_wiki') moduleid: module.id, courseid: courseId, pagetitle: page.title, + pageid: null, wikiid: wiki.id, subwikiid: page.subwikiid, action: 'page' diff --git a/www/core/scss/styles.scss b/www/core/scss/styles.scss index e3500ffeafc..91484c5cfa2 100644 --- a/www/core/scss/styles.scss +++ b/www/core/scss/styles.scss @@ -621,6 +621,7 @@ mm-format-text { border-bottom: 1px solid #ddd; margin-bottom: 10px; padding: 5px; + background-color: white; input { font-size: 20px;