Merge branch 'MDL-67874-master' of git://github.com/bmbrands/moodle
authorJake Dallimore <jake@moodle.com>
Wed, 27 May 2020 05:54:51 +0000 (13:54 +0800)
committerJake Dallimore <jake@moodle.com>
Wed, 27 May 2020 05:54:51 +0000 (13:54 +0800)
21 files changed:
admin/tool/dataprivacy/tests/behat/manage_categories.feature
admin/tool/dataprivacy/tests/behat/manage_purposes.feature
analytics/tests/behat/manage_models.feature
grade/edit/letter/index.php
lib/amd/build/notification.min.js
lib/amd/build/notification.min.js.map
lib/amd/build/tag.min.js
lib/amd/build/tag.min.js.map
lib/amd/src/notification.js
lib/amd/src/tag.js
lib/behat/classes/partial_named_selector.php
lib/db/access.php
lib/outputrenderers.php
lib/templates/loginform.mustache
lib/tests/behat/app_behat_runtime.js
lib/tests/behat/behat_app.php
lib/tests/gradelib_test.php
theme/classic/templates/columns.mustache
theme/classic/templates/contentonly.mustache
theme/classic/templates/secure.mustache
version.php

index c6f7f0e..8384b2e 100644 (file)
@@ -12,7 +12,7 @@ Feature: Manage data categories
     And I press "Add category"
     And I set the field "Name" to "Category 1"
     And I set the field "Description" to "Category 1 description"
-    When I click on "Save" "button" in the "Delete category" "dialogue"
+    When I click on "Save" "button" in the "Add category" "dialogue"
     Then I should see "Category 1" in the "List of data categories" "table"
     And I should see "Category 1 description" in the "Category 1" "table_row"
 
@@ -30,5 +30,5 @@ Feature: Manage data categories
     And I choose "Delete" in the open action menu
     And I should see "Delete category"
     And I should see "Are you sure you want to delete the category 'Category 1'?"
-    When I click on "Delete" "button" in the "Confirm" "dialogue"
+    When I click on "Delete" "button" in the "Delete category" "dialogue"
     Then I should not see "Category 1" in the "List of data categories" "table"
index 772c590..dcd0c2a 100644 (file)
@@ -52,5 +52,5 @@ Feature: Manage data storage purposes
     And I choose "Delete" in the open action menu
     And I should see "Delete purpose"
     And I should see "Are you sure you want to delete the purpose 'Purpose 1'?"
-    When I click on "Delete" "button" in the "Confirm" "dialogue"
+    When I click on "Delete" "button" in the "Delete purpose" "dialogue"
     Then I should not see "Purpose 1" in the "List of data purposes" "table"
index 9064a0b..816a253 100644 (file)
@@ -158,5 +158,5 @@ Feature: Manage analytics models
   Scenario: Delete model
     When I open the action menu in "Students at risk of not meeting the course completion conditions" "table_row"
     And I choose "Delete" in the open action menu
-    And I click on "Delete" "button" in the "Confirm" "dialogue"
+    And I click on "Delete" "button" in the "Delete" "dialogue"
     Then I should not see "Students at risk of not meeting the course completion conditions"
index f7aa942..b72e203 100644 (file)
@@ -229,8 +229,11 @@ if (!$edit) {
             }
         }
 
+        // Cache the changed letters.
         if (!empty($letters)) {
-            // Ensure that the letters are correctly sorted.
+
+            // For some reason, the cache saves it in the order in which they were entered
+            // but we really want to order them in descending order so we sort it here.
             krsort($letters);
             $cache->set($context->id, $letters);
         }
