Merge branch 'MDL-57319-master' of git://github.com/danpoltawski/moodle
authorEloy Lafuente (stronk7) <stronk7@moodle.org>
Mon, 12 Dec 2016 15:23:14 +0000 (16:23 +0100)
committerEloy Lafuente (stronk7) <stronk7@moodle.org>
Mon, 12 Dec 2016 15:23:14 +0000 (16:23 +0100)
23 files changed:
admin/renderer.php
backup/util/ui/tests/behat/behat_backup.php
course/moodleform_mod.php
lib/behat/form_field/behat_form_passwordunmask.php
lib/editor/atto/plugins/managefiles/yui/build/moodle-atto_managefiles-usedfiles/moodle-atto_managefiles-usedfiles-debug.js
lib/editor/atto/plugins/managefiles/yui/build/moodle-atto_managefiles-usedfiles/moodle-atto_managefiles-usedfiles-min.js
lib/editor/atto/plugins/managefiles/yui/build/moodle-atto_managefiles-usedfiles/moodle-atto_managefiles-usedfiles.js
lib/editor/atto/plugins/managefiles/yui/src/usedfiles/js/usedfiles.js
lib/form/dateselector.php
lib/form/datetimeselector.php
lib/tablelib.php
mod/assign/lib.php
mod/forum/lib.php
mod/lesson/tests/behat/lesson_user_override.feature
mod/scorm/tests/behat/completion_condition_require_status.feature
mod/wiki/tests/behat/reset_wiki_comments_tags_files.feature [new file with mode: 0644]
theme/boost/scss/moodle/admin.scss
theme/boost/scss/moodle/user.scss
theme/boost/tests/behat/behat_theme_boost_behat_backup.php [deleted file]
theme/boost/tests/behat/blacklist.json
theme/bootstrapbase/less/moodle/admin.less
theme/bootstrapbase/less/moodle/user.less
theme/bootstrapbase/style/moodle.css

index 2b841d6..32d28fd 100644 (file)
@@ -1899,14 +1899,21 @@ class core_admin_renderer extends plugin_renderer_base {
                 } else {
                     $report = $this->doc_link(join($linkparts, '/'), get_string($stringtouse, 'admin', $rec));
                 }
+                // Enclose report text in div so feedback text will be displayed underneath it.
+                $report = html_writer::div($report);
 
                 // Format error or warning line
