From d3557d9483dd08cc9ff1c4c3268e0e727650e5b7 Mon Sep 17 00:00:00 2001 From: Paul Holden Date: Tue, 6 Feb 2024 21:22:59 +0000 Subject: [PATCH 01/51] MDL-80843 reportbuilder: consistent user auth report entity data. Tidy up unit tests for user report, removing some redundancy and duplication. --- reportbuilder/classes/local/entities/user.php | 43 +++--- reportbuilder/tests/datasource_test.php | 4 +- .../reportbuilder/datasource/users_test.php | 130 ++++++++++++------ 3 files changed, 109 insertions(+), 68 deletions(-) diff --git a/reportbuilder/classes/local/entities/user.php b/reportbuilder/classes/local/entities/user.php index 4893e9b57e25c..3dfa5fca68399 100644 --- a/reportbuilder/classes/local/entities/user.php +++ b/reportbuilder/classes/local/entities/user.php @@ -445,6 +445,7 @@ protected function get_user_fields(): array { 'suspended' => new lang_string('suspended'), 'confirmed' => new lang_string('confirmed', 'admin'), 'username' => new lang_string('username'), + 'auth' => new lang_string('authentication', 'moodle'), 'moodlenetprofile' => new lang_string('moodlenetprofile', 'user'), 'timecreated' => new lang_string('timecreated', 'core_reportbuilder'), 'timemodified' => new lang_string('timemodified', 'core_reportbuilder'), @@ -550,32 +551,6 @@ protected function get_all_filters(): array { )) ->add_joins($this->get_joins()); - // Authentication method filter. - $filters[] = (new filter( - select::class, - 'auth', - new lang_string('authentication', 'moodle'), - $this->get_entity_name(), - "{$tablealias}.auth" - )) - ->add_joins($this->get_joins()) - ->set_options_callback(static function(): array { - $plugins = core_component::get_plugin_list('auth'); - $enabled = get_string('pluginenabled', 'core_plugin'); - $disabled = get_string('plugindisabled', 'core_plugin'); - $authoptions = [$enabled => [], $disabled => []]; - - foreach ($plugins as $pluginname => $unused) { - $plugin = get_auth_plugin($pluginname); - if (is_enabled_auth($pluginname)) { - $authoptions[$enabled][$pluginname] = $plugin->get_title(); - } else { - $authoptions[$disabled][$pluginname] = $plugin->get_title(); - } - } - return $authoptions; - }); - return $filters; } @@ -598,6 +573,20 @@ protected function get_options_for(string $fieldname): ?array { return $cached[$fieldname]; } + /** + * List of options for the field auth + * + * @return string[] + */ + public static function get_options_for_auth(): array { + $authlist = array_keys(core_component::get_plugin_list('auth')); + + return array_map( + fn(string $auth) => get_auth_plugin($auth)->get_title(), + array_combine($authlist, $authlist), + ); + } + /** * List of options for the field country. * @@ -610,7 +599,7 @@ public static function get_options_for_country(): array { /** * List of options for the field theme. * - * @return array + * @return string[] */ public static function get_options_for_theme(): array { return array_map( diff --git a/reportbuilder/tests/datasource_test.php b/reportbuilder/tests/datasource_test.php index 66a01fcad2e78..6612d859a7929 100644 --- a/reportbuilder/tests/datasource_test.php +++ b/reportbuilder/tests/datasource_test.php @@ -55,7 +55,7 @@ public static function add_columns_from_entity_provider(): array { 'All column' => [ [], [], - 30, + 31, ], 'Include columns (picture, fullname, fullnamewithlink, fullnamewithpicture, fullnamewithpicturelink)' => [ ['picture', 'fullname*'], @@ -65,7 +65,7 @@ public static function add_columns_from_entity_provider(): array { 'Exclude columns (picture, fullname, fullnamewithlink, fullnamewithpicture, fullnamewithpicturelink)' => [ [], ['picture', 'fullname*'], - 25, + 26, ], ]; } diff --git a/user/tests/reportbuilder/datasource/users_test.php b/user/tests/reportbuilder/datasource/users_test.php index 5364a03ef6ed3..29e6d45a37442 100644 --- a/user/tests/reportbuilder/datasource/users_test.php +++ b/user/tests/reportbuilder/datasource/users_test.php @@ -112,14 +112,15 @@ public function test_datasource_non_default_columns(): void { $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:lastaccess']); $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:suspended']); $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:confirmed']); + $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:auth']); $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:moodlenetprofile']); $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:timecreated']); + $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:timemodified']); $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:lastip']); $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:theme']); // Tags. $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'tag:name']); - $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'tag:namewithlink']); // Cohort. $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'cohort:name']); @@ -127,44 +128,87 @@ public function test_datasource_non_default_columns(): void { $content = $this->get_custom_report_content($report->get('id')); $this->assertCount(2, $content); - [$adminrow, $userrow] = array_map('array_values', $content); - - $this->assertStringContainsString('Admin User', $adminrow[0]); - $this->assertStringContainsString('Admin User', $adminrow[1]); - $this->assertStringContainsString('Admin User', $adminrow[2]); - $this->assertNotEmpty($adminrow[3]); - $this->assertEquals('Admin', $adminrow[4]); - $this->assertEquals('User', $adminrow[5]); - - $this->assertStringContainsString(fullname($user), $userrow[0]); - $this->assertStringContainsString(fullname($user), $userrow[1]); - $this->assertStringContainsString(fullname($user), $userrow[2]); - $this->assertNotEmpty($userrow[3]); - $this->assertEquals($user->firstname, $userrow[4]); - $this->assertEquals($user->lastname, $userrow[5]); - $this->assertEquals($user->city, $userrow[6]); - $this->assertEquals('United Kingdom', $userrow[7]); - $this->assertEquals($user->description, $userrow[8]); - $this->assertEquals($user->firstnamephonetic, $userrow[9]); - $this->assertEquals($user->lastnamephonetic, $userrow[10]); - $this->assertEquals($user->middlename, $userrow[11]); - $this->assertEquals($user->alternatename, $userrow[12]); - $this->assertEquals($user->idnumber, $userrow[13]); - $this->assertEquals($user->institution, $userrow[14]); - $this->assertEquals($user->department, $userrow[15]); - $this->assertEquals($user->phone1, $userrow[16]); - $this->assertEquals($user->phone2, $userrow[17]); - $this->assertEquals($user->address, $userrow[18]); - $this->assertEmpty($userrow[19]); - $this->assertEquals('No', $userrow[20]); - $this->assertEquals('Yes', $userrow[21]); - $this->assertEquals($user->moodlenetprofile, $userrow[22]); - $this->assertNotEmpty($userrow[23]); - $this->assertEquals('0.0.0.0', $userrow[24]); - $this->assertEquals('Boost', $userrow[25]); - $this->assertEquals('Horses', $userrow[26]); - $this->assertStringContainsString('Horses', $userrow[27]); - $this->assertEquals($cohort->name, $userrow[28]); + // Admin row. + [ + $fullnamewithlink, + $fullnamewithpicture, + $fullnamewithpicturelink, + $picture, + $lastname, + $firstname, + ] = array_values($content[0]); + + $this->assertStringContainsString('Admin User', $fullnamewithlink); + $this->assertStringContainsString('Admin User', $fullnamewithpicture); + $this->assertStringContainsString('Admin User', $fullnamewithpicturelink); + $this->assertNotEmpty($picture); + $this->assertEquals('Admin', $lastname); + $this->assertEquals('User', $firstname); + + // User row. + [ + $fullnamewithlink, + $fullnamewithpicture, + $fullnamewithpicturelink, + $picture, + $firstname, + $lastname, + $city, + $country, + $description, + $firstnamephonetic, + $lastnamephonetic, + $middlename, + $alternatename, + $idnumber, + $institution, + $department, + $phone1, + $phone2, + $address, + $lastaccess, + $suspended, + $confirmed, + $auth, + $moodlenetprofile, + $timecreated, + $timemodified, + $lastip, + $theme, + $tag, + $cohortname, + ] = array_values($content[1]); + + $this->assertStringContainsString(fullname($user), $fullnamewithlink); + $this->assertStringContainsString(fullname($user), $fullnamewithpicture); + $this->assertStringContainsString(fullname($user), $fullnamewithpicturelink); + $this->assertNotEmpty($picture); + $this->assertEquals($user->firstname, $firstname); + $this->assertEquals($user->lastname, $lastname); + $this->assertEquals($user->city, $city); + $this->assertEquals('United Kingdom', $country); + $this->assertEquals($user->description, $description); + $this->assertEquals($user->firstnamephonetic, $firstnamephonetic); + $this->assertEquals($user->lastnamephonetic, $lastnamephonetic); + $this->assertEquals($user->middlename, $middlename); + $this->assertEquals($user->alternatename, $alternatename); + $this->assertEquals($user->idnumber, $idnumber); + $this->assertEquals($user->institution, $institution); + $this->assertEquals($user->department, $department); + $this->assertEquals($user->phone1, $phone1); + $this->assertEquals($user->phone2, $phone2); + $this->assertEquals($user->address, $address); + $this->assertEmpty($lastaccess); + $this->assertEquals('No', $suspended); + $this->assertEquals('Yes', $confirmed); + $this->assertEquals('Manual accounts', $auth); + $this->assertEquals($user->moodlenetprofile, $moodlenetprofile); + $this->assertNotEmpty($timecreated); + $this->assertNotEmpty($timemodified); + $this->assertEquals('0.0.0.0', $lastip); + $this->assertEquals('Boost', $theme); + $this->assertEquals('Horses', $tag); + $this->assertEquals($cohort->name, $cohortname); } /** @@ -368,6 +412,14 @@ public function datasource_filters_provider(): array { 'user:timecreated_from' => 1619823600, 'user:timecreated_to' => 1622502000, ], false], + 'Filter timemodified' => ['user:timemodified', [ + 'user:timemodified_operator' => date::DATE_RANGE, + 'user:timemodified_from' => 1622502000, + ], true], + 'Filter timemodified (no match)' => ['user:timemodified', [ + 'user:timemodified_operator' => date::DATE_RANGE, + 'user:timemodified_to' => 1622502000, + ], false], 'Filter lastaccess' => ['user:lastaccess', [ 'user:lastaccess_operator' => date::DATE_EMPTY, ], true], From a1f064339db0be5404bf2d368853d2cdf51d1ba9 Mon Sep 17 00:00:00 2001 From: Paul Holden Date: Fri, 17 Nov 2023 15:40:22 +0000 Subject: [PATCH 02/51] MDL-80245 reportbuilder: define custom report tags area. --- lang/en/reportbuilder.php | 1 + lib/db/tag.php | 6 +++ .../classes/local/helpers/report.php | 21 ++++++-- reportbuilder/tests/generator/lib.php | 6 +++ reportbuilder/tests/generator_test.php | 5 +- .../tests/local/helpers/report_test.php | 52 ++++++++++++++++++- reportbuilder/upgrade.txt | 2 + version.php | 2 +- 8 files changed, 87 insertions(+), 8 deletions(-) diff --git a/lang/en/reportbuilder.php b/lang/en/reportbuilder.php index ae2cd8ac617d7..4c2e6adbfe67f 100644 --- a/lang/en/reportbuilder.php +++ b/lang/en/reportbuilder.php @@ -263,6 +263,7 @@ $string['sorting_help'] = 'You can set the initial sort order of columns in the report, which can then be changed by users by clicking on column names.'; $string['switchedit'] = 'Switch to edit mode'; $string['switchpreview'] = 'Switch to preview mode'; +$string['tagarea_reportbuilder_report'] = 'Custom reports'; $string['tasksendschedule'] = 'Send report schedule'; $string['tasksendschedules'] = 'Send report schedules'; $string['timeadded'] = 'Time added'; diff --git a/lib/db/tag.php b/lib/db/tag.php index 22e125ecbba3c..834e53c2f8496 100644 --- a/lib/db/tag.php +++ b/lib/db/tag.php @@ -93,4 +93,10 @@ 'callback' => 'badge_get_tagged_badges', 'callbackfile' => '/badges/lib.php', ], + [ + 'itemtype' => 'reportbuilder_report', + 'component' => 'core_reportbuilder', + 'callback' => 'core_reportbuilder_get_tagged_reports', + 'callbackfile' => '/reportbuilder/lib.php', + ], ]; diff --git a/reportbuilder/classes/local/helpers/report.php b/reportbuilder/classes/local/helpers/report.php index b979443896e88..18a04e76aab17 100644 --- a/reportbuilder/classes/local/helpers/report.php +++ b/reportbuilder/classes/local/helpers/report.php @@ -26,6 +26,7 @@ use core_reportbuilder\local\models\column; use core_reportbuilder\local\models\filter; use core_reportbuilder\local\models\report as report_model; +use core_tag_tag; /** * Helper class for manipulating custom reports and their elements (columns, filters, conditions, etc) @@ -48,19 +49,24 @@ public static function create_report(stdClass $data, bool $default = true): repo $data->name = trim($data->name); $data->type = datasource::TYPE_CUSTOM_REPORT; - $reportpersistent = manager::create_report_persistent($data); + // Create report persistent. + $report = manager::create_report_persistent($data); // Add datasource default columns, filters and conditions to the report. if ($default) { - $source = $reportpersistent->get('source'); + $source = $report->get('source'); /** @var datasource $datasource */ - $datasource = new $source($reportpersistent, []); + $datasource = new $source($report); $datasource->add_default_columns(); $datasource->add_default_filters(); $datasource->add_default_conditions(); } - return $reportpersistent; + // Report tags. + core_tag_tag::set_item_tags('core_reportbuilder', 'reportbuilder_report', $report->get('id'), + $report->get_context(), $data->tags); + + return $report; } /** @@ -80,6 +86,10 @@ public static function update_report(stdClass $data): report_model { 'uniquerows' => $data->uniquerows, ])->update(); + // Report tags. + core_tag_tag::set_item_tags('core_reportbuilder', 'reportbuilder_report', $report->get('id'), + $report->get_context(), $data->tags); + return $report; } @@ -96,6 +106,9 @@ public static function delete_report(int $reportid): bool { throw new invalid_parameter_exception('Invalid report'); } + // Report tags. + core_tag_tag::remove_all_item_tags('core_reportbuilder', 'reportbuilder_report', $report->get('id')); + return $report->delete(); } diff --git a/reportbuilder/tests/generator/lib.php b/reportbuilder/tests/generator/lib.php index dc7cbdf049c0c..e83d6e2d1c4ab 100644 --- a/reportbuilder/tests/generator/lib.php +++ b/reportbuilder/tests/generator/lib.php @@ -51,6 +51,12 @@ public function create_report($record): report { throw new coding_exception('Record must contain \'source\' property'); } + // Report tags. + $tags = $record['tags'] ?? ''; + if (!is_array($tags)) { + $record['tags'] = preg_split('/\s*,\s*/', $tags, -1, PREG_SPLIT_NO_EMPTY); + } + // Include default setup unless specifically disabled in passed record. $default = (bool) ($record['default'] ?? true); diff --git a/reportbuilder/tests/generator_test.php b/reportbuilder/tests/generator_test.php index f867a6f41b626..1c9a13f603320 100644 --- a/reportbuilder/tests/generator_test.php +++ b/reportbuilder/tests/generator_test.php @@ -21,6 +21,7 @@ use advanced_testcase; use core_reportbuilder_generator; use core_reportbuilder\local\models\{audience, column, filter, report, schedule}; +use core_tag_tag; use core_user\reportbuilder\datasource\users; /** @@ -44,9 +45,11 @@ public function test_create_report(): void { /** @var core_reportbuilder_generator $generator */ $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); - $report = $generator->create_report(['name' => 'My report', 'source' => users::class]); + $report = $generator->create_report(['name' => 'My report', 'source' => users::class, 'tags' => ['cat', 'dog']]); $this->assertTrue(report::record_exists($report->get('id'))); + $this->assertEqualsCanonicalizing(['cat', 'dog'], + core_tag_tag::get_item_tags_array('core_reportbuilder', 'reportbuilder_report', $report->get('id'))); } /** diff --git a/reportbuilder/tests/local/helpers/report_test.php b/reportbuilder/tests/local/helpers/report_test.php index 1eceae0f5ce40..dcb198f935cfb 100644 --- a/reportbuilder/tests/local/helpers/report_test.php +++ b/reportbuilder/tests/local/helpers/report_test.php @@ -21,8 +21,10 @@ use advanced_testcase; use core_reportbuilder_generator; use invalid_parameter_exception; +use core_reportbuilder\datasource; use core_reportbuilder\local\models\column; use core_reportbuilder\local\models\filter; +use core_tag_tag; use core_user\reportbuilder\datasource\users; /** @@ -35,6 +37,49 @@ */ class report_test extends advanced_testcase { + /** + * Test creation report + */ + public function test_create_report(): void { + $this->resetAfterTest(); + $this->setAdminUser(); + + $report = report::create_report((object) [ + 'name' => 'My report', + 'source' => users::class, + 'tags' => ['cat', 'dog'], + ]); + + $this->assertEquals('My report', $report->get('name')); + $this->assertEquals(datasource::TYPE_CUSTOM_REPORT, $report->get('type')); + $this->assertEqualsCanonicalizing(['cat', 'dog'], + core_tag_tag::get_item_tags_array('core_reportbuilder', 'reportbuilder_report', $report->get('id'))); + } + + /** + * Test updating report + */ + public function test_update_report(): void { + $this->resetAfterTest(); + $this->setAdminUser(); + + /** @var core_reportbuilder_generator $generator */ + $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); + $report = $generator->create_report(['name' => 'My report', 'source' => users::class, 'uniquerows' => 0]); + + $reportupdated = report::update_report((object) [ + 'id' => $report->get('id'), + 'name' => 'My renamed report', + 'uniquerows' => 1, + 'tags' => ['cat', 'dog'], + ]); + + $this->assertEquals('My renamed report', $reportupdated->get('name')); + $this->assertTrue($reportupdated->get('uniquerows')); + $this->assertEqualsCanonicalizing(['cat', 'dog'], + core_tag_tag::get_item_tags_array('core_reportbuilder', 'reportbuilder_report', $reportupdated->get('id'))); + } + /** * Test deleting report */ @@ -46,7 +91,8 @@ public function test_delete_report(): void { $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); // Create Report1 and add some elements. - $report1 = $generator->create_report(['name' => 'My report 1', 'source' => users::class, 'default' => false]); + $report1 = $generator->create_report(['name' => 'My report 1', 'source' => users::class, 'default' => false, + 'tags' => ['cat', 'dog']]); $column1 = $generator->create_column(['reportid' => $report1->get('id'), 'uniqueidentifier' => 'user:email']); $filter1 = $generator->create_filter(['reportid' => $report1->get('id'), 'uniqueidentifier' => 'user:email']); $condition1 = $generator->create_condition(['reportid' => $report1->get('id'), 'uniqueidentifier' => 'user:email']); @@ -58,13 +104,15 @@ public function test_delete_report(): void { $condition2 = $generator->create_condition(['reportid' => $report2->get('id'), 'uniqueidentifier' => 'user:email']); // Delete Report1. - report::delete_report($report1->get('id')); + $result = report::delete_report($report1->get('id')); + $this->assertTrue($result); // Make sure Report1, and all it's elements are deleted. $this->assertFalse($report1::record_exists($report1->get('id'))); $this->assertFalse($column1::record_exists($column1->get('id'))); $this->assertFalse($filter1::record_exists($filter1->get('id'))); $this->assertFalse($condition1::record_exists($condition1->get('id'))); + $this->assertEmpty(core_tag_tag::get_item_tags_array('core_reportbuilder', 'reportbuilder_report', $report1->get('id'))); // Make sure Report2, and all it's elements still exist. $this->assertTrue($report2::record_exists($report2->get('id'))); diff --git a/reportbuilder/upgrade.txt b/reportbuilder/upgrade.txt index 9f2c85f588627..382a2a77bb4a3 100644 --- a/reportbuilder/upgrade.txt +++ b/reportbuilder/upgrade.txt @@ -15,6 +15,8 @@ Information provided here is intended especially for developers. * The base datasource `add_all_from_entity` method accepts additional parameters to limit which columns, filters and conditions are added. The `add_[columns|filters|conditions]_from_entity` class methods also now support wildcard matching in both `$include` and `$exclude` parameters +* Custom reports now implement the tag API, with options for specifying in the `report::[create|update]_report` helper methods + as well as in the `create_report` test generator method * New report filter types: - `filesize` for reports containing filesize data diff --git a/version.php b/version.php index bb54388cb5f38..dab7f4b53eb09 100644 --- a/version.php +++ b/version.php @@ -29,7 +29,7 @@ defined('MOODLE_INTERNAL') || die(); -$version = 2024030500.00; // YYYYMMDD = weekly release date of this DEV branch. +$version = 2024030600.00; // YYYYMMDD = weekly release date of this DEV branch. // RR = release increments - 00 in DEV branches. // .XX = incremental changes. $release = '4.4dev+ (Build: 20240305)'; // Human-friendly version name From 47790ea315e8932dbb65374376d62e4d8ae95aca Mon Sep 17 00:00:00 2001 From: Paul Holden Date: Mon, 20 Nov 2023 08:51:18 +0000 Subject: [PATCH 03/51] MDL-80245 tag: allow for tags filter to operate in component mode. This allows the filter to be more easily re-used for component system reports that want to filter by their own tags. --- reportbuilder/classes/local/filters/tags.php | 107 ++++++++++++++---- .../tests/local/filters/tags_test.php | 78 ++++++++++++- reportbuilder/upgrade.txt | 2 + 3 files changed, 162 insertions(+), 25 deletions(-) diff --git a/reportbuilder/classes/local/filters/tags.php b/reportbuilder/classes/local/filters/tags.php index a0730d24c2c63..b04de1d305ec5 100644 --- a/reportbuilder/classes/local/filters/tags.php +++ b/reportbuilder/classes/local/filters/tags.php @@ -18,17 +18,24 @@ namespace core_reportbuilder\local\filters; -use coding_exception; use core_tag_tag; use lang_string; use MoodleQuickForm; use stdClass; use core_reportbuilder\local\helpers\database; +use core_reportbuilder\local\report\filter; /** * Class containing logic for the tags filter * - * The field SQL should be the field containing the ID of the {tag} table + * The filter can operate in two modes: + * + * 1. Filtering of tags directly from the {tag} table, in which case the field SQL expression should return the ID of that table; + * 2. Filtering of component tags, in which case the field SQL expression should return the ID of the component table that would + * join to the {tag_instance} itemid field + * + * If filtering component tags then the following must be passed to the {@see filter::get_options} method when using this filter + * in a report: ['component' => 'mycomponent', 'itemtype' => 'myitem'] * * @package core_reportbuilder * @copyright 2022 Paul Holden @@ -80,14 +87,26 @@ public function setup_form(MoodleQuickForm $mform): void { $mform->addElement('select', "{$this->name}_operator", $operatorlabel, $this->get_operators()) ->setHiddenLabel(true); - $sql = 'SELECT DISTINCT t.id, t.name, t.rawname + // If we're filtering component tags, show only those related to the component itself. + $options = (array) $this->filter->get_options(); + if (array_key_exists('component', $options) && array_key_exists('itemtype', $options)) { + $taginstancejoin = 'JOIN {tag_instance} ti ON ti.tagid = t.id + WHERE ti.component = :component AND ti.itemtype = :itemtype'; + $params = array_intersect_key($options, array_flip(['component', 'itemtype'])); + } else { + $taginstancejoin = ''; + $params = []; + } + + $sql = "SELECT DISTINCT t.id, t.name, t.rawname FROM {tag} t - ORDER BY t.name'; + {$taginstancejoin} + ORDER BY t.name"; // Transform tag records into appropriate display name, for selection in the autocomplete element. $tags = array_map(static function(stdClass $record): string { return core_tag_tag::make_display_name($record); - }, $DB->get_records_sql($sql)); + }, $DB->get_records_sql($sql, $params)); $valuelabel = get_string('filterfieldvalue', 'core_reportbuilder', $this->get_header()); $mform->addElement('autocomplete', "{$this->name}_value", $valuelabel, $tags, ['multiple' => true]) @@ -110,26 +129,66 @@ public function get_sql_filter(array $values): array { $operator = (int) ($values["{$this->name}_operator"] ?? self::ANY_VALUE); $tags = (array) ($values["{$this->name}_value"] ?? []); - if ($operator === self::NOT_EMPTY) { - $select = "{$fieldsql} IS NOT NULL"; - } else if ($operator === self::EMPTY) { - $select = "{$fieldsql} IS NULL"; - } else if ($operator === self::EQUAL_TO && !empty($tags)) { - [$tagselect, $tagselectparams] = $DB->get_in_or_equal($tags, SQL_PARAMS_NAMED, - database::generate_param_name('_')); - - $select = "{$fieldsql} {$tagselect}"; - $params = array_merge($params, $tagselectparams); - } else if ($operator === self::NOT_EQUAL_TO && !empty($tags)) { - [$tagselect, $tagselectparams] = $DB->get_in_or_equal($tags, SQL_PARAMS_NAMED, - database::generate_param_name('_'), false); - - // We should also return those elements that aren't tagged at all. - $select = "COALESCE({$fieldsql}, 0) {$tagselect}"; - $params = array_merge($params, $tagselectparams); + // If we're filtering component tags, we need to perform [not] exists queries to ensure no row duplication occurs. + $options = (array) $this->filter->get_options(); + if (array_key_exists('component', $options) && array_key_exists('itemtype', $options)) { + [$paramcomponent, $paramitemtype] = database::generate_param_names(2); + + $componenttagselect = <<get_in_or_equal($tags, SQL_PARAMS_NAMED, + database::generate_param_name('_')); + + $select = "EXISTS ({$componenttagselect} AND t.id {$tagselect})"; + $params = array_merge($params, $tagselectparams); + } else if ($operator === self::NOT_EQUAL_TO && !empty($tags)) { + [$tagselect, $tagselectparams] = $DB->get_in_or_equal($tags, SQL_PARAMS_NAMED, + database::generate_param_name('_')); + + // We should also return those elements that aren't tagged at all. + $select = "NOT EXISTS ({$componenttagselect} AND t.id {$tagselect})"; + $params = array_merge($params, $tagselectparams); + } else { + // Invalid/inactive (any value) filter.. + return ['', []]; + } } else { - // Invalid/inactive (any value) filter.. - return ['', []]; + + // We're filtering directly from the tag table. + if ($operator === self::NOT_EMPTY) { + $select = "{$fieldsql} IS NOT NULL"; + } else if ($operator === self::EMPTY) { + $select = "{$fieldsql} IS NULL"; + } else if ($operator === self::EQUAL_TO && !empty($tags)) { + [$tagselect, $tagselectparams] = $DB->get_in_or_equal($tags, SQL_PARAMS_NAMED, + database::generate_param_name('_')); + + $select = "{$fieldsql} {$tagselect}"; + $params = array_merge($params, $tagselectparams); + } else if ($operator === self::NOT_EQUAL_TO && !empty($tags)) { + [$tagselect, $tagselectparams] = $DB->get_in_or_equal($tags, SQL_PARAMS_NAMED, + database::generate_param_name('_'), false); + + // We should also return those elements that aren't tagged at all. + $select = "COALESCE({$fieldsql}, 0) {$tagselect}"; + $params = array_merge($params, $tagselectparams); + } else { + // Invalid/inactive (any value) filter.. + return ['', []]; + } } return [$select, $params]; diff --git a/reportbuilder/tests/local/filters/tags_test.php b/reportbuilder/tests/local/filters/tags_test.php index a3148673c087d..9d42c591eb8da 100644 --- a/reportbuilder/tests/local/filters/tags_test.php +++ b/reportbuilder/tests/local/filters/tags_test.php @@ -20,7 +20,9 @@ use advanced_testcase; use lang_string; +use core_reportbuilder_generator; use core_reportbuilder\local\report\filter; +use core_user\reportbuilder\datasource\users; /** * Unit tests for tags report filter @@ -38,7 +40,7 @@ class tags_test extends advanced_testcase { * * @return array[] */ - public function get_sql_filter_provider(): array { + public static function get_sql_filter_provider(): array { return [ 'Any value' => [tags::ANY_VALUE, null, ['course01', 'course01', 'course02', 'course03']], 'Not empty' => [tags::NOT_EMPTY, null, ['course01', 'course01', 'course02']], @@ -102,4 +104,78 @@ public function test_get_sql_filter(int $operator, ?string $tagname, array $expe $courses = $DB->get_fieldset_sql($sql, $params); $this->assertEqualsCanonicalizing($expectedcoursenames, $courses); } + + /** + * Data provider for {@see test_get_sql_filter_component} + * + * @return array[] + */ + public static function get_sql_filter_component_provider(): array { + return [ + 'Any value' => [tags::ANY_VALUE, null, ['report01', 'report02']], + 'Not empty' => [tags::NOT_EMPTY, null, ['report01']], + 'Empty' => [tags::EMPTY, null, ['report02']], + 'Equal to unselected' => [tags::EQUAL_TO, null, ['report01', 'report02']], + 'Equal to selected tag' => [tags::EQUAL_TO, 'fish', ['report01']], + 'Equal to selected tag (different component)' => [tags::EQUAL_TO, 'cat', []], + 'Not equal to unselected' => [tags::NOT_EQUAL_TO, null, ['report01', 'report02']], + 'Not equal to selected tag' => [tags::NOT_EQUAL_TO, 'fish', ['report02']], + 'Not Equal to selected tag (different component)' => [tags::NOT_EQUAL_TO, 'cat', ['report01', 'report02']], + ]; + } + + /** + * Test getting filter SQL + * + * @param int $operator + * @param string|null $tagname + * @param array $expectedreportnames + * + * @dataProvider get_sql_filter_component_provider + */ + public function test_get_sql_filter_component(int $operator, ?string $tagname, array $expectedreportnames): void { + global $DB; + + $this->resetAfterTest(); + + // Create a course with tags, we shouldn't ever get this data back when specifying another component. + $this->getDataGenerator()->create_course(['tags' => ['cat', 'dog']]); + + /** @var core_reportbuilder_generator $generator */ + $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); + $generator->create_report(['name' => 'report01', 'source' => users::class, 'tags' => ['fish']]); + $generator->create_report(['name' => 'report02', 'source' => users::class]); + + $filter = (new filter( + tags::class, + 'tags', + new lang_string('tags'), + 'testentity', + 'r.id' + ))->set_options([ + 'component' => 'core_reportbuilder', + 'itemtype' => 'reportbuilder_report', + ]); + + // Create instance of our filter, passing ID of the tag if specified. + if ($tagname !== null) { + $tagid = $DB->get_field('tag', 'id', ['name' => $tagname], MUST_EXIST); + $value = [$tagid]; + } else { + $value = null; + } + + [$select, $params] = tags::create($filter)->get_sql_filter([ + $filter->get_unique_identifier() . '_operator' => $operator, + $filter->get_unique_identifier() . '_value' => $value, + ]); + + $sql = 'SELECT r.name FROM {reportbuilder_report} r'; + if ($select) { + $sql .= " WHERE {$select}"; + } + + $reports = $DB->get_fieldset_sql($sql, $params); + $this->assertEqualsCanonicalizing($expectedreportnames, $reports); + } } diff --git a/reportbuilder/upgrade.txt b/reportbuilder/upgrade.txt index 382a2a77bb4a3..8dd39c7a036c1 100644 --- a/reportbuilder/upgrade.txt +++ b/reportbuilder/upgrade.txt @@ -17,6 +17,8 @@ Information provided here is intended especially for developers. and `$exclude` parameters * Custom reports now implement the tag API, with options for specifying in the `report::[create|update]_report` helper methods as well as in the `create_report` test generator method +* The `tags` filter has been improved to also allow for filtering by component/itemtype core_tag definition - this is more + suited for system reports * New report filter types: - `filesize` for reports containing filesize data From a5a25988dc43722a669624575e940be3e1778b4d Mon Sep 17 00:00:00 2001 From: Mark Johnson Date: Wed, 24 Jan 2024 14:38:29 +0000 Subject: [PATCH 04/51] MDL-79007 calendar: Expose block month link names to screen readers --- theme/boost/scss/moodle/calendar.scss | 2 +- theme/boost/style/moodle.css | 10 +++++++++- theme/classic/style/moodle.css | 10 +++++++++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/theme/boost/scss/moodle/calendar.scss b/theme/boost/scss/moodle/calendar.scss index cff348758269c..9991b797caac8 100644 --- a/theme/boost/scss/moodle/calendar.scss +++ b/theme/boost/scss/moodle/calendar.scss @@ -557,7 +557,7 @@ $calendarCurrentDateBackground: $primary; } .calendarwrapper { .arrow_text { - display: none; + @include sr-only; } } } diff --git a/theme/boost/style/moodle.css b/theme/boost/style/moodle.css index 8ba5690c5008f..97daf5ae0ad54 100644 --- a/theme/boost/style/moodle.css +++ b/theme/boost/style/moodle.css @@ -27627,7 +27627,15 @@ aside[id^=block-region-side-] .block_recentlyaccesseditems .dashboard-card-deck height: 0; } .path-course-view .block.block_calendar_month .maincalendar .calendarwrapper .arrow_text { - display: none; + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; } .path-course-view .block.block_calendar_month .footer .bottom .footer-link { display: block; diff --git a/theme/classic/style/moodle.css b/theme/classic/style/moodle.css index 5d6a658ebde59..65a272e351fa3 100644 --- a/theme/classic/style/moodle.css +++ b/theme/classic/style/moodle.css @@ -27627,7 +27627,15 @@ aside[id^=block-region-side-] .block_recentlyaccesseditems .dashboard-card-deck height: 0; } .path-course-view .block.block_calendar_month .maincalendar .calendarwrapper .arrow_text { - display: none; + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; } .path-course-view .block.block_calendar_month .footer .bottom .footer-link { display: block; From ca8f1971489c1442a23e6ca74ae0adad986eef6f Mon Sep 17 00:00:00 2001 From: Juan Leyva Date: Thu, 7 Mar 2024 10:39:00 +0100 Subject: [PATCH 05/51] MDL-81132 mod_forum: Perforance improvements for app --- course/tests/externallib_test.php | 1 + mod/forum/lib.php | 4 +++- user/externallib.php | 2 ++ user/lib.php | 4 ++-- user/tests/externallib_test.php | 1 + user/tests/userlib_test.php | 2 ++ 6 files changed, 11 insertions(+), 3 deletions(-) diff --git a/course/tests/externallib_test.php b/course/tests/externallib_test.php index e584b4c75626f..8ef560dc70e24 100644 --- a/course/tests/externallib_test.php +++ b/course/tests/externallib_test.php @@ -1197,6 +1197,7 @@ public function test_get_course_contents() { ), $module['purpose'] ); $this->assertFalse($module['branded']); + $this->assertStringContainsString('trackingtype', $module['customdata']); // The customdata is JSON encoded. $testexecuted = $testexecuted + 2; } else if ($module['id'] == $labelcm->id and $module['modname'] == 'label') { $cm = $modinfo->cms[$labelcm->id]; diff --git a/mod/forum/lib.php b/mod/forum/lib.php index 1f25fa4f5f72c..4b2c9690ce37f 100644 --- a/mod/forum/lib.php +++ b/mod/forum/lib.php @@ -6478,7 +6478,7 @@ function forum_get_coursemodule_info($coursemodule) { global $DB; $dbparams = ['id' => $coursemodule->instance]; - $fields = 'id, name, intro, introformat, completionposts, completiondiscussions, completionreplies, duedate, cutoffdate'; + $fields = 'id, name, intro, introformat, completionposts, completiondiscussions, completionreplies, duedate, cutoffdate, trackingtype'; if (!$forum = $DB->get_record('forum', $dbparams, $fields)) { return false; } @@ -6505,6 +6505,8 @@ function forum_get_coursemodule_info($coursemodule) { if ($forum->cutoffdate) { $result->customdata['cutoffdate'] = $forum->cutoffdate; } + // Add the forum type to the custom data for Web Services (core_course_get_contents). + $result->customdata['trackingtype'] = $forum->trackingtype; return $result; } diff --git a/user/externallib.php b/user/externallib.php index 0213d9425d562..360fba70c0fac 100644 --- a/user/externallib.php +++ b/user/externallib.php @@ -1139,6 +1139,8 @@ public static function user_description($additionalfields = array()) { 'theme' => new external_value(core_user::get_property_type('theme'), 'Theme name such as "standard", must exist on server', VALUE_OPTIONAL), 'timezone' => new external_value(core_user::get_property_type('timezone'), 'Timezone code such as Australia/Perth, or 99 for default', VALUE_OPTIONAL), 'mailformat' => new external_value(core_user::get_property_type('mailformat'), 'Mail format code is 0 for plain text, 1 for HTML etc', VALUE_OPTIONAL), + 'trackforums' => new external_value(core_user::get_property_type('trackforums'), + 'Whether the user is tracking forums.', VALUE_OPTIONAL), 'description' => new external_value(core_user::get_property_type('description'), 'User profile description', VALUE_OPTIONAL), 'descriptionformat' => new external_format_value(core_user::get_property_type('descriptionformat'), VALUE_OPTIONAL), 'city' => new external_value(core_user::get_property_type('city'), 'Home city of the user', VALUE_OPTIONAL), diff --git a/user/lib.php b/user/lib.php index e7e46e2de08cd..4d437d3ac8aed 100644 --- a/user/lib.php +++ b/user/lib.php @@ -300,7 +300,7 @@ function user_get_default_fields() { 'institution', 'interests', 'firstaccess', 'lastaccess', 'auth', 'confirmed', 'idnumber', 'lang', 'theme', 'timezone', 'mailformat', 'description', 'descriptionformat', 'city', 'country', 'profileimageurlsmall', 'profileimageurl', 'customfields', - 'groups', 'roles', 'preferences', 'enrolledcourses', 'suspended', 'lastcourseaccess' + 'groups', 'roles', 'preferences', 'enrolledcourses', 'suspended', 'lastcourseaccess', 'trackforums', ); } @@ -612,7 +612,7 @@ function user_get_user_details($user, $course = null, array $userfields = array( } if ($currentuser or has_capability('moodle/user:viewalldetails', $context)) { - $extrafields = ['auth', 'confirmed', 'lang', 'theme', 'mailformat']; + $extrafields = ['auth', 'confirmed', 'lang', 'theme', 'mailformat', 'trackforums']; foreach ($extrafields as $extrafield) { if (in_array($extrafield, $userfields) && isset($user->$extrafield)) { $userdetails[$extrafield] = $user->$extrafield; diff --git a/user/tests/externallib_test.php b/user/tests/externallib_test.php index 3e1ddc64e1e4c..5701a2e4bd527 100644 --- a/user/tests/externallib_test.php +++ b/user/tests/externallib_test.php @@ -304,6 +304,7 @@ public function test_get_users_by_field() { } // Default language and no theme were used for the user. $this->assertEquals($CFG->lang, $returneduser['lang']); + $this->assertEquals($generateduser->trackforums, $returneduser['trackforums']); $this->assertEmpty($returneduser['theme']); if ($returneduser['id'] == $user1->id) { diff --git a/user/tests/userlib_test.php b/user/tests/userlib_test.php index 56947ee62b291..7271b2fed40bb 100644 --- a/user/tests/userlib_test.php +++ b/user/tests/userlib_test.php @@ -892,6 +892,7 @@ public function test_user_get_user_details_missing_fields() { 'theme' => $CFG->theme, 'timezone' => '5', 'mailformat' => '0', + 'trackforums' => '1', ]); // Fields that should get by default. @@ -903,6 +904,7 @@ public function test_user_get_user_details_missing_fields() { self::assertSame($CFG->theme, $got['theme']); self::assertSame('5', $got['timezone']); self::assertSame('0', $got['mailformat']); + self::assertSame('1', $got['trackforums']); } /** From 39813b1f50d9d33dbc01f42fed47711fb103e6df Mon Sep 17 00:00:00 2001 From: Kevin Percy Date: Mon, 11 Mar 2024 12:57:48 +0800 Subject: [PATCH 06/51] MDL-79668 lib: Update Font Awesome to v6.5.1 --- .../content/moodle/components/moodle-icons.md | 2 +- lib/fonts/fa-brands-400.ttf | Bin 187208 -> 207972 bytes lib/fonts/fa-brands-400.woff2 | Bin 108028 -> 117372 bytes lib/fonts/fa-regular-400.ttf | Bin 63952 -> 68004 bytes lib/fonts/fa-regular-400.woff2 | Bin 24948 -> 25452 bytes lib/fonts/fa-solid-900.ttf | Bin 394628 -> 419720 bytes lib/fonts/fa-solid-900.woff2 | Bin 150124 -> 156496 bytes lib/fonts/fa-v4compatibility.ttf | Bin 10172 -> 10832 bytes lib/fonts/fa-v4compatibility.woff2 | Bin 4568 -> 4792 bytes lib/thirdpartylibs.xml | 2 +- theme/boost/scss/fontawesome/_variables.scss | 36 +++++++- theme/boost/scss/fontawesome/brands.scss | 5 +- theme/boost/scss/fontawesome/fontawesome.scss | 2 +- theme/boost/scss/fontawesome/regular.scss | 5 +- theme/boost/scss/fontawesome/solid.scss | 5 +- theme/boost/scss/fontawesome/v4-shims.scss | 2 +- theme/boost/style/moodle.css | 82 ++++++++++++++++-- theme/boost/thirdpartylibs.xml | 2 +- theme/classic/style/moodle.css | 82 ++++++++++++++++-- 19 files changed, 191 insertions(+), 34 deletions(-) diff --git a/admin/tool/componentlibrary/content/moodle/components/moodle-icons.md b/admin/tool/componentlibrary/content/moodle/components/moodle-icons.md index 56d0d365972b0..269be9340febf 100644 --- a/admin/tool/componentlibrary/content/moodle/components/moodle-icons.md +++ b/admin/tool/componentlibrary/content/moodle/components/moodle-icons.md @@ -11,7 +11,7 @@ tags: ## Description -Most Moodle icons are rendered using the 6.4 versions of [Fontawesome](https://fontawesome.com/v6/search). Iconnames are mapped from the Moodle icon name to the Font Awesome icon names in `/lib/classes/output/icon_system_fontawesome.php` +Most Moodle icons are rendered using the 6.5.1 versions of [Fontawesome](https://fontawesome.com/v6/search). Iconnames are mapped from the Moodle icon name to the Font Awesome icon names in `/lib/classes/output/icon_system_fontawesome.php` If needed a theme can override this map and provide its own mapping. diff --git a/lib/fonts/fa-brands-400.ttf b/lib/fonts/fa-brands-400.ttf index 989f323b1e32b3522c404c91818fb9b67a5e76c0..5efb1d4f96407d7019631b361b571ea454f6ce09 100644 GIT binary patch delta 90172 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ǎ3ZaEbvzh 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
Fu2c+838Y&)^E+3-Bm4W3Quvmd7ZA;T~L2aTdA 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 (9-OFzAnA&{~+ueE@D7wB~ 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 Mmwo4#{(}Jn0Ko!AUjP6A diff --git a/lib/fonts/fa-regular-400.ttf b/lib/fonts/fa-regular-400.ttf index 201cc58b85387a7c15ca41662393dbd53e9c600f..838b4e2cfec1735771f6a237c7b28d6be5f62bfc 100644 GIT binary patch delta 26322 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 TTPv&Ii^=Lkk$um<=P3DqNQt?( delta 22373 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 diff --git a/lib/fonts/fa-regular-400.woff2 b/lib/fonts/fa-regular-400.woff2 index a395e91bbff383119ab64e607282f5a0ce7f0425..b6cabbacb67f4ac88248ef235c5d7a5361f7003b 100644 GIT binary patch literal 25452 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 literal 24948 zcmV)$K#sq6Pew8T0RR910AX|h3IG5A0PjQq0AVNt1OWg500000000000000000000 z00001I07UDAO>IqhEM>n0Lp`#M9YIL1&9a-AcdiKRUtjEr9DJc)Ot80IcfC(sA`oE zcZaR{+1BhlbQ`cn~1hqtHyA62uz_knm1B!Tx(A1JZ|BtVIh z2$CW|Nh6Chv8OpjGigrOc4yaTtexs?8>Ks2l~%1ZA8&VB=eF)GzjUW{|EBEx0{=u) ztFKqxUDef4)mSAUt1Y!1gIaD&Z8>qG%_K7kI~nq@mou~E<;Ja+X+k z9~Q_*>;od@=W)*eb3J;~hO_~SWQC?^1uB?4y3U+21=cB}Jm_=pN-{uB zw%9ZC^(|{8*>TzyZ|j+CYndxeP6C`sK(ZOI+ozE0ZEMNQ)rtx`KytOBfd_Zl0lt7P z1_RIJ$TH_zdnH&2k?$%prOK`Sgb^}8mSy)X#@2u3kHdJ1C~VE_nG9F$y-IDRKp{kC za%&=J&@imM;9%O+X5u?q6#fIi!~QUB+l$Yr&q{@2l+YB(4a$Z@>9Z1rBB24ooBm1a z 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

jIxWMNi78h)Rz^ zxbLpA>4I9iWRX$=_rkt5*+g8SDX3AbAS;pjKG7377UE=Ey&Ab`8F$8NI}uI53F|je zT_9#9?{|-{w&QUo&3~`9v&x0D2p6h_M9kh^GZBj@7%jX5p*7$?1`JzS2AkIIj#y*& z&1nM8LBGdjsqRn0iU~?!Dr>E&jUEqUDQ{mpb#fn0`OdKZ(yUJv7bk$#9{=)2vy8>; z{Ko30N=~8b$ruMF%+)1NqdMF~qZecANSifv4eHV72d$2vlO?1vJU5yBO5W0eL2x(w8D4 z%COPr5MX7c@Y?Xrd^p?~Fr5cFWP6jb9se==KhuQM3#1C+Ge_*K#TZB!0ti!}ABv`n zX(0wtki^WVhW>(0^4IKVJM7S(-M9C%)8>#0F*QgQQotyP9MW_=`5}_eHSKTbrgI){ z>6XYtn1_eet`P5bm+o)p&qcSO+(EHCNPQzkM!=a9%Gy27zIcCI=PK9P25!a*w*fv* zZzOSo8XKivz(EpW@p6aD?2i*z&R%CHERZGu$Xf_RK+rQc1d@Per-D+2Eu|E`^SXfR z@5Oa?o$T8i6vLw)By^B$<5y)dY+;1NW{x9{%r5jB0`P&NnQNnn)tU3G==$SCC~6a3 z?)C%h&Aq`mR9#jUDtCu(j(%WIIUev4qx7B~b%qwl%|3FVy}7CiXgP}Aa>9B$DTh8& zbbe>)lRhKmX;ciU#FC<0+&k+5>;!D8^+d4?n)QomsU z$6a!e-BhGn-~cv%G(_gRzaM0$MKKqb+Gx+KWXa1xIQ;sN5xInJ7^<7@@r^k2_w4!6 zWL}z==3x8eL{!IQX}b&b45k4aEo9Gnn$lABSl&6Yyjv<%uXNbamu55!}j|#mgjN3Jn&K7pkj?3+VqE zZ)AA^mF8rUqh#_k_M2Uoj$;+en}L<^j?17O5{+ z9BNM+wxRoDIQt^H9oy*fA&K)J=AtJ&1KBOtL|I@Dlyt3K8?O1cp{LoQOg4 zyl$U%g@G|8E9VPWve{PG^!34Lq^HYd`hw35Jw0yTX4};W4XwPJg29^;buLk5eBH|p zZiW$f<7V5$d($I@2tmaGKtJcbQ;*pB9<=-A5SlaS-f0QKLJH8VYf7HOGGLCLVM0wBOWa{v!vg6NWj#WLUqHv~dl%aOLR9ICU#MZGt=`rZCV+C$b?f;)ogmSgTjIZ`^g08tVr ziHMWmk1A)^AFHKaOyYppx?IR^U@cGr81?gx4)@lPc203kO%G2B$i(AAgYa^89A&4$ zNC_+mqN#swIOk4`svsW{wON^^|4LMMmmX!0*0KloRPzAxjE;+ZKk_m;9G)gtwqk7F zC-Gy%1heo9S{4ET*>Dw=$VduRXt#>Q1hooif~)Q{uDnm(Xq7mTMg+~9;GyWs{}b3?vcK-z{0y*uGNL35r_-|Zfh3T|lww#2 z{v*f00Mk`TNENbH%m!cRYd3s9{O8U&+J1hLjUf9DRri=V1M?kHpZ*Org|Wy;2Mr-0W05eLakn08XTjAKpxqR4 zbcJ=<(BMG?oDhfV$qr0_Ak|4UQrtmctHD4-RR;ihTxf!Z@&#gM|L+wP@Q56@?34C* zWcCCwogt;yA)!dQ>TU>wlf484r=Z2|%yx7PZ1TkmCqCK=m>y&TCXU0lD>eJ5O|6z4 zHxcg;MywU7ml)#xNjglpz1-D;XC(Va?yvYxZI{mzF;RS1&Q=E;xaej(GL+r>$JqsD zolAep9=lP;5)qtUMXY9QFEE6$2)>Ag?VclknV-mRI0RpQun*nw583zjrw}&lbM@Qo z6#MquZsIf`RL?fsS_akQ74rm+itRw?ov8xI2-{{m-P7Cb72Onb1J+`rYzoMR-@qp@ z3J)sXL@vyV)Eg&nk*yA?TU_x?`Fp@Wpo=LgN(~uVjt5QgL|3pe*-b)6BcM;_8OUeV zTWBY`C2yjvS?dXQ%`zDgnjB!NF2py99tgreOr4`qF6k)&qGbB~Ssa5{8TYjlp!Vho z_0oZqKz3%Ekdq>^s<>>aQLEIkc@M93Jt+Y=u%tp;FEb4P*$e}LLm3PeB|}6qrk)>LR2(f`RO~MPw7pdJHxP@Vm@>Y_%5)b2AgY^?E@f6; zhNE7S%}Sg(J$h7c^qc8FBMZZ9gzpgdy4ojk=m9+kjDRSvtANdn&z_DLzHzUdVtc{F zBl-A$#E^4zWLN^BfLw?tr~J)@A;yLQjec_)iG?(o0BF2Y3F%HxB86dXKx2w1fuK+a zE5CKmoNnh}z>WWb0b{gY7$yW@PpXmclZ?d$DGZO-Stz7@|6%r^K)TDw;g(3VIDDMxwH6$EK zX2^jhpUTPUBVH+77>%h3ua7DUcF<-j)Jn%M53@Tkti)I_#u8t zPM@)0a%nHlg6QbACoc^&G;SsE4Fhu8R!$y>OJIrzCCXGO?-|>^8o~yAe}PYz?It0EnKD#MMXSmrNUih z*me`2JUMR0OrGox{S4BwRdXT*Zl(zJV#dDXLajqtH1K<0Y^r^Uaq=7R5MVWyQ6;Ca zdwv7KD$)-EKz{*Rrcx$JB|1|aFQ{zjfqZpue#V}@t_?np%~HJ`>yPOJCxFG&4YC*B z#y2uQCWz}^Jt(Seu!q_J)7jZQ?ND-3)J@?0tSiDVs%BEfbg!Ia@2Bjsk+PjXw8xpR z0y}|DoFkOq%rDaBky?bj5E%tC|*`fxBGyfm)MW8SQ)qK z0=vf=ZYgL5H=}>HX|-mSjWnm#S>$!; zvoCTls(JY%12NPfBJSCq{Cc-~A%x(2GxMe&JXTokc1WKl*^|M#4jdM7p2QBDCor`& z!b0PDck-j$s*CM2P@;_IhZv7Y#d?UfbEE@OXeCye&JbT#ljFga*{YO8f`L@4igW3L z8)_e~D(=6L0V8-2eiEXZ+zIC!bqtVwn14Jc$R38WU!M3s&h%d5AmTw;lNvo$mGR_BdC% zH9rp<-4hFL(6YYx6)++rL2Rl zaScH8yx|Jl?0ds^jrz-(6!+pYiaNnzFt_k@okvbFcZtM0PSC9p=;OX=` zZtx03(}g*LCdkaViSz>)8aD?>qHrUCLKg3iztYxQUKT31Gj>KQ3*yB{J^9m>wyC49ue7|}(6UGHh^Pao zvi%6#kD#~#Lm5#6)b*x90W4uX98rM!odfl{U~=~W*1a)Ixp z7|H~)IHhE2%+!l>pUl03diIDrfG(j%{Ki1(r#Sm;@gmtK~6T$-nzdi|7z1Vfpqp398hgvIV3UP?~-HXoFMp=Zz!i%F9m(mqDr`n zK5x5BzkB@icFpXGP}P=rHq~qh6E?+WeC>>a24IgXP$>;6+uedM*fUYHM4T7{;F43c zZi`RMSuZpchPY}=QXUkTAu6s>W~0~<2)I#VYOeH)wzr^#BTRy)xqYv*&7vR@`NjI< zqH#&^c`;%ge=0D!N52uYz!XmNlC!1wVl*`KQ2fCwhU zz!ONbU>Zu5tQt!UlbX2_v;xr$K6Mi>lJo@mE2F>TSL8ToNC$2oG|%5TH2!JV%7$~D zpzfCI?e}_%kmNB3Wp_eb2#H%%_t~gV2`nmsa}?UUz+k1A3ENh*W7vQ^mm^j+a|g^w z7?W)@9>sRt8Ob!@pU;L&U-qhmUg8TT<6qp+kaVxyV5cvU3K`}p;MH{TcB_`C6XPq` z8#?o(55S|Au0p=Ny9-G!d-mHSmU17_Qq0U#Tsk>IC3<}o`1n~lyZ~y`@9pzLSWds_ zx04dV$Q$V29>Vb}H=>SONJ*H85W+DyPr;W_J~Vvc&;BU+6SPCPp+%R5Wa-%ZnQUT7N28|Qgdl`#J(q; z_Au}aSjIme63T8AMC@Nb@ijsC5lIODX&XklaXbgrBwm+m3bV&K_J8FFGTqqggRIU$=SRxT-rE3m&q6Dn$cyt}N z*i+@K-9gcwc-GQV?7)P6=~IHNYaqnPHMFd`PMNDJ84rXaAc1Ap)dX&J?&5O;%mCD` zE-2`1tg1BQT>Y)K1SR99-3p;x;1ACHP4_ zo|;!wm2^@H{+GAf8Lsp;+q|TPIme^e&t8+|U}%JxLfCIg*F?M02G6+7&O9iSVL9Cl zcasL6F#HB+BJhMGe+7MwlH&?C%kU4i9ac`I;KNFbQ=F0)g5b)%j=RHF?SVd^>Gt~r4|Lrw)gUG9+tV)N zlEJOc)X>lFu{$tuK%&z92~D!yBr@CyXsW#R9|mTZxzlzw;zp50*zHZ~)yy`AHadM5M{rfr>6*3A-zLO0#M%B*+ zd2-QRb|2Y!4y6g=jRgZf2x)1%JzkVI$-PvVSL|ke#kSz#QUs2+jry>vc^+FU=fh`y z#jbP5!M)In$}R(@2i{{?=HPwQ^T>@#h5*cKd$p_L_0Go!}K!=DHIvByU)G0epe5)xG&vn&vn~Ao>z!RXMprUtp20bQLfp?zGll&{~>FZ zu|Mh!%B;BMqSk%sOL-HDw!MaIaihy&|8xgLLb$R4QRLJ^Pi{2q|D?YKyZvLe^<__y-_= z%eh5DTiZNSS%+)MyOozxQ!>cK!pkw5c>!j@>xY<)FrAy4}@2V0#ZFzDLSs%!~~#7W;g^@3e&g>vJb%G)2fp|%{2p9v)??3Iu_lo z<{_Iofaf3`gPGFy;NUfN1B!b$^i1W+n8zsAr7thgZKZDyK;{D)T_^$ikbSY2^%r$# z06m#oPl$xN_LAiR25IfJ*5iWa&^&=*8tz4Rls|c zlrUP_{qbR&j-EDmu4{Y5){OZ?bjF0%*4BsI-jCS%d9`!q%yB!;v$gvzn!Mklwt5`A za)qov76AUsTM@8e(iYkWR53lY9uND_$vp$f>FehTe)q;B_Tb(pBaH+s_Pw+ci8wzv zyR!@C>0PMF5jv=t^(~k_o4pH5rxn)1i%2ape65Z(I2O!cNl9tLI2;lmcIt?{@g1lY=?nu6xv8cq9gq0%Jf8z~z`eTs# z*FI(^_K+Az5;Q@H$NcQ$DNPxER%;;F*A-|z`V5~1YJoV^7~wT3!zBmoPnTD*^ou8B z*^}?F;S+J+PU0X)E*Mg0*v2QXlNzy+hJ>YeSHy)sdqV>MHc;JT z&FqmzI8tuBc@OW>4b=M6=FM`;p0K6StxZjCab4c{nI?NU8OsF< zqXu;|V2(eukH0i&oZ`bo+&#ZD)$Z$0*oKwL?V-+sbzO9xX8qA z0wlPi$HmtmT*Cyk z#-aPkMyEezOWX;cB)kN%Tk`6}S&i<~gF7xd15L0z`eAk|ehyrvJPuf!LUy3;CHmn6VoAF$7xAtk9r&SYI1>d#dE`J8j zif=w+znGIAHbd<(_Eud=;(+w#B1t^NZGYCT-#i0O?1P4}8ctfl=?8rXbOkIwHR`T0 z{zwXBL@yPN;Hs{u0sSsF_rL5h`}g-#L6sMl`GH4gzV;Nv7^Ovvl84~ ze44F3N|GXdpOCNq%N<=^@CFddil=%HnRr0c8f6G+T&8E{%$dzeckmDG=X3V{wxN7$ z)|O7z0&c?pu|~r5gqwi~K;yH2WK-sHxA8|v$erUZ|B-EwK&zLGBVHMDPdw=1w2a5Y zhLj)A71ZLYcu<-6V_WLRJ#Sk^G`8#YPKuxfyoG6UoSlMA?&H5jV;4VfTNmdn8zcs| zDtHv_JGDI)BiSr5K%E9RxI9cPI79AzE?VKrcwA&yf{?(Kpl{3+;|cffw*JI!gA<-a_p_u~=@+0|6Z4SUGcBezSZ3mi#Wn!`g1m zpXAa(anD_qf&#Zcw#I{j>@EyZ1qKYDD=;v`qu#Z<-_`)w zqu=a~zaxKxYk$SAM>ubk0q!;cfo}oF^!YM3#qaL7Riod`0XB5N%c;D@d+Ql?%pUMo zfA`+7_iz2HJVb?QcB!4O*fHj2l(pI)C!~Fb(v3JF_EHsaB8L-&#!LGVNBD;MLf{>f z3N69{$xy30vH7E&YM_U{WYh8ZIA{l1Tye7p?Pe2qR}I>uO@aHzpsf>>9X>d!CLtmb zaiI(E?d1@A6QfGDh(ya0jH;>R0|}~CR7`}vU`uzC1bNAuWkm5-U=(s0$y_N$MDY2K zxEo%xuTvlD2|1=<=Mdg1AXfB(Dm<_oNTUI~(=63uNNt9cEVJFPVXg%1?gb*Z+w$VAeex#wfAfKt1DLWn=R5+`Rv1Pu&1{J%AB>8zW$z8CDzEr^rgDPM{!t_$YFEca2{|+Ws+5 zn1q}2E1N*lN8{JwKI-|EtvUdG>Mq9&VsD=olonYd-UpqRw+|gSh<-sS%FGE3vBU6A zEbj&sNO@wXOQo95tUdp$U)cwwhT2KH{w2Q5it`h#}SrMYtN(OK|0sVj=m8cvT5Wwx$`~h2%=l|Ar=6Eq+bZ7ldc?pIw zCFl6Q-`ayq2wHBYCSuQs9OoK-XJ;)p7(O+fJUR_0nb zxf*xZHpc%7$9}BHo%jFYHtDn2rVwvuy=;)+gp7yQ5tv~ z1qiD0Vl}8i4xdy_EU#*?sOUsgMyPxfj)5LG|4rMCs0CQltB5`JL${}_ZDIo`Q0-hTC+*vR7k_$OpBmAi3o*|pV7s&6Yarf_?r zAXZvYQ5q{qY@dq|!*Orfg(x4#x;8y1vGrLw+foc5A~SmuuMn3Nluc-|sEpDe^-|9% zCnTXU0{*5{slSD`l>5vLER*((&m`;kJzOl%{<6Z0JWxc$^tWxB#bR%K+b%Eb>8ami zkJ|G3a?ZDB2s3tfy>0jJjgxnYm6yU)_J&|S20Q#N8AdM(D^=DwFD`LH`Dl`mRQ^eu zsw)kRD0GQihu@J3-7!UdIm2%m*+`rF<8tuj{y*DtO+R2Rfp^09D}T1f9q4NpJYRB! zU>4arz@EacD4&f0TB66wx2?*82}~k6(H-}uuyBDM;J)w|yEkC?KYy{)Sbm!2yetYJ zmZ56ETJSu`b1$ix&-(t6xaK+MeAUf`bDo=o*oDu~D;1tVN z9Q5Q562}#AQbZHu+dy6Ni35t$sm#QTO46<0OcIiT22dS}Phkr3H3us|<-9(enNFdnX#@=Ob6IUcFzwxvajvzM-MsnCaWLxzGH~HuX-N zcu>Q}$rC0_m^g8QG0$$T?PVTd{q zKoOH7G-EOiT~Hu2364 z{q*nPg8qIoLX*XIj*Fa)ar#;9+shMqHSQ;hZQ}QDr4oBN^w0wcu-hg?cUe z#-Cj5A2_VO&F%RQyS%p%G`$o`!eM~n=L9FoH3F9%H2}87cXpFdw_Q@fBm54YcJ{|1 za1iK>m;#JcrmDPI-ErRUq*T3Qo-%X(N)%SPnr%&FWk14ZeX`@KO=Knt3HJ3phZy#R zA=E!?aNR@pk~Q=Rdh+X1#@A30zZRFX^L7NR4cfoP#{X?Hod#%{o`N z)6S0d^$qPrp}ddnw5|KF8)O*oRyX84e)Ay`6#W2Qe03*sE1ubD+w%MR{yuxQdw-{G zUeERy?Y7(V1J)p@&O^Yui6&YdJ$2c#tIv$KU;UM6{gM90@;)FFJ57V}?%uSbxe9@& z56A@d7(4PDh&aO5O)$|}<^s3YL|fd6Cfd{+iD$(>yKTp8SE8^0xygttLDsHx4JMj&jW)UtXCJq@X(vQ$-F6#I&E~Kc<6uqNJG(O^P!~e> zHd<4y@)hVKYKc%0*FWjTMWZLUGosPOTk>*dzi5|{?GY&JdzDAHn}B4XJAz#4tSQBr z)w!v8(c-Z)W<>L-N#;e}pZ3YC?gc6js-e*1y&VUsm6>2o;U@}>9gY-pq>9w;03ixy z=i|7@BoI{^Lle^SFupbI%uZWVanwZoV^Q(8;^H=z7~j^`=6;hGZC#Gxy~-c?C4Ry0 zi3HD4^FHbikq9gtFVmn9=>hYQGjt%0LBu^`<{-BAV6CB4Lg=K$ax5QR(;IUOgx zJ-`?&RV9tT&@TyoK}oC5QV1}r9}qTFLOMrsvh*lliB{n~qQ(?NY3IjAYa4-VKXBm# z1+vgndPX!ctOfUpvC;SS>^_0dJfL*9=`0 zfgorP)-}82G<>cxUunE4#j{BCq(Jt^-)48EL?~(|Ocf-WJ9J$1N@!rJj)+3r0DGS4 zW5iDYIPR&M>UHb}N&~3@h!kj0_bCrARf6A{or69pzJ2-61^3v!d8V|qG%p^HCT7Ot zGZRsFP*HTQnc*%kiY{9n9!eKxx&@HKP`J{dD_|vQsTD2`@&`1EYZ5k@I1b z-vJ~fATW5fUzG`R44_S!9I4%tQJkyD3s0J5uSZ&>Nri@Y$KJbR`6fe_FS~~xnA1qA zs}=I8uO!+Y7`M!{k0R6F{dY;U8X?EGOQN6Fnq`AnY}PoO3XO3cqR(0SrE(}bekThD zC^eIpsNPSQ(`78fkIB zf64l?Xdkv+zfcyP#Tptk#9tKeSrasrRX{VMYfX9d$E3!w_*MNXJY$9%Xttqv%QZm9 zMZZKLMDVT8OSlq)p-+2h!5v*@!9Du!4d|GpB{PZC=Kr3UF_C9 zR1s}81NXmL5sew)KiLFd=A$gf93dRD`S5M+vq`i{bt#dp%Kf3H#p06Y%MVKYjd5;r zR%A$(my9d5Yx%lyOi{eem`TlZfP>JOmQK3TeCn@%{i~VPJEjOH|Cp*N<(W)*d2MaE zd3aoDdC5>4Usss&l7jBN%jZvaJI^~a$>cs}CP&j;O(t#HCh24{y*oXi zDMwEVEtEF3EzoimM3Bp*+@L_q^(Y8b@B~y~T|rR@AmR$H)z#1I6T_~$i>`{RpVvzI z{eJ)d`_4>C3c5?uX0CUh_j&&J_52_CE4GU#YduUu zDP~HlB%3FaQvd~R3+!nnpO^qXFtf@!$g8(G`;{5S_f|MVPRsb1>~Ahw8ZAfH=9e1H z2?OPba`u2I5UBHXX96U^JQ(CIdwW2K00BZR$&h$=K&xFj#msbmVlSLx`i^Jk0NA*` z)fJm`@}U84pAr~~rR~jF1%SjBX&cy|PBA+e|3n@k>uA3ivPK*z_9Gvh3elTNbn=$M zqRa}Ygx5Z~+U?@QP3Ds6VE5c$y*a6zznsIhGrq3bzV%bhTIp;$CUT!A8ebY1ftkT( z;=Bc`+ep`x4Ej2PS0qxO@{})W-T3eD9?~d1*MPi(%PEhmQc94mT|h;W_he0|Kif6cDUKZBdOFXr{$b; z?1!37##vy$*=(i{@7gu8VFTe27Lm{b(Q^_?RxUwj+J-4?SG;rh9)CY=-wJqA)?MfZF$kS4Pj?5(Y4hJCWt9NLk$(52st7r`tnub}-K z2jMGe(ohi+@tQ3bmU0m3B6vN~prfShSevtf#4>w_FZ;oR*@J=bS_h*Mp>! znmC={Ud_R(5+Ek=%!?aJh#vzZG`*Id5Sn2-I!&tR zoO5bx&p8~p-DXb=rR;%D(^WKWS|l>k`sBjbN2{_RH-Q4kkR_JX4 zL!yuF9M?i<(xc})6YK!`FKNP^Dwq*t5(6>N+t-GxSu%>(vId_yXx}P(R7b$=6n6=% z1A$@ls@X-Q+qykl0OJlmMw@PV29|Xsn1(Db>bQUmmeouoR1;S}gDxN8j zPW?D6M=VpWo%n%x0BtHH^24{YS+e~?mpRdyVnfqmOZVGrrkkbqz6Ea4d=L>ccXMQ0 zA-)RmgEA>0WNgs1iV0GOx`6&PpZM!^6LNNb2o@WviU3p0La*Spw1V_IVUMO*$FDvp z-=VbDPq=WKFf?mtaR8gbjH` zj2|#8d+U>0edxy%S~lbvJ|@@S>Gw0u1*hd^`z)N2?U?O=Xiv{9!m_E*@i)dHm0l>v zcr%(k^o@CYm3vGh;kNjT^6@_VkF(6@Fr*0#!2*08jJ^yB<()^J@Y{_}L>#dg+J3r$ zX-coDZ{Yr#I&QP6ThQ6*1ZT}!v8X$qED4`CWM7>dthHzLnwl25s)bjz@cM>m_sm5r zX3YvZ9r0vodF!Kg-5gU_P{njMQu*AB9tU*@4S3J;lkwpX=c)kyZ@(O|#sMzRE>9Am z7>m}CF6twF=BwE8fd&{sHo$0rr+YX2${YsQrj6STOz>9J!RpPq@$P;j5W zILCBJP0`!+cNsV&KwfSkPZFj|CVs6H~g=bdU4vcO(i>HYLm0aqqb^3n5r&ilJ=Kr zbMSOYarOfLsLGj${dvNNDrSiYav}+ncM#Eq>6387LRfHCh;n5c6ki4YTTUR3wN$X%kx0B2j-hb#&a|(RQPtn9-41H0cz=EKR#d5Hgd*l zK9D1{l#xzLURwDu%3zYt--e)_Pm}3!x zJ9~+_ehodrmSENy!WkZE$-k>oq(4kdwIT(j@#{kB((oentm-iDBpAf^GFj7S#t%9+ zyUfgb$4CDjMt50EW|uBAGvBG+6? zdnu$x;qashvML#sFh%rEWQYc4CwhxiAOQ78mzj;+p+x`T71^)X3erNbI&ZMWL8v5H z5^g`r3vJVK(-w5zZ5J&!^@#Q#KKu-h@qHGCJMJ$w49z@J00;>>M$JWy5Yd1qL&U)j zlmxg^MyKgcvnh?c_|X(PQDhP^{_t5RrD>!SGl6o51e{`o8XN43%gwz~0y_!<9L2t* zc@Rk0VGaL*UshmnI$Hg}Woty4w*v=uw6>z{6PcAzBSTVg7DV1vwTn`xL(D;CmN`~! z?+eMN_IoSL^q{lej;}CNkv3>N#_SztEgzd<__HApbv8tl&W1qI*`zayKwc%f90>J3 z0buxz+$X|XlaAJcv^7c#JF353-C_Ux7<2!^yf@88l@le0r>!8hJucM4xfonvdMabT zajdBe&f05#eyr(y7e^WuH?swfyzIm!Fldf)EvhFtE6yKEkFgMa!DSR)}_u=HqmWGm6b)? zqNcd5y?1zt_&j z5y}YaJ=vC329YFvXtDEFne=c;N!OGWE1HsEV^1560B(z*DmDVy`AzQsgWE@-yTv<# z?S#Ya1^_lPcYBKlES=daR?N0DSD7MzN@MnoRlr|KNmE^2)A&n8krgW3Kf4^ zVTc5XgJj`!98Asjt}!29RkzA{9 z(o-;LIbvGOd`)Yqp9;FK0<9@F1=q;*m$!Jcq1|xB@un_1I_fm8SkdU9qr;=e!z#g_ z_$D8dCF3I=PD=nfNA@i}3Y_LExyYZsE2soT(t=X=(;vCa9gELw$qD9$^)S>XoR3Y} zl8c`s9$Xs(EEyw#$mYs@KBkK1yZ-(1uk8;{FqiXqR6($FHSFz)T@^(7BXmQN=Qrc< zC4ulBD87#<1P^M7yZzvaW@wu~;s|zzF(@Z?rSdDL!QTS0jPJ9MTt%$jMeZT*1=!$a z@9@0#3u=J|miMe~8?kFwo8yPuP`bbm166_9+giShF8Fjlud=(CxC5S17GG(@Mjd>5EZ``{)DhA{d zF(Bcmd*rAl8Re9Qa}TNNrwDl7-blKHqr91wd>6V_U`?mGPpQ%nf9R* zZP%>{HcVIlAe^h~%KLV*nLj7G;dSjqgO^{dHwh8KkYaYnp6k@twa<`@i(Pj4_?!v%f_TO(})_C$3MnEBHd1(7*+E_|gM zAIPWb=2b-~`tshg3X4KNZm3rduNftS_1c9enQF9vIQ}Fv4O2SrB(r#{xNkz(JpcUo z0($aYEu|RW;bI3T@|FK-r1gm1Z@_^X5g?rW!Q`=xX7w=4lH8rRcAs+nvHtEmiMc6) z2@C~(7LyeuC8ltO2pG`>osyPMbc(EYWxunyEA1)eRYtbL$iK;3=l2 zNYD2}pyd(0hy4xULjA7>v(Ej2qCf%?ED%EYnVb8o zGH_;aYY;Xg84>n7l#S7lnN=V+Ic;pTWw@+3>Nw>G#?L=+;DGmHN+y$W_GQM09p~!t zE1j$7gd&l$@y9A6^PMYD<2Zh0Y50{EBs0P37`9x9! zfx+O1{O&rz7?lRi8Tb;GL=^d10~xdEY-jW`X%K1dJp(^O@t~gb)aan2SKZLi z5LFG8j^x?&)Z{pJ4b4XxnqPgO6$m6g{(>$Tta@~tX`YUT#C~)Fh$8h;EC|&RaS{I; z8T((`%qL1A)M^j^5rt(pBEj^)ka=%KGKnt%$hZ(I&DgbTLiIMZ-Nfwohfp(r9-ak( z{LS0Vj3++3-F)3?c@Ey|MX;pq4m=ik8B^>Oz!G(R^ePhe(RHC(`|u7^%u*RxbNCs+ z9axP>lb4euTB*YM*Jl-?1e`Ut!_+N0A{CDi4azM%dzA*zKpOm|QGR_XWhuBI1FP+c zo}FgB(ch%!t$mgL7(2qt)4-9(!oFnFpl?N5${7+l(mNQZZ{ffk?-*itMYW z1>-%STcSCF2sg2k1frp}l31BTb*qTy6$w_(bl5$6On==6DodRWQ|iX=oMS>IiNv(_ z-rhxSX#D&3{4K#&`~5v8zN0i28~cUePsEpk8i>yh(i0S;{}EU!!A0>?XE}r-uvi?etSH}67A-1?z29*M>!!3eCa`tt zigV0K&Kmp8bKrq=*`J+b7Hk+BQ=NFI!ofeMg8vJQgi5esAOjPLTFBF8eQ7jGB+DMD z-?`W4Chpf;YHni)Lo1nR9kI>(Ty(u&=T*Nj zFEELw(PL-1N_9B~G5`f&O%?&furpWZ133tE#`($DIUS3d0qBvVYrnUf6HKc7gpby2izt<-r|kdMbL$zd9nY@SiA`w?!2BX! z^v{IncI)|OJL*<@7#9H$DC)(6g108pJ<|apk?SW~cGq5W?tImj5|LEs!_@rSR%!3w zYhp$Ivg{Z3qUb`P*Jvt{gZRx}b1XzQtY5eu1Y}uYs<(A*6Vg=D*o1tjEk0tBRml05 zeXV|6N3@F~n#>A(D(e8FzW;gjO>MX~5X`?8A3=Pc%fOBnhFAg5$7#Zbf<)% zKtfU*q^cd*2UHr4I-j(^ywWV-1u=Wm`%LYy#E_qZetixr^n+hMSTvQVAd>e) z$Vz&{E0UN1Liscd!xeUle9lfB{&Ni&XkfwzbGq+@2(1NyxjcHNk7u_6KZO-nAaqa; z@#cR{^T~gn?t5Zj7#plgXxJ(3HQOyCNSSCMYPuh;*Oen?!LSe~EWc;5XLKw3%zFNn ziXkFUQdc>CWcZ8B8X`AinxYca?($ib>H!l0pKD|R&w(~v3$>62-Qp+R7jq6qr#3g* z_I>6$bg%~-`Ny1sQZtBq5%ao09%`B_CK$mT$V>fdpBd6UW1|wTl6GuctVG7YAQ+`Vw^~LqYwePJhjtqGMV5HoB=_(Tqj*r-{TxE8z zf$_)LzwUejQ=$2z&B3r_fgf`nK2LW75WpSQf?oOk4avOsYLh4t)1U4v zoWEPHHWxTWcKmA7j+#ul-KfK4Rz@}?lDB-uBGV8zP3xLPjiB}G5JCzkXAmzqk*BZGFRh75@) zA4Se(mtTH)Ny+8W^73eO#AdEF<*<;d&I?X;os%!W-0r;A%$1VHF+`URA~4C&=-)UK z*#!*$U5nXuwwll;h-j;js(cdpVc|p+*&|U->$)He%lwSGuQT(|Hmlx4IS- zu&taK>?rd#f2N#6MMXvS*Za(D`-AIDuYVLJE%{|w%URf7ESVR8R;QyF)J(rv>w-_s zDG-3_fTK_w_@%_uzK#>yh=9c*4D(4P-&af2+L7x4U=Y>y=EuYJC^i}l3<0335s&mw z@&PL}V8Go#o{T4mtixmS%{Rb|l#kR(rRB<5rVsk=gOhV9#t%mS6V4YW#V+ZW07{hDm=XAiMqH{7&n2_ zE?=sssEG5jk_65|?c$jxz37%-QWA~IpC2GSE}y6{HwaaEr;tCg?4_8Qh9%ZOF};wtCU@+l|WRb9OjC$v<=-wSSY+andfxC$ag+NUYR z8v`rR8#&MF%q{aje--?c0z ztN?1;AnC&(B|2Rg7(~LI`4m>-jv<>4(Kq;hGY6-g1OiQ9{vG-qVvs6Kq9jbrQIe=q zrM+lB`lj!6P_BBo2bu6YG?-Lz@jG{Yz@&T7=lc!JZMn`32S0g~;>q!xG!uD(NZuBF zNxAu%U>09uznl5eVP!zPB42g#(E|*!x#R}F(@i2L#&WQgz`;Z?=3CWlD|IW}(DTAd z@Nh>)K3*Z`3N)>3;<*C9-nY*>H=D%p2ey_~Ei5mmQ|ydnM@G)!RXAw?*Oiw3m&fv+V0Pn+kjAX0vpY+Q;HqvsKJ7IZ>qY@69H7@O z`;n*2bh8$1!EU(49Fsu-m$QPA8MJy85g-c^s}kxM@YaG2=uF>21<5#nvLCn=&0Au( zn)Z20xGwOFQ3|>_6TALO3rSfmS^&%LzSS(5(0`NdmBLUHpZ#huF-^9UGUWlHrdm`b zs_HQYea-q@`|2sdxViM~vu$XkgP&I2_c^qgWZ!jTn^C47+W=sh^5{Bg!EN zr*M!whcFdrZ`p5JogMZw`%U-Ev(F9}6@|}^1Z(HB$OdX}er+&9kuY)aOgte6*(5p` zX7$Yg+7w3`0ZeBE?6X$}>rHZ}%(WXGF2BFuwBzU+Of#23YX`BbI-%;5Bqc(M{%}Ne zeBW)KHgo0iT>qFvMdi3!Z)>L7464-lHI(KWWLPP@bYoSHmPD*kynz_yAdaoKo1Wnt zZ>(^FvEoSUGJ<_tIJ~Si67*2{6j1pB#K>|GSZiymZvlI-hTNb->>DdM^$AX(XXJ|6 zCnQuL7d^Mtsi~<%ql2N!ni^-^{`c)>-F7ZbZ#IM0l-JmV>*s<<(Q1lLg4cba zLC}%k?d%VlWedgqbG+}rNuR04)J3W$)P$Yvm)=ONE2}#uMe4n_dBij$q$(m5j4qf>FD96 zE7sv~X~ZJMf-e8f&-_`aYopZVM-UV=6~x zJ#@F3z7lGx@F?FjvFa(xjpqTCC1i2Fqs)Tu1BwFCEwNP$ zO@(CEu7Pu*-N)`hY%pv8=^oRaEu2-SM7EATE7jgAsB-h^{;+A|eEK)mqv~Q7H1JYH z@DNd(zztqKlh`h;{BD{|h3;T1Z56Sgw*~eASLQt-Lvp*P>On0^7ln}LMC|JyHud(U z130Fmf! zTsD7ja9vZh&V<7iLya|E$rh(-d>2ZX%S!rU#a-dD@`_E3!G`)-1!hb=VkxNnIr_;z z(0^DGqJ?zCVVj0_C3Yb;HzzF$ z790r(3*~JN1!N|H+%$k5OnunLAtwZW_kNSy;9NF-UHibmy!o?_^AlaQ%Cxbr9}iw80XFOKauECehQ^CDMxC_ z4vwE3G_%-b3$N(WF3q82!yef`4t*J_<|z{s+y9LFe#4iUHaJ=tI|`?=~jm{g-u< zS^3}dUJ*O)#9|;maPJQ4Ks>?ZZRJSRx^jn^mS{g3GYBbO@(;ma{y1JxNZ5Q znN`u<9SX(|#e<>lgH8(?h;RC&S>G^!ez=Ii!=f;1`|{5ZA&>s_Cr$fmVHyYkfK1OG z)yQQ&#zhgQI+-X`7NNEmtK44}n0zwzXk&?<3122=98xG}+3BOxQL(gpMWI>_|5MgEizuV;01b&qx$l#xg;*lOvF` zst;&vasocx@fF=;10^YqIKVa(g#DQ@_XCrn^|0x1%Iu8~n|bgdc=uk&S?&XqqC%l~H8&xm5mKQy!qg{;*&~*T4A5uI zBW6>D?<|*Mq{V?XcF!Xw*$r9M-l{e=7Qt$-jAkkNm@dEybMVU8#~(4%W8<%%9SRyW z7AmhyR8@vA+s}4G_ScV?jXUO{fMy#21k}?+CBrBilBg$tU5oo`CupKix5pJas94to z#Muvg+H^JZta`1Tb}GIwefo4KI~`u+_${$u#0fw&f8)~=ctX)gb7BO5%%I`idofED zNJ>w-BSP&DQjSkSx;cmRwFoG|VS?s$%W47CG zf5x{lMc=7NjuzdvT?6dEw{AXXbDJTCunMh>MBB|#Pr^C0Y#I&HYo zq4l@aMic|!AO1#AT!d*bq}B#=wv#x48m3*~hq-t)Wq4;Y9f5QTQ4z`+G+%!ldCTA0 zS06Wnc1zx|x~&to|wFG^A=rCt5-9*#v}gO^ldM3MxF;JEQogYC8qo=BJmY95jD z+yDDx4Yv35rVK?zex_xpMYd?K{5+d%3N2yT;Qx|9oK#3LuBrlT2GvAtK(Da^LI+j@ z92<^OsY4ewm4Errp+l+irV9_@#BZMZ&ET?>VL8|CLccAiVb`t(XQXA!zx|lrb2Ny{ zhmpuQPWBW-8Is=psguq8^%3l10dDYJAV*77Pzi}G(DcJH@t8K2aC~UX@@ZOM@~aaL3)Zw zPFox|z-<&QykV$QLLCG6u0->3*dkjJ!t?z1FPJsXm`#7tEZe~FJw%ijIH3JFIrupJ zNy7Kkb79_G9UNK|5e?#BfEwce_@Y^`_Q<1}MK0u02RzgB6p0oo`MmuM?4GAgLrdPV zEMQJh7BNbE+R>{*-S+EGnGzg@_MNB9x$uJ{*s?#0PLtf2u(CjsFg%uzae~#MBQk1I z+Pz;g{Z8K#AN>-x`mT0G42@!dE$B6GX>LFBTmv3a1nDZT2$;B}00f5iIo>9==kro00CKROAYpR8tjCDC!9^r*?e^dKtm#3w|JUueZVuI*iZ!>uzBq_AFQ2gE zSmVGx+xiqnt%xa0Y?q73FN`@*&m7Zf*~gzXr=ms!GK?fN2I0!K$qfk4uw9o@z7JD; zJB2upY?RD(^;1Y87@2Fm^)?Gs84qdS(vp=zxDmVeIg_yuK4)f3Z2wx2+d*CnVDuHK z3Plx$ls{BERD+V-v7OJGUR(KzVBJpP3hE0e!sS@d_CSDAUTw`n(^q-f%bJvm0;5~C^!(jjUAa$9Ex=m0jkUhhM|E;RsUVP|~RT&MlWL{8Vs z<~KE+C+6*i%4vHPhSC+L3Q@(NLc)vQvnxQpEE6kk(Lzm{CZjY%&RU=G!JLD-VD0#VA}2FoN4{p<%=GD77_2#~ zG*Z_SDJw6UemP&>P!_419WE~`dJw*OZ4DgFlJ(OY8$EAx44&?jUo$Pvfc@UrxMx^7 zmco5|;2boNy)Gw&NSB&x5k7#`2R?y~1)eB;?uk1xn=VS9`Lyo&kfbuOpPD3+a}z>9 z8PkD(GB1Z}YKBg{+O{T~dK!1?E^tmAFi2?PUmN%^AT26`c1|8rwDD>0D2ym)5|YfF z_#Uno`zZfC2KvD56KRL6(w|m24TP}A6QT$CFX>Gn&5nHAR=s4-a7yffmrR2hE0HI& z?3Z3LtyqpW&yK+9>R@d(=|!|G=ADlxlL^Uh8c_zVAZCD^V$841nG;j_C5jRB!>Len zgPJf-?wRw27X0vRl#0#_AME^>Q8c~C4!(@E)t;B(N-wh4zHHk1UCe6~(S*@JIS%=m z#mpemyMzGb11AVShmZxyky6pDxV6>(;AOKA`w?x;H_Rz3CDt9l0Ic`~&?lWxerhx@ zd>JF6*jtKy;2Wr2+-$$`4b#0`O$`p(9YBcIYvQW49mpURcpVNG?>Y0VY)TShG;Zyz ze>UyT?RL#So6h0eZ%+;7G;IKywgqf^9Lo-TV@Y%qxlqLx0Z=6xJ6DJd;W#l+aMUX) zJLaCHf}1tmZ5^oL#>*RUPEGFzkNhzAnRUNu7QM@lM-wGP#|rM{;*klI%{bOF5u(UI zQI+Z>Ews`yDE~e7FCZ(hAPW6_fD=AzO?yx5P2V)r>YcUYk785lNH9MBK{kcw|1M|I z`1AIeZW`cp!dg6ugl8a4$P?AHpajw2xSiI2;C=4z zpQv%ds)p?9Z3ykl$lrfXrr?x=ix&l*wzm262G3f#$Jsaju(NUe;ToqWR8A*cP0FI>GE)2*^|(KoCKHINUK0t_D1+@$S~zk~B%4%)i!nq$oF!0mSEyQX~@ z9HF9&)DlNjQ1?Q1LfXY4&>_+>0tFo{TLqeEs|*A)g@m|;e1~osgVwm4Bno`Jr7VN%Uy%6i;_sOq z*baa2duHAW!2?|2z*Xo+ko5_ZBZ9g;qOH2A%0X@o7C9$dk30Bt4~&o=eJC7(U66wa_}JTNsvAV}tJk6d^3V z9ifZf)JNm-#MG&Y>T3Rt$9GM^zUAUGoI9dHQ#L$p*1>}+hdXAq&sx3KzVUsNsLj+( zZN{b5)%a@j)VedH(KBDP_y5qe#d32Wh4ZkVeQsfF*lj;B(?~azsep5PCx4-)5 zjA|<^kl_N61u*xNdQj2uzgwF#H(C^PBk`)TQv3Q3%vx;6030*~l= zig*TaK{cco{>CX==8_ zk8$SNjXyRsWoG^k>uv;+q*&bJVXg*}ibi4{Zs6l~+B=-JM%)OP0bHx=&{YuLgox^< zfsFqc$CW~_&T`o`ZKu9s646k8yY%8$ObXkj_r7A90lZsYF|*(0&{CAPHZTF4en=8O zb*ITy9v9(va3^5Ga$n+I=b#v;F@RMNjY+&8t3`+=f;rO-uoXWsmvj5p)4{8puOcGH z!?NzsCJbaZDlB}B!Ve1}A@MeNM*smd@fLjF?4M9E+ULgunIRfnYhykdmYBK+bjN{TIwd2le_OBF{>UKQtdslUEHHE<)$N$W9GUjyt z&rCMqGVbgd<=py%dVknRSlyan!Ubnx3JWU} z`-TH12?3>L8kjh9c@4Js-_6b4CJ^=TE;OTQRD7V4`H@&Nxc@0d!xIlio7-zQ2n znOgNgV&X6{$@VJ2YBe>dmSGbww7%`LWp2!tyoPfXcH92f%*`hhSlF|qD_AGQoa1@l zT&vd}NMwx8n2BA22rV&ach|ymBk3U4|CiTL9dU`B@(VNP)bSrUNn;KN80-o*iFI57 zY1;=XVsz2V`cR$VyDIo#cZzruwijCRX^5D}XeJQG-d(={tL?X6`h}T}MhSTrfeF|n zU4)$H4<`Zn2b3I%W}_l(wGF>CQ_8BVf4^YG>{-F$;xgwsyX=?9J8Sl46jSYlwAhZL zdF~9{2m0tFgC)tK_!YsRTtnR97xEf(mSl>KS18x23|HQ!%ur?K>s2gVG^?kw@hwP& znNr{9hsP8q0vp_dfTxOvoZwqvqCfo-(Yvrs|EJj%udHN1j5bZBwC_Vlr5bc$dgMRN z(uD8!4r5vD?2hcU@Afu!fwXmsguU{obV8xdfT9w~2#uX@vK~XmY3Hv@X2y}3FJM|Z zneIMYpB<0wyHX=0Y4ip<8FM59Pm&>F5_SpS0k6t%Ve0jg#IV51U!$sci|zWgxw6h1 z`$8FeA!28rDj0j%8=Eo|L?yo&itqe=ASQ$>An5QhWw~A^lAdy26fndx)(vEc=OemP zNS;>#{z8r7kqdN)dVVuw=l=$Txy26s#&oQ3u=lP!T3k|G6hcJ~cI`z?s0c5k6jBXG?AklA!d~cf2n#JQJIRD!fm{K0G~BN@wq7Za!1 zo15kUHtNy`!$iH@mRffzgh}=IyuICS|D(C#O!`*9h5%BJ9Fpc1>OxImk#H=5*ms1^ z3m5N+?>0DBsg(Q`59}GXb7=MKD?x4!Le=N!bO7 z+0wn`a=u|p{)){Kt$&4fUS;R~)ePF#()|jyKF;;)*MVCd`)$*mA`c_USiF(>Z^Jv5^51PDPJ6 zzgQ{N3a|luWDv5?{)@Fu|!rQt*!hn3=m?kFsPcKis>CkpGoIrJ2-Bp6_=JC zi;i_I$ZVcJZdTaG@SZ*YrzU*j&&Bm=qYVc}08PN_5{>P}Ooa#tSU?5SQ>4?-j)N)) zLHttsz>0-)({k8cQWFx*lXad)1!W(E{f@vD_L0M8Zb^Y-_r$Lbn>J^ah(*j`6e$L7 zCmLWdR5({eAO@z&Wn_o)G-GJ>0#<+&5hZY=mjg9(qT@EA*z-)soxStoi$gs{?R}+g zeGq(hK_prmbY}D|S1CLu3$B+Ofa($EkEIw?9=W1c)^+6F=>o@(8kx$e&%WlkS#+@8 zH#=C1f-v7CroQci4M9UyVWmO)D!~yk_-13A_l`kXq**W~rfsQi^QH?AU&sdC1;|Bz zE9kEGf||Sww~;g0L?ga1=|kvfMjS}XD1C5!od6)hbO0rVaT*T1AACZDhwd>xp*=$@ zC*^G7$!mHB+XZoFh{XnUzw9l>J*_hk5VuA=>^RiGNvO2GiQ76bs2WR*ciB?coyu4= z;tDfecgk7;0gjbsCqC&>%D$WUO;ZLZI9vYqqu2w#DJ107;Soyk$Tr76kPMm}Wwl9X{4_CUU5$JszHrh3kl;}VfV7rSZ%D7#%_}&Uk#_kHT}SE zN+f}19i=SKG!|W?9j$T4UcTo^UcCyK#XXYtfrxv-lA=JFn0NmGRoo_-U>4MJ9|%ao zv!e?Gu40h@grq4BvbM-g@`fY`MLfxZ;xf`_Z!B`ZLZT*`$E2K=TjQ1>W5GkE{HTNP ztaAXB1g!}T==cE~FSjsDbN+4oo*F7yam;hKnUO%8bthH}M-Mibln73I3=QPd!pu|mOB9qKSPu6-f zgC9AYNgL3KNy*N1GGU$9r%T6BV~Z@Ig*f*WRjfekZvAry^vbN1k8f>Y|aGLNv~D0`&M?Zt;b6Rfi*SGWsM zLXnsG9oUp`Ho0R|AihGp`wJCryM3*~9UOiRn+NHU@Su`TQ3zB&d5O)eV-2xT8!K09|_!S1v16c`{9IU@Fss|b( z&fb=I+`X&Xy{F)$&CPN~m6E*%c^En3xYQ+{7=hTv;?#bIrLMoeV(`^x{Y}>3@jpdNUBU-tw{C8=o=;5%vr{FQ#~YqSjjrSE7~}Ei!6b|Fsug&9KM^&_rws zSW@4koi045C)PARCvmWcGwRNv==2p{<4{h$$}X*SU*Fl?&Da~ZkIhDyhyQ{zy1To* z=g#b!vQmew&LOGEROIakkXOcDoC158B{8^*hMTZVgi$7R)v!0lT=bd)P>mNa$bzxX z!5At_@}YS#I%R&MlBHP|!R7tWkg8~`F~dTE#FzpRDXf)<$ND6{M3crBS2U~utJEC3 zI_~x$4tPb}J$;+lQr>P6iU?>T%$qbE$M}S;Qk>EhE5y7A4bO5QSbft5i%r2=)}j%e z2~cZiB;1zj!NIyVwuW{Rs6nb5Jaur;Zc4a4!-IqR-cI-W>Q{nH z7%ZgKj5r{tM#KVnn5e&GE?j4$(^UqE!@=~K1@lvNj53J!y88OYxe@#4gnJe&;Uf{M zmCYQHs04okt+1V?+=f0~1pnb}UKfP!j}hOh6PBBwd(dTZ(WF~i!EC{eyq-K`1h4R!AZ@nLP}0%* z7YZ~#SDQ1n;R=zk36!LLuEFh@vZT6ppktcT<2cXpy;+J9@f5p7QobU?@06TZmpvBCU z7x)2cU#S={qYUL8!(%D-ZD9*NOcA^o6J88B4NI3TU24DH=q@Vt4%S;U{*sfnWmDY6 z06gvdL$dQpH_*;iiIiwv0y=uzDb^r@qn3RV67J|7G%$6}mSD$3r-IfXgh_Co zL!5&%p>4lA#ckDI8f8r&7oBxWbo^T~;Zbxj+|uNxH`9>vh@U+d`e7Qsl_3S-kP#`? zWqS;LHub34^N^F#57T}2M@?@1l!FJUjO0(HQ{jkK8t2QpwQFtZRCftanw)U|8~(2Q zQ>W@3ld3m}b~@w<`Xe|K0-y5=(lkLwkwc9JAd+BG@iZn)hE(~$c$^Z8vT$y*Lt$I- zLpW3MS5w_#r`(?1>}EHyTj?t>@E%~by!M5HTFhGx)O{0Q32}eRfyhwN{S zuM&tQUvm0s3H4yTSPozVnS@A{Z$$|w3%YPWv@HP`KGo)4C?}VG5rzF<1uauQ!&i{4 z!89B-rRF8p5Va#7L@Q4Ct363UG-?NdoAS@_l}y10=!4PKRavS3OJRXH_NI3C@?F}a zTSLHIGLaK7ku${mXD=4W9~eox6q$w>l&TUDL?KI(Fa>u?z4^I4eVW_as#`utwj@~; zp{sQBfd@vsYnr>ozCO(zJ`Tsc9R7;)SLaK}uLNY<9<5*+{kfWNP@yPiyg&Ifwbtyz z9qu_pLkxv+F{xB5@9isepVx>p<+{RWWUxX#LM`LJ$8~4`yb9m7L!ItrCxK!DS>$K3 zV&CZUj@;<==DSRG=lpwiYSP^acre#M)&e|^phZ8*m=mv<&t&f@9olD-?y19cfQj@M zP;61CR=xkO=;|Nb6ibA?DLPpNs0k>XRDN;$#UJUWlj@i6!?IxBL{m z^sZP}cnPd62sny9fD|-KLnar~!m!Tz>gpRV_A}Op{J7O2|DB6(_^*~0d#KB;N8kt# z346H9ogN>e(&NQLw5OdcFF)-mo1N|s&ZB8P8VrN=c=nMln%01SHV`d8uwgPOX>J%{ zpft(E+b5^HQ=Pr`yVKo{;k|o#W=yuYcyC>Eb6q?R?9K?^!J!;#J0f<`BcR%Ch29rGP0{0cGJpnbZBl__;iVw0T9$R5+(H7@d5#;Cy z4!rSo+dkV}IDGKnTA#4d1oR-I2ZsZyn7CXz%3L&DfH-(}1!i!hPp7_EV)C~`8bF!g zuO;F!+5R=Qx+f1Gd4+eO2V~i1&tpwi(~4p8fE=VUKLYEQoa1YF+DwoTKsS-=$Au?- zMX{1fN#{*+l1~FL?BDc?JP+5exz9bJsH=+!TeKuTzt8O&Uc1(Bf8#%{^@SZ~&tuv3 z{A@U#H7YSUTh3SJiHH%9A{GVZvndf&(L&f!Vt*v$SQMa_Lt#KF; zi{iPqXpYNfhh&DQon=zGda{@P8UP1z=*}eM6-qy1yp!GyvW%n3$QptH%p`gh<~{LW z_Jt9Wn3K+gb0K;&alyF^rL|wdOvXMl$6e*r+epeidG+GOt~+a5ab&R`*R=pVg766# zHghJ8A?lTn1w#7npCArXGkD*V`|p+>L%w5hZH_;xKC&F9UqMlXe#O zyG=6~A5CN0Le-tZ6EuS2DcG?j-cCXQP9MJXzJB+gmc^u&uF%2vjnvkv{JRWz5^KaD zOfZoZq%G!_?7p=7uHEf0*tk!79b!8dflS|zWnyOdR;&2v2#bo=$i)(|O$s(+jZ`Wi zE5R*OG`Tb3B*D!@7RdqkjrbhIp;c7?4-Dp7Arw4EA)dzT zfd2M~1VBk1ooQ4O@R1}0Lt2A!Bvdpa&15h)z@Bi&0v3iqG;=U0Z`jMnT$Tnm03}kF z4Pc;t=r=0+ehi|Ky-1&ZB?H7GDpwqv9Tpp8&^os`95R3E=&&p2y1VMmJkzO} z7IaENW^=LQ6!jIco?_wV&31II8hp>NJ-y@^6yCP65aEJV2wUbS!AVMe zRP{XfUE(Z^!C*Uxl8viGCI=kx!69XmO4^h+`QVh|ki1QlPEe!8PEpioya+cJSoEL_&j$vTq)-u{?COgb?$t3=eFKn)ml)V&Wm8A3KrCY zhO|2bMGrJ%1~L}%FyZe7rRCvcM1%?)NJJTdHT)tHf!UKXAaFyTDz%IR!%ud*jjj8Uv8VAVEl3K4_@o zzQAophPrB@dmL=fQy02Z_lN~3RY7xexwW_$crj#bl^^+6J!o0Dyz9T_s;V#%-hmNj zY6ulhs#%m{X(HNhEkwTQ-xj+2?7J4ZGjM1MOK5)!@NTgmT;z88(4&mcNq3Nx{pKR~ zW%fAsGDq5Lao~tFy}IHU19B&mINGQ7M~mIl*0MEzFpC?vK^*zfQ&I{B0j+Q;Br)O} z@&iM{!YcFO)t0e*lDHV1N{%|0k)Kj`Ra;lJI;w>waXj zKeQj_@Ywq;hnGkWK%&2Id5 zr#>Nce7(XtAKsY;DB>Oeu*^McTfJ<6I}w4JZ8*&1g1}|Che{G1(GySdy;fTMR3i+x z=82cSe?)Pqu{Ai?9yLU5eWiN>iqbAx>2`0Soxc!v$94=J_aq5e$tyf2b0r4EgMrN@zDEM1<2M=U z^eG0tN3p$?{HNhYE>C7cd4N-%FOF=1PI_)| zqS?Q7l9;QmozeV#te~(4LmqyglQ1x2I)f#2KMOK!*++-s8c&zI%XO@2^8CKX$xZ zyIFWd1x)%VlPHY%QJi31ieat}w1k?$K6tszNQm_A&`Cs3aC>aq4})=g;t6i`aBnZ? zaBySM#Ps^vgS8aNeEk_-M;5Wf{297ROM22z}&2uO-C(Kdbd)*l8NdmcsW(gGUD zKd;15YidvU52O1*BWPaUXwP#@#AZ%(JCRvAsOP9kC_)3^xwZ8n`*ZK#x~{z3JmS2| zgvt&YLLyUQzyO2*e|ndSQZAwu~NMYD^ z$JCk+B5`}d8h3@gWsN&WrzF2g@h1q0&;_<7>zGH zdO|0}qN}MKN0!9;Z-6?-1NaUE$>O!{gZ3wDQ42?vlZV~nzY%gUT?&meN(=>BOdE8a zyw2^m!|U8>$0a4&qlI8v28OA4t^_?8F9;=44skms$rb4mOObKeZ5J}q{$!my#leoO zb#CAAoH^<-_oYK28xGGXioo`OY+#=h+H_q=w4w6OI~-0Rp=A(SaILnq1m+|fWrT@rr!iYRX$l1K0Mo?Q58 z$p$w*47vyPA_xU$kRTgr8R((CNeQKutzxSH3b+-pO7jPx=5`eF3(T0@N4S7nrZhx* z#0MD~0243oWJyATeh}Z!(L*}@#E&*02)!bB_%DIV;0kB28ZXz44oc#YNLBqQy@?niDS}pDcpUuaRK-=08xT5{b0HM%|`d@6HTpIkgqUG5S5p} zY@K0k-nz$wM;7gYuyN0_Q{0a&f#W`kGeD@B;I)C(DCQ?voE}-x5b&!cTZwfvM(%63 z)0=`#MK?pPI-S{%+vA&p4Z|aNl?721n6%p^szxHES>>4xAbolplK-NV253n@s<#Et zT&$o&h?_Le1QZ?-X~`)?QM&{!SQiUN+VFZeZXSooTU>>~W!Y3}un z4cPWL$7|GcGK^9^(>F(AiQNnk(OAGt+WqI`^mgz4Sj>OIOgL#s^s_wS35=X7>>pkQ zdCY`E5^#h?=ZCTQE?S@T*$W;GcFY*UDTNtRR#x4U$z+PE%gW43k{f^4${)PVk8zga zpSHMbLtR~S5l3Bhx|_Ux)~BM_71Rg0TEHU-7xV*f?{pWH|E#ygTUI@HaFHHFCd&S3}C}y*g_MM z3_#9ZHRb46fdhCB7bpFcSIHkhC4U2uxE37;p0=+Kx!FEW6STw8c^8`XyaiHI5TE2G z;FEiofC~P=i+uDfHx3Ocv*25Ad7-^$yE`|2&BDQzi;5#*Q`^;*>hJ2RaUfY&Jg~iZObgz@!5$fe7#m+0)(z!a(N)o7m;{Ziw++yysCJw4~}hyvb-1 z*9q(*>&O6GPTG<0MR*`?N;07MAQ2!I3yM9k3lcOMjM#^9hxVvJ@oYtHZAC?SX@hf) zi(RZ!=cMKq7tiYL>1;19t{#8lt}}3eb(5_*_xY(^OE}quW(>r^Ez4Z(?-m`r>(cJ|6hfH{`i!E0UoCZI)%6JHQ_SC@D1!{0l zNL*knd?FQ71<-53iV8DP00QF2SRu%o>+5V!O}vm`@zPUATHq=tqA^|O3`SY0*`B1^EzXAfGE1Sq7% zq2=lYS1?AhSGNZjv6BkB-T}kc&R0u(Z7@)}@F1{V(SENLO7EGKr6hdWo z<+<*YfY123Zgc&SBz_dNR2%nv07^CDfI#rop$f0hp66bKGjdZ1e4Yt_-vc{Nqla*D zFcmR!pkwJCq+>_@B!iiQ5&R3iT~Zu?IUzNQjvOujoo*TZZ~D@R-F^Y|>G>D9%WcVC zw-q~nD=t7}T^^c-#Rwk5@hd#Ds9;U3{HGiwolcBNvcK%)pConL5Uoa983h*|b+lEf z|G}41UFdySRZ?17Qsq62LagUk#l;is5@B-(Fy${nP6xwiJhsS zQEoRf2gvih*9mQv5z#JTN#fO6aNm9QkMDMy%a$xz*&K-;6AwnN{oeO%^F?m+u)GzF zhoYiViVpwL3$ZsMSi{OU_O?CXwetu|{FcT%qqhU_1v)8hl4&+9(tMC#EJCpOfd_&; zmJqJTwSYl9fq#m-`4aM&{4;)pXaEPEVVtEqcE6difp+^?SC)nXF zCgI3K%s%lRgs1%CKI+W5a2!vCv3^D17A)^^N(2%Rb4#ja~b{S@t3q|gb2jrt6Y{!l+p8w7>W;&FmAyuo4R*S*(0 zxwhumh&iLaqox;Kb0X%n zv!j=~KR!Z#-5dChQ}T9GJJG+(|88nB$~)~YVNJ)_S1xzIhs`%0Ss9Skw7@5@L+KlV z*C4CZH1lmE5OBpv(HE8Ny25K%XUF-HG~=D+`(k9PW%G!^|HAM79)=ytVr#2*H( z(7g=ffSL;|0JT|2n4~fouegrbg#G)(`>%8d9XOmlfo0rZoO3v5;`=!nAT&(^05u#P z(f3{Dw%Mm24R+ao9&sz|hlkxM6a1nc#Ap%p&fTJE@>|F%-)V$lZZ-Du5%&>U>MHD< z&Cg@S2=Wib&^_RVTUpW(2RS3EnSs6TV$E52JL;+TG)Za|}Gj^Xe&SmtDK9hAim zknc3ty*GGdBvd=MMerkzltwM~)$XbG*H^pCVt(yeS65vnb0w8^UD#K!w^@z{FVU;In?k1q9{ar7p`-yN*KozVGu9EbsDkp-@$7;Z{OF-J` zsj92T`Oj#^i)JZp4$g$Gud50d7l$u6fbx!SUW3xi`8Im3+cQ;I)Splf&RLn{$TqCnO=W*CXS3)AjC&C3+HMF09;GBN0U{Vxx|PR6}_92KT*o z%45M25PBCd4)Ep(y_&m`G_ytn5y~9r&)nd~LkS8d`@&)-oPe6A<4)+n)Rb+j7GUR8<5gyQT0+G-=DNv2}OsVS_xT_?C6 zw&eY=tOLc82O0%q)CXD+L(ibv??gD;=Lar7;;x11)hfV=n1!sz51DX6F&-ES5mYE< z{BR;#RYSf7SCIVOX*B7TsLW>2E8x4jqKrTmOT3et%L25Lif zVg5~46KZ&ZLTni0JKwFVtE;Y_cj3I6hWgs^O(@R2@Nh}lS?K;|rn=FWZ@cZbQ_9O% zSJc#0V3Pv+4wYn`SqD+9?7yh>K0W0&=hGO9qhPS=>hZ^AsHi*Dpluw+`wNHSIIGLK z-vJ%whNHQ$N=k~0vret|@hP|E;%T&$yCoQOCa9CD0xKmMCO{Y{yYZg$9R^Fo$qo=F z;UbmqIS%!rji`7nFdpnfA9AC1#;tB&@QqQs`Brz9v%_9{tGn`)AbBKsHN4)LEE(hB zh@CVGZSLb^*byB+$X!6K}~+`msomfyV@#5_Kr~vYp$=nBX8El1f{&Pyl~Z zBYQNNx_fujj_r3F?VtC%>*IP-<93KkQUw(q6|>!Tz>Uq-7bZ??job#=O=?SdLEeJ5 z8A#$SIS=TjPaJSR+}qOPZx+Zs0cH!LS`A3!EyM;N=#xx5(P!^}0bLuez0Ixc!i_o7 z07jH$v{Pn_XD!(Z8v0^-+ArSbK6^?@pcZ|iMoQq7^uXp>8ue@!pB6fC;~+*)0WhTow$}h7^kJ* z$q@xOAHcxZ+I7Yl5l&ticJIM}hsr}Yp+5V|JKV*{TX)@w1VM$p=1w;WwU~y7{a}Gw z)Yi1$y3?&=I3t&=c_&gjOYd@jfPGxt;eRD4JdFUxO5}4k1JyWhL1|rtD*aO$b}Gu1 zp_HyA-T!$ON5Ub}YJ_S!$2wn`0MC}V@zt6hUr(Jw; z$@`-VcJ0~~JFVorJ$v?)Tok+ejyvusd8p)t-Me?kE{YEA+GU@!?lCjl*l{@Hld~E% z!~zr=fX-ii50{|r)d$`4);l6H0$3`{r5Z6NNur=5`7ik5GYrv20i^;314({Z_*wF2 zye2b{`PP&v_U9jT(@uwN_>h}9P1UxiB)g?W!B&(dT@$c@hj2fvUP+8FV=N>Wf8!eb zSR3b^h9d72is5Z&OGxGDR?!ROe`T*kp`g^a5kn|&^wPXbj1VJ?@@OEiM1Qwl9H`tE%#@ zSM_ea-n%Q+UDaEXuCDH??CGtll8}T>AYsYM9ssUR8A##P9okT}jnj?z`{abI*RyJ(mhZ zBho3&K)tO{tV7+vWEBwPk(}VtPj4?0(u+$Tv?F4aA|wwoBq1gMd5%^Bltu5&FFuV$ zIKJj9K~vS3=0*MOQCJ%NNYfs$K_p0MYA*1dB>DK;aCH748>Z8^>B zq76rcQ5BEPkHrTN*bP94E+I++`AoS3H^n{eVX^h*$m_{r?HQkQGj*e*=cx0s#gG-(-{>|3d&o_Kk%mVWWg|q4V@H*p@mEz{j~ll`|j` zf=XZS`_H{BilC{u0odYS9>}|BxtUgt(cncVf8BL<^_}jS$m6{0PInC|rhfMmylFdh zYOaXKBQn-_-d7khLXG4;(lwEz9J_W@Bx>{EAaseLaI6>`fQfIal3PedsQodRI<5RK`p1!3my!0@;!Km&D#$G+HDsUM(<@{&)Qmv5ho0+gwa?v!sSSU^xAAUdkI?DfV;t{SggRtQ&S<$@P8iFD-{LDIQIn@XDGTw-Hb)^RZwpqj zq>F27oGn6PpG9 zXw~=&ID8?SwuAS%rz1^bDdG7dJSP1ltbuN9OE6lcbzhV`943)%>2y+<2hjP4_qnsM z37hwMch>Or*QZ;Wk+Y&Djh2PHqR5Ov$Dacfzby1AI4_F|Tp3WKgtMvOnyB)1yrAf;fu&Upe$UMMAieJRh2uNrQ&_SQ+{9= z*wGI^?|#^>z26<4qS0ic-pA<=K!T*eWG4uTm}$yS``7#3>u0nfHuL8gq#D@c+=Y7x z3l={V`Zzb(!)!hJSRfI=!;%0<|M3Ag6GmF0A3oqtYzGmL3`lfd9*KcbG4ybp0Ax1y zpxeG@#)Fu~s#%IA;9)UY?70uQlOsS_d)-5>O_YUNGg&g%4YOf%-^}1%XB<-gSJi^D zkI7g9?##Xj5pK6XofB@fS3T_ZH#!w#Z#FkXs!ZFrDFg~*Zz2!(=)-PXU5|)RX$gE> z_7@MkSpzIWw5^VG6^>f2|5jqz%EihC?_v2794+0 z6afZF%L9I^0oH6WJ&7C-z>FQz3z~Zc$Bnp~FWkF(_wGbR>(~!lD-vt5_WR67-R!Kg zv|!uA2~Ajuo!iae~oBOXB$(Cx-h)XH#LP zhMOWtu#SlM-jDdbK)+C(nWIcYk9Yy483eDdyg>qX%f)BT7RIiLD8W@_&U;0#2IAWwczHeg&2h3lz+o145Ef?x5_N zmg@NPcA+{Q4Sw?>YGa_=WYR9%>GsrIb4|5lzSZGXFYW2ESMPK;)^v46s^{is!xyn+ ziT&@L?%02M#|04qnnfSB~jlX;43xD$(YGL%9O z^#+K&1NKMZ{(a<_MP-+sHDyBn;u*$(Y?8;6%JZT9Nxy-ihBoA}$jw4s5_2pq`| zE?6v_wvLgz#$sscoXTeGFLt}TK`oBFZv-d_ zo?cAdlK@~;EYe!mPa~K+-|5@Qz<$C7hzNut@B%DBEXL7;uX z0HoAj+(LBXQfm2);BxQXYIH2FqJ~sw3?$iVIEv0%x9!@F@Y$< zbpol9FKh=lrW+3bD(&p2xU(RpsGh>gf>As4lw>QQS=51zwnm`qBWaYQ>R?F&B0~{J ziLZDQaDk0XjYd6201u=(*bOZ-$-W$H6B#r1IhlX9%U;PdUN&&)e>^LSw-QR0J`LsK-sDxxx@kj|ed{iR^ zak5#iVb;!-X~V)p8De1<-RdOmrY~YDbDMqmi*ENu)B$sU)cFmXxW75;r!^(90e{5i zP^uPM2TQ}KLL3Md3*#g)qS;~?2^&Qx@U%@m<9?_ZKS^NFcXl*{&1MM@%%fpHy~a(h z;aUiEIpEvCLoh`ZD9m14bkM3mz}~AU?N3^$AJ;?jGoeJ|cAXBA^2>U~3|*@L-vWSrOkf)qd_-_o+(uu{g(;j31XWAPcgz40RZY;(+-t(}>-zP)&hrVKeC~hdD;jKc{3$%YCjox6U!Tk#+(H<>us`z7+Kne+}y||~3QYJN(N|qOV$144T zcJA};UCtc)!{=cqH`_O#cNgdnA^}68Dv?au>sjdaDd_b_v2*34h=cha`d#WtDU}c9 zVG85KMwY9l&}Fng9K_;{?7<4sG0;0qVOmzwNhz;Vcrp18IxYkZFNC74D! zR5%r?7NZ5gD4_dye%(zTF9Uk;=imA9d=dzzKvKXt9V0!fuU@gjj(y$jLEPiaZ@4#@ z!NCls;-CJ8yK7vMj}u|VZ3ZCFe~~v?KqT;g1dI$b#6@n%JvYank=v8)`Th@)?5c*w z&~9`T0|9JK6;C{zITtNoZvXw8?n!27sA0<%JLg;O>J4fVD9!c4kFW?VGoZAXfMl|&JZ@Y2C^2NXH&Rw=`TT_iU zp}KlPMRn7*+S*0a@HZiFa?WUPZzp~aAuB8A1REz$Zftabd%oEq2$-PzmM%$q)>zT>uWekahNNH9-s+qTVv|IwR+mADg}(feD{ z>8TYJOrbZ(sGn^N{~5((+%w-n)Xfz8zu$3>B}c9)Hu`W_-Ww1=e>HZ*yEpWO(APsh zK$zTLfW^w?f_7_5$t%l`NK8ZpX{+df#eUHi3Sg%kl#`5r;V{}A0606oL=$|yC5WRK z6B&;$lHIQaFtao=xW`$rV4$?<{&jTviEYasqBI?!vwi+P?n>ZIP%{Nc5}KDQ*L}UZY9sk?$foEmU#R z4t>a3*sElttPd8!n=iY!X#Uy7Q!pz5i|E5(_S2wQ?f_mWVNqpO52LonzW&c{^O3>o#1d8s8d2MxHLws3yLY$EdA4`YdtSlvq&aho6kcwpQ}t0~3=FW~ zm%St6+K2uHS-C6WRJ{t0#GBw+-GLnk9}j&EfQE^gK-i3|69#b+GLTe?U4bs@V`n>{xO>H8Bf*#_1F;5;p|E=>AKz?kR%LIM>46EFCMi02c@ z;5Q4d>=!w3{?R!eCi!>1>y9L+Pp@e(-4oAHD@VWoFnu~UnRl-Q#{T$U5e_&m&O!d}YWrIpt`=Z5{JcfQKvta|Z{V{2v_>YMkKnrJdYy?T~8^7nCurwv>85G5R z<@;cDfKQQ9{0aaGMQAch;vlxIch|#iz?|M&pdRW~?eJmKuUN{WMC@K# zEG5^}k94`>VghB3t+96dudj{(Rn%4VK^2z9;{g#tuT3~^T0s?lUJQMG7x;C zAH#1S`&u}e;7(Bc#Q>yd&a?|(b$7z`*Mby0Sq$ybl7u$_HU>%&)0z~LfR2q{(W!!8 zF|R>c!Ec$NEhaXeFEoL+(IT`)p3+*RwxD*FN_66N@_6uzYH==#n^X@M<>nu`a~)&v z`;oiFnP8iKjCdT{4wzdM|1$hXalwN)J#2o{qo~h!i1J7pl7ZjRM=v5KHB?bUwUgXL zy)W5={MiT)Mss0poMEScNn0nr>uyT2p?rdDhd!y$SUv{8sv`%kKVwh zw{QH|y$%9(_$ThIir6xb#Dt133t>@A{+&q_0g7l-4?faW@c^SONwy8G5M^utEg9e^ z8?+0Z+Sr5!OQU6&s9vJ6XsAq}vB4Pz93v4TQXWExjGIf42{;cTR~;a9RCzLTc&ab} zKq%Zpb~GPO-171_>LY8>`?p_nZ*&s&`n~REYH(3#aL<9WJP#wR6O+bku(X-;LeS%h z2u$_JEl0?Zn|itJNH++HRMs6wz9@;E276IIq24B=!JDNgIXsdm&{iZ8@Ddj5%E<7c zq!-+fp2~n_=l|?y_WYl^&Ec`%*$@BJJvMpNQI|v_tG#4H)2WVgYEwhfTRry1NhjIY ze(J7lf5GW@<~vI`Zh~gyWx=0a`0v=5Avhx)(S?Oq3F;}*BMz*PhXaIv{r!#o+`5Y+ z#}83YKaBt^#zFr2fQ%5b7$(vsouEWeZnGv!^JT2bLomv?p5K5~vjRvwQXq?fFM)qd zp4>y_4W4Ua<4ZuJnZ%~8n1b5 zu-P+>J?_KIsx)P=2mc+Y23_@{x;BYMvUdO<=C4%YXzP^fG514f-S-Qhf zUYbdX5eCC!I3N*_VIrrYDyv%VVn{5I!A_ zM8cnjSU}e0j%%;Ab^i$qXVWI8-raP)3Jk2#C^LAHSW?5jTpqe5^oSF6+MFI|iL;ha z7A+?MM>~aGAghqY?%>yx&=(JWYxoe?3x|H>?|*_RZ^5Y*L^23c2d@klAz!>idY~K* zq#j(pK6fKWrbs73s{}=NwPuy&fB(h${hqg<`GwmB3H01A;2kXf{N)$!wf3t2!v1dZ z_0|7!w+yQz3cjW1VQy@Kmc9)J2P8T^niz{mq+IG|N_Zrn9&!WpRTq@2ks6F&uv}6{ zwcL26UPW#oUnv zgTvHAQwqN9UQg$8qTVn^m+B;lJ=qW5rd*JP`5DM{YN}8iYZFkmiL;cA=xz@h(KxOd zbWEZ9;F5|j3Om0p$U+J25fK*!4~G04#upX`Nuo0~O9MYZlu!WZN*NJoo+b*;<<-^L z;jKZx&x{zyiMoyxK~h7sRHMP%ftMy!-Q|qg(bi$5X(a@S|t*vk(xO!hrEbyat z+B<*kw$wV|NZ1XBT~y*acJ$Y7r{{#R`EPB+{_59m_af(u#TVkW3nMNbzr!%Wqg4LkU{8%1Qo(it-mxa4%NTW43k?q=eb zUA7`!xo-33&5zdh4;+)5)(5}oRj<40wMrc$SWz+^+aDhTC_uGW$|LvDp0V9L%YZ5= zH6ScSd`frOE#BOJk5v2X*Wqosz&8ILbI^XYxx}WmAe=+9pbd{J~wiZin+t$hsrQeyF`+7!!DxNAIqv zdw4T?PPhWP^cD$|N&wHwJ*+GRbrumjkhhZ^{r&(VQZD+VI}a-OgMW0VO6BLNX`pB^DYo^ z@&C9_`NSlf^wuzs`-E_*{@J+pFQVK?(|x2_@JuBN=#+n@h7BhN!UO9$z9Oc&OjXa z8VD7|Bsg*xz2PRw+jugF@}V>%`q4x!9}aY) z+D8)V`!@e)_hU)Ea1<-hm`V|;6#+5z!M^fmw;THbqheN$z7uQIcqBISOiWi{UU-V^ zw_qo}<$i8B3U0d`7`hg^=Q&*N!H647tz^MwIp@OIrGo5}D43#qT4u_+B=&ty83pTQ z3j%e{LnX;VZ<>{1aV4GL@J4w0h9vJnt8qTr)YLSsDV5LXKgfTJb2;1f7dJZ%?Dvjr^T*irt9f!|C*#8Tgx%PJe=T*YX5|gn1m83nR`8p%gsV z%h*Lf#D^ZGv_GdsXQ`eEIWuNbM}}iUw1Xz&;9^N3^>53PSs+%jRfFhsD`=Wr!mIF& z8K8ZCaW}-r{^V457;{wJgpWwhpz5(d*$e)Pw4_a;NtmKJ3sIyWg!}i}(2b$nxbU6P zoWNR9&4feKoG*|?NVpWjM~m`9?uhhA!&#>zLK7(H0$q#&f>9*{J^;6fmM}h7K)9xR zF&La4<+He-)FEQdJq#Gx5KzL?!DLAcrtF0jP=ow#7k}m4x81ot9MDCRCQVw3f0J(l z*LBk`LUEMr|h;!DoQI_!XnC7$4Yg zSBznG)~J18469T>k6amujNn>Nyn^)WlOB&KGw=aVq77LjNzk~ix`(DD_sF8u`cW24 zNy29ieWu(!*Lw`ui7TfKzJ=J z_Wk?ZOY26DzI0#c+9$7VZgw7w#q3}AxgS_H2=zSPB$N_nYNijY^DR$sby0}=(? zRK}g$fbWh7BSm+)o;Z&&o}d?e*d~*E5lL}V*kl+ZcHvkgW&bT~CWXhoYyS{7r)*Mp z7_u4|^) zw_MW;b!Re$1(b|<^s6zSa4TwsY{sJ?DV@71VKrCTtHdLX0F*$Z3<*;a7BANEA!;RI zNKmhl2EtY(dULdxwNMw1QP|9)8xGeXN~vNMU+AH30t@wU5`u@$AP{_)G0$uydefif zyddHfss@#R>hi2X75*}nL0;?g8Nf$?jdB5omO|Qw&9^g6u5Da!ZA2vR8WMdZbjB8O{;s%Ruy#nBo@Hr|g6{NOM_jS;YtH zLp&0S!XtRg>ROKmo&&kS%zF=V;DbEwL9v=RgXB%a}PcAP&5*WoNOv8qO079 zTj}gsxpHN+qQac));(Amam^2~C7$b=%9|^V>#nM(SbNVs_f)zDsckFWO0ybAmCj-W z0z~K4+)x#E&NLO3X4d7GUmk_~;`F-8He=kX?Kj+TLrt{9Aam!LPPl4&6fE`dC)fbMNnL;a z^>L>vQHL0%=1$B-Paa&qcdvb}*32As_q{Fp?5NDHoCz$~oCn~ZKDqbP(+0R9c7*zc zDte?c!qUIW;ODHYFNFTWoCsnXfD`8m^k~uthhGnfOBbAM#tHU{8crl(3){x)1lR=_ z!V@E)WJvf$vVf( zn1v{z*|Y8ab*3Hesjt+5UDnvQ>P&ad7)AvSg8~WPPOCQ)JyI(;j9p%DZXNbr=OL78 z#=6vHFu*Rx66;Tf?g>2+8V$XO;J=X510ms)ImwMivJh6*7kQ#vEB%QUS11%0B_;|3 z{TN2UIzEP#5h`&hurl5-=~MFI63BW-ic{569--nH{+#irX{06MU<9|*``<_X>K39i zMp>pX+5WO)$3EX+&T>}UOw9Z-$W%vIq+l7YgAMUOQOTfItgIRK4cQIeu3|UF$fsOy zl5;f_$YjPUj9ISKM)KnEST5F{2zVmcy1>J$q(LfW=MYff*bj#_Cj|VO@-$!1) z+MV6a^&i}McF?OH+yxYF7;zDC=oX+Mo$K}k(lde=f%;q0W)v0d#71)?wncuZ(abqZ zW6?vjsHn-rD2Q3LsM4fOA1M_aDl_yLXm$`?_#kTP6lBkt-(;3LmG-J8bEMt!vxv8Z zJHpH+1$9UH62P9{d7p@c8NmMok|J9O7%W+cfozi7h^DzMVP-nNvNIB<-}$m#moO9O zOn_@P4`1n8*sI*<_pZ<`(A!I)pM-uJ`l|yq%8$e%&I+xdOF;QvyDMS3#(#AT3oWQt zMfCt74piQ#eEq+kGBV$f-zNh2(=KXG2U;z5GvO^?*&n|=mKaRoPBT!Q1B%^yo=uvc zJ7p0pc_{VggHMSqNDigM0tAPiA!#l|`69+(0J2el8u!35sLZ9YIGeIQD2<^2%89xr zdPp{sN|hzAVlPNggW+?}wQj39tZ59wOMQG}gZkU?>tEZIt!BlrL9!xl30?!c<2~G< z09HpHcn1~$7DIfbj8Mc@@SuG}4_|n36qH<58uVafltGYvhzi3_ursVMQ-~AAiEAQ? zT2YVA(|Ds!vbj0w=yyL67;owTalU zyU}aPJ+_~1&tcR{$7rs6$i;Vy%SBrS!olK%&OD;bwi7wXRQ=3E&WLF0C6DkD*+=M zMtLc^i9uF@LAU`{KtX5>m=Iv-fbe&*=jiRQ4^J`|49g4l0{ONp+F>|21dXV?NNj>P z<>wl4&VC3Aa!AOPd=qg1A_eNPSm($b1Gto*>r@bHBQ~PlcwM1jw@x+>!)*aIZy$zX z5zLw?Fb)O$7Dce+U9e@%zE1mWKt$-NQ+n*bA}K^FJ5 zEH&Z=BydUnW2lLB!lxfZ+3Im6AhwVkzSW8kLb z>ILR4;0!Y)EE!Y|OoKy2oM7`LHauWjI18k@-X%5?t7yBbReH$#11L}eBlENbTu&b7 zv^C#W%;%VMLL(#gmnn0KUD#<(#-3HuY!cyiggbpV^yAQff)mn`0vDsW*Jco}Ku&U% zybZV|ssPb~WCkxYHBF9oXEx|%AXHTtpjU8Pv2T2YpF|RCXoNo#SH-v`02o=s_W_e3 zZTS&dg7>jCs+stF37{mQu(C$%>;*`GODNIvDwE~`rBH*YDgjL;*#z>z-Qk)VduH0C z?bV2c$He`%##Mu$V?o zkbq?Ie)~+u^t%q%<^CaK24Kc8nckP7q;z10Y$@|^VP8c>^K!TiMnb6s7z)v}P=pz- zaa_o##67|m7R$+)vU&b{22fOsW%NZjSKP;WQE`W^!Y<-mUS-o$&De1vFH{4AaR`u} z3`1!Nc>XD&AxY#DCA@*l@=-<$nBXH2Pa!0Lem7nr^jQiwdiPu~4N(Wf6uEa}Gv?n{zXp)i_vB47`eA<_;y%t z?4iijTlplZJO{QZ-fsKf)8SLDoMFy)-fQ1C!#sz{t_E00(*cANvART35oEI1qX;Cz z^|DMbLBt&(;)>RQ%WOGRH*&Q=j47EB)kWk;#0+RJM@(<(R;W>)5|Xc z$=`5X!@|RQt4hV}Ej?xhoQSXWn2YV^pG9hy=izMy4Bt|Qa1vMv+>~UXLbHG&M!??Q3+rjIeWBOPS-5y{W#yUG)%uMg zcO?Wr3aXqB1M1n(w;?zaNxCbfZ(#SNx;{}V;q#b&j7f8C@Saoq%rj2%sqhhavI{GY zPeFj~MdAbkHQVU}rrWL>FwOIY>ym6!$TE+y_4!QyyE(CU44Bu-w?~?a#dqe_r0KvD@+{(G1Q0i;$Y5 z@B-#x!b%dB;MLha;V7zmC;Q7!XwyXf8^}FXx@Bt%=5WN1E-RRo!&|mAdR0yGHQE2g z2~r$EB0UXC{4(CT1jz=t+x%sr?LdbFS`LXXTmm?R4*-fzzmuCi4{7DIR%M}azd45! zL&mpzTqnkz6of^OnzXZ3p|$=0PKNF5PU@& zj;%ql!cg(Fq+^r2X0obxj_1O`#H8?EaFAi>ieed)G(c^DP>?MeuLIvxD?;{s!c6tM zCff@76-1rbv=5YN*khEc_&F-3K+U+g#%qu>KWcKZ2V2!t9P1S<{ zQQ#`#FeJp<#xL|njwt{Fz;L`17^dPiv|rN|{H^OzlA5RnO}(v@Vrp26SfXh1KYRY^ zFcWujqG^2vcG9!(KhFgR4b64pw*a zIhD3-L1`Unpxk3`5V0&Mu@0Ow$D8}nO<;-`H2{OeX1|Ha`b2oa^l8-*-`_A|TNavn zXV7LBnqy&9`6dj>HVY%`BngQDMPi+TDofzWY#OaAz#iBmI!%t#^Nbp{>z{C%Cm*QK zCCS3+FmZl|w7frBXqLgA%^Yryg*azu#~@x=_Xd=rl-#MM*@9*3{h zf0tTE@Q~W(LGuElbzdDce(0Lae=HUC1TTR_f_k8vu{K2e;+rrOKaCJLxr*o|&|d;+ z7nsBPi?l()|A7ZoK2&}qC|-VzMLmBiW&djH#@B0aUu>Sle9fvO3^$=MVu91#j3H0knb_yx z6=8bR+EhCuTg!F(KD7h+5-41755E|rG?@CkDk>2q^!fkI8j&0ni?>O>Vx5ZIQ`b6e zMhZ&en?fUCru#EjkYy-5bLNqIkDNI({PtdFyBn^V7zx`sN178Oqp&o$9cjKetlOS5 zt5zuxhHow5K_}k`sinBc)rZ6$s#JhKlw_WXZ6@luAO&Q^Lud1mM#31uhFrcn4oxViP=~`0jnREVSeW0 zz$;SvaZ62Hvc+T>yNebOr-kJa+u7iTuHIN~$*|x-RM$GEE4lQ+EK~BAh{aC5Dc8 zmg=?7EHj&%q4}@#Tw(h5)UKd~ z?1m;`DDQHfhDRX>l%&N898(AZj}*g-VBrmQRuHS{yvu+~0pSWs4Da~pP+l!itp?!G z5rwtdB-z`YbXQjz(@$5fG~My}^IMy1YHAu9YI>?M2i|wpf(7;;SDN|f=W>~5UaqO> zsj925IU32ya!1$H*H!gs@s@53IkE9+p!SpK0(Xptzt~BoB%=bGn=I%El(Y?>m7z_d z`=FPZTz|h^xynqo=dLo>R)U9Pvw^3=i}t*^$~@#$Q}NjZz`z8wj~r)OO%q&Az4qJ3 znYK0|Z~_B>!FU9w94&JD*W=8t4Wd9Pwah{;u2rZf(C*X;Ap|JS2UejNz>0#q9y&v^ z_LZG%3=)>FBUdE+(%Bh)_(PV3w~V3jY6iABj7MDY6rgKo9SF=>*s*v`FZ3 zBEd}u0v(P?x8uR>H->1Ss+hzQN$LntS7cuUDCT5P6luZr0@xL;7q2%r>tp`|d)0}iH#KWkZPl!b`iTn`EQojuE5j!vJ@2Filh4Qbqy>}C1~Pr~ zL^Cjd_Ux+KS@qswjg5^B^-XmR$7eE`cqV>?{w(V5#`4ZMc?eZj?a~ZHT!@xor=Mh| zbb!s!5#&XI^Sul`L!X3Ih-VkHc-~3oCItEfTz(No`*dK=W=t`RK(O2_TT=#W{mAXb zbxqrZ&;Sk)1Js>B&zVpb*br6VKpO*F(xjtw{F2WX(-D#{K}_1MC!1z_%gJT}zve>{ z|I^7ZG)N^Xd$>-2J=2bLL%dRwklw`;sr*koDN3^xIcS-3zJOWc7vsmr`oY|VOQEH~ zU7x_|?JmIj5=$5TXw40f)5#m~i*EA4wDXN^+w7z@=6NJ&O~CgzOBj$sgBXsu>?BlI zMgzkU?7DU9;$f#X8e7{kc7p5L<4-mHH6tV8cqDRSgENBcC0kF0j(3%_ zJ;e5M{m&-M?0pI}edsommh(Vgv>YOaPMb`QIWDQd0I~oDOMua)aC-2LFby7+4HYI> zBT2wQH6m3|J0x>pMXHO?paWvygG;bw#&>nzym`rXEWxVV@CuSm)=6(`>T6;#2N%B- z^~V0mb=7*RX@tbZ;VV7i>Z*oMQ_;hw71OI`*Hl+k&#J1atmx|Oj8F+2WNZWjBEm>T zQCW#?SHhSkXgDzviH9*8^Ws|5JdEXD;bm2o9a`sheMNqGTU&d}*dJL*b9eU)Y?E9) zt1{Z!GkYFihs_`3@d<71&CNBQSJT|wPV#hwMmb-x9*Ruh_6L!uzC*TokfYMYGD<>G z#fab+pad1_An?~-bDEip8OrBQGX>w2W0d}3h~B#d1Ai0qDf@nQjD$$^;8)Edoqxdi zsVf+R!eIvmh`A|JQ^^?lq8PKpk)-S($?GqfrK|z$#eqNM_>Fpzgzt(Ib)8IsV=gDa zM!v*;^mNmQZK-#kZe}Ch;m=MtgHFb#&oB$YxEWXWZ1}?nQ}$i$m`~982&Mh;a}!GR z!E^)}fRH>`p|A&03Zl41v}P%-i^o{<&RKl$Nlm_vgU{62ubg3ys%URtTf6M{$iP*% z&a7OJ%XQ4-!ijkuO#i_|`+Koga68hfbpXg18O~$^pVfAVi*=p??L(V{S8?k)(=v>$ z(=LfarQcp%T|f4~qzTwbZ9;sKb4q=6_2>xxh&d%jcmZYy=++EzmnP-DRQ>Yc%DNPR z(8i>ce8U<7zs?t#7>>!Gd5-S#iKur15r>bkk$r%sdZjhUg3MlxUB*-JS^wLA2*cjU zNA&GU)=I;Jc_Et{GOSjlO+M>XrBe2T?=d$yt+r~&Tmw4{-5P>E-Vtho6b|XC3z-co zr3_BxRPL}B&?%oAGOPQfbXoXLndhOuWR;X%9kkEiZ(8ih>tQ8`|I>q8UuUbOg=i&) z;>Pu+qq;yOCv@OH*t6bTGaqCt6Vso;1P^EiT@~Q6%iw2f^2)k@3^8Q`?ka#FYV1Fp zX^t1u+S~Va=g&|!YOt{WWJJ>KprRrC5F~*o!A8j(^#rbIB8-StHl_G388#H-N7NC% zO@@TxF3NHq2()N=d8}_Hukvo9RF_y;9I7HR2wkJDJ*RCz5a)`Vvm3l(HCD<%jIkh_ zq1Z*&C#xhalLutcVW<_D&6Q1?Q4u>NWoU6iZrN{aG^?CjY+{o+>_}mRzDURJa3a`1J(?s703;!y>LEa5 zw4CioGr1s{VqVs2hR>VOrm1(;vr|^UD(!R z?pY>Pb>)?ZVVlG7m6u&+ht4wTQ$|MS!Db>t`zmY)Q{8u`QYp}jz>kzhm;jDKDFRFE zuM7*F*$$HQW0YKqIcI2WFD6gEb(UFOrUJF2)?=`miDKIaF&?BKCPoMkgAMBini`8J z*U@hl^0hFvB++wRI&@uYkkGx>-h8&19>MxN`~2DF^2IJ@Yq?JDlW-Gd(4M2DHDCtH zKSg*a;fVB6M1(r=Hqp-&PZ?y^u$P{L8G~(h_c>;5oBA24hcoT!66oL;ghqfPbY<*t zounJfI&GNDDgb#x4p2-*nJO^K3t|-R;uR%7QH`n}3fQ5}oWaK*x4F$`>2OaE zU2ghyh+}{EZp<`jJNlqpA0xWSW^|AENUT6W2ZkJ85w?VQ089wTlv-07GpZ^4q??$G z7!Vf*bpq%U?UVv>T|$L2WL?F}(7rIS3G|a2X!zr;@fC6EwfjO6>Wd@J;tY0ltX}Pe zR`0Z37n(%~FWML4{LY~KX#u(q{v!N~1TYs~#WS&LQsh(-V?E_q!p(qJ>{&Tp0$0#8 zSU*JP9Gz1M!8g(-Ei5CFi0G`^Bl!}>BPj`B02z6n@IoE-zb`aB&M9`%7L#(KcHtH< zjg#$%wwQ^-kw`^2Qac}eCsrL+9gRe5>$t<(Tl;p0jSz1?rftW!+vHKJ+PpHQ9@vMZ zUOAQ>6AK0CWxA`T@#wQW_F z#jh&hWJUNd_7!zE02?7mq+)@r&^TGAU3RfK#c8uUE;eh2ckWzXUteF*b$ks%KOw?I zhH2E<5^)}t)GsyjRl5(gd~J_15g;vXIv@m59RtqR;2YP+O&gI6SdJ=P7&_fK|6uyU z;bZJ)|G}KmD(Z8{*$#iF$HC)#eWE{GLQ2A<6Ezbt$wP{0 zri?6G+}R{3g~-VROHmo2(?*70`a`w>btGL+4VWENK9aY8dD)$E@^;vnab_xvoA9It zoV4+z4JY_*io>|{@6|iwZ{qBBKrQVd4M}~y6UTBQOkU#1sjBwur~W0 zKk=G4PQrD#jhrVq>t@k|-9WMEZ2WP_$Pi!N(;9_!%A=ubH&VfY<_2A(NOAIIgqxoy zd7koOm?^dg7=KC>9S&?IDrC4J3XDKH*k)AhrUaml-BBb7H}Unhj;LefhNK! zp@}&sO$w~%B$@*%5KW9)QKN^Vs`(`K2cC=>2V9B=S7b(wNCoWzZ-?x+4VPkdNF-w1 zSR@j2O@y!oR6X%mF?65`leF&(U4bo8I6ofJ6wzF&*AG~rt%1>umIp)wRW9(OF&_^& ztN%`w!<^#A+euO&F!a6|xJm7G01^3KLPn3I2b#L#GSgGBWXYDn^KQl({#}=u&EEFy zgF}zM_@eFnpt3)HXpU1IRi;*EBcxh-=26NKlfu^*X;6qg&i8`#N-8Lh0v4)9AXGW%O52h? z-QIY)SpO@3kcyRHG(%7nlF5~$b zX(GYQI@A+H!+DU;gg-hX%mu(FM(`RKFWGVhkWDJI*L=u)87dhQx{tyoFp90mx-pBj z32xPEfDr0VS51e)@u2%i!Z73{9_2e;DY6Ey6OlzuOt>n)Rn;OV%RE%=7bpAVB!E_S z4w5ObmBA(Z;uYrpGY1C=FZpWle{q5~ia|rwhS_%^&VA=N!3BI^hXZ>lPcUFyR7!Ak ziI?O61BE+aJbe91tSN1>uU~0qu2(n7(+ITs3Ty~WElAb~^iR-QcWj`16%0U4Jw$u_ z`bhzb=ggTUVhzvfv+@hmee*EFo?7gU!)75Ym=}kkG=Sq3%`;|@T!$VhaR0sxlC%Lx zy9&b+BvqFoT?^n*BEo&-T}ZM zqmS6~wC8o8`5pM#?SGD#W$;P(5}Pu!KGXquiT1IK4hIGV=LCz7AiZ|YRi=Hop`l~K zy_Mm^4qMX$2UDOaj`%h#0{WlF`t>2y7L_IhOBjMmWYmGPhgz(V@bDm+(;?vG0WSzB z``T6J!wbq(`7YV`?G%hn@M5<8Ky6;pj@er6Z67ur4E$DVAV%8J51Xx+S5;@6Y7-dl zahk+@vKaj%TOxWPDS_6al%*P$ev?n}l@utTMf=y6-K_o2)#jA4h|2^l5Lu&zIQj96 zTMQ@~tYjPfFS?J25)Kpoa~TljC9z(9lMoVGSPD2(5r|b)TU+J-3?U0kW3)N!4Q$Y@ ztT#j}&u?o?A3Jm4h=G~Ql1ChIM2%OuA{O>)oIQLFQC$AdHtgW`%tt^FEE0~bsPqt& z?SeFjcH3dQaO&q$41hE^N)krH1C@%62Nnu;`OZRt9r>W(oJ{kR>@$2)-Teo0x@5j! zmwnV!P4M+JH4pOrzd<&ojURfMs5wKj^1KWowG&w~X2Khlp>YIdyYFM>G9UDV z;7%z-GIFM~v4P4k9I0_m0#a6UxE>UGAgUX2JfR^%?aya%kOAP8%fMXNam~-L4 zXu#H(uLE*z2pXLUy>*2+_~8t*pT5QvIx)UFi(Vo^^q!Xj#%+Ihjd^?(NWTNt*G_cj zNOUEz4g;~m!o)u&gCk;)@sJCX?U2`sKM>QC1Ud5;*#EfJZ0Vngsm+iR)Wtfez_KMe zVas7cZSc#m1_6h?{Nv{0AT1+-+Y3j?Ig(mKNm8kUbXI;u*2MV&qCwCa-`Vsx$q8M+ z#yLbYq83!K##q@fv5lbV_17V4p}~IiI&*!QODusn((ACX3?fNMc78xMo8dqlVRnMG zBJ-{YXZD*UPx$dFze`8DO&iXo4WLOuY(iJ1kACwUNiq1NpvSh{m?OeasK*@&Og78+ zqm0=84z^{v-ki-eCe=5X5Ayfw8%*ZJ85DbP*NI_RoJ0{Y%8RAjoFt@w4^w~6g$~1o z7EGN2r9DUvl>b$5-l~=eG+AAXO)Rg1)aDV6KaPO8AuKI$TvY*;& zR;>jOq4>ZAR|}S%91j0MQNU7L5GPn5hGJAp)TdvfL^TVc*(p|I)S=Dr*v|O`jA~>u z`h@8?U7W0V&DW5|j4=~=A%jK~genCeG`WtlYW;;0fpN(5x+oA-NflXxRe3)10g&y! zPe4mK!%n%;%pZRG>D2^o&+)TnJGHeF5YFLN*Kv-=K%sjMEf_@_W-iw~UAA)1h@kWs z(kb;Le`!-slVA$Qm>+B{tp`l^7!i+r_d)gvPpZn@5NOz47Gq;Kna28&k=aOZQT0L7jO-8)|`8Uz@?}~)t=n5AGz72CX~|q{cBxaT|55S=Wm7^@+&u+cvoB7 z9R9)rp*U|C> zzkp~ZiekoZuC0;LrZj8v6*I-3fijq_NT)(n<5N5&a$V zDjPrIj4-2FQ@FM+{zlxM{YeJpl=Snzt3BgftN-`y;f`ICZZ&JlY}rl$%Vhuz49`3{ zx=;z%K{onsEX35?*|aYZx?0}uctz#;&TGq!e7 z-c4F-O-zrTwWa}cGT*W0eUP4mx0~}$t-y3sD-sYbKwp91qSDc_kpl<{B-;Q{Xlis^ zi$#SSA80qE98Rc@0R8t@7YheHV0PXrxfSl2P*hMO0lK;)y3Z09e7E6 zzZ>0$y1^&*eDw}9Ck#^@E3pF*>&nSB5E4vzaSx`1RRbrwaHgaz7C>ZGtZa@yK(vEg zN|$Vb{YwSTXTISe+fz0{UA8xU7Nd6eXU*?4lhL!`BQYah0|%124NCYcbWYZ&GE`@H z6XX++tHM6X10aG5z1@(~6gCNH{sF|9Iz$vvkU|C}K`bwqr*!z5ed}{3>uj+dcglQJ zMU&4>m$hD48-?txsjl6Yssls=y=W8@Pz?V=FGYqkg3Ir*D7IX0BM_mMiMI;7CuveS z!87!;l1#D2YX3pEuil9@kqk0@2L7xsL#bq-;0GbqseY>}L58SIkS{_Lywa7tutV|U z2sh%Z2{tXKCcUZ|{ZLNW7~BQB)V!&nD$1Ja0w-Zr%3a}VfczI<5$ciw5dMPF_Sf67 zV7$iG?SNXBwS^s+_?Td~?tmq+*6!M2W)6sNE`+{h(T98inh}SNyh&QF^(y0MuXtXt zHFudM&~6EFWfLv*kBwJr!~!P%0)t_MkU3J{Ll;BC=ZMl z%+5&_z(k>9bdyv(o=-p-!*GIoSm*OdlFlN z29ei$!-E331>jTX(y{QaVTTR}vQ@!EX^Uk+@8)V;MDzH9b$hkO?6 z{~&wyILz1!1O9%q37e%Hq$}?h&IR?!kTT0)Owr?e2mj{P#K8;OiyknK*)P2ot{R>K z_?{K|FyJe$MhqTVst3;)`8$U(CIiK*`^9>m<9XWw|xoP+dPZ|@Da31;pMS77*yjf?m3)qXWuG%gU0v2h5W z?-vnMMlVH;r8qevtst|81Ok!y9abduGB8^u@pNhDq z6Cmq91P&BM$wQ&KVmcGkL2wtq1y#1HX9$8&41NV73z6MYxR7%B3r#hd2g{Q2V2hNG z2a%T;Hhb(NW>PmI{^M7G39V+rLZ`VBqNZ~YNIBGjKk`rf^w?`3G4t)0A2B(}jWP&P zG6a=nMrf|Bc+^aWCY^oMAk)*nw;{T&#t>xSyAYvgzy7Gn+TT8E?ph6*hPxxU+bvll zF{Ela7;p(NG3ii-@)jt>juBrVrilwFYB=gg<>jWPPa%2QD~};^XReLxltqTVjYlC@ zgRCvn)aInY1T^xHz*=&Lir^7DssO_aZvvNZ!ot0sJ9joPzFK0pc`!Q4!-kzsNDewW zpv4CTMhF`z#4Z^K*Rw~lQO8$cMD&O)gGmMlIO54d56CxNS{O{QXwXo)x0^Z$+NLND z(?v&+%8FNhk}RFr-|aNFCS4KdA@r1yZL1mW1RBxZG~8|~?_87{L0FHCO$h73FL#;U z!%Kj9>(!-{rQG#lqjL&CFtn!#AaOIQBO5RZ$h!Op;X?tgQ89a`vn|}Ux4~9EZZa+7 zc3#|06w|NmcJbqZjVx#~72fJ~P~OM;`Y>7&)F@V^Qou#Pnz7Go1Zj)SpI(iKe=C0 delta 159754 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 JGe1A+{{qzV&2az# diff --git a/lib/fonts/fa-solid-900.woff2 b/lib/fonts/fa-solid-900.woff2 index a9f37fd1364e902b68e875575e3bd9762b59c416..824d518eb4cbbd1fc837dcac2ccad718119d1ac9 100644 GIT binary patch literal 156496 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­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⋙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 literal 150124 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

gm&~i5`u6UF0IuHC4q}Ht3ItNdc>>uCbyV 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�J8HYaze|wHs2iG#=rp=c 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

ig=m!`2e@TCmF_p}z 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%0D{s%bb`p}`z?!+dNg7(>5 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 diff --git a/lib/fonts/fa-v4compatibility.woff2 b/lib/fonts/fa-v4compatibility.woff2 index 507a2ff51cc47450f21e8a7356f8fb963db83598..e09b5a55009f8a66dbd08af7e1a314d7f5afaa25 100644 GIT binary patch literal 4792 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 SW@ke+i9ap#|HA+S0001);};|V literal 4568 zcmV;}5hw0IqfgAvW9Ll-?%TNW000$t2K@t&FwI2eYk+N|9en0)D|D7`lGYo+l z5(3jU_clVywAU&$&^q^tX`Yy8txv3PO}k>wis)C@JYD}H{{N@b?vsQ*U;2{31tt9( zjBy$e1i~ey))}zF*rXuFXiE32N?+C5w?4C~b(Q?zT0bmbZI9I z4+3NOrGl)wj6cUMFaYo*ycz(GO_%f^7=;%C5HLzeXGRyl&f#;7Rdm13d3@IewXwi&EpfxkIxDu15Gku+c1q; z9mPT5X&I@KmH?m*CDQ)X)uD_g0IWj`$}m1SJUDi6_2A(_fAHksnZefJ)r0p8-Z%Kr z;QNE04t_iM>uzN?++E*2e)pu^b9OJ;y=?c2-FtUmw)_8oj{fuh;SgYOcyR3Cs=-4z znpn+_>#MhW#qM1{w9MtFw*jV7kuP`=zZFmpz_OOMwa)Ws#23B>j0q>*hEi zNpi*+NkYhYQ|pE$gf%kZ)oR|vmo#oKrYkE4q0A)783$KZ(#5uI;~m&+wVJrWK>hz_ zm=nMpjt9Ufoa;!WDp0W>b|W20q<+1LL7Jr9*bgbAO$_4s4NP>T!*1*cD%ilJyD)zB7XRDF+CrfGBXB1j051y9 zd|88FAMJ}x%QCOED3gnel2Pm0vWLY_nC7h&>0pkItlWAhO7SK(2w(;sfXRWwA8jzS z<`Vypa+=;p51HRT!yN*+4GoxqBj6mk4#1mNbAewCRC`_pex1><9qC9{7t$nF^J*^G zi*-iBj*ixFAx+}cFIpe-D)2!wwFKuVaZ3;A6t{L%fSilIUcf1LKi5uho^fll;x^}^ z_<+PB!$5WLG{Je!xj0gm3C^=^EF|e`aV~nLvYz0)w*x_Ttb;I*44ZHa0II;ROYE4X zdqY>S`#C^|n$fd@{A;rxW0N#VW0o4>{SQIP>%y`ui*qrA;|&Gp*l0{6Og9?*(7^m+V|@Wl{bD|N-x zxC&uGNBhyBY>u*OpaRuSYBGi$M)x9R?aqvi=hFnfA=vXd6Z_u9x#c+4JEvXG6QQIS zbX0(1aAsl!VatnLBFbAkde*mMj-KaEzteIYi}QEw6O8+P!FdY<)hTi`^pM?=h!Qi| zFQt5X#2etnwo0-eJ38vt8w4s)Rmvy}i{~Q#rFeS9=57?<!^LVc_pc+bul(^eeY7Uabp>r$I&s{Fv>2i?j^-6wmYk9M;^Jh+G!)UJF9C)9=W#KY2(mUtjhOJ z)l9RdZAJ+ntu!1%>@n-2EX;bDxx8eQS-E0YT)*yB>t&pp$~G1cT1KVf%vZ~%5XUSp zPjosH%ge_cv%Eaf=}asy9|Hho0008mhcb*o6S@Exc4L2%vN_89K+S|ZB+`*?qu=hf ztEZTa1b3)$L-uvDSEgy1cX=iR;$%RN7S=&$ZVn5X|=L1aGLd7!yVkgZO8z; zkQVO-DyB_^5GembOcgU#n8L9Vbvnz1Nc$*Rm`)QN>93p16jP_3I%Nxsm}2VGQ>QA_ znC1myx#2cBgolvWA2BDbv40AOAcm9RDgcjBzuqK4JikGb?!pYQyWSG@=jyJNGxer! zQ`lh~nNF2)%p3_;+{j-d!-xbi3?gy{pA{k$bx-0$XS2l%@Z;BwTsKmLrn%^sOta)K zF}AcVc@cXx0bhptQ;iHGDz>HP$xsMIT3ILC)YgQeNLA)-)^RDX?`T+nm67MsIyY0@nP8O5ZDjwE*GI&;BB;1YZ+n@{HwD+x8Z z;G7#k-6mkmoMEHJTHMH9&6wv`GDO~JPJ?rwmfM7Lfjtyc%$1yb8)OXUqTptxM(sJj z!n_yfC)5yK^Rx=*VhgRNRT}{O2wwu=wc`Wq6~*dEciVQ9p%V$tBlg$NA?hw{V4?!$ zw_BK@=ea%3d#>kUm`KvI6gh+`%&?dFoQa<0I95-Xrk@cg3}LtIZFx`PNPf&P$2^vh zXgC1iN!8u9_t>KijM9>L?P|LU1KTq6n-*?hMhSxRevxB_eK1RIQS2A)D??}oboJ96 z=6Gw1xJlRzuVYw^tFCLOO~`1zPt@`{ZD;2ij6gcf$#Iy&c&z1*G?m0D1cL(3z!jJ# zI+`J+stTIOXcKi5;yFx8cGRn+QMPUwBev~4{e<}Bcd-NrFqE5XmOt3n5Q8)^ zS2*N{5Swd%&nfI~VW2uAo@Y_pvF)-!Yn{%4wdpD1vcn?OQyJiFM+NBEzFjUG)V7_; zAV4xTy*8_UC<7tmoLyfFI?VA>%wZA$69Ys;L2&ZHLk7Pe=n5@PQoO{l9%Gip98 zmZ5yyC#-!0r4!UN=@D(leS+JtU;)DX!{ZW(&sqBjYMOL{(j(f8_;RRm2Q%D;;{d#c zbS_yb1z95k73Y1FQKpuIoRn$f=hGy0@lC8?q@(?$qoXcxE;9E6b9U^aVBzdFKVh}o zhn}-a#55h--l=;^5a$?i;zDceGEAEwMSL=`JLuO#9I0&X~bQqLvVbszh(I z6P;vP39xgpEY59c$efr^9J&ojEW=3{0$lMX^WDTuipR%}c&`6G8}0i^P@~?H#=x9SOszn8GqR5$~p~`ZIa_i*8QD4PluT zy2j?5+S_AmTc+7le2wDcQV78!nkH;pXj+5`A>??RuI}yi554TfgtCNJ`$Gw9upf<^ zf<+|GTOeL%@ibh=JLi2ik|evVa8?>PD+~GLoaPw?uU_fMV*!V6{oltroP@D4ZZb2! z*UEK^8C5FJ7w>Q%3YdfW+cgGH3g$`XWs|758hf8)2{%~}(;bTYc#e1}UgY(rdmPdu zt?`M))M>W|4k`;INlV2X`R;sue<0V8KiEBy=*;9QR+p08dO4&}{(j%HCOiTCM zgnYiol9<(H2?1b9zj0YqQB2bke10cQo}5lko=g;rPnE;(Wmv+j7%%WhOcSPM=@CsS zzU{OUGd|QK&2$t(Kb1?PiefIC-hD|vd2)J2!sUAVCSRi^^ctoDzqq$_hJ=Fa3E) z+Fu!@0y>#?wFm1dxC@{gb#?0O2`ow)=f+C5N@!Q$*QS3r;OcTEcII_;CS2Og040f2 zYd3)Hq<@@l!{&8dVLHw8jhXIHXO?-sN(R5|dkHr&-EQJFGdflmUQDIz3n-R-uVQn4 zh9yi*)phHVb9hUN-Q5})+_rdB_x(*3n{yYU$gEA|++L-namlR)7N)S`1#T)$e@6QzCoN{_7XF#q$?GZY&=M1*5&;( z*Np@Za>`yd=|#Nb%nr`e0K896-?CyLus8Bgfh*$vNV=_VXX z;64VQpc8Z-R4@p{eg|>&xaE|~yo@`C+;ZB>u!yRsk{PvUG5Ld3m`MqC|L#4He!J$v z{=ySaJn_WwYc5>dM^AjuOp|?Y8cimC7p!TRbmqZ>Q#Wor@2$7;8#nfzKr~8loa+qZ zI>!N^0c)!_n!{3TM-52(zk9X$ks)(1_UmdgzczY>H`Ooj6n6BfhfMSua@s+v5NdWP<;aPH3&!?WbJ+Q?}~t79K*9#Z|$Fl@F4a=BB2Mp#9iB|97(TNN}yB(t7g zY^T}0&-xvsHF-vDDASV1f>tP-LG!eu)iGHg4jQsm3uU!&NQOah^hiC-(nN4x0xU;> zCeFeb>KMT&LP+#t7_%U;3IQ6W4PA;eP(up=j-iHKs9_8()L|MfQAQaBWRXW69{Q1o zj{-{A@`PtmiPLWx2O!}ii{fqSXB{gRA!+|N fonts Font Awesome - http://fontawesome.com The Font Awesome font. Font Awesome is the Internet's icon library and toolkit, used by millions of designers, developers, and content creators. - 6.4.0 + 6.5.1 SIL OFL 1.1 https://github.com/FortAwesome/Font-Awesome diff --git a/theme/boost/scss/fontawesome/_variables.scss b/theme/boost/scss/fontawesome/_variables.scss index 4d34515d89b30..cc9c00ac343de 100644 --- a/theme/boost/scss/fontawesome/_variables.scss +++ b/theme/boost/scss/fontawesome/_variables.scss @@ -1873,7 +1873,6 @@ $fa-var-exclamation-triangle: \f071; $fa-var-warning: \f071; $fa-var-database: \f1c0; $fa-var-share: \f064; -$fa-var-arrow-turn-right: \f064; $fa-var-mail-forward: \f064; $fa-var-bottle-droplet: \e4c4; $fa-var-mask-face: \e1d7; @@ -2012,6 +2011,7 @@ $fa-var-redhat: \f7bc; $fa-var-yoast: \f2b1; $fa-var-cloudflare: \e07d; $fa-var-ups: \f7e0; +$fa-var-pixiv: \e640; $fa-var-wpexplorer: \f2de; $fa-var-dyalog: \f399; $fa-var-bity: \f37a; @@ -2047,6 +2047,7 @@ $fa-var-vimeo-v: \f27d; $fa-var-contao: \f26d; $fa-var-square-font-awesome: \e5ad; $fa-var-deskpro: \f38f; +$fa-var-brave: \e63c; $fa-var-sistrix: \f3ee; $fa-var-square-instagram: \e055; $fa-var-instagram-square: \e055; @@ -2055,6 +2056,7 @@ $fa-var-the-red-yeti: \f69d; $fa-var-square-hacker-news: \f3af; $fa-var-hacker-news-square: \f3af; $fa-var-edge: \f282; +$fa-var-threads: \e618; $fa-var-napster: \f3d2; $fa-var-square-snapchat: \f2ad; $fa-var-snapchat-square: \f2ad; @@ -2102,6 +2104,7 @@ $fa-var-meetup: \f2e0; $fa-var-centos: \f789; $fa-var-adn: \f170; $fa-var-cloudsmith: \f384; +$fa-var-opensuse: \e62b; $fa-var-pied-piper-alt: \f1a8; $fa-var-square-dribbble: \f397; $fa-var-dribbble-square: \f397; @@ -2111,6 +2114,7 @@ $fa-var-mix: \f3cb; $fa-var-steam: \f1b6; $fa-var-cc-apple-pay: \f416; $fa-var-scribd: \f28a; +$fa-var-debian: \e60b; $fa-var-openid: \f19b; $fa-var-instalod: \e081; $fa-var-expeditedssl: \f23e; @@ -2149,6 +2153,7 @@ $fa-var-meta: \e49b; $fa-var-laravel: \f3bd; $fa-var-hotjar: \f3b1; $fa-var-bluetooth-b: \f294; +$fa-var-square-letterboxd: \e62e; $fa-var-sticker-mule: \f3f7; $fa-var-creative-commons-zero: \f4f3; $fa-var-hips: \f452; @@ -2160,6 +2165,7 @@ $fa-var-app-store-ios: \f370; $fa-var-cc-discover: \f1f2; $fa-var-wpbeginner: \f297; $fa-var-confluence: \f78d; +$fa-var-shoelace: \e60c; $fa-var-mdb: \f8ca; $fa-var-dochub: \f394; $fa-var-accessible-icon: \f368; @@ -2191,6 +2197,7 @@ $fa-var-fedex: \f797; $fa-var-phoenix-framework: \f3dc; $fa-var-shopify: \e057; $fa-var-neos: \f612; +$fa-var-square-threads: \e619; $fa-var-hackerrank: \f5f7; $fa-var-researchgate: \f4f8; $fa-var-swift: \f8e1; @@ -2200,6 +2207,7 @@ $fa-var-angrycreative: \f36e; $fa-var-y-combinator: \f23b; $fa-var-empire: \f1d1; $fa-var-envira: \f299; +$fa-var-google-scholar: \e63b; $fa-var-square-gitlab: \e5ae; $fa-var-gitlab-square: \e5ae; $fa-var-studiovinari: \f3f8; @@ -2244,6 +2252,7 @@ $fa-var-less: \f41d; $fa-var-blogger-b: \f37d; $fa-var-opencart: \f23d; $fa-var-vine: \f1ca; +$fa-var-signal-messenger: \e663; $fa-var-paypal: \f1ed; $fa-var-gitlab: \f296; $fa-var-typo3: \f42b; @@ -2255,6 +2264,7 @@ $fa-var-pied-piper-pp: \f1a7; $fa-var-bootstrap: \f836; $fa-var-odnoklassniki: \f263; $fa-var-nfc-symbol: \e531; +$fa-var-mintbit: \e62f; $fa-var-ethereum: \f42e; $fa-var-speaker-deck: \f83c; $fa-var-creative-commons-nc-eu: \f4e9; @@ -2263,6 +2273,7 @@ $fa-var-avianex: \f374; $fa-var-ello: \f5f1; $fa-var-gofore: \f3a7; $fa-var-bimobject: \f378; +$fa-var-brave-reverse: \e63d; $fa-var-facebook-f: \f39e; $fa-var-square-google-plus: \f0d4; $fa-var-google-plus-square: \f0d4; @@ -2297,6 +2308,7 @@ $fa-var-viber: \f409; $fa-var-soundcloud: \f1be; $fa-var-digg: \f1a6; $fa-var-tencent-weibo: \f1d5; +$fa-var-letterboxd: \e62d; $fa-var-symfony: \f83d; $fa-var-maxcdn: \f136; $fa-var-etsy: \f2d7; @@ -2305,6 +2317,7 @@ $fa-var-audible: \f373; $fa-var-think-peaks: \f731; $fa-var-bilibili: \e3d9; $fa-var-erlang: \f39d; +$fa-var-x-twitter: \e61b; $fa-var-cotton-bureau: \f89e; $fa-var-dashcube: \f210; $fa-var-42-group: \e080; @@ -2342,6 +2355,7 @@ $fa-var-cc-amazon-pay: \f42d; $fa-var-dropbox: \f16b; $fa-var-instagram: \f16d; $fa-var-cmplid: \e360; +$fa-var-upwork: \e641; $fa-var-facebook: \f09a; $fa-var-gripfire: \f3ac; $fa-var-jedi-order: \f50e; @@ -2400,6 +2414,7 @@ $fa-var-wix: \f5cf; $fa-var-square-behance: \f1b5; $fa-var-behance-square: \f1b5; $fa-var-supple: \f3f9; +$fa-var-webflow: \e65c; $fa-var-rebel: \f1d0; $fa-var-css3: \f13c; $fa-var-staylinked: \f3f5; @@ -2470,6 +2485,7 @@ $fa-var-usb: \f287; $fa-var-tumblr: \f173; $fa-var-vaadin: \f408; $fa-var-quora: \f2c4; +$fa-var-square-x-twitter: \e61a; $fa-var-reacteurope: \f75d; $fa-var-medium: \f23a; $fa-var-medium-m: \f23a; @@ -4328,7 +4344,6 @@ $fa-icons: ( "warning": $fa-var-warning, "database": $fa-var-database, "share": $fa-var-share, - "arrow-turn-right": $fa-var-arrow-turn-right, "mail-forward": $fa-var-mail-forward, "bottle-droplet": $fa-var-bottle-droplet, "mask-face": $fa-var-mask-face, @@ -4469,6 +4484,7 @@ $fa-brand-icons: ( "yoast": $fa-var-yoast, "cloudflare": $fa-var-cloudflare, "ups": $fa-var-ups, + "pixiv": $fa-var-pixiv, "wpexplorer": $fa-var-wpexplorer, "dyalog": $fa-var-dyalog, "bity": $fa-var-bity, @@ -4504,6 +4520,7 @@ $fa-brand-icons: ( "contao": $fa-var-contao, "square-font-awesome": $fa-var-square-font-awesome, "deskpro": $fa-var-deskpro, + "brave": $fa-var-brave, "sistrix": $fa-var-sistrix, "square-instagram": $fa-var-square-instagram, "instagram-square": $fa-var-instagram-square, @@ -4512,6 +4529,7 @@ $fa-brand-icons: ( "square-hacker-news": $fa-var-square-hacker-news, "hacker-news-square": $fa-var-hacker-news-square, "edge": $fa-var-edge, + "threads": $fa-var-threads, "napster": $fa-var-napster, "square-snapchat": $fa-var-square-snapchat, "snapchat-square": $fa-var-snapchat-square, @@ -4559,6 +4577,7 @@ $fa-brand-icons: ( "centos": $fa-var-centos, "adn": $fa-var-adn, "cloudsmith": $fa-var-cloudsmith, + "opensuse": $fa-var-opensuse, "pied-piper-alt": $fa-var-pied-piper-alt, "square-dribbble": $fa-var-square-dribbble, "dribbble-square": $fa-var-dribbble-square, @@ -4568,6 +4587,7 @@ $fa-brand-icons: ( "steam": $fa-var-steam, "cc-apple-pay": $fa-var-cc-apple-pay, "scribd": $fa-var-scribd, + "debian": $fa-var-debian, "openid": $fa-var-openid, "instalod": $fa-var-instalod, "expeditedssl": $fa-var-expeditedssl, @@ -4606,6 +4626,7 @@ $fa-brand-icons: ( "laravel": $fa-var-laravel, "hotjar": $fa-var-hotjar, "bluetooth-b": $fa-var-bluetooth-b, + "square-letterboxd": $fa-var-square-letterboxd, "sticker-mule": $fa-var-sticker-mule, "creative-commons-zero": $fa-var-creative-commons-zero, "hips": $fa-var-hips, @@ -4617,6 +4638,7 @@ $fa-brand-icons: ( "cc-discover": $fa-var-cc-discover, "wpbeginner": $fa-var-wpbeginner, "confluence": $fa-var-confluence, + "shoelace": $fa-var-shoelace, "mdb": $fa-var-mdb, "dochub": $fa-var-dochub, "accessible-icon": $fa-var-accessible-icon, @@ -4648,6 +4670,7 @@ $fa-brand-icons: ( "phoenix-framework": $fa-var-phoenix-framework, "shopify": $fa-var-shopify, "neos": $fa-var-neos, + "square-threads": $fa-var-square-threads, "hackerrank": $fa-var-hackerrank, "researchgate": $fa-var-researchgate, "swift": $fa-var-swift, @@ -4657,6 +4680,7 @@ $fa-brand-icons: ( "y-combinator": $fa-var-y-combinator, "empire": $fa-var-empire, "envira": $fa-var-envira, + "google-scholar": $fa-var-google-scholar, "square-gitlab": $fa-var-square-gitlab, "gitlab-square": $fa-var-gitlab-square, "studiovinari": $fa-var-studiovinari, @@ -4701,6 +4725,7 @@ $fa-brand-icons: ( "blogger-b": $fa-var-blogger-b, "opencart": $fa-var-opencart, "vine": $fa-var-vine, + "signal-messenger": $fa-var-signal-messenger, "paypal": $fa-var-paypal, "gitlab": $fa-var-gitlab, "typo3": $fa-var-typo3, @@ -4712,6 +4737,7 @@ $fa-brand-icons: ( "bootstrap": $fa-var-bootstrap, "odnoklassniki": $fa-var-odnoklassniki, "nfc-symbol": $fa-var-nfc-symbol, + "mintbit": $fa-var-mintbit, "ethereum": $fa-var-ethereum, "speaker-deck": $fa-var-speaker-deck, "creative-commons-nc-eu": $fa-var-creative-commons-nc-eu, @@ -4720,6 +4746,7 @@ $fa-brand-icons: ( "ello": $fa-var-ello, "gofore": $fa-var-gofore, "bimobject": $fa-var-bimobject, + "brave-reverse": $fa-var-brave-reverse, "facebook-f": $fa-var-facebook-f, "square-google-plus": $fa-var-square-google-plus, "google-plus-square": $fa-var-google-plus-square, @@ -4754,6 +4781,7 @@ $fa-brand-icons: ( "soundcloud": $fa-var-soundcloud, "digg": $fa-var-digg, "tencent-weibo": $fa-var-tencent-weibo, + "letterboxd": $fa-var-letterboxd, "symfony": $fa-var-symfony, "maxcdn": $fa-var-maxcdn, "etsy": $fa-var-etsy, @@ -4762,6 +4790,7 @@ $fa-brand-icons: ( "think-peaks": $fa-var-think-peaks, "bilibili": $fa-var-bilibili, "erlang": $fa-var-erlang, + "x-twitter": $fa-var-x-twitter, "cotton-bureau": $fa-var-cotton-bureau, "dashcube": $fa-var-dashcube, "42-group": $fa-var-42-group, @@ -4799,6 +4828,7 @@ $fa-brand-icons: ( "dropbox": $fa-var-dropbox, "instagram": $fa-var-instagram, "cmplid": $fa-var-cmplid, + "upwork": $fa-var-upwork, "facebook": $fa-var-facebook, "gripfire": $fa-var-gripfire, "jedi-order": $fa-var-jedi-order, @@ -4857,6 +4887,7 @@ $fa-brand-icons: ( "square-behance": $fa-var-square-behance, "behance-square": $fa-var-behance-square, "supple": $fa-var-supple, + "webflow": $fa-var-webflow, "rebel": $fa-var-rebel, "css3": $fa-var-css3, "staylinked": $fa-var-staylinked, @@ -4927,6 +4958,7 @@ $fa-brand-icons: ( "tumblr": $fa-var-tumblr, "vaadin": $fa-var-vaadin, "quora": $fa-var-quora, + "square-x-twitter": $fa-var-square-x-twitter, "reacteurope": $fa-var-reacteurope, "medium": $fa-var-medium, "medium-m": $fa-var-medium-m, diff --git a/theme/boost/scss/fontawesome/brands.scss b/theme/boost/scss/fontawesome/brands.scss index 438e4e00067a3..9677d5c23b954 100644 --- a/theme/boost/scss/fontawesome/brands.scss +++ b/theme/boost/scss/fontawesome/brands.scss @@ -1,5 +1,5 @@ /*! - * Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com + * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) * Copyright 2023 Fonticons, Inc. */ @@ -16,8 +16,7 @@ font-style: normal; font-weight: 400; font-display: $fa-font-display; - src: - url('[[font:core|fa-brands-400.woff2]]') format('woff2'), + src: url('[[font:core|fa-brands-400.woff2]]') format('woff2'), url('[[font:core|fa-brands-400.ttf]]') format('truetype'); } diff --git a/theme/boost/scss/fontawesome/fontawesome.scss b/theme/boost/scss/fontawesome/fontawesome.scss index ab4f133a7001f..61541e368d83d 100644 --- a/theme/boost/scss/fontawesome/fontawesome.scss +++ b/theme/boost/scss/fontawesome/fontawesome.scss @@ -1,5 +1,5 @@ /*! - * Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com + * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) * Copyright 2023 Fonticons, Inc. */ diff --git a/theme/boost/scss/fontawesome/regular.scss b/theme/boost/scss/fontawesome/regular.scss index 6b2fa234e9576..89e9338a33691 100644 --- a/theme/boost/scss/fontawesome/regular.scss +++ b/theme/boost/scss/fontawesome/regular.scss @@ -1,5 +1,5 @@ /*! - * Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com + * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) * Copyright 2023 Fonticons, Inc. */ @@ -16,8 +16,7 @@ font-style: normal; font-weight: 400; font-display: $fa-font-display; - src: - url('[[font:core|fa-regular-400.woff2]]') format('woff2'), + src: url('[[font:core|fa-regular-400.woff2]]') format('woff2'), url('[[font:core|fa-regular-400.ttf]]') format('truetype'); } diff --git a/theme/boost/scss/fontawesome/solid.scss b/theme/boost/scss/fontawesome/solid.scss index 2dfd72c2bbb40..6d623325c49fb 100644 --- a/theme/boost/scss/fontawesome/solid.scss +++ b/theme/boost/scss/fontawesome/solid.scss @@ -1,5 +1,5 @@ /*! - * Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com + * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) * Copyright 2023 Fonticons, Inc. */ @@ -16,8 +16,7 @@ font-style: normal; font-weight: 900; font-display: $fa-font-display; - src: - url('[[font:core|fa-solid-900.woff2]]') format('woff2'), + src: url('[[font:core|fa-solid-900.woff2]]') format('woff2'), url('[[font:core|fa-solid-900.ttf]]') format('truetype'); } diff --git a/theme/boost/scss/fontawesome/v4-shims.scss b/theme/boost/scss/fontawesome/v4-shims.scss index 7893e7cc06dcc..263b16ef70cad 100644 --- a/theme/boost/scss/fontawesome/v4-shims.scss +++ b/theme/boost/scss/fontawesome/v4-shims.scss @@ -1,5 +1,5 @@ /*! - * Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com + * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) * Copyright 2023 Fonticons, Inc. */ diff --git a/theme/boost/style/moodle.css b/theme/boost/style/moodle.css index 316487b30620f..b58936b54d85e 100644 --- a/theme/boost/style/moodle.css +++ b/theme/boost/style/moodle.css @@ -1,6 +1,6 @@ @charset "UTF-8"; /*! - * Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com + * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) * Copyright 2023 Fonticons, Inc. */ @@ -69,6 +69,10 @@ content: "\f7e0"; } +.fa-pixiv:before { + content: "\e640"; +} + .fa-wpexplorer:before { content: "\f2de"; } @@ -209,6 +213,10 @@ content: "\f38f"; } +.fa-brave:before { + content: "\e63c"; +} + .fa-sistrix:before { content: "\f3ee"; } @@ -241,6 +249,10 @@ content: "\f282"; } +.fa-threads:before { + content: "\e618"; +} + .fa-napster:before { content: "\f3d2"; } @@ -429,6 +441,10 @@ content: "\f384"; } +.fa-opensuse:before { + content: "\e62b"; +} + .fa-pied-piper-alt:before { content: "\f1a8"; } @@ -465,6 +481,10 @@ content: "\f28a"; } +.fa-debian:before { + content: "\e60b"; +} + .fa-openid:before { content: "\f19b"; } @@ -617,6 +637,10 @@ content: "\f294"; } +.fa-square-letterboxd:before { + content: "\e62e"; +} + .fa-sticker-mule:before { content: "\f3f7"; } @@ -661,6 +685,10 @@ content: "\f78d"; } +.fa-shoelace:before { + content: "\e60c"; +} + .fa-mdb:before { content: "\f8ca"; } @@ -785,6 +813,10 @@ content: "\f612"; } +.fa-square-threads:before { + content: "\e619"; +} + .fa-hackerrank:before { content: "\f5f7"; } @@ -821,6 +853,10 @@ content: "\f299"; } +.fa-google-scholar:before { + content: "\e63b"; +} + .fa-square-gitlab:before { content: "\e5ae"; } @@ -997,6 +1033,10 @@ content: "\f1ca"; } +.fa-signal-messenger:before { + content: "\e663"; +} + .fa-paypal:before { content: "\f1ed"; } @@ -1041,6 +1081,10 @@ content: "\e531"; } +.fa-mintbit:before { + content: "\e62f"; +} + .fa-ethereum:before { content: "\f42e"; } @@ -1073,6 +1117,10 @@ content: "\f378"; } +.fa-brave-reverse:before { + content: "\e63d"; +} + .fa-facebook-f:before { content: "\f39e"; } @@ -1209,6 +1257,10 @@ content: "\f1d5"; } +.fa-letterboxd:before { + content: "\e62d"; +} + .fa-symfony:before { content: "\f83d"; } @@ -1241,6 +1293,10 @@ content: "\f39d"; } +.fa-x-twitter:before { + content: "\e61b"; +} + .fa-cotton-bureau:before { content: "\f89e"; } @@ -1389,6 +1445,10 @@ content: "\e360"; } +.fa-upwork:before { + content: "\e641"; +} + .fa-facebook:before { content: "\f09a"; } @@ -1621,6 +1681,10 @@ content: "\f3f9"; } +.fa-webflow:before { + content: "\e65c"; +} + .fa-rebel:before { content: "\f1d0"; } @@ -1901,6 +1965,10 @@ content: "\f2c4"; } +.fa-square-x-twitter:before { + content: "\e61a"; +} + .fa-reacteurope:before { content: "\f75d"; } @@ -2026,7 +2094,7 @@ } /*! - * Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com + * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) * Copyright 2023 Fonticons, Inc. */ @@ -2049,7 +2117,7 @@ } /*! - * Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com + * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) * Copyright 2023 Fonticons, Inc. */ @@ -2095,7 +2163,7 @@ } /*! - * Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com + * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) * Copyright 2023 Fonticons, Inc. */ @@ -4914,7 +4982,7 @@ } /*! - * Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com + * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) * Copyright 2023 Fonticons, Inc. */ @@ -12662,10 +12730,6 @@ readers do not read off random characters that represent icons */ content: "\f064"; } -.fa-arrow-turn-right::before { - content: "\f064"; -} - .fa-mail-forward::before { content: "\f064"; } diff --git a/theme/boost/thirdpartylibs.xml b/theme/boost/thirdpartylibs.xml index a6c09cecf7864..6576f9cd947e5 100644 --- a/theme/boost/thirdpartylibs.xml +++ b/theme/boost/thirdpartylibs.xml @@ -199,7 +199,7 @@ scss/fontawesome Font Awesome - http://fontawesome.com Font Awesome CSS, LESS, and Sass files. Font Awesome is the Internet's icon library and toolkit, used by millions of designers, developers, and content creators. - 6.4.0 + 6.5.1 (MIT) https://github.com/FortAwesome/Font-Awesome diff --git a/theme/classic/style/moodle.css b/theme/classic/style/moodle.css index d28086a753b9b..a56e7d9e2358a 100644 --- a/theme/classic/style/moodle.css +++ b/theme/classic/style/moodle.css @@ -1,6 +1,6 @@ @charset "UTF-8"; /*! - * Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com + * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) * Copyright 2023 Fonticons, Inc. */ @@ -69,6 +69,10 @@ content: "\f7e0"; } +.fa-pixiv:before { + content: "\e640"; +} + .fa-wpexplorer:before { content: "\f2de"; } @@ -209,6 +213,10 @@ content: "\f38f"; } +.fa-brave:before { + content: "\e63c"; +} + .fa-sistrix:before { content: "\f3ee"; } @@ -241,6 +249,10 @@ content: "\f282"; } +.fa-threads:before { + content: "\e618"; +} + .fa-napster:before { content: "\f3d2"; } @@ -429,6 +441,10 @@ content: "\f384"; } +.fa-opensuse:before { + content: "\e62b"; +} + .fa-pied-piper-alt:before { content: "\f1a8"; } @@ -465,6 +481,10 @@ content: "\f28a"; } +.fa-debian:before { + content: "\e60b"; +} + .fa-openid:before { content: "\f19b"; } @@ -617,6 +637,10 @@ content: "\f294"; } +.fa-square-letterboxd:before { + content: "\e62e"; +} + .fa-sticker-mule:before { content: "\f3f7"; } @@ -661,6 +685,10 @@ content: "\f78d"; } +.fa-shoelace:before { + content: "\e60c"; +} + .fa-mdb:before { content: "\f8ca"; } @@ -785,6 +813,10 @@ content: "\f612"; } +.fa-square-threads:before { + content: "\e619"; +} + .fa-hackerrank:before { content: "\f5f7"; } @@ -821,6 +853,10 @@ content: "\f299"; } +.fa-google-scholar:before { + content: "\e63b"; +} + .fa-square-gitlab:before { content: "\e5ae"; } @@ -997,6 +1033,10 @@ content: "\f1ca"; } +.fa-signal-messenger:before { + content: "\e663"; +} + .fa-paypal:before { content: "\f1ed"; } @@ -1041,6 +1081,10 @@ content: "\e531"; } +.fa-mintbit:before { + content: "\e62f"; +} + .fa-ethereum:before { content: "\f42e"; } @@ -1073,6 +1117,10 @@ content: "\f378"; } +.fa-brave-reverse:before { + content: "\e63d"; +} + .fa-facebook-f:before { content: "\f39e"; } @@ -1209,6 +1257,10 @@ content: "\f1d5"; } +.fa-letterboxd:before { + content: "\e62d"; +} + .fa-symfony:before { content: "\f83d"; } @@ -1241,6 +1293,10 @@ content: "\f39d"; } +.fa-x-twitter:before { + content: "\e61b"; +} + .fa-cotton-bureau:before { content: "\f89e"; } @@ -1389,6 +1445,10 @@ content: "\e360"; } +.fa-upwork:before { + content: "\e641"; +} + .fa-facebook:before { content: "\f09a"; } @@ -1621,6 +1681,10 @@ content: "\f3f9"; } +.fa-webflow:before { + content: "\e65c"; +} + .fa-rebel:before { content: "\f1d0"; } @@ -1901,6 +1965,10 @@ content: "\f2c4"; } +.fa-square-x-twitter:before { + content: "\e61a"; +} + .fa-reacteurope:before { content: "\f75d"; } @@ -2026,7 +2094,7 @@ } /*! - * Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com + * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) * Copyright 2023 Fonticons, Inc. */ @@ -2049,7 +2117,7 @@ } /*! - * Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com + * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) * Copyright 2023 Fonticons, Inc. */ @@ -2095,7 +2163,7 @@ } /*! - * Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com + * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) * Copyright 2023 Fonticons, Inc. */ @@ -4914,7 +4982,7 @@ } /*! - * Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com + * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) * Copyright 2023 Fonticons, Inc. */ @@ -12662,10 +12730,6 @@ readers do not read off random characters that represent icons */ content: "\f064"; } -.fa-arrow-turn-right::before { - content: "\f064"; -} - .fa-mail-forward::before { content: "\f064"; } From 7e7da9f8943810acb5de5cb18a4090b68bbcc8f0 Mon Sep 17 00:00:00 2001 From: Paul Holden Date: Fri, 5 Jan 2024 16:51:12 +0000 Subject: [PATCH 07/51] MDL-79913 grade: respect messaging config for user heading buttons. --- grade/lib.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/grade/lib.php b/grade/lib.php index 8878dbd3dd76f..81f77e8eca620 100644 --- a/grade/lib.php +++ b/grade/lib.php @@ -985,7 +985,8 @@ function print_grade_page_head(int $courseid, string $active_type, ?string $acti $renderer = $PAGE->get_renderer('core_grades'); // If the user is viewing their own grade report, no need to show the "Message" // and "Add to contact" buttons in the user heading. - $showuserbuttons = $user->id != $USER->id; + $showuserbuttons = $user->id != $USER->id && !empty($CFG->messaging) && + has_capability('moodle/site:sendmessage', $PAGE->context); $output = $renderer->user_heading($user, $courseid, $showuserbuttons); } else if (!empty($heading)) { $output = $OUTPUT->heading($heading); From 42edaba56f11b2fbe8b90747b303ba6199a091c7 Mon Sep 17 00:00:00 2001 From: Sara Arjona Date: Mon, 26 Feb 2024 17:47:31 +0100 Subject: [PATCH 08/51] MDL-80949 mod_data: Remove unused Allow autolink param for text field --- mod/data/db/upgrade.php | 12 ++++++++++++ mod/data/field/text/mod.html | 4 ---- mod/data/lang/en/data.php | 4 +++- mod/data/lang/en/deprecated.txt | 1 + mod/data/tests/generator/lib.php | 2 +- mod/data/version.php | 2 +- 6 files changed, 18 insertions(+), 7 deletions(-) diff --git a/mod/data/db/upgrade.php b/mod/data/db/upgrade.php index efa615abe6ca5..32718e31e2e9d 100644 --- a/mod/data/db/upgrade.php +++ b/mod/data/db/upgrade.php @@ -67,5 +67,17 @@ function xmldb_data_upgrade($oldversion) { // Automatically generated Moodle v4.3.0 release upgrade line. // Put any upgrade step following this. + if ($oldversion < 2023100901) { + // Clean param1 for "text" fields because it was unused. + $DB->execute( + "UPDATE {data_fields} + SET param1 = '' + WHERE type = 'text'" + ); + + // Data savepoint reached. + upgrade_mod_savepoint(true, 2023100901, 'data'); + } + return true; } diff --git a/mod/data/field/text/mod.html b/mod/data/field/text/mod.html index 597e7639a0979..10962da8df2cd 100644 --- a/mod/data/field/text/mod.html +++ b/mod/data/field/text/mod.html @@ -11,8 +11,4 @@ field->required?"checked=\"checked\"":""); ?>/> - - - field->param1) {echo 'checked="checked"';} ?> value="1" /> - diff --git a/mod/data/lang/en/data.php b/mod/data/lang/en/data.php index 70205abf1bb8f..caeee04f10cf9 100644 --- a/mod/data/lang/en/data.php +++ b/mod/data/lang/en/data.php @@ -170,7 +170,6 @@ $string['exportpreset'] = 'Export preset'; $string['failedpresetdelete'] = 'An error was encountered while trying to delete the preset.'; $string['fieldadded'] = 'Field added'; -$string['fieldallowautolink'] = 'Allow autolink'; $string['fielddeleted'] = 'Field deleted'; $string['fielddelimiter'] = 'Field separator'; $string['fielddescription'] = 'Field description'; @@ -489,3 +488,6 @@ // Deprecated since Moodle 4.3. $string['completionentries'] = 'Require entries'; + +// Deprecated since Moodle 4.4. +$string['fieldallowautolink'] = 'Allow autolink'; diff --git a/mod/data/lang/en/deprecated.txt b/mod/data/lang/en/deprecated.txt index 2e5d4e50bc238..0c52e751bba25 100644 --- a/mod/data/lang/en/deprecated.txt +++ b/mod/data/lang/en/deprecated.txt @@ -9,3 +9,4 @@ addentries,mod_data todatabase,mod_data fieldids,mod_data completionentries,mod_data +fieldallowautolink,mod_data diff --git a/mod/data/tests/generator/lib.php b/mod/data/tests/generator/lib.php index 559f0f0b78082..eec22b7e01714 100644 --- a/mod/data/tests/generator/lib.php +++ b/mod/data/tests/generator/lib.php @@ -134,7 +134,7 @@ public function create_field(stdClass $record = null, $data = null) { $record['param1'] = implode("\n", array('menu1', 'menu2', 'menu3', 'menu4')); } else if ($record['type'] == 'multimenu') { $record['param1'] = implode("\n", array('multimenu1', 'multimenu2', 'multimenu3', 'multimenu4')); - } else if (($record['type'] === 'text') || ($record['type'] === 'url')) { + } else if ($record['type'] === 'url') { $record['param1'] = 1; } else if ($record['type'] == 'latlong') { $record['param1'] = 'Google Maps'; diff --git a/mod/data/version.php b/mod/data/version.php index 4ba8f64acf7b1..bc43b2baee131 100644 --- a/mod/data/version.php +++ b/mod/data/version.php @@ -24,7 +24,7 @@ defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2023100900; // The current module version (Date: YYYYMMDDXX). +$plugin->version = 2023100901; // The current module version (Date: YYYYMMDDXX). $plugin->requires = 2023100400; // Requires this Moodle version. $plugin->component = 'mod_data'; // Full name of the plugin (used for diagnostics) $plugin->cron = 0; From f419983b32434fd9b29cd427d7b78a9b0ce856d9 Mon Sep 17 00:00:00 2001 From: Mark Johnson Date: Wed, 24 Jan 2024 14:39:32 +0000 Subject: [PATCH 09/51] MDL-79007 calendar: Make screen readers read out calendar day popovers --- .../block_calendar_month_dashboard.feature | 6 +-- calendar/amd/build/popover.min.js | 2 +- calendar/amd/build/popover.min.js.map | 2 +- calendar/amd/build/selectors.min.js | 2 +- calendar/amd/build/selectors.min.js.map | 2 +- calendar/amd/src/popover.js | 22 +++++----- calendar/amd/src/selectors.js | 1 + calendar/tests/behat/behat_calendar.php | 44 ++++++++++++++----- calendar/tests/behat/calendar.feature | 2 +- 9 files changed, 54 insertions(+), 29 deletions(-) diff --git a/blocks/calendar_month/tests/behat/block_calendar_month_dashboard.feature b/blocks/calendar_month/tests/behat/block_calendar_month_dashboard.feature index 92e76a04cbf31..5ce66709b7cb7 100644 --- a/blocks/calendar_month/tests/behat/block_calendar_month_dashboard.feature +++ b/blocks/calendar_month/tests/behat/block_calendar_month_dashboard.feature @@ -10,8 +10,8 @@ Feature: View a site event on the dashboard | student1 | Student | 1 | student1@example.com | S1 | And I log in as "admin" And I create a calendar event with form data: - | id_eventtype | Site | - | id_name | Site Event | + | id_eventtype | Site | + | id_name | Site Event | And I log out @javascript @@ -29,5 +29,5 @@ Feature: View a site event on the dashboard # We need to give the browser a couple seconds to re-render the page after the screen has been resized. And I wait "1" seconds And I should not see "Site Event" - And I hover over today in the mini-calendar block + When I hover over today in the mini-calendar block responsive view And I should see "Site Event" diff --git a/calendar/amd/build/popover.min.js b/calendar/amd/build/popover.min.js index e66571e8fbe11..e7c42111597d4 100644 --- a/calendar/amd/build/popover.min.js +++ b/calendar/amd/build/popover.min.js @@ -6,6 +6,6 @@ define("core_calendar/popover",["theme_boost/popover","jquery","core_calendar/se * @copyright 2021 Huong Nguyen * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @since 4.0 - */function _getRequireWildcardCache(nodeInterop){if("function"!=typeof WeakMap)return null;var cacheBabelInterop=new WeakMap,cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}_jquery=(obj=_jquery)&&obj.__esModule?obj:{default:obj},CalendarSelectors=function(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj))return cache.get(obj);var newObj={},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}newObj.default=obj,cache&&cache.set(obj,newObj);return newObj}(CalendarSelectors);const isPopoverConfigured=new Map,showPopover=target=>{if(!isPopoverConfigured.has(target)){const dateEle=(0,_jquery.default)(target);dateEle.popover({trigger:"manual",placement:"top",html:!0,content:()=>{const source=dateEle.find(CalendarSelectors.elements.dateContent),content=(0,_jquery.default)("

");if(source.length){const temptContent=source.find(".hidden").clone(!1);content.html(temptContent.html())}return content.html()}}),isPopoverConfigured.set(target,!0)}var dateContainer;dateContainer=target,"none"===window.getComputedStyle(dateContainer.querySelector(CalendarSelectors.elements.dateContent)).display&&((0,_jquery.default)(target).popover("show"),target.addEventListener("mouseleave",hidePopover),target.addEventListener("focusout",hidePopover))},hidePopover=e=>{const target=e.target,dateContainer=e.target.closest(CalendarSelectors.elements.dateContainer);if(dateContainer&&isPopoverConfigured.has(dateContainer)){const isTargetActive=target.contains(document.activeElement),isTargetHover=target.matches(":hover");isTargetActive||isTargetHover||((0,_jquery.default)(dateContainer).popover("hide"),dateContainer.removeEventListener("mouseleave",hidePopover),dateContainer.removeEventListener("focusout",hidePopover))}};let listenersRegistered=!1;listenersRegistered||((()=>{const showPopoverHandler=e=>{const dateContainer=e.target.closest(CalendarSelectors.elements.dateContainer);dateContainer&&(e.preventDefault(),showPopover(dateContainer))};document.addEventListener("mouseover",showPopoverHandler),document.addEventListener("focusin",showPopoverHandler)})(),listenersRegistered=!0)})); + */function _getRequireWildcardCache(nodeInterop){if("function"!=typeof WeakMap)return null;var cacheBabelInterop=new WeakMap,cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}_jquery=(obj=_jquery)&&obj.__esModule?obj:{default:obj},CalendarSelectors=function(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj))return cache.get(obj);var newObj={},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}newObj.default=obj,cache&&cache.set(obj,newObj);return newObj}(CalendarSelectors);const isPopoverConfigured=new Map,showPopover=target=>{const dateContainer=target.closest(CalendarSelectors.elements.dateContainer);if(!isPopoverConfigured.has(dateContainer)){(0,_jquery.default)(target).popover({trigger:"manual",placement:"top",html:!0,title:dateContainer.dataset.title,content:()=>{const source=(0,_jquery.default)(dateContainer).find(CalendarSelectors.elements.dateContent),content=(0,_jquery.default)("
");if(source.length){const temptContent=source.find(".hidden").clone(!1);content.html(temptContent.html())}return content.html()}}),isPopoverConfigured.set(dateContainer,!0)}(dateContainer=>"none"===window.getComputedStyle(dateContainer.querySelector(CalendarSelectors.elements.dateContent)).display)(dateContainer)&&((0,_jquery.default)(target).popover("show"),target.addEventListener("mouseleave",hidePopover),target.addEventListener("focusout",hidePopover))},hidePopover=e=>{const target=e.target,dateContainer=e.target.closest(CalendarSelectors.elements.dateContainer);if(dateContainer&&isPopoverConfigured.has(dateContainer)){const isTargetActive=target.contains(document.activeElement),isTargetHover=target.matches(":hover");isTargetActive||isTargetHover||((0,_jquery.default)(target).popover("hide"),target.removeEventListener("mouseleave",hidePopover),target.removeEventListener("focusout",hidePopover))}};let listenersRegistered=!1;listenersRegistered||((()=>{const showPopoverHandler=e=>{const dayLink=e.target.closest(CalendarSelectors.links.dayLink);dayLink&&(e.preventDefault(),showPopover(dayLink))};document.addEventListener("mouseover",showPopoverHandler),document.addEventListener("focusin",showPopoverHandler)})(),listenersRegistered=!0)})); //# sourceMappingURL=popover.min.js.map \ No newline at end of file diff --git a/calendar/amd/build/popover.min.js.map b/calendar/amd/build/popover.min.js.map index 0eea6d290760b..abf6259884424 100644 --- a/calendar/amd/build/popover.min.js.map +++ b/calendar/amd/build/popover.min.js.map @@ -1 +1 @@ -{"version":3,"file":"popover.min.js","sources":["../src/popover.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Javascript popover for the `core_calendar` subsystem.\n *\n * @module core_calendar/popover\n * @copyright 2021 Huong Nguyen \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 4.0\n */\n\nimport 'theme_boost/popover';\nimport jQuery from 'jquery';\nimport * as CalendarSelectors from 'core_calendar/selectors';\n\n/**\n * Check if we are allowing to enable the popover or not.\n * @param {Element} dateContainer\n * @returns {boolean}\n */\nconst isPopoverAvailable = (dateContainer) => {\n return window.getComputedStyle(dateContainer.querySelector(CalendarSelectors.elements.dateContent)).display === 'none';\n};\n\nconst isPopoverConfigured = new Map();\n\nconst showPopover = target => {\n if (!isPopoverConfigured.has(target)) {\n const dateEle = jQuery(target);\n dateEle.popover({\n trigger: 'manual',\n placement: 'top',\n html: true,\n content: () => {\n const source = dateEle.find(CalendarSelectors.elements.dateContent);\n const content = jQuery('
');\n if (source.length) {\n const temptContent = source.find('.hidden').clone(false);\n content.html(temptContent.html());\n }\n return content.html();\n }\n });\n\n isPopoverConfigured.set(target, true);\n }\n\n if (isPopoverAvailable(target)) {\n jQuery(target).popover('show');\n target.addEventListener('mouseleave', hidePopover);\n target.addEventListener('focusout', hidePopover);\n }\n};\n\nconst hidePopover = e => {\n const target = e.target;\n const dateContainer = e.target.closest(CalendarSelectors.elements.dateContainer);\n if (!dateContainer) {\n return;\n }\n if (isPopoverConfigured.has(dateContainer)) {\n const isTargetActive = target.contains(document.activeElement);\n const isTargetHover = target.matches(':hover');\n if (!isTargetActive && !isTargetHover) {\n jQuery(dateContainer).popover('hide');\n dateContainer.removeEventListener('mouseleave', hidePopover);\n dateContainer.removeEventListener('focusout', hidePopover);\n }\n }\n};\n\n/**\n * Register events for date container.\n */\nconst registerEventListeners = () => {\n const showPopoverHandler = (e) => {\n const dateContainer = e.target.closest(CalendarSelectors.elements.dateContainer);\n if (!dateContainer) {\n return;\n }\n\n e.preventDefault();\n showPopover(dateContainer);\n };\n\n document.addEventListener('mouseover', showPopoverHandler);\n document.addEventListener('focusin', showPopoverHandler);\n};\n\nlet listenersRegistered = false;\nif (!listenersRegistered) {\n registerEventListeners();\n listenersRegistered = true;\n}\n"],"names":["isPopoverConfigured","Map","showPopover","target","has","dateEle","popover","trigger","placement","html","content","source","find","CalendarSelectors","elements","dateContent","length","temptContent","clone","set","dateContainer","window","getComputedStyle","querySelector","display","addEventListener","hidePopover","e","closest","isTargetActive","contains","document","activeElement","isTargetHover","matches","removeEventListener","listenersRegistered","showPopoverHandler","preventDefault","registerEventListeners"],"mappings":";;;;;;;;wgCAqCMA,oBAAsB,IAAIC,IAE1BC,YAAcC,aACXH,oBAAoBI,IAAID,QAAS,OAC5BE,SAAU,mBAAOF,QACvBE,QAAQC,QAAQ,CACZC,QAAS,SACTC,UAAW,MACXC,MAAM,EACNC,QAAS,WACCC,OAASN,QAAQO,KAAKC,kBAAkBC,SAASC,aACjDL,SAAU,mBAAO,YACnBC,OAAOK,OAAQ,OACTC,aAAeN,OAAOC,KAAK,WAAWM,OAAM,GAClDR,QAAQD,KAAKQ,aAAaR,eAEvBC,QAAQD,UAIvBT,oBAAoBmB,IAAIhB,QAAQ,GAxBZiB,IAAAA,cAAAA,cA2BDjB,OA1ByF,SAAzGkB,OAAOC,iBAAiBF,cAAcG,cAAcV,kBAAkBC,SAASC,cAAcS,8BA2BzFrB,QAAQG,QAAQ,QACvBH,OAAOsB,iBAAiB,aAAcC,aACtCvB,OAAOsB,iBAAiB,WAAYC,eAItCA,YAAcC,UACVxB,OAASwB,EAAExB,OACXiB,cAAgBO,EAAExB,OAAOyB,QAAQf,kBAAkBC,SAASM,kBAC7DA,eAGDpB,oBAAoBI,IAAIgB,eAAgB,OAClCS,eAAiB1B,OAAO2B,SAASC,SAASC,eAC1CC,cAAgB9B,OAAO+B,QAAQ,UAChCL,gBAAmBI,oCACbb,eAAed,QAAQ,QAC9Bc,cAAce,oBAAoB,aAAcT,aAChDN,cAAce,oBAAoB,WAAYT,oBAuBtDU,qBAAsB,EACrBA,sBAhB0B,YACrBC,mBAAsBV,UAClBP,cAAgBO,EAAExB,OAAOyB,QAAQf,kBAAkBC,SAASM,eAC7DA,gBAILO,EAAEW,iBACFpC,YAAYkB,iBAGhBW,SAASN,iBAAiB,YAAaY,oBACvCN,SAASN,iBAAiB,UAAWY,qBAKrCE,GACAH,qBAAsB"} \ No newline at end of file +{"version":3,"file":"popover.min.js","sources":["../src/popover.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Javascript popover for the `core_calendar` subsystem.\n *\n * @module core_calendar/popover\n * @copyright 2021 Huong Nguyen \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 4.0\n */\n\nimport 'theme_boost/popover';\nimport jQuery from 'jquery';\nimport * as CalendarSelectors from 'core_calendar/selectors';\n\n/**\n * Check if we are allowing to enable the popover or not.\n * @param {Element} dateContainer\n * @returns {boolean}\n */\nconst isPopoverAvailable = (dateContainer) => {\n return window.getComputedStyle(dateContainer.querySelector(CalendarSelectors.elements.dateContent)).display === 'none';\n};\n\nconst isPopoverConfigured = new Map();\n\nconst showPopover = target => {\n const dateContainer = target.closest(CalendarSelectors.elements.dateContainer);\n if (!isPopoverConfigured.has(dateContainer)) {\n const dateEle = jQuery(target);\n dateEle.popover({\n trigger: 'manual',\n placement: 'top',\n html: true,\n title: dateContainer.dataset.title,\n content: () => {\n const source = jQuery(dateContainer).find(CalendarSelectors.elements.dateContent);\n const content = jQuery('
');\n if (source.length) {\n const temptContent = source.find('.hidden').clone(false);\n content.html(temptContent.html());\n }\n return content.html();\n }\n });\n\n isPopoverConfigured.set(dateContainer, true);\n }\n\n if (isPopoverAvailable(dateContainer)) {\n jQuery(target).popover('show');\n target.addEventListener('mouseleave', hidePopover);\n target.addEventListener('focusout', hidePopover);\n }\n};\n\nconst hidePopover = e => {\n const target = e.target;\n const dateContainer = e.target.closest(CalendarSelectors.elements.dateContainer);\n if (!dateContainer) {\n return;\n }\n if (isPopoverConfigured.has(dateContainer)) {\n const isTargetActive = target.contains(document.activeElement);\n const isTargetHover = target.matches(':hover');\n if (!isTargetActive && !isTargetHover) {\n jQuery(target).popover('hide');\n target.removeEventListener('mouseleave', hidePopover);\n target.removeEventListener('focusout', hidePopover);\n }\n }\n};\n\n/**\n * Register events for date container.\n */\nconst registerEventListeners = () => {\n const showPopoverHandler = (e) => {\n const dayLink = e.target.closest(CalendarSelectors.links.dayLink);\n if (!dayLink) {\n return;\n }\n\n e.preventDefault();\n showPopover(dayLink);\n };\n\n document.addEventListener('mouseover', showPopoverHandler);\n document.addEventListener('focusin', showPopoverHandler);\n};\n\nlet listenersRegistered = false;\nif (!listenersRegistered) {\n registerEventListeners();\n listenersRegistered = true;\n}\n"],"names":["isPopoverConfigured","Map","showPopover","target","dateContainer","closest","CalendarSelectors","elements","has","popover","trigger","placement","html","title","dataset","content","source","find","dateContent","length","temptContent","clone","set","window","getComputedStyle","querySelector","display","isPopoverAvailable","addEventListener","hidePopover","e","isTargetActive","contains","document","activeElement","isTargetHover","matches","removeEventListener","listenersRegistered","showPopoverHandler","dayLink","links","preventDefault","registerEventListeners"],"mappings":";;;;;;;;wgCAqCMA,oBAAsB,IAAIC,IAE1BC,YAAcC,eACVC,cAAgBD,OAAOE,QAAQC,kBAAkBC,SAASH,mBAC3DJ,oBAAoBQ,IAAIJ,eAAgB,EACzB,mBAAOD,QACfM,QAAQ,CACZC,QAAS,SACTC,UAAW,MACXC,MAAM,EACNC,MAAOT,cAAcU,QAAQD,MAC7BE,QAAS,WACCC,QAAS,mBAAOZ,eAAea,KAAKX,kBAAkBC,SAASW,aAC/DH,SAAU,mBAAO,YACnBC,OAAOG,OAAQ,OACTC,aAAeJ,OAAOC,KAAK,WAAWI,OAAM,GAClDN,QAAQH,KAAKQ,aAAaR,eAEvBG,QAAQH,UAIvBZ,oBAAoBsB,IAAIlB,eAAe,GA1BnBA,CAAAA,eACwF,SAAzGmB,OAAOC,iBAAiBpB,cAAcqB,cAAcnB,kBAAkBC,SAASW,cAAcQ,QA4BhGC,CAAmBvB,qCACZD,QAAQM,QAAQ,QACvBN,OAAOyB,iBAAiB,aAAcC,aACtC1B,OAAOyB,iBAAiB,WAAYC,eAItCA,YAAcC,UACV3B,OAAS2B,EAAE3B,OACXC,cAAgB0B,EAAE3B,OAAOE,QAAQC,kBAAkBC,SAASH,kBAC7DA,eAGDJ,oBAAoBQ,IAAIJ,eAAgB,OAClC2B,eAAiB5B,OAAO6B,SAASC,SAASC,eAC1CC,cAAgBhC,OAAOiC,QAAQ,UAChCL,gBAAmBI,oCACbhC,QAAQM,QAAQ,QACvBN,OAAOkC,oBAAoB,aAAcR,aACzC1B,OAAOkC,oBAAoB,WAAYR,oBAuB/CS,qBAAsB,EACrBA,sBAhB0B,YACrBC,mBAAsBT,UAClBU,QAAUV,EAAE3B,OAAOE,QAAQC,kBAAkBmC,MAAMD,SACpDA,UAILV,EAAEY,iBACFxC,YAAYsC,WAGhBP,SAASL,iBAAiB,YAAaW,oBACvCN,SAASL,iBAAiB,UAAWW,qBAKrCI,GACAL,qBAAsB"} \ No newline at end of file diff --git a/calendar/amd/build/selectors.min.js b/calendar/amd/build/selectors.min.js index 97d9acf6f812d..964f965fbdfec 100644 --- a/calendar/amd/build/selectors.min.js +++ b/calendar/amd/build/selectors.min.js @@ -5,6 +5,6 @@ * @copyright 2017 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -define("core_calendar/selectors",[],(function(){return{eventFilterItem:"[data-action='filter-event-type']",eventType:{site:"[data-eventtype-site]",category:"[data-eventtype-category]",course:"[data-eventtype-course]",group:"[data-eventtype-group]",user:"[data-eventtype-user]",other:"[data-eventtype-other]"},popoverType:{site:"[data-popover-eventtype-site]",category:"[data-popover-eventtype-category]",course:"[data-popover-eventtype-course]",group:"[data-popover-eventtype-group]",user:"[data-popover-eventtype-user]",other:"[data-popover-eventtype-other]"},calendarPeriods:{month:"[data-period='month']"},courseSelector:'select[name="course"]',viewSelector:'div[data-region="view-selector"]',actions:{create:'[data-action="new-event-button"]',edit:'[data-action="edit"]',remove:'[data-action="delete"]',viewEvent:'[data-action="view-event"]',deleteSubscription:'[data-action="delete-subscription"]'},elements:{courseSelector:'select[name="course"]',dateContainer:".clickable.hasevent",dateContent:'[data-region="day-content"]',monthDetailed:".calendarmonth.calendartable"},today:".today",day:'[data-region="day"]',calendarMain:'[data-region="calendar"]',wrapper:".calendarwrapper",eventItem:'[data-type="event"]',links:{navLink:".calendarwrapper .arrow_link",eventLink:"[data-region='event-item']",miniDayLink:"[data-region='mini-day-link']"},containers:{loadingIcon:'[data-region="overlay-icon-container"]'},mainCalendar:".maincalendar .heightcontainer",fullCalendarView:"page-calendar-view",pageHeaderHeadings:".page-header-headings h1"}})); +define("core_calendar/selectors",[],(function(){return{eventFilterItem:"[data-action='filter-event-type']",eventType:{site:"[data-eventtype-site]",category:"[data-eventtype-category]",course:"[data-eventtype-course]",group:"[data-eventtype-group]",user:"[data-eventtype-user]",other:"[data-eventtype-other]"},popoverType:{site:"[data-popover-eventtype-site]",category:"[data-popover-eventtype-category]",course:"[data-popover-eventtype-course]",group:"[data-popover-eventtype-group]",user:"[data-popover-eventtype-user]",other:"[data-popover-eventtype-other]"},calendarPeriods:{month:"[data-period='month']"},courseSelector:'select[name="course"]',viewSelector:'div[data-region="view-selector"]',actions:{create:'[data-action="new-event-button"]',edit:'[data-action="edit"]',remove:'[data-action="delete"]',viewEvent:'[data-action="view-event"]',deleteSubscription:'[data-action="delete-subscription"]'},elements:{courseSelector:'select[name="course"]',dateContainer:".clickable.hasevent",dateContent:'[data-region="day-content"]',monthDetailed:".calendarmonth.calendartable"},today:".today",day:'[data-region="day"]',calendarMain:'[data-region="calendar"]',wrapper:".calendarwrapper",eventItem:'[data-type="event"]',links:{navLink:".calendarwrapper .arrow_link",eventLink:"[data-region='event-item']",miniDayLink:"[data-region='mini-day-link']",dayLink:"[data-action='view-day-link']"},containers:{loadingIcon:'[data-region="overlay-icon-container"]'},mainCalendar:".maincalendar .heightcontainer",fullCalendarView:"page-calendar-view",pageHeaderHeadings:".page-header-headings h1"}})); //# sourceMappingURL=selectors.min.js.map \ No newline at end of file diff --git a/calendar/amd/build/selectors.min.js.map b/calendar/amd/build/selectors.min.js.map index b5cff793d81bf..13f7e11819296 100644 --- a/calendar/amd/build/selectors.min.js.map +++ b/calendar/amd/build/selectors.min.js.map @@ -1 +1 @@ -{"version":3,"file":"selectors.min.js","sources":["../src/selectors.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * CSS selectors for the calendar.\n *\n * @module core_calendar/selectors\n * @copyright 2017 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([], function() {\n return {\n eventFilterItem: \"[data-action='filter-event-type']\",\n eventType: {\n site: \"[data-eventtype-site]\",\n category: \"[data-eventtype-category]\",\n course: \"[data-eventtype-course]\",\n group: \"[data-eventtype-group]\",\n user: \"[data-eventtype-user]\",\n other: \"[data-eventtype-other]\",\n },\n popoverType: {\n site: \"[data-popover-eventtype-site]\",\n category: \"[data-popover-eventtype-category]\",\n course: \"[data-popover-eventtype-course]\",\n group: \"[data-popover-eventtype-group]\",\n user: \"[data-popover-eventtype-user]\",\n other: \"[data-popover-eventtype-other]\",\n },\n calendarPeriods: {\n month: \"[data-period='month']\",\n },\n courseSelector: 'select[name=\"course\"]',\n viewSelector: 'div[data-region=\"view-selector\"]',\n actions: {\n create: '[data-action=\"new-event-button\"]',\n edit: '[data-action=\"edit\"]',\n remove: '[data-action=\"delete\"]',\n viewEvent: '[data-action=\"view-event\"]',\n deleteSubscription: '[data-action=\"delete-subscription\"]',\n },\n elements: {\n courseSelector: 'select[name=\"course\"]',\n dateContainer: '.clickable.hasevent',\n dateContent: '[data-region=\"day-content\"]',\n monthDetailed: '.calendarmonth.calendartable',\n },\n today: '.today',\n day: '[data-region=\"day\"]',\n calendarMain: '[data-region=\"calendar\"]',\n wrapper: '.calendarwrapper',\n eventItem: '[data-type=\"event\"]',\n links: {\n navLink: '.calendarwrapper .arrow_link',\n eventLink: \"[data-region='event-item']\",\n miniDayLink: \"[data-region='mini-day-link']\",\n },\n containers: {\n loadingIcon: '[data-region=\"overlay-icon-container\"]',\n },\n mainCalendar: '.maincalendar .heightcontainer',\n fullCalendarView: 'page-calendar-view',\n pageHeaderHeadings: '.page-header-headings h1',\n };\n});\n"],"names":["define","eventFilterItem","eventType","site","category","course","group","user","other","popoverType","calendarPeriods","month","courseSelector","viewSelector","actions","create","edit","remove","viewEvent","deleteSubscription","elements","dateContainer","dateContent","monthDetailed","today","day","calendarMain","wrapper","eventItem","links","navLink","eventLink","miniDayLink","containers","loadingIcon","mainCalendar","fullCalendarView","pageHeaderHeadings"],"mappings":";;;;;;;AAsBAA,iCAAO,IAAI,iBACA,CACHC,gBAAiB,oCACjBC,UAAW,CACPC,KAAM,wBACNC,SAAU,4BACVC,OAAQ,0BACRC,MAAO,yBACPC,KAAM,wBACNC,MAAO,0BAEXC,YAAa,CACTN,KAAM,gCACNC,SAAU,oCACVC,OAAQ,kCACRC,MAAO,iCACPC,KAAM,gCACNC,MAAO,kCAEXE,gBAAiB,CACbC,MAAO,yBAEXC,eAAgB,wBAChBC,aAAc,mCACdC,QAAS,CACLC,OAAQ,mCACRC,KAAM,uBACNC,OAAQ,yBACRC,UAAW,6BACXC,mBAAoB,uCAExBC,SAAU,CACNR,eAAgB,wBAChBS,cAAe,sBACfC,YAAa,8BACbC,cAAe,gCAEnBC,MAAO,SACPC,IAAK,sBACLC,aAAc,2BACdC,QAAS,mBACTC,UAAW,sBACXC,MAAO,CACHC,QAAS,+BACTC,UAAW,6BACXC,YAAa,iCAEjBC,WAAY,CACRC,YAAa,0CAEjBC,aAAc,iCACdC,iBAAkB,qBAClBC,mBAAoB"} \ No newline at end of file +{"version":3,"file":"selectors.min.js","sources":["../src/selectors.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * CSS selectors for the calendar.\n *\n * @module core_calendar/selectors\n * @copyright 2017 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([], function() {\n return {\n eventFilterItem: \"[data-action='filter-event-type']\",\n eventType: {\n site: \"[data-eventtype-site]\",\n category: \"[data-eventtype-category]\",\n course: \"[data-eventtype-course]\",\n group: \"[data-eventtype-group]\",\n user: \"[data-eventtype-user]\",\n other: \"[data-eventtype-other]\",\n },\n popoverType: {\n site: \"[data-popover-eventtype-site]\",\n category: \"[data-popover-eventtype-category]\",\n course: \"[data-popover-eventtype-course]\",\n group: \"[data-popover-eventtype-group]\",\n user: \"[data-popover-eventtype-user]\",\n other: \"[data-popover-eventtype-other]\",\n },\n calendarPeriods: {\n month: \"[data-period='month']\",\n },\n courseSelector: 'select[name=\"course\"]',\n viewSelector: 'div[data-region=\"view-selector\"]',\n actions: {\n create: '[data-action=\"new-event-button\"]',\n edit: '[data-action=\"edit\"]',\n remove: '[data-action=\"delete\"]',\n viewEvent: '[data-action=\"view-event\"]',\n deleteSubscription: '[data-action=\"delete-subscription\"]',\n },\n elements: {\n courseSelector: 'select[name=\"course\"]',\n dateContainer: '.clickable.hasevent',\n dateContent: '[data-region=\"day-content\"]',\n monthDetailed: '.calendarmonth.calendartable',\n },\n today: '.today',\n day: '[data-region=\"day\"]',\n calendarMain: '[data-region=\"calendar\"]',\n wrapper: '.calendarwrapper',\n eventItem: '[data-type=\"event\"]',\n links: {\n navLink: '.calendarwrapper .arrow_link',\n eventLink: \"[data-region='event-item']\",\n miniDayLink: \"[data-region='mini-day-link']\",\n dayLink: \"[data-action='view-day-link']\",\n },\n containers: {\n loadingIcon: '[data-region=\"overlay-icon-container\"]',\n },\n mainCalendar: '.maincalendar .heightcontainer',\n fullCalendarView: 'page-calendar-view',\n pageHeaderHeadings: '.page-header-headings h1',\n };\n});\n"],"names":["define","eventFilterItem","eventType","site","category","course","group","user","other","popoverType","calendarPeriods","month","courseSelector","viewSelector","actions","create","edit","remove","viewEvent","deleteSubscription","elements","dateContainer","dateContent","monthDetailed","today","day","calendarMain","wrapper","eventItem","links","navLink","eventLink","miniDayLink","dayLink","containers","loadingIcon","mainCalendar","fullCalendarView","pageHeaderHeadings"],"mappings":";;;;;;;AAsBAA,iCAAO,IAAI,iBACA,CACHC,gBAAiB,oCACjBC,UAAW,CACPC,KAAM,wBACNC,SAAU,4BACVC,OAAQ,0BACRC,MAAO,yBACPC,KAAM,wBACNC,MAAO,0BAEXC,YAAa,CACTN,KAAM,gCACNC,SAAU,oCACVC,OAAQ,kCACRC,MAAO,iCACPC,KAAM,gCACNC,MAAO,kCAEXE,gBAAiB,CACbC,MAAO,yBAEXC,eAAgB,wBAChBC,aAAc,mCACdC,QAAS,CACLC,OAAQ,mCACRC,KAAM,uBACNC,OAAQ,yBACRC,UAAW,6BACXC,mBAAoB,uCAExBC,SAAU,CACNR,eAAgB,wBAChBS,cAAe,sBACfC,YAAa,8BACbC,cAAe,gCAEnBC,MAAO,SACPC,IAAK,sBACLC,aAAc,2BACdC,QAAS,mBACTC,UAAW,sBACXC,MAAO,CACHC,QAAS,+BACTC,UAAW,6BACXC,YAAa,gCACbC,QAAS,iCAEbC,WAAY,CACRC,YAAa,0CAEjBC,aAAc,iCACdC,iBAAkB,qBAClBC,mBAAoB"} \ No newline at end of file diff --git a/calendar/amd/src/popover.js b/calendar/amd/src/popover.js index af77242d8bccd..e4434dfb6ef4a 100644 --- a/calendar/amd/src/popover.js +++ b/calendar/amd/src/popover.js @@ -38,14 +38,16 @@ const isPopoverAvailable = (dateContainer) => { const isPopoverConfigured = new Map(); const showPopover = target => { - if (!isPopoverConfigured.has(target)) { + const dateContainer = target.closest(CalendarSelectors.elements.dateContainer); + if (!isPopoverConfigured.has(dateContainer)) { const dateEle = jQuery(target); dateEle.popover({ trigger: 'manual', placement: 'top', html: true, + title: dateContainer.dataset.title, content: () => { - const source = dateEle.find(CalendarSelectors.elements.dateContent); + const source = jQuery(dateContainer).find(CalendarSelectors.elements.dateContent); const content = jQuery('
'); if (source.length) { const temptContent = source.find('.hidden').clone(false); @@ -55,10 +57,10 @@ const showPopover = target => { } }); - isPopoverConfigured.set(target, true); + isPopoverConfigured.set(dateContainer, true); } - if (isPopoverAvailable(target)) { + if (isPopoverAvailable(dateContainer)) { jQuery(target).popover('show'); target.addEventListener('mouseleave', hidePopover); target.addEventListener('focusout', hidePopover); @@ -75,9 +77,9 @@ const hidePopover = e => { const isTargetActive = target.contains(document.activeElement); const isTargetHover = target.matches(':hover'); if (!isTargetActive && !isTargetHover) { - jQuery(dateContainer).popover('hide'); - dateContainer.removeEventListener('mouseleave', hidePopover); - dateContainer.removeEventListener('focusout', hidePopover); + jQuery(target).popover('hide'); + target.removeEventListener('mouseleave', hidePopover); + target.removeEventListener('focusout', hidePopover); } } }; @@ -87,13 +89,13 @@ const hidePopover = e => { */ const registerEventListeners = () => { const showPopoverHandler = (e) => { - const dateContainer = e.target.closest(CalendarSelectors.elements.dateContainer); - if (!dateContainer) { + const dayLink = e.target.closest(CalendarSelectors.links.dayLink); + if (!dayLink) { return; } e.preventDefault(); - showPopover(dateContainer); + showPopover(dayLink); }; document.addEventListener('mouseover', showPopoverHandler); diff --git a/calendar/amd/src/selectors.js b/calendar/amd/src/selectors.js index aed0e3298f3c9..fa7e3aa374a91 100644 --- a/calendar/amd/src/selectors.js +++ b/calendar/amd/src/selectors.js @@ -66,6 +66,7 @@ define([], function() { navLink: '.calendarwrapper .arrow_link', eventLink: "[data-region='event-item']", miniDayLink: "[data-region='mini-day-link']", + dayLink: "[data-action='view-day-link']", }, containers: { loadingIcon: '[data-region="overlay-icon-container"]', diff --git a/calendar/tests/behat/behat_calendar.php b/calendar/tests/behat/behat_calendar.php index fc53c18233caa..5a1712f29bf52 100644 --- a/calendar/tests/behat/behat_calendar.php +++ b/calendar/tests/behat/behat_calendar.php @@ -48,6 +48,10 @@ public static function get_partial_named_selectors(): array { new behat_component_named_selector('mini calendar block', [".//*[@data-block='calendar_month']"]), new behat_component_named_selector('full calendar page', [".//*[@id='page-calendar-view']"]), new behat_component_named_selector('calendar day', [".//*[@data-region='day'][@data-day=%locator%]"]), + new behat_component_named_selector( + 'responsive calendar day', + [".//*[@data-region='day'][@data-day=%locator%]/div[contains(@class, 'hidden-desktop')]"] + ), ]; } @@ -93,33 +97,51 @@ public function i_create_a_calendar_event($data) { /** * Hover over a specific day in the mini-calendar. * - * @Given /^I hover over day "(?P\d+)" of this month in the mini-calendar block$/ + * @Given /^I hover over day "(?P\d+)" of this month in the mini-calendar block(?P responsive view|)$/ * @param int $day The day of the current month + * @param string $responsive If not null, find the responsive version of the link. */ - public function i_hover_over_day_of_this_month_in_mini_calendar_block(int $day): void { - $this->execute("behat_general::i_hover_in_the", - [$day, 'core_calendar > calendar day', '', 'core_calendar > mini calendar block']); + public function i_hover_over_day_of_this_month_in_mini_calendar_block(int $day, string $responsive = ''): void { + $this->execute( + "behat_general::i_hover_in_the", + [ + $day, + empty($responsive) ? 'core_calendar > calendar day' : 'core_calendar > responsive calendar day', + '', + 'core_calendar > mini calendar block', + ], + ); } /** * Hover over a specific day in the full calendar page. * - * @Given /^I hover over day "(?P\d+)" of this month in the full calendar page$/ + * @Given /^I hover over day "(?P\d+)" of this month in the full calendar page(?P responsive view|)$/ * @param int $day The day of the current month + * @param string $responsive If not empty, use the repsonsive view. */ - public function i_hover_over_day_of_this_month_in_full_calendar_page(int $day): void { - $this->execute("behat_general::i_hover_in_the", - [$day, 'core_calendar > calendar day', '', 'core_calendar > full calendar page']); + public function i_hover_over_day_of_this_month_in_full_calendar_page(int $day, string $responsive = ''): void { + $this->execute( + "behat_general::i_hover_in_the", + [ + $day, + empty($responsive) ? 'core_calendar > calendar day' : 'core_calendar > responsive calendar day', + '', + 'core_calendar > full calendar page', + ], + ); } /** * Hover over today in the mini-calendar. * - * @Given /^I hover over today in the mini-calendar block$/ + * @Given /^I hover over today in the mini-calendar block( responsive view|)$/ + * + * @param string $responsive If not empty, use the responsive calendar link. */ - public function i_hover_over_today_in_mini_calendar_block(): void { + public function i_hover_over_today_in_mini_calendar_block(string $responsive = ''): void { $todaysday = date('j'); - $this->i_hover_over_day_of_this_month_in_mini_calendar_block($todaysday); + $this->i_hover_over_day_of_this_month_in_mini_calendar_block($todaysday, $responsive); } /** diff --git a/calendar/tests/behat/calendar.feature b/calendar/tests/behat/calendar.feature index a9cac798352af..3889ee38628c3 100644 --- a/calendar/tests/behat/calendar.feature +++ b/calendar/tests/behat/calendar.feature @@ -280,7 +280,7 @@ Feature: Perform basic calendar functionality # We need to give the browser a couple seconds to re-render the page after the screen has been resized. And I wait "1" seconds And I should not see "Event 1:1" - And I hover over day "1" of this month in the full calendar page + And I hover over day "1" of this month in the full calendar page responsive view And I should see "Event 1:1" @javascript From a64446c2ad05b30f162f793c4e7f073a9f8258ff Mon Sep 17 00:00:00 2001 From: Mark Johnson Date: Wed, 24 Jan 2024 14:40:12 +0000 Subject: [PATCH 10/51] MDL-79007 calendar: Make screen readers read the new month name --- calendar/amd/build/calendar.min.js | 2 +- calendar/amd/build/calendar.min.js.map | 2 +- calendar/amd/src/calendar.js | 12 +++++++++++- calendar/templates/header.mustache | 3 ++- lang/en/calendar.php | 1 + 5 files changed, 16 insertions(+), 4 deletions(-) diff --git a/calendar/amd/build/calendar.min.js b/calendar/amd/build/calendar.min.js index db12a2ea05112..117ff46a1e4bf 100644 --- a/calendar/amd/build/calendar.min.js +++ b/calendar/amd/build/calendar.min.js @@ -9,6 +9,6 @@ * @copyright 2017 Simey Lameze * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -define("core_calendar/calendar",["jquery","core/templates","core/notification","core_calendar/repository","core_calendar/events","core_calendar/view_manager","core_calendar/crud","core_calendar/selectors","core/config","core/url"],(function($,Templates,Notification,CalendarRepository,CalendarEvents,CalendarViewManager,CalendarCrud,CalendarSelectors,Config,Url){var SELECTORS_DAY="[data-region='day']",SELECTORS_DAY_CONTENT="[data-region='day-content']",SELECTORS_LOADING_ICON=".loading-icon",SELECTORS_VIEW_DAY_LINK="[data-action='view-day-link']",SELECTORS_CALENDAR_MONTH_WRAPPER=".calendarwrapper",handleMoveEvent=function(e,eventId,originElement,destinationElement){var originTimestamp=null,destinationTimestamp=destinationElement.attr("data-day-timestamp");originElement&&(originTimestamp=originElement.attr("data-day-timestamp")),originElement&&originTimestamp==destinationTimestamp||Templates.render("core/loading",{}).then((function(html,js){destinationElement.find(SELECTORS_DAY_CONTENT).addClass("hidden"),Templates.appendNodeContents(destinationElement,html,js),originElement&&(originElement.find(SELECTORS_DAY_CONTENT).addClass("hidden"),Templates.appendNodeContents(originElement,html,js))})).then((function(){return CalendarRepository.updateEventStartDay(eventId,destinationTimestamp)})).then((function(){$("body").trigger(CalendarEvents.eventMoved,[eventId,originElement,destinationElement])})).always((function(){var destinationLoadingElement=destinationElement.find(SELECTORS_LOADING_ICON);if(destinationElement.find(SELECTORS_DAY_CONTENT).removeClass("hidden"),Templates.replaceNode(destinationLoadingElement,"",""),originElement){var originLoadingElement=originElement.find(SELECTORS_LOADING_ICON);originElement.find(SELECTORS_DAY_CONTENT).removeClass("hidden"),Templates.replaceNode(originLoadingElement,"","")}})).catch(Notification.exception)},registerEventListeners=function(root){const viewingFullCalendar=document.getElementById(CalendarSelectors.fullCalendarView);root.on("click",SELECTORS_VIEW_DAY_LINK,(function(e){var dayLink=$(e.target).closest(SELECTORS_VIEW_DAY_LINK),year=dayLink.data("year"),month=dayLink.data("month"),day=dayLink.data("day"),courseId=dayLink.data("courseid"),categoryId=dayLink.data("categoryid");const urlParams={view:"day",time:dayLink.data("timestamp"),course:courseId};if(viewingFullCalendar){const urlParamString=Object.entries(urlParams).map((_ref=>{let[key,value]=_ref;return"".concat(encodeURIComponent(key),"=").concat(encodeURIComponent(value))})).join("&");CalendarViewManager.refreshDayContent(root,year,month,day,courseId,categoryId,root,"core_calendar/calendar_day").then((function(){return e.preventDefault(),CalendarViewManager.updateUrl(urlParamString)})).catch(Notification.exception)}else window.location.assign(Url.relativeUrl("calendar/view.php",urlParams))})),root.on("change",CalendarSelectors.elements.courseSelector,(function(){var selectElement=$(this),courseId=selectElement.val();const courseName=$("option:selected",selectElement).text();CalendarViewManager.reloadCurrentMonth(root,courseId,null).then((function(){return root.find(CalendarSelectors.elements.courseSelector).val(courseId)})).then((function(){CalendarViewManager.updateUrl("?view=month&course="+courseId),CalendarViewManager.handleCourseChange(Number(courseId),courseName)})).catch(Notification.exception)}));var eventFormPromise=CalendarCrud.registerEventFormModal(root),contextId=$(SELECTORS_CALENDAR_MONTH_WRAPPER).data("context-id");!function(root,eventFormModalPromise){var body=$("body");body.on(CalendarEvents.created,(function(){CalendarViewManager.reloadCurrentMonth(root)})),body.on(CalendarEvents.deleted,(function(){CalendarViewManager.reloadCurrentMonth(root)})),body.on(CalendarEvents.updated,(function(){CalendarViewManager.reloadCurrentMonth(root)})),body.on(CalendarEvents.editActionEvent,(function(e,url){window.location.assign(url)})),body.on(CalendarEvents.moveEvent,handleMoveEvent),body.on(CalendarEvents.eventMoved,(function(){CalendarViewManager.reloadCurrentMonth(root)})),CalendarCrud.registerEditListeners(root,eventFormModalPromise)}(root,eventFormPromise),contextId&&root.on("click",SELECTORS_DAY,(function(e){var target=$(e.target);const displayingSmallBlockCalendar="side-pre"===root.parents("aside").data("blockregion");if(!viewingFullCalendar&&displayingSmallBlockCalendar){const dateContainer=target.closest(SELECTORS_DAY),courseId=target.closest(CalendarSelectors.wrapper).data("courseid"),params={view:"day",time:dateContainer.data("day-timestamp"),course:courseId};window.location.assign(Url.relativeUrl("calendar/view.php",params))}else{if(!target.closest(SELECTORS_VIEW_DAY_LINK).length){var startTime=$(this).attr("data-new-event-timestamp");eventFormPromise.then((function(modal){var wrapper=target.closest(CalendarSelectors.wrapper);modal.setCourseId(wrapper.data("courseid"));var categoryId=wrapper.data("categoryid");void 0!==categoryId&&modal.setCategoryId(categoryId),modal.setContextId(wrapper.data("contextId")),modal.setStartTime(startTime),modal.show()})).catch(Notification.exception)}}e.preventDefault()}))};return{init:function(root){root=$(root),CalendarViewManager.init(root),registerEventListeners(root)}}})); +define("core_calendar/calendar",["jquery","core/templates","core/notification","core_calendar/repository","core_calendar/events","core_calendar/view_manager","core_calendar/crud","core_calendar/selectors","core/config","core/url","core/str"],(function($,Templates,Notification,CalendarRepository,CalendarEvents,CalendarViewManager,CalendarCrud,CalendarSelectors,Config,Url,Str){var SELECTORS_DAY="[data-region='day']",SELECTORS_DAY_CONTENT="[data-region='day-content']",SELECTORS_LOADING_ICON=".loading-icon",SELECTORS_VIEW_DAY_LINK="[data-action='view-day-link']",SELECTORS_CALENDAR_MONTH_WRAPPER=".calendarwrapper",SELECTORS_SCREEN_READER_ANNOUNCEMENTS=".calendar-announcements",SELECTORS_CURRENT_MONTH=".calendar-controls .current",handleMoveEvent=function(e,eventId,originElement,destinationElement){var originTimestamp=null,destinationTimestamp=destinationElement.attr("data-day-timestamp");originElement&&(originTimestamp=originElement.attr("data-day-timestamp")),originElement&&originTimestamp==destinationTimestamp||Templates.render("core/loading",{}).then((function(html,js){destinationElement.find(SELECTORS_DAY_CONTENT).addClass("hidden"),Templates.appendNodeContents(destinationElement,html,js),originElement&&(originElement.find(SELECTORS_DAY_CONTENT).addClass("hidden"),Templates.appendNodeContents(originElement,html,js))})).then((function(){return CalendarRepository.updateEventStartDay(eventId,destinationTimestamp)})).then((function(){$("body").trigger(CalendarEvents.eventMoved,[eventId,originElement,destinationElement])})).always((function(){var destinationLoadingElement=destinationElement.find(SELECTORS_LOADING_ICON);if(destinationElement.find(SELECTORS_DAY_CONTENT).removeClass("hidden"),Templates.replaceNode(destinationLoadingElement,"",""),originElement){var originLoadingElement=originElement.find(SELECTORS_LOADING_ICON);originElement.find(SELECTORS_DAY_CONTENT).removeClass("hidden"),Templates.replaceNode(originLoadingElement,"","")}})).catch(Notification.exception)},registerEventListeners=function(root){const viewingFullCalendar=document.getElementById(CalendarSelectors.fullCalendarView);root.on("click",SELECTORS_VIEW_DAY_LINK,(function(e){var dayLink=$(e.target).closest(SELECTORS_VIEW_DAY_LINK),year=dayLink.data("year"),month=dayLink.data("month"),day=dayLink.data("day"),courseId=dayLink.data("courseid"),categoryId=dayLink.data("categoryid");const urlParams={view:"day",time:dayLink.data("timestamp"),course:courseId};if(viewingFullCalendar){const urlParamString=Object.entries(urlParams).map((_ref=>{let[key,value]=_ref;return"".concat(encodeURIComponent(key),"=").concat(encodeURIComponent(value))})).join("&");CalendarViewManager.refreshDayContent(root,year,month,day,courseId,categoryId,root,"core_calendar/calendar_day").then((function(){return e.preventDefault(),CalendarViewManager.updateUrl(urlParamString)})).catch(Notification.exception)}else window.location.assign(Url.relativeUrl("calendar/view.php",urlParams))})),root.on("change",CalendarSelectors.elements.courseSelector,(function(){var selectElement=$(this),courseId=selectElement.val();const courseName=$("option:selected",selectElement).text();CalendarViewManager.reloadCurrentMonth(root,courseId,null).then((function(){return root.find(CalendarSelectors.elements.courseSelector).val(courseId)})).then((function(){CalendarViewManager.updateUrl("?view=month&course="+courseId),CalendarViewManager.handleCourseChange(Number(courseId),courseName)})).catch(Notification.exception)}));var eventFormPromise=CalendarCrud.registerEventFormModal(root),contextId=$(SELECTORS_CALENDAR_MONTH_WRAPPER).data("context-id");!function(root,eventFormModalPromise){var body=$("body");body.on(CalendarEvents.created,(function(){CalendarViewManager.reloadCurrentMonth(root)})),body.on(CalendarEvents.deleted,(function(){CalendarViewManager.reloadCurrentMonth(root)})),body.on(CalendarEvents.updated,(function(){CalendarViewManager.reloadCurrentMonth(root)})),body.on(CalendarEvents.editActionEvent,(function(e,url){window.location.assign(url)})),body.on(CalendarEvents.moveEvent,handleMoveEvent),body.on(CalendarEvents.eventMoved,(function(){CalendarViewManager.reloadCurrentMonth(root)})),body.on(CalendarEvents.monthChanged,root,(async function(){const monthName=body.find(SELECTORS_CURRENT_MONTH).text(),monthAnnoucement=await Str.get_string("newmonthannouncement","calendar",monthName);body.find(SELECTORS_SCREEN_READER_ANNOUNCEMENTS).html(monthAnnoucement)})),CalendarCrud.registerEditListeners(root,eventFormModalPromise)}(root,eventFormPromise),contextId&&root.on("click",SELECTORS_DAY,(function(e){var target=$(e.target);const displayingSmallBlockCalendar="side-pre"===root.parents("aside").data("blockregion");if(!viewingFullCalendar&&displayingSmallBlockCalendar){const dateContainer=target.closest(SELECTORS_DAY),courseId=target.closest(CalendarSelectors.wrapper).data("courseid"),params={view:"day",time:dateContainer.data("day-timestamp"),course:courseId};window.location.assign(Url.relativeUrl("calendar/view.php",params))}else{if(!target.closest(SELECTORS_VIEW_DAY_LINK).length){var startTime=$(this).attr("data-new-event-timestamp");eventFormPromise.then((function(modal){var wrapper=target.closest(CalendarSelectors.wrapper);modal.setCourseId(wrapper.data("courseid"));var categoryId=wrapper.data("categoryid");void 0!==categoryId&&modal.setCategoryId(categoryId),modal.setContextId(wrapper.data("contextId")),modal.setStartTime(startTime),modal.show()})).catch(Notification.exception)}}e.preventDefault()}))};return{init:function(root){root=$(root),CalendarViewManager.init(root),registerEventListeners(root)}}})); //# sourceMappingURL=calendar.min.js.map \ No newline at end of file diff --git a/calendar/amd/build/calendar.min.js.map b/calendar/amd/build/calendar.min.js.map index 88b20c4ed2641..ce0ac0f82e0e3 100644 --- a/calendar/amd/build/calendar.min.js.map +++ b/calendar/amd/build/calendar.min.js.map @@ -1 +1 @@ -{"version":3,"file":"calendar.min.js","sources":["../src/calendar.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * This module is the highest level module for the calendar. It is\n * responsible for initialising all of the components required for\n * the calendar to run. It also coordinates the interaction between\n * components by listening for and responding to different events\n * triggered within the calendar UI.\n *\n * @module core_calendar/calendar\n * @copyright 2017 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/templates',\n 'core/notification',\n 'core_calendar/repository',\n 'core_calendar/events',\n 'core_calendar/view_manager',\n 'core_calendar/crud',\n 'core_calendar/selectors',\n 'core/config',\n 'core/url',\n],\nfunction(\n $,\n Templates,\n Notification,\n CalendarRepository,\n CalendarEvents,\n CalendarViewManager,\n CalendarCrud,\n CalendarSelectors,\n Config,\n Url,\n) {\n\n var SELECTORS = {\n ROOT: \"[data-region='calendar']\",\n DAY: \"[data-region='day']\",\n NEW_EVENT_BUTTON: \"[data-action='new-event-button']\",\n DAY_CONTENT: \"[data-region='day-content']\",\n LOADING_ICON: '.loading-icon',\n VIEW_DAY_LINK: \"[data-action='view-day-link']\",\n CALENDAR_MONTH_WRAPPER: \".calendarwrapper\",\n TODAY: '.today',\n DAY_NUMBER_CIRCLE: '.day-number-circle',\n DAY_NUMBER: '.day-number'\n };\n\n /**\n * Handler for the drag and drop move event. Provides a loading indicator\n * while the request is sent to the server to update the event start date.\n *\n * Triggers a eventMoved calendar javascript event if the event was successfully\n * updated.\n *\n * @param {event} e The calendar move event\n * @param {int} eventId The event id being moved\n * @param {object|null} originElement The jQuery element for where the event is moving from\n * @param {object} destinationElement The jQuery element for where the event is moving to\n */\n var handleMoveEvent = function(e, eventId, originElement, destinationElement) {\n var originTimestamp = null;\n var destinationTimestamp = destinationElement.attr('data-day-timestamp');\n\n if (originElement) {\n originTimestamp = originElement.attr('data-day-timestamp');\n }\n\n // If the event has actually changed day.\n if (!originElement || originTimestamp != destinationTimestamp) {\n Templates.render('core/loading', {})\n .then(function(html, js) {\n // First we show some loading icons in each of the days being affected.\n destinationElement.find(SELECTORS.DAY_CONTENT).addClass('hidden');\n Templates.appendNodeContents(destinationElement, html, js);\n\n if (originElement) {\n originElement.find(SELECTORS.DAY_CONTENT).addClass('hidden');\n Templates.appendNodeContents(originElement, html, js);\n }\n return;\n })\n .then(function() {\n // Send a request to the server to make the change.\n return CalendarRepository.updateEventStartDay(eventId, destinationTimestamp);\n })\n .then(function() {\n // If the update was successful then broadcast an event letting the calendar\n // know that an event has been moved.\n $('body').trigger(CalendarEvents.eventMoved, [eventId, originElement, destinationElement]);\n return;\n })\n .always(function() {\n // Always remove the loading icons regardless of whether the update\n // request was successful or not.\n var destinationLoadingElement = destinationElement.find(SELECTORS.LOADING_ICON);\n destinationElement.find(SELECTORS.DAY_CONTENT).removeClass('hidden');\n Templates.replaceNode(destinationLoadingElement, '', '');\n\n if (originElement) {\n var originLoadingElement = originElement.find(SELECTORS.LOADING_ICON);\n originElement.find(SELECTORS.DAY_CONTENT).removeClass('hidden');\n Templates.replaceNode(originLoadingElement, '', '');\n }\n return;\n })\n .catch(Notification.exception);\n }\n };\n\n /**\n * Listen to and handle any calendar events fired by the calendar UI.\n *\n * @method registerCalendarEventListeners\n * @param {object} root The calendar root element\n * @param {object} eventFormModalPromise A promise reolved with the event form modal\n */\n var registerCalendarEventListeners = function(root, eventFormModalPromise) {\n var body = $('body');\n\n body.on(CalendarEvents.created, function() {\n CalendarViewManager.reloadCurrentMonth(root);\n });\n body.on(CalendarEvents.deleted, function() {\n CalendarViewManager.reloadCurrentMonth(root);\n });\n body.on(CalendarEvents.updated, function() {\n CalendarViewManager.reloadCurrentMonth(root);\n });\n body.on(CalendarEvents.editActionEvent, function(e, url) {\n // Action events needs to be edit directly on the course module.\n window.location.assign(url);\n });\n // Handle the event fired by the drag and drop code.\n body.on(CalendarEvents.moveEvent, handleMoveEvent);\n // When an event is successfully moved we should updated the UI.\n body.on(CalendarEvents.eventMoved, function() {\n CalendarViewManager.reloadCurrentMonth(root);\n });\n\n CalendarCrud.registerEditListeners(root, eventFormModalPromise);\n };\n\n /**\n * Register event listeners for the module.\n *\n * @param {object} root The calendar root element\n */\n var registerEventListeners = function(root) {\n const viewingFullCalendar = document.getElementById(CalendarSelectors.fullCalendarView);\n // Listen the click on the day link to render the day view.\n root.on('click', SELECTORS.VIEW_DAY_LINK, function(e) {\n var dayLink = $(e.target).closest(SELECTORS.VIEW_DAY_LINK);\n var year = dayLink.data('year'),\n month = dayLink.data('month'),\n day = dayLink.data('day'),\n courseId = dayLink.data('courseid'),\n categoryId = dayLink.data('categoryid');\n const urlParams = {\n view: 'day',\n time: dayLink.data('timestamp'),\n course: courseId,\n };\n if (viewingFullCalendar) {\n // Construct the URL parameter string from the urlParams object.\n const urlParamString = Object.entries(urlParams)\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n .join('&');\n CalendarViewManager.refreshDayContent(root, year, month, day, courseId, categoryId, root,\n 'core_calendar/calendar_day').then(function() {\n e.preventDefault();\n return CalendarViewManager.updateUrl(urlParamString);\n }).catch(Notification.exception);\n } else {\n window.location.assign(Url.relativeUrl('calendar/view.php', urlParams));\n }\n });\n\n root.on('change', CalendarSelectors.elements.courseSelector, function() {\n var selectElement = $(this);\n var courseId = selectElement.val();\n const courseName = $(\"option:selected\", selectElement).text();\n CalendarViewManager.reloadCurrentMonth(root, courseId, null)\n .then(function() {\n // We need to get the selector again because the content has changed.\n return root.find(CalendarSelectors.elements.courseSelector).val(courseId);\n })\n .then(function() {\n CalendarViewManager.updateUrl('?view=month&course=' + courseId);\n CalendarViewManager.handleCourseChange(Number(courseId), courseName);\n return;\n })\n .catch(Notification.exception);\n });\n\n var eventFormPromise = CalendarCrud.registerEventFormModal(root),\n contextId = $(SELECTORS.CALENDAR_MONTH_WRAPPER).data('context-id');\n registerCalendarEventListeners(root, eventFormPromise);\n\n if (contextId) {\n // Bind click events to calendar days.\n root.on('click', SELECTORS.DAY, function(e) {\n var target = $(e.target);\n const displayingSmallBlockCalendar = root.parents('aside').data('blockregion') === 'side-pre';\n\n if (!viewingFullCalendar && displayingSmallBlockCalendar) {\n const dateContainer = target.closest(SELECTORS.DAY);\n const wrapper = target.closest(CalendarSelectors.wrapper);\n const courseId = wrapper.data('courseid');\n const params = {\n view: 'day',\n time: dateContainer.data('day-timestamp'),\n course: courseId,\n };\n window.location.assign(Url.relativeUrl('calendar/view.php', params));\n } else {\n const hasViewDayLink = target.closest(SELECTORS.VIEW_DAY_LINK).length;\n const shouldShowNewEventModal = !hasViewDayLink;\n if (shouldShowNewEventModal) {\n var startTime = $(this).attr('data-new-event-timestamp');\n eventFormPromise.then(function(modal) {\n var wrapper = target.closest(CalendarSelectors.wrapper);\n modal.setCourseId(wrapper.data('courseid'));\n\n var categoryId = wrapper.data('categoryid');\n if (typeof categoryId !== 'undefined') {\n modal.setCategoryId(categoryId);\n }\n\n modal.setContextId(wrapper.data('contextId'));\n modal.setStartTime(startTime);\n modal.show();\n return;\n }).catch(Notification.exception);\n }\n }\n e.preventDefault();\n });\n }\n };\n\n return {\n init: function(root) {\n root = $(root);\n CalendarViewManager.init(root);\n registerEventListeners(root);\n }\n };\n});\n"],"names":["define","$","Templates","Notification","CalendarRepository","CalendarEvents","CalendarViewManager","CalendarCrud","CalendarSelectors","Config","Url","SELECTORS","handleMoveEvent","e","eventId","originElement","destinationElement","originTimestamp","destinationTimestamp","attr","render","then","html","js","find","addClass","appendNodeContents","updateEventStartDay","trigger","eventMoved","always","destinationLoadingElement","removeClass","replaceNode","originLoadingElement","catch","exception","registerEventListeners","root","viewingFullCalendar","document","getElementById","fullCalendarView","on","dayLink","target","closest","year","data","month","day","courseId","categoryId","urlParams","view","time","course","urlParamString","Object","entries","map","_ref","key","value","encodeURIComponent","join","refreshDayContent","preventDefault","updateUrl","window","location","assign","relativeUrl","elements","courseSelector","selectElement","this","val","courseName","text","reloadCurrentMonth","handleCourseChange","Number","eventFormPromise","registerEventFormModal","contextId","eventFormModalPromise","body","created","deleted","updated","editActionEvent","url","moveEvent","registerEditListeners","registerCalendarEventListeners","displayingSmallBlockCalendar","parents","dateContainer","wrapper","params","length","startTime","modal","setCourseId","setCategoryId","setContextId","setStartTime","show","init"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"calendar.min.js","sources":["../src/calendar.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * This module is the highest level module for the calendar. It is\n * responsible for initialising all of the components required for\n * the calendar to run. It also coordinates the interaction between\n * components by listening for and responding to different events\n * triggered within the calendar UI.\n *\n * @module core_calendar/calendar\n * @copyright 2017 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/templates',\n 'core/notification',\n 'core_calendar/repository',\n 'core_calendar/events',\n 'core_calendar/view_manager',\n 'core_calendar/crud',\n 'core_calendar/selectors',\n 'core/config',\n 'core/url',\n 'core/str',\n],\nfunction(\n $,\n Templates,\n Notification,\n CalendarRepository,\n CalendarEvents,\n CalendarViewManager,\n CalendarCrud,\n CalendarSelectors,\n Config,\n Url,\n Str,\n) {\n\n var SELECTORS = {\n ROOT: \"[data-region='calendar']\",\n DAY: \"[data-region='day']\",\n NEW_EVENT_BUTTON: \"[data-action='new-event-button']\",\n DAY_CONTENT: \"[data-region='day-content']\",\n LOADING_ICON: '.loading-icon',\n VIEW_DAY_LINK: \"[data-action='view-day-link']\",\n CALENDAR_MONTH_WRAPPER: \".calendarwrapper\",\n TODAY: '.today',\n DAY_NUMBER_CIRCLE: '.day-number-circle',\n DAY_NUMBER: '.day-number',\n SCREEN_READER_ANNOUNCEMENTS: '.calendar-announcements',\n CURRENT_MONTH: '.calendar-controls .current'\n };\n\n /**\n * Handler for the drag and drop move event. Provides a loading indicator\n * while the request is sent to the server to update the event start date.\n *\n * Triggers a eventMoved calendar javascript event if the event was successfully\n * updated.\n *\n * @param {event} e The calendar move event\n * @param {int} eventId The event id being moved\n * @param {object|null} originElement The jQuery element for where the event is moving from\n * @param {object} destinationElement The jQuery element for where the event is moving to\n */\n var handleMoveEvent = function(e, eventId, originElement, destinationElement) {\n var originTimestamp = null;\n var destinationTimestamp = destinationElement.attr('data-day-timestamp');\n\n if (originElement) {\n originTimestamp = originElement.attr('data-day-timestamp');\n }\n\n // If the event has actually changed day.\n if (!originElement || originTimestamp != destinationTimestamp) {\n Templates.render('core/loading', {})\n .then(function(html, js) {\n // First we show some loading icons in each of the days being affected.\n destinationElement.find(SELECTORS.DAY_CONTENT).addClass('hidden');\n Templates.appendNodeContents(destinationElement, html, js);\n\n if (originElement) {\n originElement.find(SELECTORS.DAY_CONTENT).addClass('hidden');\n Templates.appendNodeContents(originElement, html, js);\n }\n return;\n })\n .then(function() {\n // Send a request to the server to make the change.\n return CalendarRepository.updateEventStartDay(eventId, destinationTimestamp);\n })\n .then(function() {\n // If the update was successful then broadcast an event letting the calendar\n // know that an event has been moved.\n $('body').trigger(CalendarEvents.eventMoved, [eventId, originElement, destinationElement]);\n return;\n })\n .always(function() {\n // Always remove the loading icons regardless of whether the update\n // request was successful or not.\n var destinationLoadingElement = destinationElement.find(SELECTORS.LOADING_ICON);\n destinationElement.find(SELECTORS.DAY_CONTENT).removeClass('hidden');\n Templates.replaceNode(destinationLoadingElement, '', '');\n\n if (originElement) {\n var originLoadingElement = originElement.find(SELECTORS.LOADING_ICON);\n originElement.find(SELECTORS.DAY_CONTENT).removeClass('hidden');\n Templates.replaceNode(originLoadingElement, '', '');\n }\n return;\n })\n .catch(Notification.exception);\n }\n };\n\n /**\n * Listen to and handle any calendar events fired by the calendar UI.\n *\n * @method registerCalendarEventListeners\n * @param {object} root The calendar root element\n * @param {object} eventFormModalPromise A promise reolved with the event form modal\n */\n var registerCalendarEventListeners = function(root, eventFormModalPromise) {\n var body = $('body');\n\n body.on(CalendarEvents.created, function() {\n CalendarViewManager.reloadCurrentMonth(root);\n });\n body.on(CalendarEvents.deleted, function() {\n CalendarViewManager.reloadCurrentMonth(root);\n });\n body.on(CalendarEvents.updated, function() {\n CalendarViewManager.reloadCurrentMonth(root);\n });\n body.on(CalendarEvents.editActionEvent, function(e, url) {\n // Action events needs to be edit directly on the course module.\n window.location.assign(url);\n });\n // Handle the event fired by the drag and drop code.\n body.on(CalendarEvents.moveEvent, handleMoveEvent);\n // When an event is successfully moved we should updated the UI.\n body.on(CalendarEvents.eventMoved, function() {\n CalendarViewManager.reloadCurrentMonth(root);\n });\n // Announce the newly loaded month to screen readers.\n body.on(CalendarEvents.monthChanged, root, async function() {\n const monthName = body.find(SELECTORS.CURRENT_MONTH).text();\n const monthAnnoucement = await Str.get_string('newmonthannouncement', 'calendar', monthName);\n body.find(SELECTORS.SCREEN_READER_ANNOUNCEMENTS).html(monthAnnoucement);\n });\n\n CalendarCrud.registerEditListeners(root, eventFormModalPromise);\n };\n\n /**\n * Register event listeners for the module.\n *\n * @param {object} root The calendar root element\n */\n var registerEventListeners = function(root) {\n const viewingFullCalendar = document.getElementById(CalendarSelectors.fullCalendarView);\n // Listen the click on the day link to render the day view.\n root.on('click', SELECTORS.VIEW_DAY_LINK, function(e) {\n var dayLink = $(e.target).closest(SELECTORS.VIEW_DAY_LINK);\n var year = dayLink.data('year'),\n month = dayLink.data('month'),\n day = dayLink.data('day'),\n courseId = dayLink.data('courseid'),\n categoryId = dayLink.data('categoryid');\n const urlParams = {\n view: 'day',\n time: dayLink.data('timestamp'),\n course: courseId,\n };\n if (viewingFullCalendar) {\n // Construct the URL parameter string from the urlParams object.\n const urlParamString = Object.entries(urlParams)\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n .join('&');\n CalendarViewManager.refreshDayContent(root, year, month, day, courseId, categoryId, root,\n 'core_calendar/calendar_day').then(function() {\n e.preventDefault();\n return CalendarViewManager.updateUrl(urlParamString);\n }).catch(Notification.exception);\n } else {\n window.location.assign(Url.relativeUrl('calendar/view.php', urlParams));\n }\n });\n\n root.on('change', CalendarSelectors.elements.courseSelector, function() {\n var selectElement = $(this);\n var courseId = selectElement.val();\n const courseName = $(\"option:selected\", selectElement).text();\n CalendarViewManager.reloadCurrentMonth(root, courseId, null)\n .then(function() {\n // We need to get the selector again because the content has changed.\n return root.find(CalendarSelectors.elements.courseSelector).val(courseId);\n })\n .then(function() {\n CalendarViewManager.updateUrl('?view=month&course=' + courseId);\n CalendarViewManager.handleCourseChange(Number(courseId), courseName);\n return;\n })\n .catch(Notification.exception);\n });\n\n var eventFormPromise = CalendarCrud.registerEventFormModal(root),\n contextId = $(SELECTORS.CALENDAR_MONTH_WRAPPER).data('context-id');\n registerCalendarEventListeners(root, eventFormPromise);\n\n if (contextId) {\n // Bind click events to calendar days.\n root.on('click', SELECTORS.DAY, function(e) {\n var target = $(e.target);\n const displayingSmallBlockCalendar = root.parents('aside').data('blockregion') === 'side-pre';\n\n if (!viewingFullCalendar && displayingSmallBlockCalendar) {\n const dateContainer = target.closest(SELECTORS.DAY);\n const wrapper = target.closest(CalendarSelectors.wrapper);\n const courseId = wrapper.data('courseid');\n const params = {\n view: 'day',\n time: dateContainer.data('day-timestamp'),\n course: courseId,\n };\n window.location.assign(Url.relativeUrl('calendar/view.php', params));\n } else {\n const hasViewDayLink = target.closest(SELECTORS.VIEW_DAY_LINK).length;\n const shouldShowNewEventModal = !hasViewDayLink;\n if (shouldShowNewEventModal) {\n var startTime = $(this).attr('data-new-event-timestamp');\n eventFormPromise.then(function(modal) {\n var wrapper = target.closest(CalendarSelectors.wrapper);\n modal.setCourseId(wrapper.data('courseid'));\n\n var categoryId = wrapper.data('categoryid');\n if (typeof categoryId !== 'undefined') {\n modal.setCategoryId(categoryId);\n }\n\n modal.setContextId(wrapper.data('contextId'));\n modal.setStartTime(startTime);\n modal.show();\n return;\n }).catch(Notification.exception);\n }\n }\n e.preventDefault();\n });\n }\n };\n\n return {\n init: function(root) {\n root = $(root);\n CalendarViewManager.init(root);\n registerEventListeners(root);\n }\n };\n});\n"],"names":["define","$","Templates","Notification","CalendarRepository","CalendarEvents","CalendarViewManager","CalendarCrud","CalendarSelectors","Config","Url","Str","SELECTORS","handleMoveEvent","e","eventId","originElement","destinationElement","originTimestamp","destinationTimestamp","attr","render","then","html","js","find","addClass","appendNodeContents","updateEventStartDay","trigger","eventMoved","always","destinationLoadingElement","removeClass","replaceNode","originLoadingElement","catch","exception","registerEventListeners","root","viewingFullCalendar","document","getElementById","fullCalendarView","on","dayLink","target","closest","year","data","month","day","courseId","categoryId","urlParams","view","time","course","urlParamString","Object","entries","map","_ref","key","value","encodeURIComponent","join","refreshDayContent","preventDefault","updateUrl","window","location","assign","relativeUrl","elements","courseSelector","selectElement","this","val","courseName","text","reloadCurrentMonth","handleCourseChange","Number","eventFormPromise","registerEventFormModal","contextId","eventFormModalPromise","body","created","deleted","updated","editActionEvent","url","moveEvent","monthChanged","async","monthName","monthAnnoucement","get_string","registerEditListeners","registerCalendarEventListeners","displayingSmallBlockCalendar","parents","dateContainer","wrapper","params","length","startTime","modal","setCourseId","setCategoryId","setContextId","setStartTime","show","init"],"mappings":"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"} \ No newline at end of file diff --git a/calendar/amd/src/calendar.js b/calendar/amd/src/calendar.js index 1ca8b17de066c..ee978d65f8aeb 100644 --- a/calendar/amd/src/calendar.js +++ b/calendar/amd/src/calendar.js @@ -35,6 +35,7 @@ define([ 'core_calendar/selectors', 'core/config', 'core/url', + 'core/str', ], function( $, @@ -47,6 +48,7 @@ function( CalendarSelectors, Config, Url, + Str, ) { var SELECTORS = { @@ -59,7 +61,9 @@ function( CALENDAR_MONTH_WRAPPER: ".calendarwrapper", TODAY: '.today', DAY_NUMBER_CIRCLE: '.day-number-circle', - DAY_NUMBER: '.day-number' + DAY_NUMBER: '.day-number', + SCREEN_READER_ANNOUNCEMENTS: '.calendar-announcements', + CURRENT_MONTH: '.calendar-controls .current' }; /** @@ -153,6 +157,12 @@ function( body.on(CalendarEvents.eventMoved, function() { CalendarViewManager.reloadCurrentMonth(root); }); + // Announce the newly loaded month to screen readers. + body.on(CalendarEvents.monthChanged, root, async function() { + const monthName = body.find(SELECTORS.CURRENT_MONTH).text(); + const monthAnnoucement = await Str.get_string('newmonthannouncement', 'calendar', monthName); + body.find(SELECTORS.SCREEN_READER_ANNOUNCEMENTS).html(monthAnnoucement); + }); CalendarCrud.registerEditListeners(root, eventFormModalPromise); }; diff --git a/calendar/templates/header.mustache b/calendar/templates/header.mustache index ae856708d752c..57a39d35f0523 100644 --- a/calendar/templates/header.mustache +++ b/calendar/templates/header.mustache @@ -39,4 +39,5 @@ {{{filter_selector}}} {{/filter_selector}} {{> core_calendar/add_event_button}} -
\ No newline at end of file +
+
diff --git a/lang/en/calendar.php b/lang/en/calendar.php index 2239d62397343..cc273a0b69fca 100644 --- a/lang/en/calendar.php +++ b/lang/en/calendar.php @@ -192,6 +192,7 @@ $string['namewithsource'] = '{$a->name} ({$a->source})'; $string['never'] = 'Never'; $string['newevent'] = 'New event'; +$string['newmonthannouncement'] = 'Calendar is now set to {$a}.'; $string['notitle'] = 'no title'; $string['noupcomingevents'] = 'There are no upcoming events'; $string['nocalendarsubscriptions'] = 'No calendar subscriptions yet. Do you want to {$a}'; From 0079ba38f2c7f132ddc3fd43a6a31de954cafd21 Mon Sep 17 00:00:00 2001 From: Laurent David Date: Mon, 18 Mar 2024 19:34:36 +0100 Subject: [PATCH 11/51] MDL-80636 lib: Upgrade HTML purifier to 4.17.0 --- lib/htmlpurifier/HTMLPurifier.php | 6 +- .../HTMLPurifier/AttrDef/CSS/FontFamily.php | 32 +- .../HTMLPurifier/AttrDef/URI/Host.php | 2 +- .../AttrTransform/TargetBlank.php | 6 +- lib/htmlpurifier/HTMLPurifier/Bootstrap.php | 41 +-- .../HTMLPurifier/CSSDefinition.php | 199 ++++++------ lib/htmlpurifier/HTMLPurifier/Config.php | 2 +- .../DefinitionCache/Serializer.php | 11 +- .../DefinitionCache/Serializer/README | 0 .../HTMLPurifier/DefinitionCacheFactory.php | 2 +- .../Filter/ExtractStyleBlocks.php | 306 +++++++++--------- .../HTMLPurifier/HTMLModule/Tidy.php | 1 + .../HTMLPurifier/LanguageFactory.php | 2 +- lib/htmlpurifier/HTMLPurifier/Lexer.php | 2 +- .../HTMLPurifier/Lexer/DOMLex.php | 1 - .../HTMLPurifier/URIScheme/tel.php | 6 +- .../HTMLPurifier/UnitConverter.php | 6 +- 17 files changed, 308 insertions(+), 317 deletions(-) mode change 100644 => 100755 lib/htmlpurifier/HTMLPurifier/DefinitionCache/Serializer/README diff --git a/lib/htmlpurifier/HTMLPurifier.php b/lib/htmlpurifier/HTMLPurifier.php index 26f061276f7cf..5c14a335d65cf 100644 --- a/lib/htmlpurifier/HTMLPurifier.php +++ b/lib/htmlpurifier/HTMLPurifier.php @@ -19,7 +19,7 @@ */ /* - HTML Purifier 4.15.0 - Standards Compliant HTML Filtering + HTML Purifier 4.17.0 - Standards Compliant HTML Filtering Copyright (C) 2006-2008 Edward Z. Yang This library is free software; you can redistribute it and/or @@ -58,12 +58,12 @@ class HTMLPurifier * Version of HTML Purifier. * @type string */ - public $version = '4.15.0'; + public $version = '4.17.0'; /** * Constant with version of HTML Purifier. */ - const VERSION = '4.15.0'; + const VERSION = '4.17.0'; /** * Global configuration object. diff --git a/lib/htmlpurifier/HTMLPurifier/AttrDef/CSS/FontFamily.php b/lib/htmlpurifier/HTMLPurifier/AttrDef/CSS/FontFamily.php index 74e24c8816ec9..f1ff11636168f 100644 --- a/lib/htmlpurifier/HTMLPurifier/AttrDef/CSS/FontFamily.php +++ b/lib/htmlpurifier/HTMLPurifier/AttrDef/CSS/FontFamily.php @@ -10,23 +10,21 @@ class HTMLPurifier_AttrDef_CSS_FontFamily extends HTMLPurifier_AttrDef public function __construct() { - $this->mask = '_- '; - for ($c = 'a'; $c <= 'z'; $c++) { - $this->mask .= $c; - } - for ($c = 'A'; $c <= 'Z'; $c++) { - $this->mask .= $c; - } - for ($c = '0'; $c <= '9'; $c++) { - $this->mask .= $c; - } // cast-y, but should be fine - // special bytes used by UTF-8 - for ($i = 0x80; $i <= 0xFF; $i++) { - // We don't bother excluding invalid bytes in this range, - // because the our restriction of well-formed UTF-8 will - // prevent these from ever occurring. - $this->mask .= chr($i); - } + // Lowercase letters + $l = range('a', 'z'); + // Uppercase letters + $u = range('A', 'Z'); + // Digits + $d = range('0', '9'); + // Special bytes used by UTF-8 + $b = array_map('chr', range(0x80, 0xFF)); + // All valid characters for the mask + $c = array_merge($l, $u, $d, $b); + // Concatenate all valid characters into a string + // Use '_- ' as an initial value + $this->mask = array_reduce($c, function ($carry, $value) { + return $carry . $value; + }, '_- '); /* PHP's internal strcspn implementation is diff --git a/lib/htmlpurifier/HTMLPurifier/AttrDef/URI/Host.php b/lib/htmlpurifier/HTMLPurifier/AttrDef/URI/Host.php index 1beeaa5d22e3b..ddc5dfbeaf9ed 100644 --- a/lib/htmlpurifier/HTMLPurifier/AttrDef/URI/Host.php +++ b/lib/htmlpurifier/HTMLPurifier/AttrDef/URI/Host.php @@ -106,7 +106,7 @@ public function validate($string, $config, $context) // If we have Net_IDNA2 support, we can support IRIs by // punycoding them. (This is the most portable thing to do, // since otherwise we have to assume browsers support - } elseif ($config->get('Core.EnableIDNA')) { + } elseif ($config->get('Core.EnableIDNA') && class_exists('Net_IDNA2')) { $idna = new Net_IDNA2(array('encoding' => 'utf8', 'overlong' => false, 'strict' => true)); // we need to encode each period separately $parts = explode('.', $string); diff --git a/lib/htmlpurifier/HTMLPurifier/AttrTransform/TargetBlank.php b/lib/htmlpurifier/HTMLPurifier/AttrTransform/TargetBlank.php index dd63ea89cb605..cc30ab8c38cbf 100644 --- a/lib/htmlpurifier/HTMLPurifier/AttrTransform/TargetBlank.php +++ b/lib/htmlpurifier/HTMLPurifier/AttrTransform/TargetBlank.php @@ -33,7 +33,11 @@ public function transform($attr, $config, $context) // XXX Kind of inefficient $url = $this->parser->parse($attr['href']); - $scheme = $url->getSchemeObj($config, $context); + + // Ignore invalid schemes (e.g. `javascript:`) + if (!($scheme = $url->getSchemeObj($config, $context))) { + return $attr; + } if ($scheme->browsable && !$url->isBenign($config, $context)) { $attr['target'] = '_blank'; diff --git a/lib/htmlpurifier/HTMLPurifier/Bootstrap.php b/lib/htmlpurifier/HTMLPurifier/Bootstrap.php index 707122bb29604..bd8f9984f8913 100644 --- a/lib/htmlpurifier/HTMLPurifier/Bootstrap.php +++ b/lib/htmlpurifier/HTMLPurifier/Bootstrap.php @@ -79,44 +79,11 @@ public static function getPath($class) public static function registerAutoload() { $autoload = array('HTMLPurifier_Bootstrap', 'autoload'); - if (($funcs = spl_autoload_functions()) === false) { + if (spl_autoload_functions() === false) { spl_autoload_register($autoload); - } elseif (function_exists('spl_autoload_unregister')) { - if (version_compare(PHP_VERSION, '5.3.0', '>=')) { - // prepend flag exists, no need for shenanigans - spl_autoload_register($autoload, true, true); - } else { - $buggy = version_compare(PHP_VERSION, '5.2.11', '<'); - $compat = version_compare(PHP_VERSION, '5.1.2', '<=') && - version_compare(PHP_VERSION, '5.1.0', '>='); - foreach ($funcs as $func) { - if ($buggy && is_array($func)) { - // :TRICKY: There are some compatibility issues and some - // places where we need to error out - $reflector = new ReflectionMethod($func[0], $func[1]); - if (!$reflector->isStatic()) { - throw new Exception( - 'HTML Purifier autoloader registrar is not compatible - with non-static object methods due to PHP Bug #44144; - Please do not use HTMLPurifier.autoload.php (or any - file that includes this file); instead, place the code: - spl_autoload_register(array(\'HTMLPurifier_Bootstrap\', \'autoload\')) - after your own autoloaders.' - ); - } - // Suprisingly, spl_autoload_register supports the - // Class::staticMethod callback format, although call_user_func doesn't - if ($compat) { - $func = implode('::', $func); - } - } - spl_autoload_unregister($func); - } - spl_autoload_register($autoload); - foreach ($funcs as $func) { - spl_autoload_register($func); - } - } + } else { + // prepend flag exists, no need for shenanigans + spl_autoload_register($autoload, true, true); } } } diff --git a/lib/htmlpurifier/HTMLPurifier/CSSDefinition.php b/lib/htmlpurifier/HTMLPurifier/CSSDefinition.php index 3f08b81c545b2..1bc419c534260 100644 --- a/lib/htmlpurifier/HTMLPurifier/CSSDefinition.php +++ b/lib/htmlpurifier/HTMLPurifier/CSSDefinition.php @@ -13,7 +13,7 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition * Assoc array of attribute name to definition object. * @type HTMLPurifier_AttrDef[] */ - public $info = array(); + public $info = []; /** * Constructs the info array. The meat of this class. @@ -22,7 +22,7 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition protected function doSetup($config) { $this->info['text-align'] = new HTMLPurifier_AttrDef_Enum( - array('left', 'right', 'center', 'justify'), + ['left', 'right', 'center', 'justify'], false ); @@ -31,7 +31,7 @@ protected function doSetup($config) $this->info['border-right-style'] = $this->info['border-left-style'] = $this->info['border-top-style'] = new HTMLPurifier_AttrDef_Enum( - array( + [ 'none', 'hidden', 'dotted', @@ -42,42 +42,42 @@ protected function doSetup($config) 'ridge', 'inset', 'outset' - ), + ], false ); $this->info['border-style'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_style); $this->info['clear'] = new HTMLPurifier_AttrDef_Enum( - array('none', 'left', 'right', 'both'), + ['none', 'left', 'right', 'both'], false ); $this->info['float'] = new HTMLPurifier_AttrDef_Enum( - array('none', 'left', 'right'), + ['none', 'left', 'right'], false ); $this->info['font-style'] = new HTMLPurifier_AttrDef_Enum( - array('normal', 'italic', 'oblique'), + ['normal', 'italic', 'oblique'], false ); $this->info['font-variant'] = new HTMLPurifier_AttrDef_Enum( - array('normal', 'small-caps'), + ['normal', 'small-caps'], false ); $uri_or_none = new HTMLPurifier_AttrDef_CSS_Composite( - array( - new HTMLPurifier_AttrDef_Enum(array('none')), + [ + new HTMLPurifier_AttrDef_Enum(['none']), new HTMLPurifier_AttrDef_CSS_URI() - ) + ] ); $this->info['list-style-position'] = new HTMLPurifier_AttrDef_Enum( - array('inside', 'outside'), + ['inside', 'outside'], false ); $this->info['list-style-type'] = new HTMLPurifier_AttrDef_Enum( - array( + [ 'disc', 'circle', 'square', @@ -87,7 +87,7 @@ protected function doSetup($config) 'lower-alpha', 'upper-alpha', 'none' - ), + ], false ); $this->info['list-style-image'] = $uri_or_none; @@ -95,34 +95,34 @@ protected function doSetup($config) $this->info['list-style'] = new HTMLPurifier_AttrDef_CSS_ListStyle($config); $this->info['text-transform'] = new HTMLPurifier_AttrDef_Enum( - array('capitalize', 'uppercase', 'lowercase', 'none'), + ['capitalize', 'uppercase', 'lowercase', 'none'], false ); $this->info['color'] = new HTMLPurifier_AttrDef_CSS_Color(); $this->info['background-image'] = $uri_or_none; $this->info['background-repeat'] = new HTMLPurifier_AttrDef_Enum( - array('repeat', 'repeat-x', 'repeat-y', 'no-repeat') + ['repeat', 'repeat-x', 'repeat-y', 'no-repeat'] ); $this->info['background-attachment'] = new HTMLPurifier_AttrDef_Enum( - array('scroll', 'fixed') + ['scroll', 'fixed'] ); $this->info['background-position'] = new HTMLPurifier_AttrDef_CSS_BackgroundPosition(); $this->info['background-size'] = new HTMLPurifier_AttrDef_CSS_Composite( - array( + [ new HTMLPurifier_AttrDef_Enum( - array( + [ 'auto', 'cover', 'contain', 'initial', 'inherit', - ) + ] ), new HTMLPurifier_AttrDef_CSS_Percentage(), new HTMLPurifier_AttrDef_CSS_Length() - ) + ] ); $border_color = @@ -131,10 +131,10 @@ protected function doSetup($config) $this->info['border-left-color'] = $this->info['border-right-color'] = $this->info['background-color'] = new HTMLPurifier_AttrDef_CSS_Composite( - array( - new HTMLPurifier_AttrDef_Enum(array('transparent')), + [ + new HTMLPurifier_AttrDef_Enum(['transparent']), new HTMLPurifier_AttrDef_CSS_Color() - ) + ] ); $this->info['background'] = new HTMLPurifier_AttrDef_CSS_Background($config); @@ -146,32 +146,32 @@ protected function doSetup($config) $this->info['border-bottom-width'] = $this->info['border-left-width'] = $this->info['border-right-width'] = new HTMLPurifier_AttrDef_CSS_Composite( - array( - new HTMLPurifier_AttrDef_Enum(array('thin', 'medium', 'thick')), + [ + new HTMLPurifier_AttrDef_Enum(['thin', 'medium', 'thick']), new HTMLPurifier_AttrDef_CSS_Length('0') //disallow negative - ) + ] ); $this->info['border-width'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_width); $this->info['letter-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite( - array( - new HTMLPurifier_AttrDef_Enum(array('normal')), + [ + new HTMLPurifier_AttrDef_Enum(['normal']), new HTMLPurifier_AttrDef_CSS_Length() - ) + ] ); $this->info['word-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite( - array( - new HTMLPurifier_AttrDef_Enum(array('normal')), + [ + new HTMLPurifier_AttrDef_Enum(['normal']), new HTMLPurifier_AttrDef_CSS_Length() - ) + ] ); $this->info['font-size'] = new HTMLPurifier_AttrDef_CSS_Composite( - array( + [ new HTMLPurifier_AttrDef_Enum( - array( + [ 'xx-small', 'x-small', 'small', @@ -181,20 +181,20 @@ protected function doSetup($config) 'xx-large', 'larger', 'smaller' - ) + ] ), new HTMLPurifier_AttrDef_CSS_Percentage(), new HTMLPurifier_AttrDef_CSS_Length() - ) + ] ); $this->info['line-height'] = new HTMLPurifier_AttrDef_CSS_Composite( - array( - new HTMLPurifier_AttrDef_Enum(array('normal')), + [ + new HTMLPurifier_AttrDef_Enum(['normal']), new HTMLPurifier_AttrDef_CSS_Number(true), // no negatives new HTMLPurifier_AttrDef_CSS_Length('0'), new HTMLPurifier_AttrDef_CSS_Percentage(true) - ) + ] ); $margin = @@ -202,11 +202,11 @@ protected function doSetup($config) $this->info['margin-bottom'] = $this->info['margin-left'] = $this->info['margin-right'] = new HTMLPurifier_AttrDef_CSS_Composite( - array( + [ new HTMLPurifier_AttrDef_CSS_Length(), new HTMLPurifier_AttrDef_CSS_Percentage(), - new HTMLPurifier_AttrDef_Enum(array('auto')) - ) + new HTMLPurifier_AttrDef_Enum(['auto']) + ] ); $this->info['margin'] = new HTMLPurifier_AttrDef_CSS_Multiple($margin); @@ -217,41 +217,41 @@ protected function doSetup($config) $this->info['padding-bottom'] = $this->info['padding-left'] = $this->info['padding-right'] = new HTMLPurifier_AttrDef_CSS_Composite( - array( + [ new HTMLPurifier_AttrDef_CSS_Length('0'), new HTMLPurifier_AttrDef_CSS_Percentage(true) - ) + ] ); $this->info['padding'] = new HTMLPurifier_AttrDef_CSS_Multiple($padding); $this->info['text-indent'] = new HTMLPurifier_AttrDef_CSS_Composite( - array( + [ new HTMLPurifier_AttrDef_CSS_Length(), new HTMLPurifier_AttrDef_CSS_Percentage() - ) + ] ); $trusted_wh = new HTMLPurifier_AttrDef_CSS_Composite( - array( + [ new HTMLPurifier_AttrDef_CSS_Length('0'), new HTMLPurifier_AttrDef_CSS_Percentage(true), - new HTMLPurifier_AttrDef_Enum(array('auto', 'initial', 'inherit')) - ) + new HTMLPurifier_AttrDef_Enum(['auto', 'initial', 'inherit']) + ] ); $trusted_min_wh = new HTMLPurifier_AttrDef_CSS_Composite( - array( + [ new HTMLPurifier_AttrDef_CSS_Length('0'), new HTMLPurifier_AttrDef_CSS_Percentage(true), - new HTMLPurifier_AttrDef_Enum(array('initial', 'inherit')) - ) + new HTMLPurifier_AttrDef_Enum(['initial', 'inherit']) + ] ); $trusted_max_wh = new HTMLPurifier_AttrDef_CSS_Composite( - array( + [ new HTMLPurifier_AttrDef_CSS_Length('0'), new HTMLPurifier_AttrDef_CSS_Percentage(true), - new HTMLPurifier_AttrDef_Enum(array('none', 'initial', 'inherit')) - ) + new HTMLPurifier_AttrDef_Enum(['none', 'initial', 'inherit']) + ] ); $max = $config->get('CSS.MaxImgLength'); @@ -263,10 +263,10 @@ protected function doSetup($config) 'img', // For img tags: new HTMLPurifier_AttrDef_CSS_Composite( - array( + [ new HTMLPurifier_AttrDef_CSS_Length('0', $max), - new HTMLPurifier_AttrDef_Enum(array('auto')) - ) + new HTMLPurifier_AttrDef_Enum(['auto']) + ] ), // For everyone else: $trusted_wh @@ -279,10 +279,10 @@ protected function doSetup($config) 'img', // For img tags: new HTMLPurifier_AttrDef_CSS_Composite( - array( + [ new HTMLPurifier_AttrDef_CSS_Length('0', $max), - new HTMLPurifier_AttrDef_Enum(array('initial', 'inherit')) - ) + new HTMLPurifier_AttrDef_Enum(['initial', 'inherit']) + ] ), // For everyone else: $trusted_min_wh @@ -295,22 +295,39 @@ protected function doSetup($config) 'img', // For img tags: new HTMLPurifier_AttrDef_CSS_Composite( - array( + [ new HTMLPurifier_AttrDef_CSS_Length('0', $max), - new HTMLPurifier_AttrDef_Enum(array('none', 'initial', 'inherit')) - ) + new HTMLPurifier_AttrDef_Enum(['none', 'initial', 'inherit']) + ] ), // For everyone else: $trusted_max_wh ); + // text-decoration and related shorthands $this->info['text-decoration'] = new HTMLPurifier_AttrDef_CSS_TextDecoration(); + $this->info['text-decoration-line'] = new HTMLPurifier_AttrDef_Enum( + ['none', 'underline', 'overline', 'line-through', 'initial', 'inherit'] + ); + + $this->info['text-decoration-style'] = new HTMLPurifier_AttrDef_Enum( + ['solid', 'double', 'dotted', 'dashed', 'wavy', 'initial', 'inherit'] + ); + + $this->info['text-decoration-color'] = new HTMLPurifier_AttrDef_CSS_Color(); + + $this->info['text-decoration-thickness'] = new HTMLPurifier_AttrDef_CSS_Composite([ + new HTMLPurifier_AttrDef_CSS_Length(), + new HTMLPurifier_AttrDef_CSS_Percentage(), + new HTMLPurifier_AttrDef_Enum(['auto', 'from-font', 'initial', 'inherit']) + ]); + $this->info['font-family'] = new HTMLPurifier_AttrDef_CSS_FontFamily(); // this could use specialized code $this->info['font-weight'] = new HTMLPurifier_AttrDef_Enum( - array( + [ 'normal', 'bold', 'bolder', @@ -324,7 +341,7 @@ protected function doSetup($config) '700', '800', '900' - ), + ], false ); @@ -340,21 +357,21 @@ protected function doSetup($config) $this->info['border-right'] = new HTMLPurifier_AttrDef_CSS_Border($config); $this->info['border-collapse'] = new HTMLPurifier_AttrDef_Enum( - array('collapse', 'separate') + ['collapse', 'separate'] ); $this->info['caption-side'] = new HTMLPurifier_AttrDef_Enum( - array('top', 'bottom') + ['top', 'bottom'] ); $this->info['table-layout'] = new HTMLPurifier_AttrDef_Enum( - array('auto', 'fixed') + ['auto', 'fixed'] ); $this->info['vertical-align'] = new HTMLPurifier_AttrDef_CSS_Composite( - array( + [ new HTMLPurifier_AttrDef_Enum( - array( + [ 'baseline', 'sub', 'super', @@ -363,11 +380,11 @@ protected function doSetup($config) 'middle', 'bottom', 'text-bottom' - ) + ] ), new HTMLPurifier_AttrDef_CSS_Length(), new HTMLPurifier_AttrDef_CSS_Percentage() - ) + ] ); $this->info['border-spacing'] = new HTMLPurifier_AttrDef_CSS_Multiple(new HTMLPurifier_AttrDef_CSS_Length(), 2); @@ -375,7 +392,7 @@ protected function doSetup($config) // These CSS properties don't work on many browsers, but we live // in THE FUTURE! $this->info['white-space'] = new HTMLPurifier_AttrDef_Enum( - array('nowrap', 'normal', 'pre', 'pre-wrap', 'pre-line') + ['nowrap', 'normal', 'pre', 'pre-wrap', 'pre-line'] ); if ($config->get('CSS.Proprietary')) { @@ -422,21 +439,21 @@ protected function doSetupProprietary($config) // more CSS3 $this->info['page-break-after'] = $this->info['page-break-before'] = new HTMLPurifier_AttrDef_Enum( - array( + [ 'auto', 'always', 'avoid', 'left', 'right' - ) + ] ); - $this->info['page-break-inside'] = new HTMLPurifier_AttrDef_Enum(array('auto', 'avoid')); + $this->info['page-break-inside'] = new HTMLPurifier_AttrDef_Enum(['auto', 'avoid']); $border_radius = new HTMLPurifier_AttrDef_CSS_Composite( - array( + [ new HTMLPurifier_AttrDef_CSS_Percentage(true), // disallow negative new HTMLPurifier_AttrDef_CSS_Length('0') // disallow negative - )); + ]); $this->info['border-top-left-radius'] = $this->info['border-top-right-radius'] = @@ -453,7 +470,7 @@ protected function doSetupProprietary($config) protected function doSetupTricky($config) { $this->info['display'] = new HTMLPurifier_AttrDef_Enum( - array( + [ 'inline', 'block', 'list-item', @@ -472,12 +489,12 @@ protected function doSetupTricky($config) 'table-cell', 'table-caption', 'none' - ) + ] ); $this->info['visibility'] = new HTMLPurifier_AttrDef_Enum( - array('visible', 'hidden', 'collapse') + ['visible', 'hidden', 'collapse'] ); - $this->info['overflow'] = new HTMLPurifier_AttrDef_Enum(array('visible', 'hidden', 'auto', 'scroll')); + $this->info['overflow'] = new HTMLPurifier_AttrDef_Enum(['visible', 'hidden', 'auto', 'scroll']); $this->info['opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); } @@ -487,23 +504,23 @@ protected function doSetupTricky($config) protected function doSetupTrusted($config) { $this->info['position'] = new HTMLPurifier_AttrDef_Enum( - array('static', 'relative', 'absolute', 'fixed') + ['static', 'relative', 'absolute', 'fixed'] ); $this->info['top'] = $this->info['left'] = $this->info['right'] = $this->info['bottom'] = new HTMLPurifier_AttrDef_CSS_Composite( - array( + [ new HTMLPurifier_AttrDef_CSS_Length(), new HTMLPurifier_AttrDef_CSS_Percentage(), - new HTMLPurifier_AttrDef_Enum(array('auto')), - ) + new HTMLPurifier_AttrDef_Enum(['auto']), + ] ); $this->info['z-index'] = new HTMLPurifier_AttrDef_CSS_Composite( - array( + [ new HTMLPurifier_AttrDef_Integer(), - new HTMLPurifier_AttrDef_Enum(array('auto')), - ) + new HTMLPurifier_AttrDef_Enum(['auto']), + ] ); } diff --git a/lib/htmlpurifier/HTMLPurifier/Config.php b/lib/htmlpurifier/HTMLPurifier/Config.php index 797d2687792d0..f7511ca4166ca 100644 --- a/lib/htmlpurifier/HTMLPurifier/Config.php +++ b/lib/htmlpurifier/HTMLPurifier/Config.php @@ -21,7 +21,7 @@ class HTMLPurifier_Config * HTML Purifier's version * @type string */ - public $version = '4.15.0'; + public $version = '4.17.0'; /** * Whether or not to automatically finalize diff --git a/lib/htmlpurifier/HTMLPurifier/DefinitionCache/Serializer.php b/lib/htmlpurifier/HTMLPurifier/DefinitionCache/Serializer.php index b82c6bb2013e6..bfad967fb177d 100644 --- a/lib/htmlpurifier/HTMLPurifier/DefinitionCache/Serializer.php +++ b/lib/htmlpurifier/HTMLPurifier/DefinitionCache/Serializer.php @@ -287,13 +287,14 @@ private function _testPermissions($dir, $chmod) } elseif (filegroup($dir) === posix_getgid()) { $chmod = $chmod | 0070; } else { - // PHP's probably running as nobody, so we'll - // need to give global permissions - $chmod = $chmod | 0777; + // PHP's probably running as nobody, it is + // not obvious how to fix this (777 is probably + // bad if you are multi-user), let the user figure it out + $chmod = null; } trigger_error( - 'Directory ' . $dir . ' not writable, ' . - 'please chmod to ' . decoct($chmod), + 'Directory ' . $dir . ' not writable. ' . + ($chmod === null ? '' : 'Please chmod to ' . decoct($chmod)), E_USER_WARNING ); } else { diff --git a/lib/htmlpurifier/HTMLPurifier/DefinitionCache/Serializer/README b/lib/htmlpurifier/HTMLPurifier/DefinitionCache/Serializer/README old mode 100644 new mode 100755 diff --git a/lib/htmlpurifier/HTMLPurifier/DefinitionCacheFactory.php b/lib/htmlpurifier/HTMLPurifier/DefinitionCacheFactory.php index fd1cc9be46a73..3a0f4616a9427 100644 --- a/lib/htmlpurifier/HTMLPurifier/DefinitionCacheFactory.php +++ b/lib/htmlpurifier/HTMLPurifier/DefinitionCacheFactory.php @@ -71,7 +71,7 @@ public function create($type, $config) return $this->caches[$method][$type]; } if (isset($this->implementations[$method]) && - class_exists($class = $this->implementations[$method], false)) { + class_exists($class = $this->implementations[$method])) { $cache = new $class($type); } else { if ($method != 'Serializer') { diff --git a/lib/htmlpurifier/HTMLPurifier/Filter/ExtractStyleBlocks.php b/lib/htmlpurifier/HTMLPurifier/Filter/ExtractStyleBlocks.php index 66f70b0fc00fd..6f8e7790ec3f4 100644 --- a/lib/htmlpurifier/HTMLPurifier/Filter/ExtractStyleBlocks.php +++ b/lib/htmlpurifier/HTMLPurifier/Filter/ExtractStyleBlocks.php @@ -146,175 +146,179 @@ public function cleanCSS($css, $config, $context) foreach ($this->_tidy->css as $k => $decls) { // $decls are all CSS declarations inside an @ selector $new_decls = array(); - foreach ($decls as $selector => $style) { - $selector = trim($selector); - if ($selector === '') { - continue; - } // should not happen - // Parse the selector - // Here is the relevant part of the CSS grammar: - // - // ruleset - // : selector [ ',' S* selector ]* '{' ... - // selector - // : simple_selector [ combinator selector | S+ [ combinator? selector ]? ]? - // combinator - // : '+' S* - // : '>' S* - // simple_selector - // : element_name [ HASH | class | attrib | pseudo ]* - // | [ HASH | class | attrib | pseudo ]+ - // element_name - // : IDENT | '*' - // ; - // class - // : '.' IDENT - // ; - // attrib - // : '[' S* IDENT S* [ [ '=' | INCLUDES | DASHMATCH ] S* - // [ IDENT | STRING ] S* ]? ']' - // ; - // pseudo - // : ':' [ IDENT | FUNCTION S* [IDENT S*]? ')' ] - // ; - // - // For reference, here are the relevant tokens: - // - // HASH #{name} - // IDENT {ident} - // INCLUDES == - // DASHMATCH |= - // STRING {string} - // FUNCTION {ident}\( - // - // And the lexical scanner tokens - // - // name {nmchar}+ - // nmchar [_a-z0-9-]|{nonascii}|{escape} - // nonascii [\240-\377] - // escape {unicode}|\\[^\r\n\f0-9a-f] - // unicode \\{h}}{1,6}(\r\n|[ \t\r\n\f])? - // ident -?{nmstart}{nmchar*} - // nmstart [_a-z]|{nonascii}|{escape} - // string {string1}|{string2} - // string1 \"([^\n\r\f\\"]|\\{nl}|{escape})*\" - // string2 \'([^\n\r\f\\"]|\\{nl}|{escape})*\' - // - // We'll implement a subset (in order to reduce attack - // surface); in particular: - // - // - No Unicode support - // - No escapes support - // - No string support (by proxy no attrib support) - // - element_name is matched against allowed - // elements (some people might find this - // annoying...) - // - Pseudo-elements one of :first-child, :link, - // :visited, :active, :hover, :focus + if (is_array($decls)) { + foreach ($decls as $selector => $style) { + $selector = trim($selector); + if ($selector === '') { + continue; + } // should not happen + // Parse the selector + // Here is the relevant part of the CSS grammar: + // + // ruleset + // : selector [ ',' S* selector ]* '{' ... + // selector + // : simple_selector [ combinator selector | S+ [ combinator? selector ]? ]? + // combinator + // : '+' S* + // : '>' S* + // simple_selector + // : element_name [ HASH | class | attrib | pseudo ]* + // | [ HASH | class | attrib | pseudo ]+ + // element_name + // : IDENT | '*' + // ; + // class + // : '.' IDENT + // ; + // attrib + // : '[' S* IDENT S* [ [ '=' | INCLUDES | DASHMATCH ] S* + // [ IDENT | STRING ] S* ]? ']' + // ; + // pseudo + // : ':' [ IDENT | FUNCTION S* [IDENT S*]? ')' ] + // ; + // + // For reference, here are the relevant tokens: + // + // HASH #{name} + // IDENT {ident} + // INCLUDES == + // DASHMATCH |= + // STRING {string} + // FUNCTION {ident}\( + // + // And the lexical scanner tokens + // + // name {nmchar}+ + // nmchar [_a-z0-9-]|{nonascii}|{escape} + // nonascii [\240-\377] + // escape {unicode}|\\[^\r\n\f0-9a-f] + // unicode \\{h}}{1,6}(\r\n|[ \t\r\n\f])? + // ident -?{nmstart}{nmchar*} + // nmstart [_a-z]|{nonascii}|{escape} + // string {string1}|{string2} + // string1 \"([^\n\r\f\\"]|\\{nl}|{escape})*\" + // string2 \'([^\n\r\f\\"]|\\{nl}|{escape})*\' + // + // We'll implement a subset (in order to reduce attack + // surface); in particular: + // + // - No Unicode support + // - No escapes support + // - No string support (by proxy no attrib support) + // - element_name is matched against allowed + // elements (some people might find this + // annoying...) + // - Pseudo-elements one of :first-child, :link, + // :visited, :active, :hover, :focus - // handle ruleset - $selectors = array_map('trim', explode(',', $selector)); - $new_selectors = array(); - foreach ($selectors as $sel) { - // split on +, > and spaces - $basic_selectors = preg_split('/\s*([+> ])\s*/', $sel, -1, PREG_SPLIT_DELIM_CAPTURE); - // even indices are chunks, odd indices are - // delimiters - $nsel = null; - $delim = null; // guaranteed to be non-null after - // two loop iterations - for ($i = 0, $c = count($basic_selectors); $i < $c; $i++) { - $x = $basic_selectors[$i]; - if ($i % 2) { - // delimiter - if ($x === ' ') { - $delim = ' '; - } else { - $delim = ' ' . $x . ' '; - } - } else { - // simple selector - $components = preg_split('/([#.:])/', $x, -1, PREG_SPLIT_DELIM_CAPTURE); - $sdelim = null; - $nx = null; - for ($j = 0, $cc = count($components); $j < $cc; $j++) { - $y = $components[$j]; - if ($j === 0) { - if ($y === '*' || isset($html_definition->info[$y = strtolower($y)])) { - $nx = $y; - } else { - // $nx stays null; this matters - // if we don't manage to find - // any valid selector content, - // in which case we ignore the - // outer $delim - } - } elseif ($j % 2) { - // set delimiter - $sdelim = $y; + // handle ruleset + $selectors = array_map('trim', explode(',', $selector)); + $new_selectors = array(); + foreach ($selectors as $sel) { + // split on +, > and spaces + $basic_selectors = preg_split('/\s*([+> ])\s*/', $sel, -1, PREG_SPLIT_DELIM_CAPTURE); + // even indices are chunks, odd indices are + // delimiters + $nsel = null; + $delim = null; // guaranteed to be non-null after + // two loop iterations + for ($i = 0, $c = count($basic_selectors); $i < $c; $i++) { + $x = $basic_selectors[$i]; + if ($i % 2) { + // delimiter + if ($x === ' ') { + $delim = ' '; } else { - $attrdef = null; - if ($sdelim === '#') { - $attrdef = $this->_id_attrdef; - } elseif ($sdelim === '.') { - $attrdef = $this->_class_attrdef; - } elseif ($sdelim === ':') { - $attrdef = $this->_enum_attrdef; + $delim = ' ' . $x . ' '; + } + } else { + // simple selector + $components = preg_split('/([#.:])/', $x, -1, PREG_SPLIT_DELIM_CAPTURE); + $sdelim = null; + $nx = null; + for ($j = 0, $cc = count($components); $j < $cc; $j++) { + $y = $components[$j]; + if ($j === 0) { + if ($y === '*' || isset($html_definition->info[$y = strtolower($y)])) { + $nx = $y; + } else { + // $nx stays null; this matters + // if we don't manage to find + // any valid selector content, + // in which case we ignore the + // outer $delim + } + } elseif ($j % 2) { + // set delimiter + $sdelim = $y; } else { - throw new HTMLPurifier_Exception('broken invariant sdelim and preg_split'); - } - $r = $attrdef->validate($y, $config, $context); - if ($r !== false) { - if ($r !== true) { - $y = $r; + $attrdef = null; + if ($sdelim === '#') { + $attrdef = $this->_id_attrdef; + } elseif ($sdelim === '.') { + $attrdef = $this->_class_attrdef; + } elseif ($sdelim === ':') { + $attrdef = $this->_enum_attrdef; + } else { + throw new HTMLPurifier_Exception('broken invariant sdelim and preg_split'); } - if ($nx === null) { - $nx = ''; + $r = $attrdef->validate($y, $config, $context); + if ($r !== false) { + if ($r !== true) { + $y = $r; + } + if ($nx === null) { + $nx = ''; + } + $nx .= $sdelim . $y; } - $nx .= $sdelim . $y; } } - } - if ($nx !== null) { - if ($nsel === null) { - $nsel = $nx; + if ($nx !== null) { + if ($nsel === null) { + $nsel = $nx; + } else { + $nsel .= $delim . $nx; + } } else { - $nsel .= $delim . $nx; + // delimiters to the left of invalid + // basic selector ignored } - } else { - // delimiters to the left of invalid - // basic selector ignored } } - } - if ($nsel !== null) { - if (!empty($scopes)) { - foreach ($scopes as $s) { - $new_selectors[] = "$s $nsel"; + if ($nsel !== null) { + if (!empty($scopes)) { + foreach ($scopes as $s) { + $new_selectors[] = "$s $nsel"; + } + } else { + $new_selectors[] = $nsel; } - } else { - $new_selectors[] = $nsel; } } - } - if (empty($new_selectors)) { - continue; - } - $selector = implode(', ', $new_selectors); - foreach ($style as $name => $value) { - if (!isset($css_definition->info[$name])) { - unset($style[$name]); + if (empty($new_selectors)) { continue; } - $def = $css_definition->info[$name]; - $ret = $def->validate($value, $config, $context); - if ($ret === false) { - unset($style[$name]); - } else { - $style[$name] = $ret; + $selector = implode(', ', $new_selectors); + foreach ($style as $name => $value) { + if (!isset($css_definition->info[$name])) { + unset($style[$name]); + continue; + } + $def = $css_definition->info[$name]; + $ret = $def->validate($value, $config, $context); + if ($ret === false) { + unset($style[$name]); + } else { + $style[$name] = $ret; + } } + $new_decls[$selector] = $style; } - $new_decls[$selector] = $style; + } else { + continue; } $new_css[$k] = $new_decls; } diff --git a/lib/htmlpurifier/HTMLPurifier/HTMLModule/Tidy.php b/lib/htmlpurifier/HTMLPurifier/HTMLModule/Tidy.php index 12173ba700a7a..76fd93a6cbf80 100644 --- a/lib/htmlpurifier/HTMLPurifier/HTMLModule/Tidy.php +++ b/lib/htmlpurifier/HTMLPurifier/HTMLModule/Tidy.php @@ -221,6 +221,7 @@ public function getFixType($name) */ public function makeFixes() { + return array(); } } diff --git a/lib/htmlpurifier/HTMLPurifier/LanguageFactory.php b/lib/htmlpurifier/HTMLPurifier/LanguageFactory.php index 4e35272d8732f..16a4f6932d4ec 100644 --- a/lib/htmlpurifier/HTMLPurifier/LanguageFactory.php +++ b/lib/htmlpurifier/HTMLPurifier/LanguageFactory.php @@ -109,7 +109,7 @@ public function create($config, $context, $code = false) } else { $class = 'HTMLPurifier_Language_' . $pcode; $file = $this->dir . '/Language/classes/' . $code . '.php'; - if (file_exists($file) || class_exists($class, false)) { + if (file_exists($file) || class_exists($class)) { $lang = new $class($config, $context); } else { // Go fallback diff --git a/lib/htmlpurifier/HTMLPurifier/Lexer.php b/lib/htmlpurifier/HTMLPurifier/Lexer.php index c21f364919c16..1f552a17a99b5 100644 --- a/lib/htmlpurifier/HTMLPurifier/Lexer.php +++ b/lib/htmlpurifier/HTMLPurifier/Lexer.php @@ -101,7 +101,7 @@ public static function create($config) break; } - if (class_exists('DOMDocument', false) && + if (class_exists('DOMDocument') && method_exists('DOMDocument', 'loadHTML') && !extension_loaded('domxml') ) { diff --git a/lib/htmlpurifier/HTMLPurifier/Lexer/DOMLex.php b/lib/htmlpurifier/HTMLPurifier/Lexer/DOMLex.php index ca5f25b849fdb..5e8104be91166 100644 --- a/lib/htmlpurifier/HTMLPurifier/Lexer/DOMLex.php +++ b/lib/htmlpurifier/HTMLPurifier/Lexer/DOMLex.php @@ -104,7 +104,6 @@ public function tokenizeHTML($html, $config, $context) * To iterate is human, to recurse divine - L. Peter Deutsch * @param DOMNode $node DOMNode to be tokenized. * @param HTMLPurifier_Token[] $tokens Array-list of already tokenized tokens. - * @return HTMLPurifier_Token of node appended to previously passed tokens. */ protected function tokenizeDOM($node, &$tokens, $config) { diff --git a/lib/htmlpurifier/HTMLPurifier/URIScheme/tel.php b/lib/htmlpurifier/HTMLPurifier/URIScheme/tel.php index 8cd1933527bdd..dfad8efcf9d26 100644 --- a/lib/htmlpurifier/HTMLPurifier/URIScheme/tel.php +++ b/lib/htmlpurifier/HTMLPurifier/URIScheme/tel.php @@ -33,11 +33,11 @@ public function doValidate(&$uri, $config, $context) $uri->host = null; $uri->port = null; - // Delete all non-numeric characters, non-x characters + // Delete all non-numeric characters, commas, and non-x characters // from phone number, EXCEPT for a leading plus sign. - $uri->path = preg_replace('/(?!^\+)[^\dx]/', '', + $uri->path = preg_replace('/(?!^\+)[^\dx,]/', '', // Normalize e(x)tension to lower-case - str_replace('X', 'x', $uri->path)); + str_replace('X', 'x', rawurldecode($uri->path))); return true; } diff --git a/lib/htmlpurifier/HTMLPurifier/UnitConverter.php b/lib/htmlpurifier/HTMLPurifier/UnitConverter.php index 166f3bf306b9f..b5a1eab5cabd9 100644 --- a/lib/htmlpurifier/HTMLPurifier/UnitConverter.php +++ b/lib/htmlpurifier/HTMLPurifier/UnitConverter.php @@ -261,7 +261,7 @@ private function div($s1, $s2, $scale) */ private function round($n, $sigfigs) { - $new_log = (int)floor(log(abs($n), 10)); // Number of digits left of decimal - 1 + $new_log = (int)floor(log(abs((float)$n), 10)); // Number of digits left of decimal - 1 $rp = $sigfigs - $new_log - 1; // Number of decimal places needed $neg = $n < 0 ? '-' : ''; // Negative sign if ($this->bcmath) { @@ -276,7 +276,7 @@ private function round($n, $sigfigs) } return $n; } else { - return $this->scale(round($n, $sigfigs - $new_log - 1), $rp + 1); + return $this->scale(round((float)$n, $sigfigs - $new_log - 1), $rp + 1); } } @@ -300,7 +300,7 @@ private function scale($r, $scale) // Now we return it, truncating the zero that was rounded off. return substr($precise, 0, -1) . str_repeat('0', -$scale + 1); } - return sprintf('%.' . $scale . 'f', (float)$r); + return number_format((float)$r, $scale, '.', ''); } } From 2292a503563a23c473253f5563917a71c78aae2c Mon Sep 17 00:00:00 2001 From: Laurent David Date: Mon, 18 Mar 2024 19:35:55 +0100 Subject: [PATCH 12/51] MDL-80636 lib: Upgrade HTML purifier moodle files * Update thirdpartylibs.xml and readme_moodle.txt documentation --- lib/htmlpurifier/readme_moodle.txt | 4 ---- lib/thirdpartylibs.xml | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/htmlpurifier/readme_moodle.txt b/lib/htmlpurifier/readme_moodle.txt index d58010fb93bd5..59d0138a794a2 100644 --- a/lib/htmlpurifier/readme_moodle.txt +++ b/lib/htmlpurifier/readme_moodle.txt @@ -14,7 +14,3 @@ Description of HTML Purifier library import into Moodle HTMLPurifier.path.php * add locallib.php with Moodle specific extensions to /lib/htmlpurifier/ * add this readme_moodle.txt to /lib/htmlpurifier/ - -Local changes: -* 2023-06-06 Applied patch https://github.com/ezyang/htmlpurifier/pull/346 to avoid PHP 8.2 deprecations. - See MDL-78143 for more details. \ No newline at end of file diff --git a/lib/thirdpartylibs.xml b/lib/thirdpartylibs.xml index 79e11d674b371..7fea8373d4cd6 100644 --- a/lib/thirdpartylibs.xml +++ b/lib/thirdpartylibs.xml @@ -73,7 +73,7 @@ htmlpurifier HTML Purifier Filters HTML. - 4.16.0 + 4.17.0 LGPL 2.1+ https://github.com/ezyang/htmlpurifier From 40b8c75967f89fc6c99046dc31971b61260dfcaa Mon Sep 17 00:00:00 2001 From: Brendan Heywood Date: Thu, 8 Feb 2024 12:27:38 +1100 Subject: [PATCH 13/51] MDL-80290 task: Task autolink urls and emails in mtrace --- admin/tool/task/lib.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/admin/tool/task/lib.php b/admin/tool/task/lib.php index e6c45e6ed1a5f..655855367c373 100644 --- a/admin/tool/task/lib.php +++ b/admin/tool/task/lib.php @@ -46,5 +46,20 @@ function tool_task_status_checks(): array { */ function tool_task_mtrace_wrapper(string $message, string $eol): void { $message = s($message); + + // We autolink urls and emails here but can't use format_text as it does + // more than we need and has side effects which are not useful in this context. + $urlpattern = '/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/'; + $message = preg_replace_callback($urlpattern, function($matches) { + $url = $matches[0]; + return html_writer::link($url, $url, ['target' => '_blank']); + }, $message); + + $emailpattern = '/[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}/'; + $message = preg_replace_callback($emailpattern, function($matches) { + $email = $matches[0]; + return html_writer::link('mailto:' . $email, $email); + }, $message); + echo $message . $eol; } From 51a752fae27c8b4d65f74d1fa5ca1a63e747dbf5 Mon Sep 17 00:00:00 2001 From: Brendan Heywood Date: Thu, 8 Feb 2024 12:27:57 +1100 Subject: [PATCH 14/51] MDL-80290 task: Refactor styles to be consistent --- admin/tool/task/run_adhoctasks.php | 9 +++++---- admin/tool/task/schedule_task.php | 3 +-- admin/tool/task/styles.css | 11 +++++++++++ 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/admin/tool/task/run_adhoctasks.php b/admin/tool/task/run_adhoctasks.php index b1b831c3368cf..7912f4b1beb35 100644 --- a/admin/tool/task/run_adhoctasks.php +++ b/admin/tool/task/run_adhoctasks.php @@ -115,6 +115,8 @@ function ($t) use ($now) { require_sesskey(); \core\session\manager::write_close(); +echo $OUTPUT->footer(); +echo $OUTPUT->select_element_for_append(); // Prepare to handle output via mtrace. require_once("{$CFG->dirroot}/{$CFG->admin}/tool/task/lib.php"); @@ -124,7 +126,7 @@ function ($t) use ($now) { if ($taskid) { $repeat = $DB->get_record('task_adhoc', ['id' => $taskid]); - echo html_writer::start_tag('pre'); + echo html_writer::start_tag('pre', ['class' => 'task-output']); \core\task\manager::run_adhoc_from_cli($taskid); echo html_writer::end_tag('pre'); } else { @@ -133,13 +135,13 @@ function ($t) use ($now) { // Run failed first (if any). We have to run them separately anyway, // because faildelay is observed if failed flag is not true. echo html_writer::tag('p', get_string('runningfailedtasks', 'tool_task'), ['class' => 'lead']); - echo html_writer::start_tag('pre'); + echo html_writer::start_tag('pre', ['class' => 'task-output']); \core\task\manager::run_all_adhoc_from_cli(true, $classname); echo html_writer::end_tag('pre'); if (!$failedonly) { echo html_writer::tag('p', get_string('runningalltasks', 'tool_task'), ['class' => 'lead']); - echo html_writer::start_tag('pre'); + echo html_writer::start_tag('pre', ['class' => 'task-output']); \core\task\manager::run_all_adhoc_from_cli(false, $classname); echo html_writer::end_tag('pre'); } @@ -161,4 +163,3 @@ function ($t) use ($now) { ) ); -echo $OUTPUT->footer(); diff --git a/admin/tool/task/schedule_task.php b/admin/tool/task/schedule_task.php index 654a411f5a04c..e753c145f092e 100644 --- a/admin/tool/task/schedule_task.php +++ b/admin/tool/task/schedule_task.php @@ -88,9 +88,8 @@ echo $OUTPUT->select_element_for_append(); // Prepare to handle output via mtrace. -echo html_writer::start_tag('pre', ['style' => 'color: #fff; background: #333; padding: 1em; min-height: 24lh']); - require_once("{$CFG->dirroot}/{$CFG->admin}/tool/task/lib.php"); +echo html_writer::start_tag('pre', ['class' => 'task-output', 'style' => 'min-height: 24lh']); $CFG->mtrace_wrapper = 'tool_task_mtrace_wrapper'; // Run the specified task (this will output an error if it doesn't exist). diff --git a/admin/tool/task/styles.css b/admin/tool/task/styles.css index f297fd6afaf11..6b118e831ddaa 100644 --- a/admin/tool/task/styles.css +++ b/admin/tool/task/styles.css @@ -15,3 +15,14 @@ #page-admin-tool-task-scheduledtasks .task-clearfaildelay { font-size: 0.75em; } + +.path-admin-tool-task .task-output { + color: #fff; + background: #333; + padding: 1em; + + a { + color: #fff; + text-decoration: underline; + } +} From b73a685ef72d4e5fc2f3ed18219fb8a647cd9ca4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikel=20Mart=C3=ADn?= Date: Fri, 1 Mar 2024 12:29:08 +0100 Subject: [PATCH 15/51] MDL-81050 output: Add new 'attributes' parameter to container --- lib/outputrenderers.php | 12 +++++++----- lib/upgrade.txt | 2 ++ mod/wiki/pagelib.php | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/outputrenderers.php b/lib/outputrenderers.php index 5852068f61b3a..93519e37dda06 100644 --- a/lib/outputrenderers.php +++ b/lib/outputrenderers.php @@ -3404,10 +3404,11 @@ public function sr_text(string $contents): string { * @param string $contents The contents of the box * @param string $classes A space-separated list of CSS classes * @param string $id An optional ID + * @param array $attributes Optional other attributes as array * @return string the HTML to output. */ - public function container($contents, $classes = null, $id = null) { - return $this->container_start($classes, $id) . $contents . $this->container_end(); + public function container($contents, $classes = null, $id = null, $attributes = []) { + return $this->container_start($classes, $id, $attributes) . $contents . $this->container_end(); } /** @@ -3415,12 +3416,13 @@ public function container($contents, $classes = null, $id = null) { * * @param string $classes A space-separated list of CSS classes * @param string $id An optional ID + * @param array $attributes Optional other attributes as array * @return string the HTML to output. */ - public function container_start($classes = null, $id = null) { + public function container_start($classes = null, $id = null, $attributes = []) { $this->opencontainers->push('container', html_writer::end_tag('div')); - return html_writer::start_tag('div', array('id' => $id, - 'class' => renderer_base::prepare_classes($classes))); + $attributes = array_merge(['id' => $id, 'class' => renderer_base::prepare_classes($classes)], $attributes); + return html_writer::start_tag('div', $attributes); } /** diff --git a/lib/upgrade.txt b/lib/upgrade.txt index 1c94bf2a7dbd1..3d02d603ede86 100644 --- a/lib/upgrade.txt +++ b/lib/upgrade.txt @@ -90,6 +90,8 @@ information provided here is intended especially for developers. - `question_category_options` - `question_add_context_in_key` - `question_fix_top_names` +* Added a new parameter to `core_renderer::container` and `core_renderer::container_start` to allow for the addition of + custom attributes. === 4.3 === diff --git a/mod/wiki/pagelib.php b/mod/wiki/pagelib.php index d87eb6e17dd1c..11c1887d57a8b 100644 --- a/mod/wiki/pagelib.php +++ b/mod/wiki/pagelib.php @@ -2216,7 +2216,7 @@ private function print_version_view() { $pageversion->content = file_rewrite_pluginfile_urls($pageversion->content, 'pluginfile.php', $this->modcontext->id, 'mod_wiki', 'attachments', $this->subwiki->id); $parseroutput = wiki_parse_content($pageversion->contentformat, $pageversion->content, $options); - $content = $OUTPUT->container(format_text($parseroutput['parsed_text'], FORMAT_HTML, array('overflowdiv'=>true)), false, '', '', true); + $content = $OUTPUT->container(format_text($parseroutput['parsed_text'], FORMAT_HTML, ['overflowdiv' => true])); echo $OUTPUT->box($content, 'generalbox wiki_contentbox'); } else { From 34ab1582cbb50a7cc76a09b7c5e6ee99835164d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikel=20Mart=C3=ADn?= Date: Mon, 4 Mar 2024 10:11:39 +0100 Subject: [PATCH 16/51] MDL-81050 course: Fix section renaming in section page Fix section page heading title update when the section name has been modified using inplace editable. --- course/amd/build/actions.min.js | 2 +- course/amd/build/actions.min.js.map | 2 +- course/amd/src/actions.js | 2 +- course/section.php | 5 ++++- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/course/amd/build/actions.min.js b/course/amd/build/actions.min.js index 83f0b11c33181..cf01b736161a0 100644 --- a/course/amd/build/actions.min.js +++ b/course/amd/build/actions.min.js @@ -6,6 +6,6 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @since 3.3 */ -define("core_course/actions",["jquery","core/ajax","core/templates","core/notification","core/str","core/url","core/yui","core/modal_copy_to_clipboard","core/modal_save_cancel","core/modal_events","core/key_codes","core/log","core_courseformat/courseeditor","core/event_dispatcher","core_course/events"],(function($,ajax,templates,notification,str,url,Y,ModalCopyToClipboard,ModalSaveCancel,ModalEvents,KeyCodes,log,editor,EventDispatcher,CourseEvents){const componentActions=["moveSection","moveCm","addSection","deleteSection","cmDelete","cmDuplicate","sectionHide","sectionShow","cmHide","cmShow","cmStealth","sectionHighlight","sectionUnhighlight","cmMoveRight","cmMoveLeft","cmNoGroups","cmVisibleGroups","cmSeparateGroups"],courseeditor=editor.getCurrentCourseEditor();let formatname;var CSS_EDITINPROGRESS="editinprogress",CSS_EDITINGMOVE="editing_move",SELECTOR={ACTIVITYLI:"li.activity",ACTIONAREA:".actions",ACTIVITYACTION:"a.cm-edit-action",MENU:".moodle-actionmenu[data-enhance=moodle-core-actionmenu]",TOGGLE:".toggle-display,.dropdown-toggle",SECTIONLI:"li.section",SECTIONACTIONMENU:".section_action_menu",SECTIONITEM:'[data-for="section_title"]',ADDSECTIONS:".changenumsections [data-add-sections]",SECTIONBADGES:'[data-region="sectionbadges"]'};Y.use("moodle-course-coursebase",(function(){var courseformatselector=M.course.format.get_section_selector();courseformatselector&&(SELECTOR.SECTIONLI=courseformatselector)}));const dispatchEvent=function(eventName,detail,container,options){return container instanceof Element||void 0===container.get||(container=container.get(0)),EventDispatcher.dispatchEvent(eventName,detail,container,options)};var getModuleId=function(element){const item=element.get(0);if(item.dataset.id)return item.dataset.id;let id;return Y.use("moodle-course-util",(function(Y){id=Y.Moodle.core_course.util.cm.getId(Y.Node(item))})),id},addActivitySpinner=function(activity){activity.addClass(CSS_EDITINPROGRESS);var actionarea=activity.find(SELECTOR.ACTIONAREA).get(0);if(actionarea){var spinner=M.util.add_spinner(Y,Y.Node(actionarea));return spinner.show(),void 0!==activity.data("id")&&courseeditor.dispatch("cmLock",[activity.data("id")],!0),spinner}return null},addSectionSpinner=function(sectionelement){sectionelement.addClass(CSS_EDITINPROGRESS);var actionarea=sectionelement.find(SELECTOR.SECTIONACTIONMENU).get(0);if(actionarea){var spinner=M.util.add_spinner(Y,Y.Node(actionarea));return spinner.show(),void 0!==sectionelement.data("id")&&courseeditor.dispatch("sectionLock",[sectionelement.data("id")],!0),spinner}return null},addSectionLightbox=function(sectionelement){const item=sectionelement.get(0);var lightbox=M.util.add_lightbox(Y,Y.Node(item));return"section"==item.dataset.for&&item.dataset.id&&(courseeditor.dispatch("sectionLock",[item.dataset.id],!0),lightbox.setAttribute("data-state","section"),lightbox.setAttribute("data-state-id",item.dataset.id)),lightbox.show(),lightbox},removeSpinner=function(element,spinner,delay){window.setTimeout((function(){if(element.removeClass(CSS_EDITINPROGRESS),spinner&&spinner.hide(),void 0!==element.data("id")){const mutation="section"===element.data("for")?"sectionLock":"cmLock";courseeditor.dispatch(mutation,[element.data("id")],!1)}}),delay)},removeLightbox=function(lightbox,delay){lightbox&&window.setTimeout((function(){lightbox.hide(),lightbox.getAttribute("data-state")&&courseeditor.dispatch("".concat(lightbox.getAttribute("data-state"),"Lock"),[lightbox.getAttribute("data-state-id")],!1)}),delay)},initActionMenu=function(elementid){Y.use("moodle-course-coursebase",(function(){M.course.coursebase.invoke_function("setup_for_resource","#"+elementid)})),M.core.actionmenu&&M.core.actionmenu.newDOMNode&&M.core.actionmenu.newDOMNode(Y.one("#"+elementid))},editModule=function(moduleElement,cmid,target){var lightbox,action=target.attr("data-action"),spinner=addActivitySpinner(moduleElement),promises=ajax.call([{methodname:"core_course_edit_module",args:{id:cmid,action:action,sectionreturn:target.attr("data-sectionreturn")?target.attr("data-sectionreturn"):null}}],!0);"duplicate"===action&&(lightbox=addSectionLightbox(target.closest(SELECTOR.SECTIONLI))),$.when.apply($,promises).done((function(data){var mainElement,tabables,isInside,foundElement,elementToFocus=(mainElement=moduleElement,tabables=$("a:visible"),isInside=!1,foundElement=null,tabables.each((function(){if($.contains(mainElement[0],this))isInside=!0;else if(isInside)return foundElement=this,!1;return!0})),foundElement);moduleElement.replaceWith(data);let affectedids=[];$("
"+data+"
").find(SELECTOR.ACTIVITYLI).each((function(index){initActionMenu($(this).attr("id")),0===index&&(!function(elementId,action){var mainelement=$("#"+elementId),selector="[data-action="+action+"]";"groupsseparate"!==action&&"groupsvisible"!==action&&"groupsnone"!==action||(selector="[data-action=groupsseparate],[data-action=groupsvisible],[data-action=groupsnone]"),mainelement.find(selector).is(":visible")?mainelement.find(selector).focus():mainelement.find(SELECTOR.MENU).find(SELECTOR.TOGGLE).focus()}($(this).attr("id"),action),elementToFocus=null),affectedids.push(getModuleId($(this)))})),elementToFocus&&elementToFocus.focus(),removeSpinner(moduleElement,spinner,400),removeLightbox(lightbox,400),moduleElement.trigger($.Event("coursemoduleedited",{ajaxreturn:data,action:action})),courseeditor.dispatch("legacyActivityAction",action,cmid,affectedids)})).fail((function(ex){removeSpinner(moduleElement,spinner),removeLightbox(lightbox);var e=$.Event("coursemoduleeditfailed",{exception:ex,action:action});moduleElement.trigger(e),e.isDefaultPrevented()||notification.exception(ex)}))},refreshModule=function(element,cmid,sectionreturn){void 0===sectionreturn&&(sectionreturn=courseeditor.sectionReturn);const activityElement=$(element);var spinner=addActivitySpinner(activityElement),promises=ajax.call([{methodname:"core_course_get_module",args:{id:cmid,sectionreturn:sectionreturn}}],!0);return new Promise(((resolve,reject)=>{$.when.apply($,promises).done((function(data){removeSpinner(activityElement,spinner,400),replaceActivityHtmlWith(data),resolve(data)})).fail((function(){removeSpinner(activityElement,spinner),reject()}))}))},confirmDeleteModule=function(mainelement,onconfirm){var modtypename=mainelement.attr("class").match(/modtype_([^\s]*)/)[1],modulename=function(element){var name;Y.use("moodle-course-util",(function(Y){name=Y.Moodle.core_course.util.cm.getName(Y.Node(element.get(0)))}));const state=courseeditor.state,cmid=getModuleId(element);var _state$cm$get;return!name&&state&&cmid&&(name=null===(_state$cm$get=state.cm.get(cmid))||void 0===_state$cm$get?void 0:_state$cm$get.name),name}(mainelement);str.get_string("pluginname",modtypename).done((function(pluginname){var plugindata={type:pluginname,name:modulename};str.get_strings([{key:"confirm",component:"core"},{key:null===modulename?"deletechecktype":"deletechecktypename",param:plugindata},{key:"yes"},{key:"no"}]).done((function(s){notification.confirm(s[0],s[1],s[2],s[3],onconfirm)}))}))},replaceActionItem=function(actionitem,image,stringname,stringcomponent,newaction){var stringRequests=[{key:stringname,component:stringcomponent}];return str.get_strings(stringRequests).then((function(strings){return actionitem.find("span.menu-action-text").html(strings[0]),templates.renderPix(image,"core")})).then((function(pixhtml){actionitem.find(".icon").replaceWith(pixhtml),actionitem.attr("data-action",newaction)})).catch(notification.exception)},defaultEditSectionHandler=function(sectionElement,actionItem,data,courseformat,sectionid){var action=actionItem.attr("data-action");if("hide"===action||"show"===action){if("hide"===action?(sectionElement.addClass("hidden"),setSectionBadge(sectionElement[0],"hiddenfromstudents",!0,!1),replaceActionItem(actionItem,"i/show","showfromothers","format_"+courseformat,"show")):(setSectionBadge(sectionElement[0],"hiddenfromstudents",!1,!1),sectionElement.removeClass("hidden"),replaceActionItem(actionItem,"i/hide","hidefromothers","format_"+courseformat,"hide")),void 0!==data.modules)for(var i in data.modules)replaceActivityHtmlWith(data.modules[i]);void 0!==data.section_availability&§ionElement.find(".section_availability").first().replaceWith(data.section_availability);void 0!==courseeditor.state.section.get(sectionid)&&courseeditor.dispatch("sectionState",[sectionid])}else if("setmarker"===action){var oldmarker=$(SELECTOR.SECTIONLI+".current"),oldActionItem=oldmarker.find(SELECTOR.SECTIONACTIONMENU+" a[data-action=removemarker]");oldmarker.removeClass("current"),replaceActionItem(oldActionItem,"i/marker","highlight","core","setmarker"),sectionElement.addClass("current"),replaceActionItem(actionItem,"i/marked","highlightoff","core","removemarker"),courseeditor.dispatch("legacySectionAction",action,sectionid),setSectionBadge(sectionElement[0],"iscurrent",!0,!0)}else"removemarker"===action&&(sectionElement.removeClass("current"),replaceActionItem(actionItem,"i/marker","highlight","core","setmarker"),courseeditor.dispatch("legacySectionAction",action,sectionid),setSectionBadge(sectionElement[0],"iscurrent",!1,!0))};var replaceActivityHtmlWith=function(activityHTML){$("
"+activityHTML+"
").find(SELECTOR.ACTIVITYLI).each((function(){var id=$(this).attr("id");let focusedPath=function(id){const element=document.getElementById(id);if(element&&element.contains(document.activeElement))return element.querySelector(SELECTOR.ACTIONAREA).contains(document.activeElement)?"".concat(SELECTOR.ACTIONAREA,' [tabindex="0"]'):document.activeElement.id?"#".concat(document.activeElement.id):void 0}(id);if($(SELECTOR.ACTIVITYLI+"#"+id).replaceWith(activityHTML),initActionMenu(id),focusedPath){var _newItem$querySelecto;null===(_newItem$querySelecto=document.getElementById(id).querySelector(focusedPath))||void 0===_newItem$querySelecto||_newItem$querySelecto.focus()}}))},editSection=function(sectionElement,sectionid,target,courseformat){var action=target.attr("data-action"),sectionreturn=target.attr("data-sectionreturn")?target.attr("data-sectionreturn"):null;if(courseeditor.supportComponents&&componentActions.includes(action))return!1;var spinner=addSectionSpinner(sectionElement),promises=ajax.call([{methodname:"core_course_edit_section",args:{id:sectionid,action:action,sectionreturn:sectionreturn}}],!0),lightbox=addSectionLightbox(sectionElement);return $.when.apply($,promises).done((function(dataencoded){var data=$.parseJSON(dataencoded);removeSpinner(sectionElement,spinner),removeLightbox(lightbox),sectionElement.find(SELECTOR.SECTIONACTIONMENU).find(SELECTOR.TOGGLE).focus();var e=$.Event("coursesectionedited",{ajaxreturn:data,action:action});sectionElement.trigger(e),e.isDefaultPrevented()||defaultEditSectionHandler(sectionElement,target,data,courseformat,sectionid)})).fail((function(ex){removeSpinner(sectionElement,spinner),removeLightbox(lightbox);var e=$.Event("coursesectioneditfailed",{exception:ex,action:action});sectionElement.trigger(e),e.isDefaultPrevented()||notification.exception(ex)})),!0},setSectionBadge=function(sectionElement,badgetype,add,removeOther){const sectionbadges=sectionElement.querySelector(SELECTOR.SECTIONBADGES);if(!sectionbadges)return;const badge=sectionbadges.querySelector('[data-type="'+badgetype+'"]');badge&&(add?(removeOther&&document.querySelectorAll('[data-type="'+badgetype+'"]').forEach((b=>{b.classList.add("d-none")})),badge.classList.remove("d-none")):badge.classList.add("d-none"))};return Y.use("moodle-course-coursebase",(function(){M.course.coursebase.register_module({set_visibility_resource_ui:function(args){var mainelement=$(args.element.getDOMNode()),cmid=getModuleId(mainelement);if(cmid){var sectionreturn=mainelement.find("."+CSS_EDITINGMOVE).attr("data-sectionreturn");refreshModule(mainelement,cmid,sectionreturn)}},updateMovedCmState:params=>{const cm=courseeditor.state.cm.get(params.cmid);void 0!==cm&&courseeditor.dispatch("sectionState",[cm.sectionid]),courseeditor.dispatch("cmState",[params.cmid])},updateMovedSectionState:()=>{courseeditor.dispatch("courseState")}})})),courseeditor.addMutations({legacyActivityAction:function(statemanager,action,cmid,affectedids){const state=statemanager.state,cm=state.cm.get(cmid);if(void 0===cm)return;const section=state.section.get(cm.sectionid);if(void 0!==section){switch(courseeditor.dispatch("cmLock",[cm.id],!0),statemanager.setReadOnly(!1),cm.locked=!1,action){case"delete":section.cmlist=section.cmlist.reduce(((cmlist,current)=>(current!=cmid&&cmlist.push(current),cmlist)),[]),state.cm.delete(cmid);break;case"hide":case"show":case"duplicate":courseeditor.dispatch("cmState",affectedids)}statemanager.setReadOnly(!0)}},legacySectionAction:function(statemanager,action,sectionid){const state=statemanager.state,section=state.section.get(sectionid);if(void 0!==section){switch(statemanager.setReadOnly(!1),section.locked=!0,statemanager.setReadOnly(!0),statemanager.setReadOnly(!1),section.locked=!1,action){case"setmarker":state.section.forEach((current=>{current.id!=sectionid&&(current.current=!1)})),section.current=!0;break;case"removemarker":section.current=!1}statemanager.setReadOnly(!0)}}}),{initCoursePage:function(courseformat){if(formatname=courseformat,$("body").on("click keypress",SELECTOR.ACTIVITYLI+" "+SELECTOR.ACTIVITYACTION+"[data-action]",(function(e){if("keypress"!==e.type||13===e.keyCode){var actionItem=$(this),moduleElement=actionItem.closest(SELECTOR.ACTIVITYLI),action=actionItem.attr("data-action"),moduleId=getModuleId(moduleElement);switch(action){case"moveleft":case"moveright":case"delete":case"duplicate":case"hide":case"stealth":case"show":case"groupsseparate":case"groupsvisible":case"groupsnone":break;default:return}moduleId&&(e.preventDefault(),"delete"===action?confirmDeleteModule(moduleElement,(function(){editModule(moduleElement,moduleId,actionItem)})):editModule(moduleElement,moduleId,actionItem))}})),$("body").on("click keypress",SELECTOR.SECTIONLI+" "+SELECTOR.SECTIONACTIONMENU+"[data-sectionid] a[data-action]",(function(e){if("keypress"===e.type&&13!==e.keyCode)return;var actionItem=$(this),sectionElement=actionItem.closest(SELECTOR.SECTIONLI),sectionId=actionItem.closest(SELECTOR.SECTIONACTIONMENU).attr("data-sectionid");if("permalink"===actionItem.attr("data-action"))return e.preventDefault(),void ModalCopyToClipboard.create({text:actionItem.attr("href")},str.get_string("sectionlink","course"));let isExecuted=!0;var message,onconfirm;actionItem.attr("data-confirm")?(message=actionItem.attr("data-confirm"),onconfirm=function(){isExecuted=editSection(sectionElement,sectionId,actionItem,courseformat)},str.get_strings([{key:"confirm"},{key:"yes"},{key:"no"}]).done((function(s){notification.confirm(s[0],message,s[1],s[2],onconfirm)}))):isExecuted=editSection(sectionElement,sectionId,actionItem,courseformat),isExecuted&&e.preventDefault()})),$("body").on("updated","".concat(SELECTOR.SECTIONLI," ").concat(SELECTOR.SECTIONITEM," [data-inplaceeditable]"),(function(e){if(e.ajaxreturn&&e.ajaxreturn.itemid){void 0!==courseeditor.state.section.get(e.ajaxreturn.itemid)&&courseeditor.dispatch("sectionState",[e.ajaxreturn.itemid])}})),$("body").on("updated","".concat(SELECTOR.ACTIVITYLI," [data-inplaceeditable]"),(function(e){e.ajaxreturn&&e.ajaxreturn.itemid&&courseeditor.dispatch("cmState",[e.ajaxreturn.itemid])})),courseeditor.supportComponents&&componentActions.includes("addSection"))return;const trigger=$(SELECTOR.ADDSECTIONS),modalTitle=trigger.attr("data-add-sections"),newSections=trigger.attr("data-new-sections");str.get_string("numberweeks").then((function(strNumberSections){var modalBody=$('
');return modalBody.find("label").html(strNumberSections),modalBody.html()})).then((body=>ModalSaveCancel.create({body:body,title:modalTitle}))).then((function(modal){var numSections=$(modal.getBody()).find("#add_section_numsections"),addSections=function(){""+parseInt(numSections.val())===numSections.val()&&parseInt(numSections.val())>=1&&(document.location=trigger.attr("href")+"&numsections="+parseInt(numSections.val()))};return modal.setSaveButtonText(modalTitle),modal.getRoot().on(ModalEvents.shown,(function(){numSections.focus().select().on("keydown",(function(e){e.keyCode===KeyCodes.enter&&addSections()}))})),modal.getRoot().on(ModalEvents.save,(function(e){e.preventDefault(),addSections()})),trigger.on("click",(e=>{e.preventDefault(),modal.show()})),modal})).catch(notification.exception)},replaceSectionActionItem:function(sectionelement,selector,image,stringname,stringcomponent,newaction){log.debug("replaceSectionActionItem() is deprecated and will be removed.");var actionitem=sectionelement.find(SELECTOR.SECTIONACTIONMENU+" "+selector);replaceActionItem(actionitem,image,stringname,stringcomponent,newaction)},refreshModule:refreshModule,refreshSection:function(element,sectionid,sectionreturn){void 0===sectionreturn&&(sectionreturn=courseeditor.sectionReturn);const sectionElement=$(element),promises=ajax.call([{methodname:"core_course_edit_section",args:{id:sectionid,action:"refresh",sectionreturn:sectionreturn}}],!0);var spinner=addSectionSpinner(sectionElement);return new Promise(((resolve,reject)=>{$.when.apply($,promises).done((dataencoded=>{removeSpinner(sectionElement,spinner);const data=$.parseJSON(dataencoded),newSectionElement=$(data.content);sectionElement.replaceWith(newSectionElement),$("".concat(SELECTOR.SECTIONLI,"#").concat(sectionid," ").concat(SELECTOR.ACTIVITYLI)).each(((index,activity)=>{initActionMenu(activity.data("id"))}));dispatchEvent(CourseEvents.sectionRefreshed,{ajaxreturn:data,action:"refresh",newSectionElement:newSectionElement.get(0)},newSectionElement).defaultPrevented||defaultEditSectionHandler(newSectionElement,$(SELECTOR.SECTIONLI+"#"+sectionid),data,formatname,sectionid),resolve(data)})).fail((ex=>{dispatchEvent("coursesectionrefreshfailed",{exception:ex,action:"refresh"},sectionElement).defaultPrevented||notification.exception(ex),reject()}))}))}}})); +define("core_course/actions",["jquery","core/ajax","core/templates","core/notification","core/str","core/url","core/yui","core/modal_copy_to_clipboard","core/modal_save_cancel","core/modal_events","core/key_codes","core/log","core_courseformat/courseeditor","core/event_dispatcher","core_course/events"],(function($,ajax,templates,notification,str,url,Y,ModalCopyToClipboard,ModalSaveCancel,ModalEvents,KeyCodes,log,editor,EventDispatcher,CourseEvents){const componentActions=["moveSection","moveCm","addSection","deleteSection","cmDelete","cmDuplicate","sectionHide","sectionShow","cmHide","cmShow","cmStealth","sectionHighlight","sectionUnhighlight","cmMoveRight","cmMoveLeft","cmNoGroups","cmVisibleGroups","cmSeparateGroups"],courseeditor=editor.getCurrentCourseEditor();let formatname;var CSS_EDITINPROGRESS="editinprogress",CSS_EDITINGMOVE="editing_move",SELECTOR={ACTIVITYLI:"li.activity",ACTIONAREA:".actions",ACTIVITYACTION:"a.cm-edit-action",MENU:".moodle-actionmenu[data-enhance=moodle-core-actionmenu]",TOGGLE:".toggle-display,.dropdown-toggle",SECTIONLI:"li.section",SECTIONACTIONMENU:".section_action_menu",SECTIONITEM:'[data-for="section_title"]',ADDSECTIONS:".changenumsections [data-add-sections]",SECTIONBADGES:'[data-region="sectionbadges"]'};Y.use("moodle-course-coursebase",(function(){var courseformatselector=M.course.format.get_section_selector();courseformatselector&&(SELECTOR.SECTIONLI=courseformatselector)}));const dispatchEvent=function(eventName,detail,container,options){return container instanceof Element||void 0===container.get||(container=container.get(0)),EventDispatcher.dispatchEvent(eventName,detail,container,options)};var getModuleId=function(element){const item=element.get(0);if(item.dataset.id)return item.dataset.id;let id;return Y.use("moodle-course-util",(function(Y){id=Y.Moodle.core_course.util.cm.getId(Y.Node(item))})),id},addActivitySpinner=function(activity){activity.addClass(CSS_EDITINPROGRESS);var actionarea=activity.find(SELECTOR.ACTIONAREA).get(0);if(actionarea){var spinner=M.util.add_spinner(Y,Y.Node(actionarea));return spinner.show(),void 0!==activity.data("id")&&courseeditor.dispatch("cmLock",[activity.data("id")],!0),spinner}return null},addSectionSpinner=function(sectionelement){sectionelement.addClass(CSS_EDITINPROGRESS);var actionarea=sectionelement.find(SELECTOR.SECTIONACTIONMENU).get(0);if(actionarea){var spinner=M.util.add_spinner(Y,Y.Node(actionarea));return spinner.show(),void 0!==sectionelement.data("id")&&courseeditor.dispatch("sectionLock",[sectionelement.data("id")],!0),spinner}return null},addSectionLightbox=function(sectionelement){const item=sectionelement.get(0);var lightbox=M.util.add_lightbox(Y,Y.Node(item));return"section"==item.dataset.for&&item.dataset.id&&(courseeditor.dispatch("sectionLock",[item.dataset.id],!0),lightbox.setAttribute("data-state","section"),lightbox.setAttribute("data-state-id",item.dataset.id)),lightbox.show(),lightbox},removeSpinner=function(element,spinner,delay){window.setTimeout((function(){if(element.removeClass(CSS_EDITINPROGRESS),spinner&&spinner.hide(),void 0!==element.data("id")){const mutation="section"===element.data("for")?"sectionLock":"cmLock";courseeditor.dispatch(mutation,[element.data("id")],!1)}}),delay)},removeLightbox=function(lightbox,delay){lightbox&&window.setTimeout((function(){lightbox.hide(),lightbox.getAttribute("data-state")&&courseeditor.dispatch("".concat(lightbox.getAttribute("data-state"),"Lock"),[lightbox.getAttribute("data-state-id")],!1)}),delay)},initActionMenu=function(elementid){Y.use("moodle-course-coursebase",(function(){M.course.coursebase.invoke_function("setup_for_resource","#"+elementid)})),M.core.actionmenu&&M.core.actionmenu.newDOMNode&&M.core.actionmenu.newDOMNode(Y.one("#"+elementid))},editModule=function(moduleElement,cmid,target){var lightbox,action=target.attr("data-action"),spinner=addActivitySpinner(moduleElement),promises=ajax.call([{methodname:"core_course_edit_module",args:{id:cmid,action:action,sectionreturn:target.attr("data-sectionreturn")?target.attr("data-sectionreturn"):null}}],!0);"duplicate"===action&&(lightbox=addSectionLightbox(target.closest(SELECTOR.SECTIONLI))),$.when.apply($,promises).done((function(data){var mainElement,tabables,isInside,foundElement,elementToFocus=(mainElement=moduleElement,tabables=$("a:visible"),isInside=!1,foundElement=null,tabables.each((function(){if($.contains(mainElement[0],this))isInside=!0;else if(isInside)return foundElement=this,!1;return!0})),foundElement);moduleElement.replaceWith(data);let affectedids=[];$("
"+data+"
").find(SELECTOR.ACTIVITYLI).each((function(index){initActionMenu($(this).attr("id")),0===index&&(!function(elementId,action){var mainelement=$("#"+elementId),selector="[data-action="+action+"]";"groupsseparate"!==action&&"groupsvisible"!==action&&"groupsnone"!==action||(selector="[data-action=groupsseparate],[data-action=groupsvisible],[data-action=groupsnone]"),mainelement.find(selector).is(":visible")?mainelement.find(selector).focus():mainelement.find(SELECTOR.MENU).find(SELECTOR.TOGGLE).focus()}($(this).attr("id"),action),elementToFocus=null),affectedids.push(getModuleId($(this)))})),elementToFocus&&elementToFocus.focus(),removeSpinner(moduleElement,spinner,400),removeLightbox(lightbox,400),moduleElement.trigger($.Event("coursemoduleedited",{ajaxreturn:data,action:action})),courseeditor.dispatch("legacyActivityAction",action,cmid,affectedids)})).fail((function(ex){removeSpinner(moduleElement,spinner),removeLightbox(lightbox);var e=$.Event("coursemoduleeditfailed",{exception:ex,action:action});moduleElement.trigger(e),e.isDefaultPrevented()||notification.exception(ex)}))},refreshModule=function(element,cmid,sectionreturn){void 0===sectionreturn&&(sectionreturn=courseeditor.sectionReturn);const activityElement=$(element);var spinner=addActivitySpinner(activityElement),promises=ajax.call([{methodname:"core_course_get_module",args:{id:cmid,sectionreturn:sectionreturn}}],!0);return new Promise(((resolve,reject)=>{$.when.apply($,promises).done((function(data){removeSpinner(activityElement,spinner,400),replaceActivityHtmlWith(data),resolve(data)})).fail((function(){removeSpinner(activityElement,spinner),reject()}))}))},confirmDeleteModule=function(mainelement,onconfirm){var modtypename=mainelement.attr("class").match(/modtype_([^\s]*)/)[1],modulename=function(element){var name;Y.use("moodle-course-util",(function(Y){name=Y.Moodle.core_course.util.cm.getName(Y.Node(element.get(0)))}));const state=courseeditor.state,cmid=getModuleId(element);var _state$cm$get;return!name&&state&&cmid&&(name=null===(_state$cm$get=state.cm.get(cmid))||void 0===_state$cm$get?void 0:_state$cm$get.name),name}(mainelement);str.get_string("pluginname",modtypename).done((function(pluginname){var plugindata={type:pluginname,name:modulename};str.get_strings([{key:"confirm",component:"core"},{key:null===modulename?"deletechecktype":"deletechecktypename",param:plugindata},{key:"yes"},{key:"no"}]).done((function(s){notification.confirm(s[0],s[1],s[2],s[3],onconfirm)}))}))},replaceActionItem=function(actionitem,image,stringname,stringcomponent,newaction){var stringRequests=[{key:stringname,component:stringcomponent}];return str.get_strings(stringRequests).then((function(strings){return actionitem.find("span.menu-action-text").html(strings[0]),templates.renderPix(image,"core")})).then((function(pixhtml){actionitem.find(".icon").replaceWith(pixhtml),actionitem.attr("data-action",newaction)})).catch(notification.exception)},defaultEditSectionHandler=function(sectionElement,actionItem,data,courseformat,sectionid){var action=actionItem.attr("data-action");if("hide"===action||"show"===action){if("hide"===action?(sectionElement.addClass("hidden"),setSectionBadge(sectionElement[0],"hiddenfromstudents",!0,!1),replaceActionItem(actionItem,"i/show","showfromothers","format_"+courseformat,"show")):(setSectionBadge(sectionElement[0],"hiddenfromstudents",!1,!1),sectionElement.removeClass("hidden"),replaceActionItem(actionItem,"i/hide","hidefromothers","format_"+courseformat,"hide")),void 0!==data.modules)for(var i in data.modules)replaceActivityHtmlWith(data.modules[i]);void 0!==data.section_availability&§ionElement.find(".section_availability").first().replaceWith(data.section_availability);void 0!==courseeditor.state.section.get(sectionid)&&courseeditor.dispatch("sectionState",[sectionid])}else if("setmarker"===action){var oldmarker=$(SELECTOR.SECTIONLI+".current"),oldActionItem=oldmarker.find(SELECTOR.SECTIONACTIONMENU+" a[data-action=removemarker]");oldmarker.removeClass("current"),replaceActionItem(oldActionItem,"i/marker","highlight","core","setmarker"),sectionElement.addClass("current"),replaceActionItem(actionItem,"i/marked","highlightoff","core","removemarker"),courseeditor.dispatch("legacySectionAction",action,sectionid),setSectionBadge(sectionElement[0],"iscurrent",!0,!0)}else"removemarker"===action&&(sectionElement.removeClass("current"),replaceActionItem(actionItem,"i/marker","highlight","core","setmarker"),courseeditor.dispatch("legacySectionAction",action,sectionid),setSectionBadge(sectionElement[0],"iscurrent",!1,!0))};var replaceActivityHtmlWith=function(activityHTML){$("
"+activityHTML+"
").find(SELECTOR.ACTIVITYLI).each((function(){var id=$(this).attr("id");let focusedPath=function(id){const element=document.getElementById(id);if(element&&element.contains(document.activeElement))return element.querySelector(SELECTOR.ACTIONAREA).contains(document.activeElement)?"".concat(SELECTOR.ACTIONAREA,' [tabindex="0"]'):document.activeElement.id?"#".concat(document.activeElement.id):void 0}(id);if($(SELECTOR.ACTIVITYLI+"#"+id).replaceWith(activityHTML),initActionMenu(id),focusedPath){var _newItem$querySelecto;null===(_newItem$querySelecto=document.getElementById(id).querySelector(focusedPath))||void 0===_newItem$querySelecto||_newItem$querySelecto.focus()}}))},editSection=function(sectionElement,sectionid,target,courseformat){var action=target.attr("data-action"),sectionreturn=target.attr("data-sectionreturn")?target.attr("data-sectionreturn"):null;if(courseeditor.supportComponents&&componentActions.includes(action))return!1;var spinner=addSectionSpinner(sectionElement),promises=ajax.call([{methodname:"core_course_edit_section",args:{id:sectionid,action:action,sectionreturn:sectionreturn}}],!0),lightbox=addSectionLightbox(sectionElement);return $.when.apply($,promises).done((function(dataencoded){var data=$.parseJSON(dataencoded);removeSpinner(sectionElement,spinner),removeLightbox(lightbox),sectionElement.find(SELECTOR.SECTIONACTIONMENU).find(SELECTOR.TOGGLE).focus();var e=$.Event("coursesectionedited",{ajaxreturn:data,action:action});sectionElement.trigger(e),e.isDefaultPrevented()||defaultEditSectionHandler(sectionElement,target,data,courseformat,sectionid)})).fail((function(ex){removeSpinner(sectionElement,spinner),removeLightbox(lightbox);var e=$.Event("coursesectioneditfailed",{exception:ex,action:action});sectionElement.trigger(e),e.isDefaultPrevented()||notification.exception(ex)})),!0},setSectionBadge=function(sectionElement,badgetype,add,removeOther){const sectionbadges=sectionElement.querySelector(SELECTOR.SECTIONBADGES);if(!sectionbadges)return;const badge=sectionbadges.querySelector('[data-type="'+badgetype+'"]');badge&&(add?(removeOther&&document.querySelectorAll('[data-type="'+badgetype+'"]').forEach((b=>{b.classList.add("d-none")})),badge.classList.remove("d-none")):badge.classList.add("d-none"))};return Y.use("moodle-course-coursebase",(function(){M.course.coursebase.register_module({set_visibility_resource_ui:function(args){var mainelement=$(args.element.getDOMNode()),cmid=getModuleId(mainelement);if(cmid){var sectionreturn=mainelement.find("."+CSS_EDITINGMOVE).attr("data-sectionreturn");refreshModule(mainelement,cmid,sectionreturn)}},updateMovedCmState:params=>{const cm=courseeditor.state.cm.get(params.cmid);void 0!==cm&&courseeditor.dispatch("sectionState",[cm.sectionid]),courseeditor.dispatch("cmState",[params.cmid])},updateMovedSectionState:()=>{courseeditor.dispatch("courseState")}})})),courseeditor.addMutations({legacyActivityAction:function(statemanager,action,cmid,affectedids){const state=statemanager.state,cm=state.cm.get(cmid);if(void 0===cm)return;const section=state.section.get(cm.sectionid);if(void 0!==section){switch(courseeditor.dispatch("cmLock",[cm.id],!0),statemanager.setReadOnly(!1),cm.locked=!1,action){case"delete":section.cmlist=section.cmlist.reduce(((cmlist,current)=>(current!=cmid&&cmlist.push(current),cmlist)),[]),state.cm.delete(cmid);break;case"hide":case"show":case"duplicate":courseeditor.dispatch("cmState",affectedids)}statemanager.setReadOnly(!0)}},legacySectionAction:function(statemanager,action,sectionid){const state=statemanager.state,section=state.section.get(sectionid);if(void 0!==section){switch(statemanager.setReadOnly(!1),section.locked=!0,statemanager.setReadOnly(!0),statemanager.setReadOnly(!1),section.locked=!1,action){case"setmarker":state.section.forEach((current=>{current.id!=sectionid&&(current.current=!1)})),section.current=!0;break;case"removemarker":section.current=!1}statemanager.setReadOnly(!0)}}}),{initCoursePage:function(courseformat){if(formatname=courseformat,$("body").on("click keypress",SELECTOR.ACTIVITYLI+" "+SELECTOR.ACTIVITYACTION+"[data-action]",(function(e){if("keypress"!==e.type||13===e.keyCode){var actionItem=$(this),moduleElement=actionItem.closest(SELECTOR.ACTIVITYLI),action=actionItem.attr("data-action"),moduleId=getModuleId(moduleElement);switch(action){case"moveleft":case"moveright":case"delete":case"duplicate":case"hide":case"stealth":case"show":case"groupsseparate":case"groupsvisible":case"groupsnone":break;default:return}moduleId&&(e.preventDefault(),"delete"===action?confirmDeleteModule(moduleElement,(function(){editModule(moduleElement,moduleId,actionItem)})):editModule(moduleElement,moduleId,actionItem))}})),$("body").on("click keypress",SELECTOR.SECTIONLI+" "+SELECTOR.SECTIONACTIONMENU+"[data-sectionid] a[data-action]",(function(e){if("keypress"===e.type&&13!==e.keyCode)return;var actionItem=$(this),sectionElement=actionItem.closest(SELECTOR.SECTIONLI),sectionId=actionItem.closest(SELECTOR.SECTIONACTIONMENU).attr("data-sectionid");if("permalink"===actionItem.attr("data-action"))return e.preventDefault(),void ModalCopyToClipboard.create({text:actionItem.attr("href")},str.get_string("sectionlink","course"));let isExecuted=!0;var message,onconfirm;actionItem.attr("data-confirm")?(message=actionItem.attr("data-confirm"),onconfirm=function(){isExecuted=editSection(sectionElement,sectionId,actionItem,courseformat)},str.get_strings([{key:"confirm"},{key:"yes"},{key:"no"}]).done((function(s){notification.confirm(s[0],message,s[1],s[2],onconfirm)}))):isExecuted=editSection(sectionElement,sectionId,actionItem,courseformat),isExecuted&&e.preventDefault()})),$("body").on("updated","".concat(SELECTOR.SECTIONITEM," [data-inplaceeditable]"),(function(e){if(e.ajaxreturn&&e.ajaxreturn.itemid){void 0!==courseeditor.state.section.get(e.ajaxreturn.itemid)&&courseeditor.dispatch("sectionState",[e.ajaxreturn.itemid])}})),$("body").on("updated","".concat(SELECTOR.ACTIVITYLI," [data-inplaceeditable]"),(function(e){e.ajaxreturn&&e.ajaxreturn.itemid&&courseeditor.dispatch("cmState",[e.ajaxreturn.itemid])})),courseeditor.supportComponents&&componentActions.includes("addSection"))return;const trigger=$(SELECTOR.ADDSECTIONS),modalTitle=trigger.attr("data-add-sections"),newSections=trigger.attr("data-new-sections");str.get_string("numberweeks").then((function(strNumberSections){var modalBody=$('
');return modalBody.find("label").html(strNumberSections),modalBody.html()})).then((body=>ModalSaveCancel.create({body:body,title:modalTitle}))).then((function(modal){var numSections=$(modal.getBody()).find("#add_section_numsections"),addSections=function(){""+parseInt(numSections.val())===numSections.val()&&parseInt(numSections.val())>=1&&(document.location=trigger.attr("href")+"&numsections="+parseInt(numSections.val()))};return modal.setSaveButtonText(modalTitle),modal.getRoot().on(ModalEvents.shown,(function(){numSections.focus().select().on("keydown",(function(e){e.keyCode===KeyCodes.enter&&addSections()}))})),modal.getRoot().on(ModalEvents.save,(function(e){e.preventDefault(),addSections()})),trigger.on("click",(e=>{e.preventDefault(),modal.show()})),modal})).catch(notification.exception)},replaceSectionActionItem:function(sectionelement,selector,image,stringname,stringcomponent,newaction){log.debug("replaceSectionActionItem() is deprecated and will be removed.");var actionitem=sectionelement.find(SELECTOR.SECTIONACTIONMENU+" "+selector);replaceActionItem(actionitem,image,stringname,stringcomponent,newaction)},refreshModule:refreshModule,refreshSection:function(element,sectionid,sectionreturn){void 0===sectionreturn&&(sectionreturn=courseeditor.sectionReturn);const sectionElement=$(element),promises=ajax.call([{methodname:"core_course_edit_section",args:{id:sectionid,action:"refresh",sectionreturn:sectionreturn}}],!0);var spinner=addSectionSpinner(sectionElement);return new Promise(((resolve,reject)=>{$.when.apply($,promises).done((dataencoded=>{removeSpinner(sectionElement,spinner);const data=$.parseJSON(dataencoded),newSectionElement=$(data.content);sectionElement.replaceWith(newSectionElement),$("".concat(SELECTOR.SECTIONLI,"#").concat(sectionid," ").concat(SELECTOR.ACTIVITYLI)).each(((index,activity)=>{initActionMenu(activity.data("id"))}));dispatchEvent(CourseEvents.sectionRefreshed,{ajaxreturn:data,action:"refresh",newSectionElement:newSectionElement.get(0)},newSectionElement).defaultPrevented||defaultEditSectionHandler(newSectionElement,$(SELECTOR.SECTIONLI+"#"+sectionid),data,formatname,sectionid),resolve(data)})).fail((ex=>{dispatchEvent("coursesectionrefreshfailed",{exception:ex,action:"refresh"},sectionElement).defaultPrevented||notification.exception(ex),reject()}))}))}}})); //# sourceMappingURL=actions.min.js.map \ No newline at end of file diff --git a/course/amd/build/actions.min.js.map b/course/amd/build/actions.min.js.map index a68b4bae2de80..94639c1ef9278 100644 --- a/course/amd/build/actions.min.js.map +++ b/course/amd/build/actions.min.js.map @@ -1 +1 @@ -{"version":3,"file":"actions.min.js","sources":["../src/actions.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Various actions on modules and sections in the editing mode - hiding, duplicating, deleting, etc.\n *\n * @module core_course/actions\n * @copyright 2016 Marina Glancy\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.3\n */\ndefine(\n [\n 'jquery',\n 'core/ajax',\n 'core/templates',\n 'core/notification',\n 'core/str',\n 'core/url',\n 'core/yui',\n 'core/modal_copy_to_clipboard',\n 'core/modal_save_cancel',\n 'core/modal_events',\n 'core/key_codes',\n 'core/log',\n 'core_courseformat/courseeditor',\n 'core/event_dispatcher',\n 'core_course/events'\n ],\n function(\n $,\n ajax,\n templates,\n notification,\n str,\n url,\n Y,\n ModalCopyToClipboard,\n ModalSaveCancel,\n ModalEvents,\n KeyCodes,\n log,\n editor,\n EventDispatcher,\n CourseEvents\n ) {\n\n // Eventually, core_courseformat/local/content/actions will handle all actions for\n // component compatible formats and the default actions.js won't be necessary anymore.\n // Meanwhile, we filter the migrated actions.\n const componentActions = [\n 'moveSection', 'moveCm', 'addSection', 'deleteSection', 'cmDelete', 'cmDuplicate', 'sectionHide', 'sectionShow',\n 'cmHide', 'cmShow', 'cmStealth', 'sectionHighlight', 'sectionUnhighlight', 'cmMoveRight', 'cmMoveLeft',\n 'cmNoGroups', 'cmVisibleGroups', 'cmSeparateGroups',\n ];\n\n // The course reactive instance.\n const courseeditor = editor.getCurrentCourseEditor();\n\n // The current course format name (loaded on init).\n let formatname;\n\n var CSS = {\n EDITINPROGRESS: 'editinprogress',\n SECTIONDRAGGABLE: 'sectiondraggable',\n EDITINGMOVE: 'editing_move'\n };\n var SELECTOR = {\n ACTIVITYLI: 'li.activity',\n ACTIONAREA: '.actions',\n ACTIVITYACTION: 'a.cm-edit-action',\n MENU: '.moodle-actionmenu[data-enhance=moodle-core-actionmenu]',\n TOGGLE: '.toggle-display,.dropdown-toggle',\n SECTIONLI: 'li.section',\n SECTIONACTIONMENU: '.section_action_menu',\n SECTIONITEM: '[data-for=\"section_title\"]',\n ADDSECTIONS: '.changenumsections [data-add-sections]',\n SECTIONBADGES: '[data-region=\"sectionbadges\"]',\n };\n\n Y.use('moodle-course-coursebase', function() {\n var courseformatselector = M.course.format.get_section_selector();\n if (courseformatselector) {\n SELECTOR.SECTIONLI = courseformatselector;\n }\n });\n\n /**\n * Dispatch event wrapper.\n *\n * Old jQuery events will be replaced by native events gradually.\n *\n * @method dispatchEvent\n * @param {String} eventName The name of the event\n * @param {Object} detail Any additional details to pass into the eveent\n * @param {Node|HTMLElement} container The point at which to dispatch the event\n * @param {Object} options\n * @param {Boolean} options.bubbles Whether to bubble up the DOM\n * @param {Boolean} options.cancelable Whether preventDefault() can be called\n * @param {Boolean} options.composed Whether the event can bubble across the ShadowDOM boundary\n * @returns {CustomEvent}\n */\n const dispatchEvent = function(eventName, detail, container, options) {\n // Most actions still uses jQuery node instead of regular HTMLElement.\n if (!(container instanceof Element) && container.get !== undefined) {\n container = container.get(0);\n }\n return EventDispatcher.dispatchEvent(eventName, detail, container, options);\n };\n\n /**\n * Wrapper for Y.Moodle.core_course.util.cm.getId\n *\n * @param {JQuery} element\n * @returns {Integer}\n */\n var getModuleId = function(element) {\n // Check if we have a data-id first.\n const item = element.get(0);\n if (item.dataset.id) {\n return item.dataset.id;\n }\n // Use YUI way if data-id is not present.\n let id;\n Y.use('moodle-course-util', function(Y) {\n id = Y.Moodle.core_course.util.cm.getId(Y.Node(item));\n });\n return id;\n };\n\n /**\n * Wrapper for Y.Moodle.core_course.util.cm.getName\n *\n * @param {JQuery} element\n * @returns {String}\n */\n var getModuleName = function(element) {\n var name;\n Y.use('moodle-course-util', function(Y) {\n name = Y.Moodle.core_course.util.cm.getName(Y.Node(element.get(0)));\n });\n // Check if we have the name in the course state.\n const state = courseeditor.state;\n const cmid = getModuleId(element);\n if (!name && state && cmid) {\n name = state.cm.get(cmid)?.name;\n }\n return name;\n };\n\n /**\n * Wrapper for M.util.add_spinner for an activity\n *\n * @param {JQuery} activity\n * @returns {Node}\n */\n var addActivitySpinner = function(activity) {\n activity.addClass(CSS.EDITINPROGRESS);\n var actionarea = activity.find(SELECTOR.ACTIONAREA).get(0);\n if (actionarea) {\n var spinner = M.util.add_spinner(Y, Y.Node(actionarea));\n spinner.show();\n // Lock the activity state element.\n if (activity.data('id') !== undefined) {\n courseeditor.dispatch('cmLock', [activity.data('id')], true);\n }\n return spinner;\n }\n return null;\n };\n\n /**\n * Wrapper for M.util.add_spinner for a section\n *\n * @param {JQuery} sectionelement\n * @returns {Node}\n */\n var addSectionSpinner = function(sectionelement) {\n sectionelement.addClass(CSS.EDITINPROGRESS);\n var actionarea = sectionelement.find(SELECTOR.SECTIONACTIONMENU).get(0);\n if (actionarea) {\n var spinner = M.util.add_spinner(Y, Y.Node(actionarea));\n spinner.show();\n // Lock the section state element.\n if (sectionelement.data('id') !== undefined) {\n courseeditor.dispatch('sectionLock', [sectionelement.data('id')], true);\n }\n return spinner;\n }\n return null;\n };\n\n /**\n * Wrapper for M.util.add_lightbox\n *\n * @param {JQuery} sectionelement\n * @returns {Node}\n */\n var addSectionLightbox = function(sectionelement) {\n const item = sectionelement.get(0);\n var lightbox = M.util.add_lightbox(Y, Y.Node(item));\n if (item.dataset.for == 'section' && item.dataset.id) {\n courseeditor.dispatch('sectionLock', [item.dataset.id], true);\n lightbox.setAttribute('data-state', 'section');\n lightbox.setAttribute('data-state-id', item.dataset.id);\n }\n lightbox.show();\n return lightbox;\n };\n\n /**\n * Removes the spinner element\n *\n * @param {JQuery} element\n * @param {Node} spinner\n * @param {Number} delay\n */\n var removeSpinner = function(element, spinner, delay) {\n window.setTimeout(function() {\n element.removeClass(CSS.EDITINPROGRESS);\n if (spinner) {\n spinner.hide();\n }\n // Unlock the state element.\n if (element.data('id') !== undefined) {\n const mutation = (element.data('for') === 'section') ? 'sectionLock' : 'cmLock';\n courseeditor.dispatch(mutation, [element.data('id')], false);\n }\n }, delay);\n };\n\n /**\n * Removes the lightbox element\n *\n * @param {Node} lightbox lighbox YUI element returned by addSectionLightbox\n * @param {Number} delay\n */\n var removeLightbox = function(lightbox, delay) {\n if (lightbox) {\n window.setTimeout(function() {\n lightbox.hide();\n // Unlock state if necessary.\n if (lightbox.getAttribute('data-state')) {\n courseeditor.dispatch(\n `${lightbox.getAttribute('data-state')}Lock`,\n [lightbox.getAttribute('data-state-id')],\n false\n );\n }\n }, delay);\n }\n };\n\n /**\n * Initialise action menu for the element (section or module)\n *\n * @param {String} elementid CSS id attribute of the element\n */\n var initActionMenu = function(elementid) {\n // Initialise action menu in the new activity.\n Y.use('moodle-course-coursebase', function() {\n M.course.coursebase.invoke_function('setup_for_resource', '#' + elementid);\n });\n if (M.core.actionmenu && M.core.actionmenu.newDOMNode) {\n M.core.actionmenu.newDOMNode(Y.one('#' + elementid));\n }\n };\n\n /**\n * Returns focus to the element that was clicked or \"Edit\" link if element is no longer visible.\n *\n * @param {String} elementId CSS id attribute of the element\n * @param {String} action data-action property of the element that was clicked\n */\n var focusActionItem = function(elementId, action) {\n var mainelement = $('#' + elementId);\n var selector = '[data-action=' + action + ']';\n if (action === 'groupsseparate' || action === 'groupsvisible' || action === 'groupsnone') {\n // New element will have different data-action.\n selector = '[data-action=groupsseparate],[data-action=groupsvisible],[data-action=groupsnone]';\n }\n if (mainelement.find(selector).is(':visible')) {\n mainelement.find(selector).focus();\n } else {\n // Element not visible, focus the \"Edit\" link.\n mainelement.find(SELECTOR.MENU).find(SELECTOR.TOGGLE).focus();\n }\n };\n\n /**\n * Find next
after the element\n *\n * @param {JQuery} mainElement element that is about to be deleted\n * @returns {JQuery}\n */\n var findNextFocusable = function(mainElement) {\n var tabables = $(\"a:visible\");\n var isInside = false;\n var foundElement = null;\n tabables.each(function() {\n if ($.contains(mainElement[0], this)) {\n isInside = true;\n } else if (isInside) {\n foundElement = this;\n return false; // Returning false in .each() is equivalent to \"break;\" inside the loop in php.\n }\n return true;\n });\n return foundElement;\n };\n\n /**\n * Performs an action on a module (moving, deleting, duplicating, hiding, etc.)\n *\n * @param {JQuery} moduleElement activity element we perform action on\n * @param {Number} cmid\n * @param {JQuery} target the element (menu item) that was clicked\n */\n var editModule = function(moduleElement, cmid, target) {\n var action = target.attr('data-action');\n var spinner = addActivitySpinner(moduleElement);\n var promises = ajax.call([{\n methodname: 'core_course_edit_module',\n args: {id: cmid,\n action: action,\n sectionreturn: target.attr('data-sectionreturn') ? target.attr('data-sectionreturn') : null\n }\n }], true);\n\n var lightbox;\n if (action === 'duplicate') {\n lightbox = addSectionLightbox(target.closest(SELECTOR.SECTIONLI));\n }\n $.when.apply($, promises)\n .done(function(data) {\n var elementToFocus = findNextFocusable(moduleElement);\n moduleElement.replaceWith(data);\n let affectedids = [];\n // Initialise action menu for activity(ies) added as a result of this.\n $('
' + data + '
').find(SELECTOR.ACTIVITYLI).each(function(index) {\n initActionMenu($(this).attr('id'));\n if (index === 0) {\n focusActionItem($(this).attr('id'), action);\n elementToFocus = null;\n }\n // Save any activity id in cmids.\n affectedids.push(getModuleId($(this)));\n });\n // In case of activity deletion focus the next focusable element.\n if (elementToFocus) {\n elementToFocus.focus();\n }\n // Remove spinner and lightbox with a delay.\n removeSpinner(moduleElement, spinner, 400);\n removeLightbox(lightbox, 400);\n // Trigger event that can be observed by course formats.\n moduleElement.trigger($.Event('coursemoduleedited', {ajaxreturn: data, action: action}));\n\n // Modify cm state.\n courseeditor.dispatch('legacyActivityAction', action, cmid, affectedids);\n\n }).fail(function(ex) {\n // Remove spinner and lightbox.\n removeSpinner(moduleElement, spinner);\n removeLightbox(lightbox);\n // Trigger event that can be observed by course formats.\n var e = $.Event('coursemoduleeditfailed', {exception: ex, action: action});\n moduleElement.trigger(e);\n if (!e.isDefaultPrevented()) {\n notification.exception(ex);\n }\n });\n };\n\n /**\n * Requests html for the module via WS core_course_get_module and updates the module on the course page\n *\n * Used after d&d of the module to another section\n *\n * @param {JQuery|Element} element\n * @param {Number} cmid\n * @param {Number} sectionreturn\n * @return {Promise} the refresh promise\n */\n var refreshModule = function(element, cmid, sectionreturn) {\n\n if (sectionreturn === undefined) {\n sectionreturn = courseeditor.sectionReturn;\n }\n\n const activityElement = $(element);\n var spinner = addActivitySpinner(activityElement);\n var promises = ajax.call([{\n methodname: 'core_course_get_module',\n args: {id: cmid, sectionreturn: sectionreturn}\n }], true);\n\n return new Promise((resolve, reject) => {\n $.when.apply($, promises)\n .done(function(data) {\n removeSpinner(activityElement, spinner, 400);\n replaceActivityHtmlWith(data);\n resolve(data);\n }).fail(function() {\n removeSpinner(activityElement, spinner);\n reject();\n });\n });\n };\n\n /**\n * Requests html for the section via WS core_course_edit_section and updates the section on the course page\n *\n * @param {JQuery|Element} element\n * @param {Number} sectionid\n * @param {Number} sectionreturn\n * @return {Promise} the refresh promise\n */\n var refreshSection = function(element, sectionid, sectionreturn) {\n\n if (sectionreturn === undefined) {\n sectionreturn = courseeditor.sectionReturn;\n }\n\n const sectionElement = $(element);\n const action = 'refresh';\n const promises = ajax.call([{\n methodname: 'core_course_edit_section',\n args: {id: sectionid, action, sectionreturn},\n }], true);\n\n var spinner = addSectionSpinner(sectionElement);\n return new Promise((resolve, reject) => {\n $.when.apply($, promises)\n .done(dataencoded => {\n\n removeSpinner(sectionElement, spinner);\n const data = $.parseJSON(dataencoded);\n\n const newSectionElement = $(data.content);\n sectionElement.replaceWith(newSectionElement);\n\n // Init modules menus.\n $(`${SELECTOR.SECTIONLI}#${sectionid} ${SELECTOR.ACTIVITYLI}`).each(\n (index, activity) => {\n initActionMenu(activity.data('id'));\n }\n );\n\n // Trigger event that can be observed by course formats.\n const event = dispatchEvent(\n CourseEvents.sectionRefreshed,\n {\n ajaxreturn: data,\n action: action,\n newSectionElement: newSectionElement.get(0),\n },\n newSectionElement\n );\n\n if (!event.defaultPrevented) {\n defaultEditSectionHandler(\n newSectionElement, $(SELECTOR.SECTIONLI + '#' + sectionid),\n data,\n formatname,\n sectionid\n );\n }\n resolve(data);\n }).fail(ex => {\n // Trigger event that can be observed by course formats.\n const event = dispatchEvent(\n 'coursesectionrefreshfailed',\n {exception: ex, action: action},\n sectionElement\n );\n if (!event.defaultPrevented) {\n notification.exception(ex);\n }\n reject();\n });\n });\n };\n\n /**\n * Displays the delete confirmation to delete a module\n *\n * @param {JQuery} mainelement activity element we perform action on\n * @param {function} onconfirm function to execute on confirm\n */\n var confirmDeleteModule = function(mainelement, onconfirm) {\n var modtypename = mainelement.attr('class').match(/modtype_([^\\s]*)/)[1];\n var modulename = getModuleName(mainelement);\n\n str.get_string('pluginname', modtypename).done(function(pluginname) {\n var plugindata = {\n type: pluginname,\n name: modulename\n };\n str.get_strings([\n {key: 'confirm', component: 'core'},\n {key: modulename === null ? 'deletechecktype' : 'deletechecktypename', param: plugindata},\n {key: 'yes'},\n {key: 'no'}\n ]).done(function(s) {\n notification.confirm(s[0], s[1], s[2], s[3], onconfirm);\n }\n );\n });\n };\n\n /**\n * Displays the delete confirmation to delete a section\n *\n * @param {String} message confirmation message\n * @param {function} onconfirm function to execute on confirm\n */\n var confirmEditSection = function(message, onconfirm) {\n str.get_strings([\n {key: 'confirm'}, // TODO link text\n {key: 'yes'},\n {key: 'no'}\n ]).done(function(s) {\n notification.confirm(s[0], message, s[1], s[2], onconfirm);\n }\n );\n };\n\n /**\n * Replaces an action menu item with another one (for example Show->Hide, Set marker->Remove marker)\n *\n * @param {JQuery} actionitem\n * @param {String} image new image name (\"i/show\", \"i/hide\", etc.)\n * @param {String} stringname new string for the action menu item\n * @param {String} stringcomponent\n * @param {String} newaction new value for data-action attribute of the link\n * @return {Promise} promise which is resolved when the replacement has completed\n */\n var replaceActionItem = function(actionitem, image, stringname,\n stringcomponent, newaction) {\n\n var stringRequests = [{key: stringname, component: stringcomponent}];\n // Do not provide an icon with duplicate, different text to the menu item.\n\n return str.get_strings(stringRequests).then(function(strings) {\n actionitem.find('span.menu-action-text').html(strings[0]);\n\n return templates.renderPix(image, 'core');\n }).then(function(pixhtml) {\n actionitem.find('.icon').replaceWith(pixhtml);\n actionitem.attr('data-action', newaction);\n return;\n }).catch(notification.exception);\n };\n\n /**\n * Default post-processing for section AJAX edit actions.\n *\n * This can be overridden in course formats by listening to event coursesectionedited:\n *\n * $('body').on('coursesectionedited', 'li.section', function(e) {\n * var action = e.action,\n * sectionElement = $(e.target),\n * data = e.ajaxreturn;\n * // ... Do some processing here.\n * e.preventDefault(); // Prevent default handler.\n * });\n *\n * @param {JQuery} sectionElement\n * @param {JQuery} actionItem\n * @param {Object} data\n * @param {String} courseformat\n * @param {Number} sectionid\n */\n var defaultEditSectionHandler = function(sectionElement, actionItem, data, courseformat, sectionid) {\n var action = actionItem.attr('data-action');\n if (action === 'hide' || action === 'show') {\n if (action === 'hide') {\n sectionElement.addClass('hidden');\n setSectionBadge(sectionElement[0], 'hiddenfromstudents', true, false);\n replaceActionItem(actionItem, 'i/show',\n 'showfromothers', 'format_' + courseformat, 'show');\n } else {\n setSectionBadge(sectionElement[0], 'hiddenfromstudents', false, false);\n sectionElement.removeClass('hidden');\n replaceActionItem(actionItem, 'i/hide',\n 'hidefromothers', 'format_' + courseformat, 'hide');\n }\n // Replace the modules with new html (that indicates that they are now hidden or not hidden).\n if (data.modules !== undefined) {\n for (var i in data.modules) {\n replaceActivityHtmlWith(data.modules[i]);\n }\n }\n // Replace the section availability information.\n if (data.section_availability !== undefined) {\n sectionElement.find('.section_availability').first().replaceWith(data.section_availability);\n }\n // Modify course state.\n const section = courseeditor.state.section.get(sectionid);\n if (section !== undefined) {\n courseeditor.dispatch('sectionState', [sectionid]);\n }\n } else if (action === 'setmarker') {\n var oldmarker = $(SELECTOR.SECTIONLI + '.current'),\n oldActionItem = oldmarker.find(SELECTOR.SECTIONACTIONMENU + ' ' + 'a[data-action=removemarker]');\n oldmarker.removeClass('current');\n replaceActionItem(oldActionItem, 'i/marker',\n 'highlight', 'core', 'setmarker');\n sectionElement.addClass('current');\n replaceActionItem(actionItem, 'i/marked',\n 'highlightoff', 'core', 'removemarker');\n courseeditor.dispatch('legacySectionAction', action, sectionid);\n setSectionBadge(sectionElement[0], 'iscurrent', true, true);\n } else if (action === 'removemarker') {\n sectionElement.removeClass('current');\n replaceActionItem(actionItem, 'i/marker',\n 'highlight', 'core', 'setmarker');\n courseeditor.dispatch('legacySectionAction', action, sectionid);\n setSectionBadge(sectionElement[0], 'iscurrent', false, true);\n }\n };\n\n /**\n * Get the focused element path in an activity if any.\n *\n * This method is used to restore focus when the activity HTML is refreshed.\n * Only the main course editor elements can be refocused as they are always present\n * even if the activity content changes.\n *\n * @param {String} id the element id the activity element\n * @return {String|undefined} the inner path of the focused element or undefined\n */\n const getActivityFocusedElement = function(id) {\n const element = document.getElementById(id);\n if (!element || !element.contains(document.activeElement)) {\n return undefined;\n }\n // Check if the actions menu toggler is focused.\n if (element.querySelector(SELECTOR.ACTIONAREA).contains(document.activeElement)) {\n return `${SELECTOR.ACTIONAREA} [tabindex=\"0\"]`;\n }\n // Return the current element id if any.\n if (document.activeElement.id) {\n return `#${document.activeElement.id}`;\n }\n return undefined;\n };\n\n /**\n * Replaces the course module with the new html (used to update module after it was edited or its visibility was changed).\n *\n * @param {String} activityHTML\n */\n var replaceActivityHtmlWith = function(activityHTML) {\n $('
' + activityHTML + '
').find(SELECTOR.ACTIVITYLI).each(function() {\n // Extract id from the new activity html.\n var id = $(this).attr('id');\n // Check if the current focused element is inside the activity.\n let focusedPath = getActivityFocusedElement(id);\n // Find the existing element with the same id and replace its contents with new html.\n $(SELECTOR.ACTIVITYLI + '#' + id).replaceWith(activityHTML);\n // Initialise action menu.\n initActionMenu(id);\n // Re-focus the previous elements.\n if (focusedPath) {\n const newItem = document.getElementById(id);\n newItem.querySelector(focusedPath)?.focus();\n }\n\n });\n };\n\n /**\n * Performs an action on a module (moving, deleting, duplicating, hiding, etc.)\n *\n * @param {JQuery} sectionElement section element we perform action on\n * @param {Nunmber} sectionid\n * @param {JQuery} target the element (menu item) that was clicked\n * @param {String} courseformat\n * @return {boolean} true the action call is sent to the server or false if it is ignored.\n */\n var editSection = function(sectionElement, sectionid, target, courseformat) {\n var action = target.attr('data-action'),\n sectionreturn = target.attr('data-sectionreturn') ? target.attr('data-sectionreturn') : null;\n\n // Filter direct component handled actions.\n if (courseeditor.supportComponents && componentActions.includes(action)) {\n return false;\n }\n\n var spinner = addSectionSpinner(sectionElement);\n var promises = ajax.call([{\n methodname: 'core_course_edit_section',\n args: {id: sectionid, action: action, sectionreturn: sectionreturn}\n }], true);\n\n var lightbox = addSectionLightbox(sectionElement);\n $.when.apply($, promises)\n .done(function(dataencoded) {\n var data = $.parseJSON(dataencoded);\n removeSpinner(sectionElement, spinner);\n removeLightbox(lightbox);\n sectionElement.find(SELECTOR.SECTIONACTIONMENU).find(SELECTOR.TOGGLE).focus();\n // Trigger event that can be observed by course formats.\n var e = $.Event('coursesectionedited', {ajaxreturn: data, action: action});\n sectionElement.trigger(e);\n if (!e.isDefaultPrevented()) {\n defaultEditSectionHandler(sectionElement, target, data, courseformat, sectionid);\n }\n }).fail(function(ex) {\n // Remove spinner and lightbox.\n removeSpinner(sectionElement, spinner);\n removeLightbox(lightbox);\n // Trigger event that can be observed by course formats.\n var e = $.Event('coursesectioneditfailed', {exception: ex, action: action});\n sectionElement.trigger(e);\n if (!e.isDefaultPrevented()) {\n notification.exception(ex);\n }\n });\n return true;\n };\n\n /**\n * Sets the section badge in the section header.\n *\n * @param {JQuery} sectionElement section element we perform action on\n * @param {String} badgetype the type of badge this is for\n * @param {bool} add true to add, false to remove\n * @param {boolean} removeOther in case of adding a badge, whether to remove all other.\n */\n var setSectionBadge = function(sectionElement, badgetype, add, removeOther) {\n const sectionbadges = sectionElement.querySelector(SELECTOR.SECTIONBADGES);\n if (!sectionbadges) {\n return;\n }\n const badge = sectionbadges.querySelector('[data-type=\"' + badgetype + '\"]');\n if (!badge) {\n return;\n }\n if (add) {\n if (removeOther) {\n document.querySelectorAll('[data-type=\"' + badgetype + '\"]').forEach((b) => {\n b.classList.add('d-none');\n });\n }\n badge.classList.remove('d-none');\n } else {\n badge.classList.add('d-none');\n }\n };\n\n // Register a function to be executed after D&D of an activity.\n Y.use('moodle-course-coursebase', function() {\n M.course.coursebase.register_module({\n // Ignore camelcase eslint rule for the next line because it is an expected name of the callback.\n // eslint-disable-next-line camelcase\n set_visibility_resource_ui: function(args) {\n var mainelement = $(args.element.getDOMNode());\n var cmid = getModuleId(mainelement);\n if (cmid) {\n var sectionreturn = mainelement.find('.' + CSS.EDITINGMOVE).attr('data-sectionreturn');\n refreshModule(mainelement, cmid, sectionreturn);\n }\n },\n /**\n * Update the course state when some cm is moved via YUI.\n * @param {*} params\n */\n updateMovedCmState: (params) => {\n const state = courseeditor.state;\n\n // Update old section.\n const cm = state.cm.get(params.cmid);\n if (cm !== undefined) {\n courseeditor.dispatch('sectionState', [cm.sectionid]);\n }\n // Update cm state.\n courseeditor.dispatch('cmState', [params.cmid]);\n },\n /**\n * Update the course state when some section is moved via YUI.\n */\n updateMovedSectionState: () => {\n courseeditor.dispatch('courseState');\n },\n });\n });\n\n // From Moodle 4.0 all edit actions are being re-implemented as state mutation.\n // This means all method from this \"actions\" module will be deprecated when all the course\n // interface is migrated to reactive components.\n // Most legacy actions did not provide enough information to regenarate the course so they\n // use the mutations courseState, sectionState and cmState to get the updated state from\n // the server. However, some activity actions where we can prevent an extra webservice\n // call by implementing an adhoc mutation.\n courseeditor.addMutations({\n /**\n * Compatibility function to update Moodle 4.0 course state using legacy actions.\n *\n * This method only updates some actions which does not require to use cmState mutation\n * to get updated data form the server.\n *\n * @param {Object} statemanager the current state in read write mode\n * @param {String} action the performed action\n * @param {Number} cmid the affected course module id\n * @param {Array} affectedids all affected cm ids (for duplicate action)\n */\n legacyActivityAction: function(statemanager, action, cmid, affectedids) {\n\n const state = statemanager.state;\n const cm = state.cm.get(cmid);\n if (cm === undefined) {\n return;\n }\n const section = state.section.get(cm.sectionid);\n if (section === undefined) {\n return;\n }\n\n // Send the element is locked.\n courseeditor.dispatch('cmLock', [cm.id], true);\n\n // Now we do the real mutation.\n statemanager.setReadOnly(false);\n\n // This unlocked will take effect when the read only is restored.\n cm.locked = false;\n\n switch (action) {\n case 'delete':\n // Remove from section.\n section.cmlist = section.cmlist.reduce(\n (cmlist, current) => {\n if (current != cmid) {\n cmlist.push(current);\n }\n return cmlist;\n },\n []\n );\n // Delete form list.\n state.cm.delete(cmid);\n break;\n\n case 'hide':\n case 'show':\n case 'duplicate':\n courseeditor.dispatch('cmState', affectedids);\n break;\n }\n statemanager.setReadOnly(true);\n },\n legacySectionAction: function(statemanager, action, sectionid) {\n\n const state = statemanager.state;\n const section = state.section.get(sectionid);\n if (section === undefined) {\n return;\n }\n\n // Send the element is locked. Reactive events are only triggered when the state\n // read only mode is restored. We want to notify the interface the element is\n // locked so we need to do a quick lock operation before performing the rest\n // of the mutation.\n statemanager.setReadOnly(false);\n section.locked = true;\n statemanager.setReadOnly(true);\n\n // Now we do the real mutation.\n statemanager.setReadOnly(false);\n\n // This locked will take effect when the read only is restored.\n section.locked = false;\n\n switch (action) {\n case 'setmarker':\n // Remove previous marker.\n state.section.forEach((current) => {\n if (current.id != sectionid) {\n current.current = false;\n }\n });\n section.current = true;\n break;\n\n case 'removemarker':\n section.current = false;\n break;\n }\n statemanager.setReadOnly(true);\n },\n });\n\n return /** @alias module:core_course/actions */ {\n\n /**\n * Initialises course page\n *\n * @method init\n * @param {String} courseformat name of the current course format (for fetching strings)\n */\n initCoursePage: function(courseformat) {\n\n formatname = courseformat;\n\n // Add a handler for course module actions.\n $('body').on('click keypress', SELECTOR.ACTIVITYLI + ' ' +\n SELECTOR.ACTIVITYACTION + '[data-action]', function(e) {\n if (e.type === 'keypress' && e.keyCode !== 13) {\n return;\n }\n var actionItem = $(this),\n moduleElement = actionItem.closest(SELECTOR.ACTIVITYLI),\n action = actionItem.attr('data-action'),\n moduleId = getModuleId(moduleElement);\n switch (action) {\n case 'moveleft':\n case 'moveright':\n case 'delete':\n case 'duplicate':\n case 'hide':\n case 'stealth':\n case 'show':\n case 'groupsseparate':\n case 'groupsvisible':\n case 'groupsnone':\n break;\n default:\n // Nothing to do here!\n return;\n }\n if (!moduleId) {\n return;\n }\n e.preventDefault();\n if (action === 'delete') {\n // Deleting requires confirmation.\n confirmDeleteModule(moduleElement, function() {\n editModule(moduleElement, moduleId, actionItem);\n });\n } else {\n editModule(moduleElement, moduleId, actionItem);\n }\n });\n\n // Add a handler for section show/hide actions.\n $('body').on('click keypress', SELECTOR.SECTIONLI + ' ' +\n SELECTOR.SECTIONACTIONMENU + '[data-sectionid] ' +\n 'a[data-action]', function(e) {\n if (e.type === 'keypress' && e.keyCode !== 13) {\n return;\n }\n var actionItem = $(this),\n sectionElement = actionItem.closest(SELECTOR.SECTIONLI),\n sectionId = actionItem.closest(SELECTOR.SECTIONACTIONMENU).attr('data-sectionid');\n\n if (actionItem.attr('data-action') === 'permalink') {\n e.preventDefault();\n ModalCopyToClipboard.create({\n text: actionItem.attr('href'),\n }, str.get_string('sectionlink', 'course')\n );\n return;\n }\n\n let isExecuted = true;\n if (actionItem.attr('data-confirm')) {\n // Action requires confirmation.\n confirmEditSection(actionItem.attr('data-confirm'), function() {\n isExecuted = editSection(sectionElement, sectionId, actionItem, courseformat);\n });\n } else {\n isExecuted = editSection(sectionElement, sectionId, actionItem, courseformat);\n }\n // Prevent any other module from capturing the action if it is already in execution.\n if (isExecuted) {\n e.preventDefault();\n }\n });\n\n // The section and activity names are edited using inplace editable.\n // The \"update\" jQuery event must be captured in order to update the course state.\n $('body').on('updated', `${SELECTOR.SECTIONLI} ${SELECTOR.SECTIONITEM} [data-inplaceeditable]`, function(e) {\n if (e.ajaxreturn && e.ajaxreturn.itemid) {\n const state = courseeditor.state;\n const section = state.section.get(e.ajaxreturn.itemid);\n if (section !== undefined) {\n courseeditor.dispatch('sectionState', [e.ajaxreturn.itemid]);\n }\n }\n });\n $('body').on('updated', `${SELECTOR.ACTIVITYLI} [data-inplaceeditable]`, function(e) {\n if (e.ajaxreturn && e.ajaxreturn.itemid) {\n courseeditor.dispatch('cmState', [e.ajaxreturn.itemid]);\n }\n });\n\n // Component-based formats don't use modals to create sections.\n if (courseeditor.supportComponents && componentActions.includes('addSection')) {\n return;\n }\n\n // Add a handler for \"Add sections\" link to ask for a number of sections to add.\n const trigger = $(SELECTOR.ADDSECTIONS);\n const modalTitle = trigger.attr('data-add-sections');\n const newSections = trigger.attr('data-new-sections');\n str.get_string('numberweeks')\n .then(function(strNumberSections) {\n var modalBody = $('
' +\n '
');\n modalBody.find('label').html(strNumberSections);\n\n return modalBody.html();\n })\n .then((body) => ModalSaveCancel.create({\n body,\n title: modalTitle,\n }))\n .then(function(modal) {\n var numSections = $(modal.getBody()).find('#add_section_numsections'),\n addSections = function() {\n // Check if value of the \"Number of sections\" is a valid positive integer and redirect\n // to adding a section script.\n if ('' + parseInt(numSections.val()) === numSections.val() && parseInt(numSections.val()) >= 1) {\n document.location = trigger.attr('href') + '&numsections=' + parseInt(numSections.val());\n }\n };\n modal.setSaveButtonText(modalTitle);\n modal.getRoot().on(ModalEvents.shown, function() {\n // When modal is shown focus and select the input and add a listener to keypress of \"Enter\".\n numSections.focus().select().on('keydown', function(e) {\n if (e.keyCode === KeyCodes.enter) {\n addSections();\n }\n });\n });\n modal.getRoot().on(ModalEvents.save, function(e) {\n // When modal \"Add\" button is pressed.\n e.preventDefault();\n addSections();\n });\n\n trigger.on('click', (e) => {\n e.preventDefault();\n modal.show();\n });\n\n return modal;\n })\n .catch(notification.exception);\n },\n\n /**\n * Replaces a section action menu item with another one (for example Show->Hide, Set marker->Remove marker)\n *\n * This method can be used by course formats in their listener to the coursesectionedited event\n *\n * @deprecated since Moodle 3.9\n * @param {JQuery} sectionelement\n * @param {String} selector CSS selector inside the section element, for example \"a[data-action=show]\"\n * @param {String} image new image name (\"i/show\", \"i/hide\", etc.)\n * @param {String} stringname new string for the action menu item\n * @param {String} stringcomponent\n * @param {String} newaction new value for data-action attribute of the link\n */\n replaceSectionActionItem: function(sectionelement, selector, image, stringname,\n stringcomponent, newaction) {\n log.debug('replaceSectionActionItem() is deprecated and will be removed.');\n var actionitem = sectionelement.find(SELECTOR.SECTIONACTIONMENU + ' ' + selector);\n replaceActionItem(actionitem, image, stringname, stringcomponent, newaction);\n },\n // Method to refresh a module.\n refreshModule,\n refreshSection,\n };\n });\n"],"names":["define","$","ajax","templates","notification","str","url","Y","ModalCopyToClipboard","ModalSaveCancel","ModalEvents","KeyCodes","log","editor","EventDispatcher","CourseEvents","componentActions","courseeditor","getCurrentCourseEditor","formatname","CSS","SELECTOR","ACTIVITYLI","ACTIONAREA","ACTIVITYACTION","MENU","TOGGLE","SECTIONLI","SECTIONACTIONMENU","SECTIONITEM","ADDSECTIONS","SECTIONBADGES","use","courseformatselector","M","course","format","get_section_selector","dispatchEvent","eventName","detail","container","options","Element","undefined","get","getModuleId","element","item","dataset","id","Moodle","core_course","util","cm","getId","Node","addActivitySpinner","activity","addClass","actionarea","find","spinner","add_spinner","show","data","dispatch","addSectionSpinner","sectionelement","addSectionLightbox","lightbox","add_lightbox","for","setAttribute","removeSpinner","delay","window","setTimeout","removeClass","hide","mutation","removeLightbox","getAttribute","initActionMenu","elementid","coursebase","invoke_function","core","actionmenu","newDOMNode","one","editModule","moduleElement","cmid","target","action","attr","promises","call","methodname","args","sectionreturn","closest","when","apply","done","mainElement","tabables","isInside","foundElement","elementToFocus","each","contains","this","replaceWith","affectedids","index","elementId","mainelement","selector","is","focus","focusActionItem","push","trigger","Event","ajaxreturn","fail","ex","e","exception","isDefaultPrevented","refreshModule","sectionReturn","activityElement","Promise","resolve","reject","replaceActivityHtmlWith","confirmDeleteModule","onconfirm","modtypename","match","modulename","name","getName","state","_state$cm$get","getModuleName","get_string","pluginname","plugindata","type","get_strings","key","component","param","s","confirm","replaceActionItem","actionitem","image","stringname","stringcomponent","newaction","stringRequests","then","strings","html","renderPix","pixhtml","catch","defaultEditSectionHandler","sectionElement","actionItem","courseformat","sectionid","setSectionBadge","modules","i","section_availability","first","section","oldmarker","oldActionItem","activityHTML","focusedPath","document","getElementById","activeElement","querySelector","getActivityFocusedElement","editSection","supportComponents","includes","dataencoded","parseJSON","badgetype","add","removeOther","sectionbadges","badge","querySelectorAll","forEach","b","classList","remove","register_module","set_visibility_resource_ui","getDOMNode","updateMovedCmState","params","updateMovedSectionState","addMutations","legacyActivityAction","statemanager","setReadOnly","locked","cmlist","reduce","current","delete","legacySectionAction","initCoursePage","on","keyCode","moduleId","preventDefault","sectionId","create","text","isExecuted","message","itemid","modalTitle","newSections","strNumberSections","modalBody","body","title","modal","numSections","getBody","addSections","parseInt","val","location","setSaveButtonText","getRoot","shown","select","enter","save","replaceSectionActionItem","debug","refreshSection","newSectionElement","content","sectionRefreshed","defaultPrevented"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"actions.min.js","sources":["../src/actions.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Various actions on modules and sections in the editing mode - hiding, duplicating, deleting, etc.\n *\n * @module core_course/actions\n * @copyright 2016 Marina Glancy\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.3\n */\ndefine(\n [\n 'jquery',\n 'core/ajax',\n 'core/templates',\n 'core/notification',\n 'core/str',\n 'core/url',\n 'core/yui',\n 'core/modal_copy_to_clipboard',\n 'core/modal_save_cancel',\n 'core/modal_events',\n 'core/key_codes',\n 'core/log',\n 'core_courseformat/courseeditor',\n 'core/event_dispatcher',\n 'core_course/events'\n ],\n function(\n $,\n ajax,\n templates,\n notification,\n str,\n url,\n Y,\n ModalCopyToClipboard,\n ModalSaveCancel,\n ModalEvents,\n KeyCodes,\n log,\n editor,\n EventDispatcher,\n CourseEvents\n ) {\n\n // Eventually, core_courseformat/local/content/actions will handle all actions for\n // component compatible formats and the default actions.js won't be necessary anymore.\n // Meanwhile, we filter the migrated actions.\n const componentActions = [\n 'moveSection', 'moveCm', 'addSection', 'deleteSection', 'cmDelete', 'cmDuplicate', 'sectionHide', 'sectionShow',\n 'cmHide', 'cmShow', 'cmStealth', 'sectionHighlight', 'sectionUnhighlight', 'cmMoveRight', 'cmMoveLeft',\n 'cmNoGroups', 'cmVisibleGroups', 'cmSeparateGroups',\n ];\n\n // The course reactive instance.\n const courseeditor = editor.getCurrentCourseEditor();\n\n // The current course format name (loaded on init).\n let formatname;\n\n var CSS = {\n EDITINPROGRESS: 'editinprogress',\n SECTIONDRAGGABLE: 'sectiondraggable',\n EDITINGMOVE: 'editing_move'\n };\n var SELECTOR = {\n ACTIVITYLI: 'li.activity',\n ACTIONAREA: '.actions',\n ACTIVITYACTION: 'a.cm-edit-action',\n MENU: '.moodle-actionmenu[data-enhance=moodle-core-actionmenu]',\n TOGGLE: '.toggle-display,.dropdown-toggle',\n SECTIONLI: 'li.section',\n SECTIONACTIONMENU: '.section_action_menu',\n SECTIONITEM: '[data-for=\"section_title\"]',\n ADDSECTIONS: '.changenumsections [data-add-sections]',\n SECTIONBADGES: '[data-region=\"sectionbadges\"]',\n };\n\n Y.use('moodle-course-coursebase', function() {\n var courseformatselector = M.course.format.get_section_selector();\n if (courseformatselector) {\n SELECTOR.SECTIONLI = courseformatselector;\n }\n });\n\n /**\n * Dispatch event wrapper.\n *\n * Old jQuery events will be replaced by native events gradually.\n *\n * @method dispatchEvent\n * @param {String} eventName The name of the event\n * @param {Object} detail Any additional details to pass into the eveent\n * @param {Node|HTMLElement} container The point at which to dispatch the event\n * @param {Object} options\n * @param {Boolean} options.bubbles Whether to bubble up the DOM\n * @param {Boolean} options.cancelable Whether preventDefault() can be called\n * @param {Boolean} options.composed Whether the event can bubble across the ShadowDOM boundary\n * @returns {CustomEvent}\n */\n const dispatchEvent = function(eventName, detail, container, options) {\n // Most actions still uses jQuery node instead of regular HTMLElement.\n if (!(container instanceof Element) && container.get !== undefined) {\n container = container.get(0);\n }\n return EventDispatcher.dispatchEvent(eventName, detail, container, options);\n };\n\n /**\n * Wrapper for Y.Moodle.core_course.util.cm.getId\n *\n * @param {JQuery} element\n * @returns {Integer}\n */\n var getModuleId = function(element) {\n // Check if we have a data-id first.\n const item = element.get(0);\n if (item.dataset.id) {\n return item.dataset.id;\n }\n // Use YUI way if data-id is not present.\n let id;\n Y.use('moodle-course-util', function(Y) {\n id = Y.Moodle.core_course.util.cm.getId(Y.Node(item));\n });\n return id;\n };\n\n /**\n * Wrapper for Y.Moodle.core_course.util.cm.getName\n *\n * @param {JQuery} element\n * @returns {String}\n */\n var getModuleName = function(element) {\n var name;\n Y.use('moodle-course-util', function(Y) {\n name = Y.Moodle.core_course.util.cm.getName(Y.Node(element.get(0)));\n });\n // Check if we have the name in the course state.\n const state = courseeditor.state;\n const cmid = getModuleId(element);\n if (!name && state && cmid) {\n name = state.cm.get(cmid)?.name;\n }\n return name;\n };\n\n /**\n * Wrapper for M.util.add_spinner for an activity\n *\n * @param {JQuery} activity\n * @returns {Node}\n */\n var addActivitySpinner = function(activity) {\n activity.addClass(CSS.EDITINPROGRESS);\n var actionarea = activity.find(SELECTOR.ACTIONAREA).get(0);\n if (actionarea) {\n var spinner = M.util.add_spinner(Y, Y.Node(actionarea));\n spinner.show();\n // Lock the activity state element.\n if (activity.data('id') !== undefined) {\n courseeditor.dispatch('cmLock', [activity.data('id')], true);\n }\n return spinner;\n }\n return null;\n };\n\n /**\n * Wrapper for M.util.add_spinner for a section\n *\n * @param {JQuery} sectionelement\n * @returns {Node}\n */\n var addSectionSpinner = function(sectionelement) {\n sectionelement.addClass(CSS.EDITINPROGRESS);\n var actionarea = sectionelement.find(SELECTOR.SECTIONACTIONMENU).get(0);\n if (actionarea) {\n var spinner = M.util.add_spinner(Y, Y.Node(actionarea));\n spinner.show();\n // Lock the section state element.\n if (sectionelement.data('id') !== undefined) {\n courseeditor.dispatch('sectionLock', [sectionelement.data('id')], true);\n }\n return spinner;\n }\n return null;\n };\n\n /**\n * Wrapper for M.util.add_lightbox\n *\n * @param {JQuery} sectionelement\n * @returns {Node}\n */\n var addSectionLightbox = function(sectionelement) {\n const item = sectionelement.get(0);\n var lightbox = M.util.add_lightbox(Y, Y.Node(item));\n if (item.dataset.for == 'section' && item.dataset.id) {\n courseeditor.dispatch('sectionLock', [item.dataset.id], true);\n lightbox.setAttribute('data-state', 'section');\n lightbox.setAttribute('data-state-id', item.dataset.id);\n }\n lightbox.show();\n return lightbox;\n };\n\n /**\n * Removes the spinner element\n *\n * @param {JQuery} element\n * @param {Node} spinner\n * @param {Number} delay\n */\n var removeSpinner = function(element, spinner, delay) {\n window.setTimeout(function() {\n element.removeClass(CSS.EDITINPROGRESS);\n if (spinner) {\n spinner.hide();\n }\n // Unlock the state element.\n if (element.data('id') !== undefined) {\n const mutation = (element.data('for') === 'section') ? 'sectionLock' : 'cmLock';\n courseeditor.dispatch(mutation, [element.data('id')], false);\n }\n }, delay);\n };\n\n /**\n * Removes the lightbox element\n *\n * @param {Node} lightbox lighbox YUI element returned by addSectionLightbox\n * @param {Number} delay\n */\n var removeLightbox = function(lightbox, delay) {\n if (lightbox) {\n window.setTimeout(function() {\n lightbox.hide();\n // Unlock state if necessary.\n if (lightbox.getAttribute('data-state')) {\n courseeditor.dispatch(\n `${lightbox.getAttribute('data-state')}Lock`,\n [lightbox.getAttribute('data-state-id')],\n false\n );\n }\n }, delay);\n }\n };\n\n /**\n * Initialise action menu for the element (section or module)\n *\n * @param {String} elementid CSS id attribute of the element\n */\n var initActionMenu = function(elementid) {\n // Initialise action menu in the new activity.\n Y.use('moodle-course-coursebase', function() {\n M.course.coursebase.invoke_function('setup_for_resource', '#' + elementid);\n });\n if (M.core.actionmenu && M.core.actionmenu.newDOMNode) {\n M.core.actionmenu.newDOMNode(Y.one('#' + elementid));\n }\n };\n\n /**\n * Returns focus to the element that was clicked or \"Edit\" link if element is no longer visible.\n *\n * @param {String} elementId CSS id attribute of the element\n * @param {String} action data-action property of the element that was clicked\n */\n var focusActionItem = function(elementId, action) {\n var mainelement = $('#' + elementId);\n var selector = '[data-action=' + action + ']';\n if (action === 'groupsseparate' || action === 'groupsvisible' || action === 'groupsnone') {\n // New element will have different data-action.\n selector = '[data-action=groupsseparate],[data-action=groupsvisible],[data-action=groupsnone]';\n }\n if (mainelement.find(selector).is(':visible')) {\n mainelement.find(selector).focus();\n } else {\n // Element not visible, focus the \"Edit\" link.\n mainelement.find(SELECTOR.MENU).find(SELECTOR.TOGGLE).focus();\n }\n };\n\n /**\n * Find next
after the element\n *\n * @param {JQuery} mainElement element that is about to be deleted\n * @returns {JQuery}\n */\n var findNextFocusable = function(mainElement) {\n var tabables = $(\"a:visible\");\n var isInside = false;\n var foundElement = null;\n tabables.each(function() {\n if ($.contains(mainElement[0], this)) {\n isInside = true;\n } else if (isInside) {\n foundElement = this;\n return false; // Returning false in .each() is equivalent to \"break;\" inside the loop in php.\n }\n return true;\n });\n return foundElement;\n };\n\n /**\n * Performs an action on a module (moving, deleting, duplicating, hiding, etc.)\n *\n * @param {JQuery} moduleElement activity element we perform action on\n * @param {Number} cmid\n * @param {JQuery} target the element (menu item) that was clicked\n */\n var editModule = function(moduleElement, cmid, target) {\n var action = target.attr('data-action');\n var spinner = addActivitySpinner(moduleElement);\n var promises = ajax.call([{\n methodname: 'core_course_edit_module',\n args: {id: cmid,\n action: action,\n sectionreturn: target.attr('data-sectionreturn') ? target.attr('data-sectionreturn') : null\n }\n }], true);\n\n var lightbox;\n if (action === 'duplicate') {\n lightbox = addSectionLightbox(target.closest(SELECTOR.SECTIONLI));\n }\n $.when.apply($, promises)\n .done(function(data) {\n var elementToFocus = findNextFocusable(moduleElement);\n moduleElement.replaceWith(data);\n let affectedids = [];\n // Initialise action menu for activity(ies) added as a result of this.\n $('
' + data + '
').find(SELECTOR.ACTIVITYLI).each(function(index) {\n initActionMenu($(this).attr('id'));\n if (index === 0) {\n focusActionItem($(this).attr('id'), action);\n elementToFocus = null;\n }\n // Save any activity id in cmids.\n affectedids.push(getModuleId($(this)));\n });\n // In case of activity deletion focus the next focusable element.\n if (elementToFocus) {\n elementToFocus.focus();\n }\n // Remove spinner and lightbox with a delay.\n removeSpinner(moduleElement, spinner, 400);\n removeLightbox(lightbox, 400);\n // Trigger event that can be observed by course formats.\n moduleElement.trigger($.Event('coursemoduleedited', {ajaxreturn: data, action: action}));\n\n // Modify cm state.\n courseeditor.dispatch('legacyActivityAction', action, cmid, affectedids);\n\n }).fail(function(ex) {\n // Remove spinner and lightbox.\n removeSpinner(moduleElement, spinner);\n removeLightbox(lightbox);\n // Trigger event that can be observed by course formats.\n var e = $.Event('coursemoduleeditfailed', {exception: ex, action: action});\n moduleElement.trigger(e);\n if (!e.isDefaultPrevented()) {\n notification.exception(ex);\n }\n });\n };\n\n /**\n * Requests html for the module via WS core_course_get_module and updates the module on the course page\n *\n * Used after d&d of the module to another section\n *\n * @param {JQuery|Element} element\n * @param {Number} cmid\n * @param {Number} sectionreturn\n * @return {Promise} the refresh promise\n */\n var refreshModule = function(element, cmid, sectionreturn) {\n\n if (sectionreturn === undefined) {\n sectionreturn = courseeditor.sectionReturn;\n }\n\n const activityElement = $(element);\n var spinner = addActivitySpinner(activityElement);\n var promises = ajax.call([{\n methodname: 'core_course_get_module',\n args: {id: cmid, sectionreturn: sectionreturn}\n }], true);\n\n return new Promise((resolve, reject) => {\n $.when.apply($, promises)\n .done(function(data) {\n removeSpinner(activityElement, spinner, 400);\n replaceActivityHtmlWith(data);\n resolve(data);\n }).fail(function() {\n removeSpinner(activityElement, spinner);\n reject();\n });\n });\n };\n\n /**\n * Requests html for the section via WS core_course_edit_section and updates the section on the course page\n *\n * @param {JQuery|Element} element\n * @param {Number} sectionid\n * @param {Number} sectionreturn\n * @return {Promise} the refresh promise\n */\n var refreshSection = function(element, sectionid, sectionreturn) {\n\n if (sectionreturn === undefined) {\n sectionreturn = courseeditor.sectionReturn;\n }\n\n const sectionElement = $(element);\n const action = 'refresh';\n const promises = ajax.call([{\n methodname: 'core_course_edit_section',\n args: {id: sectionid, action, sectionreturn},\n }], true);\n\n var spinner = addSectionSpinner(sectionElement);\n return new Promise((resolve, reject) => {\n $.when.apply($, promises)\n .done(dataencoded => {\n\n removeSpinner(sectionElement, spinner);\n const data = $.parseJSON(dataencoded);\n\n const newSectionElement = $(data.content);\n sectionElement.replaceWith(newSectionElement);\n\n // Init modules menus.\n $(`${SELECTOR.SECTIONLI}#${sectionid} ${SELECTOR.ACTIVITYLI}`).each(\n (index, activity) => {\n initActionMenu(activity.data('id'));\n }\n );\n\n // Trigger event that can be observed by course formats.\n const event = dispatchEvent(\n CourseEvents.sectionRefreshed,\n {\n ajaxreturn: data,\n action: action,\n newSectionElement: newSectionElement.get(0),\n },\n newSectionElement\n );\n\n if (!event.defaultPrevented) {\n defaultEditSectionHandler(\n newSectionElement, $(SELECTOR.SECTIONLI + '#' + sectionid),\n data,\n formatname,\n sectionid\n );\n }\n resolve(data);\n }).fail(ex => {\n // Trigger event that can be observed by course formats.\n const event = dispatchEvent(\n 'coursesectionrefreshfailed',\n {exception: ex, action: action},\n sectionElement\n );\n if (!event.defaultPrevented) {\n notification.exception(ex);\n }\n reject();\n });\n });\n };\n\n /**\n * Displays the delete confirmation to delete a module\n *\n * @param {JQuery} mainelement activity element we perform action on\n * @param {function} onconfirm function to execute on confirm\n */\n var confirmDeleteModule = function(mainelement, onconfirm) {\n var modtypename = mainelement.attr('class').match(/modtype_([^\\s]*)/)[1];\n var modulename = getModuleName(mainelement);\n\n str.get_string('pluginname', modtypename).done(function(pluginname) {\n var plugindata = {\n type: pluginname,\n name: modulename\n };\n str.get_strings([\n {key: 'confirm', component: 'core'},\n {key: modulename === null ? 'deletechecktype' : 'deletechecktypename', param: plugindata},\n {key: 'yes'},\n {key: 'no'}\n ]).done(function(s) {\n notification.confirm(s[0], s[1], s[2], s[3], onconfirm);\n }\n );\n });\n };\n\n /**\n * Displays the delete confirmation to delete a section\n *\n * @param {String} message confirmation message\n * @param {function} onconfirm function to execute on confirm\n */\n var confirmEditSection = function(message, onconfirm) {\n str.get_strings([\n {key: 'confirm'}, // TODO link text\n {key: 'yes'},\n {key: 'no'}\n ]).done(function(s) {\n notification.confirm(s[0], message, s[1], s[2], onconfirm);\n }\n );\n };\n\n /**\n * Replaces an action menu item with another one (for example Show->Hide, Set marker->Remove marker)\n *\n * @param {JQuery} actionitem\n * @param {String} image new image name (\"i/show\", \"i/hide\", etc.)\n * @param {String} stringname new string for the action menu item\n * @param {String} stringcomponent\n * @param {String} newaction new value for data-action attribute of the link\n * @return {Promise} promise which is resolved when the replacement has completed\n */\n var replaceActionItem = function(actionitem, image, stringname,\n stringcomponent, newaction) {\n\n var stringRequests = [{key: stringname, component: stringcomponent}];\n // Do not provide an icon with duplicate, different text to the menu item.\n\n return str.get_strings(stringRequests).then(function(strings) {\n actionitem.find('span.menu-action-text').html(strings[0]);\n\n return templates.renderPix(image, 'core');\n }).then(function(pixhtml) {\n actionitem.find('.icon').replaceWith(pixhtml);\n actionitem.attr('data-action', newaction);\n return;\n }).catch(notification.exception);\n };\n\n /**\n * Default post-processing for section AJAX edit actions.\n *\n * This can be overridden in course formats by listening to event coursesectionedited:\n *\n * $('body').on('coursesectionedited', 'li.section', function(e) {\n * var action = e.action,\n * sectionElement = $(e.target),\n * data = e.ajaxreturn;\n * // ... Do some processing here.\n * e.preventDefault(); // Prevent default handler.\n * });\n *\n * @param {JQuery} sectionElement\n * @param {JQuery} actionItem\n * @param {Object} data\n * @param {String} courseformat\n * @param {Number} sectionid\n */\n var defaultEditSectionHandler = function(sectionElement, actionItem, data, courseformat, sectionid) {\n var action = actionItem.attr('data-action');\n if (action === 'hide' || action === 'show') {\n if (action === 'hide') {\n sectionElement.addClass('hidden');\n setSectionBadge(sectionElement[0], 'hiddenfromstudents', true, false);\n replaceActionItem(actionItem, 'i/show',\n 'showfromothers', 'format_' + courseformat, 'show');\n } else {\n setSectionBadge(sectionElement[0], 'hiddenfromstudents', false, false);\n sectionElement.removeClass('hidden');\n replaceActionItem(actionItem, 'i/hide',\n 'hidefromothers', 'format_' + courseformat, 'hide');\n }\n // Replace the modules with new html (that indicates that they are now hidden or not hidden).\n if (data.modules !== undefined) {\n for (var i in data.modules) {\n replaceActivityHtmlWith(data.modules[i]);\n }\n }\n // Replace the section availability information.\n if (data.section_availability !== undefined) {\n sectionElement.find('.section_availability').first().replaceWith(data.section_availability);\n }\n // Modify course state.\n const section = courseeditor.state.section.get(sectionid);\n if (section !== undefined) {\n courseeditor.dispatch('sectionState', [sectionid]);\n }\n } else if (action === 'setmarker') {\n var oldmarker = $(SELECTOR.SECTIONLI + '.current'),\n oldActionItem = oldmarker.find(SELECTOR.SECTIONACTIONMENU + ' ' + 'a[data-action=removemarker]');\n oldmarker.removeClass('current');\n replaceActionItem(oldActionItem, 'i/marker',\n 'highlight', 'core', 'setmarker');\n sectionElement.addClass('current');\n replaceActionItem(actionItem, 'i/marked',\n 'highlightoff', 'core', 'removemarker');\n courseeditor.dispatch('legacySectionAction', action, sectionid);\n setSectionBadge(sectionElement[0], 'iscurrent', true, true);\n } else if (action === 'removemarker') {\n sectionElement.removeClass('current');\n replaceActionItem(actionItem, 'i/marker',\n 'highlight', 'core', 'setmarker');\n courseeditor.dispatch('legacySectionAction', action, sectionid);\n setSectionBadge(sectionElement[0], 'iscurrent', false, true);\n }\n };\n\n /**\n * Get the focused element path in an activity if any.\n *\n * This method is used to restore focus when the activity HTML is refreshed.\n * Only the main course editor elements can be refocused as they are always present\n * even if the activity content changes.\n *\n * @param {String} id the element id the activity element\n * @return {String|undefined} the inner path of the focused element or undefined\n */\n const getActivityFocusedElement = function(id) {\n const element = document.getElementById(id);\n if (!element || !element.contains(document.activeElement)) {\n return undefined;\n }\n // Check if the actions menu toggler is focused.\n if (element.querySelector(SELECTOR.ACTIONAREA).contains(document.activeElement)) {\n return `${SELECTOR.ACTIONAREA} [tabindex=\"0\"]`;\n }\n // Return the current element id if any.\n if (document.activeElement.id) {\n return `#${document.activeElement.id}`;\n }\n return undefined;\n };\n\n /**\n * Replaces the course module with the new html (used to update module after it was edited or its visibility was changed).\n *\n * @param {String} activityHTML\n */\n var replaceActivityHtmlWith = function(activityHTML) {\n $('
' + activityHTML + '
').find(SELECTOR.ACTIVITYLI).each(function() {\n // Extract id from the new activity html.\n var id = $(this).attr('id');\n // Check if the current focused element is inside the activity.\n let focusedPath = getActivityFocusedElement(id);\n // Find the existing element with the same id and replace its contents with new html.\n $(SELECTOR.ACTIVITYLI + '#' + id).replaceWith(activityHTML);\n // Initialise action menu.\n initActionMenu(id);\n // Re-focus the previous elements.\n if (focusedPath) {\n const newItem = document.getElementById(id);\n newItem.querySelector(focusedPath)?.focus();\n }\n\n });\n };\n\n /**\n * Performs an action on a module (moving, deleting, duplicating, hiding, etc.)\n *\n * @param {JQuery} sectionElement section element we perform action on\n * @param {Nunmber} sectionid\n * @param {JQuery} target the element (menu item) that was clicked\n * @param {String} courseformat\n * @return {boolean} true the action call is sent to the server or false if it is ignored.\n */\n var editSection = function(sectionElement, sectionid, target, courseformat) {\n var action = target.attr('data-action'),\n sectionreturn = target.attr('data-sectionreturn') ? target.attr('data-sectionreturn') : null;\n\n // Filter direct component handled actions.\n if (courseeditor.supportComponents && componentActions.includes(action)) {\n return false;\n }\n\n var spinner = addSectionSpinner(sectionElement);\n var promises = ajax.call([{\n methodname: 'core_course_edit_section',\n args: {id: sectionid, action: action, sectionreturn: sectionreturn}\n }], true);\n\n var lightbox = addSectionLightbox(sectionElement);\n $.when.apply($, promises)\n .done(function(dataencoded) {\n var data = $.parseJSON(dataencoded);\n removeSpinner(sectionElement, spinner);\n removeLightbox(lightbox);\n sectionElement.find(SELECTOR.SECTIONACTIONMENU).find(SELECTOR.TOGGLE).focus();\n // Trigger event that can be observed by course formats.\n var e = $.Event('coursesectionedited', {ajaxreturn: data, action: action});\n sectionElement.trigger(e);\n if (!e.isDefaultPrevented()) {\n defaultEditSectionHandler(sectionElement, target, data, courseformat, sectionid);\n }\n }).fail(function(ex) {\n // Remove spinner and lightbox.\n removeSpinner(sectionElement, spinner);\n removeLightbox(lightbox);\n // Trigger event that can be observed by course formats.\n var e = $.Event('coursesectioneditfailed', {exception: ex, action: action});\n sectionElement.trigger(e);\n if (!e.isDefaultPrevented()) {\n notification.exception(ex);\n }\n });\n return true;\n };\n\n /**\n * Sets the section badge in the section header.\n *\n * @param {JQuery} sectionElement section element we perform action on\n * @param {String} badgetype the type of badge this is for\n * @param {bool} add true to add, false to remove\n * @param {boolean} removeOther in case of adding a badge, whether to remove all other.\n */\n var setSectionBadge = function(sectionElement, badgetype, add, removeOther) {\n const sectionbadges = sectionElement.querySelector(SELECTOR.SECTIONBADGES);\n if (!sectionbadges) {\n return;\n }\n const badge = sectionbadges.querySelector('[data-type=\"' + badgetype + '\"]');\n if (!badge) {\n return;\n }\n if (add) {\n if (removeOther) {\n document.querySelectorAll('[data-type=\"' + badgetype + '\"]').forEach((b) => {\n b.classList.add('d-none');\n });\n }\n badge.classList.remove('d-none');\n } else {\n badge.classList.add('d-none');\n }\n };\n\n // Register a function to be executed after D&D of an activity.\n Y.use('moodle-course-coursebase', function() {\n M.course.coursebase.register_module({\n // Ignore camelcase eslint rule for the next line because it is an expected name of the callback.\n // eslint-disable-next-line camelcase\n set_visibility_resource_ui: function(args) {\n var mainelement = $(args.element.getDOMNode());\n var cmid = getModuleId(mainelement);\n if (cmid) {\n var sectionreturn = mainelement.find('.' + CSS.EDITINGMOVE).attr('data-sectionreturn');\n refreshModule(mainelement, cmid, sectionreturn);\n }\n },\n /**\n * Update the course state when some cm is moved via YUI.\n * @param {*} params\n */\n updateMovedCmState: (params) => {\n const state = courseeditor.state;\n\n // Update old section.\n const cm = state.cm.get(params.cmid);\n if (cm !== undefined) {\n courseeditor.dispatch('sectionState', [cm.sectionid]);\n }\n // Update cm state.\n courseeditor.dispatch('cmState', [params.cmid]);\n },\n /**\n * Update the course state when some section is moved via YUI.\n */\n updateMovedSectionState: () => {\n courseeditor.dispatch('courseState');\n },\n });\n });\n\n // From Moodle 4.0 all edit actions are being re-implemented as state mutation.\n // This means all method from this \"actions\" module will be deprecated when all the course\n // interface is migrated to reactive components.\n // Most legacy actions did not provide enough information to regenarate the course so they\n // use the mutations courseState, sectionState and cmState to get the updated state from\n // the server. However, some activity actions where we can prevent an extra webservice\n // call by implementing an adhoc mutation.\n courseeditor.addMutations({\n /**\n * Compatibility function to update Moodle 4.0 course state using legacy actions.\n *\n * This method only updates some actions which does not require to use cmState mutation\n * to get updated data form the server.\n *\n * @param {Object} statemanager the current state in read write mode\n * @param {String} action the performed action\n * @param {Number} cmid the affected course module id\n * @param {Array} affectedids all affected cm ids (for duplicate action)\n */\n legacyActivityAction: function(statemanager, action, cmid, affectedids) {\n\n const state = statemanager.state;\n const cm = state.cm.get(cmid);\n if (cm === undefined) {\n return;\n }\n const section = state.section.get(cm.sectionid);\n if (section === undefined) {\n return;\n }\n\n // Send the element is locked.\n courseeditor.dispatch('cmLock', [cm.id], true);\n\n // Now we do the real mutation.\n statemanager.setReadOnly(false);\n\n // This unlocked will take effect when the read only is restored.\n cm.locked = false;\n\n switch (action) {\n case 'delete':\n // Remove from section.\n section.cmlist = section.cmlist.reduce(\n (cmlist, current) => {\n if (current != cmid) {\n cmlist.push(current);\n }\n return cmlist;\n },\n []\n );\n // Delete form list.\n state.cm.delete(cmid);\n break;\n\n case 'hide':\n case 'show':\n case 'duplicate':\n courseeditor.dispatch('cmState', affectedids);\n break;\n }\n statemanager.setReadOnly(true);\n },\n legacySectionAction: function(statemanager, action, sectionid) {\n\n const state = statemanager.state;\n const section = state.section.get(sectionid);\n if (section === undefined) {\n return;\n }\n\n // Send the element is locked. Reactive events are only triggered when the state\n // read only mode is restored. We want to notify the interface the element is\n // locked so we need to do a quick lock operation before performing the rest\n // of the mutation.\n statemanager.setReadOnly(false);\n section.locked = true;\n statemanager.setReadOnly(true);\n\n // Now we do the real mutation.\n statemanager.setReadOnly(false);\n\n // This locked will take effect when the read only is restored.\n section.locked = false;\n\n switch (action) {\n case 'setmarker':\n // Remove previous marker.\n state.section.forEach((current) => {\n if (current.id != sectionid) {\n current.current = false;\n }\n });\n section.current = true;\n break;\n\n case 'removemarker':\n section.current = false;\n break;\n }\n statemanager.setReadOnly(true);\n },\n });\n\n return /** @alias module:core_course/actions */ {\n\n /**\n * Initialises course page\n *\n * @method init\n * @param {String} courseformat name of the current course format (for fetching strings)\n */\n initCoursePage: function(courseformat) {\n\n formatname = courseformat;\n\n // Add a handler for course module actions.\n $('body').on('click keypress', SELECTOR.ACTIVITYLI + ' ' +\n SELECTOR.ACTIVITYACTION + '[data-action]', function(e) {\n if (e.type === 'keypress' && e.keyCode !== 13) {\n return;\n }\n var actionItem = $(this),\n moduleElement = actionItem.closest(SELECTOR.ACTIVITYLI),\n action = actionItem.attr('data-action'),\n moduleId = getModuleId(moduleElement);\n switch (action) {\n case 'moveleft':\n case 'moveright':\n case 'delete':\n case 'duplicate':\n case 'hide':\n case 'stealth':\n case 'show':\n case 'groupsseparate':\n case 'groupsvisible':\n case 'groupsnone':\n break;\n default:\n // Nothing to do here!\n return;\n }\n if (!moduleId) {\n return;\n }\n e.preventDefault();\n if (action === 'delete') {\n // Deleting requires confirmation.\n confirmDeleteModule(moduleElement, function() {\n editModule(moduleElement, moduleId, actionItem);\n });\n } else {\n editModule(moduleElement, moduleId, actionItem);\n }\n });\n\n // Add a handler for section show/hide actions.\n $('body').on('click keypress', SELECTOR.SECTIONLI + ' ' +\n SELECTOR.SECTIONACTIONMENU + '[data-sectionid] ' +\n 'a[data-action]', function(e) {\n if (e.type === 'keypress' && e.keyCode !== 13) {\n return;\n }\n var actionItem = $(this),\n sectionElement = actionItem.closest(SELECTOR.SECTIONLI),\n sectionId = actionItem.closest(SELECTOR.SECTIONACTIONMENU).attr('data-sectionid');\n\n if (actionItem.attr('data-action') === 'permalink') {\n e.preventDefault();\n ModalCopyToClipboard.create({\n text: actionItem.attr('href'),\n }, str.get_string('sectionlink', 'course')\n );\n return;\n }\n\n let isExecuted = true;\n if (actionItem.attr('data-confirm')) {\n // Action requires confirmation.\n confirmEditSection(actionItem.attr('data-confirm'), function() {\n isExecuted = editSection(sectionElement, sectionId, actionItem, courseformat);\n });\n } else {\n isExecuted = editSection(sectionElement, sectionId, actionItem, courseformat);\n }\n // Prevent any other module from capturing the action if it is already in execution.\n if (isExecuted) {\n e.preventDefault();\n }\n });\n\n // The section and activity names are edited using inplace editable.\n // The \"update\" jQuery event must be captured in order to update the course state.\n $('body').on('updated', `${SELECTOR.SECTIONITEM} [data-inplaceeditable]`, function(e) {\n if (e.ajaxreturn && e.ajaxreturn.itemid) {\n const state = courseeditor.state;\n const section = state.section.get(e.ajaxreturn.itemid);\n if (section !== undefined) {\n courseeditor.dispatch('sectionState', [e.ajaxreturn.itemid]);\n }\n }\n });\n $('body').on('updated', `${SELECTOR.ACTIVITYLI} [data-inplaceeditable]`, function(e) {\n if (e.ajaxreturn && e.ajaxreturn.itemid) {\n courseeditor.dispatch('cmState', [e.ajaxreturn.itemid]);\n }\n });\n\n // Component-based formats don't use modals to create sections.\n if (courseeditor.supportComponents && componentActions.includes('addSection')) {\n return;\n }\n\n // Add a handler for \"Add sections\" link to ask for a number of sections to add.\n const trigger = $(SELECTOR.ADDSECTIONS);\n const modalTitle = trigger.attr('data-add-sections');\n const newSections = trigger.attr('data-new-sections');\n str.get_string('numberweeks')\n .then(function(strNumberSections) {\n var modalBody = $('
' +\n '
');\n modalBody.find('label').html(strNumberSections);\n\n return modalBody.html();\n })\n .then((body) => ModalSaveCancel.create({\n body,\n title: modalTitle,\n }))\n .then(function(modal) {\n var numSections = $(modal.getBody()).find('#add_section_numsections'),\n addSections = function() {\n // Check if value of the \"Number of sections\" is a valid positive integer and redirect\n // to adding a section script.\n if ('' + parseInt(numSections.val()) === numSections.val() && parseInt(numSections.val()) >= 1) {\n document.location = trigger.attr('href') + '&numsections=' + parseInt(numSections.val());\n }\n };\n modal.setSaveButtonText(modalTitle);\n modal.getRoot().on(ModalEvents.shown, function() {\n // When modal is shown focus and select the input and add a listener to keypress of \"Enter\".\n numSections.focus().select().on('keydown', function(e) {\n if (e.keyCode === KeyCodes.enter) {\n addSections();\n }\n });\n });\n modal.getRoot().on(ModalEvents.save, function(e) {\n // When modal \"Add\" button is pressed.\n e.preventDefault();\n addSections();\n });\n\n trigger.on('click', (e) => {\n e.preventDefault();\n modal.show();\n });\n\n return modal;\n })\n .catch(notification.exception);\n },\n\n /**\n * Replaces a section action menu item with another one (for example Show->Hide, Set marker->Remove marker)\n *\n * This method can be used by course formats in their listener to the coursesectionedited event\n *\n * @deprecated since Moodle 3.9\n * @param {JQuery} sectionelement\n * @param {String} selector CSS selector inside the section element, for example \"a[data-action=show]\"\n * @param {String} image new image name (\"i/show\", \"i/hide\", etc.)\n * @param {String} stringname new string for the action menu item\n * @param {String} stringcomponent\n * @param {String} newaction new value for data-action attribute of the link\n */\n replaceSectionActionItem: function(sectionelement, selector, image, stringname,\n stringcomponent, newaction) {\n log.debug('replaceSectionActionItem() is deprecated and will be removed.');\n var actionitem = sectionelement.find(SELECTOR.SECTIONACTIONMENU + ' ' + selector);\n replaceActionItem(actionitem, image, stringname, stringcomponent, newaction);\n },\n // Method to refresh a module.\n refreshModule,\n refreshSection,\n };\n });\n"],"names":["define","$","ajax","templates","notification","str","url","Y","ModalCopyToClipboard","ModalSaveCancel","ModalEvents","KeyCodes","log","editor","EventDispatcher","CourseEvents","componentActions","courseeditor","getCurrentCourseEditor","formatname","CSS","SELECTOR","ACTIVITYLI","ACTIONAREA","ACTIVITYACTION","MENU","TOGGLE","SECTIONLI","SECTIONACTIONMENU","SECTIONITEM","ADDSECTIONS","SECTIONBADGES","use","courseformatselector","M","course","format","get_section_selector","dispatchEvent","eventName","detail","container","options","Element","undefined","get","getModuleId","element","item","dataset","id","Moodle","core_course","util","cm","getId","Node","addActivitySpinner","activity","addClass","actionarea","find","spinner","add_spinner","show","data","dispatch","addSectionSpinner","sectionelement","addSectionLightbox","lightbox","add_lightbox","for","setAttribute","removeSpinner","delay","window","setTimeout","removeClass","hide","mutation","removeLightbox","getAttribute","initActionMenu","elementid","coursebase","invoke_function","core","actionmenu","newDOMNode","one","editModule","moduleElement","cmid","target","action","attr","promises","call","methodname","args","sectionreturn","closest","when","apply","done","mainElement","tabables","isInside","foundElement","elementToFocus","each","contains","this","replaceWith","affectedids","index","elementId","mainelement","selector","is","focus","focusActionItem","push","trigger","Event","ajaxreturn","fail","ex","e","exception","isDefaultPrevented","refreshModule","sectionReturn","activityElement","Promise","resolve","reject","replaceActivityHtmlWith","confirmDeleteModule","onconfirm","modtypename","match","modulename","name","getName","state","_state$cm$get","getModuleName","get_string","pluginname","plugindata","type","get_strings","key","component","param","s","confirm","replaceActionItem","actionitem","image","stringname","stringcomponent","newaction","stringRequests","then","strings","html","renderPix","pixhtml","catch","defaultEditSectionHandler","sectionElement","actionItem","courseformat","sectionid","setSectionBadge","modules","i","section_availability","first","section","oldmarker","oldActionItem","activityHTML","focusedPath","document","getElementById","activeElement","querySelector","getActivityFocusedElement","editSection","supportComponents","includes","dataencoded","parseJSON","badgetype","add","removeOther","sectionbadges","badge","querySelectorAll","forEach","b","classList","remove","register_module","set_visibility_resource_ui","getDOMNode","updateMovedCmState","params","updateMovedSectionState","addMutations","legacyActivityAction","statemanager","setReadOnly","locked","cmlist","reduce","current","delete","legacySectionAction","initCoursePage","on","keyCode","moduleId","preventDefault","sectionId","create","text","isExecuted","message","itemid","modalTitle","newSections","strNumberSections","modalBody","body","title","modal","numSections","getBody","addSections","parseInt","val","location","setSaveButtonText","getRoot","shown","select","enter","save","replaceSectionActionItem","debug","refreshSection","newSectionElement","content","sectionRefreshed","defaultPrevented"],"mappings":"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"} \ No newline at end of file diff --git a/course/amd/src/actions.js b/course/amd/src/actions.js index 1758c2a1e7e7d..6a0d35aad0abe 100644 --- a/course/amd/src/actions.js +++ b/course/amd/src/actions.js @@ -994,7 +994,7 @@ define( // The section and activity names are edited using inplace editable. // The "update" jQuery event must be captured in order to update the course state. - $('body').on('updated', `${SELECTOR.SECTIONLI} ${SELECTOR.SECTIONITEM} [data-inplaceeditable]`, function(e) { + $('body').on('updated', `${SELECTOR.SECTIONITEM} [data-inplaceeditable]`, function(e) { if (e.ajaxreturn && e.ajaxreturn.itemid) { const state = courseeditor.state; const section = state.section.get(e.ajaxreturn.itemid); diff --git a/course/section.php b/course/section.php index 7e6b5ffa72b03..90de6483de368 100644 --- a/course/section.php +++ b/course/section.php @@ -148,7 +148,10 @@ $renderable = $sectionclass->export_for_template($renderer); $controlmenuhtml = $renderable->controlmenu->menu; $PAGE->add_header_action($controlmenuhtml); - $sectionheading = $OUTPUT->render($format->inplace_editable_render_section_name($sectioninfo, false)); + $sectionheading = $OUTPUT->container( + $OUTPUT->render($format->inplace_editable_render_section_name($sectioninfo, false)), + attributes: ['data-for' => 'section_title'], + ); $PAGE->set_heading($sectionheading, false, false); } else { $PAGE->set_heading($sectiontitle); From de9c2393b27b83f06c21abdec3e0428d2df1dd97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikel=20Mart=C3=ADn?= Date: Mon, 4 Mar 2024 10:18:22 +0100 Subject: [PATCH 17/51] MDL-81050 course: Propagate section name change in the content Add a new feature to propagate the section name change through the course content. Any element with data-section-name-for= will automatically update the section name. --- course/format/amd/build/local/content.min.js | 2 +- .../format/amd/build/local/content.min.js.map | 2 +- course/format/amd/src/local/content.js | 18 ++++++++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/course/format/amd/build/local/content.min.js b/course/format/amd/build/local/content.min.js index 59f3be3e1d0e2..332d5991cdc8d 100644 --- a/course/format/amd/build/local/content.min.js +++ b/course/format/amd/build/local/content.min.js @@ -6,6 +6,6 @@ define("core_courseformat/local/content",["exports","core/reactive","core/utils" * @class core_courseformat/local/content * @copyright 2020 Ferran Recio * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_config=_interopRequireDefault(_config),_inplace_editable=_interopRequireDefault(_inplace_editable),_section=_interopRequireDefault(_section),_cmitem=_interopRequireDefault(_cmitem),_fragment=_interopRequireDefault(_fragment),_templates=_interopRequireDefault(_templates),_actions=_interopRequireDefault(_actions),CourseEvents=function(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj))return cache.get(obj);var newObj={},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}newObj.default=obj,cache&&cache.set(obj,newObj);return newObj}(CourseEvents),_jquery=_interopRequireDefault(_jquery),_pending=_interopRequireDefault(_pending);class Component extends _reactive.BaseComponent{create(descriptor){var _descriptor$sectionRe;this.name="course_format",this.selectors={SECTION:"[data-for='section']",SECTION_ITEM:"[data-for='section_title']",SECTION_CMLIST:"[data-for='cmlist']",COURSE_SECTIONLIST:"[data-for='course_sectionlist']",CM:"[data-for='cmitem']",TOGGLER:'[data-action="togglecoursecontentsection"]',COLLAPSE:'[data-toggle="collapse"]',TOGGLEALL:'[data-toggle="toggleall"]',ACTIVITYTAG:"li",SECTIONTAG:"li"},this.selectorGenerators={cmNameFor:id=>"[data-cm-name-for='".concat(id,"']")},this.classes={COLLAPSED:"collapsed",ACTIVITY:"activity",STATEDREADY:"stateready",SECTION:"section"},this.dettachedCms={},this.dettachedSections={},this.sections={},this.cms={},this.sectionReturn=null!==(_descriptor$sectionRe=descriptor.sectionReturn)&&void 0!==_descriptor$sectionRe?_descriptor$sectionRe:null,this.debouncedReloads=new Map}static init(target,selectors,sectionReturn){return new Component({element:document.getElementById(target),reactive:(0,_courseeditor.getCurrentCourseEditor)(),selectors:selectors,sectionReturn:sectionReturn})}stateReady(state){this._indexContents(),this.addEventListener(this.element,"click",this._sectionTogglers);const toogleAll=this.getElement(this.selectors.TOGGLEALL);if(toogleAll){const collapseElementIds=[...this.getElements(this.selectors.COLLAPSE)].map((element=>element.id));toogleAll.setAttribute("aria-controls",collapseElementIds.join(" ")),this.addEventListener(toogleAll,"click",this._allSectionToggler),this.addEventListener(toogleAll,"keydown",(e=>{" "===e.key&&this._allSectionToggler(e)})),this._refreshAllSectionsToggler(state)}this.reactive.supportComponents&&(this.reactive.isEditing&&new _actions.default(this),this.element.classList.add(this.classes.STATEDREADY)),this.addEventListener(this.element,CourseEvents.manualCompletionToggled,this._completionHandler),this.addEventListener(document,"scroll",this._scrollHandler),setTimeout((()=>{this._scrollHandler()}),500)}_sectionTogglers(event){const sectionlink=event.target.closest(this.selectors.TOGGLER),closestCollapse=event.target.closest(this.selectors.COLLAPSE),isChevron=null==closestCollapse?void 0:closestCollapse.closest(this.selectors.SECTION_ITEM);if(sectionlink||isChevron){var _toggler$classList$co;const section=event.target.closest(this.selectors.SECTION),toggler=section.querySelector(this.selectors.COLLAPSE),isCollapsed=null!==(_toggler$classList$co=null==toggler?void 0:toggler.classList.contains(this.classes.COLLAPSED))&&void 0!==_toggler$classList$co&&_toggler$classList$co;if(isChevron||isCollapsed){const sectionId=section.getAttribute("data-id");this.reactive.dispatch("sectionContentCollapsed",[sectionId],!isCollapsed)}}}_allSectionToggler(event){var _course$sectionlist;event.preventDefault();const isAllCollapsed=event.target.closest(this.selectors.TOGGLEALL).classList.contains(this.classes.COLLAPSED),course=this.reactive.get("course");this.reactive.dispatch("sectionContentCollapsed",null!==(_course$sectionlist=course.sectionlist)&&void 0!==_course$sectionlist?_course$sectionlist:[],!isAllCollapsed)}getWatchers(){return this.reactive.sectionReturn=this.sectionReturn,this.reactive.supportComponents?[{watch:"cm.visible:updated",handler:this._reloadCm},{watch:"cm.stealth:updated",handler:this._reloadCm},{watch:"cm.sectionid:updated",handler:this._reloadCm},{watch:"cm.indent:updated",handler:this._reloadCm},{watch:"cm.groupmode:updated",handler:this._reloadCm},{watch:"cm.name:updated",handler:this._refreshCmName},{watch:"section.number:updated",handler:this._refreshSectionNumber},{watch:"section.contentcollapsed:updated",handler:this._refreshSectionCollapsed},{watch:"transaction:start",handler:this._startProcessing},{watch:"course.sectionlist:updated",handler:this._refreshCourseSectionlist},{watch:"section.cmlist:updated",handler:this._refreshSectionCmlist},{watch:"section.visible:updated",handler:this._reloadSection},{watch:"state:updated",handler:this._indexContents}]:[]}_refreshCmName(_ref){let{element:element}=_ref;this.getElements(this.selectorGenerators.cmNameFor(element.id)).forEach((cmNameFor=>{cmNameFor.textContent=element.name}))}_refreshSectionCollapsed(_ref2){var _toggler$classList$co2;let{state:state,element:element}=_ref2;const target=this.getElement(this.selectors.SECTION,element.id);if(!target)throw new Error("Unknown section with ID ".concat(element.id));const toggler=target.querySelector(this.selectors.COLLAPSE),isCollapsed=null!==(_toggler$classList$co2=null==toggler?void 0:toggler.classList.contains(this.classes.COLLAPSED))&&void 0!==_toggler$classList$co2&&_toggler$classList$co2;if(element.contentcollapsed!==isCollapsed){var _toggler$dataset$targ;let collapsibleId=null!==(_toggler$dataset$targ=toggler.dataset.target)&&void 0!==_toggler$dataset$targ?_toggler$dataset$targ:toggler.getAttribute("href");if(!collapsibleId)return;collapsibleId=collapsibleId.replace("#","");const collapsible=document.getElementById(collapsibleId);if(!collapsible)return;(0,_jquery.default)(collapsible).collapse(element.contentcollapsed?"hide":"show")}this._refreshAllSectionsToggler(state)}_refreshAllSectionsToggler(state){const target=this.getElement(this.selectors.TOGGLEALL);if(!target)return;let allcollapsed=!0,allexpanded=!0;state.section.forEach((section=>{allcollapsed=allcollapsed&§ion.contentcollapsed,allexpanded=allexpanded&&!section.contentcollapsed})),allcollapsed&&(target.classList.add(this.classes.COLLAPSED),target.setAttribute("aria-expanded",!1)),allexpanded&&(target.classList.remove(this.classes.COLLAPSED),target.setAttribute("aria-expanded",!0))}_startProcessing(){this.dettachedCms={},this.dettachedSections={}}_completionHandler(_ref3){let{detail:detail}=_ref3;void 0!==detail&&this.reactive.dispatch("cmCompletion",[detail.cmid],detail.completed)}_scrollHandler(){const pageOffset=window.scrollY,items=this.reactive.getExporter().allItemsArray(this.reactive.state);let pageItem=null;items.every((item=>{const index="section"===item.type?this.sections:this.cms;if(void 0===index[item.id])return!0;const element=index[item.id].element;return pageItem=item,pageOffset>=element.offsetTop})),pageItem&&this.reactive.dispatch("setPageItem",pageItem.type,pageItem.id)}_refreshSectionNumber(_ref4){let{element:element}=_ref4;const target=this.getElement(this.selectors.SECTION,element.id);if(!target)return;target.id="section-".concat(element.number),target.dataset.sectionid=element.number,target.dataset.number=element.number;const inplace=_inplace_editable.default.getInplaceEditable(target.querySelector(this.selectors.SECTION_ITEM));if(inplace){const currentvalue=inplace.getValue(),currentitemid=inplace.getItemId();""===inplace.getValue()&&(currentitemid!=element.id||currentvalue==element.rawtitle&&""!=element.rawtitle||inplace.setValue(element.rawtitle))}}_refreshSectionCmlist(_ref5){var _element$cmlist;let{element:element}=_ref5;const cmlist=null!==(_element$cmlist=element.cmlist)&&void 0!==_element$cmlist?_element$cmlist:[],section=this.getElement(this.selectors.SECTION,element.id),listparent=null==section?void 0:section.querySelector(this.selectors.SECTION_CMLIST),createCm=this._createCmItem.bind(this);listparent&&this._fixOrder(listparent,cmlist,this.selectors.CM,this.dettachedCms,createCm)}_refreshCourseSectionlist(_ref6){let{state:state}=_ref6;if(null!==this.reactive.sectionReturn)return;const sectionlist=this.reactive.getExporter().listedSectionIds(state),listparent=this.getElement(this.selectors.COURSE_SECTIONLIST),createSection=this._createSectionItem.bind(this);listparent&&this._fixOrder(listparent,sectionlist,this.selectors.SECTION,this.dettachedSections,createSection)}_indexContents(){this._scanIndex(this.selectors.SECTION,this.sections,(item=>new _section.default(item))),this._scanIndex(this.selectors.CM,this.cms,(item=>new _cmitem.default(item)))}_scanIndex(selector,index,creationhandler){this.getElements("".concat(selector,":not([data-indexed])")).forEach((item=>{var _item$dataset;null!=item&&null!==(_item$dataset=item.dataset)&&void 0!==_item$dataset&&_item$dataset.id&&(void 0!==index[item.dataset.id]&&index[item.dataset.id].unregister(),index[item.dataset.id]=creationhandler({...this,element:item}),item.dataset.indexed=!0)}))}_reloadCm(_ref7){let{element:element}=_ref7;if(!this.getElement(this.selectors.CM,element.id))return;this._getDebouncedReloadCm(element.id)()}_getDebouncedReloadCm(cmId){const pendingKey="courseformat/content:reloadCm_".concat(cmId);let debouncedReload=this.debouncedReloads.get(pendingKey);if(debouncedReload)return debouncedReload;return debouncedReload=(0,_utils.debounce)((()=>{var _this$reactive$sectio;const pendingReload=new _pending.default(pendingKey);this.debouncedReloads.delete(pendingKey);const cmitem=this.getElement(this.selectors.CM,cmId);if(!cmitem)return pendingReload.resolve();return _fragment.default.loadFragment("core_courseformat","cmitem",_config.default.courseContextId,{id:cmId,courseid:_config.default.courseId,sr:null!==(_this$reactive$sectio=this.reactive.sectionReturn)&&void 0!==_this$reactive$sectio?_this$reactive$sectio:null}).then(((html,js)=>document.contains(cmitem)?(_templates.default.replaceNode(cmitem,html,js),this._indexContents(),pendingReload.resolve(),!0):(pendingReload.resolve(),!1))).catch((()=>{pendingReload.resolve()})),pendingReload}),200,{cancel:!0,pending:!0}),this.debouncedReloads.set(pendingKey,debouncedReload),debouncedReload}_cancelDebouncedReloadCm(cmId){const pendingKey="courseformat/content:reloadCm_".concat(cmId),debouncedReload=this.debouncedReloads.get(pendingKey);debouncedReload&&(debouncedReload.cancel(),this.debouncedReloads.delete(pendingKey))}_reloadSection(_ref8){let{element:element}=_ref8;const pendingReload=new _pending.default("courseformat/content:reloadSection_".concat(element.id)),sectionitem=this.getElement(this.selectors.SECTION,element.id);if(sectionitem){var _this$reactive$sectio2;for(const cmId of element.cmlist)this._cancelDebouncedReloadCm(cmId);_fragment.default.loadFragment("core_courseformat","section",_config.default.courseContextId,{id:element.id,courseid:_config.default.courseId,sr:null!==(_this$reactive$sectio2=this.reactive.sectionReturn)&&void 0!==_this$reactive$sectio2?_this$reactive$sectio2:null}).then(((html,js)=>{_templates.default.replaceNode(sectionitem,html,js),this._indexContents(),pendingReload.resolve()})).catch((()=>{pendingReload.resolve()}))}}_createCmItem(container,cmid){const newItem=document.createElement(this.selectors.ACTIVITYTAG);return newItem.dataset.for="cmitem",newItem.dataset.id=cmid,newItem.id="module-".concat(cmid),newItem.classList.add(this.classes.ACTIVITY),container.append(newItem),this._reloadCm({element:this.reactive.get("cm",cmid)}),newItem}_createSectionItem(container,sectionid){const section=this.reactive.get("section",sectionid),newItem=document.createElement(this.selectors.SECTIONTAG);return newItem.dataset.for="section",newItem.dataset.id=sectionid,newItem.dataset.number=section.number,newItem.id="section-".concat(sectionid),newItem.classList.add(this.classes.SECTION),container.append(newItem),this._reloadSection({element:section}),newItem}async _fixOrder(container,neworder,selector,dettachedelements,createMethod){if(void 0===container)return;if(!neworder.length)return container.classList.add("hidden"),void(container.innerHTML="");let dndFakeActivity;for(container.classList.remove("hidden"),neworder.forEach(((itemid,index)=>{var _ref9,_this$getElement;let item=null!==(_ref9=null!==(_this$getElement=this.getElement(selector,itemid))&&void 0!==_this$getElement?_this$getElement:dettachedelements[itemid])&&void 0!==_ref9?_ref9:createMethod(container,itemid);if(void 0===item)return;const currentitem=container.children[index];void 0!==currentitem?currentitem!==item&&container.insertBefore(item,currentitem):container.append(item)}));container.children.length>neworder.length;){var _lastchild$classList;const lastchild=container.lastChild;var _lastchild$dataset$id,_lastchild$dataset;if(null!=lastchild&&null!==(_lastchild$classList=lastchild.classList)&&void 0!==_lastchild$classList&&_lastchild$classList.contains("dndupload-preview"))dndFakeActivity=lastchild;else dettachedelements[null!==(_lastchild$dataset$id=null==lastchild||null===(_lastchild$dataset=lastchild.dataset)||void 0===_lastchild$dataset?void 0:_lastchild$dataset.id)&&void 0!==_lastchild$dataset$id?_lastchild$dataset$id:0]=lastchild;container.removeChild(lastchild)}dndFakeActivity&&container.append(dndFakeActivity)}}return _exports.default=Component,_exports.default})); + */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_config=_interopRequireDefault(_config),_inplace_editable=_interopRequireDefault(_inplace_editable),_section=_interopRequireDefault(_section),_cmitem=_interopRequireDefault(_cmitem),_fragment=_interopRequireDefault(_fragment),_templates=_interopRequireDefault(_templates),_actions=_interopRequireDefault(_actions),CourseEvents=function(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj))return cache.get(obj);var newObj={},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}newObj.default=obj,cache&&cache.set(obj,newObj);return newObj}(CourseEvents),_jquery=_interopRequireDefault(_jquery),_pending=_interopRequireDefault(_pending);class Component extends _reactive.BaseComponent{create(descriptor){var _descriptor$sectionRe;this.name="course_format",this.selectors={SECTION:"[data-for='section']",SECTION_ITEM:"[data-for='section_title']",SECTION_CMLIST:"[data-for='cmlist']",COURSE_SECTIONLIST:"[data-for='course_sectionlist']",CM:"[data-for='cmitem']",TOGGLER:'[data-action="togglecoursecontentsection"]',COLLAPSE:'[data-toggle="collapse"]',TOGGLEALL:'[data-toggle="toggleall"]',ACTIVITYTAG:"li",SECTIONTAG:"li"},this.selectorGenerators={cmNameFor:id=>"[data-cm-name-for='".concat(id,"']"),sectionNameFor:id=>"[data-section-name-for='".concat(id,"']")},this.classes={COLLAPSED:"collapsed",ACTIVITY:"activity",STATEDREADY:"stateready",SECTION:"section"},this.dettachedCms={},this.dettachedSections={},this.sections={},this.cms={},this.sectionReturn=null!==(_descriptor$sectionRe=descriptor.sectionReturn)&&void 0!==_descriptor$sectionRe?_descriptor$sectionRe:null,this.debouncedReloads=new Map}static init(target,selectors,sectionReturn){return new Component({element:document.getElementById(target),reactive:(0,_courseeditor.getCurrentCourseEditor)(),selectors:selectors,sectionReturn:sectionReturn})}stateReady(state){this._indexContents(),this.addEventListener(this.element,"click",this._sectionTogglers);const toogleAll=this.getElement(this.selectors.TOGGLEALL);if(toogleAll){const collapseElementIds=[...this.getElements(this.selectors.COLLAPSE)].map((element=>element.id));toogleAll.setAttribute("aria-controls",collapseElementIds.join(" ")),this.addEventListener(toogleAll,"click",this._allSectionToggler),this.addEventListener(toogleAll,"keydown",(e=>{" "===e.key&&this._allSectionToggler(e)})),this._refreshAllSectionsToggler(state)}this.reactive.supportComponents&&(this.reactive.isEditing&&new _actions.default(this),this.element.classList.add(this.classes.STATEDREADY)),this.addEventListener(this.element,CourseEvents.manualCompletionToggled,this._completionHandler),this.addEventListener(document,"scroll",this._scrollHandler),setTimeout((()=>{this._scrollHandler()}),500)}_sectionTogglers(event){const sectionlink=event.target.closest(this.selectors.TOGGLER),closestCollapse=event.target.closest(this.selectors.COLLAPSE),isChevron=null==closestCollapse?void 0:closestCollapse.closest(this.selectors.SECTION_ITEM);if(sectionlink||isChevron){var _toggler$classList$co;const section=event.target.closest(this.selectors.SECTION),toggler=section.querySelector(this.selectors.COLLAPSE),isCollapsed=null!==(_toggler$classList$co=null==toggler?void 0:toggler.classList.contains(this.classes.COLLAPSED))&&void 0!==_toggler$classList$co&&_toggler$classList$co;if(isChevron||isCollapsed){const sectionId=section.getAttribute("data-id");this.reactive.dispatch("sectionContentCollapsed",[sectionId],!isCollapsed)}}}_allSectionToggler(event){var _course$sectionlist;event.preventDefault();const isAllCollapsed=event.target.closest(this.selectors.TOGGLEALL).classList.contains(this.classes.COLLAPSED),course=this.reactive.get("course");this.reactive.dispatch("sectionContentCollapsed",null!==(_course$sectionlist=course.sectionlist)&&void 0!==_course$sectionlist?_course$sectionlist:[],!isAllCollapsed)}getWatchers(){return this.reactive.sectionReturn=this.sectionReturn,this.reactive.supportComponents?[{watch:"cm.visible:updated",handler:this._reloadCm},{watch:"cm.stealth:updated",handler:this._reloadCm},{watch:"cm.sectionid:updated",handler:this._reloadCm},{watch:"cm.indent:updated",handler:this._reloadCm},{watch:"cm.groupmode:updated",handler:this._reloadCm},{watch:"cm.name:updated",handler:this._refreshCmName},{watch:"section.number:updated",handler:this._refreshSectionNumber},{watch:"section.title:updated",handler:this._refreshSectionTitle},{watch:"section.contentcollapsed:updated",handler:this._refreshSectionCollapsed},{watch:"transaction:start",handler:this._startProcessing},{watch:"course.sectionlist:updated",handler:this._refreshCourseSectionlist},{watch:"section.cmlist:updated",handler:this._refreshSectionCmlist},{watch:"section.visible:updated",handler:this._reloadSection},{watch:"state:updated",handler:this._indexContents}]:[]}_refreshCmName(_ref){let{element:element}=_ref;this.getElements(this.selectorGenerators.cmNameFor(element.id)).forEach((cmNameFor=>{cmNameFor.textContent=element.name}))}_refreshSectionCollapsed(_ref2){var _toggler$classList$co2;let{state:state,element:element}=_ref2;const target=this.getElement(this.selectors.SECTION,element.id);if(!target)throw new Error("Unknown section with ID ".concat(element.id));const toggler=target.querySelector(this.selectors.COLLAPSE),isCollapsed=null!==(_toggler$classList$co2=null==toggler?void 0:toggler.classList.contains(this.classes.COLLAPSED))&&void 0!==_toggler$classList$co2&&_toggler$classList$co2;if(element.contentcollapsed!==isCollapsed){var _toggler$dataset$targ;let collapsibleId=null!==(_toggler$dataset$targ=toggler.dataset.target)&&void 0!==_toggler$dataset$targ?_toggler$dataset$targ:toggler.getAttribute("href");if(!collapsibleId)return;collapsibleId=collapsibleId.replace("#","");const collapsible=document.getElementById(collapsibleId);if(!collapsible)return;(0,_jquery.default)(collapsible).collapse(element.contentcollapsed?"hide":"show")}this._refreshAllSectionsToggler(state)}_refreshAllSectionsToggler(state){const target=this.getElement(this.selectors.TOGGLEALL);if(!target)return;let allcollapsed=!0,allexpanded=!0;state.section.forEach((section=>{allcollapsed=allcollapsed&§ion.contentcollapsed,allexpanded=allexpanded&&!section.contentcollapsed})),allcollapsed&&(target.classList.add(this.classes.COLLAPSED),target.setAttribute("aria-expanded",!1)),allexpanded&&(target.classList.remove(this.classes.COLLAPSED),target.setAttribute("aria-expanded",!0))}_startProcessing(){this.dettachedCms={},this.dettachedSections={}}_completionHandler(_ref3){let{detail:detail}=_ref3;void 0!==detail&&this.reactive.dispatch("cmCompletion",[detail.cmid],detail.completed)}_scrollHandler(){const pageOffset=window.scrollY,items=this.reactive.getExporter().allItemsArray(this.reactive.state);let pageItem=null;items.every((item=>{const index="section"===item.type?this.sections:this.cms;if(void 0===index[item.id])return!0;const element=index[item.id].element;return pageItem=item,pageOffset>=element.offsetTop})),pageItem&&this.reactive.dispatch("setPageItem",pageItem.type,pageItem.id)}_refreshSectionNumber(_ref4){let{element:element}=_ref4;const target=this.getElement(this.selectors.SECTION,element.id);if(!target)return;target.id="section-".concat(element.number),target.dataset.sectionid=element.number,target.dataset.number=element.number;const inplace=_inplace_editable.default.getInplaceEditable(target.querySelector(this.selectors.SECTION_ITEM));if(inplace){const currentvalue=inplace.getValue(),currentitemid=inplace.getItemId();""===inplace.getValue()&&(currentitemid!=element.id||currentvalue==element.rawtitle&&""!=element.rawtitle||inplace.setValue(element.rawtitle))}}_refreshSectionTitle(_ref5){let{element:element}=_ref5;document.querySelectorAll(this.selectorGenerators.sectionNameFor(element.id)).forEach((sectionNameFor=>{sectionNameFor.textContent=element.title}))}_refreshSectionCmlist(_ref6){var _element$cmlist;let{element:element}=_ref6;const cmlist=null!==(_element$cmlist=element.cmlist)&&void 0!==_element$cmlist?_element$cmlist:[],section=this.getElement(this.selectors.SECTION,element.id),listparent=null==section?void 0:section.querySelector(this.selectors.SECTION_CMLIST),createCm=this._createCmItem.bind(this);listparent&&this._fixOrder(listparent,cmlist,this.selectors.CM,this.dettachedCms,createCm)}_refreshCourseSectionlist(_ref7){let{state:state}=_ref7;if(null!==this.reactive.sectionReturn)return;const sectionlist=this.reactive.getExporter().listedSectionIds(state),listparent=this.getElement(this.selectors.COURSE_SECTIONLIST),createSection=this._createSectionItem.bind(this);listparent&&this._fixOrder(listparent,sectionlist,this.selectors.SECTION,this.dettachedSections,createSection)}_indexContents(){this._scanIndex(this.selectors.SECTION,this.sections,(item=>new _section.default(item))),this._scanIndex(this.selectors.CM,this.cms,(item=>new _cmitem.default(item)))}_scanIndex(selector,index,creationhandler){this.getElements("".concat(selector,":not([data-indexed])")).forEach((item=>{var _item$dataset;null!=item&&null!==(_item$dataset=item.dataset)&&void 0!==_item$dataset&&_item$dataset.id&&(void 0!==index[item.dataset.id]&&index[item.dataset.id].unregister(),index[item.dataset.id]=creationhandler({...this,element:item}),item.dataset.indexed=!0)}))}_reloadCm(_ref8){let{element:element}=_ref8;if(!this.getElement(this.selectors.CM,element.id))return;this._getDebouncedReloadCm(element.id)()}_getDebouncedReloadCm(cmId){const pendingKey="courseformat/content:reloadCm_".concat(cmId);let debouncedReload=this.debouncedReloads.get(pendingKey);if(debouncedReload)return debouncedReload;return debouncedReload=(0,_utils.debounce)((()=>{var _this$reactive$sectio;const pendingReload=new _pending.default(pendingKey);this.debouncedReloads.delete(pendingKey);const cmitem=this.getElement(this.selectors.CM,cmId);if(!cmitem)return pendingReload.resolve();return _fragment.default.loadFragment("core_courseformat","cmitem",_config.default.courseContextId,{id:cmId,courseid:_config.default.courseId,sr:null!==(_this$reactive$sectio=this.reactive.sectionReturn)&&void 0!==_this$reactive$sectio?_this$reactive$sectio:null}).then(((html,js)=>document.contains(cmitem)?(_templates.default.replaceNode(cmitem,html,js),this._indexContents(),pendingReload.resolve(),!0):(pendingReload.resolve(),!1))).catch((()=>{pendingReload.resolve()})),pendingReload}),200,{cancel:!0,pending:!0}),this.debouncedReloads.set(pendingKey,debouncedReload),debouncedReload}_cancelDebouncedReloadCm(cmId){const pendingKey="courseformat/content:reloadCm_".concat(cmId),debouncedReload=this.debouncedReloads.get(pendingKey);debouncedReload&&(debouncedReload.cancel(),this.debouncedReloads.delete(pendingKey))}_reloadSection(_ref9){let{element:element}=_ref9;const pendingReload=new _pending.default("courseformat/content:reloadSection_".concat(element.id)),sectionitem=this.getElement(this.selectors.SECTION,element.id);if(sectionitem){var _this$reactive$sectio2;for(const cmId of element.cmlist)this._cancelDebouncedReloadCm(cmId);_fragment.default.loadFragment("core_courseformat","section",_config.default.courseContextId,{id:element.id,courseid:_config.default.courseId,sr:null!==(_this$reactive$sectio2=this.reactive.sectionReturn)&&void 0!==_this$reactive$sectio2?_this$reactive$sectio2:null}).then(((html,js)=>{_templates.default.replaceNode(sectionitem,html,js),this._indexContents(),pendingReload.resolve()})).catch((()=>{pendingReload.resolve()}))}}_createCmItem(container,cmid){const newItem=document.createElement(this.selectors.ACTIVITYTAG);return newItem.dataset.for="cmitem",newItem.dataset.id=cmid,newItem.id="module-".concat(cmid),newItem.classList.add(this.classes.ACTIVITY),container.append(newItem),this._reloadCm({element:this.reactive.get("cm",cmid)}),newItem}_createSectionItem(container,sectionid){const section=this.reactive.get("section",sectionid),newItem=document.createElement(this.selectors.SECTIONTAG);return newItem.dataset.for="section",newItem.dataset.id=sectionid,newItem.dataset.number=section.number,newItem.id="section-".concat(sectionid),newItem.classList.add(this.classes.SECTION),container.append(newItem),this._reloadSection({element:section}),newItem}async _fixOrder(container,neworder,selector,dettachedelements,createMethod){if(void 0===container)return;if(!neworder.length)return container.classList.add("hidden"),void(container.innerHTML="");let dndFakeActivity;for(container.classList.remove("hidden"),neworder.forEach(((itemid,index)=>{var _ref10,_this$getElement;let item=null!==(_ref10=null!==(_this$getElement=this.getElement(selector,itemid))&&void 0!==_this$getElement?_this$getElement:dettachedelements[itemid])&&void 0!==_ref10?_ref10:createMethod(container,itemid);if(void 0===item)return;const currentitem=container.children[index];void 0!==currentitem?currentitem!==item&&container.insertBefore(item,currentitem):container.append(item)}));container.children.length>neworder.length;){var _lastchild$classList;const lastchild=container.lastChild;var _lastchild$dataset$id,_lastchild$dataset;if(null!=lastchild&&null!==(_lastchild$classList=lastchild.classList)&&void 0!==_lastchild$classList&&_lastchild$classList.contains("dndupload-preview"))dndFakeActivity=lastchild;else dettachedelements[null!==(_lastchild$dataset$id=null==lastchild||null===(_lastchild$dataset=lastchild.dataset)||void 0===_lastchild$dataset?void 0:_lastchild$dataset.id)&&void 0!==_lastchild$dataset$id?_lastchild$dataset$id:0]=lastchild;container.removeChild(lastchild)}dndFakeActivity&&container.append(dndFakeActivity)}}return _exports.default=Component,_exports.default})); //# sourceMappingURL=content.min.js.map \ No newline at end of file diff --git a/course/format/amd/build/local/content.min.js.map b/course/format/amd/build/local/content.min.js.map index f57ddfbefeb45..095d4abd4748e 100644 --- a/course/format/amd/build/local/content.min.js.map +++ b/course/format/amd/build/local/content.min.js.map @@ -1 +1 @@ -{"version":3,"file":"content.min.js","sources":["../../src/local/content.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Course index main component.\n *\n * @module core_courseformat/local/content\n * @class core_courseformat/local/content\n * @copyright 2020 Ferran Recio \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport {BaseComponent} from 'core/reactive';\nimport {debounce} from 'core/utils';\nimport {getCurrentCourseEditor} from 'core_courseformat/courseeditor';\nimport Config from 'core/config';\nimport inplaceeditable from 'core/inplace_editable';\nimport Section from 'core_courseformat/local/content/section';\nimport CmItem from 'core_courseformat/local/content/section/cmitem';\nimport Fragment from 'core/fragment';\nimport Templates from 'core/templates';\nimport DispatchActions from 'core_courseformat/local/content/actions';\nimport * as CourseEvents from 'core_course/events';\n// The jQuery module is only used for interacting with Boostrap 4. It can we removed when MDL-71979 is integrated.\nimport jQuery from 'jquery';\nimport Pending from 'core/pending';\n\nexport default class Component extends BaseComponent {\n\n /**\n * Constructor hook.\n *\n * @param {Object} descriptor the component descriptor\n */\n create(descriptor) {\n // Optional component name for debugging.\n this.name = 'course_format';\n // Default query selectors.\n this.selectors = {\n SECTION: `[data-for='section']`,\n SECTION_ITEM: `[data-for='section_title']`,\n SECTION_CMLIST: `[data-for='cmlist']`,\n COURSE_SECTIONLIST: `[data-for='course_sectionlist']`,\n CM: `[data-for='cmitem']`,\n TOGGLER: `[data-action=\"togglecoursecontentsection\"]`,\n COLLAPSE: `[data-toggle=\"collapse\"]`,\n TOGGLEALL: `[data-toggle=\"toggleall\"]`,\n // Formats can override the activity tag but a default one is needed to create new elements.\n ACTIVITYTAG: 'li',\n SECTIONTAG: 'li',\n };\n this.selectorGenerators = {\n cmNameFor: (id) => `[data-cm-name-for='${id}']`,\n };\n // Default classes to toggle on refresh.\n this.classes = {\n COLLAPSED: `collapsed`,\n // Course content classes.\n ACTIVITY: `activity`,\n STATEDREADY: `stateready`,\n SECTION: `section`,\n };\n // Array to save dettached elements during element resorting.\n this.dettachedCms = {};\n this.dettachedSections = {};\n // Index of sections and cms components.\n this.sections = {};\n this.cms = {};\n // The page section return.\n this.sectionReturn = descriptor.sectionReturn ?? null;\n this.debouncedReloads = new Map();\n }\n\n /**\n * Static method to create a component instance form the mustahce template.\n *\n * @param {string} target the DOM main element or its ID\n * @param {object} selectors optional css selector overrides\n * @param {number} sectionReturn the content section return\n * @return {Component}\n */\n static init(target, selectors, sectionReturn) {\n return new Component({\n element: document.getElementById(target),\n reactive: getCurrentCourseEditor(),\n selectors,\n sectionReturn,\n });\n }\n\n /**\n * Initial state ready method.\n *\n * @param {Object} state the state data\n */\n stateReady(state) {\n this._indexContents();\n // Activate section togglers.\n this.addEventListener(this.element, 'click', this._sectionTogglers);\n\n // Collapse/Expand all sections button.\n const toogleAll = this.getElement(this.selectors.TOGGLEALL);\n if (toogleAll) {\n\n // Ensure collapse menu button adds aria-controls attribute referring to each collapsible element.\n const collapseElements = this.getElements(this.selectors.COLLAPSE);\n const collapseElementIds = [...collapseElements].map(element => element.id);\n toogleAll.setAttribute('aria-controls', collapseElementIds.join(' '));\n\n this.addEventListener(toogleAll, 'click', this._allSectionToggler);\n this.addEventListener(toogleAll, 'keydown', e => {\n // Collapse/expand all sections when Space key is pressed on the toggle button.\n if (e.key === ' ') {\n this._allSectionToggler(e);\n }\n });\n this._refreshAllSectionsToggler(state);\n }\n\n if (this.reactive.supportComponents) {\n // Actions are only available in edit mode.\n if (this.reactive.isEditing) {\n new DispatchActions(this);\n }\n\n // Mark content as state ready.\n this.element.classList.add(this.classes.STATEDREADY);\n }\n\n // Capture completion events.\n this.addEventListener(\n this.element,\n CourseEvents.manualCompletionToggled,\n this._completionHandler\n );\n\n // Capture page scroll to update page item.\n this.addEventListener(\n document,\n \"scroll\",\n this._scrollHandler\n );\n setTimeout(() => {\n this._scrollHandler();\n }, 500);\n }\n\n /**\n * Setup sections toggler.\n *\n * Toggler click is delegated to the main course content element because new sections can\n * appear at any moment and this way we prevent accidental double bindings.\n *\n * @param {Event} event the triggered event\n */\n _sectionTogglers(event) {\n const sectionlink = event.target.closest(this.selectors.TOGGLER);\n const closestCollapse = event.target.closest(this.selectors.COLLAPSE);\n // Assume that chevron is the only collapse toggler in a section heading;\n // I think this is the most efficient way to verify at the moment.\n const isChevron = closestCollapse?.closest(this.selectors.SECTION_ITEM);\n\n if (sectionlink || isChevron) {\n\n const section = event.target.closest(this.selectors.SECTION);\n const toggler = section.querySelector(this.selectors.COLLAPSE);\n const isCollapsed = toggler?.classList.contains(this.classes.COLLAPSED) ?? false;\n\n if (isChevron || isCollapsed) {\n // Update the state.\n const sectionId = section.getAttribute('data-id');\n this.reactive.dispatch(\n 'sectionContentCollapsed',\n [sectionId],\n !isCollapsed\n );\n }\n }\n }\n\n /**\n * Handle the collapse/expand all sections button.\n *\n * Toggler click is delegated to the main course content element because new sections can\n * appear at any moment and this way we prevent accidental double bindings.\n *\n * @param {Event} event the triggered event\n */\n _allSectionToggler(event) {\n event.preventDefault();\n\n const target = event.target.closest(this.selectors.TOGGLEALL);\n const isAllCollapsed = target.classList.contains(this.classes.COLLAPSED);\n\n const course = this.reactive.get('course');\n this.reactive.dispatch(\n 'sectionContentCollapsed',\n course.sectionlist ?? [],\n !isAllCollapsed\n );\n }\n\n /**\n * Return the component watchers.\n *\n * @returns {Array} of watchers\n */\n getWatchers() {\n // Section return is a global page variable but most formats define it just before start printing\n // the course content. This is the reason why we define this page setting here.\n this.reactive.sectionReturn = this.sectionReturn;\n\n // Check if the course format is compatible with reactive components.\n if (!this.reactive.supportComponents) {\n return [];\n }\n return [\n // State changes that require to reload some course modules.\n {watch: `cm.visible:updated`, handler: this._reloadCm},\n {watch: `cm.stealth:updated`, handler: this._reloadCm},\n {watch: `cm.sectionid:updated`, handler: this._reloadCm},\n {watch: `cm.indent:updated`, handler: this._reloadCm},\n {watch: `cm.groupmode:updated`, handler: this._reloadCm},\n {watch: `cm.name:updated`, handler: this._refreshCmName},\n // Update section number and title.\n {watch: `section.number:updated`, handler: this._refreshSectionNumber},\n // Collapse and expand sections.\n {watch: `section.contentcollapsed:updated`, handler: this._refreshSectionCollapsed},\n // Sections and cm sorting.\n {watch: `transaction:start`, handler: this._startProcessing},\n {watch: `course.sectionlist:updated`, handler: this._refreshCourseSectionlist},\n {watch: `section.cmlist:updated`, handler: this._refreshSectionCmlist},\n // Section visibility.\n {watch: `section.visible:updated`, handler: this._reloadSection},\n // Reindex sections and cms.\n {watch: `state:updated`, handler: this._indexContents},\n ];\n }\n\n /**\n * Update a course module name on the whole page.\n *\n * @param {object} param\n * @param {Object} param.element details the update details.\n */\n _refreshCmName({element}) {\n // Update classes.\n // Replace the text content of the cm name.\n const allCmNamesFor = this.getElements(\n this.selectorGenerators.cmNameFor(element.id)\n );\n allCmNamesFor.forEach((cmNameFor) => {\n cmNameFor.textContent = element.name;\n });\n }\n\n /**\n * Update section collapsed state via bootstrap 4 if necessary.\n *\n * Formats that do not use bootstrap 4 must override this method in order to keep the section\n * toggling working.\n *\n * @param {object} args\n * @param {Object} args.state The state data\n * @param {Object} args.element The element to update\n */\n _refreshSectionCollapsed({state, element}) {\n const target = this.getElement(this.selectors.SECTION, element.id);\n if (!target) {\n throw new Error(`Unknown section with ID ${element.id}`);\n }\n // Check if it is already done.\n const toggler = target.querySelector(this.selectors.COLLAPSE);\n const isCollapsed = toggler?.classList.contains(this.classes.COLLAPSED) ?? false;\n\n if (element.contentcollapsed !== isCollapsed) {\n let collapsibleId = toggler.dataset.target ?? toggler.getAttribute(\"href\");\n if (!collapsibleId) {\n return;\n }\n collapsibleId = collapsibleId.replace('#', '');\n const collapsible = document.getElementById(collapsibleId);\n if (!collapsible) {\n return;\n }\n\n // Course index is based on Bootstrap 4 collapsibles. To collapse them we need jQuery to\n // interact with collapsibles methods. Hopefully, this will change in Bootstrap 5 because\n // it does not require jQuery anymore (when MDL-71979 is integrated).\n jQuery(collapsible).collapse(element.contentcollapsed ? 'hide' : 'show');\n }\n\n this._refreshAllSectionsToggler(state);\n }\n\n /**\n * Refresh the collapse/expand all sections element.\n *\n * @param {Object} state The state data\n */\n _refreshAllSectionsToggler(state) {\n const target = this.getElement(this.selectors.TOGGLEALL);\n if (!target) {\n return;\n }\n // Check if we have all sections collapsed/expanded.\n let allcollapsed = true;\n let allexpanded = true;\n state.section.forEach(\n section => {\n allcollapsed = allcollapsed && section.contentcollapsed;\n allexpanded = allexpanded && !section.contentcollapsed;\n }\n );\n if (allcollapsed) {\n target.classList.add(this.classes.COLLAPSED);\n target.setAttribute('aria-expanded', false);\n }\n if (allexpanded) {\n target.classList.remove(this.classes.COLLAPSED);\n target.setAttribute('aria-expanded', true);\n }\n }\n\n /**\n * Setup the component to start a transaction.\n *\n * Some of the course actions replaces the current DOM element with a new one before updating the\n * course state. This means the component cannot preload any index properly until the transaction starts.\n *\n */\n _startProcessing() {\n // During a section or cm sorting, some elements could be dettached from the DOM and we\n // need to store somewhare in case they are needed later.\n this.dettachedCms = {};\n this.dettachedSections = {};\n }\n\n /**\n * Activity manual completion listener.\n *\n * @param {Event} event the custom ecent\n */\n _completionHandler({detail}) {\n if (detail === undefined) {\n return;\n }\n this.reactive.dispatch('cmCompletion', [detail.cmid], detail.completed);\n }\n\n /**\n * Check the current page scroll and update the active element if necessary.\n */\n _scrollHandler() {\n const pageOffset = window.scrollY;\n const items = this.reactive.getExporter().allItemsArray(this.reactive.state);\n // Check what is the active element now.\n let pageItem = null;\n items.every(item => {\n const index = (item.type === 'section') ? this.sections : this.cms;\n if (index[item.id] === undefined) {\n return true;\n }\n\n const element = index[item.id].element;\n pageItem = item;\n return pageOffset >= element.offsetTop;\n });\n if (pageItem) {\n this.reactive.dispatch('setPageItem', pageItem.type, pageItem.id);\n }\n }\n\n /**\n * Update a course section when the section number changes.\n *\n * The courseActions module used for most course section tools still depends on css classes and\n * section numbers (not id). To prevent inconsistencies when a section is moved, we need to refresh\n * the\n *\n * Course formats can override the section title rendering so the frontend depends heavily on backend\n * rendering. Luckily in edit mode we can trigger a title update using the inplace_editable module.\n *\n * @param {Object} param\n * @param {Object} param.element details the update details.\n */\n _refreshSectionNumber({element}) {\n // Find the element.\n const target = this.getElement(this.selectors.SECTION, element.id);\n if (!target) {\n // Job done. Nothing to refresh.\n return;\n }\n // Update section numbers in all data, css and YUI attributes.\n target.id = `section-${element.number}`;\n // YUI uses section number as section id in data-sectionid, in principle if a format use components\n // don't need this sectionid attribute anymore, but we keep the compatibility in case some plugin\n // use it for legacy purposes.\n target.dataset.sectionid = element.number;\n // The data-number is the attribute used by components to store the section number.\n target.dataset.number = element.number;\n\n // Update title and title inplace editable, if any.\n const inplace = inplaceeditable.getInplaceEditable(target.querySelector(this.selectors.SECTION_ITEM));\n if (inplace) {\n // The course content HTML can be modified at any moment, so the function need to do some checkings\n // to make sure the inplace editable still represents the same itemid.\n const currentvalue = inplace.getValue();\n const currentitemid = inplace.getItemId();\n // Unnamed sections must be recalculated.\n if (inplace.getValue() === '') {\n // The value to send can be an empty value if it is a default name.\n if (currentitemid == element.id && (currentvalue != element.rawtitle || element.rawtitle == '')) {\n inplace.setValue(element.rawtitle);\n }\n }\n }\n }\n\n /**\n * Refresh a section cm list.\n *\n * @param {Object} param\n * @param {Object} param.element details the update details.\n */\n _refreshSectionCmlist({element}) {\n const cmlist = element.cmlist ?? [];\n const section = this.getElement(this.selectors.SECTION, element.id);\n const listparent = section?.querySelector(this.selectors.SECTION_CMLIST);\n // A method to create a fake element to be replaced when the item is ready.\n const createCm = this._createCmItem.bind(this);\n if (listparent) {\n this._fixOrder(listparent, cmlist, this.selectors.CM, this.dettachedCms, createCm);\n }\n }\n\n /**\n * Refresh the section list.\n *\n * @param {Object} param\n * @param {Object} param.state the full state object.\n */\n _refreshCourseSectionlist({state}) {\n // If we have a section return means we only show a single section so no need to fix order.\n if (this.reactive.sectionReturn !== null) {\n return;\n }\n const sectionlist = this.reactive.getExporter().listedSectionIds(state);\n const listparent = this.getElement(this.selectors.COURSE_SECTIONLIST);\n // For now section cannot be created at a frontend level.\n const createSection = this._createSectionItem.bind(this);\n if (listparent) {\n this._fixOrder(listparent, sectionlist, this.selectors.SECTION, this.dettachedSections, createSection);\n }\n }\n\n /**\n * Regenerate content indexes.\n *\n * This method is used when a legacy action refresh some content element.\n */\n _indexContents() {\n // Find unindexed sections.\n this._scanIndex(\n this.selectors.SECTION,\n this.sections,\n (item) => {\n return new Section(item);\n }\n );\n\n // Find unindexed cms.\n this._scanIndex(\n this.selectors.CM,\n this.cms,\n (item) => {\n return new CmItem(item);\n }\n );\n }\n\n /**\n * Reindex a content (section or cm) of the course content.\n *\n * This method is used internally by _indexContents.\n *\n * @param {string} selector the DOM selector to scan\n * @param {*} index the index attribute to update\n * @param {*} creationhandler method to create a new indexed element\n */\n _scanIndex(selector, index, creationhandler) {\n const items = this.getElements(`${selector}:not([data-indexed])`);\n items.forEach((item) => {\n if (!item?.dataset?.id) {\n return;\n }\n // Delete previous item component.\n if (index[item.dataset.id] !== undefined) {\n index[item.dataset.id].unregister();\n }\n // Create the new component.\n index[item.dataset.id] = creationhandler({\n ...this,\n element: item,\n });\n // Mark as indexed.\n item.dataset.indexed = true;\n });\n }\n\n /**\n * Reload a course module contents.\n *\n * Most course module HTML is still strongly backend dependant.\n * Some changes require to get a new version of the module.\n *\n * @param {object} param0 the watcher details\n * @param {object} param0.element the state object\n */\n _reloadCm({element}) {\n if (!this.getElement(this.selectors.CM, element.id)) {\n return;\n }\n const debouncedReload = this._getDebouncedReloadCm(element.id);\n debouncedReload();\n }\n\n /**\n * Generate or get a reload CM debounced function.\n * @param {Number} cmId\n * @returns {Function} the debounced reload function\n */\n _getDebouncedReloadCm(cmId) {\n const pendingKey = `courseformat/content:reloadCm_${cmId}`;\n let debouncedReload = this.debouncedReloads.get(pendingKey);\n if (debouncedReload) {\n return debouncedReload;\n }\n const reload = () => {\n const pendingReload = new Pending(pendingKey);\n this.debouncedReloads.delete(pendingKey);\n const cmitem = this.getElement(this.selectors.CM, cmId);\n if (!cmitem) {\n return pendingReload.resolve();\n }\n const promise = Fragment.loadFragment(\n 'core_courseformat',\n 'cmitem',\n Config.courseContextId,\n {\n id: cmId,\n courseid: Config.courseId,\n sr: this.reactive.sectionReturn ?? null,\n }\n );\n promise.then((html, js) => {\n // Other state change can reload the CM or the section before this one.\n if (!document.contains(cmitem)) {\n pendingReload.resolve();\n return false;\n }\n Templates.replaceNode(cmitem, html, js);\n this._indexContents();\n pendingReload.resolve();\n return true;\n }).catch(() => {\n pendingReload.resolve();\n });\n return pendingReload;\n };\n debouncedReload = debounce(\n reload,\n 200,\n {\n cancel: true, pending: true\n }\n );\n this.debouncedReloads.set(pendingKey, debouncedReload);\n return debouncedReload;\n }\n\n /**\n * Cancel the active reload CM debounced function, if any.\n * @param {Number} cmId\n */\n _cancelDebouncedReloadCm(cmId) {\n const pendingKey = `courseformat/content:reloadCm_${cmId}`;\n const debouncedReload = this.debouncedReloads.get(pendingKey);\n if (!debouncedReload) {\n return;\n }\n debouncedReload.cancel();\n this.debouncedReloads.delete(pendingKey);\n }\n\n /**\n * Reload a course section contents.\n *\n * Section HTML is still strongly backend dependant.\n * Some changes require to get a new version of the section.\n *\n * @param {details} param0 the watcher details\n * @param {object} param0.element the state object\n */\n _reloadSection({element}) {\n const pendingReload = new Pending(`courseformat/content:reloadSection_${element.id}`);\n const sectionitem = this.getElement(this.selectors.SECTION, element.id);\n if (sectionitem) {\n // Cancel any pending reload because the section will reload cms too.\n for (const cmId of element.cmlist) {\n this._cancelDebouncedReloadCm(cmId);\n }\n const promise = Fragment.loadFragment(\n 'core_courseformat',\n 'section',\n Config.courseContextId,\n {\n id: element.id,\n courseid: Config.courseId,\n sr: this.reactive.sectionReturn ?? null,\n }\n );\n promise.then((html, js) => {\n Templates.replaceNode(sectionitem, html, js);\n this._indexContents();\n pendingReload.resolve();\n }).catch(() => {\n pendingReload.resolve();\n });\n }\n }\n\n /**\n * Create a new course module item in a section.\n *\n * Thos method will append a fake item in the container and trigger an ajax request to\n * replace the fake element by the real content.\n *\n * @param {Element} container the container element (section)\n * @param {Number} cmid the course-module ID\n * @returns {Element} the created element\n */\n _createCmItem(container, cmid) {\n const newItem = document.createElement(this.selectors.ACTIVITYTAG);\n newItem.dataset.for = 'cmitem';\n newItem.dataset.id = cmid;\n // The legacy actions.js requires a specific ID and class to refresh the CM.\n newItem.id = `module-${cmid}`;\n newItem.classList.add(this.classes.ACTIVITY);\n container.append(newItem);\n this._reloadCm({\n element: this.reactive.get('cm', cmid),\n });\n return newItem;\n }\n\n /**\n * Create a new section item.\n *\n * This method will append a fake item in the container and trigger an ajax request to\n * replace the fake element by the real content.\n *\n * @param {Element} container the container element (section)\n * @param {Number} sectionid the course-module ID\n * @returns {Element} the created element\n */\n _createSectionItem(container, sectionid) {\n const section = this.reactive.get('section', sectionid);\n const newItem = document.createElement(this.selectors.SECTIONTAG);\n newItem.dataset.for = 'section';\n newItem.dataset.id = sectionid;\n newItem.dataset.number = section.number;\n // The legacy actions.js requires a specific ID and class to refresh the section.\n newItem.id = `section-${sectionid}`;\n newItem.classList.add(this.classes.SECTION);\n container.append(newItem);\n this._reloadSection({\n element: section,\n });\n return newItem;\n }\n\n /**\n * Fix/reorder the section or cms order.\n *\n * @param {Element} container the HTML element to reorder.\n * @param {Array} neworder an array with the ids order\n * @param {string} selector the element selector\n * @param {Object} dettachedelements a list of dettached elements\n * @param {function} createMethod method to create missing elements\n */\n async _fixOrder(container, neworder, selector, dettachedelements, createMethod) {\n if (container === undefined) {\n return;\n }\n\n // Empty lists should not be visible.\n if (!neworder.length) {\n container.classList.add('hidden');\n container.innerHTML = '';\n return;\n }\n\n // Grant the list is visible (in case it was empty).\n container.classList.remove('hidden');\n\n // Move the elements in order at the beginning of the list.\n neworder.forEach((itemid, index) => {\n let item = this.getElement(selector, itemid) ?? dettachedelements[itemid] ?? createMethod(container, itemid);\n if (item === undefined) {\n // Missing elements cannot be sorted.\n return;\n }\n // Get the current elemnt at that position.\n const currentitem = container.children[index];\n if (currentitem === undefined) {\n container.append(item);\n return;\n }\n if (currentitem !== item) {\n container.insertBefore(item, currentitem);\n }\n });\n\n // Dndupload add a fake element we need to keep.\n let dndFakeActivity;\n\n // Remove the remaining elements.\n while (container.children.length > neworder.length) {\n const lastchild = container.lastChild;\n if (lastchild?.classList?.contains('dndupload-preview')) {\n dndFakeActivity = lastchild;\n } else {\n dettachedelements[lastchild?.dataset?.id ?? 0] = lastchild;\n }\n container.removeChild(lastchild);\n }\n // Restore dndupload fake element.\n if (dndFakeActivity) {\n container.append(dndFakeActivity);\n }\n }\n}\n"],"names":["Component","BaseComponent","create","descriptor","name","selectors","SECTION","SECTION_ITEM","SECTION_CMLIST","COURSE_SECTIONLIST","CM","TOGGLER","COLLAPSE","TOGGLEALL","ACTIVITYTAG","SECTIONTAG","selectorGenerators","cmNameFor","id","classes","COLLAPSED","ACTIVITY","STATEDREADY","dettachedCms","dettachedSections","sections","cms","sectionReturn","debouncedReloads","Map","target","element","document","getElementById","reactive","stateReady","state","_indexContents","addEventListener","this","_sectionTogglers","toogleAll","getElement","collapseElementIds","getElements","map","setAttribute","join","_allSectionToggler","e","key","_refreshAllSectionsToggler","supportComponents","isEditing","DispatchActions","classList","add","CourseEvents","manualCompletionToggled","_completionHandler","_scrollHandler","setTimeout","event","sectionlink","closest","closestCollapse","isChevron","section","toggler","querySelector","isCollapsed","contains","sectionId","getAttribute","dispatch","preventDefault","isAllCollapsed","course","get","sectionlist","getWatchers","watch","handler","_reloadCm","_refreshCmName","_refreshSectionNumber","_refreshSectionCollapsed","_startProcessing","_refreshCourseSectionlist","_refreshSectionCmlist","_reloadSection","forEach","textContent","Error","contentcollapsed","collapsibleId","dataset","replace","collapsible","collapse","allcollapsed","allexpanded","remove","detail","undefined","cmid","completed","pageOffset","window","scrollY","items","getExporter","allItemsArray","pageItem","every","item","index","type","offsetTop","number","sectionid","inplace","inplaceeditable","getInplaceEditable","currentvalue","getValue","currentitemid","getItemId","rawtitle","setValue","cmlist","listparent","createCm","_createCmItem","bind","_fixOrder","listedSectionIds","createSection","_createSectionItem","_scanIndex","Section","CmItem","selector","creationhandler","_item$dataset","unregister","indexed","_getDebouncedReloadCm","debouncedReload","cmId","pendingKey","pendingReload","Pending","delete","cmitem","resolve","Fragment","loadFragment","Config","courseContextId","courseid","courseId","sr","then","html","js","replaceNode","catch","cancel","pending","set","_cancelDebouncedReloadCm","sectionitem","container","newItem","createElement","for","append","neworder","dettachedelements","createMethod","length","innerHTML","dndFakeActivity","itemid","currentitem","children","insertBefore","lastchild","lastChild","_lastchild$classList","_lastchild$dataset","removeChild"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"content.min.js","sources":["../../src/local/content.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Course index main component.\n *\n * @module core_courseformat/local/content\n * @class core_courseformat/local/content\n * @copyright 2020 Ferran Recio \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport {BaseComponent} from 'core/reactive';\nimport {debounce} from 'core/utils';\nimport {getCurrentCourseEditor} from 'core_courseformat/courseeditor';\nimport Config from 'core/config';\nimport inplaceeditable from 'core/inplace_editable';\nimport Section from 'core_courseformat/local/content/section';\nimport CmItem from 'core_courseformat/local/content/section/cmitem';\nimport Fragment from 'core/fragment';\nimport Templates from 'core/templates';\nimport DispatchActions from 'core_courseformat/local/content/actions';\nimport * as CourseEvents from 'core_course/events';\n// The jQuery module is only used for interacting with Boostrap 4. It can we removed when MDL-71979 is integrated.\nimport jQuery from 'jquery';\nimport Pending from 'core/pending';\n\nexport default class Component extends BaseComponent {\n\n /**\n * Constructor hook.\n *\n * @param {Object} descriptor the component descriptor\n */\n create(descriptor) {\n // Optional component name for debugging.\n this.name = 'course_format';\n // Default query selectors.\n this.selectors = {\n SECTION: `[data-for='section']`,\n SECTION_ITEM: `[data-for='section_title']`,\n SECTION_CMLIST: `[data-for='cmlist']`,\n COURSE_SECTIONLIST: `[data-for='course_sectionlist']`,\n CM: `[data-for='cmitem']`,\n TOGGLER: `[data-action=\"togglecoursecontentsection\"]`,\n COLLAPSE: `[data-toggle=\"collapse\"]`,\n TOGGLEALL: `[data-toggle=\"toggleall\"]`,\n // Formats can override the activity tag but a default one is needed to create new elements.\n ACTIVITYTAG: 'li',\n SECTIONTAG: 'li',\n };\n this.selectorGenerators = {\n cmNameFor: (id) => `[data-cm-name-for='${id}']`,\n sectionNameFor: (id) => `[data-section-name-for='${id}']`,\n };\n // Default classes to toggle on refresh.\n this.classes = {\n COLLAPSED: `collapsed`,\n // Course content classes.\n ACTIVITY: `activity`,\n STATEDREADY: `stateready`,\n SECTION: `section`,\n };\n // Array to save dettached elements during element resorting.\n this.dettachedCms = {};\n this.dettachedSections = {};\n // Index of sections and cms components.\n this.sections = {};\n this.cms = {};\n // The page section return.\n this.sectionReturn = descriptor.sectionReturn ?? null;\n this.debouncedReloads = new Map();\n }\n\n /**\n * Static method to create a component instance form the mustahce template.\n *\n * @param {string} target the DOM main element or its ID\n * @param {object} selectors optional css selector overrides\n * @param {number} sectionReturn the content section return\n * @return {Component}\n */\n static init(target, selectors, sectionReturn) {\n return new Component({\n element: document.getElementById(target),\n reactive: getCurrentCourseEditor(),\n selectors,\n sectionReturn,\n });\n }\n\n /**\n * Initial state ready method.\n *\n * @param {Object} state the state data\n */\n stateReady(state) {\n this._indexContents();\n // Activate section togglers.\n this.addEventListener(this.element, 'click', this._sectionTogglers);\n\n // Collapse/Expand all sections button.\n const toogleAll = this.getElement(this.selectors.TOGGLEALL);\n if (toogleAll) {\n\n // Ensure collapse menu button adds aria-controls attribute referring to each collapsible element.\n const collapseElements = this.getElements(this.selectors.COLLAPSE);\n const collapseElementIds = [...collapseElements].map(element => element.id);\n toogleAll.setAttribute('aria-controls', collapseElementIds.join(' '));\n\n this.addEventListener(toogleAll, 'click', this._allSectionToggler);\n this.addEventListener(toogleAll, 'keydown', e => {\n // Collapse/expand all sections when Space key is pressed on the toggle button.\n if (e.key === ' ') {\n this._allSectionToggler(e);\n }\n });\n this._refreshAllSectionsToggler(state);\n }\n\n if (this.reactive.supportComponents) {\n // Actions are only available in edit mode.\n if (this.reactive.isEditing) {\n new DispatchActions(this);\n }\n\n // Mark content as state ready.\n this.element.classList.add(this.classes.STATEDREADY);\n }\n\n // Capture completion events.\n this.addEventListener(\n this.element,\n CourseEvents.manualCompletionToggled,\n this._completionHandler\n );\n\n // Capture page scroll to update page item.\n this.addEventListener(\n document,\n \"scroll\",\n this._scrollHandler\n );\n setTimeout(() => {\n this._scrollHandler();\n }, 500);\n }\n\n /**\n * Setup sections toggler.\n *\n * Toggler click is delegated to the main course content element because new sections can\n * appear at any moment and this way we prevent accidental double bindings.\n *\n * @param {Event} event the triggered event\n */\n _sectionTogglers(event) {\n const sectionlink = event.target.closest(this.selectors.TOGGLER);\n const closestCollapse = event.target.closest(this.selectors.COLLAPSE);\n // Assume that chevron is the only collapse toggler in a section heading;\n // I think this is the most efficient way to verify at the moment.\n const isChevron = closestCollapse?.closest(this.selectors.SECTION_ITEM);\n\n if (sectionlink || isChevron) {\n\n const section = event.target.closest(this.selectors.SECTION);\n const toggler = section.querySelector(this.selectors.COLLAPSE);\n const isCollapsed = toggler?.classList.contains(this.classes.COLLAPSED) ?? false;\n\n if (isChevron || isCollapsed) {\n // Update the state.\n const sectionId = section.getAttribute('data-id');\n this.reactive.dispatch(\n 'sectionContentCollapsed',\n [sectionId],\n !isCollapsed\n );\n }\n }\n }\n\n /**\n * Handle the collapse/expand all sections button.\n *\n * Toggler click is delegated to the main course content element because new sections can\n * appear at any moment and this way we prevent accidental double bindings.\n *\n * @param {Event} event the triggered event\n */\n _allSectionToggler(event) {\n event.preventDefault();\n\n const target = event.target.closest(this.selectors.TOGGLEALL);\n const isAllCollapsed = target.classList.contains(this.classes.COLLAPSED);\n\n const course = this.reactive.get('course');\n this.reactive.dispatch(\n 'sectionContentCollapsed',\n course.sectionlist ?? [],\n !isAllCollapsed\n );\n }\n\n /**\n * Return the component watchers.\n *\n * @returns {Array} of watchers\n */\n getWatchers() {\n // Section return is a global page variable but most formats define it just before start printing\n // the course content. This is the reason why we define this page setting here.\n this.reactive.sectionReturn = this.sectionReturn;\n\n // Check if the course format is compatible with reactive components.\n if (!this.reactive.supportComponents) {\n return [];\n }\n return [\n // State changes that require to reload some course modules.\n {watch: `cm.visible:updated`, handler: this._reloadCm},\n {watch: `cm.stealth:updated`, handler: this._reloadCm},\n {watch: `cm.sectionid:updated`, handler: this._reloadCm},\n {watch: `cm.indent:updated`, handler: this._reloadCm},\n {watch: `cm.groupmode:updated`, handler: this._reloadCm},\n {watch: `cm.name:updated`, handler: this._refreshCmName},\n // Update section number and title.\n {watch: `section.number:updated`, handler: this._refreshSectionNumber},\n {watch: `section.title:updated`, handler: this._refreshSectionTitle},\n // Collapse and expand sections.\n {watch: `section.contentcollapsed:updated`, handler: this._refreshSectionCollapsed},\n // Sections and cm sorting.\n {watch: `transaction:start`, handler: this._startProcessing},\n {watch: `course.sectionlist:updated`, handler: this._refreshCourseSectionlist},\n {watch: `section.cmlist:updated`, handler: this._refreshSectionCmlist},\n // Section visibility.\n {watch: `section.visible:updated`, handler: this._reloadSection},\n // Reindex sections and cms.\n {watch: `state:updated`, handler: this._indexContents},\n ];\n }\n\n /**\n * Update a course module name on the whole page.\n *\n * @param {object} param\n * @param {Object} param.element details the update details.\n */\n _refreshCmName({element}) {\n // Update classes.\n // Replace the text content of the cm name.\n const allCmNamesFor = this.getElements(\n this.selectorGenerators.cmNameFor(element.id)\n );\n allCmNamesFor.forEach((cmNameFor) => {\n cmNameFor.textContent = element.name;\n });\n }\n\n /**\n * Update section collapsed state via bootstrap 4 if necessary.\n *\n * Formats that do not use bootstrap 4 must override this method in order to keep the section\n * toggling working.\n *\n * @param {object} args\n * @param {Object} args.state The state data\n * @param {Object} args.element The element to update\n */\n _refreshSectionCollapsed({state, element}) {\n const target = this.getElement(this.selectors.SECTION, element.id);\n if (!target) {\n throw new Error(`Unknown section with ID ${element.id}`);\n }\n // Check if it is already done.\n const toggler = target.querySelector(this.selectors.COLLAPSE);\n const isCollapsed = toggler?.classList.contains(this.classes.COLLAPSED) ?? false;\n\n if (element.contentcollapsed !== isCollapsed) {\n let collapsibleId = toggler.dataset.target ?? toggler.getAttribute(\"href\");\n if (!collapsibleId) {\n return;\n }\n collapsibleId = collapsibleId.replace('#', '');\n const collapsible = document.getElementById(collapsibleId);\n if (!collapsible) {\n return;\n }\n\n // Course index is based on Bootstrap 4 collapsibles. To collapse them we need jQuery to\n // interact with collapsibles methods. Hopefully, this will change in Bootstrap 5 because\n // it does not require jQuery anymore (when MDL-71979 is integrated).\n jQuery(collapsible).collapse(element.contentcollapsed ? 'hide' : 'show');\n }\n\n this._refreshAllSectionsToggler(state);\n }\n\n /**\n * Refresh the collapse/expand all sections element.\n *\n * @param {Object} state The state data\n */\n _refreshAllSectionsToggler(state) {\n const target = this.getElement(this.selectors.TOGGLEALL);\n if (!target) {\n return;\n }\n // Check if we have all sections collapsed/expanded.\n let allcollapsed = true;\n let allexpanded = true;\n state.section.forEach(\n section => {\n allcollapsed = allcollapsed && section.contentcollapsed;\n allexpanded = allexpanded && !section.contentcollapsed;\n }\n );\n if (allcollapsed) {\n target.classList.add(this.classes.COLLAPSED);\n target.setAttribute('aria-expanded', false);\n }\n if (allexpanded) {\n target.classList.remove(this.classes.COLLAPSED);\n target.setAttribute('aria-expanded', true);\n }\n }\n\n /**\n * Setup the component to start a transaction.\n *\n * Some of the course actions replaces the current DOM element with a new one before updating the\n * course state. This means the component cannot preload any index properly until the transaction starts.\n *\n */\n _startProcessing() {\n // During a section or cm sorting, some elements could be dettached from the DOM and we\n // need to store somewhare in case they are needed later.\n this.dettachedCms = {};\n this.dettachedSections = {};\n }\n\n /**\n * Activity manual completion listener.\n *\n * @param {Event} event the custom ecent\n */\n _completionHandler({detail}) {\n if (detail === undefined) {\n return;\n }\n this.reactive.dispatch('cmCompletion', [detail.cmid], detail.completed);\n }\n\n /**\n * Check the current page scroll and update the active element if necessary.\n */\n _scrollHandler() {\n const pageOffset = window.scrollY;\n const items = this.reactive.getExporter().allItemsArray(this.reactive.state);\n // Check what is the active element now.\n let pageItem = null;\n items.every(item => {\n const index = (item.type === 'section') ? this.sections : this.cms;\n if (index[item.id] === undefined) {\n return true;\n }\n\n const element = index[item.id].element;\n pageItem = item;\n return pageOffset >= element.offsetTop;\n });\n if (pageItem) {\n this.reactive.dispatch('setPageItem', pageItem.type, pageItem.id);\n }\n }\n\n /**\n * Update a course section when the section number changes.\n *\n * The courseActions module used for most course section tools still depends on css classes and\n * section numbers (not id). To prevent inconsistencies when a section is moved, we need to refresh\n * the\n *\n * Course formats can override the section title rendering so the frontend depends heavily on backend\n * rendering. Luckily in edit mode we can trigger a title update using the inplace_editable module.\n *\n * @param {Object} param\n * @param {Object} param.element details the update details.\n */\n _refreshSectionNumber({element}) {\n // Find the element.\n const target = this.getElement(this.selectors.SECTION, element.id);\n if (!target) {\n // Job done. Nothing to refresh.\n return;\n }\n // Update section numbers in all data, css and YUI attributes.\n target.id = `section-${element.number}`;\n // YUI uses section number as section id in data-sectionid, in principle if a format use components\n // don't need this sectionid attribute anymore, but we keep the compatibility in case some plugin\n // use it for legacy purposes.\n target.dataset.sectionid = element.number;\n // The data-number is the attribute used by components to store the section number.\n target.dataset.number = element.number;\n\n // Update title and title inplace editable, if any.\n const inplace = inplaceeditable.getInplaceEditable(target.querySelector(this.selectors.SECTION_ITEM));\n if (inplace) {\n // The course content HTML can be modified at any moment, so the function need to do some checkings\n // to make sure the inplace editable still represents the same itemid.\n const currentvalue = inplace.getValue();\n const currentitemid = inplace.getItemId();\n // Unnamed sections must be recalculated.\n if (inplace.getValue() === '') {\n // The value to send can be an empty value if it is a default name.\n if (currentitemid == element.id && (currentvalue != element.rawtitle || element.rawtitle == '')) {\n inplace.setValue(element.rawtitle);\n }\n }\n }\n }\n\n /**\n * Update a course section name on the whole page.\n *\n * @param {object} param\n * @param {Object} param.element details the update details.\n */\n _refreshSectionTitle({element}) {\n // Replace the text content of the section name in the whole page.\n const allSectionNamesFor = document.querySelectorAll(\n this.selectorGenerators.sectionNameFor(element.id)\n );\n allSectionNamesFor.forEach((sectionNameFor) => {\n sectionNameFor.textContent = element.title;\n });\n }\n\n /**\n * Refresh a section cm list.\n *\n * @param {Object} param\n * @param {Object} param.element details the update details.\n */\n _refreshSectionCmlist({element}) {\n const cmlist = element.cmlist ?? [];\n const section = this.getElement(this.selectors.SECTION, element.id);\n const listparent = section?.querySelector(this.selectors.SECTION_CMLIST);\n // A method to create a fake element to be replaced when the item is ready.\n const createCm = this._createCmItem.bind(this);\n if (listparent) {\n this._fixOrder(listparent, cmlist, this.selectors.CM, this.dettachedCms, createCm);\n }\n }\n\n /**\n * Refresh the section list.\n *\n * @param {Object} param\n * @param {Object} param.state the full state object.\n */\n _refreshCourseSectionlist({state}) {\n // If we have a section return means we only show a single section so no need to fix order.\n if (this.reactive.sectionReturn !== null) {\n return;\n }\n const sectionlist = this.reactive.getExporter().listedSectionIds(state);\n const listparent = this.getElement(this.selectors.COURSE_SECTIONLIST);\n // For now section cannot be created at a frontend level.\n const createSection = this._createSectionItem.bind(this);\n if (listparent) {\n this._fixOrder(listparent, sectionlist, this.selectors.SECTION, this.dettachedSections, createSection);\n }\n }\n\n /**\n * Regenerate content indexes.\n *\n * This method is used when a legacy action refresh some content element.\n */\n _indexContents() {\n // Find unindexed sections.\n this._scanIndex(\n this.selectors.SECTION,\n this.sections,\n (item) => {\n return new Section(item);\n }\n );\n\n // Find unindexed cms.\n this._scanIndex(\n this.selectors.CM,\n this.cms,\n (item) => {\n return new CmItem(item);\n }\n );\n }\n\n /**\n * Reindex a content (section or cm) of the course content.\n *\n * This method is used internally by _indexContents.\n *\n * @param {string} selector the DOM selector to scan\n * @param {*} index the index attribute to update\n * @param {*} creationhandler method to create a new indexed element\n */\n _scanIndex(selector, index, creationhandler) {\n const items = this.getElements(`${selector}:not([data-indexed])`);\n items.forEach((item) => {\n if (!item?.dataset?.id) {\n return;\n }\n // Delete previous item component.\n if (index[item.dataset.id] !== undefined) {\n index[item.dataset.id].unregister();\n }\n // Create the new component.\n index[item.dataset.id] = creationhandler({\n ...this,\n element: item,\n });\n // Mark as indexed.\n item.dataset.indexed = true;\n });\n }\n\n /**\n * Reload a course module contents.\n *\n * Most course module HTML is still strongly backend dependant.\n * Some changes require to get a new version of the module.\n *\n * @param {object} param0 the watcher details\n * @param {object} param0.element the state object\n */\n _reloadCm({element}) {\n if (!this.getElement(this.selectors.CM, element.id)) {\n return;\n }\n const debouncedReload = this._getDebouncedReloadCm(element.id);\n debouncedReload();\n }\n\n /**\n * Generate or get a reload CM debounced function.\n * @param {Number} cmId\n * @returns {Function} the debounced reload function\n */\n _getDebouncedReloadCm(cmId) {\n const pendingKey = `courseformat/content:reloadCm_${cmId}`;\n let debouncedReload = this.debouncedReloads.get(pendingKey);\n if (debouncedReload) {\n return debouncedReload;\n }\n const reload = () => {\n const pendingReload = new Pending(pendingKey);\n this.debouncedReloads.delete(pendingKey);\n const cmitem = this.getElement(this.selectors.CM, cmId);\n if (!cmitem) {\n return pendingReload.resolve();\n }\n const promise = Fragment.loadFragment(\n 'core_courseformat',\n 'cmitem',\n Config.courseContextId,\n {\n id: cmId,\n courseid: Config.courseId,\n sr: this.reactive.sectionReturn ?? null,\n }\n );\n promise.then((html, js) => {\n // Other state change can reload the CM or the section before this one.\n if (!document.contains(cmitem)) {\n pendingReload.resolve();\n return false;\n }\n Templates.replaceNode(cmitem, html, js);\n this._indexContents();\n pendingReload.resolve();\n return true;\n }).catch(() => {\n pendingReload.resolve();\n });\n return pendingReload;\n };\n debouncedReload = debounce(\n reload,\n 200,\n {\n cancel: true, pending: true\n }\n );\n this.debouncedReloads.set(pendingKey, debouncedReload);\n return debouncedReload;\n }\n\n /**\n * Cancel the active reload CM debounced function, if any.\n * @param {Number} cmId\n */\n _cancelDebouncedReloadCm(cmId) {\n const pendingKey = `courseformat/content:reloadCm_${cmId}`;\n const debouncedReload = this.debouncedReloads.get(pendingKey);\n if (!debouncedReload) {\n return;\n }\n debouncedReload.cancel();\n this.debouncedReloads.delete(pendingKey);\n }\n\n /**\n * Reload a course section contents.\n *\n * Section HTML is still strongly backend dependant.\n * Some changes require to get a new version of the section.\n *\n * @param {details} param0 the watcher details\n * @param {object} param0.element the state object\n */\n _reloadSection({element}) {\n const pendingReload = new Pending(`courseformat/content:reloadSection_${element.id}`);\n const sectionitem = this.getElement(this.selectors.SECTION, element.id);\n if (sectionitem) {\n // Cancel any pending reload because the section will reload cms too.\n for (const cmId of element.cmlist) {\n this._cancelDebouncedReloadCm(cmId);\n }\n const promise = Fragment.loadFragment(\n 'core_courseformat',\n 'section',\n Config.courseContextId,\n {\n id: element.id,\n courseid: Config.courseId,\n sr: this.reactive.sectionReturn ?? null,\n }\n );\n promise.then((html, js) => {\n Templates.replaceNode(sectionitem, html, js);\n this._indexContents();\n pendingReload.resolve();\n }).catch(() => {\n pendingReload.resolve();\n });\n }\n }\n\n /**\n * Create a new course module item in a section.\n *\n * Thos method will append a fake item in the container and trigger an ajax request to\n * replace the fake element by the real content.\n *\n * @param {Element} container the container element (section)\n * @param {Number} cmid the course-module ID\n * @returns {Element} the created element\n */\n _createCmItem(container, cmid) {\n const newItem = document.createElement(this.selectors.ACTIVITYTAG);\n newItem.dataset.for = 'cmitem';\n newItem.dataset.id = cmid;\n // The legacy actions.js requires a specific ID and class to refresh the CM.\n newItem.id = `module-${cmid}`;\n newItem.classList.add(this.classes.ACTIVITY);\n container.append(newItem);\n this._reloadCm({\n element: this.reactive.get('cm', cmid),\n });\n return newItem;\n }\n\n /**\n * Create a new section item.\n *\n * This method will append a fake item in the container and trigger an ajax request to\n * replace the fake element by the real content.\n *\n * @param {Element} container the container element (section)\n * @param {Number} sectionid the course-module ID\n * @returns {Element} the created element\n */\n _createSectionItem(container, sectionid) {\n const section = this.reactive.get('section', sectionid);\n const newItem = document.createElement(this.selectors.SECTIONTAG);\n newItem.dataset.for = 'section';\n newItem.dataset.id = sectionid;\n newItem.dataset.number = section.number;\n // The legacy actions.js requires a specific ID and class to refresh the section.\n newItem.id = `section-${sectionid}`;\n newItem.classList.add(this.classes.SECTION);\n container.append(newItem);\n this._reloadSection({\n element: section,\n });\n return newItem;\n }\n\n /**\n * Fix/reorder the section or cms order.\n *\n * @param {Element} container the HTML element to reorder.\n * @param {Array} neworder an array with the ids order\n * @param {string} selector the element selector\n * @param {Object} dettachedelements a list of dettached elements\n * @param {function} createMethod method to create missing elements\n */\n async _fixOrder(container, neworder, selector, dettachedelements, createMethod) {\n if (container === undefined) {\n return;\n }\n\n // Empty lists should not be visible.\n if (!neworder.length) {\n container.classList.add('hidden');\n container.innerHTML = '';\n return;\n }\n\n // Grant the list is visible (in case it was empty).\n container.classList.remove('hidden');\n\n // Move the elements in order at the beginning of the list.\n neworder.forEach((itemid, index) => {\n let item = this.getElement(selector, itemid) ?? dettachedelements[itemid] ?? createMethod(container, itemid);\n if (item === undefined) {\n // Missing elements cannot be sorted.\n return;\n }\n // Get the current elemnt at that position.\n const currentitem = container.children[index];\n if (currentitem === undefined) {\n container.append(item);\n return;\n }\n if (currentitem !== item) {\n container.insertBefore(item, currentitem);\n }\n });\n\n // Dndupload add a fake element we need to keep.\n let dndFakeActivity;\n\n // Remove the remaining elements.\n while (container.children.length > neworder.length) {\n const lastchild = container.lastChild;\n if (lastchild?.classList?.contains('dndupload-preview')) {\n dndFakeActivity = lastchild;\n } else {\n dettachedelements[lastchild?.dataset?.id ?? 0] = lastchild;\n }\n container.removeChild(lastchild);\n }\n // Restore dndupload fake element.\n if (dndFakeActivity) {\n container.append(dndFakeActivity);\n }\n }\n}\n"],"names":["Component","BaseComponent","create","descriptor","name","selectors","SECTION","SECTION_ITEM","SECTION_CMLIST","COURSE_SECTIONLIST","CM","TOGGLER","COLLAPSE","TOGGLEALL","ACTIVITYTAG","SECTIONTAG","selectorGenerators","cmNameFor","id","sectionNameFor","classes","COLLAPSED","ACTIVITY","STATEDREADY","dettachedCms","dettachedSections","sections","cms","sectionReturn","debouncedReloads","Map","target","element","document","getElementById","reactive","stateReady","state","_indexContents","addEventListener","this","_sectionTogglers","toogleAll","getElement","collapseElementIds","getElements","map","setAttribute","join","_allSectionToggler","e","key","_refreshAllSectionsToggler","supportComponents","isEditing","DispatchActions","classList","add","CourseEvents","manualCompletionToggled","_completionHandler","_scrollHandler","setTimeout","event","sectionlink","closest","closestCollapse","isChevron","section","toggler","querySelector","isCollapsed","contains","sectionId","getAttribute","dispatch","preventDefault","isAllCollapsed","course","get","sectionlist","getWatchers","watch","handler","_reloadCm","_refreshCmName","_refreshSectionNumber","_refreshSectionTitle","_refreshSectionCollapsed","_startProcessing","_refreshCourseSectionlist","_refreshSectionCmlist","_reloadSection","forEach","textContent","Error","contentcollapsed","collapsibleId","dataset","replace","collapsible","collapse","allcollapsed","allexpanded","remove","detail","undefined","cmid","completed","pageOffset","window","scrollY","items","getExporter","allItemsArray","pageItem","every","item","index","type","offsetTop","number","sectionid","inplace","inplaceeditable","getInplaceEditable","currentvalue","getValue","currentitemid","getItemId","rawtitle","setValue","querySelectorAll","title","cmlist","listparent","createCm","_createCmItem","bind","_fixOrder","listedSectionIds","createSection","_createSectionItem","_scanIndex","Section","CmItem","selector","creationhandler","_item$dataset","unregister","indexed","_getDebouncedReloadCm","debouncedReload","cmId","pendingKey","pendingReload","Pending","delete","cmitem","resolve","Fragment","loadFragment","Config","courseContextId","courseid","courseId","sr","then","html","js","replaceNode","catch","cancel","pending","set","_cancelDebouncedReloadCm","sectionitem","container","newItem","createElement","for","append","neworder","dettachedelements","createMethod","length","innerHTML","dndFakeActivity","itemid","currentitem","children","insertBefore","lastchild","lastChild","_lastchild$classList","_lastchild$dataset","removeChild"],"mappings":";;;;;;;;+oCAuCqBA,kBAAkBC,wBAOnCC,OAAOC,2CAEEC,KAAO,qBAEPC,UAAY,CACbC,+BACAC,0CACAC,qCACAC,qDACAC,yBACAC,qDACAC,oCACAC,sCAEAC,YAAa,KACbC,WAAY,WAEXC,mBAAqB,CACtBC,UAAYC,iCAA6BA,SACzCC,eAAiBD,sCAAkCA,eAGlDE,QAAU,CACXC,sBAEAC,oBACAC,yBACAjB,wBAGCkB,aAAe,QACfC,kBAAoB,QAEpBC,SAAW,QACXC,IAAM,QAENC,4CAAgBzB,WAAWyB,qEAAiB,UAC5CC,iBAAmB,IAAIC,gBAWpBC,OAAQ1B,UAAWuB,sBACpB,IAAI5B,UAAU,CACjBgC,QAASC,SAASC,eAAeH,QACjCI,UAAU,0CACV9B,UAAAA,UACAuB,cAAAA,gBASRQ,WAAWC,YACFC,sBAEAC,iBAAiBC,KAAKR,QAAS,QAASQ,KAAKC,wBAG5CC,UAAYF,KAAKG,WAAWH,KAAKnC,UAAUQ,cAC7C6B,UAAW,OAILE,mBAAqB,IADFJ,KAAKK,YAAYL,KAAKnC,UAAUO,WACRkC,KAAId,SAAWA,QAAQd,KACxEwB,UAAUK,aAAa,gBAAiBH,mBAAmBI,KAAK,WAE3DT,iBAAiBG,UAAW,QAASF,KAAKS,yBAC1CV,iBAAiBG,UAAW,WAAWQ,IAE1B,MAAVA,EAAEC,UACGF,mBAAmBC,WAG3BE,2BAA2Bf,OAGhCG,KAAKL,SAASkB,oBAEVb,KAAKL,SAASmB,eACVC,iBAAgBf,WAInBR,QAAQwB,UAAUC,IAAIjB,KAAKpB,QAAQG,mBAIvCgB,iBACDC,KAAKR,QACL0B,aAAaC,wBACbnB,KAAKoB,yBAIJrB,iBACDN,SACA,SACAO,KAAKqB,gBAETC,YAAW,UACFD,mBACN,KAWPpB,iBAAiBsB,aACPC,YAAcD,MAAMhC,OAAOkC,QAAQzB,KAAKnC,UAAUM,SAClDuD,gBAAkBH,MAAMhC,OAAOkC,QAAQzB,KAAKnC,UAAUO,UAGtDuD,UAAYD,MAAAA,uBAAAA,gBAAiBD,QAAQzB,KAAKnC,UAAUE,iBAEtDyD,aAAeG,UAAW,iCAEpBC,QAAUL,MAAMhC,OAAOkC,QAAQzB,KAAKnC,UAAUC,SAC9C+D,QAAUD,QAAQE,cAAc9B,KAAKnC,UAAUO,UAC/C2D,0CAAcF,MAAAA,eAAAA,QAASb,UAAUgB,SAAShC,KAAKpB,QAAQC,sEAEzD8C,WAAaI,YAAa,OAEpBE,UAAYL,QAAQM,aAAa,gBAClCvC,SAASwC,SACV,0BACA,CAACF,YACAF,eAcjBtB,mBAAmBc,+BACfA,MAAMa,uBAGAC,eADSd,MAAMhC,OAAOkC,QAAQzB,KAAKnC,UAAUQ,WACrB2C,UAAUgB,SAAShC,KAAKpB,QAAQC,WAExDyD,OAAStC,KAAKL,SAAS4C,IAAI,eAC5B5C,SAASwC,SACV,sDACAG,OAAOE,+DAAe,IACrBH,gBASTI,0BAGS9C,SAASP,cAAgBY,KAAKZ,cAG9BY,KAAKL,SAASkB,kBAGZ,CAEH,CAAC6B,2BAA6BC,QAAS3C,KAAK4C,WAC5C,CAACF,2BAA6BC,QAAS3C,KAAK4C,WAC5C,CAACF,6BAA+BC,QAAS3C,KAAK4C,WAC9C,CAACF,0BAA4BC,QAAS3C,KAAK4C,WAC3C,CAACF,6BAA+BC,QAAS3C,KAAK4C,WAC9C,CAACF,wBAA0BC,QAAS3C,KAAK6C,gBAEzC,CAACH,+BAAiCC,QAAS3C,KAAK8C,uBAChD,CAACJ,8BAAgCC,QAAS3C,KAAK+C,sBAE/C,CAACL,yCAA2CC,QAAS3C,KAAKgD,0BAE1D,CAACN,0BAA4BC,QAAS3C,KAAKiD,kBAC3C,CAACP,mCAAqCC,QAAS3C,KAAKkD,2BACpD,CAACR,+BAAiCC,QAAS3C,KAAKmD,uBAEhD,CAACT,gCAAkCC,QAAS3C,KAAKoD,gBAEjD,CAACV,sBAAwBC,QAAS3C,KAAKF,iBAtBhC,GAgCf+C,yBAAerD,QAACA,cAGUQ,KAAKK,YACvBL,KAAKxB,mBAAmBC,UAAUe,QAAQd,KAEhC2E,SAAS5E,YACnBA,UAAU6E,YAAc9D,QAAQ5B,QAcxCoF,+DAAyBnD,MAACA,MAADL,QAAQA,qBACvBD,OAASS,KAAKG,WAAWH,KAAKnC,UAAUC,QAAS0B,QAAQd,QAC1Da,aACK,IAAIgE,wCAAiC/D,QAAQd,WAGjDmD,QAAUtC,OAAOuC,cAAc9B,KAAKnC,UAAUO,UAC9C2D,2CAAcF,MAAAA,eAAAA,QAASb,UAAUgB,SAAShC,KAAKpB,QAAQC,wEAEzDW,QAAQgE,mBAAqBzB,YAAa,+BACtC0B,4CAAgB5B,QAAQ6B,QAAQnE,8DAAUsC,QAAQK,aAAa,YAC9DuB,qBAGLA,cAAgBA,cAAcE,QAAQ,IAAK,UACrCC,YAAcnE,SAASC,eAAe+D,mBACvCG,uCAOEA,aAAaC,SAASrE,QAAQgE,iBAAmB,OAAS,aAGhE5C,2BAA2Bf,OAQpCe,2BAA2Bf,aACjBN,OAASS,KAAKG,WAAWH,KAAKnC,UAAUQ,eACzCkB,kBAIDuE,cAAe,EACfC,aAAc,EAClBlE,MAAM+B,QAAQyB,SACVzB,UACIkC,aAAeA,cAAgBlC,QAAQ4B,iBACvCO,YAAcA,cAAgBnC,QAAQ4B,oBAG1CM,eACAvE,OAAOyB,UAAUC,IAAIjB,KAAKpB,QAAQC,WAClCU,OAAOgB,aAAa,iBAAiB,IAErCwD,cACAxE,OAAOyB,UAAUgD,OAAOhE,KAAKpB,QAAQC,WACrCU,OAAOgB,aAAa,iBAAiB,IAW7C0C,wBAGSjE,aAAe,QACfC,kBAAoB,GAQ7BmC,8BAAmB6C,OAACA,mBACDC,IAAXD,aAGCtE,SAASwC,SAAS,eAAgB,CAAC8B,OAAOE,MAAOF,OAAOG,WAMjE/C,uBACUgD,WAAaC,OAAOC,QACpBC,MAAQxE,KAAKL,SAAS8E,cAAcC,cAAc1E,KAAKL,SAASE,WAElE8E,SAAW,KACfH,MAAMI,OAAMC,aACFC,MAAuB,YAAdD,KAAKE,KAAsB/E,KAAKd,SAAWc,KAAKb,YACxC+E,IAAnBY,MAAMD,KAAKnG,WACJ,QAGLc,QAAUsF,MAAMD,KAAKnG,IAAIc,eAC/BmF,SAAWE,KACJR,YAAc7E,QAAQwF,aAE7BL,eACKhF,SAASwC,SAAS,cAAewC,SAASI,KAAMJ,SAASjG,IAiBtEoE,iCAAsBtD,QAACA,qBAEbD,OAASS,KAAKG,WAAWH,KAAKnC,UAAUC,QAAS0B,QAAQd,QAC1Da,cAKLA,OAAOb,qBAAgBc,QAAQyF,QAI/B1F,OAAOmE,QAAQwB,UAAY1F,QAAQyF,OAEnC1F,OAAOmE,QAAQuB,OAASzF,QAAQyF,aAG1BE,QAAUC,0BAAgBC,mBAAmB9F,OAAOuC,cAAc9B,KAAKnC,UAAUE,kBACnFoH,QAAS,OAGHG,aAAeH,QAAQI,WACvBC,cAAgBL,QAAQM,YAEH,KAAvBN,QAAQI,aAEJC,eAAiBhG,QAAQd,IAAO4G,cAAgB9F,QAAQkG,UAAgC,IAApBlG,QAAQkG,UAC5EP,QAAQQ,SAASnG,QAAQkG,YAYzC3C,gCAAqBvD,QAACA,eAESC,SAASmG,iBAChC5F,KAAKxB,mBAAmBG,eAAea,QAAQd,KAEhC2E,SAAS1E,iBACxBA,eAAe2E,YAAc9D,QAAQqG,SAU7C1C,qDAAsB3D,QAACA,qBACbsG,+BAAStG,QAAQsG,kDAAU,GAC3BlE,QAAU5B,KAAKG,WAAWH,KAAKnC,UAAUC,QAAS0B,QAAQd,IAC1DqH,WAAanE,MAAAA,eAAAA,QAASE,cAAc9B,KAAKnC,UAAUG,gBAEnDgI,SAAWhG,KAAKiG,cAAcC,KAAKlG,MACrC+F,iBACKI,UAAUJ,WAAYD,OAAQ9F,KAAKnC,UAAUK,GAAI8B,KAAKhB,aAAcgH,UAUjF9C,qCAA0BrD,MAACA,gBAEa,OAAhCG,KAAKL,SAASP,2BAGZoD,YAAcxC,KAAKL,SAAS8E,cAAc2B,iBAAiBvG,OAC3DkG,WAAa/F,KAAKG,WAAWH,KAAKnC,UAAUI,oBAE5CoI,cAAgBrG,KAAKsG,mBAAmBJ,KAAKlG,MAC/C+F,iBACKI,UAAUJ,WAAYvD,YAAaxC,KAAKnC,UAAUC,QAASkC,KAAKf,kBAAmBoH,eAShGvG,sBAESyG,WACDvG,KAAKnC,UAAUC,QACfkC,KAAKd,UACJ2F,MACU,IAAI2B,iBAAQ3B,aAKtB0B,WACDvG,KAAKnC,UAAUK,GACf8B,KAAKb,KACJ0F,MACU,IAAI4B,gBAAO5B,QAc9B0B,WAAWG,SAAU5B,MAAO6B,iBACV3G,KAAKK,sBAAeqG,kCAC5BrD,SAASwB,yBACNA,MAAAA,4BAAAA,KAAMnB,kCAANkD,cAAelI,UAIWwF,IAA3BY,MAAMD,KAAKnB,QAAQhF,KACnBoG,MAAMD,KAAKnB,QAAQhF,IAAImI,aAG3B/B,MAAMD,KAAKnB,QAAQhF,IAAMiI,gBAAgB,IAClC3G,KACHR,QAASqF,OAGbA,KAAKnB,QAAQoD,SAAU,MAa/BlE,qBAAUpD,QAACA,mBACFQ,KAAKG,WAAWH,KAAKnC,UAAUK,GAAIsB,QAAQd,WAGxBsB,KAAK+G,sBAAsBvH,QAAQd,GAC3DsI,GAQJD,sBAAsBE,YACZC,mDAA8CD,UAChDD,gBAAkBhH,KAAKX,iBAAiBkD,IAAI2E,eAC5CF,uBACOA,uBAkCXA,iBAAkB,oBAhCH,qCACLG,cAAgB,IAAIC,iBAAQF,iBAC7B7H,iBAAiBgI,OAAOH,kBACvBI,OAAStH,KAAKG,WAAWH,KAAKnC,UAAUK,GAAI+I,UAC7CK,cACMH,cAAcI,iBAETC,kBAASC,aACrB,oBACA,SACAC,gBAAOC,gBACP,CACIjJ,GAAIuI,KACJW,SAAUF,gBAAOG,SACjBC,iCAAI9H,KAAKL,SAASP,qEAAiB,OAGnC2I,MAAK,CAACC,KAAMC,KAEXxI,SAASuC,SAASsF,4BAIbY,YAAYZ,OAAQU,KAAMC,SAC/BnI,iBACLqH,cAAcI,WACP,IANHJ,cAAcI,WACP,KAMZY,OAAM,KACLhB,cAAcI,aAEXJ,gBAIP,IACA,CACIiB,QAAQ,EAAMC,SAAS,SAG1BhJ,iBAAiBiJ,IAAIpB,WAAYF,iBAC/BA,gBAOXuB,yBAAyBtB,YACfC,mDAA8CD,MAC9CD,gBAAkBhH,KAAKX,iBAAiBkD,IAAI2E,YAC7CF,kBAGLA,gBAAgBoB,cACX/I,iBAAiBgI,OAAOH,aAYjC9D,0BAAe5D,QAACA,qBACN2H,cAAgB,IAAIC,8DAA8C5H,QAAQd,KAC1E8J,YAAcxI,KAAKG,WAAWH,KAAKnC,UAAUC,QAAS0B,QAAQd,OAChE8J,YAAa,gCAER,MAAMvB,QAAQzH,QAAQsG,YAClByC,yBAAyBtB,MAElBO,kBAASC,aACrB,oBACA,UACAC,gBAAOC,gBACP,CACIjJ,GAAIc,QAAQd,GACZkJ,SAAUF,gBAAOG,SACjBC,kCAAI9H,KAAKL,SAASP,uEAAiB,OAGnC2I,MAAK,CAACC,KAAMC,yBACNC,YAAYM,YAAaR,KAAMC,SACpCnI,iBACLqH,cAAcI,aACfY,OAAM,KACLhB,cAAcI,cAe1BtB,cAAcwC,UAAWtE,YACfuE,QAAUjJ,SAASkJ,cAAc3I,KAAKnC,UAAUS,oBACtDoK,QAAQhF,QAAQkF,IAAM,SACtBF,QAAQhF,QAAQhF,GAAKyF,KAErBuE,QAAQhK,oBAAeyF,MACvBuE,QAAQ1H,UAAUC,IAAIjB,KAAKpB,QAAQE,UACnC2J,UAAUI,OAAOH,cACZ9F,UAAU,CACXpD,QAASQ,KAAKL,SAAS4C,IAAI,KAAM4B,QAE9BuE,QAaXpC,mBAAmBmC,UAAWvD,iBACpBtD,QAAU5B,KAAKL,SAAS4C,IAAI,UAAW2C,WACvCwD,QAAUjJ,SAASkJ,cAAc3I,KAAKnC,UAAUU,mBACtDmK,QAAQhF,QAAQkF,IAAM,UACtBF,QAAQhF,QAAQhF,GAAKwG,UACrBwD,QAAQhF,QAAQuB,OAASrD,QAAQqD,OAEjCyD,QAAQhK,qBAAgBwG,WACxBwD,QAAQ1H,UAAUC,IAAIjB,KAAKpB,QAAQd,SACnC2K,UAAUI,OAAOH,cACZtF,eAAe,CAChB5D,QAASoC,UAEN8G,wBAYKD,UAAWK,SAAUpC,SAAUqC,kBAAmBC,sBAC5C9E,IAAduE,qBAKCK,SAASG,cACVR,UAAUzH,UAAUC,IAAI,eACxBwH,UAAUS,UAAY,QA0BtBC,oBArBJV,UAAUzH,UAAUgD,OAAO,UAG3B8E,SAASzF,SAAQ,CAAC+F,OAAQtE,yCAClBD,6CAAO7E,KAAKG,WAAWuG,SAAU0C,qDAAWL,kBAAkBK,iCAAWJ,aAAaP,UAAWW,gBACxFlF,IAATW,kBAKEwE,YAAcZ,UAAUa,SAASxE,YACnBZ,IAAhBmF,YAIAA,cAAgBxE,MAChB4D,UAAUc,aAAa1E,KAAMwE,aAJ7BZ,UAAUI,OAAOhE,SAYlB4D,UAAUa,SAASL,OAASH,SAASG,QAAQ,gCAC1CO,UAAYf,UAAUgB,0DACxBD,MAAAA,wCAAAA,UAAWxI,2CAAX0I,qBAAsB1H,SAAS,qBAC/BmH,gBAAkBK,eAElBT,gDAAkBS,MAAAA,sCAAAA,UAAW9F,6CAAXiG,mBAAoBjL,0DAAM,GAAK8K,UAErDf,UAAUmB,YAAYJ,WAGtBL,iBACAV,UAAUI,OAAOM"} \ No newline at end of file diff --git a/course/format/amd/src/local/content.js b/course/format/amd/src/local/content.js index c26c9c709550d..b945f80ce7761 100644 --- a/course/format/amd/src/local/content.js +++ b/course/format/amd/src/local/content.js @@ -63,6 +63,7 @@ export default class Component extends BaseComponent { }; this.selectorGenerators = { cmNameFor: (id) => `[data-cm-name-for='${id}']`, + sectionNameFor: (id) => `[data-section-name-for='${id}']`, }; // Default classes to toggle on refresh. this.classes = { @@ -236,6 +237,7 @@ export default class Component extends BaseComponent { {watch: `cm.name:updated`, handler: this._refreshCmName}, // Update section number and title. {watch: `section.number:updated`, handler: this._refreshSectionNumber}, + {watch: `section.title:updated`, handler: this._refreshSectionTitle}, // Collapse and expand sections. {watch: `section.contentcollapsed:updated`, handler: this._refreshSectionCollapsed}, // Sections and cm sorting. @@ -429,6 +431,22 @@ export default class Component extends BaseComponent { } } + /** + * Update a course section name on the whole page. + * + * @param {object} param + * @param {Object} param.element details the update details. + */ + _refreshSectionTitle({element}) { + // Replace the text content of the section name in the whole page. + const allSectionNamesFor = document.querySelectorAll( + this.selectorGenerators.sectionNameFor(element.id) + ); + allSectionNamesFor.forEach((sectionNameFor) => { + sectionNameFor.textContent = element.title; + }); + } + /** * Refresh a section cm list. * From dba1efa28e6451c3deaa938addc0813232db81e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikel=20Mart=C3=ADn?= Date: Tue, 5 Mar 2024 16:08:06 +0100 Subject: [PATCH 18/51] MDL-81050 navigation: Add data attributes to sections in breadcrumbs - Add a new method 'add_attribute' to navigation nodes to add HTML attributes to nodes. - Add data-attribute to section nodes and include them in breadcrumb mustache to automatically update section titles when sections are renamed. --- lib/navigationlib.php | 13 +++++++++++++ lib/templates/navbar.mustache | 14 ++++++++++++-- lib/tests/navigationlib_test.php | 16 ++++++++++++++++ lib/upgrade.txt | 1 + 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/lib/navigationlib.php b/lib/navigationlib.php index f56a6ef65c73e..09cfc188f1e0c 100644 --- a/lib/navigationlib.php +++ b/lib/navigationlib.php @@ -116,6 +116,8 @@ class navigation_node implements renderable { public $forceopen = false; /** @var array An array of CSS classes for the node */ public $classes = array(); + /** @var array An array of HTML attributes for the node */ + public $attributes = []; /** @var navigation_node_collection An array of child nodes */ public $children = array(); /** @var bool If set to true the node will be recognised as active */ @@ -559,6 +561,16 @@ public function add_class($class) { return true; } + /** + * Adds an HTML attribute to this node. + * + * @param string $name + * @param string $value + */ + public function add_attribute(string $name, string $value): void { + $this->attributes[] = ['name' => $name, 'value' => $value]; + } + /** * Removes a CSS class from this node. * @@ -2290,6 +2302,7 @@ public function load_generic_course_sections(stdClass $course, navigation_node $ null, $section->id, new pix_icon('i/section', '')); $sectionnode->nodetype = navigation_node::NODETYPE_BRANCH; $sectionnode->hidden = (!$section->visible || !$section->available); + $sectionnode->add_attribute('data-section-name-for', $section->id); if ($this->includesectionnum !== false && $this->includesectionnum == $section->section) { $this->load_section_activities($sectionnode, $section->section, $activities); } diff --git a/lib/templates/navbar.mustache b/lib/templates/navbar.mustache index c1834d84c191d..6e94273bfe4ca 100644 --- a/lib/templates/navbar.mustache +++ b/lib/templates/navbar.mustache @@ -68,11 +68,21 @@ }}{{#get_items}} {{#has_action}}
{{/has_action}} {{^has_action}} - + {{/has_action}} {{/get_items}}{{! }} diff --git a/lib/tests/navigationlib_test.php b/lib/tests/navigationlib_test.php index ed875a7a8e1dd..dc38ebfcfb961 100644 --- a/lib/tests/navigationlib_test.php +++ b/lib/tests/navigationlib_test.php @@ -152,6 +152,22 @@ public function test_node_add_class() { } } + /** + * Test the add_attribute method. + * @covers \navigation_node::add_attribute + */ + public function test_node_add_attribute(): void { + $this->setup_node(); + + $node = $this->node->get('demo1'); + $this->assertInstanceOf('navigation_node', $node); + if ($node !== false) { + $node->add_attribute('data-foo', 'bar'); + $attribute = reset($node->attributes); + $this->assertEqualsCanonicalizing(['name' => 'data-foo', 'value' => 'bar'], $attribute); + } + } + public function test_node_check_if_active() { $this->setup_node(); diff --git a/lib/upgrade.txt b/lib/upgrade.txt index 3d02d603ede86..e93d1c787357b 100644 --- a/lib/upgrade.txt +++ b/lib/upgrade.txt @@ -92,6 +92,7 @@ information provided here is intended especially for developers. - `question_fix_top_names` * Added a new parameter to `core_renderer::container` and `core_renderer::container_start` to allow for the addition of custom attributes. +* Added a new method `navigation_node::add_attribute()` to allow adding HTML attributes to the node. === 4.3 === From 60a4bf5bcc9cad8eea261ce68141515e443da552 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikel=20Mart=C3=ADn?= Date: Fri, 8 Mar 2024 12:58:40 +0100 Subject: [PATCH 19/51] MDL-81110 theme_boost: Fix scroll-margin-top in #maincontent - Fix scroll-margin-top in #maincontent element - Add scroll-margin-top for focused elements too --- theme/boost/scss/moodle/core.scss | 2 +- theme/boost/scss/moodle/drawer.scss | 3 ++- theme/boost/style/moodle.css | 5 +++-- theme/classic/style/moodle.css | 5 +++-- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/theme/boost/scss/moodle/core.scss b/theme/boost/scss/moodle/core.scss index 80e5a3635baaa..cc02b51d0f19e 100644 --- a/theme/boost/scss/moodle/core.scss +++ b/theme/boost/scss/moodle/core.scss @@ -393,7 +393,7 @@ img.activityicon { #maincontent { display: block; height: 1px; - overflow: hidden; + overflow: clip; } img.uihint { diff --git a/theme/boost/scss/moodle/drawer.scss b/theme/boost/scss/moodle/drawer.scss index a57de7fbe1330..cf3b20e50aa7e 100644 --- a/theme/boost/scss/moodle/drawer.scss +++ b/theme/boost/scss/moodle/drawer.scss @@ -11,7 +11,8 @@ $drawer-bg-color: $gray-100 !default; $drawer-scroll-bg-track: $gray-100 !default; $drawer-shadow-color: rgba(0, 0, 0, .25) !default; -:target { +:target, +:focus { scroll-margin-top: $fixed-header-y + 10px; } diff --git a/theme/boost/style/moodle.css b/theme/boost/style/moodle.css index b7ee36ca08574..a477a20ad303a 100644 --- a/theme/boost/style/moodle.css +++ b/theme/boost/style/moodle.css @@ -23282,7 +23282,7 @@ img.activityicon { #maincontent { display: block; height: 1px; - overflow: hidden; + overflow: clip; } img.uihint { @@ -29748,7 +29748,8 @@ span.editinstructions .alert-link { } /* Anchor link offset fix. This makes hash links scroll 60px down to account for the fixed header. */ -:target { +:target, +:focus { scroll-margin-top: 70px; } diff --git a/theme/classic/style/moodle.css b/theme/classic/style/moodle.css index 20cd8dfe65df6..a28fbf84eb9fb 100644 --- a/theme/classic/style/moodle.css +++ b/theme/classic/style/moodle.css @@ -23282,7 +23282,7 @@ img.activityicon { #maincontent { display: block; height: 1px; - overflow: hidden; + overflow: clip; } img.uihint { @@ -29748,7 +29748,8 @@ span.editinstructions .alert-link { } /* Anchor link offset fix. This makes hash links scroll 60px down to account for the fixed header. */ -:target { +:target, +:focus { scroll-margin-top: 60px; } From c3db339f07fdb6a10e5015d316c4c8f53dd32d08 Mon Sep 17 00:00:00 2001 From: Marina Glancy Date: Tue, 9 Jan 2024 13:31:51 +0000 Subject: [PATCH 20/51] MDL-80560 admin: user list - show picture, download, fix identity fields --- .../reportbuilder/local/systemreports/users.php | 14 ++++++-------- admin/user.php | 2 +- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/admin/classes/reportbuilder/local/systemreports/users.php b/admin/classes/reportbuilder/local/systemreports/users.php index b3ae4c5643468..28fde601b0c5c 100644 --- a/admin/classes/reportbuilder/local/systemreports/users.php +++ b/admin/classes/reportbuilder/local/systemreports/users.php @@ -113,7 +113,7 @@ protected function initialise(): void { $this->add_actions(); // Set if report can be downloaded. - $this->set_downloadable(false); + $this->set_downloadable(true); } /** @@ -135,17 +135,15 @@ public function add_columns(): void { $entityuser = $this->get_entity('user'); $entityuseralias = $entityuser->get_table_alias('user'); - $this->add_column($entityuser->get_column('fullnamewithlink')); + $this->add_column($entityuser->get_column('fullnamewithpicturelink')); // Include identity field columns. - $identitycolumns = $entityuser->get_identity_columns($this->get_context(), ['city', 'country', 'lastaccesstime']); + $identitycolumns = $entityuser->get_identity_columns($this->get_context()); foreach ($identitycolumns as $identitycolumn) { $this->add_column($identitycolumn); } - // These columns are always shown in the users list. - $this->add_column($entityuser->get_column('city')); - $this->add_column($entityuser->get_column('country')); + // Add "Last access" column. $this->add_column(($entityuser->get_column('lastaccess')) ->set_callback(static function ($value, \stdClass $row): string { if ($row->lastaccess) { @@ -155,7 +153,7 @@ public function add_columns(): void { }) ); - if ($column = $this->get_column('user:fullnamewithlink')) { + if ($column = $this->get_column('user:fullnamewithpicturelink')) { $column ->add_fields("{$entityuseralias}.suspended, {$entityuseralias}.confirmed") ->add_callback(static function(string $fullname, \stdClass $row): string { @@ -171,7 +169,7 @@ public function add_columns(): void { }); } - $this->set_initial_sort_column('user:fullnamewithlink', SORT_ASC); + $this->set_initial_sort_column('user:fullnamewithpicturelink', SORT_ASC); $this->set_default_no_results_notice(new lang_string('nousersfound', 'moodle')); } diff --git a/admin/user.php b/admin/user.php index 63e16a229c19a..fe29620cb4b64 100644 --- a/admin/user.php +++ b/admin/user.php @@ -176,7 +176,7 @@ echo html_writer::start_div('', ['data-region' => 'report-user-list-wrapper']); $bulkactions = new user_bulk_action_form(new moodle_url('/admin/user/user_bulk.php'), - ['excludeactions' => ['displayonpage'], 'passuserids' => true, 'hidesubmit' => true], + ['excludeactions' => ['displayonpage', 'download'], 'passuserids' => true, 'hidesubmit' => true], 'post', '', ['id' => 'user-bulk-action-form']); $bulkactions->set_data(['returnurl' => $PAGE->url->out_as_local_url(false)]); From 10f378a7a4494af780f7813ae28b987c648eef22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikel=20Mart=C3=ADn?= Date: Wed, 6 Mar 2024 14:27:16 +0100 Subject: [PATCH 21/51] MDL-81050 course: Add behat scenarios for inline section renaming --- course/format/tests/behat/course_courseindex.feature | 7 +++++++ course/format/tests/behat/section_page.feature | 10 ++++++++++ 2 files changed, 17 insertions(+) diff --git a/course/format/tests/behat/course_courseindex.feature b/course/format/tests/behat/course_courseindex.feature index aec8d5527fd14..63cbfffbf05e7 100644 --- a/course/format/tests/behat/course_courseindex.feature +++ b/course/format/tests/behat/course_courseindex.feature @@ -374,3 +374,10 @@ Feature: Course index depending on role And I should see "Activity sample 5" in the "courseindex-content" "region" # Label intro text should be displayed if label name is not set. And I should see "Test label 2" in the "courseindex-content" "region" + + @javascript + Scenario: Change the section name inline in section page + When I am on the "Course 1 > Section 2" "course > section" page logged in as "teacher1" + And I turn editing mode on + When I set the field "Edit section name" in the "page-header" "region" to "Custom section name" + Then I should see "Custom section name" in the "courseindex-content" "region" diff --git a/course/format/tests/behat/section_page.feature b/course/format/tests/behat/section_page.feature index 4b87c8e5b5d42..12a3dc07ab82a 100644 --- a/course/format/tests/behat/section_page.feature +++ b/course/format/tests/behat/section_page.feature @@ -90,3 +90,13 @@ Feature: Single section course page Given I turn editing mode on When I click on "View" "link" in the "Section 1" "section" Then "Add section" "link" should not exist in the "region-main" "region" + + @javascript + Scenario: Change the section name inline + # The course index is hidden by default in small devices. + Given I change window size to "large" + And I turn editing mode on + And I open section "1" edit menu + And I click on "View" "link" in the "Section 1" "section" + When I set the field "Edit section name" in the "page-header" "region" to "Custom section name" + Then "Custom section name" "text" should exist in the ".breadcrumb" "css_element" From 19af72f6cacb0623b62c9e947d8e1d2b6f53fbe2 Mon Sep 17 00:00:00 2001 From: ferranrecio Date: Tue, 19 Mar 2024 17:27:03 +0100 Subject: [PATCH 22/51] MDL-81289 core_courseformat: fix get_format_string params --- course/format/classes/base.php | 7 +++---- course/format/upgrade.txt | 1 + 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/course/format/classes/base.php b/course/format/classes/base.php index 833c29305a6c1..6f3b9d970f333 100644 --- a/course/format/classes/base.php +++ b/course/format/classes/base.php @@ -972,16 +972,15 @@ public function get_editor_custom_strings(): array { * core_courseformat will be user as the component. * * @param string $key the string key - * @param string|object|array $data extra data that can be used within translation strings - * @param string|null $lang moodle translation language, null means use current + * @param string|object|array|int $data extra data that can be used within translation strings * @return string the get_string result */ - public function get_format_string(string $key, $data = null, $lang = null): string { + public function get_format_string(string $key, $data = null): string { $component = 'format_' . $this->get_format(); if (!get_string_manager()->string_exists($key, $component)) { $component = 'core_courseformat'; } - return get_string($key, $component, $data, $lang); + return get_string($key, $component, $data); } /** diff --git a/course/format/upgrade.txt b/course/format/upgrade.txt index b7c63e1510842..a5c1b1971ce11 100644 --- a/course/format/upgrade.txt +++ b/course/format/upgrade.txt @@ -54,6 +54,7 @@ value when all the sections must be displayed (instead of 0). That way, section plugins can now include the string 'plugin_description' to provide a description of the course format. * A new item, initsections, has been added to the testing_data_generator::create_course() function, to let the generator rename the sections to "Section X". +* The core_courseformat\base::get_format_string last parameter has been removed because it was erroneous. === 4.3 === * New core_courseformat\output\activitybadge class that can be extended by any module to display content near the activity name. From 0cf88daffd272a4896c33c6e1c0a900a3dc106da Mon Sep 17 00:00:00 2001 From: Amaia Anabitarte Date: Tue, 19 Mar 2024 22:10:52 +0100 Subject: [PATCH 23/51] MDL-81276 mod_scorm: Fix minimum score validation --- mod/scorm/mod_form.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mod/scorm/mod_form.php b/mod/scorm/mod_form.php index 036544ff057c8..83336afb2df93 100644 --- a/mod/scorm/mod_form.php +++ b/mod/scorm/mod_form.php @@ -472,7 +472,10 @@ public function validation($data, $files) { // Validate 'Require minimum score' value. $completionscorerequiredel = 'completionscorerequired' . $this->get_suffix(); - if (array_key_exists($completionscorerequiredel, $data) && + $completionscoreenabledel = 'completionscoreenabled' . $this->get_suffix(); + if (array_key_exists($completionscoreenabledel, $data) && + $data[$completionscoreenabledel] && + array_key_exists($completionscorerequiredel, $data) && strlen($data[$completionscorerequiredel]) && $data[$completionscorerequiredel] <= 0 ) { From 1248fa7537a570c26ac05f30535b6bf9eb62f419 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikel=20Mart=C3=ADn?= Date: Wed, 20 Mar 2024 11:33:33 +0100 Subject: [PATCH 24/51] MDL-81294 core: Fix sticky footer height In MDL-81184 a regression was generated by changing the height property with min-height in the sticky footer. That caused unexpended behaviour of the sticky footer being partially displayed in the course page for small devices. Replacing min-height with height as the original design. --- theme/boost/scss/moodle/sticky-footer.scss | 2 +- theme/boost/style/moodle.css | 2 +- theme/classic/style/moodle.css | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/theme/boost/scss/moodle/sticky-footer.scss b/theme/boost/scss/moodle/sticky-footer.scss index 8c78f113aa056..8e10985bde4d1 100644 --- a/theme/boost/scss/moodle/sticky-footer.scss +++ b/theme/boost/scss/moodle/sticky-footer.scss @@ -11,7 +11,7 @@ body { position: fixed; right: 0; left: 0; - min-height: $stickyfooter-height; + height: $stickyfooter-height; bottom: calc(#{$stickyfooter-height} * -1); transition: bottom .5s; z-index: $zindex-fixed; diff --git a/theme/boost/style/moodle.css b/theme/boost/style/moodle.css index b7ee36ca08574..ea3388d4b080f 100644 --- a/theme/boost/style/moodle.css +++ b/theme/boost/style/moodle.css @@ -36112,7 +36112,7 @@ body { position: fixed; right: 0; left: 0; - min-height: max(80px, 0.9375rem * 3); + height: max(80px, 0.9375rem * 3); bottom: calc(max(80px, 0.9375rem * 3) * -1); transition: bottom 0.5s; z-index: 1030; diff --git a/theme/classic/style/moodle.css b/theme/classic/style/moodle.css index 20cd8dfe65df6..c89781391a1c0 100644 --- a/theme/classic/style/moodle.css +++ b/theme/classic/style/moodle.css @@ -36046,7 +36046,7 @@ body { position: fixed; right: 0; left: 0; - min-height: max(80px, 0.9375rem * 3); + height: max(80px, 0.9375rem * 3); bottom: calc(max(80px, 0.9375rem * 3) * -1); transition: bottom 0.5s; z-index: 1030; From 5e5f06ba682d98388798bc386c80d3bafb05bd66 Mon Sep 17 00:00:00 2001 From: Sara Arjona Date: Mon, 26 Feb 2024 11:24:01 +0100 Subject: [PATCH 25/51] MDL-80923 course: Replace custom element with placeholder In the section settings page, replace the custom checkbox element used for renaming with a standard input text field featuring a placeholder. This adjustment aims to enhance user experience by simplifying the interaction and aligning with modern design standards. --- course/editsection_form.php | 22 +++++++++++-------- .../tests/behat/edit_delete_sections.feature | 14 +++++------- .../tests/behat/edit_delete_sections.feature | 14 +++++------- .../behat/course_collapse_sections.feature | 3 +-- .../behat/frontpage_topic_section.feature | 3 +-- course/tests/behat/sectionzero_title.feature | 3 +-- 6 files changed, 28 insertions(+), 31 deletions(-) diff --git a/course/editsection_form.php b/course/editsection_form.php index 4575dc1e9604f..2e4f5babafd0b 100644 --- a/course/editsection_form.php +++ b/course/editsection_form.php @@ -25,12 +25,19 @@ function definition() { $mform->addElement('header', 'generalhdr', get_string('general')); - $mform->addElement('defaultcustom', 'name', get_string('sectionname'), [ - 'defaultvalue' => $this->_customdata['defaultsectionname'], - 'customvalue' => $sectioninfo->name, - ], ['size' => 30, 'maxlength' => 255]); - $mform->setDefault('name', false); - $mform->addGroupRule('name', array('name' => array(array(get_string('maximumchars', '', 255), 'maxlength', 255)))); + $mform->addElement( + 'text', + 'name', + get_string('sectionname'), + [ + 'placeholder' => $this->_customdata['defaultsectionname'], + 'size' => 30, + 'maxlength' => 255, + ], + ); + $mform->setType('name', PARAM_RAW); + $mform->setDefault('name', $sectioninfo->name); + $mform->addRule('name', get_string('maximumchars', '', 255), 'maxlength', 255, 'client'); /// Prepare course and the editor @@ -98,9 +105,6 @@ function set_data($default_values) { $editoroptions = $this->_customdata['editoroptions']; $default_values = file_prepare_standard_editor($default_values, 'summary', $editoroptions, $editoroptions['context'], 'course', 'section', $default_values->id); - if (strval($default_values->name) === '') { - $default_values->name = false; - } parent::set_data($default_values); } diff --git a/course/format/topics/tests/behat/edit_delete_sections.feature b/course/format/topics/tests/behat/edit_delete_sections.feature index 5c5e0edd5bfc9..2626dba42348f 100644 --- a/course/format/topics/tests/behat/edit_delete_sections.feature +++ b/course/format/topics/tests/behat/edit_delete_sections.feature @@ -27,22 +27,21 @@ Feature: Sections can be edited and deleted in custom sections format Scenario: View the default name of the general section in custom sections format Given I am on "Course 1" course homepage with editing mode on When I edit the section "0" - Then the field "Custom" matches value "0" - And the field "New value for Section name" matches value "General" + Then the field "Section name" matches value "" + And I should see "General" Scenario: Edit the default name of the general section in custom sections format Given I am on "Course 1" course homepage with editing mode on And I should see "General" in the "General" "section" When I edit the section "0" and I fill the form with: - | Custom | 1 | - | New value for Section name | This is the general section | + | Section name | This is the general section | Then I should see "This is the general section" in the "page" "region" Scenario: View the default name of the second section in custom sections format Given I am on "Course 2" course homepage with editing mode on When I edit the section "1" - Then the field "Custom" matches value "0" - And the field "New value for Section name" matches value "New section" + Then the field "Section name" matches value "" + And I should see "New section" Scenario: Edit section summary in custom sections format Given I am on "Course 1" course homepage with editing mode on @@ -53,8 +52,7 @@ Feature: Sections can be edited and deleted in custom sections format Scenario: Edit section default name in custom sections format Given I am on "Course 1" course homepage with editing mode on When I edit the section "2" and I fill the form with: - | Custom | 1 | - | New value for Section name | This is the second section | + | Section name | This is the second section | Then I should see "This is the second section" in the "page" "region" And I should not see "Section 2" in the "region-main" "region" diff --git a/course/format/weeks/tests/behat/edit_delete_sections.feature b/course/format/weeks/tests/behat/edit_delete_sections.feature index da7ae8868a17c..96061da9948e2 100644 --- a/course/format/weeks/tests/behat/edit_delete_sections.feature +++ b/course/format/weeks/tests/behat/edit_delete_sections.feature @@ -25,19 +25,18 @@ Feature: Sections can be edited and deleted in weekly sections format Scenario: View the default name of the general section in weeks format When I edit the section "0" - Then the field "Custom" matches value "0" - And the field "New value for Section name" matches value "General" + Then the field "Section name" matches value "" + And I should see "General" Scenario: Edit the default name of the general section in weeks format When I edit the section "0" and I fill the form with: - | Custom | 1 | - | New value for Section name | This is the general section | + | Section name | This is the general section | Then I should see "This is the general section" in the "page" "region" Scenario: View the default name of the second section in weeks format When I edit the section "2" - Then the field "Custom" matches value "0" - And the field "New value for Section name" matches value "8 May - 14 May" + Then the field "Section name" matches value "" + And I should see "8 May - 14 May" Scenario: Edit section summary in weeks format When I edit the section "2" and I fill the form with: @@ -47,8 +46,7 @@ Feature: Sections can be edited and deleted in weekly sections format Scenario: Edit section default name in weeks format Given I should see "8 May - 14 May" in the "8 May - 14 May" "section" When I edit the section "2" and I fill the form with: - | Custom | 1 | - | New value for Section name | This is the second week | + | Section name | This is the second week | Then I should see "This is the second week" in the "page" "region" And I should not see "8 May - 14 May" diff --git a/course/tests/behat/course_collapse_sections.feature b/course/tests/behat/course_collapse_sections.feature index d2515fac967fe..3bc4f824605bd 100644 --- a/course/tests/behat/course_collapse_sections.feature +++ b/course/tests/behat/course_collapse_sections.feature @@ -64,8 +64,7 @@ Feature: Collapse course sections And I am on site homepage And I turn editing mode on And I click on "Edit" "link" in the "region-main" "region" - And I click on "Custom" "checkbox" - And I set the field "New value for Section name" to "New section name" + And I set the field "Section name" to "New section name" When I press "Save changes" Then "[data-toggle=collapse]" "css_element" should not exist in the "region-main" "region" diff --git a/course/tests/behat/frontpage_topic_section.feature b/course/tests/behat/frontpage_topic_section.feature index 2b1f7cfa8138a..646bb1d1c8fd2 100644 --- a/course/tests/behat/frontpage_topic_section.feature +++ b/course/tests/behat/frontpage_topic_section.feature @@ -25,8 +25,7 @@ Feature: Site home activities section And I am on site homepage And I turn editing mode on And I click on "Edit" "link" in the "region-main" "region" - And I click on "Custom" "checkbox" - And I set the field "New value for Section name" to "New section name" + And I set the field "Section name" to "New section name" When I press "Save changes" And I should see "New section name" in the "region-main" "region" Then I turn editing mode off diff --git a/course/tests/behat/sectionzero_title.feature b/course/tests/behat/sectionzero_title.feature index 11935e8384650..fdbc7313043f1 100644 --- a/course/tests/behat/sectionzero_title.feature +++ b/course/tests/behat/sectionzero_title.feature @@ -36,7 +36,6 @@ Feature: Section 0 default/custom title And "New name for section" "field" should not exist And I set the field "Edit section name" in the "li#section-0" "css_element" to "Edited section 0" And I should see "Edited section 0" in the "page" "region" - And I edit the section "0" and I fill the form with: - | Custom | 0 | + And I set the field "Edit section name" in the "li#section-0" "css_element" to "" And I should not see "Edited section 0" in the "page" "region" And I should see "General" in the "page" "region" From 788556f652e8efe28e46c1c2275e636c06aeaae0 Mon Sep 17 00:00:00 2001 From: Mark Johnson Date: Tue, 5 Dec 2023 11:29:24 +0000 Subject: [PATCH 26/51] MDL-80099 hooks: Add mechanism to deprecate class callbacks --- lib/classes/hook/manager.php | 37 ++- lib/moodlelib.php | 37 ++- lib/phpunit/classes/util.php | 3 + .../hooktest/classes/callbacks.php | 44 ++++ .../classes/hook/hook_replacing_callback.php | 53 ++++ .../hook/hook_replacing_class_callback.php | 33 +++ .../hooktest/classes/hook_callbacks.php | 44 ++++ .../fakeplugins/hooktest/classes/hooks.php | 41 ++++ .../fakeplugins/hooktest/db/hooks.php | 37 +++ .../hooktest/db/hooks_nocallbacks.php | 27 +++ .../fixtures/fakeplugins/hooktest/lib.php | 41 ++++ .../fixtures/fakeplugins/hooktest/version.php | 30 +++ lib/tests/hook/manager_test.php | 226 +++++++++++++++++- lib/upgrade.txt | 5 + 14 files changed, 649 insertions(+), 9 deletions(-) create mode 100644 lib/tests/fixtures/fakeplugins/hooktest/classes/callbacks.php create mode 100644 lib/tests/fixtures/fakeplugins/hooktest/classes/hook/hook_replacing_callback.php create mode 100644 lib/tests/fixtures/fakeplugins/hooktest/classes/hook/hook_replacing_class_callback.php create mode 100644 lib/tests/fixtures/fakeplugins/hooktest/classes/hook_callbacks.php create mode 100644 lib/tests/fixtures/fakeplugins/hooktest/classes/hooks.php create mode 100644 lib/tests/fixtures/fakeplugins/hooktest/db/hooks.php create mode 100644 lib/tests/fixtures/fakeplugins/hooktest/db/hooks_nocallbacks.php create mode 100644 lib/tests/fixtures/fakeplugins/hooktest/lib.php create mode 100644 lib/tests/fixtures/fakeplugins/hooktest/version.php diff --git a/lib/classes/hook/manager.php b/lib/classes/hook/manager.php index 68475fa670733..259a7a27539c4 100644 --- a/lib/classes/hook/manager.php +++ b/lib/classes/hook/manager.php @@ -82,17 +82,34 @@ public static function get_instance(): manager { * Factory method for testing of hook manager in PHPUnit tests. * * @param array $componentfiles list of hook callback files for each component. + * @param bool $persist If true, the test instance will be stored in self::$instance. Be sure to call $this->resetAfterTest() + * in your test if you use this. * @return self */ - public static function phpunit_get_instance(array $componentfiles): manager { + public static function phpunit_get_instance(array $componentfiles, bool $persist = false): manager { if (!PHPUNIT_TEST) { throw new \coding_exception('Invalid call of manager::phpunit_get_instance() outside of tests'); } $instance = new self(); $instance->load_callbacks($componentfiles); + if ($persist) { + self::$instance = $instance; + } return $instance; } + /** + * Reset self::$instance so that future calls to ::get_instance() will return a regular instance. + * + * @return void + */ + public static function phpunit_reset_instance(): void { + if (!PHPUNIT_TEST) { + throw new \coding_exception('Invalid call of manager::phpunit_reset_instance() outside of tests'); + } + self::$instance = null; + } + /** * Override hook callbacks for testing purposes. * @@ -576,9 +593,25 @@ private function normalise_callback(string $component, array $callback): ?string * * @param string $plugincallback short callback name without the component prefix * @return bool + * @deprecated in favour of get_hooks_deprecating_plugin_callback since Moodle 4.4. + * @todo Remove in Moodle 4.8 (MDL-80327). */ public function is_deprecated_plugin_callback(string $plugincallback): bool { - return isset($this->alldeprecations[$plugincallback]); + debugging( + 'is_deprecated_plugin_callback method is deprecated, use get_hooks_deprecating_plugin_callback instead.', + DEBUG_DEVELOPER + ); + return (bool)$this->get_hooks_deprecating_plugin_callback($plugincallback); + } + + /** + * If the plugin callback from lib.php is deprecated by any hooks, return the hooks' classnames. + * + * @param string $plugincallback short callback name without the component prefix + * @return ?array + */ + public function get_hooks_deprecating_plugin_callback(string $plugincallback): ?array { + return $this->alldeprecations[$plugincallback] ?? null; } /** diff --git a/lib/moodlelib.php b/lib/moodlelib.php index 79053882ceda3..13391af3a395b 100644 --- a/lib/moodlelib.php +++ b/lib/moodlelib.php @@ -7453,13 +7453,17 @@ function get_plugins_with_function($function, $file = 'lib.php', $include = true foreach ($pluginfunctions as $plugintype => $plugins) { foreach ($plugins as $plugin => $unusedfunction) { $component = $plugintype . '_' . $plugin; - if (\core\hook\manager::get_instance()->is_deprecated_plugin_callback($plugincallback)) { + if ($hooks = \core\hook\manager::get_instance()->get_hooks_deprecating_plugin_callback($plugincallback)) { if (\core\hook\manager::get_instance()->is_deprecating_hook_present($component, $plugincallback)) { // Ignore the old callback, it is there only for older Moodle versions. unset($pluginfunctions[$plugintype][$plugin]); } else { - debugging("Callback $plugincallback in $component component should be migrated to new hook callback", - DEBUG_DEVELOPER); + $hookmessage = count($hooks) == 1 ? reset($hooks) : 'one of ' . implode(', ', $hooks); + debugging( + "Callback $plugincallback in $component component should be migrated to new " . + "hook callback for $hookmessage", + DEBUG_DEVELOPER + ); } } } @@ -7688,13 +7692,15 @@ function component_callback($component, $function, array $params = array(), $def if ($functionname) { if ($migratedtohook) { - if (\core\hook\manager::get_instance()->is_deprecated_plugin_callback($function)) { + if ($hooks = \core\hook\manager::get_instance()->get_hooks_deprecating_plugin_callback($function)) { if (\core\hook\manager::get_instance()->is_deprecating_hook_present($component, $function)) { // Do not call the old lib.php callback, // it is there for compatibility with older Moodle versions only. return null; } else { - debugging("Callback $function in $component component should be migrated to new hook callback", + $hookmessage = count($hooks) == 1 ? reset($hooks) : 'one of ' . implode(', ', $hooks); + debugging( + "Callback $function in $component component should be migrated to new hook callback for $hookmessage", DEBUG_DEVELOPER); } } @@ -7769,9 +7775,10 @@ function component_callback_exists($component, $function) { * @param string $methodname The name of the staticically defined method on the class. * @param array $params The arguments to pass into the method. * @param mixed $default The default value. + * @param bool $migratedtohook True if the callback has been migrated to a hook. * @return mixed The return value. */ -function component_class_callback($classname, $methodname, array $params, $default = null) { +function component_class_callback($classname, $methodname, array $params, $default = null, bool $migratedtohook = false) { if (!class_exists($classname)) { return $default; } @@ -7781,6 +7788,24 @@ function component_class_callback($classname, $methodname, array $params, $defau } $fullfunction = $classname . '::' . $methodname; + + if ($migratedtohook) { + $functionparts = explode('\\', trim($fullfunction, '\\')); + $component = $functionparts[0]; + $callback = end($functionparts); + if ($hooks = \core\hook\manager::get_instance()->get_hooks_deprecating_plugin_callback($callback)) { + if (\core\hook\manager::get_instance()->is_deprecating_hook_present($component, $callback)) { + // Do not call the old class callback, + // it is there for compatibility with older Moodle versions only. + return null; + } else { + $hookmessage = count($hooks) == 1 ? reset($hooks) : 'one of ' . implode(', ', $hooks); + debugging("Callback $callback in $component component should be migrated to new hook callback for $hookmessage", + DEBUG_DEVELOPER); + } + } + } + $result = call_user_func_array($fullfunction, $params); if (null === $result) { diff --git a/lib/phpunit/classes/util.php b/lib/phpunit/classes/util.php index 86e8fa47cbe27..1d2b5fd216eee 100644 --- a/lib/phpunit/classes/util.php +++ b/lib/phpunit/classes/util.php @@ -107,6 +107,9 @@ public static function reset_all_data($detectchanges = false) { // Stop all hook redirections. \core\hook\manager::get_instance()->phpunit_stop_redirections(); + // Reset the hook manager instance. + \core\hook\manager::phpunit_reset_instance(); + // Stop any message redirection. self::stop_message_redirection(); diff --git a/lib/tests/fixtures/fakeplugins/hooktest/classes/callbacks.php b/lib/tests/fixtures/fakeplugins/hooktest/classes/callbacks.php new file mode 100644 index 0000000000000..c0ac0d22cbcf2 --- /dev/null +++ b/lib/tests/fixtures/fakeplugins/hooktest/classes/callbacks.php @@ -0,0 +1,44 @@ +. +namespace fake_hooktest; + +/** + * Class callback container for fake_hooktest + * + * @package core + * @copyright 2024 onwards Catalyst IT EU {@link https://catalyst-eu.net} + * @author Mark Johnson + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class callbacks { + /** + * Test callback that is not replaced by a hook. + * + * @return string + */ + public static function current_class_callback(): string { + return 'Called current class callback'; + } + + /** + * Test callback that is replaced by a hook. + * + * @return string + */ + public static function old_class_callback(): string { + return 'Called deprecated class callback'; + } +} diff --git a/lib/tests/fixtures/fakeplugins/hooktest/classes/hook/hook_replacing_callback.php b/lib/tests/fixtures/fakeplugins/hooktest/classes/hook/hook_replacing_callback.php new file mode 100644 index 0000000000000..921b8670af5e0 --- /dev/null +++ b/lib/tests/fixtures/fakeplugins/hooktest/classes/hook/hook_replacing_callback.php @@ -0,0 +1,53 @@ +. + +namespace fake_hooktest\hook; + +/** + * Fixture for testing of hooks. + * + * @package core + * @author Mark Johnson + * @copyright 2024 Catalyst IT Europe Ltd. + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +final class hook_replacing_callback implements + \core\hook\described_hook, + \core\hook\deprecated_callback_replacement { + + /** + * Hook description. + */ + public static function get_hook_description(): string { + return 'Test hook replacing a plugin callback function.'; + } + + /** + * Deprecation info. + */ + public static function get_deprecated_plugin_callbacks(): array { + return ['old_callback']; + } + + /** + * List of tags that describe this hook. + * + * @return string[] + */ + public static function get_hook_tags(): array { + return ['test']; + } +} diff --git a/lib/tests/fixtures/fakeplugins/hooktest/classes/hook/hook_replacing_class_callback.php b/lib/tests/fixtures/fakeplugins/hooktest/classes/hook/hook_replacing_class_callback.php new file mode 100644 index 0000000000000..7c96aaebd201d --- /dev/null +++ b/lib/tests/fixtures/fakeplugins/hooktest/classes/hook/hook_replacing_class_callback.php @@ -0,0 +1,33 @@ +. + +namespace fake_hooktest\hook; + +use core\attribute; + +/** + * Fixture for testing of hooks. + * + * @package core + * @author Mark Johnson + * @copyright 2024 Catalyst IT Europe Ltd. + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +#[attribute\label('Test hook replacing a class callback.')] +#[attribute\tags('test')] +#[attribute\hook\replaces_callbacks('callbacks::old_class_callback')] +final class hook_replacing_class_callback { +} diff --git a/lib/tests/fixtures/fakeplugins/hooktest/classes/hook_callbacks.php b/lib/tests/fixtures/fakeplugins/hooktest/classes/hook_callbacks.php new file mode 100644 index 0000000000000..c3991214f08c8 --- /dev/null +++ b/lib/tests/fixtures/fakeplugins/hooktest/classes/hook_callbacks.php @@ -0,0 +1,44 @@ +. +namespace fake_hooktest; + +/** + * Hook callbacks + * + * @package core + * @copyright 2024 onwards Catalyst IT EU {@link https://catalyst-eu.net} + * @author Mark Johnson + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class hook_callbacks { + /** + * Test callback which replaces a plugin callback. + * + * @return string + */ + public function component_callback_replacement(): string { + return 'Called component callback replacement'; + } + + /** + * Test callback which replaced a plugin class callback. + * + * @return string + */ + public function component_class_callback_replacement(): string { + return 'Called component class callback replacement'; + } +} diff --git a/lib/tests/fixtures/fakeplugins/hooktest/classes/hooks.php b/lib/tests/fixtures/fakeplugins/hooktest/classes/hooks.php new file mode 100644 index 0000000000000..0e3c6c21fc45c --- /dev/null +++ b/lib/tests/fixtures/fakeplugins/hooktest/classes/hooks.php @@ -0,0 +1,41 @@ +. +namespace fake_hooktest; + +/** + * Hook discovery for fake plugin. + * + * @package core + * @copyright 2024 onwards Catalyst IT EU {@link https://catalyst-eu.net} + * @author Mark Johnson + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class hooks implements \core\hook\discovery_agent { + public static function discover_hooks(): array { + return [ + 'fake_hooktest\hook\hook_replacing_callback' => [ + 'class' => 'fake_hooktest\hook\hook_replacing_callback', + 'description' => 'Hook replacing callback', + 'tags' => ['test'], + ], + 'fake_hooktest\hook\hook_replacing_class_callback' => [ + 'class' => 'fake_hooktest\hook\hook_replacing_class_callback', + 'description' => 'Hook replacing class callback', + 'tags' => ['test'], + ], + ]; + } +} diff --git a/lib/tests/fixtures/fakeplugins/hooktest/db/hooks.php b/lib/tests/fixtures/fakeplugins/hooktest/db/hooks.php new file mode 100644 index 0000000000000..c2d71c8ddbd78 --- /dev/null +++ b/lib/tests/fixtures/fakeplugins/hooktest/db/hooks.php @@ -0,0 +1,37 @@ +. +/** + * Hook callback definitions for core + * + * @package core + * @copyright 2024 onwards Catalyst IT EU {@link https://catalyst-eu.net} + * @author Mark Johnson + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +defined('MOODLE_INTERNAL') || die(); + +$callbacks = [ + [ + 'hook' => 'fake_hooktest\hook\hook_replacing_callback', + 'callback' => 'fake_hooktest\hook_callbacks::component_callback_replacement', + 'priority' => 500, + ], + [ + 'hook' => 'fake_hooktest\hook\hook_replacing_class_callback', + 'callback' => 'fake_hooktest\hook_callbacks::component_class_callback_replacement', + 'priority' => 600, + ], +]; diff --git a/lib/tests/fixtures/fakeplugins/hooktest/db/hooks_nocallbacks.php b/lib/tests/fixtures/fakeplugins/hooktest/db/hooks_nocallbacks.php new file mode 100644 index 0000000000000..12c4b0cb9921c --- /dev/null +++ b/lib/tests/fixtures/fakeplugins/hooktest/db/hooks_nocallbacks.php @@ -0,0 +1,27 @@ +. +/** + * Hook callback definitions for core + * + * @package core + * @copyright 2024 onwards Catalyst IT EU {@link https://catalyst-eu.net} + * @author Mark Johnson + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +defined('MOODLE_INTERNAL') || die(); + +$callbacks = [ +]; diff --git a/lib/tests/fixtures/fakeplugins/hooktest/lib.php b/lib/tests/fixtures/fakeplugins/hooktest/lib.php new file mode 100644 index 0000000000000..c9f4e12e9526e --- /dev/null +++ b/lib/tests/fixtures/fakeplugins/hooktest/lib.php @@ -0,0 +1,41 @@ +. +/** + * Library functions for fake_hooktest + * + * @package core + * @copyright 2024 onwards Catalyst IT EU {@link https://catalyst-eu.net} + * @author Mark Johnson + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +/** + * Test callback that is not replaced by a hook. + * + * @return string + */ +function fake_hooktest_current_callback() { + return 'Called current callback'; +} + +/** + * Test callback that is replaced by a hook. + * + * @return string + */ +function fake_hooktest_old_callback() { + return 'Called deprecated callback'; +} diff --git a/lib/tests/fixtures/fakeplugins/hooktest/version.php b/lib/tests/fixtures/fakeplugins/hooktest/version.php new file mode 100644 index 0000000000000..dac28c28f6eb4 --- /dev/null +++ b/lib/tests/fixtures/fakeplugins/hooktest/version.php @@ -0,0 +1,30 @@ +. + +/** + * Fake plugin for testing hooks. + * + * @package core + * @copyright 2024 onwards Catalyst IT EU {@link https://catalyst-eu.net} + * @author Mark Johnson + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +$plugin->version = 2024012200; +$plugin->requires = 2024011900; +$plugin->component = 'fake_hooktest'; diff --git a/lib/tests/hook/manager_test.php b/lib/tests/hook/manager_test.php index 77a3f55033bca..076a8a2abccb6 100644 --- a/lib/tests/hook/manager_test.php +++ b/lib/tests/hook/manager_test.php @@ -49,8 +49,27 @@ public function test_phpunit_get_instance(): void { $componentfiles = [ 'test_plugin1' => __DIR__ . '/../fixtures/hook/hooks1_valid.php', ]; - $testmanager = manager::phpunit_get_instance($componentfiles); + $testmanager = manager::phpunit_get_instance($componentfiles, true); $this->assertSame(['test_plugin\\hook\\hook'], $testmanager->get_hooks_with_callbacks()); + // With $persist = true, get_instance() returns the test instance until reset. + $manager = manager::get_instance(); + $this->assertSame($testmanager, $manager); + } + + /** + * Test resetting the manager test instance. + * + * @covers ::phpunit_reset_instance + * @return void + */ + public function test_phpunit_reset_instance(): void { + $testmanager = manager::phpunit_get_instance([], true); + $manager = manager::get_instance(); + $this->assertSame($testmanager, $manager); + + manager::phpunit_reset_instance(); + $manager = manager::get_instance(); + $this->assertNotSame($testmanager, $manager); } /** @@ -295,6 +314,211 @@ public function test_callback_overriding(): void { $this->assertSame(['test1'], \test_plugin\callbacks::$calls); \test_plugin\callbacks::$calls = []; $this->assertDebuggingNotCalled(); + $CFG->hooks_callback_overrides = []; + } + + /** + * Register a fake plugin called hooktest in the component manager. + * + * @return void + */ + protected function setup_hooktest_plugin(): void { + global $CFG; + + $mockedcomponent = new \ReflectionClass(\core_component::class); + $mockedplugintypes = $mockedcomponent->getProperty('plugintypes'); + $mockedplugintypes->setAccessible(true); + $plugintypes = $mockedplugintypes->getValue(); + $plugintypes['fake'] = "{$CFG->dirroot}/lib/tests/fixtures/fakeplugins"; + $mockedplugintypes->setValue(null, $plugintypes); + $mockedplugins = $mockedcomponent->getProperty('plugins'); + $mockedplugins->setAccessible(true); + $plugins = $mockedplugins->getValue(); + $plugins['fake'] = ['hooktest' => "{$CFG->dirroot}/lib/tests/fixtures/fakeplugins/hooktest"]; + $mockedplugins->setValue(null, $plugins); + $this->resetDebugging(); + } + + /** + * Remove the fake plugin to avoid interference with other tests. + * + * @return void + */ + protected function remove_hooktest_plugin(): void { + $mockedcomponent = new \ReflectionClass(\core_component::class); + $mockedplugintypes = $mockedcomponent->getProperty('plugintypes'); + $mockedplugintypes->setAccessible(true); + $plugintypes = $mockedplugintypes->getValue(); + unset($plugintypes['fake']); + $mockedplugintypes->setValue(null, $plugintypes); + $mockedplugins = $mockedcomponent->getProperty('plugins'); + $mockedplugins->setAccessible(true); + $plugins = $mockedplugins->getValue(); + unset($plugins['fake']); + $mockedplugins->setValue(null, $plugins); + } + + /** + * Call a plugin callback that has been replaced by a hook, but has no hook callback. + * + * The original callback should be called, but a debugging message should be output. + * + * @covers ::get_hooks_deprecating_plugin_callback() + * @covers ::is_deprecating_hook_present() + * @return void + * @throws \coding_exception + */ + public function test_migrated_callback(): void { + $this->resetAfterTest(true); + // Include plugin hook discovery agent, and the hook that replaces the callback. + require_once(__DIR__ . '/../fixtures/fakeplugins/hooktest/classes/hooks.php'); + require_once(__DIR__ . '/../fixtures/fakeplugins/hooktest/classes/hook/hook_replacing_callback.php'); + // Register the fake plugin with the component manager. + $this->setup_hooktest_plugin(); + + // Register the fake plugin with the hook manager, but don't define any hook callbacks. + manager::phpunit_get_instance( + [ + 'fake_hooktest' => __DIR__ . '/../fixtures/fakeplugins/hooktest/db/hooks_nocallbacks.php', + ], + true + ); + + // Confirm a non-deprecated callback is called as expected. + $this->assertEquals('Called current callback', component_callback('fake_hooktest', 'current_callback')); + + // Confirm the deprecated callback is called as expected. + $this->assertEquals( + 'Called deprecated callback', + component_callback('fake_hooktest', 'old_callback', [], null, true) + ); + $this->assertDebuggingCalled( + 'Callback old_callback in fake_hooktest component should be migrated to new hook '. + 'callback for fake_hooktest\hook\hook_replacing_callback' + ); + $this->remove_hooktest_plugin(); + } + + /** + * Call a plugin callback that has been replaced by a hook, and has a hook callback. + * + * The original callback should not be called, and no debugging should be output. + * + * @covers ::get_hooks_deprecating_plugin_callback() + * @covers ::is_deprecating_hook_present() + * @return void + * @throws \coding_exception + */ + public function test_migrated_callback_with_replacement(): void { + $this->resetAfterTest(true); + // Include plugin hook discovery agent, and the hook that replaces the callback, and a hook callback for the hook. + require_once(__DIR__ . '/../fixtures/fakeplugins/hooktest/classes/hooks.php'); + require_once(__DIR__ . '/../fixtures/fakeplugins/hooktest/classes/hook/hook_replacing_callback.php'); + require_once(__DIR__ . '/../fixtures/fakeplugins/hooktest/classes/hook_callbacks.php'); + // Register the fake plugin with the component manager. + $this->setup_hooktest_plugin(); + + // Register the fake plugin with the hook manager, including the hook callback. + manager::phpunit_get_instance( + [ + 'fake_hooktest' => __DIR__ . '/../fixtures/fakeplugins/hooktest/db/hooks.php', + ], + true + ); + + // Confirm a non-deprecated callback is called as expected. + $this->assertEquals('Called current callback', component_callback('fake_hooktest', 'current_callback')); + + // Confirm the deprecated callback is not called, as expected. + $this->assertNull(component_callback('fake_hooktest', 'old_callback', [], null, true)); + $this->assertDebuggingNotCalled(); + $this->remove_hooktest_plugin(); + } + + /** + * Call a plugin class callback that has been replaced by a hook, but has no hook callback. + * + * The original class callback should be called, but a debugging message should be output. + * + * @covers ::get_hooks_deprecating_plugin_callback() + * @covers ::is_deprecating_hook_present() + * @return void + * @throws \coding_exception + */ + public function test_migrated_class_callback(): void { + $this->resetAfterTest(true); + // Include plugin hook discovery agent, the class containing callbacks, and the hook that replaces the class callback. + require_once(__DIR__ . '/../fixtures/fakeplugins/hooktest/classes/callbacks.php'); + require_once(__DIR__ . '/../fixtures/fakeplugins/hooktest/classes/hooks.php'); + require_once(__DIR__ . '/../fixtures/fakeplugins/hooktest/classes/hook/hook_replacing_class_callback.php'); + // Register the fake plugin with the component manager. + $this->setup_hooktest_plugin(); + + // Register the fake plugin with the hook manager, but don't define any hook callbacks. + manager::phpunit_get_instance( + [ + 'fake_hooktest' => __DIR__ . '/../fixtures/fakeplugins/hooktest/db/hooks_nocallbacks.php', + ], + true + ); + + // Confirm a non-deprecated class callback is called as expected. + $this->assertEquals( + 'Called current class callback', + component_class_callback('fake_hooktest\callbacks', 'current_class_callback', []) + ); + + // Confirm the deprecated class callback is called as expected. + $this->assertEquals( + 'Called deprecated class callback', + component_class_callback('fake_hooktest\callbacks', 'old_class_callback', [], null, true) + ); + $this->assertDebuggingCalled( + 'Callback callbacks::old_class_callback in fake_hooktest component should be migrated to new hook '. + 'callback for fake_hooktest\hook\hook_replacing_class_callback' + ); + $this->remove_hooktest_plugin(); + } + + /** + * Call a plugin class callback that has been replaced by a hook, and has a hook callback. + * + * The original callback should not be called, and no debugging should be output. + * + * @covers ::get_hooks_deprecating_plugin_callback() + * @covers ::is_deprecating_hook_present() + * @return void + * @throws \coding_exception + */ + public function test_migrated_class_callback_with_replacement(): void { + $this->resetAfterTest(true); + // Include plugin hook discovery agent, the class containing callbacks, the hook that replaces the class callback, + // and a hook callback for the new hook. + require_once(__DIR__ . '/../fixtures/fakeplugins/hooktest/classes/callbacks.php'); + require_once(__DIR__ . '/../fixtures/fakeplugins/hooktest/classes/hooks.php'); + require_once(__DIR__ . '/../fixtures/fakeplugins/hooktest/classes/hook/hook_replacing_class_callback.php'); + require_once(__DIR__ . '/../fixtures/fakeplugins/hooktest/classes/hook_callbacks.php'); + // Register the fake plugin with the component manager. + $this->setup_hooktest_plugin(); + + // Register the fake plugin with the hook manager, including the hook callback. + manager::phpunit_get_instance( + [ + 'fake_hooktest' => __DIR__ . '/../fixtures/fakeplugins/hooktest/db/hooks.php', + ], + true + ); + + // Confirm a non-deprecated class callback is called as expected. + $this->assertEquals( + 'Called current class callback', + component_class_callback('fake_hooktest\callbacks', 'current_class_callback', []) + ); + + // Confirm the deprecated class callback is not called, as expected. + $this->assertNull(component_class_callback('fake_hooktest\callbacks', 'old_class_callback', [], null, true)); + $this->assertDebuggingNotCalled(); + $this->remove_hooktest_plugin(); } /** diff --git a/lib/upgrade.txt b/lib/upgrade.txt index 748413408eaf5..9bbefc1fb9a99 100644 --- a/lib/upgrade.txt +++ b/lib/upgrade.txt @@ -91,6 +91,11 @@ information provided here is intended especially for developers. - `question_category_options` - `question_add_context_in_key` - `question_fix_top_names` +* Deprecated core\hook\manager::is_deprecated_plugin_callback() in favour of ::get_hooks_deprecating_plugin_callback(), + which will return the classnames of hooks deprecating a callback, or null if it's not deprecated. The return value can be cast + to bool if the original functionality is desired. +* core\hook\manager::phpunit_get_instance() now sets self::$instance to the mocked instance if the optional $persist argument is + true, so future calls to ::get_instance() will return it. === 4.3 === From 9a2f82a709af7d4591807f356390e3067970a4ed Mon Sep 17 00:00:00 2001 From: Mark Johnson Date: Tue, 5 Dec 2023 12:00:12 +0000 Subject: [PATCH 27/51] MDL-80099 quiz: Replace quiz_structure_modified callback with hook This adds a new structure_modified hook to mod_quiz, deprecating the quiz_stucture_modified class callback used in recompute_quiz_sumgrades(). The callback will be removed in Moodle 4.8. The quiz_statsitics plugin which used this callback now defines a hook callback instead. --- mod/quiz/classes/grade_calculator.php | 7 ++- mod/quiz/classes/hook/structure_modified.php | 51 +++++++++++++++++++ ...ucture_modified.php => hook_callbacks.php} | 19 +++---- mod/quiz/report/statistics/db/hooks.php | 32 ++++++++++++ 4 files changed, 97 insertions(+), 12 deletions(-) create mode 100644 mod/quiz/classes/hook/structure_modified.php rename mod/quiz/report/statistics/classes/{quiz_structure_modified.php => hook_callbacks.php} (75%) create mode 100644 mod/quiz/report/statistics/db/hooks.php diff --git a/mod/quiz/classes/grade_calculator.php b/mod/quiz/classes/grade_calculator.php index f0d74f7735a0f..122088297af93 100644 --- a/mod/quiz/classes/grade_calculator.php +++ b/mod/quiz/classes/grade_calculator.php @@ -18,6 +18,7 @@ use coding_exception; use mod_quiz\event\quiz_grade_updated; +use mod_quiz\hook\structure_modified; use question_engine_data_mapper; use stdClass; @@ -92,10 +93,14 @@ public function recompute_quiz_sumgrades(): void { self::update_quiz_maximum_grade(0); } + // This class callback is deprecated, and will be removed in Moodle 4.8 (MDL-80327). + // Use the structure_modified hook instead. $callbackclasses = \core_component::get_plugin_list_with_class('quiz', 'quiz_structure_modified'); foreach ($callbackclasses as $callbackclass) { - component_class_callback($callbackclass, 'callback', [$quiz->id]); + component_class_callback($callbackclass, 'callback', [$quiz->id], null, true); } + + \core\hook\manager::get_instance()->dispatch(new structure_modified($this->quizobj->get_structure())); } /** diff --git a/mod/quiz/classes/hook/structure_modified.php b/mod/quiz/classes/hook/structure_modified.php new file mode 100644 index 0000000000000..e39bbf0c349b9 --- /dev/null +++ b/mod/quiz/classes/hook/structure_modified.php @@ -0,0 +1,51 @@ +. +namespace mod_quiz\hook; + +use core\attribute; +use mod_quiz\structure; + +/** + * The quiz structure has been modified + * + * @package mod_quiz + * @copyright 2023 onwards Catalyst IT EU {@link https://catalyst-eu.net} + * @author Mark Johnson + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +#[attribute\label('The quiz structure has been modified')] +#[attribute\tags('quiz', 'structure')] +#[attribute\hook\replaces_callbacks('quiz_structure_modified::callback')] +class structure_modified { + /** + * Create a new hook with the modified structure. + * + * @param structure $structure The new structure. + */ + public function __construct( + protected structure $structure + ) { + } + + /** + * Returns the new structure of the quiz. + * + * @return structure The structure object. + */ + public function get_structure(): structure { + return $this->structure; + } +} diff --git a/mod/quiz/report/statistics/classes/quiz_structure_modified.php b/mod/quiz/report/statistics/classes/hook_callbacks.php similarity index 75% rename from mod/quiz/report/statistics/classes/quiz_structure_modified.php rename to mod/quiz/report/statistics/classes/hook_callbacks.php index 1cd8b52e8c928..e843343a08597 100644 --- a/mod/quiz/report/statistics/classes/quiz_structure_modified.php +++ b/mod/quiz/report/statistics/classes/hook_callbacks.php @@ -13,34 +13,31 @@ // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . - namespace quiz_statistics; use core\dml\sql_join; +use mod_quiz\hook\structure_modified; /** - * Clear the statistics cache when the quiz structure is modified. + * Hook callbacks * * @package quiz_statistics * @copyright 2023 onwards Catalyst IT EU {@link https://catalyst-eu.net} * @author Mark Johnson * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -class quiz_structure_modified { +class hook_callbacks { /** - * Clear the statistics cache. + * Clear the statistics cache for the quiz where the structure was modified. * - * @param int $quizid The quiz to clear the cache for. + * @param structure_modified $hook The structure_modified hook containing the new structure. * @return void */ - public static function callback(int $quizid): void { - global $DB, $CFG; + public static function quiz_structure_modified(structure_modified $hook) { + global $CFG; require_once($CFG->dirroot . '/mod/quiz/report/statistics/statisticslib.php'); require_once($CFG->dirroot . '/mod/quiz/report/statistics/report.php'); - $quiz = $DB->get_record('quiz', ['id' => $quizid]); - if (!$quiz) { - throw new \coding_exception('Could not find quiz with ID ' . $quizid . '.'); - } + $quiz = $hook->get_structure()->get_quiz(); $qubaids = quiz_statistics_qubaids_condition( $quiz->id, new sql_join(), diff --git a/mod/quiz/report/statistics/db/hooks.php b/mod/quiz/report/statistics/db/hooks.php new file mode 100644 index 0000000000000..f89e4cd9aab24 --- /dev/null +++ b/mod/quiz/report/statistics/db/hooks.php @@ -0,0 +1,32 @@ +. +/** + * Hook callback definitions for quiz_statistics + * + * @package quiz_statistics + * @copyright 2023 onwards Catalyst IT EU {@link https://catalyst-eu.net} + * @author Mark Johnson + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +defined('MOODLE_INTERNAL') || die(); + +$callbacks = [ + [ + 'hook' => mod_quiz\hook\structure_modified::class, + 'callback' => quiz_statistics\hook_callbacks::class . '::quiz_structure_modified', + 'priority' => 500, + ], +]; From ee952d65563eb8163ddea568c333e3d4f5353320 Mon Sep 17 00:00:00 2001 From: Mark Johnson Date: Tue, 5 Dec 2023 15:54:28 +0000 Subject: [PATCH 28/51] MDL-80099 quiz: Add attempt_state_changed hook This creates a new hook which is dispatched when a quiz attempt is set to a new state, or deleted. This is then used by quiz_statistics to trigger a recalulation, replacing the old event observer (for submissions) and class callback (for deletions). --- .../classes/hook/attempt_state_changed.php | 71 +++++++++++++++++++ mod/quiz/classes/quiz_attempt.php | 11 +++ mod/quiz/locallib.php | 9 ++- .../event/observer/attempt_submitted.php | 6 ++ .../statistics/classes/hook_callbacks.php | 19 +++++ .../classes/quiz_attempt_deleted.php | 5 ++ mod/quiz/report/statistics/db/events.php | 33 --------- mod/quiz/report/statistics/db/hooks.php | 5 ++ .../tests/quiz_attempt_deleted_test.php | 2 +- ...st.php => quiz_attempt_submitted_test.php} | 7 +- mod/quiz/report/statistics/version.php | 2 +- 11 files changed, 130 insertions(+), 40 deletions(-) create mode 100644 mod/quiz/classes/hook/attempt_state_changed.php delete mode 100644 mod/quiz/report/statistics/db/events.php rename mod/quiz/report/statistics/tests/{event/observer/attempt_submitted_test.php => quiz_attempt_submitted_test.php} (96%) diff --git a/mod/quiz/classes/hook/attempt_state_changed.php b/mod/quiz/classes/hook/attempt_state_changed.php new file mode 100644 index 0000000000000..0a97413645c75 --- /dev/null +++ b/mod/quiz/classes/hook/attempt_state_changed.php @@ -0,0 +1,71 @@ +. +namespace mod_quiz\hook; + +use core\attribute; + +/** + * A quiz attempt changed state. + * + * @package mod_quiz + * @copyright 2023 onwards Catalyst IT EU {@link https://catalyst-eu.net} + * @author Mark Johnson + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +#[attribute\label('A quiz attempt changed state.')] +#[attribute\tags('quiz', 'attempt')] +#[attribute\hook\replaces_callbacks('quiz_attempt_deleted::callback')] +class attempt_state_changed { + /** + * Create a new hook instance. + * + * @param ?\stdClass $originalattempt The original database record for the attempt, null if it has just been created. + * @param ?\stdClass $updatedattempt The updated database record of the new attempt, null if it has just been deleted. + */ + public function __construct( + protected ?\stdClass $originalattempt, + protected ?\stdClass $updatedattempt, + ) { + if (is_null($this->originalattempt) && is_null($this->updatedattempt)) { + throw new \InvalidArgumentException('originalattempt and updatedattempt cannot both be null.'); + } + if ( + !is_null($this->originalattempt) + && !is_null($this->updatedattempt) + && $this->originalattempt->id != $this->updatedattempt->id + ) { + throw new \InvalidArgumentException('originalattempt and updatedattempt must have the same id.'); + } + } + + /** + * Get the original attempt, null if it has just been created. + * + * @return ?\stdClass + */ + public function get_original_attempt(): ?\stdClass { + return $this->originalattempt; + } + + /** + * Get the updated attempt, null if it has just been deleted. + * + * @return ?\stdClass + */ + public function get_updated_attempt(): ?\stdClass { + return $this->updatedattempt; + } +} diff --git a/mod/quiz/classes/quiz_attempt.php b/mod/quiz/classes/quiz_attempt.php index 9354959d04d6b..08c40dac12db0 100644 --- a/mod/quiz/classes/quiz_attempt.php +++ b/mod/quiz/classes/quiz_attempt.php @@ -23,6 +23,7 @@ use context_module; use Exception; use html_writer; +use mod_quiz\hook\attempt_state_changed; use mod_quiz\output\links_to_other_attempts; use mod_quiz\output\renderer; use mod_quiz\question\bank\qbank_helper; @@ -1763,6 +1764,8 @@ public function process_finish($timestamp, $processsubmitted, $timefinish = null question_engine::save_questions_usage_by_activity($this->quba); + $originalattempt = clone $this->attempt; + $this->attempt->timemodified = $timestamp; $this->attempt->timefinish = $timefinish ?? $timestamp; $this->attempt->sumgrades = $this->quba->get_total_mark(); @@ -1784,6 +1787,7 @@ public function process_finish($timestamp, $processsubmitted, $timefinish = null // Trigger event. $this->fire_state_transition_event('\mod_quiz\event\attempt_submitted', $timestamp, $studentisonline); + \core\hook\manager::get_instance()->dispatch(new attempt_state_changed($originalattempt, $this->attempt)); // Tell any access rules that care that the attempt is over. $this->get_access_manager($timestamp)->current_attempt_finished(); } @@ -1820,6 +1824,7 @@ protected function recompute_final_grade(): void { public function process_going_overdue($timestamp, $studentisonline) { global $DB; + $originalattempt = clone $this->attempt; $transaction = $DB->start_delegated_transaction(); $this->attempt->timemodified = $timestamp; $this->attempt->state = self::OVERDUE; @@ -1830,6 +1835,7 @@ public function process_going_overdue($timestamp, $studentisonline) { $this->fire_state_transition_event('\mod_quiz\event\attempt_becameoverdue', $timestamp, $studentisonline); + \core\hook\manager::get_instance()->dispatch(new attempt_state_changed($originalattempt, $this->attempt)); $transaction->allow_commit(); quiz_send_overdue_message($this); @@ -1844,6 +1850,7 @@ public function process_going_overdue($timestamp, $studentisonline) { public function process_abandon($timestamp, $studentisonline) { global $DB; + $originalattempt = clone $this->attempt; $transaction = $DB->start_delegated_transaction(); $this->attempt->timemodified = $timestamp; $this->attempt->state = self::ABANDONED; @@ -1852,6 +1859,8 @@ public function process_abandon($timestamp, $studentisonline) { $this->fire_state_transition_event('\mod_quiz\event\attempt_abandoned', $timestamp, $studentisonline); + \core\hook\manager::get_instance()->dispatch(new attempt_state_changed($originalattempt, $this->attempt)); + $transaction->allow_commit(); } @@ -1872,6 +1881,7 @@ public function process_reopen_abandoned($timestamp) { throw new coding_exception('Can only reopen an attempt that was never submitted.'); } + $originalattempt = clone $this->attempt; $transaction = $DB->start_delegated_transaction(); $this->attempt->timemodified = $timestamp; $this->attempt->state = self::IN_PROGRESS; @@ -1880,6 +1890,7 @@ public function process_reopen_abandoned($timestamp) { $this->fire_state_transition_event('\mod_quiz\event\attempt_reopened', $timestamp, false); + \core\hook\manager::get_instance()->dispatch(new attempt_state_changed($originalattempt, $this->attempt)); $timeclose = $this->get_access_manager($timestamp)->get_end_time($this->attempt); if ($timeclose && $timestamp > $timeclose) { $this->process_finish($timestamp, false, $timeclose); diff --git a/mod/quiz/locallib.php b/mod/quiz/locallib.php index aa5167d68afeb..eb2b00b7c7186 100644 --- a/mod/quiz/locallib.php +++ b/mod/quiz/locallib.php @@ -39,6 +39,7 @@ use mod_quiz\access_manager; use mod_quiz\event\attempt_submitted; use mod_quiz\grade_calculator; +use mod_quiz\hook\attempt_state_changed; use mod_quiz\question\bank\qbank_helper; use mod_quiz\question\display_options; use mod_quiz\quiz_attempt; @@ -145,6 +146,8 @@ function quiz_create_attempt(quiz_settings $quizobj, $attemptnumber, $lastattemp $attempt->timecheckstate = $timeclose; } + \core\hook\manager::get_instance()->dispatch(new attempt_state_changed(null, $attempt)); + return $attempt; } /** @@ -448,10 +451,14 @@ function quiz_delete_attempt($attempt, $quiz) { $event->add_record_snapshot('quiz_attempts', $attempt); $event->trigger(); + // This class callback is deprecated, and will be removed in Moodle 4.8 (MDL-80327). + // Use the attempt_state_changed hook instead. $callbackclasses = \core_component::get_plugin_list_with_class('quiz', 'quiz_attempt_deleted'); foreach ($callbackclasses as $callbackclass) { - component_class_callback($callbackclass, 'callback', [$quiz->id]); + component_class_callback($callbackclass, 'callback', [$quiz->id], null, true); } + + \core\hook\manager::get_instance()->dispatch(new attempt_state_changed($attempt, null)); } // Search quiz_attempts for other instances by this user. diff --git a/mod/quiz/report/statistics/classes/event/observer/attempt_submitted.php b/mod/quiz/report/statistics/classes/event/observer/attempt_submitted.php index b83ff8a7ef9ac..8d058feb23c04 100644 --- a/mod/quiz/report/statistics/classes/event/observer/attempt_submitted.php +++ b/mod/quiz/report/statistics/classes/event/observer/attempt_submitted.php @@ -16,6 +16,7 @@ namespace quiz_statistics\event\observer; +use core\check\performance\debugging; use quiz_statistics\task\recalculate; /** @@ -25,6 +26,8 @@ * @copyright 2023 onwards Catalyst IT EU {@link https://catalyst-eu.net} * @author Mark Johnson * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @deprecated Since Moodle 4.4 MDL-80099. + * @todo Final deprecation in Moodle 4.8 MDL-80956. */ class attempt_submitted { /** @@ -35,8 +38,11 @@ class attempt_submitted { * * @param \mod_quiz\event\attempt_submitted $event * @return void + * @deprecated Since Moodle 4.4 MDL-80099 */ public static function process(\mod_quiz\event\attempt_submitted $event): void { + debugging('quiz_statistics\event\observer\attempt_submitted event observer has been deprecated in favour of ' . + 'the quiz_statistics\hook_callbacks::quiz_attempt_submitted_or_deleted hook callback.', DEBUG_DEVELOPER); $data = $event->get_data(); recalculate::queue_future_run($data['other']['quizid']); } diff --git a/mod/quiz/report/statistics/classes/hook_callbacks.php b/mod/quiz/report/statistics/classes/hook_callbacks.php index e843343a08597..da441d415f7ba 100644 --- a/mod/quiz/report/statistics/classes/hook_callbacks.php +++ b/mod/quiz/report/statistics/classes/hook_callbacks.php @@ -16,7 +16,10 @@ namespace quiz_statistics; use core\dml\sql_join; +use mod_quiz\hook\attempt_state_changed; use mod_quiz\hook\structure_modified; +use mod_quiz\quiz_attempt; +use quiz_statistics\task\recalculate; /** * Hook callbacks @@ -47,4 +50,20 @@ public static function quiz_structure_modified(structure_modified $hook) { $report = new \quiz_statistics_report(); $report->clear_cached_data($qubaids); } + + /** + * Queue a statistics recalculation when an attempt is submitted or deleting. + * + * @param attempt_state_changed $hook + * @return bool True if a task was queued. + */ + public static function quiz_attempt_submitted_or_deleted(attempt_state_changed $hook): bool { + $originalattempt = $hook->get_original_attempt(); + $updatedattempt = $hook->get_updated_attempt(); + if (is_null($updatedattempt) || $updatedattempt->state === quiz_attempt::FINISHED) { + // Only recalculate on deletion or submission. + return recalculate::queue_future_run($originalattempt->quiz); + } + return false; + } } diff --git a/mod/quiz/report/statistics/classes/quiz_attempt_deleted.php b/mod/quiz/report/statistics/classes/quiz_attempt_deleted.php index 8c6dccda6c7ef..011842e902544 100644 --- a/mod/quiz/report/statistics/classes/quiz_attempt_deleted.php +++ b/mod/quiz/report/statistics/classes/quiz_attempt_deleted.php @@ -25,6 +25,8 @@ * @copyright 2023 onwards Catalyst IT EU {@link https://catalyst-eu.net} * @author Mark Johnson * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @deprecated Since Moodle 4.4 MDL-80099. + * @todo Final deprecation in Moodle 4.8 MDL-80956. */ class quiz_attempt_deleted { /** @@ -32,8 +34,11 @@ class quiz_attempt_deleted { * * @param int $quizid The quiz the attempt belongs to. * @return void + * @deprecated Since Moodle 4.4 MDL-80099. */ public static function callback(int $quizid): void { + debugging('quiz_statistics\quiz_attempt_deleted callback class has been deprecated in favour of ' . + 'the quiz_statistics\hook_callbacks::quiz_attempt_submitted_or_deleted hook callback.', DEBUG_DEVELOPER); recalculate::queue_future_run($quizid); } } diff --git a/mod/quiz/report/statistics/db/events.php b/mod/quiz/report/statistics/db/events.php deleted file mode 100644 index 9028cdfb1cb7c..0000000000000 --- a/mod/quiz/report/statistics/db/events.php +++ /dev/null @@ -1,33 +0,0 @@ -. - -/** - * Add event observers for quiz_statistics - * - * @package quiz_statistics - * @copyright 2023 onwards Catalyst IT EU {@link https://catalyst-eu.net} - * @author Mark Johnson - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ - -defined('MOODLE_INTERNAL') || die(); - -$observers = [ - [ - 'eventname' => '\mod_quiz\event\attempt_submitted', - 'callback' => '\quiz_statistics\event\observer\attempt_submitted::process', - ], -]; diff --git a/mod/quiz/report/statistics/db/hooks.php b/mod/quiz/report/statistics/db/hooks.php index f89e4cd9aab24..dae66ed389bef 100644 --- a/mod/quiz/report/statistics/db/hooks.php +++ b/mod/quiz/report/statistics/db/hooks.php @@ -29,4 +29,9 @@ 'callback' => quiz_statistics\hook_callbacks::class . '::quiz_structure_modified', 'priority' => 500, ], + [ + 'hook' => mod_quiz\hook\attempt_state_changed::class, + 'callback' => quiz_statistics\hook_callbacks::class . '::quiz_attempt_submitted_or_deleted', + 'priority' => 500, + ], ]; diff --git a/mod/quiz/report/statistics/tests/quiz_attempt_deleted_test.php b/mod/quiz/report/statistics/tests/quiz_attempt_deleted_test.php index 6b1ca956e3ab5..47fa441db1cf3 100644 --- a/mod/quiz/report/statistics/tests/quiz_attempt_deleted_test.php +++ b/mod/quiz/report/statistics/tests/quiz_attempt_deleted_test.php @@ -32,7 +32,7 @@ * @copyright 2023 onwards Catalyst IT EU {@link https://catalyst-eu.net} * @author Mark Johnson * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - * @covers \quiz_statistics\quiz_attempt_deleted + * @covers \quiz_statistics\hook_callbacks::quiz_attempt_submitted_or_deleted */ class quiz_attempt_deleted_test extends \advanced_testcase { use \quiz_question_helper_test_trait; diff --git a/mod/quiz/report/statistics/tests/event/observer/attempt_submitted_test.php b/mod/quiz/report/statistics/tests/quiz_attempt_submitted_test.php similarity index 96% rename from mod/quiz/report/statistics/tests/event/observer/attempt_submitted_test.php rename to mod/quiz/report/statistics/tests/quiz_attempt_submitted_test.php index 796f5f08edf0b..8e8592c8529db 100644 --- a/mod/quiz/report/statistics/tests/event/observer/attempt_submitted_test.php +++ b/mod/quiz/report/statistics/tests/quiz_attempt_submitted_test.php @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . -namespace quiz_statistics\event\observer; +namespace quiz_statistics; defined('MOODLE_INTERNAL') || die(); @@ -32,13 +32,12 @@ * @copyright 2023 onwards Catalyst IT EU {@link https://catalyst-eu.net} * @author Mark Johnson * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - * @covers \quiz_statistics\event\observer\attempt_submitted + * @covers \quiz_statistics\hook_callbacks::quiz_attempt_submitted_or_deleted */ -class attempt_submitted_test extends \advanced_testcase { +class quiz_attempt_submitted_test extends \advanced_testcase { use \quiz_question_helper_test_trait; use statistics_test_trait; - /** * Attempting a quiz should queue the recalculation task for that quiz in 1 hour's time. * diff --git a/mod/quiz/report/statistics/version.php b/mod/quiz/report/statistics/version.php index 25a1f70a18df8..23228b92f769e 100644 --- a/mod/quiz/report/statistics/version.php +++ b/mod/quiz/report/statistics/version.php @@ -24,6 +24,6 @@ defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2023100900; +$plugin->version = 2023100901; $plugin->requires = 2023100400; $plugin->component = 'quiz_statistics'; From 9d3bbe6c02faf2c6137f602efb15d9309523ffaa Mon Sep 17 00:00:00 2001 From: Ferran Recio Date: Fri, 2 Feb 2024 10:26:47 +0100 Subject: [PATCH 29/51] MDL-80715 core_courseformat: new section update action --- .../format/classes/local/sectionactions.php | 92 +++++ .../tests/local/sectionactions_test.php | 321 ++++++++++++++++++ course/lib.php | 61 +--- course/tests/courselib_test.php | 22 +- 4 files changed, 434 insertions(+), 62 deletions(-) diff --git a/course/format/classes/local/sectionactions.php b/course/format/classes/local/sectionactions.php index 23ad84ef0038d..3a73bc03b156f 100644 --- a/course/format/classes/local/sectionactions.php +++ b/course/format/classes/local/sectionactions.php @@ -18,6 +18,7 @@ use section_info; use stdClass; +use core\event\course_module_updated; use core\event\course_section_deleted; /** @@ -336,4 +337,95 @@ protected function delete_async(section_info $sectioninfo, bool $forcedeleteifno $sectioninfo = $this->get_section_info($sectioninfo->id); return $this->delete_format_data($sectioninfo, $forcedeleteifnotempty, $event); } + + /** + * Update a course section. + * + * @param section_info $sectioninfo the section info or database record to update. + * @param array|stdClass $fields the fields to update. + * @return bool whether section was updated + */ + public function update(section_info $sectioninfo, array|stdClass $fields): bool { + global $DB; + + $courseid = $this->course->id; + + // Some fields can not be updated using this method. + $fields = array_diff_key((array) $fields, array_flip(['id', 'course', 'section', 'sequence'])); + if (array_key_exists('name', $fields) && \core_text::strlen($fields['name']) > 255) { + throw new \moodle_exception('maximumchars', 'moodle', '', 255); + } + + if (empty($fields)) { + return false; + } + + $fields['id'] = $sectioninfo->id; + $fields['timemodified'] = time(); + $DB->update_record('course_sections', $fields); + + // We need to update the section cache before the format options are updated. + \course_modinfo::purge_course_section_cache_by_id($courseid, $sectioninfo->id); + rebuild_course_cache($courseid, false, true); + + course_get_format($courseid)->update_section_format_options($fields); + + $event = \core\event\course_section_updated::create( + [ + 'objectid' => $sectioninfo->id, + 'courseid' => $courseid, + 'context' => \context_course::instance($courseid), + 'other' => ['sectionnum' => $sectioninfo->section], + ] + ); + $event->trigger(); + + if (isset($fields['visible'])) { + $this->transfer_visibility_to_cms($sectioninfo, (bool) $fields['visible']); + } + return true; + } + + /** + * Transfer the visibility of the section to the course modules. + * + * @param section_info $sectioninfo the section info or database record to update. + * @param bool $visibility the new visibility of the section. + */ + protected function transfer_visibility_to_cms(section_info $sectioninfo, bool $visibility): void { + global $DB; + + if (empty($sectioninfo->sequence) || $visibility == (bool) $sectioninfo->visible) { + return; + } + + $modules = explode(',', $sectioninfo->sequence); + $cmids = []; + foreach ($modules as $moduleid) { + $cm = get_coursemodule_from_id(null, $moduleid, $this->course->id); + if (!$cm) { + continue; + } + + $modupdated = false; + if ($visibility) { + // As we unhide the section, we use the previously saved visibility stored in visibleold. + $modupdated = set_coursemodule_visible($moduleid, $cm->visibleold, $cm->visibleoncoursepage, false); + } else { + // We hide the section, so we hide the module but we store the original state in visibleold. + $modupdated = set_coursemodule_visible($moduleid, 0, $cm->visibleoncoursepage, false); + if ($modupdated) { + $DB->set_field('course_modules', 'visibleold', $cm->visible, ['id' => $moduleid]); + } + } + + if ($modupdated) { + $cmids[] = $cm->id; + course_module_updated::create_from_cm($cm)->trigger(); + } + } + + \course_modinfo::purge_course_modules_cache($this->course->id, $cmids); + rebuild_course_cache($this->course->id, false, true); + } } diff --git a/course/format/tests/local/sectionactions_test.php b/course/format/tests/local/sectionactions_test.php index adac5fc0762b6..df61302767b76 100644 --- a/course/format/tests/local/sectionactions_test.php +++ b/course/format/tests/local/sectionactions_test.php @@ -541,4 +541,325 @@ public function test_async_section_deletion_hook_implemented(): void { } $this->assertEquals(3, $count); } + + /** + * Test section update method. + * + * @covers ::update + * @dataProvider update_provider + * @param string $fieldname the name of the field to update + * @param int|string $value the value to set + * @param int|string $expected the expected value after the update ('=' to specify the same value as original field) + * @param bool $expectexception if the method should throw an exception + */ + public function test_update( + string $fieldname, + int|string $value, + int|string $expected, + bool $expectexception + ): void { + global $DB; + $this->resetAfterTest(); + + $course = $this->getDataGenerator()->create_course( + ['format' => 'topics', 'numsections' => 1], + ['createsections' => true] + ); + $section = get_fast_modinfo($course)->get_section_info(1); + + $sectionrecord = $DB->get_record('course_sections', ['id' => $section->id]); + $this->assertNotEquals($value, $sectionrecord->$fieldname); + $this->assertNotEquals($value, $section->$fieldname); + + if ($expectexception) { + $this->expectException(\moodle_exception::class); + } + + if ($expected === '=') { + $expected = $section->$fieldname; + } + + $sectionactions = new sectionactions($course); + $sectionactions->update($section, [$fieldname => $value]); + + $sectionrecord = $DB->get_record('course_sections', ['id' => $section->id]); + $this->assertEquals($expected, $sectionrecord->$fieldname); + + $section = get_fast_modinfo($course)->get_section_info(1); + $this->assertEquals($expected, $section->$fieldname); + } + + /** + * Data provider for test_update. + * @return array + */ + public static function update_provider(): array { + return [ + 'Id will not be updated' => [ + 'fieldname' => 'id', + 'value' => -1, + 'expected' => '=', + 'expectexception' => false, + ], + 'Course will not be updated' => [ + 'fieldname' => 'course', + 'value' => -1, + 'expected' => '=', + 'expectexception' => false, + ], + 'Section number will not be updated' => [ + 'fieldname' => 'section', + 'value' => -1, + 'expected' => '=', + 'expectexception' => false, + ], + 'Sequence will be updated' => [ + 'fieldname' => 'name', + 'value' => 'new name', + 'expected' => 'new name', + 'expectexception' => false, + ], + 'Summary can be updated' => [ + 'fieldname' => 'summary', + 'value' => 'new summary', + 'expected' => 'new summary', + 'expectexception' => false, + ], + 'Visible can be updated' => [ + 'fieldname' => 'visible', + 'value' => 0, + 'expected' => 0, + 'expectexception' => false, + ], + 'component can be updated' => [ + 'fieldname' => 'component', + 'value' => 'mod_assign', + 'expected' => 'mod_assign', + 'expectexception' => false, + ], + 'itemid can be updated' => [ + 'fieldname' => 'itemid', + 'value' => 1, + 'expected' => 1, + 'expectexception' => false, + ], + 'Long names throws and exception' => [ + 'fieldname' => 'name', + 'value' => str_repeat('a', 256), + 'expected' => '=', + 'expectexception' => true, + ], + ]; + } + + /** + * Test section update method updating several values at once. + * + * @covers ::update + */ + public function test_update_multiple_fields(): void { + global $DB; + $this->resetAfterTest(); + + $course = $this->getDataGenerator()->create_course( + ['format' => 'topics', 'numsections' => 1], + ['createsections' => true] + ); + $section = get_fast_modinfo($course)->get_section_info(1); + + $sectionrecord = $DB->get_record('course_sections', ['id' => $section->id]); + $this->assertEquals(1, $sectionrecord->visible); + $this->assertNull($section->name); + + $sectionactions = new sectionactions($course); + $sectionactions->update($section, ['name' => 'New name', 'visible' => 0]); + + $sectionrecord = $DB->get_record('course_sections', ['id' => $section->id]); + $this->assertEquals('New name', $sectionrecord->name); + $this->assertEquals(0, $sectionrecord->visible); + + $section = get_fast_modinfo($course)->get_section_info(1); + $this->assertEquals('New name', $section->name); + $this->assertEquals(0, $section->visible); + } + + /** + * Test updating a section trigger a course section update log event. + * + * @covers ::update + */ + public function test_course_section_updated_event(): void { + $this->resetAfterTest(); + + $course = $this->getDataGenerator()->create_course( + ['format' => 'topics', 'numsections' => 1], + ['createsections' => true] + ); + $section = get_fast_modinfo($course)->get_section_info(1); + + $sink = $this->redirectEvents(); + + $sectionactions = new sectionactions($course); + $sectionactions->update($section, ['name' => 'New name', 'visible' => 0]); + + $events = $sink->get_events(); + $event = reset($events); + + // Check that the event data is valid. + $this->assertInstanceOf('\core\event\course_section_updated', $event); + $data = $event->get_data(); + $this->assertEquals(\context_course::instance($course->id), $event->get_context()); + $this->assertEquals($section->id, $data['objectid']); + } + + /** + * Test section update change the modified date. + * + * @covers ::update + */ + public function test_update_time_modified(): void { + global $DB; + $this->resetAfterTest(); + + // Create the course with sections. + $course = $this->getDataGenerator()->create_course( + ['format' => 'topics', 'numsections' => 1], + ['createsections' => true] + ); + $section = get_fast_modinfo($course)->get_section_info(1); + + $sectionrecord = $DB->get_record('course_sections', ['id' => $section->id]); + $oldtimemodified = $sectionrecord->timemodified; + + $sectionactions = new sectionactions($course); + + // Ensuring that the section update occurs at a different timestamp. + $this->waitForSecond(); + + // The timemodified should only be updated if the section is actually updated. + $result = $sectionactions->update($section, []); + $this->assertFalse($result); + $sectionrecord = $DB->get_record('course_sections', ['id' => $section->id]); + $this->assertEquals($oldtimemodified, $sectionrecord->timemodified); + + // Now update something to prove timemodified changes. + $result = $sectionactions->update($section, ['name' => 'New name']); + $this->assertTrue($result); + $sectionrecord = $DB->get_record('course_sections', ['id' => $section->id]); + $this->assertGreaterThan($oldtimemodified, $sectionrecord->timemodified); + } + + /** + * Test section updating visibility will hide or show section activities. + * + * @covers ::update + */ + public function test_update_hide_section_activities(): void { + global $DB; + $this->resetAfterTest(); + + // Create 4 activities (visible, visible, hidden, hidden). + $course = $this->getDataGenerator()->create_course( + ['format' => 'topics', 'numsections' => 1], + ['createsections' => true] + ); + $activity1 = $this->getDataGenerator()->create_module( + 'assign', + ['course' => $course->id, 'section' => 1] + ); + $activity2 = $this->getDataGenerator()->create_module( + 'assign', + ['course' => $course->id, 'section' => 1] + ); + $activity3 = $this->getDataGenerator()->create_module( + 'assign', + ['course' => $course->id, 'section' => 1, 'visible' => 0] + ); + $activity4 = $this->getDataGenerator()->create_module( + 'assign', + ['course' => $course->id, 'section' => 1, 'visible' => 0] + ); + + $modinfo = get_fast_modinfo($course); + $cm1 = $modinfo->get_cm($activity1->cmid); + $cm2 = $modinfo->get_cm($activity2->cmid); + $cm3 = $modinfo->get_cm($activity3->cmid); + $cm4 = $modinfo->get_cm($activity4->cmid); + $this->assertEquals(1, $cm1->visible); + $this->assertEquals(1, $cm2->visible); + $this->assertEquals(0, $cm3->visible); + $this->assertEquals(0, $cm4->visible); + + $sectionactions = new sectionactions($course); + + // Validate hidding section hides all activities. + $section = $modinfo->get_section_info(1); + $sectionactions->update($section, ['visible' => 0]); + + $modinfo = get_fast_modinfo($course); + $cm1 = $modinfo->get_cm($activity1->cmid); + $cm2 = $modinfo->get_cm($activity2->cmid); + $cm3 = $modinfo->get_cm($activity3->cmid); + $cm4 = $modinfo->get_cm($activity4->cmid); + $this->assertEquals(0, $cm1->visible); + $this->assertEquals(0, $cm2->visible); + $this->assertEquals(0, $cm3->visible); + $this->assertEquals(0, $cm4->visible); + + // Validate showing the section restores the previous visibility. + $section = $modinfo->get_section_info(1); + $sectionactions->update($section, ['visible' => 1]); + + $modinfo = get_fast_modinfo($course); + $cm1 = $modinfo->get_cm($activity1->cmid); + $cm2 = $modinfo->get_cm($activity2->cmid); + $cm3 = $modinfo->get_cm($activity3->cmid); + $cm4 = $modinfo->get_cm($activity4->cmid); + $this->assertEquals(1, $cm1->visible); + $this->assertEquals(1, $cm2->visible); + $this->assertEquals(0, $cm3->visible); + $this->assertEquals(0, $cm4->visible); + + // Swap two activities visibility to alter visible values. + set_coursemodule_visible($cm2->id, 0, 0, true); + set_coursemodule_visible($cm4->id, 1, 1, true); + + $modinfo = get_fast_modinfo($course); + $cm1 = $modinfo->get_cm($activity1->cmid); + $cm2 = $modinfo->get_cm($activity2->cmid); + $cm3 = $modinfo->get_cm($activity3->cmid); + $cm4 = $modinfo->get_cm($activity4->cmid); + $this->assertEquals(1, $cm1->visible); + $this->assertEquals(0, $cm2->visible); + $this->assertEquals(0, $cm3->visible); + $this->assertEquals(1, $cm4->visible); + + // Validate hidding the section again. + $section = $modinfo->get_section_info(1); + $sectionactions->update($section, ['visible' => 0]); + + $modinfo = get_fast_modinfo($course); + $cm1 = $modinfo->get_cm($activity1->cmid); + $cm2 = $modinfo->get_cm($activity2->cmid); + $cm3 = $modinfo->get_cm($activity3->cmid); + $cm4 = $modinfo->get_cm($activity4->cmid); + $this->assertEquals(0, $cm1->visible); + $this->assertEquals(0, $cm2->visible); + $this->assertEquals(0, $cm3->visible); + $this->assertEquals(0, $cm4->visible); + + // Validate showing the section once more to check previous state is restored. + $section = $modinfo->get_section_info(1); + $sectionactions->update($section, ['visible' => 1]); + + $modinfo = get_fast_modinfo($course); + $cm1 = $modinfo->get_cm($activity1->cmid); + $cm2 = $modinfo->get_cm($activity2->cmid); + $cm3 = $modinfo->get_cm($activity3->cmid); + $cm4 = $modinfo->get_cm($activity4->cmid); + $this->assertEquals(1, $cm1->visible); + $this->assertEquals(0, $cm2->visible); + $this->assertEquals(0, $cm3->visible); + $this->assertEquals(1, $cm4->visible); + } } diff --git a/course/lib.php b/course/lib.php index a809df14c61c8..b5f5d56b6cdee 100644 --- a/course/lib.php +++ b/course/lib.php @@ -1277,70 +1277,21 @@ function course_delete_section_async($section, $forcedeleteifnotempty = true) { * * This function does not check permissions or clean values - this has to be done prior to calling it. * - * @param int|stdClass $course + * @param int|stdClass $courseorid * @param stdClass $section record from course_sections table - it will be updated with the new values * @param array|stdClass $data */ -function course_update_section($course, $section, $data) { - global $DB; - - $courseid = (is_object($course)) ? $course->id : (int)$course; - - // Some fields can not be updated using this method. - $data = array_diff_key((array)$data, array('id', 'course', 'section', 'sequence')); - $changevisibility = (array_key_exists('visible', $data) && (bool)$data['visible'] != (bool)$section->visible); - if (array_key_exists('name', $data) && \core_text::strlen($data['name']) > 255) { - throw new moodle_exception('maximumchars', 'moodle', '', 255); - } - - // Update record in the DB and course format options. - $data['id'] = $section->id; - $data['timemodified'] = time(); - $DB->update_record('course_sections', $data); - // Invalidate the section cache by given section id. - course_modinfo::purge_course_section_cache_by_id($courseid, $section->id); - rebuild_course_cache($courseid, false, true); - course_get_format($courseid)->update_section_format_options($data); +function course_update_section($courseorid, $section, $data) { + $sectioninfo = get_fast_modinfo($courseorid)->get_section_info_by_id($section->id); + formatactions::section($courseorid)->update($sectioninfo, $data); - // Update fields of the $section object. + // Update $section object fields (for legacy compatibility). + $data = array_diff_key((array) $data, array_flip(['id', 'course', 'section', 'sequence'])); foreach ($data as $key => $value) { if (property_exists($section, $key)) { $section->$key = $value; } } - - // Trigger an event for course section update. - $event = \core\event\course_section_updated::create( - array( - 'objectid' => $section->id, - 'courseid' => $courseid, - 'context' => context_course::instance($courseid), - 'other' => array('sectionnum' => $section->section) - ) - ); - $event->trigger(); - - // If section visibility was changed, hide the modules in this section too. - if ($changevisibility && !empty($section->sequence)) { - $modules = explode(',', $section->sequence); - $cmids = []; - foreach ($modules as $moduleid) { - if ($cm = get_coursemodule_from_id(null, $moduleid, $courseid)) { - $cmids[] = $cm->id; - if ($data['visible']) { - // As we unhide the section, we use the previously saved visibility stored in visibleold. - set_coursemodule_visible($moduleid, $cm->visibleold, $cm->visibleoncoursepage, false); - } else { - // We hide the section, so we hide the module but we store the original state in visibleold. - set_coursemodule_visible($moduleid, 0, $cm->visibleoncoursepage, false); - $DB->set_field('course_modules', 'visibleold', $cm->visible, ['id' => $moduleid]); - } - \core\event\course_module_updated::create_from_cm($cm)->trigger(); - } - } - \course_modinfo::purge_course_modules_cache($courseid, $cmids); - rebuild_course_cache($courseid, false, true); - } } /** diff --git a/course/tests/courselib_test.php b/course/tests/courselib_test.php index 4dcc420907ae3..0fa63e9af942d 100644 --- a/course/tests/courselib_test.php +++ b/course/tests/courselib_test.php @@ -782,19 +782,27 @@ public function test_update_course_section_time_modified() { $this->resetAfterTest(); // Create the course with sections. - $course = $this->getDataGenerator()->create_course(array('numsections' => 10), array('createsections' => true)); - $sections = $DB->get_records('course_sections', array('course' => $course->id)); + $course = $this->getDataGenerator()->create_course( + ['numsections' => 10], + ['createsections' => true] + ); + $sections = $DB->get_records('course_sections', ['course' => $course->id]); // Get the last section's time modified value. $section = array_pop($sections); $oldtimemodified = $section->timemodified; - // Update the section. - $this->waitForSecond(); // Ensuring that the section update occurs at a different timestamp. - course_update_section($course, $section, array()); + // Ensuring that the section update occurs at a different timestamp. + $this->waitForSecond(); + + // The timemodified should only be updated if the section is actually updated. + course_update_section($course, $section, []); + $sectionrecord = $DB->get_record('course_sections', ['id' => $section->id]); + $this->assertEquals($oldtimemodified, $sectionrecord->timemodified); - // Check that the time has changed. - $section = $DB->get_record('course_sections', array('id' => $section->id)); + // Now update something to prove timemodified changes. + course_update_section($course, $section, ['name' => 'New name']); + $section = $DB->get_record('course_sections', ['id' => $section->id]); $newtimemodified = $section->timemodified; $this->assertGreaterThan($oldtimemodified, $newtimemodified); } From c74a5439f6403b69f394ad4bbba82bea3a58011a Mon Sep 17 00:00:00 2001 From: Ferran Recio Date: Fri, 2 Feb 2024 13:25:11 +0100 Subject: [PATCH 30/51] MDL-80715 core_courseformat: new cm rename action --- course/format/classes/local/cmactions.php | 58 +++++- course/format/tests/local/cmactions_test.php | 194 +++++++++++++++++++ course/lib.php | 44 +---- 3 files changed, 255 insertions(+), 41 deletions(-) create mode 100644 course/format/tests/local/cmactions_test.php diff --git a/course/format/classes/local/cmactions.php b/course/format/classes/local/cmactions.php index 3bfd71845e80a..c7f8f7636a7a2 100644 --- a/course/format/classes/local/cmactions.php +++ b/course/format/classes/local/cmactions.php @@ -16,6 +16,8 @@ namespace core_courseformat\local; + +use course_modinfo; /** * Course module course format actions. * @@ -24,5 +26,59 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class cmactions extends baseactions { - // All course module actions will go here. + /** + * Rename a course module. + * @param int $cmid the course module id. + * @param string $name the new name. + * @return bool true if the course module was renamed, false otherwise. + */ + public function rename(int $cmid, string $name): bool { + global $CFG, $DB; + require_once($CFG->libdir . '/gradelib.php'); + + $paramcleaning = empty($CFG->formatstringstriptags) ? PARAM_CLEANHTML : PARAM_TEXT; + $name = clean_param($name, $paramcleaning); + + if (empty($name)) { + return false; + } + if (\core_text::strlen($name) > 255) { + throw new \moodle_exception('maximumchars', 'moodle', '', 255); + } + + // The name is stored in the activity instance record. + // However, events, gradebook and calendar API uses a legacy + // course module data extraction from the DB instead of a section_info. + $cm = get_coursemodule_from_id('', $cmid, 0, false, MUST_EXIST); + + if ($name === $cm->name) { + return false; + } + + $DB->update_record( + $cm->modname, + (object)[ + 'id' => $cm->instance, + 'name' => $name, + 'timemodified' => time(), + ] + ); + $cm->name = $name; + + \core\event\course_module_updated::create_from_cm($cm)->trigger(); + + course_modinfo::purge_course_module_cache($cm->course, $cm->id); + rebuild_course_cache($cm->course, false, true); + + // Attempt to update the grade item if relevant. + $grademodule = $DB->get_record($cm->modname, ['id' => $cm->instance]); + $grademodule->cmidnumber = $cm->idnumber; + $grademodule->modname = $cm->modname; + grade_update_mod_grades($grademodule); + + // Update calendar events with the new name. + course_module_update_calendar_events($cm->modname, $grademodule, $cm); + + return true; + } } diff --git a/course/format/tests/local/cmactions_test.php b/course/format/tests/local/cmactions_test.php new file mode 100644 index 0000000000000..e6c2215decb53 --- /dev/null +++ b/course/format/tests/local/cmactions_test.php @@ -0,0 +1,194 @@ +. + +namespace core_courseformat\local; + +/** + * Course module format actions class tests. + * + * @package core_courseformat + * @copyright 2024 Ferran Recio + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @coversDefaultClass \core_courseformat\cmactions + */ +final class cmactions_test extends \advanced_testcase { + /** + * Setup to ensure that fixtures are loaded. + */ + public static function setUpBeforeClass(): void { + global $CFG; + require_once($CFG->dirroot . '/course/lib.php'); + } + + /** + * Test renaming a course module. + * + * @dataProvider provider_test_rename + * @covers ::rename + * @param string $newname The new name for the course module. + * @param bool $expected Whether the course module was renamed. + * @param bool $expectexception Whether an exception is expected. + */ + public function test_rename(string $newname, bool $expected, bool $expectexception): void { + global $DB; + $this->resetAfterTest(); + + $course = $this->getDataGenerator()->create_course(['format' => 'topics']); + $activity = $this->getDataGenerator()->create_module( + 'assign', + ['course' => $course->id, 'name' => 'Old name'] + ); + + $cmactions = new cmactions($course); + + if ($expectexception) { + $this->expectException(\moodle_exception::class); + } + $result = $cmactions->rename($activity->cmid, $newname); + $this->assertEquals($expected, $result); + + $cminfo = get_fast_modinfo($course)->get_cm($activity->cmid); + if ($result) { + $this->assertEquals('New name', $cminfo->name); + } else { + $this->assertEquals('Old name', $cminfo->name); + } + } + + /** + * Data provider for test_rename. + * + * @return array + */ + public static function provider_test_rename(): array { + return [ + 'Empty name' => [ + 'newname' => '', + 'expected' => false, + 'expectexception' => false, + ], + 'Maximum length' => [ + 'newname' => str_repeat('a', 256), + 'expected' => false, + 'expectexception' => true, + ], + 'Valid name' => [ + 'newname' => 'New name', + 'expected' => true, + 'expectexception' => false, + ], + ]; + } + + /** + * Test rename an activity also rename the calendar events. + * + * @covers ::rename + */ + public function test_rename_calendar_events(): void { + global $DB; + $this->resetAfterTest(); + + $this->setAdminUser(); + set_config('enablecompletion', 1); + + $course = $this->getDataGenerator()->create_course(['enablecompletion' => COMPLETION_ENABLED]); + $activity = $this->getDataGenerator()->create_module( + 'assign', + [ + 'name' => 'Old name', + 'course' => $course, + 'completionexpected' => time(), + 'duedate' => time(), + ] + ); + $cm = get_coursemodule_from_instance('assign', $activity->id, $course->id); + + // Validate course events naming. + $this->assertEquals(2, $DB->count_records('event')); + + $event = $DB->get_record( + 'event', + ['modulename' => 'assign', 'instance' => $activity->id, 'eventtype' => 'due'] + ); + $this->assertEquals( + get_string('calendardue', 'assign', 'Old name'), + $event->name + ); + + $event = $DB->get_record( + 'event', + ['modulename' => 'assign', 'instance' => $activity->id, 'eventtype' => 'expectcompletionon'] + ); + $this->assertEquals( + get_string('completionexpectedfor', 'completion', (object) ['instancename' => 'Old name']), + $event->name + ); + + // Rename activity. + $cmactions = new cmactions($course); + $result = $cmactions->rename($activity->cmid, 'New name'); + $this->assertTrue($result); + + // Validate event renaming. + $event = $DB->get_record( + 'event', + ['modulename' => 'assign', 'instance' => $activity->id, 'eventtype' => 'due'] + ); + $this->assertEquals( + get_string('calendardue', 'assign', 'New name'), + $event->name + ); + + $event = $DB->get_record( + 'event', + ['modulename' => 'assign', 'instance' => $activity->id, 'eventtype' => 'expectcompletionon'] + ); + $this->assertEquals( + get_string('completionexpectedfor', 'completion', (object) ['instancename' => 'New name']), + $event->name + ); + } + + /** + * Test renaming an activity trigger a course update log event. + * + * @covers ::rename + */ + public function test_rename_course_module_updated_event(): void { + global $DB; + $this->resetAfterTest(); + + $course = $this->getDataGenerator()->create_course(); + $activity = $this->getDataGenerator()->create_module( + 'assign', + ['course' => $course->id, 'name' => 'Old name'] + ); + + $sink = $this->redirectEvents(); + + $cmactions = new cmactions($course); + $result = $cmactions->rename($activity->cmid, 'New name'); + $this->assertTrue($result); + + $events = $sink->get_events(); + $event = reset($events); + + // Check that the event data is valid. + $this->assertInstanceOf('\core\event\course_module_updated', $event); + $this->assertEquals(\context_module::instance($activity->cmid), $event->get_context()); + } +} diff --git a/course/lib.php b/course/lib.php index b5f5d56b6cdee..40010f4f5f9f9 100644 --- a/course/lib.php +++ b/course/lib.php @@ -749,49 +749,13 @@ function set_coursemodule_visible($id, $visible, $visibleoncoursepage = 1, bool /** * Changes the course module name * - * @param int $id course module id + * @param int $cmid course module id * @param string $name new value for a name * @return bool whether a change was made */ -function set_coursemodule_name($id, $name) { - global $CFG, $DB; - require_once($CFG->libdir . '/gradelib.php'); - - $cm = get_coursemodule_from_id('', $id, 0, false, MUST_EXIST); - - $module = new \stdClass(); - $module->id = $cm->instance; - - // Escape strings as they would be by mform. - if (!empty($CFG->formatstringstriptags)) { - $module->name = clean_param($name, PARAM_TEXT); - } else { - $module->name = clean_param($name, PARAM_CLEANHTML); - } - if ($module->name === $cm->name || strval($module->name) === '') { - return false; - } - if (\core_text::strlen($module->name) > 255) { - throw new \moodle_exception('maximumchars', 'moodle', '', 255); - } - - $module->timemodified = time(); - $DB->update_record($cm->modname, $module); - $cm->name = $module->name; - \core\event\course_module_updated::create_from_cm($cm)->trigger(); - \course_modinfo::purge_course_module_cache($cm->course, $cm->id); - rebuild_course_cache($cm->course, false, true); - - // Attempt to update the grade item if relevant. - $grademodule = $DB->get_record($cm->modname, array('id' => $cm->instance)); - $grademodule->cmidnumber = $cm->idnumber; - $grademodule->modname = $cm->modname; - grade_update_mod_grades($grademodule); - - // Update calendar events with the new name. - course_module_update_calendar_events($cm->modname, $grademodule, $cm); - - return true; +function set_coursemodule_name($cmid, $name) { + $coursecontext = context_module::instance($cmid)->get_course_context(); + return formatactions::cm($coursecontext->instanceid)->rename($cmid, $name); } /** From fbbb86a2a6f05410f5dcf3d39869d8d56a2dc606 Mon Sep 17 00:00:00 2001 From: Ferran Recio Date: Tue, 6 Feb 2024 16:59:42 +0100 Subject: [PATCH 31/51] MDL-80715 core_courseformat: delegate section and cm rename --- course/editsection.php | 7 +- .../classes/hook/after_cm_name_edited.php | 77 +++++++++++++++++++ course/format/classes/local/cmactions.php | 5 ++ .../format/classes/local/sectionactions.php | 21 +++++ course/format/classes/sectiondelegate.php | 27 +++++++ course/format/classes/stateupdates.php | 6 ++ course/format/tests/local/cmactions_test.php | 30 ++++++++ .../tests/local/sectionactions_test.php | 39 ++++++++++ course/format/tests/stateupdates_test.php | 39 ++++++++++ course/modlib.php | 9 +++ lib/tests/fixtures/sectiondelegatetest.php | 26 +++++++ 11 files changed, 285 insertions(+), 1 deletion(-) create mode 100644 course/format/classes/hook/after_cm_name_edited.php diff --git a/course/editsection.php b/course/editsection.php index c379b08a775f0..9cae5dfad2add 100644 --- a/course/editsection.php +++ b/course/editsection.php @@ -104,7 +104,12 @@ ); $courseformat = course_get_format($course); -$defaultsectionname = $courseformat->get_default_section_name($section); + +if ($sectioninfo->is_delegated()) { + $defaultsectionname = $sectioninfo->name; +} else { + $defaultsectionname = $courseformat->get_default_section_name($section); +} $customdata = [ 'cs' => $sectioninfo, diff --git a/course/format/classes/hook/after_cm_name_edited.php b/course/format/classes/hook/after_cm_name_edited.php new file mode 100644 index 0000000000000..50330908392bc --- /dev/null +++ b/course/format/classes/hook/after_cm_name_edited.php @@ -0,0 +1,77 @@ +. + +namespace core_courseformat\hook; + +use core\hook\described_hook; +use cm_info; + +/** + * Hook for course-module name edited. + * + * @package core_courseformat + * @copyright 2024 Ferran Recio + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class after_cm_name_edited implements described_hook { + /** + * Constructor. + * + * @param cm_info $cm the course module + * @param string $newname the new name + */ + public function __construct( + protected cm_info $cm, + protected string $newname, + ) { + } + + + /** + * Describes the hook purpose. + * + * @return string + */ + public static function get_hook_description(): string { + return 'This hook is triggered when a course module name is edited.'; + } + + /** + * List of tags that describe this hook. + * + * @return string[] + */ + public static function get_hook_tags(): array { + return ['cm_name_edited']; + } + + /** + * Get course module instance. + * + * @return cm_info + */ + public function get_cm(): cm_info { + return $this->cm; + } + + /** + * Get new name. + * @return string + */ + public function get_newname(): string { + return $this->newname; + } +} diff --git a/course/format/classes/local/cmactions.php b/course/format/classes/local/cmactions.php index c7f8f7636a7a2..347b2a31a5ea6 100644 --- a/course/format/classes/local/cmactions.php +++ b/course/format/classes/local/cmactions.php @@ -70,6 +70,11 @@ public function rename(int $cmid, string $name): bool { course_modinfo::purge_course_module_cache($cm->course, $cm->id); rebuild_course_cache($cm->course, false, true); + // Modules may add some logic to renaming. + $modinfo = get_fast_modinfo($cm->course); + $hook = new \core_courseformat\hook\after_cm_name_edited($modinfo->get_cm($cm->id), $name); + \core\hook\manager::get_instance()->dispatch($hook); + // Attempt to update the grade item if relevant. $grademodule = $DB->get_record($cm->modname, ['id' => $cm->instance]); $grademodule->cmidnumber = $cm->idnumber; diff --git a/course/format/classes/local/sectionactions.php b/course/format/classes/local/sectionactions.php index 3a73bc03b156f..f0e5657a9e137 100644 --- a/course/format/classes/local/sectionactions.php +++ b/course/format/classes/local/sectionactions.php @@ -356,6 +356,9 @@ public function update(section_info $sectioninfo, array|stdClass $fields): bool throw new \moodle_exception('maximumchars', 'moodle', '', 255); } + // If the section is delegated to a component, it may control some section values. + $fields = $this->preprocess_delegated_section_fields($sectioninfo, $fields); + if (empty($fields)) { return false; } @@ -428,4 +431,22 @@ protected function transfer_visibility_to_cms(section_info $sectioninfo, bool $v \course_modinfo::purge_course_modules_cache($this->course->id, $cmids); rebuild_course_cache($this->course->id, false, true); } + + /** + * Preprocess the section fields before updating a delegated section. + * + * @param section_info $sectioninfo the section info or database record to update. + * @param array $fields the fields to update. + * @return array the updated fields + */ + protected function preprocess_delegated_section_fields(section_info $sectioninfo, array $fields): array { + $delegated = $sectioninfo->get_component_instance(); + if (!$delegated) { + return $fields; + } + if (array_key_exists('name', $fields)) { + $fields['name'] = $delegated->preprocess_section_name($sectioninfo, $fields['name']); + } + return $fields; + } } diff --git a/course/format/classes/sectiondelegate.php b/course/format/classes/sectiondelegate.php index 44faea6328df0..ef7772af38ec5 100644 --- a/course/format/classes/sectiondelegate.php +++ b/course/format/classes/sectiondelegate.php @@ -17,6 +17,7 @@ namespace core_courseformat; use section_info; +use core_courseformat\stateupdates; /** * Section delegate base class. @@ -77,4 +78,30 @@ protected static function get_delegate_class_name(string $pluginname): ?string { public static function has_delegate_class(string $pluginname): bool { return self::get_delegate_class_name($pluginname) !== null; } + + /** + * Define the section final name. + * + * This method can process the section name and return the validated new name. + * + * @param section_info $section + * @param string|null $newname the new name value to store in the database + * @return string|null the name value to store in the database + */ + public function preprocess_section_name(section_info $section, ?string $newname): ?string { + return $newname; + } + + /** + * Add extra state updates when put or create a section. + * + * This method is called every time the backend sends a delegated section + * state update to the UI. + * + * @param section_info $section the affected section. + * @param stateupdates $updates the state updates object to notify the UI. + */ + public function put_section_state_extra_updates(section_info $section, stateupdates $updates): void { + // By default, do nothing. + } } diff --git a/course/format/classes/stateupdates.php b/course/format/classes/stateupdates.php index eb2bfe2acb935..feed784ed5272 100644 --- a/course/format/classes/stateupdates.php +++ b/course/format/classes/stateupdates.php @@ -123,6 +123,12 @@ protected function create_or_put_section(int $sectionid, string $action): void { $currentstate = new $sectionclass($this->format, $section); $this->add_update('section', $action, $currentstate->export_for_template($this->output)); + + // If the section is delegated to a component, give the component oportunity to add updates. + $delegated = $section->get_component_instance(); + if ($delegated) { + $delegated->put_section_state_extra_updates($section, $this); + } } /** diff --git a/course/format/tests/local/cmactions_test.php b/course/format/tests/local/cmactions_test.php index e6c2215decb53..53057795240e3 100644 --- a/course/format/tests/local/cmactions_test.php +++ b/course/format/tests/local/cmactions_test.php @@ -16,6 +16,8 @@ namespace core_courseformat\local; +use core_courseformat\hook\after_cm_name_edited; + /** * Course module format actions class tests. * @@ -191,4 +193,32 @@ public function test_rename_course_module_updated_event(): void { $this->assertInstanceOf('\core\event\course_module_updated', $event); $this->assertEquals(\context_module::instance($activity->cmid), $event->get_context()); } + + /** + * Test renaming an activity triggers the after_cm_name_edited hook. + * @covers ::rename + */ + public function test_rename_after_cm_name_edited_hook(): void { + $this->resetAfterTest(); + + $course = $this->getDataGenerator()->create_course(); + $activity = $this->getDataGenerator()->create_module( + 'assign', + ['course' => $course->id, 'name' => 'Old name'] + ); + + $executedhook = null; + + $testcallback = function(after_cm_name_edited $hook) use (&$executedhook): void { + $executedhook = $hook; + }; + $this->redirectHook(after_cm_name_edited::class, $testcallback); + + $cmactions = new cmactions($course); + $result = $cmactions->rename($activity->cmid, 'New name'); + $this->assertTrue($result); + + $this->assertEquals($activity->cmid, $executedhook->get_cm()->id); + $this->assertEquals('New name', $executedhook->get_newname()); + } } diff --git a/course/format/tests/local/sectionactions_test.php b/course/format/tests/local/sectionactions_test.php index df61302767b76..5c6cee521438d 100644 --- a/course/format/tests/local/sectionactions_test.php +++ b/course/format/tests/local/sectionactions_test.php @@ -862,4 +862,43 @@ public function test_update_hide_section_activities(): void { $this->assertEquals(0, $cm3->visible); $this->assertEquals(1, $cm4->visible); } + + /** + * Test that the preprocess_section_name method can alter the section rename value. + * + * @covers ::update + * @covers ::preprocess_delegated_section_fields + */ + public function test_preprocess_section_name(): void { + global $DB, $CFG; + $this->resetAfterTest(); + + require_once($CFG->libdir . '/tests/fixtures/sectiondelegatetest.php'); + + $course = $this->getDataGenerator()->create_course(); + + $sectionactions = new sectionactions($course); + $section = $sectionactions->create_delegated('test_component', 1); + + $result = $sectionactions->update($section, ['name' => 'new_name']); + $this->assertTrue($result); + + $section = $DB->get_record('course_sections', ['id' => $section->id]); + $this->assertEquals('new_name_suffix', $section->name); + + $sectioninfo = get_fast_modinfo($course->id)->get_section_info_by_id($section->id); + $this->assertEquals('new_name_suffix', $sectioninfo->name); + + // Validate null name. + $section = $sectionactions->create_delegated('test_component', 1, (object)['name' => 'sample']); + + $result = $sectionactions->update($section, ['name' => null]); + $this->assertTrue($result); + + $section = $DB->get_record('course_sections', ['id' => $section->id]); + $this->assertEquals('null_name', $section->name); + + $sectioninfo = get_fast_modinfo($course->id)->get_section_info_by_id($section->id); + $this->assertEquals('null_name', $sectioninfo->name); + } } diff --git a/course/format/tests/stateupdates_test.php b/course/format/tests/stateupdates_test.php index 714d123fadba2..a5206b3ff7ce1 100644 --- a/course/format/tests/stateupdates_test.php +++ b/course/format/tests/stateupdates_test.php @@ -383,4 +383,43 @@ private function add_cm_provider_helper(string $action): array { ], ]; } + + /** + * Test components can add data to delegated section state updates. + * @covers ::add_section_put + */ + public function test_put_section_state_extra_updates(): void { + global $DB, $CFG; + $this->resetAfterTest(); + + require_once($CFG->libdir . '/tests/fixtures/sectiondelegatetest.php'); + + $course = $this->getDataGenerator()->create_course(); + $activity = $this->getDataGenerator()->create_module( + 'assign', + ['course' => $course->id] + ); + + // The test component section delegate will add the activity cm info into the state. + $section = formatactions::section($course)->create_delegated('test_component', $activity->cmid); + + $format = course_get_format($course); + $updates = new \core_courseformat\stateupdates($format); + + $updates->add_section_put($section->id); + + $data = $updates->jsonSerialize(); + + $this->assertCount(2, $data); + + $sectiondata = $data[0]; + $this->assertEquals('section', $sectiondata->name); + $this->assertEquals('put', $sectiondata->action); + $this->assertEquals($section->id, $sectiondata->fields->id); + + $cmdata = $data[1]; + $this->assertEquals('cm', $cmdata->name); + $this->assertEquals('put', $cmdata->action); + $this->assertEquals($activity->cmid, $cmdata->fields->id); + } } diff --git a/course/modlib.php b/course/modlib.php index 5ad339cbe1006..8b99058b60e35 100644 --- a/course/modlib.php +++ b/course/modlib.php @@ -723,6 +723,15 @@ function update_moduleinfo($cm, $moduleinfo, $course, $mform = null) { $cminfo = cm_info::create($cm); $completion->reset_all_state($cminfo); } + + if ($cm->name != $moduleinfo->name) { + $hook = new \core_courseformat\hook\after_cm_name_edited( + get_fast_modinfo($course)->get_cm($cm->id), + $moduleinfo->name + ); + \core\hook\manager::get_instance()->dispatch($hook); + } + $cm->name = $moduleinfo->name; \core\event\course_module_updated::create_from_cm($cm, $modcontext)->trigger(); diff --git a/lib/tests/fixtures/sectiondelegatetest.php b/lib/tests/fixtures/sectiondelegatetest.php index 0e9959ddf9d28..9d5f706633f48 100644 --- a/lib/tests/fixtures/sectiondelegatetest.php +++ b/lib/tests/fixtures/sectiondelegatetest.php @@ -17,6 +17,8 @@ namespace test_component\courseformat; use core_courseformat\sectiondelegate as sectiondelegatebase; +use core_courseformat\stateupdates; +use section_info; /** * Test class for section delegate. @@ -26,4 +28,28 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class sectiondelegate extends sectiondelegatebase { + /** + * Test method to fake preprocesses the section name by appending a suffix to it. + * + * @param section_info $section The section information. + * @param string|null $newname The new name for the section. + * @return string|null The preprocessed section name with the suffix appended. + */ + public function preprocess_section_name(section_info $section, ?string $newname): ?string { + if (empty($newname)) { + return 'null_name'; + } + return $newname . '_suffix'; + } + + /** + * Test method to add state updates of a section with additional information. + * + * @param section_info $section The section to update. + * @param stateupdates $updates The state updates to apply. + * @return void + */ + public function put_section_state_extra_updates(section_info $section, stateupdates $updates): void { + $updates->add_cm_put($section->itemid); + } } From 9d7ab10f290362e81f706e224ebef71cf9de9039 Mon Sep 17 00:00:00 2001 From: Sara Arjona Date: Thu, 7 Mar 2024 16:04:37 +0100 Subject: [PATCH 32/51] MDL-81163 course: Use component_callback for is_branded --- .../local/repository/content_item_readonly_repository.php | 6 ++---- course/externallib.php | 3 +-- course/format/classes/output/local/content/cm/cmicon.php | 4 ++-- theme/boost/classes/output/core_renderer.php | 3 +-- 4 files changed, 6 insertions(+), 10 deletions(-) diff --git a/course/classes/local/repository/content_item_readonly_repository.php b/course/classes/local/repository/content_item_readonly_repository.php index 59995ec21ffd9..573860164df92 100644 --- a/course/classes/local/repository/content_item_readonly_repository.php +++ b/course/classes/local/repository/content_item_readonly_repository.php @@ -132,8 +132,7 @@ public function find_all(): array { $help = $this->get_core_module_help_string($mod->name); $archetype = plugin_supports('mod', $mod->name, FEATURE_MOD_ARCHETYPE, MOD_ARCHETYPE_OTHER); $purpose = plugin_supports('mod', $mod->name, FEATURE_MOD_PURPOSE, MOD_PURPOSE_OTHER); - $isbrandedfunction = $mod->name.'_is_branded'; - $isbranded = function_exists($isbrandedfunction) ? $isbrandedfunction() : false; + $isbranded = component_callback('mod_' . $mod->name, 'is_branded', [], false); $contentitem = new content_item( $mod->id, @@ -197,8 +196,7 @@ public function find_all_for_course(\stdClass $course, \stdClass $user): array { $help = $this->get_core_module_help_string($mod->name); $archetype = plugin_supports('mod', $mod->name, FEATURE_MOD_ARCHETYPE, MOD_ARCHETYPE_OTHER); $purpose = plugin_supports('mod', $mod->name, FEATURE_MOD_PURPOSE, MOD_PURPOSE_OTHER); - $isbrandedfunction = $mod->name.'_is_branded'; - $isbranded = function_exists($isbrandedfunction) ? $isbrandedfunction() : false; + $isbranded = component_callback('mod_' . $mod->name, 'is_branded', [], false); $icon = 'monologo'; // Quick check for monologo icons. diff --git a/course/externallib.php b/course/externallib.php index 2021386db3b43..c815c52e7666f 100644 --- a/course/externallib.php +++ b/course/externallib.php @@ -258,8 +258,7 @@ public static function get_course_contents($courseid, $options = array()) { $modcontext = context_module::instance($cm->id); - $isbrandedfunction = $cm->modname.'_is_branded'; - $isbranded = function_exists($isbrandedfunction) ? $isbrandedfunction() : false; + $isbranded = component_callback('mod_' . $cm->modname, 'is_branded', [], false); // Common info (for people being able to see the module or availability dates). $module['id'] = $cm->id; diff --git a/course/format/classes/output/local/content/cm/cmicon.php b/course/format/classes/output/local/content/cm/cmicon.php index c2d5bd13577c0..784b96eb1e6e0 100644 --- a/course/format/classes/output/local/content/cm/cmicon.php +++ b/course/format/classes/output/local/content/cm/cmicon.php @@ -78,8 +78,8 @@ public function export_for_template(\renderer_base $output): array { $iconurl = $mod->get_icon_url(); $iconclass = $iconurl->get_param('filtericon') ? '' : 'nofilter'; - $isbrandedfunction = $mod->modname.'_is_branded'; - $isbranded = function_exists($isbrandedfunction) ? $isbrandedfunction() : false; + $isbranded = component_callback('mod_' . $mod->modname, 'is_branded', [], false); + $data = [ 'uservisible' => $mod->uservisible, 'url' => $mod->url, diff --git a/theme/boost/classes/output/core_renderer.php b/theme/boost/classes/output/core_renderer.php index 203a42afec814..95cf185088cef 100644 --- a/theme/boost/classes/output/core_renderer.php +++ b/theme/boost/classes/output/core_renderer.php @@ -170,8 +170,7 @@ public function context_header($headerinfo = null, $headinglevel = 1): string { $purposeclass = plugin_supports('mod', $this->page->activityname, FEATURE_MOD_PURPOSE); $purposeclass .= ' activityiconcontainer icon-size-6'; $purposeclass .= ' modicon_' . $this->page->activityname; - $isbrandedfunction = $this->page->activityname.'_is_branded'; - $isbranded = function_exists($isbrandedfunction) ? $isbrandedfunction() : false; + $isbranded = component_callback('mod_' . $this->page->activityname, 'is_branded', [], false); $imagedata = html_writer::tag('div', $imagedata, ['class' => $purposeclass . ($isbranded ? ' isbranded' : '')]); if (!empty($USER->editing)) { $prefix = get_string('modulename', $this->page->activityname); From 33636dc66d0e52d01add2ad68397e6ed20a796a9 Mon Sep 17 00:00:00 2001 From: Paul Holden Date: Mon, 8 Jan 2024 17:01:18 +0000 Subject: [PATCH 33/51] MDL-72376 mod_book: final removal of deprecated navigation method. --- mod/book/deprecatedlib.php | 38 +++++++++++++++++++++++++++++++++ mod/book/lang/en/book.php | 8 ++++--- mod/book/lang/en/deprecated.txt | 3 +++ mod/book/lib.php | 27 ++--------------------- mod/book/locallib.php | 10 --------- mod/book/upgrade.txt | 4 ++++ 6 files changed, 52 insertions(+), 38 deletions(-) create mode 100644 mod/book/deprecatedlib.php create mode 100644 mod/book/lang/en/deprecated.txt diff --git a/mod/book/deprecatedlib.php b/mod/book/deprecatedlib.php new file mode 100644 index 0000000000000..8c2c23ec10ee1 --- /dev/null +++ b/mod/book/deprecatedlib.php @@ -0,0 +1,38 @@ +. + +/** + * List of deprecated mod_book functions + * + * @package mod_book + * @copyright 2024 Paul Holden + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +/** + * @deprecated since Moodle 3.8 + */ +function book_scale_used() { + throw new coding_exception('book_scale_used() can not be used anymore. Plugins can implement ' . + '_scale_used_anywhere, all implementations of _scale_used are now ignored'); +} + +/** + * @deprecated since Moodle 4.0 + */ +function book_get_nav_types() { + throw new coding_exception(__FUNCTION__ . '() has been removed.'); +} diff --git a/mod/book/lang/en/book.php b/mod/book/lang/en/book.php index 7f2e9055d04c3..a9aeda657b73a 100644 --- a/mod/book/lang/en/book.php +++ b/mod/book/lang/en/book.php @@ -72,14 +72,11 @@ $string['search:chapter'] = 'Book - chapters'; $string['showchapter'] = 'Show chapter "{$a}"'; $string['subchapter'] = 'Subchapter'; -$string['navimages'] = 'Images'; $string['navoptions'] = 'Available options for navigational links'; $string['navoptions_desc'] = 'Options for displaying navigation on the book pages'; $string['navstyle'] = 'Style of navigation'; $string['navstyle_help'] = '* Images - Icons are used for navigation * Text - Chapter titles are used for navigation'; -$string['navtext'] = 'Text'; -$string['navtoc'] = 'TOC Only'; $string['nocontent'] = 'No content has been added to this book yet.'; $string['numbering'] = 'Chapter formatting'; $string['numbering_help'] = '* None - Chapter and subchapter titles have no formatting @@ -117,3 +114,8 @@ $string['removeallbooktags'] = 'Remove all book tags'; $string['tagarea_book_chapters'] = 'Book chapters'; $string['tagsdeleted'] = 'Book tags have been deleted'; + +// Deprecated since Moodle 4.4. +$string['navimages'] = 'Images'; +$string['navtext'] = 'Text'; +$string['navtoc'] = 'TOC Only'; diff --git a/mod/book/lang/en/deprecated.txt b/mod/book/lang/en/deprecated.txt new file mode 100644 index 0000000000000..432f97ebbf027 --- /dev/null +++ b/mod/book/lang/en/deprecated.txt @@ -0,0 +1,3 @@ +navimages,mod_book +navtext,mod_book +navtoc,mod_book diff --git a/mod/book/lib.php b/mod/book/lib.php index d5a0d96486246..4ad547c73a39c 100644 --- a/mod/book/lib.php +++ b/mod/book/lib.php @@ -24,6 +24,8 @@ defined('MOODLE_INTERNAL') || die; +require_once(__DIR__ . '/deprecatedlib.php'); + /** * Returns list of available numbering types * @return array @@ -41,23 +43,6 @@ function book_get_numbering_types() { ); } -/** - * Returns list of available navigation link types. - * - * @deprecated since Moodle 4.0. MDL-72376. - * @return array - */ -function book_get_nav_types() { - debugging("book_get_nav_types() is deprecated. There is no replacement. Navigation is now only next and previous."); - require_once(__DIR__.'/locallib.php'); - - return array ( - BOOK_LINK_TOCONLY => get_string('navtoc', 'mod_book'), - BOOK_LINK_IMAGE => get_string('navimages', 'mod_book'), - BOOK_LINK_TEXT => get_string('navtext', 'mod_book'), - ); -} - /** * Returns list of available navigation link CSS classes. * @return array @@ -217,14 +202,6 @@ function book_grades($bookid) { return null; } -/** - * @deprecated since Moodle 3.8 - */ -function book_scale_used() { - throw new coding_exception('book_scale_used() can not be used anymore. Plugins can implement ' . - '_scale_used_anywhere, all implementations of _scale_used are now ignored'); -} - /** * Checks if scale is being used by any instance of book * diff --git a/mod/book/locallib.php b/mod/book/locallib.php index 84636d8311c53..7cf022b403094 100644 --- a/mod/book/locallib.php +++ b/mod/book/locallib.php @@ -39,16 +39,6 @@ define('BOOK_NUM_BULLETS', '2'); define('BOOK_NUM_INDENTED', '3'); -/** - * The following defines are used to define the navigation style used within a book. - * BOOK_LINK_TOCONLY Only the table of contents is shown, in a side region. - * BOOK_LINK_IMAGE Arrows link to previous/next/exit pages, in addition to the TOC. - * BOOK_LINK_TEXT Page names and arrows link to previous/next/exit pages, in addition to the TOC. - */ -define ('BOOK_LINK_TOCONLY', '0'); -define ('BOOK_LINK_IMAGE', '1'); -define ('BOOK_LINK_TEXT', '2'); - /** * Preload book chapters and fix toc structure if necessary. * diff --git a/mod/book/upgrade.txt b/mod/book/upgrade.txt index e3a7853754e39..dce1213b60600 100644 --- a/mod/book/upgrade.txt +++ b/mod/book/upgrade.txt @@ -1,5 +1,9 @@ This files describes API changes in the book code. +=== 4.4 === + +* The previously deprecated `book_get_nav_types` method has been removed, along with the `BOOK_LINK_*` constants + === 4.0 === * book_get_nav_types() has been deprecated. Related settings have been removed. The navigation is now set to only "next" and From 2aba5e0ff774eb57f9b678a7117f80007d4675eb Mon Sep 17 00:00:00 2001 From: Paul Holden Date: Mon, 4 Mar 2024 15:03:50 +0000 Subject: [PATCH 34/51] MDL-81112 gradereport_grader: show user country value correctly. --- grade/report/grader/lib.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/grade/report/grader/lib.php b/grade/report/grader/lib.php index dbe4a93f2fdb3..09c6d7cedf3e4 100644 --- a/grade/report/grader/lib.php +++ b/grade/report/grader/lib.php @@ -740,11 +740,17 @@ public function get_left_rows($displayaverages) { $userrow->cells[] = $usercell; foreach ($extrafields as $field) { + $fieldcellcontent = s($user->$field); + if ($field === 'country') { + $countries = get_string_manager()->get_list_of_countries(); + $fieldcellcontent = $countries[$user->$field] ?? $fieldcellcontent; + } + $fieldcell = new html_table_cell(); $fieldcell->attributes['class'] = 'userfield user' . $field; $fieldcell->attributes['data-col'] = $field; $fieldcell->header = false; - $fieldcell->text = html_writer::tag('div', s($user->{$field}), [ + $fieldcell->text = html_writer::tag('div', $fieldcellcontent, [ 'data-collapse' => 'content' ]); From 16b73bf993f3440c68a40464815452fe222d56f3 Mon Sep 17 00:00:00 2001 From: Paul Holden Date: Thu, 4 Jan 2024 15:07:03 +0000 Subject: [PATCH 35/51] MDL-80488 mod_lesson: avoid overflowing length of page titles. --- mod/lesson/locallib.php | 3 ++- mod/lesson/pagetypes/branchtable.php | 5 +++-- mod/lesson/pagetypes/cluster.php | 3 ++- mod/lesson/pagetypes/endofbranch.php | 3 ++- mod/lesson/pagetypes/endofcluster.php | 3 ++- 5 files changed, 11 insertions(+), 6 deletions(-) diff --git a/mod/lesson/locallib.php b/mod/lesson/locallib.php index a780601b4e5d2..238e2ddddbd01 100644 --- a/mod/lesson/locallib.php +++ b/mod/lesson/locallib.php @@ -1355,8 +1355,9 @@ final public function definition() { $mform->addElement('hidden', 'qtype'); $mform->setType('qtype', PARAM_INT); - $mform->addElement('text', 'title', get_string('pagetitle', 'lesson'), array('size'=>70)); + $mform->addElement('text', 'title', get_string('pagetitle', 'lesson'), ['size' => 70, 'maxlength' => 255]); $mform->addRule('title', get_string('required'), 'required', null, 'client'); + $mform->addRule('title', get_string('maximumchars', '', 255), 'maxlength', 255, 'client'); if (!empty($CFG->formatstringstriptags)) { $mform->setType('title', PARAM_TEXT); } else { diff --git a/mod/lesson/pagetypes/branchtable.php b/mod/lesson/pagetypes/branchtable.php index 7ce0f2c8d1f44..6f0f5155d5914 100644 --- a/mod/lesson/pagetypes/branchtable.php +++ b/mod/lesson/pagetypes/branchtable.php @@ -339,8 +339,9 @@ public function custom_definition() { $mform->addElement('hidden', 'qtype'); $mform->setType('qtype', PARAM_INT); - $mform->addElement('text', 'title', get_string("pagetitle", "lesson"), array('size'=>70)); - $mform->addRule('title', null, 'required', null, 'server'); + $mform->addElement('text', 'title', get_string("pagetitle", "lesson"), ['size' => 70, 'maxlength' => 255]); + $mform->addRule('title', null, 'required', null, 'client'); + $mform->addRule('title', get_string('maximumchars', '', 255), 'maxlength', 255, 'client'); if (!empty($CFG->formatstringstriptags)) { $mform->setType('title', PARAM_TEXT); } else { diff --git a/mod/lesson/pagetypes/cluster.php b/mod/lesson/pagetypes/cluster.php index 74948d04730be..d3a315cd4e09c 100644 --- a/mod/lesson/pagetypes/cluster.php +++ b/mod/lesson/pagetypes/cluster.php @@ -131,7 +131,8 @@ public function custom_definition() { $mform->addElement('hidden', 'qtype'); $mform->setType('qtype', PARAM_TEXT); - $mform->addElement('text', 'title', get_string("pagetitle", "lesson"), array('size'=>70)); + $mform->addElement('text', 'title', get_string("pagetitle", "lesson"), ['size' => 70, 'maxlength' => 255]); + $mform->addRule('title', get_string('maximumchars', '', 255), 'maxlength', 255, 'client'); if (!empty($CFG->formatstringstriptags)) { $mform->setType('title', PARAM_TEXT); } else { diff --git a/mod/lesson/pagetypes/endofbranch.php b/mod/lesson/pagetypes/endofbranch.php index dc5409cee79ae..c8974a4dfd0e7 100644 --- a/mod/lesson/pagetypes/endofbranch.php +++ b/mod/lesson/pagetypes/endofbranch.php @@ -159,7 +159,8 @@ public function custom_definition() { $mform->addElement('hidden', 'qtype'); $mform->setType('qtype', PARAM_TEXT); - $mform->addElement('text', 'title', get_string("pagetitle", "lesson"), array('size'=>70)); + $mform->addElement('text', 'title', get_string("pagetitle", "lesson"), ['size' => 70, 'maxlength' => 255]); + $mform->addRule('title', get_string('maximumchars', '', 255), 'maxlength', 255, 'client'); if (!empty($CFG->formatstringstriptags)) { $mform->setType('title', PARAM_TEXT); } else { diff --git a/mod/lesson/pagetypes/endofcluster.php b/mod/lesson/pagetypes/endofcluster.php index 0505013956598..ba493535c02a6 100644 --- a/mod/lesson/pagetypes/endofcluster.php +++ b/mod/lesson/pagetypes/endofcluster.php @@ -139,7 +139,8 @@ public function custom_definition() { $mform->addElement('hidden', 'qtype'); $mform->setType('qtype', PARAM_TEXT); - $mform->addElement('text', 'title', get_string("pagetitle", "lesson"), array('size'=>70)); + $mform->addElement('text', 'title', get_string("pagetitle", "lesson"), ['size' => 70, 'maxlength' => 255]); + $mform->addRule('title', get_string('maximumchars', '', 255), 'maxlength', 255, 'client'); if (!empty($CFG->formatstringstriptags)) { $mform->setType('title', PARAM_TEXT); } else { From 025550024794fb0214556a6d6a3a87215f4afc81 Mon Sep 17 00:00:00 2001 From: Jake Dallimore Date: Thu, 21 Mar 2024 11:00:45 +0800 Subject: [PATCH 36/51] MDL-81313 core: Revert "Merge branch 'MDL-80338' This reverts commit 40f501fb4e8ccad7eaacde873bf8fa809df192c5, reversing changes made to 3061024726abdd5581d90e3a589c38b01eb533a2. --- lib/tests/moodle_url_test.php | 15 --------------- lib/weblib.php | 4 ++-- 2 files changed, 2 insertions(+), 17 deletions(-) diff --git a/lib/tests/moodle_url_test.php b/lib/tests/moodle_url_test.php index 4c36c81a31151..810f88334aa5b 100644 --- a/lib/tests/moodle_url_test.php +++ b/lib/tests/moodle_url_test.php @@ -52,9 +52,6 @@ public function test_moodle_url_constructor() { $url = new \moodle_url('/index.php', null, 'test'); $this->assertSame($CFG->wwwroot.'/index.php#test', $url->out()); - $url = new \moodle_url('/index.php', null, 'Long "Anchor"'); - $this->assertSame($CFG->wwwroot . '/index.php#Long%20%22Anchor%22', $url->out()); - $url = new \moodle_url('/index.php', array('id' => 2), 'test'); $this->assertSame($CFG->wwwroot.'/index.php?id=2#test', $url->out()); } @@ -141,18 +138,6 @@ public function test_moodle_url_round_trip_array_params() { $this->assertSame($strurl, $url->out(false)); } - /** - * Test returning URL without parameters - */ - public function test_out_omit_querystring(): void { - global $CFG; - - $url = new \moodle_url('/index.php', ['id' => 2], 'Long "Anchor"'); - - $this->assertSame($CFG->wwwroot . '/index.php', $url->out_omit_querystring()); - $this->assertSame($CFG->wwwroot . '/index.php#Long%20%22Anchor%22', $url->out_omit_querystring(true)); - } - public function test_compare_url() { $url1 = new \moodle_url('index.php', array('var1' => 1, 'var2' => 2)); $url2 = new \moodle_url('index2.php', array('var1' => 1, 'var2' => 2, 'var3' => 3)); diff --git a/lib/weblib.php b/lib/weblib.php index c7ec6e278aa9b..cbaaeca17f7e5 100644 --- a/lib/weblib.php +++ b/lib/weblib.php @@ -621,7 +621,7 @@ public function raw_out($escaped = true, array $overrideparams = null) { $uri .= '?' . $querystring; } if (!is_null($this->anchor)) { - $uri .= '#' . rawurlencode($this->anchor); + $uri .= '#'.$this->anchor; } return $uri; @@ -641,7 +641,7 @@ public function out_omit_querystring($includeanchor = false) { $uri .= $this->port ? ':'.$this->port : ''; $uri .= $this->path ? $this->path : ''; if ($includeanchor and !is_null($this->anchor)) { - $uri .= '#' . rawurlencode($this->anchor); + $uri .= '#' . $this->anchor; } return $uri; From b0220f27cb33965dda5ad3894ca79b07f46eb976 Mon Sep 17 00:00:00 2001 From: Huong Nguyen Date: Tue, 13 Feb 2024 11:26:25 +0700 Subject: [PATCH 37/51] MDL-80850 Javascript: Add new core/dropzone module --- lang/en/moodle.php | 1 + lib/amd/build/dropzone.min.js | 11 ++ lib/amd/build/dropzone.min.js.map | 1 + lib/amd/src/dropzone.js | 150 ++++++++++++++++++ .../output/icon_system_fontawesome.php | 1 + lib/templates/dropzone.mustache | 35 ++++ pix/i/cloudupload.svg | 1 + theme/boost/scss/moodle/core.scss | 42 +++++ theme/boost/style/moodle.css | 34 ++++ theme/classic/style/moodle.css | 34 ++++ 10 files changed, 310 insertions(+) create mode 100644 lib/amd/build/dropzone.min.js create mode 100644 lib/amd/build/dropzone.min.js.map create mode 100644 lib/amd/src/dropzone.js create mode 100644 lib/templates/dropzone.mustache create mode 100644 pix/i/cloudupload.svg diff --git a/lang/en/moodle.php b/lang/en/moodle.php index 21bfc94f34d81..c0c434bfb9e21 100644 --- a/lang/en/moodle.php +++ b/lang/en/moodle.php @@ -62,6 +62,7 @@ $string['addedtogroupnot'] = 'Not added to group "{$a}"'; $string['addedtogroupnotenrolled'] = 'Not added to group "{$a}", because not enrolled in course'; $string['addfilehere'] = 'Drop files here to add them at the bottom of this section'; +$string['addfilesdrop'] = 'You can drag and drop files here to upload or click to select.'; $string['addinganew'] = 'New {$a}'; $string['additionalcustomnav'] = 'Additional custom navigation'; $string['addnew'] = 'Add a new {$a}'; diff --git a/lib/amd/build/dropzone.min.js b/lib/amd/build/dropzone.min.js new file mode 100644 index 0000000000000..1024dbc737700 --- /dev/null +++ b/lib/amd/build/dropzone.min.js @@ -0,0 +1,11 @@ +define("core/dropzone",["exports","core/log","core/templates"],(function(_exports,_log,_templates){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}} +/** + * JavaScript to handle dropzone. + * + * @module core/dropzone + * @copyright 2024 Huong Nguyen + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @since 4.4 + */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_log=_interopRequireDefault(_log),_templates=_interopRequireDefault(_templates);var _default=class{constructor(dropZoneElement,fileTypes,callback){this.init(dropZoneElement,fileTypes,callback)}init(dropZoneElement,fileTypes,callback){return dropZoneElement.addEventListener("dragover",(e=>{const dropZone=this.getDropZoneFromEvent(e);dropZone&&(e.preventDefault(),dropZone.classList.add("dragover"))})),dropZoneElement.addEventListener("dragleave",(e=>{const dropZone=this.getDropZoneFromEvent(e);dropZone&&(e.preventDefault(),dropZone.classList.remove("dragover"))})),dropZoneElement.addEventListener("drop",(e=>{const dropZone=this.getDropZoneFromEvent(e);dropZone&&(e.preventDefault(),dropZone.classList.remove("dragover"),callback(e.dataTransfer.files))})),dropZoneElement.addEventListener("click",(e=>{this.getDropZoneContainerFromEvent(e)&&this.getFileElementFromEvent(e).click()})),dropZoneElement.addEventListener("click",(e=>{e.target.closest(".dropzone-sr-only-focusable")&&this.getFileElementFromEvent(e).click()})),dropZoneElement.addEventListener("change",(e=>{const fileInput=this.getFileElementFromEvent(e);fileInput&&(e.preventDefault(),callback(fileInput.files))})),this.renderDropZone(dropZoneElement,fileTypes),_log.default.info("Dropzone has been initialized!"),this}getDropZoneFromEvent(e){return e.target.closest(".dropzone")}getDropZoneContainerFromEvent(e){return e.target.closest(".dropzone-container")}getFileElementFromEvent(e){return e.target.closest(".dropzone-container").querySelector(".drop-zone-fileinput")}async renderDropZone(dropZoneElement,fileTypes){dropZoneElement.innerHTML=await _templates.default.render("core/dropzone",{fileTypes:fileTypes})}};return _exports.default=_default,_exports.default})); + +//# sourceMappingURL=dropzone.min.js.map \ No newline at end of file diff --git a/lib/amd/build/dropzone.min.js.map b/lib/amd/build/dropzone.min.js.map new file mode 100644 index 0000000000000..bbef7dda7204f --- /dev/null +++ b/lib/amd/build/dropzone.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"dropzone.min.js","sources":["../src/dropzone.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * JavaScript to handle dropzone.\n *\n * @module core/dropzone\n * @copyright 2024 Huong Nguyen \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 4.4\n */\n\nimport Log from 'core/log';\nimport Templates from 'core/templates';\n\n/**\n * A dropzone.\n *\n * @class core/dropzone\n */\nconst DropZone = class {\n\n /**\n * Constructor.\n *\n * @param {Element} dropZoneElement The element to render the dropzone.\n * @param {String} fileTypes The file types that are allowed to be uploaded. Example: image/*\n * @param {CallableFunction} callback The function to call when a file is dropped.\n */\n constructor(dropZoneElement, fileTypes, callback) {\n this.init(dropZoneElement, fileTypes, callback);\n }\n\n /**\n * Initialise the dropzone.\n *\n * @param {Element} dropZoneElement The element to render the dropzone.\n * @param {String} fileTypes The file types that are allowed to be uploaded. Example: image/*\n * @param {CallableFunction} callback The function to call when a file is dropped.\n * @returns {DropZone}\n */\n init(dropZoneElement, fileTypes, callback) {\n dropZoneElement.addEventListener('dragover', (e) => {\n const dropZone = this.getDropZoneFromEvent(e);\n if (!dropZone) {\n return;\n }\n e.preventDefault();\n dropZone.classList.add('dragover');\n });\n dropZoneElement.addEventListener('dragleave', (e) => {\n const dropZone = this.getDropZoneFromEvent(e);\n if (!dropZone) {\n return;\n }\n e.preventDefault();\n dropZone.classList.remove('dragover');\n });\n dropZoneElement.addEventListener('drop', (e) => {\n const dropZone = this.getDropZoneFromEvent(e);\n if (!dropZone) {\n return;\n }\n e.preventDefault();\n dropZone.classList.remove('dragover');\n callback(e.dataTransfer.files);\n });\n dropZoneElement.addEventListener('click', (e) => {\n const dropZoneContainer = this.getDropZoneContainerFromEvent(e);\n if (!dropZoneContainer) {\n return;\n }\n this.getFileElementFromEvent(e).click();\n });\n dropZoneElement.addEventListener('click', (e) => {\n const dropZoneLabel = e.target.closest('.dropzone-sr-only-focusable');\n if (!dropZoneLabel) {\n return;\n }\n this.getFileElementFromEvent(e).click();\n });\n dropZoneElement.addEventListener('change', (e) => {\n const fileInput = this.getFileElementFromEvent(e);\n if (fileInput) {\n e.preventDefault();\n callback(fileInput.files);\n }\n });\n this.renderDropZone(dropZoneElement, fileTypes);\n Log.info('Dropzone has been initialized!');\n return this;\n }\n\n /**\n * Get the dropzone.\n *\n * @param {Event} e The event.\n * @returns {HTMLElement|bool}\n */\n getDropZoneFromEvent(e) {\n return e.target.closest('.dropzone');\n }\n\n /**\n * Get the dropzone container.\n *\n * @param {Event} e The event.\n * @returns {HTMLElement|bool}\n */\n getDropZoneContainerFromEvent(e) {\n return e.target.closest('.dropzone-container');\n }\n\n /**\n * Get the file element.\n *\n * @param {Event} e The event.\n * @returns {HTMLElement|bool}\n */\n getFileElementFromEvent(e) {\n return e.target.closest('.dropzone-container').querySelector('.drop-zone-fileinput');\n }\n\n /**\n * Render the dropzone.\n *\n * @param {Element} dropZoneElement The element to render the dropzone.\n * @param {String} fileTypes The file types that are allowed to be uploaded.\n * @returns {Promise}\n */\n async renderDropZone(dropZoneElement, fileTypes) {\n dropZoneElement.innerHTML = await Templates.render('core/dropzone', {\n fileTypes,\n });\n }\n};\n\nexport default DropZone;\n"],"names":["constructor","dropZoneElement","fileTypes","callback","init","addEventListener","e","dropZone","this","getDropZoneFromEvent","preventDefault","classList","add","remove","dataTransfer","files","getDropZoneContainerFromEvent","getFileElementFromEvent","click","target","closest","fileInput","renderDropZone","info","querySelector","innerHTML","Templates","render"],"mappings":";;;;;;;;kLAgCiB,MASbA,YAAYC,gBAAiBC,UAAWC,eAC/BC,KAAKH,gBAAiBC,UAAWC,UAW1CC,KAAKH,gBAAiBC,UAAWC,iBAC7BF,gBAAgBI,iBAAiB,YAAaC,UACpCC,SAAWC,KAAKC,qBAAqBH,GACtCC,WAGLD,EAAEI,iBACFH,SAASI,UAAUC,IAAI,gBAE3BX,gBAAgBI,iBAAiB,aAAcC,UACrCC,SAAWC,KAAKC,qBAAqBH,GACtCC,WAGLD,EAAEI,iBACFH,SAASI,UAAUE,OAAO,gBAE9BZ,gBAAgBI,iBAAiB,QAASC,UAChCC,SAAWC,KAAKC,qBAAqBH,GACtCC,WAGLD,EAAEI,iBACFH,SAASI,UAAUE,OAAO,YAC1BV,SAASG,EAAEQ,aAAaC,WAE5Bd,gBAAgBI,iBAAiB,SAAUC,IACbE,KAAKQ,8BAA8BV,SAIxDW,wBAAwBX,GAAGY,WAEpCjB,gBAAgBI,iBAAiB,SAAUC,IACjBA,EAAEa,OAAOC,QAAQ,qCAIlCH,wBAAwBX,GAAGY,WAEpCjB,gBAAgBI,iBAAiB,UAAWC,UAClCe,UAAYb,KAAKS,wBAAwBX,GAC3Ce,YACAf,EAAEI,iBACFP,SAASkB,UAAUN,gBAGtBO,eAAerB,gBAAiBC,wBACjCqB,KAAK,kCACFf,KASXC,qBAAqBH,UACVA,EAAEa,OAAOC,QAAQ,aAS5BJ,8BAA8BV,UACnBA,EAAEa,OAAOC,QAAQ,uBAS5BH,wBAAwBX,UACbA,EAAEa,OAAOC,QAAQ,uBAAuBI,cAAc,6CAU5CvB,gBAAiBC,WAClCD,gBAAgBwB,gBAAkBC,mBAAUC,OAAO,gBAAiB,CAChEzB,UAAAA"} \ No newline at end of file diff --git a/lib/amd/src/dropzone.js b/lib/amd/src/dropzone.js new file mode 100644 index 0000000000000..5425bcd41c69a --- /dev/null +++ b/lib/amd/src/dropzone.js @@ -0,0 +1,150 @@ +// 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 . + +/** + * JavaScript to handle dropzone. + * + * @module core/dropzone + * @copyright 2024 Huong Nguyen + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @since 4.4 + */ + +import Log from 'core/log'; +import Templates from 'core/templates'; + +/** + * A dropzone. + * + * @class core/dropzone + */ +const DropZone = class { + + /** + * Constructor. + * + * @param {Element} dropZoneElement The element to render the dropzone. + * @param {String} fileTypes The file types that are allowed to be uploaded. Example: image/* + * @param {CallableFunction} callback The function to call when a file is dropped. + */ + constructor(dropZoneElement, fileTypes, callback) { + this.init(dropZoneElement, fileTypes, callback); + } + + /** + * Initialise the dropzone. + * + * @param {Element} dropZoneElement The element to render the dropzone. + * @param {String} fileTypes The file types that are allowed to be uploaded. Example: image/* + * @param {CallableFunction} callback The function to call when a file is dropped. + * @returns {DropZone} + */ + init(dropZoneElement, fileTypes, callback) { + dropZoneElement.addEventListener('dragover', (e) => { + const dropZone = this.getDropZoneFromEvent(e); + if (!dropZone) { + return; + } + e.preventDefault(); + dropZone.classList.add('dragover'); + }); + dropZoneElement.addEventListener('dragleave', (e) => { + const dropZone = this.getDropZoneFromEvent(e); + if (!dropZone) { + return; + } + e.preventDefault(); + dropZone.classList.remove('dragover'); + }); + dropZoneElement.addEventListener('drop', (e) => { + const dropZone = this.getDropZoneFromEvent(e); + if (!dropZone) { + return; + } + e.preventDefault(); + dropZone.classList.remove('dragover'); + callback(e.dataTransfer.files); + }); + dropZoneElement.addEventListener('click', (e) => { + const dropZoneContainer = this.getDropZoneContainerFromEvent(e); + if (!dropZoneContainer) { + return; + } + this.getFileElementFromEvent(e).click(); + }); + dropZoneElement.addEventListener('click', (e) => { + const dropZoneLabel = e.target.closest('.dropzone-sr-only-focusable'); + if (!dropZoneLabel) { + return; + } + this.getFileElementFromEvent(e).click(); + }); + dropZoneElement.addEventListener('change', (e) => { + const fileInput = this.getFileElementFromEvent(e); + if (fileInput) { + e.preventDefault(); + callback(fileInput.files); + } + }); + this.renderDropZone(dropZoneElement, fileTypes); + Log.info('Dropzone has been initialized!'); + return this; + } + + /** + * Get the dropzone. + * + * @param {Event} e The event. + * @returns {HTMLElement|bool} + */ + getDropZoneFromEvent(e) { + return e.target.closest('.dropzone'); + } + + /** + * Get the dropzone container. + * + * @param {Event} e The event. + * @returns {HTMLElement|bool} + */ + getDropZoneContainerFromEvent(e) { + return e.target.closest('.dropzone-container'); + } + + /** + * Get the file element. + * + * @param {Event} e The event. + * @returns {HTMLElement|bool} + */ + getFileElementFromEvent(e) { + return e.target.closest('.dropzone-container').querySelector('.drop-zone-fileinput'); + } + + /** + * Render the dropzone. + * + * @param {Element} dropZoneElement The element to render the dropzone. + * @param {String} fileTypes The file types that are allowed to be uploaded. + * @returns {Promise} + */ + async renderDropZone(dropZoneElement, fileTypes) { + dropZoneElement.innerHTML = await Templates.render('core/dropzone', { + fileTypes, + }); + } +}; + +export default DropZone; diff --git a/lib/classes/output/icon_system_fontawesome.php b/lib/classes/output/icon_system_fontawesome.php index 95f4ee4d412ce..180d15def4001 100644 --- a/lib/classes/output/icon_system_fontawesome.php +++ b/lib/classes/output/icon_system_fontawesome.php @@ -218,6 +218,7 @@ public function get_core_icon_map() { 'core:i/chartbar' => 'fa-chart-bar', 'core:i/course' => 'fa-graduation-cap', 'core:i/courseevent' => 'fa-graduation-cap', + 'core:i/cloudupload' => 'fa-cloud-upload', 'core:i/customfield' => 'fa-hand-o-right', 'core:i/db' => 'fa-database', 'core:i/delete' => 'fa-trash', diff --git a/lib/templates/dropzone.mustache b/lib/templates/dropzone.mustache new file mode 100644 index 0000000000000..c7091833d4918 --- /dev/null +++ b/lib/templates/dropzone.mustache @@ -0,0 +1,35 @@ +{{! + 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 . +}} +{{! + @template core/dropzone + + Render dropzone for file upload + + Example context (json): + { + "filetypes": "image/*,application/pdf" + } +}} +
+ {{# str }} addfiletext, repository {{/ str }} +
+
+ {{# pix }} i/cloudupload, core, {{# str }} addfilesdrop {{/ str }} {{/ pix }} +
+
+ {{# str }} addfilesdrop {{/ str }} +
+
+ +
diff --git a/pix/i/cloudupload.svg b/pix/i/cloudupload.svg new file mode 100644 index 0000000000000..55e651ca02816 --- /dev/null +++ b/pix/i/cloudupload.svg @@ -0,0 +1 @@ + diff --git a/theme/boost/scss/moodle/core.scss b/theme/boost/scss/moodle/core.scss index 80e5a3635baaa..511890dc45bce 100644 --- a/theme/boost/scss/moodle/core.scss +++ b/theme/boost/scss/moodle/core.scss @@ -2835,6 +2835,48 @@ body.dragging { cursor: move; } +.dropzone-container { + cursor: pointer; + + .dropzone { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + border: 2px dashed $filemanager-dnd-border-color; + border-radius: 0.5rem; + + &.dragover { + border: 2px dashed $filemanager-dnd-upload-over-border-color; + } + } + + .dropzone-icon { + color: $gray-500; + + .icon { + font-size: 6em; + width: auto; + height: auto; + max-width: initial; + max-height: initial; + margin-right: 0; + } + } + + .dropzone-sr-only-focusable { + &:active, + &:focus { + outline: 0; + box-shadow: $input-btn-focus-box-shadow; + z-index: $zindex-popover; + position: relative; + background: $sr-only-active-bg; + padding: 7px; + } + } +} + // Generic classes reactive components can use. .overlay-preview { diff --git a/theme/boost/style/moodle.css b/theme/boost/style/moodle.css index b7ee36ca08574..a94165516cfb8 100644 --- a/theme/boost/style/moodle.css +++ b/theme/boost/style/moodle.css @@ -25725,6 +25725,40 @@ body.dragging .dragging { cursor: move; } +.dropzone-container { + cursor: pointer; +} +.dropzone-container .dropzone { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + border: 2px dashed #bbb; + border-radius: 0.5rem; +} +.dropzone-container .dropzone.dragover { + border: 2px dashed #6c8cd3; +} +.dropzone-container .dropzone-icon { + color: #8f959e; +} +.dropzone-container .dropzone-icon .icon { + font-size: 6em; + width: auto; + height: auto; + max-width: initial; + max-height: initial; + margin-right: 0; +} +.dropzone-container .dropzone-sr-only-focusable:active, .dropzone-container .dropzone-sr-only-focusable:focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(15, 108, 191, 0.75); + z-index: 1060; + position: relative; + background: #fff; + padding: 7px; +} + .overlay-preview { background-color: rgba(255, 255, 255, 0.8); border: 2px dashed #0f6cbf; diff --git a/theme/classic/style/moodle.css b/theme/classic/style/moodle.css index 20cd8dfe65df6..e32f02e8e6176 100644 --- a/theme/classic/style/moodle.css +++ b/theme/classic/style/moodle.css @@ -25725,6 +25725,40 @@ body.dragging .dragging { cursor: move; } +.dropzone-container { + cursor: pointer; +} +.dropzone-container .dropzone { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + border: 2px dashed #bbb; + border-radius: 0.5rem; +} +.dropzone-container .dropzone.dragover { + border: 2px dashed #6c8cd3; +} +.dropzone-container .dropzone-icon { + color: #8f959e; +} +.dropzone-container .dropzone-icon .icon { + font-size: 6em; + width: auto; + height: auto; + max-width: initial; + max-height: initial; + margin-right: 0; +} +.dropzone-container .dropzone-sr-only-focusable:active, .dropzone-container .dropzone-sr-only-focusable:focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(15, 108, 191, 0.75); + z-index: 1060; + position: relative; + background: #fff; + padding: 7px; +} + .overlay-preview { background-color: rgba(255, 255, 255, 0.8); border: 2px dashed #0f6cbf; From 0f3775088fafe3f4c60f9535476e1dd8656db814 Mon Sep 17 00:00:00 2001 From: "Eloy Lafuente (stronk7)" Date: Wed, 20 Mar 2024 23:03:14 +0100 Subject: [PATCH 38/51] MDL-69688 phpunit: Improve test_context_not_used This adds a few changes to the old test_context_not_used test: - Move it to become an advanced_test, because its mission is to verify that the assertEventContextNotUsed() assertion works as expected. - For consistency, also move the fixtures to own phpunit fixtures. - Add proper coverage tags, to verify that the assertion is being covered. - Add a data provider to provide all the current cases and ease any future case that may be needed in the future. One by one because previously there was code never executed with the warning expectation causing the test to stop. - Run them in isolation, while this is not strictly required, it's including external fixtures and, we'll need that isolation soon (for changes coming when moving the test to PHPUnit 9.6 in MDL-81266). --- lib/phpunit/classes/advanced_testcase.php | 5 +- lib/phpunit/tests/advanced_test.php | 48 +++++++++++ lib/phpunit/tests/fixtures/event_fixtures.php | 80 +++++++++++++++++++ lib/tests/event/base_test.php | 21 ----- lib/tests/fixtures/event_fixtures.php | 19 ----- 5 files changed, 131 insertions(+), 42 deletions(-) create mode 100644 lib/phpunit/tests/fixtures/event_fixtures.php diff --git a/lib/phpunit/classes/advanced_testcase.php b/lib/phpunit/classes/advanced_testcase.php index 87d2f442c7ca3..9674a4801561c 100644 --- a/lib/phpunit/classes/advanced_testcase.php +++ b/lib/phpunit/classes/advanced_testcase.php @@ -390,7 +390,8 @@ public function assertEventLegacyLogData($expected, \core\event\base $event, $me } /** - * Assert that an event is not using event->contxet. + * Assert that various event methods are not using event->context + * * While restoring context might not be valid and it should not be used by event url * or description methods. * @@ -410,7 +411,7 @@ public function assertEventContextNotUsed(\core\event\base $event, $message = '' $event->get_url(); $event->get_description(); - // Restore event->context. + // Restore event->context (note that this is unreachable when the event uses context). But ok for correct events. phpunit_event_mock::testable_set_event_context($event, $eventcontext); } diff --git a/lib/phpunit/tests/advanced_test.php b/lib/phpunit/tests/advanced_test.php index 2088a4e7baafa..6aa4ba18ccbb3 100644 --- a/lib/phpunit/tests/advanced_test.php +++ b/lib/phpunit/tests/advanced_test.php @@ -339,6 +339,54 @@ public function test_assert_time_current() { } } + /** + * Test the assertEventContextNotUsed() assertion. + * + * Verify that events using the event context in some of their + * methods are detected properly (will throw a warning if they are). + * + * To do so, we'll be using some fixture events (context_used_in_event_xxxx), + * that, on purpose, use the event context (incorrectly) in their methods. + * + * Note that because we are using imported fixture classes, and because we + * are testing for warnings, better we run the tests in a separate process. + * + * @param string $fixture The fixture class to use. + * @param bool $phpwarn Whether a PHP warning is expected. + * + * @runInSeparateProcess + * @dataProvider assert_event_context_not_used_provider + * @covers ::assertEventContextNotUsed + */ + public function test_assert_event_context_not_used($fixture, $phpwarn): void { + require(__DIR__ . '/fixtures/event_fixtures.php'); + // Create an event that uses the event context in its get_url() and get_description() methods. + $event = $fixture::create([ + 'other' => [ + 'sample' => 1, + 'xx' => 10, + ], + ]); + + if ($phpwarn) { + $this->expectWarning(); + } + $this->assertEventContextNotUsed($event); + } + + /** + * Data provider for test_assert_event_context_not_used(). + * + * @return array + */ + public static function assert_event_context_not_used_provider(): array { + return [ + 'correct' => ['\core\event\context_used_in_event_correct', false], + 'wrong_get_url' => ['\core\event\context_used_in_event_get_url', true], + 'wrong_get_description' => ['\core\event\context_used_in_event_get_description', true], + ]; + } + public function test_message_processors_reset() { global $DB; diff --git a/lib/phpunit/tests/fixtures/event_fixtures.php b/lib/phpunit/tests/fixtures/event_fixtures.php new file mode 100644 index 0000000000000..7dfa6118211c4 --- /dev/null +++ b/lib/phpunit/tests/fixtures/event_fixtures.php @@ -0,0 +1,80 @@ +. + +/** + * Fixtures for advanced_testcase tests. + * + * @package core + * @category event + * @copyright 2024 onwards Eloy Lafuente (stronk7) {@link https://stronk7.com} + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace core\event; + +defined('MOODLE_INTERNAL') || die(); + +/** + * Event to test that \advanced_testcase::assertEventContextNotUsed() passes ok when no context is used. + */ +class context_used_in_event_correct extends \core\event\base { + + protected function init() { + $this->data['crud'] = 'u'; + $this->data['edulevel'] = self::LEVEL_PARTICIPATING; + $this->context = \context_system::instance(); + } + + public function get_url() { + return new \moodle_url('/somepath/somefile.php'); // No context used. + } + + public function get_description() { + return 'Description'; // No context used. + } +} + +/** + * Event to test that \advanced_testcase::assertEventContextNotUsed() detects context usage on get_url(). + */ +class context_used_in_event_get_url extends \core\event\base { + + protected function init() { + $this->data['crud'] = 'u'; + $this->data['edulevel'] = self::LEVEL_PARTICIPATING; + $this->context = \context_system::instance(); + } + + public function get_url() { + return new \moodle_url('/somepath/somefile.php', ['id' => $this->context->instanceid]); // Causes a PHP Warning. + } +} + +/** + * Event to test that \advanced_testcase::assertEventContextNotUsed() detects context usage on get_description(). + */ +class context_used_in_event_get_description extends \core\event\base { + + protected function init() { + $this->data['crud'] = 'u'; + $this->data['edulevel'] = self::LEVEL_PARTICIPATING; + $this->context = \context_system::instance(); + } + + public function get_description() { + return $this->context->instanceid . " Description"; // Causes a PHP Warning. + } +} diff --git a/lib/tests/event/base_test.php b/lib/tests/event/base_test.php index d749c543d2ab9..30dc2c91cbef9 100644 --- a/lib/tests/event/base_test.php +++ b/lib/tests/event/base_test.php @@ -853,27 +853,6 @@ public function test_iteration() { $this->assertSame($event->get_data(), $data); } - public function test_context_not_used() { - // TODO: MDL-69688 - This test is far away from my understanding. It throws a - // "Trying to get property 'instanceid' of non-object" notice, so - // it's not clear for me what the test is doing. This was detected - // when preparing tests for PHPUnit 8 (MDL-67673) and, at the end - // all that was done is to move the annotation (deprecated) to - // explicit expectation. Still try commenting it out and you'll see - // the notice. - if (PHP_VERSION_ID >= 80000) { - $this->expectWarning(); - } else { - $this->expectNotice(); - } - $event = \core_tests\event\context_used_in_event::create(array('other' => array('sample' => 1, 'xx' => 10))); - $this->assertEventContextNotUsed($event); - - $eventcontext = phpunit_event_mock::testable_get_event_context($event); - phpunit_event_mock::testable_set_event_context($event, null); - $this->assertEventContextNotUsed($event); - } - /** * Test that all observer information is returned correctly. */ diff --git a/lib/tests/fixtures/event_fixtures.php b/lib/tests/fixtures/event_fixtures.php index 33d02ceb2ff09..a8c3bfd5a0fe1 100644 --- a/lib/tests/fixtures/event_fixtures.php +++ b/lib/tests/fixtures/event_fixtures.php @@ -244,25 +244,6 @@ class course_module_viewed_noinit extends \core\event\course_module_viewed { class grade_report_viewed extends \core\event\grade_report_viewed { } -/** - * Event to test context used in event functions - */ -class context_used_in_event extends \core\event\base { - public function get_description() { - return $this->context->instanceid . " Description"; - } - - protected function init() { - $this->data['crud'] = 'u'; - $this->data['edulevel'] = self::LEVEL_PARTICIPATING; - $this->context = \context_system::instance(); - } - - public function get_url() { - return new \moodle_url('/somepath/somefile.php', array('id' => $this->context->instanceid)); - } -} - /** * This is an explanation of the event. * - I'm making a point here. From a92f780b2359cc5d7a9db1f576c0004a11f574c5 Mon Sep 17 00:00:00 2001 From: Jake Dallimore Date: Tue, 30 Jan 2024 12:14:17 +0800 Subject: [PATCH 39/51] MDL-80835 auth_lti: add cookie helper facilitating CHIPS opt-in To opt a cookie in to Chrome's 3rd party cookie partitioning solution, CHIPS, the property 'Partitioned;' needs to be set. This adds a helper class supporting this, for a given cookie(s). Note also, PHP's native cookie APIs (setcookie, etc) don't support this cookie property yet - (https://github.com/php/php-src/issues/12646). Since this class is intended to allow existing Set-Cookie headers to be modified before being sent (e.g. allowing clients to set a property on a cookie set elsewhere in code), it deals with the headers directly anyway but it means that new cookies must also use this helper to opt-in, instead of relying on setcookie(). E.g. where the intent is to add partitioning support to a new cookie, that cookie must first be set (setcookie) and then it may opt-in to partitioning via this helper; partitioning support cannot be achieved directly through setcookie and friends yet. --- .../ltiadvantage/utility/cookie_helper.php | 295 ++++++++++++++++++ .../utility/cookie_helper_test.php | 215 +++++++++++++ 2 files changed, 510 insertions(+) create mode 100644 auth/lti/classes/local/ltiadvantage/utility/cookie_helper.php create mode 100644 auth/lti/tests/local/ltiadvantage/utility/cookie_helper_test.php diff --git a/auth/lti/classes/local/ltiadvantage/utility/cookie_helper.php b/auth/lti/classes/local/ltiadvantage/utility/cookie_helper.php new file mode 100644 index 0000000000000..4a1d6189b48c3 --- /dev/null +++ b/auth/lti/classes/local/ltiadvantage/utility/cookie_helper.php @@ -0,0 +1,295 @@ +. + +namespace auth_lti\local\ltiadvantage\utility; + +/** + * Helper class providing utils dealing with cookies in LTI, particularly 3rd party cookies. + * + * This class primarily provides a means to augment outbound cookie headers, in order to satisfy browser-specific + * requirements for setting 3rd party cookies. + * + * @package auth_lti + * @copyright 2024 Jake Dallimore + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +final class cookie_helper { + + /** @var int Cookies are not supported. */ + public const COOKIE_METHOD_NOT_SUPPORTED = 0; + + /** @var int Cookies are supported without explicit partitioning. */ + public const COOKIE_METHOD_NO_PARTITIONING = 1; + + /** @var int Cookies are supported via explicit partitioning. */ + public const COOKIE_METHOD_EXPLICIT_PARTITIONING = 2; + + /** + * Make sure the given attributes are set on the Set-Cookie response header identified by name=$cookiename. + * + * This function only affects Set-Cookie headers and modifies the headers directly with the required changes, if any. + * + * @param string $cookiename the cookie name. + * @param array $attributes the attributes to set/ensure are set. + * @return void + */ + public static function add_attributes_to_cookie_response_header(string $cookiename, array $attributes): void { + + $setcookieheaders = array_filter(headers_list(), function($val) { + return preg_match("/Set-Cookie:/i", $val); + }); + if (empty($setcookieheaders)) { + return; + } + + $updatedheaders = self::cookie_response_headers_add_attributes($setcookieheaders, [$cookiename], $attributes); + + // Note: The header_remove() method is quite crude and removes all headers of that header name. + header_remove('Set-Cookie'); + foreach ($updatedheaders as $header) { + header($header, false); + } + } + + /** + * Given a list of HTTP header strings, return a list of HTTP header strings where the matched 'Set-Cookie' headers + * have been updated with the attributes defined in $attribute - an array of strings. + * + * This method does not verify whether a given attribute is valid or not. It blindly sets it and returns the header + * strings. It's up to calling code to determine whether an attribute makes sense or not. + * + * @param array $headerstrings the array of header strings. + * @param array $cookiestomatch the array of cookie names to match. + * @param array $attributes the attributes to set on each matched 'Set-Cookie' header. + * @param bool $casesensitive whether to match the attribute in a case-sensitive way. + * @return array the updated array of header strings. + */ + public static function cookie_response_headers_add_attributes(array $headerstrings, array $cookiestomatch, array $attributes, + bool $casesensitive = false): array { + + return array_map(function($headerstring) use ($attributes, $casesensitive, $cookiestomatch) { + if (!self::cookie_response_header_matches_names($headerstring, $cookiestomatch)) { + return $headerstring; + } + foreach ($attributes as $attribute) { + if (!self::cookie_response_header_contains_attribute($headerstring, $attribute, $casesensitive)) { + $headerstring = self::cookie_response_header_append_attribute($headerstring, $attribute); + } + } + return $headerstring; + }, $headerstrings); + } + + /** + * Check whether cookies can be used with the current user agent and, if so, via what method they are set. + * + * Currently, this tries 2 modes of setting a test cookie: + * 1. Setting a SameSite=None, Secure cookie. This will work in any first party context, and in 3rd party contexts for + * any browsers supporting automatic partitioning of 3rd party cookies (E.g. Firefox, Brave). + * 2. If 1 fails, setting a cookie with the Chrome 'Partitioned' attribute included, opting that cookie into CHIPS. This will + * work for Chrome. + * + * Upon completion of the cookie check, the check sets a SESSION flag indicating the method used to set the cookie, and upgrades + * the session cookie ('MoodleSession') using the respective method. This ensure the session cookie will continue to be sent. + * + * Then, the following methods can be used by client code to query whether the UA supports cookies, and how: + * @see self::cookies_supported() - whether it could be set at all. + * @see self::get_cookies_supported_mode() - if a cookie could be set, what mode was used to set it. + * + * This permits client code to make sure it's setting its cookies appropriately (via the advertised method), and allows it to + * present notices - such as in the case where a given UA is found to be lacking the requisite cookie support. + * E.g. + * cookie_helper::do_cookie_check($mypageurl); + * if (!cookie_helper::cookies_supported()) { + * // Print a notice stating that cookie support is required. + * } + * // Elsewhere in other client code... + * if (cookie_helper::get_cookies_supported_mode() === cookie_helper::COOKIE_METHOD_EXPLICIT_PARTITIONING) { + * // Set a cookie, making sure to use the helper to also opt-in to partitioning. + * setcookie('myauthcookie', 'myauthcookievalue', ['samesite' => 'None', 'secure' => true]); + * cookie_helper::add_partitioning_to_cookie('myauthcookie'); + * } + * + * @param \moodle_url $pageurl the URL of the page making the check, used to redirect back to after setting test cookies. + * @return void + */ + public static function do_cookie_check(\moodle_url $pageurl): void { + global $_COOKIE, $SESSION, $CFG; + $cookiecheck1 = optional_param('cookiecheck1', null, PARAM_INT); + $cookiecheck2 = optional_param('cookiecheck2', null, PARAM_INT); + + if (empty($cookiecheck1)) { + // Start the cookie check. Set two test cookies - one samesite none, and one partitioned - and redirect. + // Set cookiecheck to show the check has started. + self::set_test_cookie('cookiecheck1', self::COOKIE_METHOD_NO_PARTITIONING); + self::set_test_cookie('cookiecheck2', self::COOKIE_METHOD_EXPLICIT_PARTITIONING, true); + $pageurl->params([ + 'cookiecheck1' => self::COOKIE_METHOD_NO_PARTITIONING, + 'cookiecheck2' => self::COOKIE_METHOD_EXPLICIT_PARTITIONING, + ]); + + // LTI needs to guarantee the 'SameSite=None', 'Secure' (and sometimes 'Partitioned') attributes are set on the + // MoodleSession cookie. This is done via manipulation of the outgoing headers after the cookie check redirect. To + // guarantee these outgoing Set-Cookie headers will be created after the redirect, expire the current cookie. + self::expire_moodlesession(); + + redirect($pageurl); + } else { + // Have already started a cookie check, so check the result. + $cookie1received = isset($_COOKIE['cookiecheck1']) && $_COOKIE['cookiecheck1'] == $cookiecheck1; + $cookie2received = isset($_COOKIE['cookiecheck2']) && $_COOKIE['cookiecheck2'] == $cookiecheck2; + + if ($cookie1received || $cookie2received) { + // The test cookie could be set and received. + // Set a session flag storing the method used to set it, and make sure the session cookie uses this method. + $cookiemethod = $cookie1received ? self::COOKIE_METHOD_NO_PARTITIONING : self::COOKIE_METHOD_EXPLICIT_PARTITIONING; + $SESSION->auth_lti_cookie_method = $cookiemethod; + if ($cookiemethod === self::COOKIE_METHOD_EXPLICIT_PARTITIONING) { + // This assumes secure is set, since that's the only way a paritioned test cookie have been set. + self::add_attributes_to_cookie_response_header('MoodleSession'.$CFG->sessioncookie, ['Partitioned', 'Secure']); + } + } + } + } + + /** + * If a cookie check has been made, returns whether cookies could be set or not. + * + * @return bool whether cookies are supported or not. + */ + public static function cookies_supported(): bool { + return self::get_cookies_supported_method() !== self::COOKIE_METHOD_NOT_SUPPORTED; + } + + /** + * If a cookie check has been made, gets the method used to set a cookie, or self::COOKIE_METHOD_NOT_SUPPORTED if not supported. + * + * For cookie methods: + * @see self::COOKIE_METHOD_NOT_SUPPORTED + * @see self::COOKIE_METHOD_NO_PARTITIONING + * @see self::COOKIE_METHOD_EXPLICIT_PARTITIONING + * + * @return int the constant representing the method by which the cookie was set, or not. + */ + public static function get_cookies_supported_method(): int { + global $SESSION; + return $SESSION->auth_lti_cookie_method ?? self::COOKIE_METHOD_NOT_SUPPORTED; + } + + /** + * Forces the expiry of the MoodleSession cookie. + * + * This is useful to force a new Set-Cookie header on the next redirect. + * + * @return void + */ + private static function expire_moodlesession(): void { + global $CFG; + + $setcookieheader = array_filter(headers_list(), function($val) use ($CFG) { + return self::cookie_response_header_matches_name($val, 'MoodleSession'.$CFG->sessioncookie); + }); + if (!empty($setcookieheader)) { + $expirestr = 'Expires='.gmdate(DATE_RFC7231, time() - 60); + self::add_attributes_to_cookie_response_header('MoodleSession'.$CFG->sessioncookie, [$expirestr]); + } else { + setcookie('MoodleSession'.$CFG->sessioncookie, '', time() - 60); + } + } + + /** + * Set a test cookie, using SameSite=None; Secure; attributes if possible, and with or without partitioning opt-in. + * + * @param string $name cookie name + * @param string $value cookie value + * @param bool $partitioned whether to try to add partitioning opt-in, which requires secure cookies (https sites). + * @return void + */ + private static function set_test_cookie(string $name, string $value, bool $partitioned = false): void { + global $CFG; + require_once($CFG->libdir . '/sessionlib.php'); + + $atts = ['expires' => time() + 30]; + if (is_moodle_cookie_secure()) { + $atts['samesite'] = 'none'; + $atts['secure'] = true; + } + setcookie($name, $value, $atts); + + if (is_moodle_cookie_secure() && $partitioned) { + self::add_attributes_to_cookie_response_header($name, ['Partitioned']); + } + } + + /** + * Check whether the header string is a 'Set-Cookie' header for the cookie identified by $cookiename. + * + * @param string $headerstring the header string to check. + * @param string $cookiename the name of the cookie to match. + * @return bool true if the header string is a Set-Cookie header for the named cookie, false otherwise. + */ + private static function cookie_response_header_matches_name(string $headerstring, string $cookiename): bool { + // Generally match the format, but in a case-insensitive way so that 'set-cookie' and "SET-COOKIE" are both valid. + return preg_match("/Set-Cookie: *$cookiename=/i", $headerstring) + // Case-sensitive match on cookiename, which is case-sensitive. + && preg_match("/: *$cookiename=/", $headerstring); + } + + /** + * Check whether the header string is a 'Set-Cookie' header for the cookies identified in the $cookienames array. + * + * @param string $headerstring the header string to check. + * @param array $cookienames the array of cookie names to match. + * @return bool true if the header string is a Set-Cookie header for one of the named cookies, false otherwise. + */ + private static function cookie_response_header_matches_names(string $headerstring, array $cookienames): bool { + foreach ($cookienames as $cookiename) { + if (self::cookie_response_header_matches_name($headerstring, $cookiename)) { + return true; + } + } + return false; + } + + /** + * Check whether the header string contains the given attribute. + * + * @param string $headerstring the header string to check. + * @param string $attribute the attribute to check for. + * @param bool $casesensitive whether to perform a case-sensitive check. + * @return bool true if the header contains the attribute, false otherwise. + */ + private static function cookie_response_header_contains_attribute(string $headerstring, string $attribute, + bool $casesensitive): bool { + + if ($casesensitive) { + return str_contains($headerstring, $attribute); + } + return str_contains(strtolower($headerstring), strtolower($attribute)); + } + + /** + * Append the given attribute to the header string. + * + * @param string $headerstring the header string to append to. + * @param string $attribute the attribute to append. + * @return string the updated header string. + */ + private static function cookie_response_header_append_attribute(string $headerstring, string $attribute): string { + $headerstring = rtrim($headerstring, ';'); // Sometimes included. + return "$headerstring; $attribute;"; + } +} diff --git a/auth/lti/tests/local/ltiadvantage/utility/cookie_helper_test.php b/auth/lti/tests/local/ltiadvantage/utility/cookie_helper_test.php new file mode 100644 index 0000000000000..b7d79d79b3961 --- /dev/null +++ b/auth/lti/tests/local/ltiadvantage/utility/cookie_helper_test.php @@ -0,0 +1,215 @@ +. + +namespace auth_lti\local\ltiadvantage\utility; + +/** + * Tests for the cookie_helper utility class. + * + * @package auth_lti + * @copyright 2024 Jake Dallimore + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @covers \auth_lti\local\ltiadvantage\utility\cookie_helper + */ +class cookie_helper_test extends \advanced_testcase { + + /** + * Testing cookie_response_headers_add_attributes(). + * + * @dataProvider cookie_response_headers_provider + * + * @param array $headers the headers to search + * @param array $cookienames the cookienames to match + * @param array $attributes the attributes to add + * @param bool $casesensitive whether to do a case-sensitive lookup for the attribute + * @param array $expectedheaders the expected, updated headers + * @return void + */ + public function test_cookie_response_headers_add_attributes(array $headers, array $cookienames, array $attributes, + bool $casesensitive, array $expectedheaders): void { + + $updated = cookie_helper::cookie_response_headers_add_attributes($headers, $cookienames, $attributes, $casesensitive); + $this->assertEquals($expectedheaders, $updated); + } + + /** + * Data provider for testing cookie_response_headers_add_attributes(). + * + * @return array the inputs and expected outputs. + */ + public static function cookie_response_headers_provider(): array { + return [ + 'Only one matching cookie header, without any of the attributes' => [ + 'headers' => [ + 'Set-Cookie: testcookie=value; path=/test/; HttpOnly;', + ], + 'cookienames' => [ + 'testcookie', + ], + 'attributes' => [ + 'Partitioned', + 'SameSite=None', + 'Secure', + ], + 'casesensitive' => false, + 'output' => [ + 'Set-Cookie: testcookie=value; path=/test/; HttpOnly; Partitioned; SameSite=None; Secure;', + ], + ], + 'Several matching cookie headers, without attributes' => [ + 'headers' => [ + 'Set-Cookie: testcookie=value; path=/test/; HttpOnly;', + 'Set-Cookie: mytestcookie=value; path=/test/; HttpOnly;', + ], + 'cookienames' => [ + 'testcookie', + 'mytestcookie', + ], + 'attributes' => [ + 'Partitioned', + 'SameSite=None', + 'Secure', + ], + 'casesensitive' => false, + 'output' => [ + 'Set-Cookie: testcookie=value; path=/test/; HttpOnly; Partitioned; SameSite=None; Secure;', + 'Set-Cookie: mytestcookie=value; path=/test/; HttpOnly; Partitioned; SameSite=None; Secure;', + ], + ], + 'Several matching cookie headers, several non-matching, all missing all attributes' => [ + 'headers' => [ + 'Set-Cookie: testcookie=value; path=/test/; HttpOnly;', + 'Set-Cookie: mytestcookie=value; path=/test/; HttpOnly;', + 'Set-Cookie: anothertestcookie=value; path=/test/; HttpOnly;', + ], + 'cookienames' => [ + 'testcookie', + 'mytestcookie', + 'blah', + 'etc', + ], + 'attributes' => [ + 'Partitioned', + 'SameSite=None', + 'Secure', + ], + 'casesensitive' => false, + 'output' => [ + 'Set-Cookie: testcookie=value; path=/test/; HttpOnly; Partitioned; SameSite=None; Secure;', + 'Set-Cookie: mytestcookie=value; path=/test/; HttpOnly; Partitioned; SameSite=None; Secure;', + 'Set-Cookie: anothertestcookie=value; path=/test/; HttpOnly;', + ], + ], + 'Matching cookie headers, some with existing attributes' => [ + 'headers' => [ + 'Set-Cookie: testcookie=value; path=/test/; secure; HttpOnly; Partitioned; SameSite=None', + 'Set-Cookie: mytestcookie=value; path=/test/; secure; HttpOnly; SameSite=None', + ], + 'cookienames' => [ + 'testcookie', + 'mytestcookie', + 'etc', + ], + 'attributes' => [ + 'Partitioned', + 'SameSite=None', + 'Secure', + ], + 'casesensitive' => false, + 'output' => [ + 'Set-Cookie: testcookie=value; path=/test/; secure; HttpOnly; Partitioned; SameSite=None', + 'Set-Cookie: mytestcookie=value; path=/test/; secure; HttpOnly; SameSite=None; Partitioned;', + ], + ], + 'Matching headers, some with existing attributes, case sensitive' => [ + 'headers' => [ + 'Set-Cookie: testcookie=value; path=/test/; secure; HttpOnly; SameSite=None; partitioned', + 'Set-Cookie: mytestcookie=value; path=/test/; secure; HttpOnly; SameSite=None', + ], + 'cookienames' => [ + 'testcookie', + 'mytestcookie', + 'etc', + ], + 'attributes' => [ + 'Partitioned', + 'SameSite=None', + 'Secure', + ], + 'casesensitive' => true, + 'output' => [ + 'Set-Cookie: testcookie=value; path=/test/; secure; HttpOnly; SameSite=None; partitioned; Partitioned; Secure;', + 'Set-Cookie: mytestcookie=value; path=/test/; secure; HttpOnly; SameSite=None; Partitioned; Secure;', + ], + ], + 'Empty list of cookie names to match, so unmodified inputs' => [ + 'headers' => [ + 'Set-Cookie: testcookie=value; path=/test/; secure; HttpOnly; SameSite=None; partitioned', + 'Set-Cookie: mytestcookie=value; path=/test/; secure; HttpOnly; SameSite=None', + ], + 'cookienames' => [], + 'attributes' => [ + 'Partitioned', + 'SameSite=None', + 'Secure', + ], + 'casesensitive' => false, + 'output' => [ + 'Set-Cookie: testcookie=value; path=/test/; secure; HttpOnly; SameSite=None; partitioned', + 'Set-Cookie: mytestcookie=value; path=/test/; secure; HttpOnly; SameSite=None', + ], + ], + 'Empty list of attributes to set, so unmodified inputs' => [ + 'headers' => [ + 'Set-Cookie: testcookie=value; path=/test/; secure; HttpOnly; SameSite=None; partitioned', + 'Set-Cookie: mytestcookie=value; path=/test/; secure; HttpOnly; SameSite=None', + ], + 'cookienames' => [ + 'testcookie', + 'mycookie', + ], + 'attributes' => [], + 'casesensitive' => false, + 'output' => [ + 'Set-Cookie: testcookie=value; path=/test/; secure; HttpOnly; SameSite=None; partitioned', + 'Set-Cookie: mytestcookie=value; path=/test/; secure; HttpOnly; SameSite=None', + ], + ], + 'Other HTTP headers, some matching Set-Cookie, some not' => [ + 'headers' => [ + 'Authorization: blah', + 'Set-Cookie: testcookie=value; path=/test/; secure; HttpOnly; SameSite=None; Partitioned', + 'Set-Cookie: mytestcookie=value; path=/test/; secure; HttpOnly; SameSite=None', + ], + 'cookienames' => [ + 'testcookie', + 'mytestcookie', + ], + 'attributes' => [ + 'Partitioned', + 'SameSite=None', + 'Secure', + ], + 'casesensitive' => false, + 'output' => [ + 'Authorization: blah', + 'Set-Cookie: testcookie=value; path=/test/; secure; HttpOnly; SameSite=None; Partitioned', + 'Set-Cookie: mytestcookie=value; path=/test/; secure; HttpOnly; SameSite=None; Partitioned;', + ], + ], + ]; + } +} From b293cb5da6ea87366e11492d8f1d99f5e04ac60d Mon Sep 17 00:00:00 2001 From: Jake Dallimore Date: Tue, 30 Jan 2024 12:14:45 +0800 Subject: [PATCH 40/51] MDL-80835 enrol_lti: add partitioning support to MoodleSession cookie Adds the property that is required by Chrome to opt-in to its 3rd party cookie partitioning solution, CHIPS. This specific change deals with the cookie that is set when the user is not yet auth'd with the site and is necessary to facilitate OIDC nonce retrieval and validation. --- enrol/lti/login.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/enrol/lti/login.php b/enrol/lti/login.php index 03fea0bdee3a2..bbb5037433537 100644 --- a/enrol/lti/login.php +++ b/enrol/lti/login.php @@ -26,6 +26,7 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ +use auth_lti\local\ltiadvantage\utility\cookie_helper; use enrol_lti\local\ltiadvantage\lib\lti_cookie; use enrol_lti\local\ltiadvantage\lib\issuer_database; use enrol_lti\local\ltiadvantage\lib\launch_cache_session; @@ -76,6 +77,19 @@ $_REQUEST['client_id'] = $_REQUEST['id']; } +// Before beginning the OIDC authentication, ensure the MoodleSession cookie can be used. Browser-specific steps may need to be +// taken to set cookies in 3rd party contexts. Skip the check if the user is already auth'd. This means that either cookies aren't +// an issue in the current browser/launch context. +if (!isloggedin()) { + cookie_helper::do_cookie_check(new moodle_url('/enrol/lti/login.php', [ + 'iss' => $iss, + 'login_hint' => $loginhint, + 'target_link_uri' => $targetlinkuri, + 'lti_message_hint' => $ltimessagehint, + 'client_id' => $_REQUEST['client_id'], + ])); +} + // Now, do the OIDC login. $redirecturl = LtiOidcLogin::new( new issuer_database(new application_registration_repository(), new deployment_repository()), From aea624fcb0229d40568850c9de808de2155d4beb Mon Sep 17 00:00:00 2001 From: Jake Dallimore Date: Wed, 14 Feb 2024 11:50:13 +0800 Subject: [PATCH 41/51] MDL-80835 enrol_lti: add cookies required notice to auth login endpoint This will be displayed if the cookie checks fail, which currently occurs in Safari only. --- enrol/lti/classes/output/renderer.php | 15 ++++++ enrol/lti/lang/en/enrol_lti.php | 4 ++ enrol/lti/login.php | 11 ++++ .../cookies_required_notice.mustache | 50 +++++++++++++++++++ 4 files changed, 80 insertions(+) create mode 100644 enrol/lti/templates/local/ltiadvantage/cookies_required_notice.mustache diff --git a/enrol/lti/classes/output/renderer.php b/enrol/lti/classes/output/renderer.php index 7c17e6e82affc..57e4427ce75b7 100644 --- a/enrol/lti/classes/output/renderer.php +++ b/enrol/lti/classes/output/renderer.php @@ -263,4 +263,19 @@ public function render_registration_view(int $registrationid, string $activetab return parent::render_from_template('enrol_lti/local/ltiadvantage/registration_view', $tcontext); } + + /** + * Render a warning, indicating to the user that cookies are require but couldn't be set. + * + * @return string the html. + */ + public function render_cookies_required_notice(): string { + $notification = new notification(get_string('cookiesarerequiredinfo', 'enrol_lti'), notification::NOTIFY_WARNING, false); + $tcontext = [ + 'heading' => get_string('cookiesarerequired', 'enrol_lti'), + 'notification' => $notification->export_for_template($this), + ]; + + return parent::render_from_template('enrol_lti/local/ltiadvantage/cookies_required_notice', $tcontext); + } } diff --git a/enrol/lti/lang/en/enrol_lti.php b/enrol/lti/lang/en/enrol_lti.php index dce5d50a21a07..64d282374c447 100644 --- a/enrol/lti/lang/en/enrol_lti.php +++ b/enrol/lti/lang/en/enrol_lti.php @@ -31,6 +31,10 @@ $string['addtogradebook'] = 'Add to gradebook'; $string['allowframeembedding'] = 'Note: It is recommended that the site administration setting \'Allow frame embedding\' is enabled, so that tools are displayed within a frame rather than in a new window.'; $string['authltimustbeenabled'] = 'Note: This plugin requires the LTI authentication plugin to be enabled too.'; +$string['cookiesarerequired'] = 'Cookies are blocked by your browser'; +$string['cookiesarerequiredinfo'] = 'This tool can\'t be launched because your browser seems to be blocking third-party cookies. +

+To use this tool, try changing your browser cookie settings or using a different browser.'; $string['copiedtoclipboard'] = '{$a} copied to clipboard'; $string['copytoclipboard'] = 'Copy to clipboard'; $string['couldnotestablishproxy'] = 'Could not establish proxy with consumer.'; diff --git a/enrol/lti/login.php b/enrol/lti/login.php index bbb5037433537..935be0fe351bd 100644 --- a/enrol/lti/login.php +++ b/enrol/lti/login.php @@ -88,6 +88,17 @@ 'lti_message_hint' => $ltimessagehint, 'client_id' => $_REQUEST['client_id'], ])); + if (!cookie_helper::cookies_supported()) { + global $OUTPUT, $PAGE; + $PAGE->set_context(context_system::instance()); + $PAGE->set_url(new moodle_url('/enrol/lti/login.php')); + $PAGE->set_pagelayout('popup'); + echo $OUTPUT->header(); + $renderer = $PAGE->get_renderer('enrol_lti'); + echo $renderer->render_cookies_required_notice(); + echo $OUTPUT->footer(); + die(); + } } // Now, do the OIDC login. diff --git a/enrol/lti/templates/local/ltiadvantage/cookies_required_notice.mustache b/enrol/lti/templates/local/ltiadvantage/cookies_required_notice.mustache new file mode 100644 index 0000000000000..2b14840d4af0e --- /dev/null +++ b/enrol/lti/templates/local/ltiadvantage/cookies_required_notice.mustache @@ -0,0 +1,50 @@ +{{! + 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 . +}} +{{! + @template enrol_lti/local/ltiadvantage/cookies_required_notice + + Displays a notice, reporting that cookies are required but couldn't be set. + + Classes required for JS: + * none + + Data attributes required for JS: + * none + + Context variables required for this template: + * heading + * notification + + Example context (json): + { + "heading": "Cookies are required", + "notification": { + "message": "You appear to be using an unsupported browser...", + "extraclasses": "", + "announce": true, + "closebutton": false, + "issuccess": false, + "isinfo": false, + "iswarning": true, + "iserror": false + } + } +}} +

{{heading}}

+{{#notification}} + {{> core/notification}} +{{/notification}} From 18e26b5abe41b5d615ca66699ff5f13fc7113150 Mon Sep 17 00:00:00 2001 From: Jake Dallimore Date: Tue, 30 Jan 2024 12:25:05 +0800 Subject: [PATCH 42/51] MDL-80835 auth_lti: add partitioning to post-auth MoodleSession cookie Adds the property that is required by Chrome to opt-in to its 3rd party cookie partitioning solution, CHIPS. This specific change to auth_lti is to ensure the MoodleSession Set-Cookie header resulting from complete_user_login() calls (in auth.php) have this property set. --- .../ltiadvantage/event/event_handler.php | 50 +++++++++++++++++++ auth/lti/db/events.php | 33 ++++++++++++ auth/lti/version.php | 2 +- 3 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 auth/lti/classes/local/ltiadvantage/event/event_handler.php create mode 100644 auth/lti/db/events.php diff --git a/auth/lti/classes/local/ltiadvantage/event/event_handler.php b/auth/lti/classes/local/ltiadvantage/event/event_handler.php new file mode 100644 index 0000000000000..a3817f7e46e24 --- /dev/null +++ b/auth/lti/classes/local/ltiadvantage/event/event_handler.php @@ -0,0 +1,50 @@ +. + +namespace auth_lti\local\ltiadvantage\event; + +use auth_lti\local\ltiadvantage\utility\cookie_helper; +use core\event\user_loggedin; + +/** + * Event handler for auth_lti. + * + * @package auth_lti + * @copyright 2024 Jake Dallimore + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class event_handler { + + /** + * Allows the plugin to augment Set-Cookie headers when the user_loggedin event is fired as part of complete_user_login() calls. + * + * @param user_loggedin $event the event + * @return void + */ + public static function handle_user_loggedin(user_loggedin $event): void { + // The event data isn't important here. The intent of this listener is to ensure that the MoodleSession cookie gets the + // 'Partitioned' attribute, when required - an opt-in flag needed to use Chrome's partitioning mechanism, CHIPS. During LTI + // auth, the auth class (auth/lti/auth.php) calls complete_user_login(), which generates a new session cookie as part of its + // login process. This handler makes sure that this new cookie is intercepted and partitioned, if needed. + if (cookie_helper::cookies_supported()) { + if (cookie_helper::get_cookies_supported_method() == cookie_helper::COOKIE_METHOD_EXPLICIT_PARTITIONING) { + global $CFG; + cookie_helper::add_attributes_to_cookie_response_header('MoodleSession' . $CFG->sessioncookie, + ['Partitioned', 'Secure']); + } + } + } +} diff --git a/auth/lti/db/events.php b/auth/lti/db/events.php new file mode 100644 index 0000000000000..19b4df8e3448f --- /dev/null +++ b/auth/lti/db/events.php @@ -0,0 +1,33 @@ +. + +/** + * LTI Auth plugin event handler definition. + * + * @package auth_lti + * @category event + * @copyright 2024 Jake Dallimore + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +$observers = [ + [ + 'eventname' => '\core\event\user_loggedin', + 'callback' => '\auth_lti\local\ltiadvantage\event\event_handler::handle_user_loggedin', + ], +]; diff --git a/auth/lti/version.php b/auth/lti/version.php index a36052b1299f9..a1ba6bc7189b3 100644 --- a/auth/lti/version.php +++ b/auth/lti/version.php @@ -24,6 +24,6 @@ defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2023100900; // The current plugin version (Date: YYYYMMDDXX). +$plugin->version = 2024020700; // The current plugin version (Date: YYYYMMDDXX). $plugin->requires = 2023100400; // Requires this Moodle version. $plugin->component = 'auth_lti'; // Full name of the plugin (used for diagnostics). From 35e82b9fad4ab0c579c4617da414aba3b59169e1 Mon Sep 17 00:00:00 2001 From: Jake Dallimore Date: Thu, 15 Feb 2024 12:17:29 +0800 Subject: [PATCH 43/51] MDL-80835 enrol_lti: add partitioning support for OIDC state cookie Adds the property that is required by Chrome to opt-in to its 3rd party cookie partitioning solution, CHIPS. This specific change ensures the 'state' cookie, used in the OIDC handshake, has partitioning support. This cookie can be partitioned unconditionally, since it's a cookie controlled by the library and one we don't expect to be set without partitioning elsewhere. --- enrol/lti/classes/local/ltiadvantage/lib/lti_cookie.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/enrol/lti/classes/local/ltiadvantage/lib/lti_cookie.php b/enrol/lti/classes/local/ltiadvantage/lib/lti_cookie.php index 1a6b11fe55246..585fdad252325 100644 --- a/enrol/lti/classes/local/ltiadvantage/lib/lti_cookie.php +++ b/enrol/lti/classes/local/ltiadvantage/lib/lti_cookie.php @@ -16,6 +16,7 @@ namespace enrol_lti\local\ltiadvantage\lib; +use auth_lti\local\ltiadvantage\utility\cookie_helper; use Packback\Lti1p3\Interfaces\ICookie; /** @@ -55,6 +56,9 @@ public function setCookie(string $name, string $value, int $exp = 3600, array $o setcookie($name, $value, array_merge($cookieoptions, $samesiteoptions, $options)); + // Necessary, since partitioned can't be set via setcookie yet. + cookie_helper::add_attributes_to_cookie_response_header($name, ['Partitioned']); + // Set a second fallback cookie in the event that "SameSite" is not supported. setcookie('LEGACY_'.$name, $value, array_merge($cookieoptions, $options)); } From 7e56b46abce22c550e42209e7e967c08e0350d65 Mon Sep 17 00:00:00 2001 From: Jake Dallimore Date: Thu, 15 Feb 2024 12:17:47 +0800 Subject: [PATCH 44/51] MDL-80835 auth_lti: fix bad cast breaking samesite LTI usage --- auth/lti/auth.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth/lti/auth.php b/auth/lti/auth.php index 0b60dfc24a9bf..c5e13fd5b459d 100644 --- a/auth/lti/auth.php +++ b/auth/lti/auth.php @@ -115,7 +115,7 @@ public function complete_login(array $launchdata, moodle_url $returnurl, int $pr if (isloggedin()) { // If a different user is currently logged in, authenticate the linked user instead. global $USER; - if ((int) $USER->id !== $user->id) { + if ($USER->id !== $user->id) { complete_user_login($user); } // If the linked user is already logged in, skip the call to complete_user_login() because this affects deep linking From 011619dbd3b3e287bc608adecfa05e3d51ec8105 Mon Sep 17 00:00:00 2001 From: Paul Holden Date: Mon, 9 Oct 2023 10:15:23 +0100 Subject: [PATCH 45/51] MDL-71734 lang: final removal of deprecated 400 strings. --- admin/tool/usertours/lang/en/deprecated.txt | 1 - .../tool/usertours/lang/en/tool_usertours.php | 3 --- auth/lti/lang/en/auth_lti.php | 3 --- auth/lti/lang/en/deprecated.txt | 1 - .../myoverview/lang/en/block_myoverview.php | 6 ----- blocks/myoverview/lang/en/deprecated.txt | 4 --- blocks/timeline/lang/en/block_timeline.php | 5 ---- blocks/timeline/lang/en/deprecated.txt | 3 --- lang/en/admin.php | 5 ---- lang/en/badges.php | 5 ---- lang/en/calendar.php | 5 ---- lang/en/competency.php | 2 -- lang/en/completion.php | 3 --- lang/en/contentbank.php | 3 --- lang/en/deprecated.txt | 27 ------------------- lang/en/enrol.php | 3 --- lang/en/grades.php | 6 ----- lang/en/message.php | 9 ------- lang/en/moodle.php | 5 ---- lang/en/question.php | 3 --- .../recordrtc/lang/en/atto_recordrtc.php | 4 --- .../plugins/recordrtc/lang/en/deprecated.txt | 2 -- lib/tests/string_manager_standard_test.php | 8 +++--- media/player/videojs/lang/en/deprecated.txt | 4 --- .../player/videojs/lang/en/media_videojs.php | 6 ----- mod/chat/lang/en/chat.php | 3 --- mod/chat/lang/en/deprecated.txt | 1 - mod/forum/lang/en/deprecated.txt | 6 ++++- mod/forum/lang/en/forum.php | 5 ---- mod/glossary/lang/en/deprecated.txt | 1 - mod/glossary/lang/en/glossary.php | 3 --- mod/page/lang/en/deprecated.txt | 2 -- mod/page/lang/en/page.php | 4 --- mod/quiz/lang/en/deprecated.txt | 6 ----- mod/quiz/lang/en/quiz.php | 8 ------ .../report/grading/lang/en/deprecated.txt | 7 ----- .../report/grading/lang/en/quiz_grading.php | 9 +------ mod/scorm/lang/en/deprecated.txt | 4 +-- mod/scorm/lang/en/scorm.php | 5 ---- mod/survey/lang/en/deprecated.txt | 3 --- mod/survey/lang/en/survey.php | 5 ---- report/security/lang/en/deprecated.txt | 4 --- report/security/lang/en/report_security.php | 6 ----- repository/dropbox/lang/en/deprecated.txt | 3 --- .../dropbox/lang/en/repository_dropbox.php | 5 ---- theme/boost/lang/en/deprecated.txt | 1 - theme/boost/lang/en/theme_boost.php | 3 --- 47 files changed, 11 insertions(+), 209 deletions(-) delete mode 100644 admin/tool/usertours/lang/en/deprecated.txt delete mode 100644 blocks/myoverview/lang/en/deprecated.txt delete mode 100644 blocks/timeline/lang/en/deprecated.txt delete mode 100644 lib/editor/atto/plugins/recordrtc/lang/en/deprecated.txt delete mode 100644 media/player/videojs/lang/en/deprecated.txt delete mode 100644 mod/chat/lang/en/deprecated.txt delete mode 100644 mod/page/lang/en/deprecated.txt delete mode 100644 mod/survey/lang/en/deprecated.txt delete mode 100644 report/security/lang/en/deprecated.txt delete mode 100644 repository/dropbox/lang/en/deprecated.txt diff --git a/admin/tool/usertours/lang/en/deprecated.txt b/admin/tool/usertours/lang/en/deprecated.txt deleted file mode 100644 index fc9dfbd183293..0000000000000 --- a/admin/tool/usertours/lang/en/deprecated.txt +++ /dev/null @@ -1 +0,0 @@ -previousstep,tool_usertours diff --git a/admin/tool/usertours/lang/en/tool_usertours.php b/admin/tool/usertours/lang/en/tool_usertours.php index 815806de4a9af..12e15dbac65d5 100644 --- a/admin/tool/usertours/lang/en/tool_usertours.php +++ b/admin/tool/usertours/lang/en/tool_usertours.php @@ -303,6 +303,3 @@ $string['tour_gradebook_tour_name'] = 'Gradebook Grader Report'; $string['tour_final_step_title'] = 'End of tour'; $string['tour_final_step_content'] = 'This is the end of your user tour. It won\'t show again unless you reset it using the link in the footer.'; - -// Deprecated since Moodle 4.0. -$string['previousstep'] = 'Previous'; diff --git a/auth/lti/lang/en/auth_lti.php b/auth/lti/lang/en/auth_lti.php index a20574fbcada4..3c4033d584cc4 100644 --- a/auth/lti/lang/en/auth_lti.php +++ b/auth/lti/lang/en/auth_lti.php @@ -52,8 +52,5 @@ $string['useexistingaccount'] = 'Use existing account'; $string['welcome'] = 'Welcome!'; -// Deprecated since Moodle 4.0. -$string['privacy:metadata'] = 'The LTI authentication plugin does not store any personal data.'; - // Deprecated since Moodle 4.4. $string['firstlaunchnoauthnotice'] = 'To link your existing account you must be logged in to the site. Please log in to the site in a new tab/window and then relaunch the tool here. For further information, see the documentation Publish as LTI tool.'; diff --git a/auth/lti/lang/en/deprecated.txt b/auth/lti/lang/en/deprecated.txt index f893c28f5dfb9..47d590ccfc685 100644 --- a/auth/lti/lang/en/deprecated.txt +++ b/auth/lti/lang/en/deprecated.txt @@ -1,2 +1 @@ -privacy:metadata,auth_lti firstlaunchnoauthnotice,auth_lti diff --git a/blocks/myoverview/lang/en/block_myoverview.php b/blocks/myoverview/lang/en/block_myoverview.php index 8536a60c8afe4..08be768497b6b 100644 --- a/blocks/myoverview/lang/en/block_myoverview.php +++ b/blocks/myoverview/lang/en/block_myoverview.php @@ -94,9 +94,3 @@ $string['zero_request_intro'] = 'Need help getting started? Check out the Moodle documentation or take your first steps with our Quickstart guide.'; $string['zero_nocourses_title'] = 'Create your first course'; $string['zero_nocourses_intro'] = 'Need help getting started? Check out the Moodle documentation or take your first steps with our Quickstart guide.'; - -// Deprecated since Moodle 4.0. -$string['clearsearch'] = "Clear search"; -$string['aria:lastaccessed'] = 'Sort courses by last accessed date'; -$string['aria:shortname'] = 'Sort courses by course short name'; -$string['aria:title'] = 'Sort courses by course name'; diff --git a/blocks/myoverview/lang/en/deprecated.txt b/blocks/myoverview/lang/en/deprecated.txt deleted file mode 100644 index 864e2de8f17a0..0000000000000 --- a/blocks/myoverview/lang/en/deprecated.txt +++ /dev/null @@ -1,4 +0,0 @@ -clearsearch,block_myoverview -aria:shortname,block_myoverview -aria:lastaccessed,block_myoverview -aria:title,block_myoverview diff --git a/blocks/timeline/lang/en/block_timeline.php b/blocks/timeline/lang/en/block_timeline.php index 8abe6f9423081..e10486d364053 100644 --- a/blocks/timeline/lang/en/block_timeline.php +++ b/blocks/timeline/lang/en/block_timeline.php @@ -48,8 +48,3 @@ $string['privacy:metadata:timelinesortpreference'] = 'The user sort preference for the timeline block.'; $string['privacy:metadata:timelinefilterpreference'] = 'The user day filter preference for the timeline block.'; $string['privacy:metadata:timelinelimitpreference'] = 'The user page limit preference for the timeline block.'; - -// Deprecated since Moodle 4.0. -$string['ariaeventlistpagelimit'] = 'Show {$a} activities per page'; -$string['ariaeventlistpaginationnavdates'] = 'Timeline activities pagination'; -$string['ariaeventlistpaginationnavcourses'] = 'Timeline activities for course {$a} pagination'; diff --git a/blocks/timeline/lang/en/deprecated.txt b/blocks/timeline/lang/en/deprecated.txt deleted file mode 100644 index 6c46d756af667..0000000000000 --- a/blocks/timeline/lang/en/deprecated.txt +++ /dev/null @@ -1,3 +0,0 @@ -ariaeventlistpagelimit,block_timeline -ariaeventlistpaginationnavdates,block_timeline -ariaeventlistpaginationnavcourses,block_timeline diff --git a/lang/en/admin.php b/lang/en/admin.php index d6d570dac53a6..0ce05488c4e05 100644 --- a/lang/en/admin.php +++ b/lang/en/admin.php @@ -1622,11 +1622,6 @@ $string['cacheapplication'] = 'Application cache'; $string['cacheapplicationhelp'] = 'Cached items are shared among all users and expire by a determined time to live (ttl).'; -// Deprecated since Moodle 4.0. -$string['coursepage'] = 'Course page'; -$string['mediapluginswf'] = 'Enable .swf filter'; -$string['mediapluginswfnote'] = 'As a default security measure, normal users should not be allowed to embed swf flash files.'; - // Deprecated since Moodle 4.1. $string['multilangforceold'] = 'Force old multilang syntax: <span> without the class="multilang" and <lang>'; diff --git a/lang/en/badges.php b/lang/en/badges.php index aa06edae44ea4..04f87eecc42eb 100644 --- a/lang/en/badges.php +++ b/lang/en/badges.php @@ -592,11 +592,6 @@ $string['year'] = 'Year(s)'; $string['includeauthdetails'] = "Include authentication details with the backpack"; -// Deprecated since Moodle 4.0. -$string['evidence'] = 'Evidence'; -$string['recipientdetails'] = 'Recipient details'; -$string['recipientidentificationproblem'] = 'Cannot find a recipient of this badge among the existing users.'; - // Deprecated since Moodle 4.3. $string['backpackemail'] = 'Email address'; $string['backpackemail_help'] = 'The email address associated with your backpack. While you are connected, any badges earned on this site will be associated with this email address.'; diff --git a/lang/en/calendar.php b/lang/en/calendar.php index 2239d62397343..22594ba74f2b8 100644 --- a/lang/en/calendar.php +++ b/lang/en/calendar.php @@ -283,8 +283,3 @@ $string['yesterday'] = 'Yesterday'; $string['youcandeleteallrepeats'] = 'This event is part of a repeating event series. You can delete this event only, or all {$a} events in the series at once.'; $string['yoursubscriptions'] = 'Imported calendars'; - -// Deprecated since Moodle 4.0. -$string['calendarurl'] = 'Calendar URL: {$a}'; -$string['importfrominstructions'] = 'Please provide either a URL to a remote calendar, or upload a file.'; -$string['monthlyview'] = 'Monthly view'; diff --git a/lang/en/competency.php b/lang/en/competency.php index 55fc9b76ff39a..0c1ca6e7c9966 100644 --- a/lang/en/competency.php +++ b/lang/en/competency.php @@ -201,5 +201,3 @@ $string['usercompetencystatus_waitingforreview'] = 'Waiting for review'; $string['userplans'] = 'Learning plans'; -// Deprecated since Moodle 4.0. -$string['invalidpersistenterror'] = 'Error: {$a}'; diff --git a/lang/en/completion.php b/lang/en/completion.php index 8d924d9f05911..5a148022ef59e 100644 --- a/lang/en/completion.php +++ b/lang/en/completion.php @@ -255,9 +255,6 @@ $string['xdays'] = '{$a} days'; $string['youmust'] = 'You must'; -// Deprecated since Moodle 4.0. -$string['yourprogress'] = 'Your progress'; - // Deprecated since Moodle 4.3. $string['editcoursecompletionsettings'] = 'Edit course completion settings'; $string['completiondefault'] = 'Default completion tracking'; diff --git a/lang/en/contentbank.php b/lang/en/contentbank.php index 06a010e09bc61..a5395a7804ac1 100644 --- a/lang/en/contentbank.php +++ b/lang/en/contentbank.php @@ -98,6 +98,3 @@ $string['visibilitysetpublic'] = 'Make public'; $string['visibilitysetunlisted'] = 'Make unlisted'; $string['visibilitytitleunlisted'] = '{$a} (Unlisted)'; - -// Deprecated since 4.0. -$string['close'] = 'Close'; diff --git a/lang/en/deprecated.txt b/lang/en/deprecated.txt index 79d40637f4ca5..e716cbf526e78 100644 --- a/lang/en/deprecated.txt +++ b/lang/en/deprecated.txt @@ -7,33 +7,6 @@ myprofile,core viewallmyentries,core_blog searchallavailablecourses_desc,core_admin search:mycourse,core_search -calendarurl,core_calendar -yourprogress,core_completion -importfrominstructions,core_calendar -proceedtocourse,core_enrol -coursepage,core_admin -invalidpersistenterror,core_competency -mediapluginswf,core_admin -mediapluginswfnote,core_admin -createuserandpass,core -supplyinfo,core -monthlyview,core_calendar -evidence,core_badges -recipientdetails,core_badges -recipientidentificationproblem,core_badges -navmethod,core_grades -dropdown,core_grades -tabs,core_grades -combo,core_grades -defaults,core_message -loggedin_help,core_message -loggedindescription,core_message -loggedoff_help,core_message -loggedoffdescription,core_message -sendingvia,core_message -sendingviawhen,core_message -close,core_contentbank -notflagged,core_question cannotswitcheditmodeon,core_error multilangforceold,core_admin nopermissionmove,core_question diff --git a/lang/en/enrol.php b/lang/en/enrol.php index f3243be8736d6..014e59d32c45c 100644 --- a/lang/en/enrol.php +++ b/lang/en/enrol.php @@ -171,6 +171,3 @@ $string['privacy:metadata:user_enrolments:userid'] = 'The ID of the user'; $string['youenrolledincourse'] = 'You are enrolled in the course.'; $string['youunenrolledfromcourse'] = 'You are unenrolled from the course "{$a}".'; - -// Deprecated since Moodle 4.0. -$string['proceedtocourse'] = 'Proceed to course content'; diff --git a/lang/en/grades.php b/lang/en/grades.php index 9649e94b6c9d4..4c7f7819a588c 100644 --- a/lang/en/grades.php +++ b/lang/en/grades.php @@ -892,12 +892,6 @@ $string['aria-toggledropdown'] = 'Toggle the following dropdown'; $string['aria:dropdowngrades'] = 'Grade items found'; -// Deprecated since Moodle 4.0. -$string['navmethod'] = 'Navigation method'; -$string['dropdown'] = 'Drop-down menu'; -$string['tabs'] = 'Tabs'; -$string['combo'] = 'Tabs and drop-down menu'; - // Deprecated since Moodle 4.2. $string['showanalysisicon'] = 'Show grade analysis icon'; $string['showanalysisicon_desc'] = 'Whether to show grade analysis icon by default. If the activity module supports it, the grade analysis icon links to a page with more detailed explanation of the grade and how it was obtained.'; diff --git a/lang/en/message.php b/lang/en/message.php index 967a2d60a6676..aac4d96aded41 100644 --- a/lang/en/message.php +++ b/lang/en/message.php @@ -274,12 +274,3 @@ $string['you'] = 'You:'; $string['youhaveblockeduser'] = 'You have blocked this user.'; $string['yourcontactrequestpending'] = 'Your contact request is pending with {$a}'; - -// Deprecated since Moodle 4.0. -$string['defaults'] = 'Defaults'; -$string['loggedin_help'] = 'Configure how you would like to receive notifications when you are logged into Moodle'; -$string['loggedindescription'] = 'When you are logged into Moodle'; -$string['loggedoff_help'] = 'Configure how you would like to receive notifications when you are not logged into Moodle'; -$string['loggedoffdescription'] = 'When you are not logged into Moodle'; -$string['sendingvia'] = 'Sending "{$a->provider}" via "{$a->processor}"'; -$string['sendingviawhen'] = 'Sending "{$a->provider}" via "{$a->processor}" when {$a->state}'; diff --git a/lang/en/moodle.php b/lang/en/moodle.php index 21bfc94f34d81..e800300a800dc 100644 --- a/lang/en/moodle.php +++ b/lang/en/moodle.php @@ -2459,11 +2459,6 @@ $string['zippingbackup'] = 'Zipping backup'; $string['deprecatedeventname'] = '{$a} (no longer in use)'; -// Deprecated since Moodle 4.0. -$string['createuserandpass'] = 'Choose your username and password'; -$string['descriptiona'] = 'Description: {$a}'; -$string['supplyinfo'] = 'More details'; - // Deprecated since Moodle 4.3. $string['clicktochangeinbrackets'] = '{$a} (Click to change)'; $string['modshowcmtitle'] = 'Show activity'; diff --git a/lang/en/question.php b/lang/en/question.php index cef4b112288c6..70f91188fb3ad 100644 --- a/lang/en/question.php +++ b/lang/en/question.php @@ -520,8 +520,5 @@ $string['versioninfolatest'] = 'Version {$a->version} (latest)'; $string['question_version'] = 'Question version'; -// Deprecated since Moodle 4.0. -$string['notflagged'] = 'Not flagged'; - // Deprecated since Moodle 4.1. $string['nopermissionmove'] = 'You don\'t have permission to move questions from here. You must save the question in this category or save it as a new question.'; diff --git a/lib/editor/atto/plugins/recordrtc/lang/en/atto_recordrtc.php b/lib/editor/atto/plugins/recordrtc/lang/en/atto_recordrtc.php index 56afcedc33767..8d7cd19080f77 100644 --- a/lib/editor/atto/plugins/recordrtc/lang/en/atto_recordrtc.php +++ b/lib/editor/atto/plugins/recordrtc/lang/en/atto_recordrtc.php @@ -78,7 +78,3 @@ $string['videobitrate'] = 'Video bitrate'; $string['videobitrate_desc'] = 'Quality of video recording (larger number means higher quality)'; $string['videortc'] = 'Record video'; - -// Deprecated since Moodle 4.0. -$string['timelimit'] = 'Time limit in seconds'; -$string['timelimit_desc'] = 'Maximum recording length allowed for the audio/video clips'; diff --git a/lib/editor/atto/plugins/recordrtc/lang/en/deprecated.txt b/lib/editor/atto/plugins/recordrtc/lang/en/deprecated.txt deleted file mode 100644 index c27b09f66838c..0000000000000 --- a/lib/editor/atto/plugins/recordrtc/lang/en/deprecated.txt +++ /dev/null @@ -1,2 +0,0 @@ -timelimit,atto_recordrtc -timelimit_desc,atto_recordrtc diff --git a/lib/tests/string_manager_standard_test.php b/lib/tests/string_manager_standard_test.php index 2e296bb46ca02..5f84cfee1a972 100644 --- a/lib/tests/string_manager_standard_test.php +++ b/lib/tests/string_manager_standard_test.php @@ -83,11 +83,11 @@ public function test_deprecated_strings() { $this->assertFalse($stringman->string_deprecated('hidden', 'grades')); // Check deprecated string, make sure to update once that chosen below is finally removed. - $this->assertTrue($stringman->string_deprecated('coursepage', 'core_admin')); - $this->assertTrue($stringman->string_exists('coursepage', 'core_admin')); + $this->assertTrue($stringman->string_deprecated('selectdevice', 'core_admin')); + $this->assertTrue($stringman->string_exists('selectdevice', 'core_admin')); $this->assertDebuggingNotCalled(); - $this->assertEquals('Course page', get_string('coursepage', 'core_admin')); - $this->assertDebuggingCalled('String [coursepage,core_admin] is deprecated. '. + $this->assertEquals('Select device', get_string('selectdevice', 'core_admin')); + $this->assertDebuggingCalled('String [selectdevice,core_admin] is deprecated. '. 'Either you should no longer be using that string, or the string has been incorrectly deprecated, in which case you should report this as a bug. '. 'Please refer to https://moodledev.io/general/projects/api/string-deprecation'); } diff --git a/media/player/videojs/lang/en/deprecated.txt b/media/player/videojs/lang/en/deprecated.txt deleted file mode 100644 index f3abc1bd83bb9..0000000000000 --- a/media/player/videojs/lang/en/deprecated.txt +++ /dev/null @@ -1,4 +0,0 @@ -configrtmp,media_videojs -configuseflash,media_videojs -rtmp,media_videojs -useflash,media_videojs diff --git a/media/player/videojs/lang/en/media_videojs.php b/media/player/videojs/lang/en/media_videojs.php index c608c2afe5709..35235c4635769 100644 --- a/media/player/videojs/lang/en/media_videojs.php +++ b/media/player/videojs/lang/en/media_videojs.php @@ -39,9 +39,3 @@ $string['videoextensions'] = 'Video file extensions'; $string['videocssclass'] = 'CSS class for video'; $string['youtube'] = 'YouTube videos'; - -// Deprecated since Moodle 4.0. -$string['configrtmp'] = 'If enabled, links that start with rtmp:// will be handled by the plugin, irrespective of whether the extension is enabled in the Video file extensions (videoextensions) setting. Flash fallback must be enabled for RTMP to work.'; -$string['configuseflash'] = 'Use Flash player if video format is not natively supported by the browser and/or natively by the VideoJS player. If enabled, VideoJS will be engaged for any file extension from the above list without browser check. Please note that Flash is not available in mobile browsers and discouraged in many desktop ones.'; -$string['rtmp'] = 'RTMP streams'; -$string['useflash'] = 'Use Flash fallback'; diff --git a/mod/chat/lang/en/chat.php b/mod/chat/lang/en/chat.php index 1cc170d5bd999..02a8ca0955c4d 100644 --- a/mod/chat/lang/en/chat.php +++ b/mod/chat/lang/en/chat.php @@ -175,6 +175,3 @@ * Beeps - You can send a sound to other participants by clicking the "beep" link next to their name. A useful shortcut to beep all the people in the chat at once is to type "beep all". * HTML - If you know some HTML code, you can use it in your text to do things like insert images, play sounds or create different coloured text'; $string['viewreport'] = 'Past sessions'; - -// Deprecated since Moodle 4.0. -$string['nextsession'] = 'Next scheduled session'; diff --git a/mod/chat/lang/en/deprecated.txt b/mod/chat/lang/en/deprecated.txt deleted file mode 100644 index 537cf2d30f1d7..0000000000000 --- a/mod/chat/lang/en/deprecated.txt +++ /dev/null @@ -1 +0,0 @@ -nextsession,mod_chat diff --git a/mod/forum/lang/en/deprecated.txt b/mod/forum/lang/en/deprecated.txt index 2c694a40b32e8..6684b4153be8c 100644 --- a/mod/forum/lang/en/deprecated.txt +++ b/mod/forum/lang/en/deprecated.txt @@ -1 +1,5 @@ -postmailinfolink,mod_forum +completionpostsgroup,mod_forum +completiondiscussionsgroup,mod_forum +completiondiscussionshelp,mod_forum +completionrepliesgroup,mod_forum +completionreplieshelp,mod_forum diff --git a/mod/forum/lang/en/forum.php b/mod/forum/lang/en/forum.php index 0273cc257d3b5..3ac6fc73ac293 100644 --- a/mod/forum/lang/en/forum.php +++ b/mod/forum/lang/en/forum.php @@ -792,11 +792,6 @@ $string['viewconversation'] = 'View discussion'; $string['viewgrades'] = 'View grades'; -// Deprecated since Moodle 4.0. -$string['postmailinfolink'] = 'This is a copy of a message posted in {$a->coursename}. - -To reply click on this link: {$a->replylink}'; - // Deprecated since Moodle 4.3. $string['completionpostsgroup'] = 'Require posts'; $string['completiondiscussionsgroup'] = 'Require discussions'; diff --git a/mod/glossary/lang/en/deprecated.txt b/mod/glossary/lang/en/deprecated.txt index 082184ce9b594..68e04c0abae87 100644 --- a/mod/glossary/lang/en/deprecated.txt +++ b/mod/glossary/lang/en/deprecated.txt @@ -1,2 +1 @@ -waitingapproval,mod_glossary completionentriesgroup,mod_glossary diff --git a/mod/glossary/lang/en/glossary.php b/mod/glossary/lang/en/glossary.php index eeec66f2cb999..5629fa8599507 100644 --- a/mod/glossary/lang/en/glossary.php +++ b/mod/glossary/lang/en/glossary.php @@ -339,8 +339,5 @@ $string['writtenby'] = 'by'; $string['youarenottheauthor'] = 'You are not the author of this comment, so you are not allowed to edit it.'; -// Deprecated since 4.0. -$string['waitingapproval'] = 'Waiting approval'; - // Deprecated since 4.3. $string['completionentriesgroup'] = 'Require entries'; diff --git a/mod/page/lang/en/deprecated.txt b/mod/page/lang/en/deprecated.txt deleted file mode 100644 index f591c2b101887..0000000000000 --- a/mod/page/lang/en/deprecated.txt +++ /dev/null @@ -1,2 +0,0 @@ -printheading,mod_page -printheadingexplain,mod_page diff --git a/mod/page/lang/en/page.php b/mod/page/lang/en/page.php index 3553ad2b2aaa1..8bff5f574d381 100644 --- a/mod/page/lang/en/page.php +++ b/mod/page/lang/en/page.php @@ -72,7 +72,3 @@ $string['printlastmodifiedexplain'] = 'Display last modified date below content?'; $string['privacy:metadata'] = 'The Page resource plugin does not store any personal data.'; $string['search:activity'] = 'Page'; - -// Deprecated since 4.0. -$string['printheading'] = 'Display page name'; -$string['printheadingexplain'] = 'Display page name above content?'; diff --git a/mod/quiz/lang/en/deprecated.txt b/mod/quiz/lang/en/deprecated.txt index e6e4750db23c5..07754e4fe633d 100644 --- a/mod/quiz/lang/en/deprecated.txt +++ b/mod/quiz/lang/en/deprecated.txt @@ -1,9 +1,3 @@ -completionpass,mod_quiz -completionpassdesc,mod_quiz -completionpass_help,mod_quiz -completiondetail:passgrade,mod_quiz -gradetopassnotset,mod_quiz -basicideasofquiz,mod_quiz completionminattemptsgroup,mod_quiz grade,mod_quiz timetaken,mod_quiz diff --git a/mod/quiz/lang/en/quiz.php b/mod/quiz/lang/en/quiz.php index d8b5b082bf657..579fd1c46ce27 100644 --- a/mod/quiz/lang/en/quiz.php +++ b/mod/quiz/lang/en/quiz.php @@ -1078,14 +1078,6 @@ $string['alwayslatest'] = 'Always latest'; $string['gobacktoquiz'] = 'Go back'; -// Deprecated since Moodle 4.0. -$string['completionpass'] = 'Require passing grade'; -$string['completionpassdesc'] = 'Student must achieve a passing grade to complete this activity'; -$string['completionpass_help'] = 'If enabled, this activity is considered complete when the student receives a pass grade (as specified in the Grade section of the quiz settings) or higher.'; -$string['completiondetail:passgrade'] = 'Receive a pass grade'; -$string['gradetopassnotset'] = 'This quiz does not yet have a grade to pass set. It may be set in the Grade section of the quiz settings.'; -$string['basicideasofquiz'] = 'The basic ideas of quiz-making'; - // Deprecated since Moodle 4.3. $string['completionminattemptsgroup'] = 'Require attempts'; diff --git a/mod/quiz/report/grading/lang/en/deprecated.txt b/mod/quiz/report/grading/lang/en/deprecated.txt index fa0c6258e67c6..018ae66be99ce 100644 --- a/mod/quiz/report/grading/lang/en/deprecated.txt +++ b/mod/quiz/report/grading/lang/en/deprecated.txt @@ -1,8 +1 @@ -bydate,quiz_grading -bystudentidnumber,quiz_grading -bystudentfirstname,quiz_grading -bystudentlastname,quiz_grading -gradingattemptwithidnumber,quiz_grading -orderattempts,quiz_grading -randomly,quiz_grading grade,quiz_grading diff --git a/mod/quiz/report/grading/lang/en/quiz_grading.php b/mod/quiz/report/grading/lang/en/quiz_grading.php index 67b9b49f8fad2..4b73324eddcc4 100644 --- a/mod/quiz/report/grading/lang/en/quiz_grading.php +++ b/mod/quiz/report/grading/lang/en/quiz_grading.php @@ -77,12 +77,5 @@ $string['unknownquestion'] = 'Unknown question'; $string['updategrade'] = 'update grades'; -// Deprecated since Moodle 4.0. -$string['bydate'] = 'By date'; -$string['bystudentidnumber'] = 'By student ID number'; -$string['bystudentfirstname'] = 'By student first name'; -$string['bystudentlastname'] = 'By student last name'; -$string['gradingattemptwithidnumber'] = 'Attempt number {$a->attempt} for {$a->fullname} ({$a->idnumber})'; -$string['orderattempts'] = 'Order attempts'; -$string['randomly'] = 'Randomly'; +// Deprecated since Moodle 4.4. $string['grade'] = 'grade'; diff --git a/mod/scorm/lang/en/deprecated.txt b/mod/scorm/lang/en/deprecated.txt index 016783b72d02f..161293a8cc27d 100644 --- a/mod/scorm/lang/en/deprecated.txt +++ b/mod/scorm/lang/en/deprecated.txt @@ -1,3 +1 @@ -info,mod_scorm -displayactivityname,mod_scorm -displayactivityname_help,mod_scorm +completionscorerequired_help,mod_scorm diff --git a/mod/scorm/lang/en/scorm.php b/mod/scorm/lang/en/scorm.php index d319063a3ce96..0f79d1fd0d741 100644 --- a/mod/scorm/lang/en/scorm.php +++ b/mod/scorm/lang/en/scorm.php @@ -456,10 +456,5 @@ $string['window'] = 'Window'; $string['youmustselectastatus'] = 'You must select a status to require'; -// Deprecated since Moodle 4.0. -$string['info'] = 'Info'; -$string['displayactivityname'] = 'Display activity name'; -$string['displayactivityname_help'] = 'Whether or not to display the activity name above the SCORM player.'; - // Deprecated since Moodle 4.3. $string['completionscorerequired_help'] = 'Enabling this setting will require a user to have at least the minimum score entered to be marked complete in this SCORM activity, as well as any other Activity Completion requirements.'; diff --git a/mod/survey/lang/en/deprecated.txt b/mod/survey/lang/en/deprecated.txt deleted file mode 100644 index 8eaa5cc031fef..0000000000000 --- a/mod/survey/lang/en/deprecated.txt +++ /dev/null @@ -1,3 +0,0 @@ -clicktocontinue,mod_survey -viewsurveyresponses,mod_survey -allquestions,mod_survey diff --git a/mod/survey/lang/en/survey.php b/mod/survey/lang/en/survey.php index cef6a930863b3..640b9150e2af8 100644 --- a/mod/survey/lang/en/survey.php +++ b/mod/survey/lang/en/survey.php @@ -281,8 +281,3 @@ $string['time'] = 'Time'; $string['notyetanswered'] = 'Not yet answered'; $string['allquestionrequireanswer'] = 'All questions are required and must be answered.'; - -// Deprecated since Moodle 4.0. -$string['clicktocontinue'] = 'Click here to continue'; -$string['viewsurveyresponses'] = 'View {$a} survey responses'; -$string['allquestions'] = 'All questions in order, all students'; diff --git a/report/security/lang/en/deprecated.txt b/report/security/lang/en/deprecated.txt deleted file mode 100644 index cc725afe39481..0000000000000 --- a/report/security/lang/en/deprecated.txt +++ /dev/null @@ -1,4 +0,0 @@ -check_mediafilterswf_details,report_security -check_mediafilterswf_error,report_security -check_mediafilterswf_name,report_security -check_mediafilterswf_ok,report_security diff --git a/report/security/lang/en/report_security.php b/report/security/lang/en/report_security.php index 43c92f87ef6b0..596e4c0c90dbf 100644 --- a/report/security/lang/en/report_security.php +++ b/report/security/lang/en/report_security.php @@ -144,9 +144,3 @@ $string['security:view'] = 'View security report'; $string['timewarning'] = 'Data processing may take a long time, please be patient...'; $string['privacy:metadata'] = 'The Security overview plugin does not store any personal data.'; - -// Deprecated since Moodle 4.0. -$string['check_mediafilterswf_details'] = '

Automatic swf embedding is very dangerous - any registered user may launch an XSS attack against other server users. Please disable it on production servers.

'; -$string['check_mediafilterswf_error'] = 'Flash media filter is enabled - this is very dangerous for the majority of servers.'; -$string['check_mediafilterswf_name'] = 'Enabled .swf media filter'; -$string['check_mediafilterswf_ok'] = 'Flash media filter is not enabled.'; diff --git a/repository/dropbox/lang/en/deprecated.txt b/repository/dropbox/lang/en/deprecated.txt deleted file mode 100644 index 2808d9f8722da..0000000000000 --- a/repository/dropbox/lang/en/deprecated.txt +++ /dev/null @@ -1,3 +0,0 @@ -apikey,repository_dropbox -secret,repository_dropbox -instruction,repository_dropbox diff --git a/repository/dropbox/lang/en/repository_dropbox.php b/repository/dropbox/lang/en/repository_dropbox.php index 79b185fa87c71..33399017436b3 100644 --- a/repository/dropbox/lang/en/repository_dropbox.php +++ b/repository/dropbox/lang/en/repository_dropbox.php @@ -37,8 +37,3 @@ $string['oauth2redirecturi'] = 'OAuth 2 Redirect URI'; $string['privacy:metadata:repository_dropbox'] = 'The Dropbox repository plugin does not store any personal data, but does transmit user data from Moodle to the remote system.'; $string['privacy:metadata:repository_dropbox:query'] = 'The Dropbox repository user search text query.'; - -// Deprecated since Moodle 4.0. -$string['apikey'] = 'Dropbox API key'; -$string['secret'] = 'Dropbox secret'; -$string['instruction'] = 'You can get your API Key and secret from Dropbox developers. When setting up your key please select "Full Dropbox" as the "Access level".'; \ No newline at end of file diff --git a/theme/boost/lang/en/deprecated.txt b/theme/boost/lang/en/deprecated.txt index 37e07310d8aaa..cff2d7cc7278b 100644 --- a/theme/boost/lang/en/deprecated.txt +++ b/theme/boost/lang/en/deprecated.txt @@ -1,4 +1,3 @@ -totop,theme_boost privacy:drawernavclosed,theme_boost privacy:drawernavopen,theme_boost currentinparentheses,theme_boost \ No newline at end of file diff --git a/theme/boost/lang/en/theme_boost.php b/theme/boost/lang/en/theme_boost.php index 0c9bcd19137b8..358f127b7a5c1 100644 --- a/theme/boost/lang/en/theme_boost.php +++ b/theme/boost/lang/en/theme_boost.php @@ -59,9 +59,6 @@ $string['privacy:drawerblockclosed'] = 'The current preference for the block drawer is closed.'; $string['privacy:drawerblockopen'] = 'The current preference for the block drawer is open.'; -// Deprecated since Moodle 4.0. -$string['totop'] = 'Go to top'; - // Deprecated since Moodle 4.1. $string['currentinparentheses'] = '(current)'; $string['privacy:drawernavclosed'] = 'The current preference for the navigation drawer is closed.'; From 7013339ce4f052563fb60c46045c743a43d9c908 Mon Sep 17 00:00:00 2001 From: "Eloy Lafuente (stronk7)" Date: Thu, 21 Mar 2024 10:46:01 +0100 Subject: [PATCH 46/51] MDL-81319 install: update the list of stale files for 4.4 --- lib/upgradelib.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/upgradelib.php b/lib/upgradelib.php index c2e1b17ac3e0d..6ebf38f193589 100644 --- a/lib/upgradelib.php +++ b/lib/upgradelib.php @@ -513,6 +513,13 @@ function upgrade_stale_php_files_present(): bool { global $CFG; $someexamplesofremovedfiles = [ + // Removed in 4.4. + '/README.txt', + '/lib/dataformatlib.php', + '/lib/horde/readme_moodle.txt', + '/lib/yui/src/formchangechecker/js/formchangechecker.js', + '/mod/forum/pix/monologo.png', + '/question/tests/behat/behat_question.php', // Removed in 4.3. '/badges/ajax.php', '/course/editdefaultcompletion.php', From e0a482e3b3108a5f3e46c335005d58214f335ed5 Mon Sep 17 00:00:00 2001 From: Amaia Anabitarte Date: Fri, 23 Feb 2024 12:32:34 +0100 Subject: [PATCH 47/51] MDL-81023 core_course: Move deprecated behat steps to course directory --- .../tests/behat/behat_course_deprecated.php | 117 ++++++++++++++++++ lib/tests/behat/behat_deprecated.php | 82 ------------ 2 files changed, 117 insertions(+), 82 deletions(-) create mode 100644 course/tests/behat/behat_course_deprecated.php diff --git a/course/tests/behat/behat_course_deprecated.php b/course/tests/behat/behat_course_deprecated.php new file mode 100644 index 0000000000000..f3612acd7910d --- /dev/null +++ b/course/tests/behat/behat_course_deprecated.php @@ -0,0 +1,117 @@ +. + +// NOTE: no MOODLE_INTERNAL test here, this file may be required by behat before including /config.php. + +require_once(__DIR__ . '/../../../lib/behat/behat_deprecated_base.php'); + +use Behat\Gherkin\Node\TableNode as TableNode; + +/** + * Steps definitions that are now deprecated and will be removed in the next releases. + * + * This file only contains the steps that previously were in the behat_*.php files in the SAME DIRECTORY. + * When deprecating steps from other components or plugins, create a behat_COMPONENT_deprecated.php + * file in the same directory where the steps were defined. + * + * @package core_course + * @category test + * @copyright 2024 Amaia Anabitarte + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class behat_course_deprecated extends behat_deprecated_base { + /** + * Opens the activity chooser and opens the activity/resource form page. Sections 0 and 1 are also allowed on frontpage. + * + * @Given /^I add a "(?P(?:[^"]|\\")*)" to section "(?P\d+)"$/ + * @param string $activity + * @param int $section + * @throws \Behat\Mink\Exception\ElementNotFoundException Thrown by behat_base::find + * @deprecated Since Moodle 4.4 + */ + public function i_add_to_section($activity, $section) { + $this->deprecated_message([ + 'behat_course::i_add_to_course_section', + 'behat_course::i_add_to_section_using_the_activity_chooser', + ]); + + $this->require_javascript('Please use the \'the following "activity" exists:\' data generator instead.'); + + if ($this->getSession()->getPage()->find('css', 'body#page-site-index') && (int)$section <= 1) { + // We are on the frontpage. + if ($section) { + // Section 1 represents the contents on the frontpage. + $sectionxpath = "//body[@id='page-site-index']" . + "/descendant::div[contains(concat(' ',normalize-space(@class),' '),' sitetopic ')]"; + } else { + // Section 0 represents "Site main menu" block. + $sectionxpath = "//*[contains(concat(' ',normalize-space(@class),' '),' block_site_main_menu ')]"; + } + } else { + // We are inside the course. + $sectionxpath = "//li[@id='section-" . $section . "']"; + } + + // Clicks add activity or resource section link. + $sectionnode = $this->find('xpath', $sectionxpath); + $this->execute('behat_general::i_click_on_in_the', [ + "//button[@data-action='open-chooser' and not(@data-beforemod)]", + 'xpath', + $sectionnode, + 'NodeElement', + ]); + + // Clicks the selected activity if it exists. + $activityliteral = behat_context_helper::escape(ucfirst($activity)); + $activityxpath = "//div[contains(concat(' ', normalize-space(@class), ' '), ' modchooser ')]" . + "/descendant::div[contains(concat(' ', normalize-space(@class), ' '), ' optioninfo ')]" . + "/descendant::div[contains(concat(' ', normalize-space(@class), ' '), ' optionname ')]" . + "[normalize-space(.)=$activityliteral]" . + "/parent::a"; + + $this->execute('behat_general::i_click_on', [$activityxpath, 'xpath']); + } + + /** + * Adds the selected activity/resource filling the form data with the specified field/value pairs. + * + * Sections 0 and 1 are also allowed on frontpage. + * + * @When /^I add a "(?P(?:[^"]|\\")*)" to section "(?P\d+)" and I fill the form with:$/ + * @param string $activity The activity name + * @param int $section The section number + * @param TableNode $data The activity field/value data + * @deprecated Since Moodle 4.4 + */ + public function i_add_to_section_and_i_fill_the_form_with($activity, $section, TableNode $data) { + $this->deprecated_message(['behat_course::i_add_to_course_section_and_i_fill_the_form_with']); + + // Add activity to section. + $this->execute( + "behat_course::i_add_to_section", + [$this->escape($activity), $this->escape($section)] + ); + + // Wait to be redirected. + $this->execute('behat_general::wait_until_the_page_is_ready'); + + // Set form fields. + $this->execute("behat_forms::i_set_the_following_fields_to_these_values", $data); + + // Save course settings. + $this->execute("behat_forms::press_button", get_string('savechangesandreturntocourse')); + } +} diff --git a/lib/tests/behat/behat_deprecated.php b/lib/tests/behat/behat_deprecated.php index 62d655fe4685a..26adc0fa15658 100644 --- a/lib/tests/behat/behat_deprecated.php +++ b/lib/tests/behat/behat_deprecated.php @@ -17,7 +17,6 @@ // NOTE: no MOODLE_INTERNAL test here, this file may be required by behat before including /config.php. require_once(__DIR__ . '/../../../lib/behat/behat_deprecated_base.php'); -use Behat\Gherkin\Node\TableNode as TableNode; /** * Steps definitions that are now deprecated and will be removed in the next releases. @@ -32,85 +31,4 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class behat_deprecated extends behat_deprecated_base { - /** - * Opens the activity chooser and opens the activity/resource form page. Sections 0 and 1 are also allowed on frontpage. - * - * @Given /^I add a "(?P(?:[^"]|\\")*)" to section "(?P\d+)"$/ - * @throws \Behat\Mink\Exception\ElementNotFoundException Thrown by behat_base::find - * @param string $activity - * @param int $section - * @deprecated Since Moodle 4.4 - */ - public function i_add_to_section($activity, $section) { - $this->deprecated_message([ - 'behat_course::i_add_to_course_section', - 'behat_course::i_add_to_section_using_the_activity_chooser', - ]); - - $this->require_javascript('Please use the \'the following "activity" exists:\' data generator instead.'); - - if ($this->getSession()->getPage()->find('css', 'body#page-site-index') && (int) $section <= 1) { - // We are on the frontpage. - if ($section) { - // Section 1 represents the contents on the frontpage. - $sectionxpath = "//body[@id='page-site-index']" . - "/descendant::div[contains(concat(' ',normalize-space(@class),' '),' sitetopic ')]"; - } else { - // Section 0 represents "Site main menu" block. - $sectionxpath = "//*[contains(concat(' ',normalize-space(@class),' '),' block_site_main_menu ')]"; - } - } else { - // We are inside the course. - $sectionxpath = "//li[@id='section-" . $section . "']"; - } - - // Clicks add activity or resource section link. - $sectionnode = $this->find('xpath', $sectionxpath); - $this->execute('behat_general::i_click_on_in_the', [ - "//button[@data-action='open-chooser' and not(@data-beforemod)]", - 'xpath', - $sectionnode, - 'NodeElement', - ]); - - // Clicks the selected activity if it exists. - $activityliteral = behat_context_helper::escape(ucfirst($activity)); - $activityxpath = "//div[contains(concat(' ', normalize-space(@class), ' '), ' modchooser ')]" . - "/descendant::div[contains(concat(' ', normalize-space(@class), ' '), ' optioninfo ')]" . - "/descendant::div[contains(concat(' ', normalize-space(@class), ' '), ' optionname ')]" . - "[normalize-space(.)=$activityliteral]" . - "/parent::a"; - - $this->execute('behat_general::i_click_on', [$activityxpath, 'xpath']); - } - - /** - * Adds the selected activity/resource filling the form data with the specified field/value pairs. - * - * Sections 0 and 1 are also allowed on frontpage. - * - * @When /^I add a "(?P(?:[^"]|\\")*)" to section "(?P\d+)" and I fill the form with:$/ - * @param string $activity The activity name - * @param int $section The section number - * @param TableNode $data The activity field/value data - * @deprecated Since Moodle 4.4 - */ - public function i_add_to_section_and_i_fill_the_form_with($activity, $section, TableNode $data) { - $this->deprecated_message(['behat_course::i_add_to_course_section_and_i_fill_the_form_with']); - - // Add activity to section. - $this->execute( - "behat_course::i_add_to_section", - [$this->escape($activity), $this->escape($section)] - ); - - // Wait to be redirected. - $this->execute('behat_general::wait_until_the_page_is_ready'); - - // Set form fields. - $this->execute("behat_forms::i_set_the_following_fields_to_these_values", $data); - - // Save course settings. - $this->execute("behat_forms::press_button", get_string('savechangesandreturntocourse')); - } } From fbfcb6733daa50b66892f5d4f88e17703ad8013b Mon Sep 17 00:00:00 2001 From: Paul Holden Date: Thu, 23 Nov 2023 14:41:15 +0000 Subject: [PATCH 48/51] MDL-80245 reportbuilder: implement interface elements for report tags. Allow them to be edited during report creation/updating, display in report listings table with filtering, and implement tag callback to allow them to be discoverable across the site. --- lang/en/reportbuilder.php | 1 + reportbuilder/classes/form/report.php | 10 ++- .../local/systemreports/reports_list.php | 50 ++++++++++++ reportbuilder/lib.php | 57 ++++++++++++++ .../tests/behat/customreports.feature | 35 +++++++-- .../system_report_data_exporter_test.php | 14 +++- .../external/systemreports/retrieve_test.php | 14 +++- reportbuilder/tests/lib_test.php | 78 +++++++++++++++++++ 8 files changed, 246 insertions(+), 13 deletions(-) create mode 100644 reportbuilder/tests/lib_test.php diff --git a/lang/en/reportbuilder.php b/lang/en/reportbuilder.php index 4c2e6adbfe67f..2ba2d394d87f4 100644 --- a/lang/en/reportbuilder.php +++ b/lang/en/reportbuilder.php @@ -81,6 +81,7 @@ $string['courseshortnamewithlink'] = 'Course short name with link'; $string['courseselect'] = 'Select course'; $string['customfieldcolumn'] = '{$a}'; +$string['customreport'] = 'Custom report'; $string['customreports'] = 'Custom reports'; $string['customreportslimit'] = 'Custom reports limit'; $string['customreportslimit_desc'] = 'The number of custom reports may be limited for performance reasons. If set to zero, then there is no limit.'; diff --git a/reportbuilder/classes/form/report.php b/reportbuilder/classes/form/report.php index 2bf6c569db5c8..8d70cea038987 100644 --- a/reportbuilder/classes/form/report.php +++ b/reportbuilder/classes/form/report.php @@ -26,6 +26,7 @@ use core_reportbuilder\datasource; use core_reportbuilder\manager; use core_reportbuilder\local\helpers\report as reporthelper; +use core_tag_tag; defined('MOODLE_INTERNAL') || die(); @@ -114,6 +115,10 @@ public function definition() { $mform->addElement('advcheckbox', 'uniquerows', get_string('uniquerows', 'core_reportbuilder')); $mform->addHelpButton('uniquerows', 'uniquerows', 'core_reportbuilder'); + + $mform->addElement('tags', 'tags', get_string('tags'), [ + 'component' => 'core_reportbuilder', 'itemtype' => 'reportbuilder_report', + ]); } /** @@ -137,8 +142,9 @@ public function process_dynamic_submission() { * Load in existing data as form defaults */ public function set_data_for_dynamic_submission(): void { - if ($report = $this->get_custom_report()) { - $this->set_data($report->get_report_persistent()->to_record()); + if ($persistent = $this->get_custom_report()?->get_report_persistent()) { + $tags = core_tag_tag::get_item_tags_array('core_reportbuilder', 'reportbuilder_report', $persistent->get('id')); + $this->set_data(array_merge((array) $persistent->to_record(), ['tags' => $tags])); } } diff --git a/reportbuilder/classes/local/systemreports/reports_list.php b/reportbuilder/classes/local/systemreports/reports_list.php index b588a89943da6..ba726e7180166 100644 --- a/reportbuilder/classes/local/systemreports/reports_list.php +++ b/reportbuilder/classes/local/systemreports/reports_list.php @@ -28,6 +28,7 @@ use core_reportbuilder\system_report; use core_reportbuilder\local\entities\user; use core_reportbuilder\local\filters\date; +use core_reportbuilder\local\filters\tags; use core_reportbuilder\local\filters\text; use core_reportbuilder\local\filters\select; use core_reportbuilder\local\helpers\audience; @@ -38,6 +39,7 @@ use core_reportbuilder\output\report_name_editable; use core_reportbuilder\local\models\report; use core_reportbuilder\permission; +use core_tag_tag; /** * Reports list @@ -113,6 +115,8 @@ public function get_row_class(stdClass $row): string { * Add columns to report */ protected function add_columns(): void { + global $DB; + $tablealias = $this->get_main_table_alias(); // Report name column. @@ -158,6 +162,37 @@ protected function add_columns(): void { }) ); + // Tags column. TODO: Reuse tag entity column when MDL-76392 is integrated. + $tagfieldconcatsql = $DB->sql_group_concat( + field: $DB->sql_concat_join("'|'", ['t.name', 't.rawname']), + sort: 't.name', + ); + $this->add_column((new column( + 'tags', + new lang_string('tags'), + $this->get_report_entity_name(), + )) + ->set_type(column::TYPE_TEXT) + ->add_field("( + SELECT {$tagfieldconcatsql} + FROM {tag_instance} ti + JOIN {tag} t ON t.id = ti.tagid + WHERE ti.component = 'core_reportbuilder' AND ti.itemtype = 'reportbuilder_report' + AND ti.itemid = {$tablealias}.id + )", 'tags') + ->set_is_sortable(true) + ->set_is_available(core_tag_tag::is_enabled('core_reportbuilder', 'reportbuilder_report')) + ->add_callback(static function(?string $tags): string { + return implode(', ', array_map(static function(string $tag): string { + [$name, $rawname] = explode('|', $tag); + return core_tag_tag::make_display_name((object) [ + 'name' => $name, + 'rawname' => $rawname, + ]); + }, preg_split('/, /', (string) $tags, -1, PREG_SPLIT_NO_EMPTY))); + }) + ); + // Time created column. $this->add_column((new column( 'timecreated', @@ -218,6 +253,21 @@ protected function add_filters(): void { }) ); + // Tags filter. + $this->add_filter((new filter( + tags::class, + 'tags', + new lang_string('tags'), + $this->get_report_entity_name(), + "{$tablealias}.id", + )) + ->set_options([ + 'component' => 'core_reportbuilder', + 'itemtype' => 'reportbuilder_report', + ]) + ->set_is_available(core_tag_tag::is_enabled('core_reportbuilder', 'reportbuilder_report')) + ); + // Time created filter. $this->add_filter((new filter( date::class, diff --git a/reportbuilder/lib.php b/reportbuilder/lib.php index 4a0f575c1b42b..08c888b019570 100644 --- a/reportbuilder/lib.php +++ b/reportbuilder/lib.php @@ -27,6 +27,9 @@ use core\output\inplace_editable; use core_reportbuilder\form\audience; use core_reportbuilder\form\filter; +use core_reportbuilder\local\helpers\audience as audience_helper; +use core_reportbuilder\local\models\report; +use core_tag\output\{tagfeed, tagindex}; /** * Return the filters form fragment @@ -74,6 +77,60 @@ function core_reportbuilder_output_fragment_audience_form(array $params): string return $renderer->render_from_template('core_reportbuilder/local/audience/form', $context); } +/** + * Callback to return tagged reports + * + * @param core_tag_tag $tag + * @param bool $exclusivemode + * @param int|null $fromcontextid + * @param int|null $contextid + * @param bool $recurse + * @param int $page + * @return tagindex + */ +function core_reportbuilder_get_tagged_reports( + core_tag_tag $tag, + bool $exclusivemode = false, + ?int $fromcontextid = 0, + ?int $contextid = 0, + bool $recurse = true, + int $page = 0, +): tagindex { + global $OUTPUT; + + // Limit the returned list to those reports the current user can access. + [$where, $params] = audience_helper::user_reports_list_access_sql('it'); + + $tagcount = $tag->count_tagged_items('core_reportbuilder', 'reportbuilder_report', $where, $params); + $perpage = $exclusivemode ? 20 : 5; + $pagecount = ceil($tagcount / $perpage); + + $content = ''; + + if ($tagcount > 0) { + $tagfeed = new tagfeed(); + + $pixicon = new pix_icon('i/report', new lang_string('customreport', 'core_reportbuilder')); + + $reports = $tag->get_tagged_items('core_reportbuilder', 'reportbuilder_report', $page * $perpage, $perpage, + $where, $params); + foreach ($reports as $report) { + $tagfeed->add( + $OUTPUT->render($pixicon), + html_writer::link( + new moodle_url('/reportbuilder/view.php', ['id' => $report->id]), + (new report(0, $report))->get_formatted_name(), + ), + ); + } + + $content = $OUTPUT->render_from_template('core_tag/tagfeed', $tagfeed->export_for_template($OUTPUT)); + } + + return new tagindex($tag, 'core_reportbuilder', 'reportbuilder_report', $content, $exclusivemode, $fromcontextid, + $contextid, $recurse, $page, $pagecount); +} + /** * Plugin inplace editable implementation * diff --git a/reportbuilder/tests/behat/customreports.feature b/reportbuilder/tests/behat/customreports.feature index d69bdfe7edc16..3cccb734b08fd 100644 --- a/reportbuilder/tests/behat/customreports.feature +++ b/reportbuilder/tests/behat/customreports.feature @@ -92,8 +92,12 @@ Feature: Manage custom reports And I set the following fields in the "New report" "dialogue" to these values: | Name | Manager report | | Report source | Users | + | Tags | Cat, Dog | And I click on "Save" "button" in the "New report" "dialogue" And I click on "Close 'Manager report' editor" "button" + And the following should exist in the "Reports list" table: + | Name | Tags | Report source | + | Manager report | Cat, Dog | Users | # Manager can edit their own report, but not those of other users. And I set the field "Edit report name" in the "Manager report" "table_row" to "Manager report (renamed)" Then the "Edit report content" item should exist in the "Actions" action menu of the "Manager report (renamed)" "table_row" @@ -140,16 +144,18 @@ Feature: Manage custom reports When I press "Edit report details" action in the "My report" report row And I set the following fields in the "Edit report details" "dialogue" to these values: | Name | My renamed report | + | Tags | Cat, Dog | And I click on "Save" "button" in the "Edit report details" "dialogue" Then I should see "Report updated" And the following should exist in the "Reports list" table: - | Name | Report source | - | My renamed report | Users | + | Name | Tags | Report source | + | My renamed report | Cat, Dog | Users | Scenario Outline: Filter custom reports Given the following "core_reportbuilder > Reports" exist: - | name | source | - | My users | core_user\reportbuilder\datasource\users | + | name | source | tags | + | My users | core_user\reportbuilder\datasource\users | Cat, Dog | + | My courses | core_course\reportbuilder\datasource\courses | | And I log in as "admin" When I navigate to "Reports > Report builder > Custom reports" in site administration And I click on "Filters" "button" @@ -158,11 +164,30 @@ Feature: Manage custom reports | value | | And I click on "Apply" "button" in the "[data-region='report-filters']" "css_element" Then I should see "Filters applied" - And I should see "My users" in the "Reports list" "table" + And the following should exist in the "Reports list" table: + | Name | Tags | Report source | + | My users | Cat, Dog | Users | + And I should not see "My courses" in the "Reports list" "table" Examples: | filter | value | | Name | My users | | Report source | Users | + | Tags | Cat | + + Scenario: Custom report tags are not displayed if tagging is disabled + Given the following config values are set as admin: + | usetags | 0 | + And the following "core_reportbuilder > Reports" exist: + | name | source | + | My report | core_user\reportbuilder\datasource\users | + And I log in as "admin" + When I navigate to "Reports > Report builder > Custom reports" in site administration + Then the following should exist in the "Reports list" table: + | Name | Report source | + | My report | Users | + And "Tags" "link" should not exist in the "Reports list" "table" + And I click on "Filters" "button" + And "Tags" "core_reportbuilder > Filter" should not exist Scenario: Delete custom report Given the following "core_reportbuilder > Reports" exist: diff --git a/reportbuilder/tests/external/system_report_data_exporter_test.php b/reportbuilder/tests/external/system_report_data_exporter_test.php index 881a97bb213e5..637615c49f122 100644 --- a/reportbuilder/tests/external/system_report_data_exporter_test.php +++ b/reportbuilder/tests/external/system_report_data_exporter_test.php @@ -50,20 +50,28 @@ public function test_export(): void { // Two reports, created one second apart to ensure consistent ordering by time created. $generator->create_report(['name' => 'My first report', 'source' => users::class]); $this->waitForSecond(); - $generator->create_report(['name' => 'My second report', 'source' => users::class]); + $generator->create_report(['name' => 'My second report', 'source' => users::class, 'tags' => ['cat', 'dog']]); $reportinstance = system_report_factory::create(reports_list::class, system::instance()); $exporter = new system_report_data_exporter(null, ['report' => $reportinstance, 'page' => 0, 'perpage' => 1]); $export = $exporter->export($PAGE->get_renderer('core_reportbuilder')); - $this->assertEquals(['Name', 'Report source', 'Time created', 'Time modified', 'Modified by'], $export->headers); + $this->assertEquals([ + 'Name', + 'Report source', + 'Tags', + 'Time created', + 'Time modified', + 'Modified by', + ], $export->headers); $this->assertCount(1, $export->rows); - [$name, $source, $timecreated, $timemodified, $modifiedby] = $export->rows[0]['columns']; + [$name, $source, $tags, $timecreated, $timemodified, $modifiedby] = $export->rows[0]['columns']; $this->assertStringContainsString('My second report', $name); $this->assertEquals(users::get_name(), $source); + $this->assertEquals('cat, dog', $tags); $this->assertNotEmpty($timecreated); $this->assertNotEmpty($timemodified); $this->assertEquals('Admin User', $modifiedby); diff --git a/reportbuilder/tests/external/systemreports/retrieve_test.php b/reportbuilder/tests/external/systemreports/retrieve_test.php index 0b0d151d2a3d7..0a410ad6bf0d3 100644 --- a/reportbuilder/tests/external/systemreports/retrieve_test.php +++ b/reportbuilder/tests/external/systemreports/retrieve_test.php @@ -54,20 +54,28 @@ public function test_execute(): void { // Two reports, created one second apart to ensure consistent ordering by time created. $generator->create_report(['name' => 'My first report', 'source' => users::class]); $this->waitForSecond(); - $generator->create_report(['name' => 'My second report', 'source' => users::class]); + $generator->create_report(['name' => 'My second report', 'source' => users::class, 'tags' => ['cat', 'dog']]); // Retrieve paged results. $result = retrieve::execute(reports_list::class, ['contextid' => system::instance()->id], '', '', 0, [], 0, 1); $result = external_api::clean_returnvalue(retrieve::execute_returns(), $result); $this->assertArrayHasKey('data', $result); - $this->assertEquals(['Name', 'Report source', 'Time created', 'Time modified', 'Modified by'], $result['data']['headers']); + $this->assertEquals([ + 'Name', + 'Report source', + 'Tags', + 'Time created', + 'Time modified', + 'Modified by', + ], $result['data']['headers']); $this->assertCount(1, $result['data']['rows']); - [$name, $source, $timecreated, $timemodified, $modifiedby] = $result['data']['rows'][0]['columns']; + [$name, $source, $tags, $timecreated, $timemodified, $modifiedby] = $result['data']['rows'][0]['columns']; $this->assertStringContainsString('My second report', $name); $this->assertEquals(users::get_name(), $source); + $this->assertEquals('cat, dog', $tags); $this->assertNotEmpty($timecreated); $this->assertNotEmpty($timemodified); $this->assertEquals('Admin User', $modifiedby); diff --git a/reportbuilder/tests/lib_test.php b/reportbuilder/tests/lib_test.php new file mode 100644 index 0000000000000..1a01a14115733 --- /dev/null +++ b/reportbuilder/tests/lib_test.php @@ -0,0 +1,78 @@ +. + +declare(strict_types=1); + +namespace core_reportbuilder; + +use advanced_testcase; +use core_reportbuilder_generator; +use core_tag_tag; +use core_user\reportbuilder\datasource\users; + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; +require_once("{$CFG->dirroot}/reportbuilder/lib.php"); + +/** + * Unit tests for the component callbacks + * + * @package core_reportbuilder + * @copyright 2023 Paul Holden + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class lib_test extends advanced_testcase { + + /** + * Test getting tagged reports + * + * @covers ::core_reportbuilder_get_tagged_reports + */ + public function test_core_reportbuilder_get_tagged_reports(): void { + $this->resetAfterTest(); + + /** @var core_reportbuilder_generator $generator */ + $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); + + // Create three tagged reports. + $reportone = $generator->create_report(['name' => 'Report 1', 'source' => users::class, 'tags' => ['cat']]); + $reporttwo = $generator->create_report(['name' => 'Report 2', 'source' => users::class, 'tags' => ['dog']]); + $reportthree = $generator->create_report(['name' => 'Report 3', 'source' => users::class, 'tags' => ['cat']]); + + // Add all users audience to report one and two. + $generator->create_audience(['reportid' => $reportone->get('id'), 'configdata' => []]); + $generator->create_audience(['reportid' => $reporttwo->get('id'), 'configdata' => []]); + + $tag = core_tag_tag::get_by_name(0, 'cat'); + + // Current user can only access report one with "cat" tag. + $user = $this->getDataGenerator()->create_user(); + $this->setUser($user); + + $tagindex = core_reportbuilder_get_tagged_reports($tag); + $this->assertStringContainsString($reportone->get_formatted_name(), $tagindex->content); + $this->assertStringNotContainsString($reporttwo->get_formatted_name(), $tagindex->content); + $this->assertStringNotContainsString($reportthree->get_formatted_name(), $tagindex->content); + + // Admin can access both reports with "cat" tag. + $this->setAdminUser(); + $tagindex = core_reportbuilder_get_tagged_reports($tag); + $this->assertStringContainsString($reportone->get_formatted_name(), $tagindex->content); + $this->assertStringNotContainsString($reporttwo->get_formatted_name(), $tagindex->content); + $this->assertStringContainsString($reportthree->get_formatted_name(), $tagindex->content); + } +} From fa8213c3d7bee9e6af0e4dbc25822e1707ef5bbf Mon Sep 17 00:00:00 2001 From: Sara Arjona Date: Fri, 22 Mar 2024 14:03:38 +0100 Subject: [PATCH 49/51] NOBUG: Fixed SVG browser compatibility --- pix/i/cloudupload.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pix/i/cloudupload.svg b/pix/i/cloudupload.svg index 55e651ca02816..02efa9eeedb4b 100644 --- a/pix/i/cloudupload.svg +++ b/pix/i/cloudupload.svg @@ -1 +1 @@ - + From d0c545d2fb5df449e0269eec9ef02537776d297c Mon Sep 17 00:00:00 2001 From: Sara Arjona Date: Fri, 22 Mar 2024 14:03:42 +0100 Subject: [PATCH 50/51] NOBUG: Fixed file access permissions --- lib/htmlpurifier/HTMLPurifier/DefinitionCache/Serializer/README | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 lib/htmlpurifier/HTMLPurifier/DefinitionCache/Serializer/README diff --git a/lib/htmlpurifier/HTMLPurifier/DefinitionCache/Serializer/README b/lib/htmlpurifier/HTMLPurifier/DefinitionCache/Serializer/README old mode 100755 new mode 100644 From 342319339fe2963f4a66be7ede3f80ceb8955ae0 Mon Sep 17 00:00:00 2001 From: Sara Arjona Date: Fri, 22 Mar 2024 14:03:42 +0100 Subject: [PATCH 51/51] on-demand release 4.4dev+ --- version.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/version.php b/version.php index 45ff50e05d457..61e210cb0029f 100644 --- a/version.php +++ b/version.php @@ -29,9 +29,9 @@ defined('MOODLE_INTERNAL') || die(); -$version = 2024032000.01; // YYYYMMDD = weekly release date of this DEV branch. +$version = 2024032200.00; // YYYYMMDD = weekly release date of this DEV branch. // RR = release increments - 00 in DEV branches. // .XX = incremental changes. -$release = '4.4dev+ (Build: 20240320)'; // Human-friendly version name +$release = '4.4dev+ (Build: 20240322)'; // Human-friendly version name $branch = '404'; // This version's branch. $maturity = MATURITY_ALPHA; // This version's maturity level.