index ae72462..42cdec9 100644 (file)
Binary files a/lib/amd/build/notification.min.js and b/lib/amd/build/notification.min.js differ
index ed26296..1d721de 100644 (file)
Binary files a/lib/amd/build/notification.min.js.map and b/lib/amd/build/notification.min.js.map differ
index 603a149..ba37d4e 100644 (file)
Binary files a/lib/amd/build/tag.min.js and b/lib/amd/build/tag.min.js differ
index 9749568..7db6808 100644 (file)
Binary files a/lib/amd/build/tag.min.js.map and b/lib/amd/build/tag.min.js.map differ
index 0822899..62cec7e 100644 (file)
@@ -292,8 +292,9 @@ export const exception = async ex => {
  *
  * @param {Number} contextId
  * @param {Array} notificationList
+ * @param {Boolean} userLoggedIn
  */
-export const init = (contextId, notificationList) => {
+export const init = (contextId, notificationList, userLoggedIn) => {
     currentContextId = contextId;
 
     // Setup the message target region if it isn't setup already
@@ -302,8 +303,11 @@ export const init = (contextId, notificationList) => {
     // Add provided notifications.
     addNotifications(notificationList);
 
-    // Perform an initial poll for any new notifications.
-    fetchNotifications();
+    // If the user is not logged in then we can not fetch anything for them.
+    if (userLoggedIn) {
+        // Perform an initial poll for any new notifications.
+        fetchNotifications();
+    }
 };
 
 // To maintain backwards compatability we export default here.
index 2527032..603cc9f 100644 (file)
@@ -266,12 +266,13 @@ define([
 
                     e.preventDefault(); // This will prevent default error dialogue.
                     str.get_strings([
+                        {key: 'confirm', component: 'core'},
                         {key: 'nameuseddocombine', component: 'tag'},
-                        {key: 'yes'},
-                        {key: 'cancel'},
+                        {key: 'yes', component: 'core'},
+                        {key: 'cancel', component: 'core'},
                     ])
                     .then(function(s) {
-                        return notification.confirm(e.message, s[0], s[1], s[2], function() {
+                        return notification.confirm(s[0], s[1], s[2], s[3], function() {
                             window.location.href = window.location.href + "&newname=" + encodeURIComponent(newvalue) +
                                 "&tagid=" + encodeURIComponent(tagid) +
                                 '&action=renamecombine&sesskey=' + M.cfg.sesskey;
index 87c602e..a1825a6 100644 (file)
@@ -161,7 +161,7 @@ XPATH
 .//div[
         contains(concat(' ', normalize-space(@class), ' '), ' modal ')
             and
-        normalize-space(descendant::*[contains(concat(' ', normalize-space(@class), ' '), ' modal-header ')] = %locator%)
+        normalize-space(descendant::*[contains(concat(' ', normalize-space(@class), ' '), ' modal-header ')]) = %locator%
     ]
 XPATH
         , 'group_message' => <<<XPATH
index 46af6d3..0db35e1 100644 (file)
@@ -969,7 +969,7 @@ $capabilities = array(
 
     'moodle/course:viewhiddenactivities' => array(
 
-        'captype' => 'write',
+        'captype' => 'read',
         'contextlevel' => CONTEXT_MODULE,
         'archetypes' => array(
             'teacher' => CAP_ALLOW,
@@ -1558,7 +1558,7 @@ $capabilities = array(
 
     'moodle/course:viewhiddensections' => array(
 
-        'captype' => 'write',
+        'captype' => 'read',
         'contextlevel' => CONTEXT_COURSE,
         'archetypes' => array(
             'editingteacher' => CAP_ALLOW,
index cbc9649..e3705ea 100644 (file)
@@ -1414,7 +1414,8 @@ class core_renderer extends renderer_base {
         if (!empty($this->page->context->id)) {
             $this->page->requires->js_call_amd('core/notification', 'init', array(
                 $this->page->context->id,
-                \core\notification::fetch_as_array($this)
+                \core\notification::fetch_as_array($this),
+                isloggedin()
             ));
         }
         $footer = str_replace($this->unique_end_html_token, $this->page->requires->get_end_code(), $footer);
index 27b8ec5..d41a055 100644 (file)
 
                 {{#hasidentityproviders}}
                     <h6 class="mt-2">{{#str}} potentialidps, auth {{/str}}</h6>
-                    <div class="potentialidplist" class="mt-3">
+                    <div class="potentialidplist mt-3">
                         {{#identityproviders}}
                             <div class="potentialidp">
                                 <a href="{{url}}" title={{#quote}}{{name}}{{/quote}} class="btn btn-secondary btn-block">
index 0112157..56fdbc3 100644 (file)
             case 'page menu' :
                 // This lang string was changed in app version 3.6.
                 selector = 'core-context-menu > button[aria-label=Info], ' +
-                        'core-context-menu > button[aria-label=Information]';
+                        'core-context-menu > button[aria-label=Information], ' +
+                        'core-context-menu > button[aria-label="Display options"]';
                 break;
             default:
                 return 'ERROR: Unsupported standard button type';
index f82ce5d..af82844 100644 (file)
@@ -303,12 +303,22 @@ class behat_app extends behat_base {
         // Wait until the site login field appears OR the main page.
         $situation = $this->spin(
                 function($context, $args) {
-                    $input = $context->getSession()->getPage()->find('xpath', '//input[@name="url"]');
-                    if ($input) {
+                    $page = $context->getSession()->getPage();
+
+                    $element = $page->find('xpath', '//page-core-login-site//input[@name="url"]');
+                    if ($element) {
+                        // Wait for the onboarding modal to open, if any.
+                        $this->wait_for_pending_js();
+                        $element = $page->find('xpath', '//page-core-login-site-onboarding');
+                        if ($element) {
+                            $this->i_press_in_the_app('Skip');
+                        }
+
                         return 'login';
                     }
-                    $mainmenu = $context->getSession()->getPage()->find('xpath', '//page-core-mainmenu');
-                    if ($mainmenu) {
+
+                    $element = $page->find('xpath', '//page-core-mainmenu');
+                    if ($element) {
                         return 'mainpage';
                     }
                     throw new DriverException('Moodle app login URL prompt not found');
@@ -317,7 +327,7 @@ class behat_app extends behat_base {
         // If it's the login page, we automatically fill in the URL and leave it on the user/pass
         // page. If it's the main page, we just leave it there.
         if ($situation === 'login') {
-            $this->i_set_the_field_in_the_app('Site address', $CFG->wwwroot);
+            $this->i_set_the_field_in_the_app('campus.example.edu', $CFG->wwwroot);
             $this->i_press_in_the_app('Connect!');
         }
 
index 97d500f..37cd372 100644 (file)
@@ -88,7 +88,7 @@ class core_gradelib_testcase extends advanced_testcase {
 
         $letters = $cache->get($context->id);
         $this->assertEquals(1, count($letters));
-        $this->assertEquals($letter->letter, $letters['100.00000']);
+        $this->assertTrue(in_array($letter->letter, $letters));
 
         remove_grade_letters($context, false);
 
@@ -250,7 +250,8 @@ class core_gradelib_testcase extends advanced_testcase {
     /**
      * Test the caching of grade letters.
      */
-    public function test_get_grade_letters(): void {
+    public function test_get_grade_letters() {
+
         $this->resetAfterTest();
 
         // Setup some basics.
@@ -274,7 +275,7 @@ class core_gradelib_testcase extends advanced_testcase {
     /**
      * Test custom letters.
      */
-    public function test_get_grade_letters_custom(): void {
+    public function test_get_grade_letters_custom() {
         global $DB;
 
         $this->resetAfterTest();
index 02046a5..1ae3fc6 100644 (file)
@@ -97,7 +97,8 @@
 </html>
 {{#js}}
 M.util.js_pending('theme_boost/loader');
-require(['theme_boost/loader'], function() {
-  M.util.js_complete('theme_boost/loader');
+require(['theme_boost/loader'], function(loader) {
+    loader.init();
+    M.util.js_complete('theme_boost/loader');
 });
 {{/js}}
index 2ba1a95..4d8ca86 100644 (file)
@@ -69,7 +69,8 @@
 </html>
 {{#js}}
 M.util.js_pending('theme_boost/loader');
-require(['theme_boost/loader'], function() {
-  M.util.js_complete('theme_boost/loader');
+require(['theme_boost/loader'], function(loader) {
+    loader.init();
+    M.util.js_complete('theme_boost/loader');
 });
 {{/js}}
index 798d043..1d06183 100644 (file)
 </html>
 {{#js}}
 M.util.js_pending('theme_boost/loader');
-require(['theme_boost/loader'], function() {
-  M.util.js_complete('theme_boost/loader');
+require(['theme_boost/loader'], function(loader) {
+    loader.init();
+    M.util.js_complete('theme_boost/loader');
 });
 {{/js}}
index 0b3c297..775c624 100644 (file)
@@ -29,9 +29,9 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$version  = 2020052200.01;              // YYYYMMDD      = weekly release date of this DEV branch.
+$version  = 2020052700.00;              // YYYYMMDD      = weekly release date of this DEV branch.
                                         //         RR    = release increments - 00 in DEV branches.
                                         //           .XX = incremental changes.
-$release  = '3.9dev+ (Build: 20200522)'; // Human-friendly version name
+$release  = '3.9dev+ (Build: 20200527)'; // Human-friendly version name
 $branch   = '39';                       // This version's branch.
 $maturity = MATURITY_ALPHA;             // This version's maturity level.