-                if ($errorline || $warningline) {
-                    $messagetype = $errorline? 'error':'warn';
+                if ($errorline) {
+                    $messagetype = 'error';
+                    $statusclass = 'label-important';
+                } else if ($warningline) {
+                    $messagetype = 'warn';
+                    $statusclass = 'label-warning';
                 } else {
                     $messagetype = 'ok';
+                    $statusclass = 'label-success';
                 }
-                $status = '<span class="'.$messagetype.'">'.$status.'</span>';
+                $status = html_writer::span($status, 'label ' . $statusclass);
                 // Here we'll store all the feedback found
                 $feedbacktext = '';
                 // Append the feedback if there is some
index d4ffb03..a5ead37 100644 (file)
@@ -43,19 +43,6 @@ use Behat\Gherkin\Node\TableNode as TableNode,
  */
 class behat_backup extends behat_base {
 
-    /**
-     * Follow a link like 'Backup' or 'Import', where the link name comes from
-     * a language string, in the settings nav block of a course.
-     * @param string $langstring the lang string to look for. E.g. 'backup' or 'import'.
-     * @param string $component (optional) second argument to {@link get_string}.
-     */
-    protected function navigate_to_course_settings_link($langstring, $component = '') {
-        $behatnavigation = new behat_navigation();
-        $behatnavigation->setMink($this->getMink());
-        $behatnavigation->i_navigate_to_node_in(get_string($langstring, $component),
-                get_string('courseadministration'));
-    }
-
     /**
      * Backups the specified course using the provided options. If you are interested in restoring this backup would be
      * useful to provide a 'Filename' option.
@@ -70,33 +57,31 @@ class behat_backup extends behat_base {
 
         // Go to homepage.
         $this->getSession()->visit($this->locate_path('/?redirect=0'));
+        $this->execute("behat_general::wait_until_the_page_is_ready");
 
         // Click the course link.
-        $this->find_link($backupcourse)->click();
+        $this->execute("behat_general::click_link", $backupcourse);
 
         // Click the backup link.
-        $this->navigate_to_course_settings_link('backup');
-        $this->wait();
+        $this->execute("behat_navigation::i_navigate_to_in_current_page_administration", get_string('backup'));
 
         // Initial settings.
         $this->fill_backup_restore_form($this->get_step_options($options, "Initial"));
-        $this->find_button(get_string('backupstage1action', 'backup'))->press();
-        $this->wait();
+        $this->execute("behat_forms::press_button", get_string('backupstage1action', 'backup'));
 
         // Schema settings.
         $this->fill_backup_restore_form($this->get_step_options($options, "Schema"));
-        $this->find_button(get_string('backupstage2action', 'backup'))->press();
-        $this->wait();
+        $this->execute("behat_forms::press_button", get_string('backupstage2action', 'backup'));
 
         // Confirmation and review, backup filename can also be specified.
         $this->fill_backup_restore_form($this->get_step_options($options, "Confirmation"));
-        $this->find_button(get_string('backupstage4action', 'backup'))->press();
+        $this->execute("behat_forms::press_button", get_string('backupstage4action', 'backup'));
 
         // Waiting for it to finish.
-        $this->wait(self::EXTENDED_TIMEOUT);
+        $this->execute("behat_general::wait_until_the_page_is_ready");
 
         // Last backup continue button.
-        $this->find_button(get_string('backupstage16action', 'backup'))->press();
+        $this->execute("behat_general::i_click_on", array(get_string('backupstage16action', 'backup'), 'button'));
     }
 
     /**
@@ -116,21 +101,19 @@ class behat_backup extends behat_base {
         $this->getSession()->visit($this->locate_path('/?redirect=0'));
 
         // Click the course link.
-        $this->find_link($backupcourse)->click();
+        $this->execute("behat_general::click_link", $backupcourse);
 
         // Click the backup link.
-        $this->find_link(get_string('backup'))->click();
-        $this->wait();
+        $this->execute("behat_navigation::i_navigate_to_in_current_page_administration", get_string('backup'));
 
         // Initial settings.
-        $this->find_button(get_string('jumptofinalstep', 'backup'))->press();
-        $this->wait();
+        $this->execute("behat_forms::press_button", get_string('jumptofinalstep', 'backup'));
 
         // Waiting for it to finish.
-        $this->wait(self::EXTENDED_TIMEOUT);
+        $this->execute("behat_general::wait_until_the_page_is_ready");
 
         // Last backup continue button.
-        $this->find_button(get_string('backupstage16action', 'backup'))->press();
+        $this->execute("behat_general::i_click_on", array(get_string('backupstage16action', 'backup'), 'button'));
     }
 
     /**
@@ -152,15 +135,13 @@ class behat_backup extends behat_base {
 
         // Go to homepage.
         $this->getSession()->visit($this->locate_path('/?redirect=0'));
-        $this->wait();
+        $this->execute("behat_general::wait_until_the_page_is_ready");
 
         // Click the course link.
-        $this->find_link($tocourse)->click();
-        $this->wait();
+        $this->execute("behat_general::click_link", $tocourse);
 
         // Click the import link.
-        $this->navigate_to_course_settings_link('import');
-        $this->wait();
+        $this->execute("behat_navigation::i_navigate_to_in_current_page_administration", get_string('import'));
 
         // Select the course.
         $exception = new ExpectationException('"' . $fromcourse . '" course not found in the list of courses to import from',
@@ -175,25 +156,24 @@ class behat_backup extends behat_base {
         $radiofield = new behat_form_field($this->getSession(), $radionode);
         $radiofield->set_value(1);
 
-        $this->find_button(get_string('continue'))->press();
-        $this->wait();
+        $this->execute("behat_forms::press_button", get_string('continue'));
 
         // Initial settings.
         $this->fill_backup_restore_form($this->get_step_options($options, "Initial"));
-        $this->find_button(get_string('importbackupstage1action', 'backup'))->press();
-        $this->wait();
+        $this->execute("behat_forms::press_button", get_string('importbackupstage1action', 'backup'));
 
         // Schema settings.
         $this->fill_backup_restore_form($this->get_step_options($options, "Schema"));
-        $this->find_button(get_string('importbackupstage2action', 'backup'))->press();
-        $this->wait();
+        $this->execute("behat_forms::press_button", get_string('importbackupstage2action', 'backup'));
 
         // Run it.
-        $this->find_button(get_string('importbackupstage4action', 'backup'))->press();
-        $this->wait(self::EXTENDED_TIMEOUT);
+        $this->execute("behat_forms::press_button", get_string('importbackupstage4action', 'backup'));
+
+        // Wait to ensure restore is complete.
+        $this->execute("behat_general::wait_until_the_page_is_ready");
 
         // Continue and redirect to 'to' course.
-        $this->find_button(get_string('continue'))->press();
+        $this->execute("behat_general::i_click_on", array(get_string('continue'), 'button'));
     }
 
     /**
@@ -215,17 +195,16 @@ class behat_backup extends behat_base {
         $existingcourse = behat_context_helper::escape($existingcourse);
 
         // Selecting the specified course (we can not call behat_forms::select_radio here as is in another behat subcontext).
-        $radionode = $this->find('xpath', "//div[contains(concat(' ', normalize-space(@class), ' '), ' bcs-existing-course ')]" .
+        $radionodexpath = "//div[contains(concat(' ', normalize-space(@class), ' '), ' bcs-existing-course ')]" .
             "/descendant::div[contains(concat(' ', normalize-space(@class), ' '), ' restore-course-search ')]" .
             "/descendant::tr[contains(., $existingcourse)]" .
-            "/descendant::input[@type='radio']");
-        $radionode->click();
+            "/descendant::input[@type='radio']";
+        $this->execute("behat_general::i_click_on", array($radionodexpath, 'xpath_element'));
 
         // Pressing the continue button of the restore into an existing course section.
-        $continuenode = $this->find('xpath', "//div[contains(concat(' ', normalize-space(@class), ' '), ' bcs-existing-course ')]" .
-            "/descendant::input[@type='submit'][@value='" . get_string('continue') . "']");
-        $continuenode->click();
-        $this->wait();
+        $continuenodexpath = "//div[contains(concat(' ', normalize-space(@class), ' '), ' bcs-existing-course ')]" .
+            "/descendant::input[@type='submit'][@value='" . get_string('continue') . "']";
+        $this->execute("behat_general::i_click_on", array($continuenodexpath, 'xpath_element'));
 
         // Common restore process using provided key/value options.
         $this->process_restore($options);
@@ -246,16 +225,15 @@ class behat_backup extends behat_base {
         $this->select_backup($backupfilename);
 
         // The first category in the list.
-        $radionode = $this->find('xpath', "//div[contains(concat(' ', normalize-space(@class), ' '), ' bcs-new-course ')]" .
+        $radionodexpath = "//div[contains(concat(' ', normalize-space(@class), ' '), ' bcs-new-course ')]" .
             "/descendant::div[contains(concat(' ', normalize-space(@class), ' '), ' restore-course-search ')]" .
-            "/descendant::input[@type='radio']");
-        $radionode->click();
+            "/descendant::input[@type='radio']";
+        $this->execute("behat_general::i_click_on", array($radionodexpath, 'xpath_element'));
 
         // Pressing the continue button of the restore into an existing course section.
-        $continuenode = $this->find('xpath', "//div[contains(concat(' ', normalize-space(@class), ' '), ' bcs-new-course ')]" .
-            "/descendant::input[@type='submit'][@value='" . get_string('continue') . "']");
-        $continuenode->click();
-        $this->wait();
+        $continuenodexpath = "//div[contains(concat(' ', normalize-space(@class), ' '), ' bcs-new-course ')]" .
+            "/descendant::input[@type='submit'][@value='" . get_string('continue') . "']";
+        $this->execute("behat_general::i_click_on", array($continuenodexpath, 'xpath_element'));
 
         // Common restore process using provided key/value options.
         $this->process_restore($options);
@@ -276,15 +254,14 @@ class behat_backup extends behat_base {
         $this->select_backup($backupfilename);
 
         // Merge without deleting radio option.
-        $radionode = $this->find('xpath', "//div[contains(concat(' ', normalize-space(@class), ' '), 'bcs-current-course')]" .
-            "/descendant::input[@type='radio'][@name='target'][@value='1']");
-        $radionode->click();
+        $radionodexpath = "//div[contains(concat(' ', normalize-space(@class), ' '), 'bcs-current-course')]" .
+            "/descendant::input[@type='radio'][@name='target'][@value='1']";
+        $this->execute("behat_general::i_click_on", array($radionodexpath, 'xpath_element'));
 
         // Pressing the continue button of the restore merging section.
-        $continuenode = $this->find('xpath', "//div[contains(concat(' ', normalize-space(@class), ' '), 'bcs-current-course')]" .
-            "/descendant::input[@type='submit'][@value='" . get_string('continue') . "']");
-        $continuenode->click();
-        $this->wait();
+        $continuenodexpath = "//div[contains(concat(' ', normalize-space(@class), ' '), 'bcs-current-course')]" .
+            "/descendant::input[@type='submit'][@value='" . get_string('continue') . "']";
+        $this->execute("behat_general::i_click_on", array($continuenodexpath, 'xpath_element'));
 
         // Common restore process using provided key/value options.
         $this->process_restore($options);
@@ -305,15 +282,14 @@ class behat_backup extends behat_base {
         $this->select_backup($backupfilename);
 
         // Delete contents radio option.
-        $radionode = $this->find('xpath', "//div[contains(concat(' ', normalize-space(@class), ' '), 'bcs-current-course')]" .
-            "/descendant::input[@type='radio'][@name='target'][@value='0']");
-        $radionode->click();
+        $radionodexpath = "//div[contains(concat(' ', normalize-space(@class), ' '), 'bcs-current-course')]" .
+            "/descendant::input[@type='radio'][@name='target'][@value='0']";
+        $this->execute("behat_general::i_click_on", array($radionodexpath, 'xpath_element'));
 
         // Pressing the continue button of the restore merging section.
-        $continuenode = $this->find('xpath', "//div[contains(concat(' ', normalize-space(@class), ' '), 'bcs-current-course')]" .
-            "/descendant::input[@type='submit'][@value='" . get_string('continue') . "']");
-        $continuenode->click();
-        $this->wait();
+        $continuenodexpath = "//div[contains(concat(' ', normalize-space(@class), ' '), 'bcs-current-course')]" .
+            "/descendant::input[@type='submit'][@value='" . get_string('continue') . "']";
+        $this->execute("behat_general::i_click_on", array($continuenodexpath, 'xpath_element'));
 
         // Common restore process using provided key/value options.
         $this->process_restore($options);
@@ -340,7 +316,7 @@ class behat_backup extends behat_base {
         $restorelink->click();
 
         // Confirm the backup contents.
-        $restore = $this->find_button(get_string('continue'))->press();
+        $this->find_button(get_string('continue'))->press();
     }
 
     /**
@@ -356,23 +332,20 @@ class behat_backup extends behat_base {
 
         // Settings.
         $this->fill_backup_restore_form($this->get_step_options($options, "Settings"));
-        $this->find_button(get_string('restorestage4action', 'backup'))->press();
-        $this->wait();
+        $this->execute("behat_forms::press_button", get_string('restorestage4action', 'backup'));
 
         // Schema.
         $this->fill_backup_restore_form($this->get_step_options($options, "Schema"));
-        $this->find_button(get_string('restorestage8action', 'backup'))->press();
-        $this->wait();
+        $this->execute("behat_forms::press_button", get_string('restorestage8action', 'backup'));
 
         // Review, no options here.
-        $this->find_button(get_string('restorestage16action', 'backup'))->press();
-        $this->wait();
+        $this->execute("behat_forms::press_button", get_string('restorestage16action', 'backup'));
 
-        // Last restore continue button, redirected to restore course after this.
-        $this->find_button(get_string('restorestage32action', 'backup'))->press();
+        // Wait till the final button is visible.
+        $this->execute("behat_general::wait_until_the_page_is_ready");
 
-        // Long wait when waiting for the restore to finish.
-        $this->wait(self::EXTENDED_TIMEOUT);
+        // Last restore continue button, redirected to restore course after this.
+        $this->execute("behat_general::i_click_on", array(get_string('restorestage32action', 'backup'), 'button'));
     }
 
     /**
@@ -431,25 +404,4 @@ class behat_backup extends behat_base {
 
         return $pageoptions;
     }
-
-
-    /**
-     * Waits until the DOM and the page Javascript code is ready.
-     *
-     * @param int $timeout The number of seconds that we wait.
-     * @return void
-     */
-    protected function wait($timeout = false) {
-
-        if (!$this->running_javascript()) {
-            return;
-        }
-
-        if (!$timeout) {
-            $timeout = self::TIMEOUT;
-        }
-
-        $this->getSession()->wait($timeout * 1000, self::PAGE_READY_JS);
-    }
-
 }
index e467a9e..f5c76e0 100644 (file)
@@ -597,7 +597,7 @@ abstract class moodleform_mod extends moodleform {
             if ($this->_features->groups || $this->_features->groupings) {
                 $mform->addElement('static', 'restrictgroupbutton', '',
                         html_writer::tag('button', get_string('restrictbygroup', 'availability'),
-                        array('id' => 'restrictbygroup', 'disabled' => 'disabled')));
+                        array('id' => 'restrictbygroup', 'disabled' => 'disabled', 'class' => 'btn btn-secondary')));
             }
 
             // Availability field. This is just a textarea; the user interface
index 824085e..aef507c 100644 (file)
@@ -63,6 +63,10 @@ JS;
 
         // Ensure all pending JS is finished.
         if ($this->running_javascript()) {
+            // Press enter key after setting password, so we have a stable page.
+            $this->field->keyDown(13);
+            $this->field->keyPress(13);
+            $this->field->keyUp(13);
             $this->session->wait(behat_base::TIMEOUT * 1000, behat_base::PAGE_READY_JS);
         }
     }
index 3aa81be..7c0a688 100644 (file)
Binary files a/lib/editor/atto/plugins/managefiles/yui/build/moodle-atto_managefiles-usedfiles/moodle-atto_managefiles-usedfiles-debug.js and b/lib/editor/atto/plugins/managefiles/yui/build/moodle-atto_managefiles-usedfiles/moodle-atto_managefiles-usedfiles-debug.js differ
index 0fd7033..515f645 100644 (file)
Binary files a/lib/editor/atto/plugins/managefiles/yui/build/moodle-atto_managefiles-usedfiles/moodle-atto_managefiles-usedfiles-min.js and b/lib/editor/atto/plugins/managefiles/yui/build/moodle-atto_managefiles-usedfiles/moodle-atto_managefiles-usedfiles-min.js differ
index 639fe7a..423078e 100644 (file)
Binary files a/lib/editor/atto/plugins/managefiles/yui/build/moodle-atto_managefiles-usedfiles/moodle-atto_managefiles-usedfiles.js and b/lib/editor/atto/plugins/managefiles/yui/build/moodle-atto_managefiles-usedfiles/moodle-atto_managefiles-usedfiles.js differ
index fe8db57..0f7d628 100644 (file)
@@ -47,7 +47,7 @@ var CSS = {
  * @type {Object}
  */
 var SELECTORS = {
-    FILEANCESTOR: '.fitem_fcheckbox',
+    FILEANCESTOR: '.fitem',
     FORM: '#atto_managefiles_manageform',
     MISSINGFILES: '.missing-files'
 };
index 27e6c32..e26057d 100644 (file)
@@ -128,6 +128,10 @@ class MoodleQuickForm_date_selector extends MoodleQuickForm_group {
         $this->_elements = array();
 
         $dateformat = $calendartype->get_date_order($this->_options['startyear'], $this->_options['stopyear']);
+        // Reverse date element (Day, Month, Year), in RTL mode.
+        if (right_to_left()) {
+            $dateformat = array_reverse($dateformat);
+        }
         foreach ($dateformat as $key => $value) {
             // E_STRICT creating elements without forms is nasty because it internally uses $this
             $this->_elements[] = $this->createFormElement('select', $key, get_string($key, 'form'), $value, $this->getAttributes(), true);
index 2add97e..fb2d0eb 100644 (file)
@@ -137,16 +137,23 @@ class MoodleQuickForm_date_time_selector extends MoodleQuickForm_group {
 
         $this->_elements = array();
         $dateformat = $calendartype->get_date_order($this->_options['startyear'], $this->_options['stopyear']);
+        if (right_to_left()) {   // Display time to the right of date, in RTL mode.
+            $this->_elements[] = $this->createFormElement('select', 'minute', get_string('minute', 'form'),
+                $minutes, $this->getAttributes(), true);
+            $this->_elements[] = $this->createFormElement('select', 'hour', get_string('hour', 'form'),
+                $hours, $this->getAttributes(), true);
+            // Reverse date element (Should be: Day, Month, Year), in RTL mode.
+            $dateformat = array_reverse($dateformat);
+        }
         foreach ($dateformat as $key => $date) {
             // E_STRICT creating elements without forms is nasty because it internally uses $this
             $this->_elements[] = $this->createFormElement('select', $key, get_string($key, 'form'), $date, $this->getAttributes(), true);
         }
-        if (right_to_left()) {   // Switch order of elements for Right-to-Left
-            $this->_elements[] = $this->createFormElement('select', 'minute', get_string('minute', 'form'), $minutes, $this->getAttributes(), true);
-            $this->_elements[] = $this->createFormElement('select', 'hour', get_string('hour', 'form'), $hours, $this->getAttributes(), true);
-        } else {
-            $this->_elements[] = $this->createFormElement('select', 'hour', get_string('hour', 'form'), $hours, $this->getAttributes(), true);
-            $this->_elements[] = $this->createFormElement('select', 'minute', get_string('minute', 'form'), $minutes, $this->getAttributes(), true);
+        if (!right_to_left()) {   // Display time to the left of date, in LTR mode.
+            $this->_elements[] = $this->createFormElement('select', 'hour', get_string('hour', 'form'), $hours,
+                $this->getAttributes(), true);
+            $this->_elements[] = $this->createFormElement('select', 'minute', get_string('minute', 'form'), $minutes,
+                $this->getAttributes(), true);
         }
         // The YUI2 calendar only supports the gregorian calendar type so only display the calendar image if this is being used.
         if ($calendartype->get_name() === 'gregorian') {
index 246916e..ca252da 100644 (file)
@@ -449,8 +449,10 @@ class flexible_table {
         // Load any existing user preferences.
         if ($this->persistent) {
             $this->prefs = json_decode(get_user_preferences('flextable_' . $this->uniqueid), true);
+            $oldprefs = $this->prefs;
         } else if (isset($SESSION->flextable[$this->uniqueid])) {
             $this->prefs = $SESSION->flextable[$this->uniqueid];
+            $oldprefs = $this->prefs;
         }
 
         // Set up default preferences if needed.
@@ -463,7 +465,10 @@ class flexible_table {
                 'textsort' => $this->column_textsort,
             );
         }
-        $oldprefs = $this->prefs;
+
+        if (!isset($oldprefs)) {
+            $oldprefs = $this->prefs;
+        }
 
         if (($showcol = optional_param($this->request[TABLE_VAR_SHOW], '', PARAM_ALPHANUMEXT)) &&
                 isset($this->columns[$showcol])) {
index 9d11068..78a4ec2 100644 (file)
@@ -572,7 +572,7 @@ function assign_print_overview($courses, &$htmlarray) {
         $context = context_module::instance($assignment->coursemodule);
 
         // Does the submission status of the assignment require notification?
-        if (has_capability('mod/assign:submit', $context)) {
+        if (has_capability('mod/assign:submit', $context, null, false)) {
             // Does the submission status of the assignment require notification?
             $submitdetails = assign_get_mysubmission_details_for_print_overview($mysubmissions, $sqlassignmentids,
                     $assignmentidparams, $assignment);
@@ -580,7 +580,7 @@ function assign_print_overview($courses, &$htmlarray) {
             $submitdetails = false;
         }
 
-        if (has_capability('mod/assign:grade', $context)) {
+        if (has_capability('mod/assign:grade', $context, null, false)) {
             // Does the grading status of the assignment require notification ?
             $gradedetails = assign_get_grade_details_for_print_overview($unmarkedsubmissions, $sqlassignmentids,
                     $assignmentidparams, $assignment, $context);
index 5b3b1a3..7507944 100644 (file)
@@ -7493,15 +7493,6 @@ function forum_get_posts_by_user($user, array $courses, $musthaveaccess = false,
                 continue;
             }
 
-            // Check whether the requested user is enrolled or has access to view the course
-            // if they don't we immediately have a problem.
-            if (!can_access_course($course, $user) && !is_enrolled($coursecontext, $user)) {
-                if ($musthaveaccess) {
-                    print_error('notenrolled', 'forum');
-                }
-                continue;
-            }
-
             // If groups are in use and enforced throughout the course then make sure
             // we can meet in at least one course level group.
             // Note that we check if either the current user or the requested user have
index 197383c..9313d95 100644 (file)
@@ -134,7 +134,6 @@ Feature: Lesson user override
     And I set the following fields to these values:
       | Password protected lesson | Yes |
       | id_password               | moodle_rules |
-    And I wait until the page is ready
     And I press "Save and display"
     And I navigate to "User overrides" in current page administration
     And I press "Add user override"
index 9d3e4ad..c33cdf9 100644 (file)
@@ -182,6 +182,7 @@ Feature: Scorm multi-sco completion
     And I should see "Knowledge Check"
     And I switch to the main frame
     And I follow "Exit activity"
+    And I wait until the page is ready
     Then I should see "ADV Multi-sco SCORM package"
     And I log out
     And I log in as "teacher1"
diff --git a/mod/wiki/tests/behat/reset_wiki_comments_tags_files.feature b/mod/wiki/tests/behat/reset_wiki_comments_tags_files.feature
new file mode 100644 (file)
index 0000000..0830606
--- /dev/null
@@ -0,0 +1,95 @@
+@mod @mod_wiki @javascript
+Feature: Teachers can reset wiki pages, tags and files
+  In order to remove wiki pages, tags and files
+  As a teacher
+  I need to be able to reset the pages, tags and files on the course level
+
+  Background: Create a wiki, add a page, tag and file, and reset them
+    Given the following "users" exist:
+      | username | firstname | lastname | email |
+      | teacher1 | Teacher | 1 | teacher1@example.com |
+    And the following "courses" exist:
+      | fullname | shortname | category |
+      | Course 1 | C1 | 0 |
+    And the following "course enrolments" exist:
+      | user | course | role |
+      | teacher1 | C1 | editingteacher |
+    And I log in as "teacher1"
+    And I follow "Course 1"
+    And I turn editing mode on
+    And I add a "Wiki" to section "1" and I fill the form with:
+      | Wiki name | Test wiki |
+      | Description | Test wiki description |
+      | First page name | Test wiki page |
+    And I follow "Test wiki"
+    And I press "Create page"
+    And I set the following fields to these values:
+      | HTML format | Test wiki content |
+      | Tags | Test tag 1, Test tag 2, |
+    And I press "Save"
+    And I should see "Test tag 1" in the ".wiki-tags" "css_element"
+    And I should see "Test tag 2" in the ".wiki-tags" "css_element"
+    And I follow "Comments"
+    And I follow "Add comment"
+    And I set the following fields to these values:
+      | Comment | Test comment |
+    And I press "Save changes"
+    And I should see "Test comment"
+    And I follow "Files"
+    And I press "Edit wiki files"
+    And I upload "lib/tests/fixtures/empty.txt" file to "Files" filemanager
+    And I press "Save changes"
+    And I should see "empty.txt"
+    And I navigate to "Reset" node in "Course administration"
+
+  Scenario: Reset page, tags and files
+    And I set the following fields to these values:
+      | Delete all wiki pages | 1 |
+      | Remove all wiki tags | 1 |
+      | reset_wiki_comments | 1 |
+    And I press "Reset course"
+    And I should see "Delete all wiki pages"
+    And I should see "Wiki tags have been deleted"
+    And I should see "Delete all comments"
+    And I press "Continue"
+    And I follow "Test wiki"
+    And I press "Create page"
+    When I follow "View"
+    Then I should not see "Test tag 1"
+    And I should not see "Test tag 2"
+    And I follow "Comments"
+    And I should not see "Test comment"
+    And I follow "Files"
+    And I should not see "empty.txt"
+
+  Scenario: Reset only tags
+    And I set the following fields to these values:
+      | Remove all wiki tags | 1 |
+    And I press "Reset course"
+    And I should not see "Delete all wiki pages"
+    And I should see "Wiki tags have been deleted"
+    And I should not see "Delete all comments"
+    And I press "Continue"
+    And I follow "Test wiki"
+    Then I should not see "Test tag 1"
+    And I should not see "Test tag 2"
+    And I follow "Comments"
+    And I should see "Test comment"
+    And I follow "Files"
+    And I should see "empty.txt"
+
+  Scenario: Reset only comments
+    And I set the following fields to these values:
+      | reset_wiki_comments | 1 |
+    And I press "Reset course"
+    And I should not see "Delete all wiki pages"
+    And I should not see "Wiki tags have been deleted"
+    And I should see "Delete all comments"
+    And I press "Continue"
+    When I follow "Test wiki"
+    Then I should see "Test tag 1"
+    And I should see "Test tag 2"
+    And I follow "Comments"
+    And I should not see "Test comment"
+    And I follow "Files"
+    And I should see "empty.txt"
\ No newline at end of file
index 9330486..272184e 100644 (file)
 .environmenttable {
     .warn {
         background-color: $state-warning-bg;
+        color: $state-warning-text;
     }
 
     .error {
         background-color: $state-danger-bg;
+        color: $state-danger-text;
     }
 
     .ok {
         background-color: $state-success-bg;
+        color: $state-success-text;
     }
 }
 
index 7554f4f..701d834 100644 (file)
 
         select {
             min-width: 175px;
+            max-width: 90%;
         }
     }
 }
diff --git a/theme/boost/tests/behat/behat_theme_boost_behat_backup.php b/theme/boost/tests/behat/behat_theme_boost_behat_backup.php
deleted file mode 100644 (file)
index d47eda0..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-// This file is part of Moodle - http://moodle.org/
-//
-// Moodle is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// Moodle is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
-
-/**
- * Backup and restore actions to help behat feature files writting overrides.
- *
- * @copyright  2016 Damyon Wiese
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-// NOTE: no MOODLE_INTERNAL test here, this file may be required by behat before including /config.php.
-
-require_once(__DIR__ . '/../../../../backup/util/ui/tests/behat/behat_backup.php');
-require_once(__DIR__ . '/behat_theme_boost_behat_navigation.php');
-
-use Behat\Gherkin\Node\TableNode as TableNode,
-    Behat\Mink\Exception\ElementNotFoundException as ElementNotFoundException,
-    Behat\Mink\Exception\ExpectationException as ExpectationException;
-
-/**
- * Backup-related steps definitions overrides.
- *
- * @copyright  2016 Damyon Wiese
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-class behat_theme_boost_behat_backup extends behat_backup {
-
-    protected function navigate_to_course_settings_link($langstring, $component = '') {
-        $behatnavigation = new behat_theme_boost_behat_navigation();
-        $behatnavigation->setMink($this->getMink());
-        $behatnavigation->i_navigate_to_node_in(get_string($langstring, $component),
-                get_string('courseadministration'));
-    }
-
-}
index 4a8a2cb..1d0c8d8 100644 (file)
@@ -3,7 +3,6 @@
         "lib/tests/behat/action_menu.feature",
         "course/tests/behat/activities_edit_with_block_dock.feature",
         "blocks/tests/behat/hide_blocks.feature",
-        "blocks/tests/behat/move_blocks.feature",
-        "backup/util/ui/tests/behat/restore_moodle2_courses.feature"
+        "blocks/tests/behat/move_blocks.feature"
     ]
 }
index 872d374..61947c9 100644 (file)
 }
 
 .environmenttable {
-    p.warn {
+    .warn {
         background-color: @warningBackground;
         color: @warningText;
     }
-    .error,
-    span.warn,
-    .ok {
-        .label;
-    }
     .error {
-        background-color: @errorText;
-    }
-    span.warn {
-        background-color: @orange;
+        background-color: @errorBackground;
+        color: @errorText;
     }
     .ok {
-        background-color: @successText;
+        background-color: @successBackground;
+        color: @successText;
     }
 }
 
index 4c33354..c4df6c0 100644 (file)
 
         select {
             min-width: 175px;
+            max-width: 90%;
         }
     }
 }
index 0e16b43..425a617 100644 (file)
@@ -2486,90 +2486,17 @@ h3.sectionname .inplaceeditable.inplaceeditingon .editinstructions {
 .path-admin .admintable .leftalign {
   text-align: left;
 }
-.environmenttable p.warn {
+.environmenttable .warn {
   background-color: #fcf8e3;
   color: #8a6d3b;
 }
-.environmenttable .error,
-.environmenttable span.warn,
-.environmenttable .ok {
-  display: inline-block;
-  padding: 2px 4px;
-  font-size: 11.844px;
-  font-weight: bold;
-  line-height: 14px;
-  color: #fff;
-  vertical-align: baseline;
-  white-space: nowrap;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #999;
-  -webkit-border-radius: 3px;
-  -moz-border-radius: 3px;
-  border-radius: 3px;
-}
-.environmenttable .error:empty,
-.environmenttable span.warn:empty,
-.environmenttable .ok:empty {
-  display: none;
-}
-.environmenttable .error-important,
-.environmenttable span.warn-important,
-.environmenttable .ok-important {
-  background-color: #b94a48;
-}
-.environmenttable .error-important[href],
-.environmenttable span.warn-important[href],
-.environmenttable .ok-important[href] {
-  background-color: #953b39;
-}
-.environmenttable .error-warning,
-.environmenttable span.warn-warning,
-.environmenttable .ok-warning {
-  background-color: #f89406;
-}
-.environmenttable .error-warning[href],
-.environmenttable span.warn-warning[href],
-.environmenttable .ok-warning[href] {
-  background-color: #c67605;
-}
-.environmenttable .error-success,
-.environmenttable span.warn-success,
-.environmenttable .ok-success {
-  background-color: #468847;
-}
-.environmenttable .error-success[href],
-.environmenttable span.warn-success[href],
-.environmenttable .ok-success[href] {
-  background-color: #356635;
-}
-.environmenttable .error-info,
-.environmenttable span.warn-info,
-.environmenttable .ok-info {
-  background-color: #3a87ad;
-}
-.environmenttable .error-info[href],
-.environmenttable span.warn-info[href],
-.environmenttable .ok-info[href] {
-  background-color: #2d6987;
-}
-.environmenttable .error-inverse,
-.environmenttable span.warn-inverse,
-.environmenttable .ok-inverse {
-  background-color: #333;
-}
-.environmenttable .error-inverse[href],
-.environmenttable span.warn-inverse[href],
-.environmenttable .ok-inverse[href] {
-  background-color: #1a1a1a;
-}
 .environmenttable .error {
-  background-color: #b94a48;
-}
-.environmenttable span.warn {
-  background-color: #f89406;
+  background-color: #f2dede;
+  color: #b94a48;
 }
 .environmenttable .ok {
-  background-color: #468847;
+  background-color: #dff0d8;
+  color: #468847;
 }
 .path-admin .admintable.environmenttable .name,
 .path-admin .admintable.environmenttable .info,
@@ -7672,6 +7599,7 @@ body.path-question-type .mform fieldset.hidden {
 #groupeditform .groups select,
 #groupeditform .members select {
   min-width: 175px;
+  max-width: 90%;
 }
 /** Preferences page */
 .preferences-group ul {