Compare commits

..

324 Commits

Author SHA1 Message Date
Eloy Lafuente (stronk7) 8634f2b672 Moodle release 3.8.4 2020-07-12 12:12:53 +02:00
AMOS bot 7ec2bf3776 Automatically generated installer lang files 2020-07-10 19:52:55 +00:00
Eloy Lafuente (stronk7) a6227d5675 weekly release 3.8.3+ 2020-07-10 20:22:15 +02:00
Eloy Lafuente (stronk7) e4d47ed2cc Merge branch 'install_38_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_38_STABLE 2020-07-10 20:22:09 +02:00
Jake Dallimore 4d069c9339 Merge branch 'MDL-69232-38' of git://github.com/andrewnicols/moodle into MOODLE_38_STABLE 2020-07-10 15:12:11 +08:00
Andrew Nicols 3e741db933 MDL-69232 behat: Simplify hooks
The behat hooks were needlessly complicated which made them much harder
to read, and understand, leading to bugs during development.

These have been significantly simplified to favour clarity over
overloading.
2020-07-10 08:40:30 +08:00
Andrew Nicols 90221b5ccf MDL-69232 behat: Make selenium start more fault tolerant
The session was previously only started once, but has now been moved to
restart between each test. Because of this the `$session->start()` is
now called more frequently which exposes a pre-existing issue whereby
Selenium will periodically fail to start.

When the session was only started at the beginning of the test, and at
occasional other times, it made sense to always stop the test runner
because it signified an issue with obtaining the session at all.

Since the session is restarted more frequently, and now between every
test, it no longer makes sense to do this. The test should only be
_stopped_ if the first attempt to obtain the Session fails. Once a
Session has been retrieved at least once it no longer makes sense to
assume that the failure was a configuration failure, but a connection
failure. Therefore subsequent tests should be attempted.
2020-07-10 08:40:29 +08:00
Jake Dallimore f2de1293e1 Merge branch 'MDL-69135-38' of git://github.com/andrewnicols/moodle into MOODLE_38_STABLE 2020-07-09 10:38:51 +08:00
Michael Hawkins ea79b6597a MDL-68426 theme: Set a limit on paths length in yui_combo
The maximum paths length is now consistent with the YUI loader.
This fix also removes any duplicate paths, so each file is only ever
fetched once.
2020-07-09 10:24:01 +08:00
Andrew Nicols 3b97a56c6a MDL-69232 behat: Add debugging information to Selenium fails 2020-07-09 09:45:35 +08:00
Andrew Nicols 07414b90e3 MDL-69232 behat: Move suite tests to BeforeSuite hook 2020-07-09 09:45:34 +08:00
Eloy Lafuente (stronk7) d49c18bba5 Merge branch 'MDL-69134-38' of git://github.com/andrewnicols/moodle into MOODLE_38_STABLE 2020-07-08 20:53:32 +02:00
Andrew Nicols ecc61a125b Merge branch 'MDL-68784-38' of https://github.com/Peterburnett/moodle into MOODLE_38_STABLE 2020-07-08 12:37:56 +08:00
Andrew Nicols d8538f29c4 Merge branch 'm38_MDL-66322_Travis_Run_Using_Docker_ExtTests' of https://github.com/scara/moodle into MOODLE_38_STABLE 2020-07-08 12:22:20 +08:00
Peter Burnett 881b487433 MDL-68784: Updated variable for graph report 2020-07-08 14:07:35 +10:00
Andrew Nicols e0c0a0c05c Merge branch 'MDL-60494-stray_img_end-38' of https://github.com/leonstr/moodle into MOODLE_38_STABLE 2020-07-08 09:25:11 +08:00
Andrew Nicols 246a03f7dd MDL-69134 competencies: Behat fails randomly opening dialogues 2020-07-08 09:21:54 +08:00
Andrew Nicols 44fd35e8ee Merge branch 'MDL-69109-38-2' of git://github.com/marinaglancy/moodle into MOODLE_38_STABLE 2020-07-08 08:41:07 +08:00
Matteo Scaramuccia a28a24e2f2 MDL-66322 travis: Configure a local copy of 'exttests' 2020-07-07 21:55:47 +02:00
Eloy Lafuente (stronk7) 3639dc845e Merge branch 'MDL-69086-38' of git://github.com/andrewnicols/moodle into MOODLE_38_STABLE 2020-07-07 19:17:29 +02:00
Eloy Lafuente (stronk7) d63c297351 Merge branch 'm38_MDL-68588_Hide_Backuptempdir_From_Message_And_Debuginfo' of https://github.com/scara/moodle into MOODLE_38_STABLE 2020-07-07 19:10:51 +02:00
Eloy Lafuente (stronk7) 54faefbefb Merge branch 'MDL-68784-38' of https://github.com/Peterburnett/moodle into MOODLE_38_STABLE 2020-07-07 18:52:36 +02:00
Víctor Déniz Falcón 735de9020e MDL-69093 enrol_manual: added check for allowed roles a user can assign 2020-07-07 08:33:18 +02:00
Andrew Nicols 71e5f30504 Merge branch 'MDL-69106-38' of git.in.moodle.com:cameron/moodle into MOODLE_38_STABLE 2020-07-07 14:16:48 +08:00
Eloy Lafuente (stronk7) 5b9c5ccf83 Merge branch 'MDL-60827-38' of git://github.com/mihailges/moodle into MOODLE_38_STABLE 2020-07-07 00:17:35 +02:00
Andrew Nicols 46b6ca69d1 Merge branch 'MDL-69158-38' of git://github.com/lucaboesch/moodle into MOODLE_38_STABLE 2020-07-06 12:12:47 +08:00
Jake Dallimore dbd41fa613 Merge branch 'MDL-69136-38' of git://github.com/andrewnicols/moodle into MOODLE_38_STABLE 2020-07-06 10:44:50 +08:00
Michael Hawkins 381f45d005 MDL-69129 report: Limit config changes report sort direction values 2020-07-06 10:11:39 +08:00
Mihail Geshoski 0397309abf MDL-60827 oauth2: Consider requireconfirmation setting on login 2020-07-06 10:05:50 +08:00
Michael Hawkins dca95c6fe4 MDL-69128 admin: Convert HTML entities when populating tasklogs filter 2020-07-06 10:05:05 +08:00
AMOS bot 112fc4d513 Automatically generated installer lang files 2020-07-06 00:08:36 +00:00
Leon Stringer 3b81550b8e MDL-60494 mod_lti: Invalid </img>, example context
<img> was followed by an invalid </img>.  Also added example context for
template so it passes CI checks.
2020-07-05 15:58:35 +01:00
Matteo Scaramuccia 0cf43f11f0 MDL-68588 Backup: Hide ->backuptempdir in exception info 2020-07-03 21:19:12 +02:00
Eloy Lafuente (stronk7) 035f5d9423 weekly release 3.8.3+ 2020-07-03 18:41:29 +02:00
Eloy Lafuente (stronk7) 1bae8bd482 Merge branch 'install_38_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_38_STABLE 2020-07-03 18:41:24 +02:00
Jake Dallimore 3bd1b121ed Merge branch 'MDL-69130-38-enfix' of git://github.com/mudrd8mz/moodle into MOODLE_38_STABLE 2020-07-02 12:08:53 +08:00
Jake Dallimore db58c4cdf2 Merge branch 'MDL-69149-38' of git://github.com/andrewnicols/moodle into MOODLE_38_STABLE 2020-07-02 11:57:34 +08:00
Jake Dallimore b730bb5702 Merge branch 'MDL-69122-38' of git://github.com/bmbrands/moodle into MOODLE_38_STABLE 2020-07-02 11:49:35 +08:00
AMOS bot d45a6dd3c3 Automatically generated installer lang files 2020-07-02 00:08:16 +00:00
Eloy Lafuente (stronk7) 0097d8d481 Merge branch 'MDL-69072-38' of git://github.com/andrewnicols/moodle into MOODLE_38_STABLE 2020-07-01 23:24:10 +02:00
Jake Dallimore ef6538a8c7 Merge branch 'MDL-68584-38' of git://github.com/lucaboesch/moodle into MOODLE_38_STABLE 2020-07-01 16:43:14 +08:00
Paul Holden fe65ebcf1c MDL-69150 message_airnotifier: correct apps portal link. 2020-07-01 08:39:59 +08:00
Paul Holden bc2d3e8bb9 MDL-69151 message_airnotifier: start output before accesskey request.
This allows debugging generated by the request to be shown on the
page.
2020-07-01 08:30:10 +08:00
Andrew Nicols d6ce289176 Merge branch 'MDL-67172-38' of git://github.com/cescobedo/moodle into MOODLE_38_STABLE 2020-07-01 07:47:53 +08:00
Marina Glancy d690ed3dd3 MDL-69109 theme: try to load icons from the current theme 2020-06-30 10:13:45 +02:00
Marina Glancy 704153c454 MDL-69109 core: use different cache keys for FA icon maps 2020-06-30 10:13:45 +02:00
Cameron Ball 37ee0fd966 MDL-69106 assignfeedback_editpdf: Keep files in conversion queue
In some circumstances, a submission waiting to be converted needs to persist
in the conversion queue so that it can be polled on subsequent cron runs.
2020-06-30 13:59:28 +08:00
Peter Burnett 58bf57d9d3 MDL-68784 scorm: Removed limit on allowed scorm users in report 2020-06-30 15:21:15 +10:00
Luca Bösch 71d4cc2f4e MDL-69158 block_blog_menu: format search form. 2020-06-29 11:13:46 +02:00
Andrew Nicols 913b96cb21 MDL-69136 behat: Improve reliability of navigation steps 2020-06-29 11:36:36 +08:00
Andrew Nicols 7c2fef6484 MDL-69136 behat: Support find on a NodeElement 2020-06-29 11:36:30 +08:00
Andrew Nicols 687c727cf9 MDL-69072 behat: Remove restart_browser_after feature
This is no longer required as the Mink session is restarted after every
test regardless.
2020-06-29 11:05:53 +08:00
Andrew Nicols ee6d899130 MDL-69072 mod_scorm: Stop mink reset after tests
This is now done for all scenarios. It is no longer necessary to do so
specifically for mod_scorm.
2020-06-26 21:17:22 +08:00
Andrew Nicols c18b08912f MDL-69072 behat: Relaunch browser session between scenarios 2020-06-26 21:17:22 +08:00
Andrew Nicols a46018529b MDL-69149 core_grade: Correct xpath attribute selector 2020-06-26 19:59:56 +08:00
Andrew Nicols 5ae95f265a MDL-69135 core_calendar: PendingJS for event filtering 2020-06-26 07:58:36 +08:00
Luca Bösch 456530205e MDL-68584 core_question: flexbox compatible separator for question types
* the br tag does not work well in a flexbox context, a 100% with div
works in both classic and boost.
2020-06-25 21:57:43 +02:00
cescobedo 6bfddeea21 MDL-67172 core_h5p: Prevent synchronous access to save the same h5p
Backport MDL-67095.
When deploying a new H5P resource we need to ensure that
we don't start deploying the same H5P in another thread
(e.g. for another session/user).
2020-06-25 18:42:40 +02:00
Eloy Lafuente (stronk7) 4557b7fed2 weekly release 3.8.3+ 2020-06-25 18:06:27 +02:00
Eloy Lafuente (stronk7) d93d8f65a8 Merge branch 'install_38_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_38_STABLE 2020-06-25 18:06:22 +02:00
Helen Foster 406d9bb40f MDL-69130 lang: Import fixed English strings (en_fix) 2020-06-25 14:30:09 +02:00
Bas Brands a66d07b15c MDL-69122 report_competency: fix clearfix
- a misplaced clearfix caused part of the recontrols to be
inaccessible
2020-06-24 09:15:39 +02:00
Jake Dallimore 44b19c47bf Merge branch 'MDL-68992-38_france_digital_age' of https://github.com/martignoni/moodle into MOODLE_38_STABLE 2020-06-24 09:40:52 +08:00
Eloy Lafuente (stronk7) 81b393a717 Merge branch 'MDL-66568-38-2' of git://github.com/andrewnicols/moodle into MOODLE_38_STABLE 2020-06-23 17:57:33 +02:00
Nicolas Martignoni 6fb0f6f941 MDL-68992 Privacy: Update default minimal digital age of consent
Updating default minimal digital age of consent according to current legislation,
that was updated for several countries since 2018.
2020-06-23 12:23:36 +02:00
Jake Dallimore 4d26e345d0 Merge branch 'MDL-69021-38' of git://github.com/bmbrands/moodle into MOODLE_38_STABLE 2020-06-23 11:31:48 +08:00
Adrian Greeve 1c8b779f27 Merge branch 'MDL-68841-3.8.3' of https://github.com/DinhHien0307/moodle into MOODLE_38_STABLE 2020-06-23 09:50:54 +08:00
Bas Brands a4099f2932 MDL-69021 theme_boost: improve link styles in alerts
- provide default styles for links in alerts if the .alert-link
css class is omitted.
2020-06-22 16:51:03 +02:00
Adrian Greeve 2557a7f8ff Merge branch 'MDL-69077_38' of https://github.com/timhunt/moodle into MOODLE_38_STABLE 2020-06-22 10:42:49 +08:00
AMOS bot 9518c81ab8 Automatically generated installer lang files 2020-06-21 00:07:28 +00:00
Sara Arjona befe7cce8d Merge branch 'MDL-69008-38' of git://github.com/junpataleta/moodle into MOODLE_38_STABLE 2020-06-19 16:49:29 +02:00
Andrew Nicols 2dc698fb17 MDL-69086 theme_boost: Improve pendingJs checks for bootstrap
Where an element, like an `alert`, is closed it is removed from the DOM
before the event fires (this is a correct behaviour).

This means that the final event confirming that the action happened
(i.e. close => closed) fires, but does not bubble up the DOM to the
document.body.

This change moves the end event listener to only be added after a start
event has been fired, and to attach directly to the HTMLElement where it
will be fired. This means that the Event handler will still be called,
even though it has been removed from the DOM, because it does not need
to bubble up to the body.
2020-06-19 08:17:45 +08:00
Sara Arjona 898415efec weekly release 3.8.3+ 2020-06-18 14:13:55 +02:00
Sara Arjona 5b5233321e Merge branch 'install_38_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_38_STABLE 2020-06-18 14:13:53 +02:00
Victor Deniz Falcon 4d4ad0fe60 Merge branch 'MDL-66899-log-quiz-regrade_38' of https://github.com/rboyatt/moodle into MOODLE_38_STABLE 2020-06-18 04:55:12 +01:00
Tim Hunt 8fcb1b459d MDL-69077 questions: question tag capabilties are relevant 2020-06-17 13:07:45 +01:00
Jun Pataleta 8816107de4 Merge branch 'MDL-68890-3.8.3' of https://github.com/DinhHien0307/moodle into MOODLE_38_STABLE 2020-06-17 19:54:19 +08:00
Jun Pataleta 42cf09b5b4 MDL-69008 core: Fix accessibility issues in paged content templates
* Added menuitem role for the "Show x per page" menu.
* Added appropriate aria-labels for the links in the paging bar.
2020-06-17 15:59:57 +08:00
Jake Dallimore 408c793ed7 Merge branch 'MDL-68215-38' of git://github.com/lucaboesch/moodle into MOODLE_38_STABLE 2020-06-17 14:59:02 +08:00
Jun Pataleta 6324b63372 Merge branch 'MDL-68971_38' of https://github.com/timhunt/moodle into MOODLE_38_STABLE 2020-06-17 11:35:01 +08:00
Jun Pataleta 3c91dc0784 Merge branch 'MDL-67294-38' of git://github.com/mihailges/moodle into MOODLE_38_STABLE 2020-06-17 10:34:06 +08:00
Andrew Nicols 4d3658f7d8 MDL-66568 behat: Reset theme CSS between scenarios 2020-06-17 07:51:47 +08:00
Andrew Nicols bcbc91091c MDL-66568 behat: Support building of themes for behat 2020-06-17 07:51:47 +08:00
Andrew Nicols d57acc9d80 MDL-66568 core_output: Return built theme CSS 2020-06-17 07:51:47 +08:00
Mihail Geshoski bc125390bb MDL-67294 assignsubmission_file: Make sure record exists before updating 2020-06-17 00:55:57 +08:00
Víctor Déniz Falcón f097a1a20f Merge branch 'MDL-69049-38' of git://github.com/junpataleta/moodle into MOODLE_38_STABLE 2020-06-16 17:52:32 +01:00
Jun Pataleta adc032b170 Merge branch 'MDL-68436_38' of https://github.com/timhunt/moodle into MOODLE_38_STABLE 2020-06-16 14:39:02 +08:00
Jun Pataleta 6c8f7e1ce2 MDL-69049 tool_dataprivacy: Add possibly missing comment format columns
The earlier CONTRIB plugin versions of the tool (<33.2.0, <34.2.0) were
missing the following columns in the data requests table:
* commentsformat
* dpocommentformat
And the upgrade scripts for the merged tool failed in
Moodle 3.3.8+/3.3.0+ failed to add these columns.
So a site which uses the CONTRIB plugin and eventually upgrading to 3.9
will encounter an error during upgrade because of the missing
dpocommentformat column.
2020-06-15 23:42:10 +08:00
Luca Bösch 8cb7cb1fdc MDL-68215 block_activity_result: Format elements more nicely. 2020-06-15 15:25:28 +02:00
hiendinh 5f6ce419c4 MDL-68890 progressbar: prevent display exist file's progress bar 2020-06-15 10:53:12 +07:00
AMOS bot 74235813b3 Automatically generated installer lang files 2020-06-14 00:07:26 +00:00
Sara Arjona 409baab766 weekly release 3.8.3+ 2020-06-11 18:03:58 +02:00
Andrew Nicols ee884c9728 Merge branch 'MDL-69006-38' of git://github.com/bmbrands/moodle into MOODLE_38_STABLE 2020-06-11 13:05:39 +08:00
Andrew Nicols c6a9898ed0 Merge branch 'MDL-69002-38' of git://github.com/sarjona/moodle into MOODLE_38_STABLE 2020-06-11 11:21:16 +08:00
Adrian Greeve 80c3dcb8bf MDL-66601 atto_image: Remove bad build files. 2020-06-11 10:48:36 +08:00
Adrian Greeve 3c142d923f Merge branch 'MDL-66601-38' of git://github.com/mihailges/moodle into MOODLE_38_STABLE 2020-06-11 09:55:51 +08:00
Eloy Lafuente (stronk7) 53e4c04237 Merge branch 'MDL-68954-38' of git://github.com/mihailges/moodle into MOODLE_38_STABLE 2020-06-11 00:10:28 +02:00
Bas Brands 8cf375b627 MDL-69006 repository_flickr: flickr authentication fails
- Flickr does not like useragents including the word "Bot"
2020-06-10 15:56:27 +02:00
Tim Hunt 5e7c083dba MDL-68436 atto_recordrtc: only works once per page 2020-06-10 13:48:12 +01:00
Sara Arjona 7d896212f2 MDL-69002 core_badges: move backpack validation to a separate page
Instead of running the site backpack validation every time badges/backpacks.php
page is loaded, an action button has been added to the backpacks with OB set
to 2.0 to let admins running manually this verification when needed.
2020-06-10 13:01:29 +02:00
Sara Arjona 3a6950ccd7 MDL-69002 core_badges: add methods to support backpack validation
A more generic method has been added to the API to validate the
backpack connection (for now, there was only one method for
validating current backpack).
Besides, a renderer has been added to display this information
depending on the backpackid.
2020-06-10 12:45:14 +02:00
Sara Arjona 24562c031c MDL-69002 core_badges: remove site backpack verification from settings
This site backpack verification is not required so, instead of
running it always here, it will be moved to a separate page to let
admins decide when to check it.
2020-06-10 12:42:03 +02:00
Mihail Geshoski deca8028d9 MDL-66601 atto_image: Set the max-height of the image selection dialogue 2020-06-10 12:21:21 +08:00
Jun Pataleta 3063e8415a Merge branch 'MDL-68864-38' of git://github.com/junpataleta/moodle into MOODLE_38_STABLE 2020-06-10 11:26:21 +08:00
Jun Pataleta ccbe61ee98 MDL-68864 qtype_multichoice: Rebuild clearchoice source map 2020-06-10 11:21:00 +08:00
Bas Brands ef874ad928 MDL-68864 qtype_multichoice: shift focus to first option on keyboard tab
- This prevents losing focus when using keyboard navigation
2020-06-10 11:15:17 +08:00
Bas Brands 9a33db6bea MDL-68864 qtype_multichoice: clearchoice
- Reverted changes from MDL-67901
2020-06-10 11:15:17 +08:00
Jake Dallimore b51501b403 Merge branch 'MDL-68972-38-enfix' of git://github.com/mudrd8mz/moodle into MOODLE_38_STABLE 2020-06-10 09:16:08 +08:00
Jake Dallimore 4f142bccce Merge branch 'MDL-68995-38' of https://github.com/paulholden/moodle into MOODLE_38_STABLE 2020-06-10 08:53:55 +08:00
Helen Foster dac9cc3139 MDL-68972 lang: Import fixed English strings (en_fix) 2020-06-09 21:08:54 +02:00
Paul Holden 281c882327 MDL-68995 atto_image: remove initial dialogue image src attribute.
It caused a spurious request to be sent to the server on display.
2020-06-09 15:47:55 +01:00
Sara Arjona bbc79e490a weekly release 3.8.3+ 2020-06-09 12:14:38 +02:00
Tim Hunt 666365e46b MDL-68971 webservice: errors should give enough info to find the problem 2020-06-09 11:09:45 +01:00
Russell Boyatt 28509546d3 MDL-66899 quiz: Log a regrading event when quiz attempt is regraded. 2020-06-09 10:08:24 +01:00
Russell Boyatt a860a76a68 MDL-66899 quiz: Adding test for regrading quiz event. 2020-06-09 10:08:03 +01:00
Mihail Geshoski 8d650d9a01 MDL-68954 repository_flickr_public: Return only photo media 2020-06-09 12:37:35 +08:00
Mihail Geshoski bbaab1109e MDL-68954 repository_flickr_public: Handle when photo cannot be found 2020-06-09 12:37:34 +08:00
Jake Dallimore c8a07a5b68 Merge branch 'MDL-68929-38' of git://github.com/mihailges/moodle into MOODLE_38_STABLE 2020-06-08 11:11:00 +08:00
Andrew Nicols abb076ebbd Merge branch 'MDL-68899-38' of git://github.com/mihailges/moodle into MOODLE_38_STABLE 2020-06-08 10:29:27 +08:00
Mihail Geshoski 56d6a5d731 MDL-68899 theme_classic: Fix dashboard course cards rendering
Co-authored-by: Bas Brands <bas@moodle.com>
2020-06-08 09:16:00 +08:00
Mihail Geshoski 59417f0b1d MDL-68929 core_filepicker: Fix radio button alignment 2020-06-07 11:40:47 +08:00
Eloy Lafuente (stronk7) 4180fe0f42 weekly release 3.8.3+ 2020-06-06 18:12:56 +02:00
Eloy Lafuente (stronk7) 8a53b489bb Merge branch 'install_38_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_38_STABLE 2020-06-06 18:12:52 +02:00
AMOS bot fecb0dcceb Automatically generated installer lang files 2020-06-06 00:07:27 +00:00
Sara Arjona 2b0ae390d7 MDL-68704 h5plib_v124: upgrade JQuery version to 1.12.4 2020-06-05 19:47:49 +01:00
Eloy Lafuente (stronk7) 1f274f5032 Merge branch 'MDL-68888-38-enfix' of git://github.com/mudrd8mz/moodle into MOODLE_38_STABLE 2020-06-05 19:23:07 +02:00
Sara Arjona 6f0115e399 weekly release 3.8.3+ 2020-06-05 13:24:16 +02:00
Helen Foster 4369ef0304 MDL-68888 lang: Import fixed English strings (en_fix) 2020-06-05 09:35:38 +02:00
Adrian Greeve fe3d7cdbaa Merge branch 'MDL-67773' of https://github.com/radzisze/moodle into MOODLE_38_STABLE 2020-06-05 11:48:52 +08:00
Anthony Radziszewski c852856ba7 MDL-67773 course: Make sure tags are enabled before logging the setting. 2020-06-04 11:43:01 -06:00
Adrian Greeve 019420fd11 Merge branch 'MDL-68203-decode-url-quiz-restore-MOODLE_38_STABLE' of https://github.com/ilya-catalyst/moodle into MOODLE_38_STABLE 2020-06-04 08:31:50 +08:00
Sara Arjona c2263f903d Merge branch 'MDL-68772-38' of https://github.com/Clyxz/moodle into MOODLE_38_STABLE 2020-06-03 13:18:00 +02:00
Jake Dallimore 719333e0ec Merge branch 'MDL-68875_38' of https://github.com/stronk7/moodle into MOODLE_38_STABLE 2020-06-03 12:29:08 +08:00
Andrew Nicols 3a98b992e9 Merge branch 'MDL-68312-38' of git://github.com/rezaies/moodle into MOODLE_38_STABLE 2020-06-03 08:09:41 +08:00
Martin Hanusch 27a12aba40 MDL-68772 mod_quiz: Navigation overlay fix 2020-06-02 16:53:33 +02:00
Eloy Lafuente (stronk7) b529ffad65 MDL-68875 privacy: Keep moodle_content_writer->get_path() the same
In MDL-62853 a new clean_param(PARAM_PATH) was added to the
moodle_content_writer->get_path() method. And this caused some
Windows tests to start failing.

The problem is that clean_param(PARAM_PATH) does normalise directory
separators to be always forward backslashes and that's normally ok
but the get_path() method has some DIRECTORY_SEPARATOR dependent code
that stopped working under windows.

After analysing various solutions, and trying to keep the behavior
EXACTLY like it was before MDL-62853, but with the cleaning included
we have applied 2 changes:

b) Move the clean_param() to later within the array_map() function,
that way the code there, that uses DIRECTORY_SEPARATOR will continue
working the same.

b) As far as there are more DIRECTORY_SEPARATOR dependent code later
in the function, also perform a str_replace() to convert back to the
OS directory separator.

Those 2 points together (a and b) make the behavior to be 100% the
original one, with separators being kept and the paths being cleaned.

This solution corresponds 100% with the proposed fixes named 3) and
4) in the issue.

Final note... all that DIRECTORY_SEPARATOR maybe needs a review because
it really shouldn't be used unless strictly needed. But that falls out
from this issue which goal was to keep things safely working like they
were before the regression (but with the cleaning applied).
2020-06-02 15:53:45 +02:00
Sara Arjona b5b8b1a486 weekly release 3.8.3+ 2020-06-02 13:03:13 +02:00
Sara Arjona 2f360b90c5 Merge branch 'install_38_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_38_STABLE 2020-06-02 13:03:11 +02:00
Adrian Greeve efa47a2ba5 Merge branch 'MDL-68828-38' of git://github.com/bmbrands/moodle into MOODLE_38_STABLE 2020-06-02 09:32:33 +08:00
Andrew Nicols 4b47df0236 Merge branch 'MDL-67518_38' of https://github.com/stronk7/moodle into MOODLE_38_STABLE 2020-06-02 09:20:19 +08:00
Adrian Greeve d9fe693347 Merge branch 'MDL-68723-38' of git://github.com/mihailges/moodle into MOODLE_38_STABLE 2020-06-02 08:58:37 +08:00
Eloy Lafuente (stronk7) 74206f3d78 Merge branch 'MDL-63284-38' of https://github.com/Clyxz/moodle into MOODLE_38_STABLE 2020-06-02 00:25:17 +02:00
Eloy Lafuente (stronk7) 0fce71647f Merge branch 'MDL-68866-38' of https://github.com/mchurchward/moodle into MOODLE_38_STABLE 2020-06-02 00:14:42 +02:00
Eloy Lafuente (stronk7) 3d50844c9f Merge branch 'MDL-68844-38' of https://github.com/roland04/moodle into MOODLE_38_STABLE 2020-06-02 00:09:48 +02:00
Mike Churchward 661c7a1988 MDL-68866 accesslib: Fixing parameter documentation. 2020-06-01 13:42:16 -04:00
Víctor Déniz Falcón f8f58c441b Merge branch 'MDL-68353-38' of git://github.com/rezaies/moodle into MOODLE_38_STABLE 2020-06-01 16:52:24 +01:00
Shamim Rezaie cdb0af69e1 MDL-68353 theme_classic: Update filepicker xpath selector 2020-06-01 03:45:32 +10:00
AMOS bot 85da65606b Automatically generated installer lang files 2020-05-30 00:07:22 +00:00
Martin Hanusch 6e64255df2 MDL-63284 question: Moving questions with tags disabled bug fix 2020-05-29 16:39:32 +02:00
Eloy Lafuente (stronk7) ec602d2f26 MDL-67518 phpunit: avoid DB sorting randomness in test
While reading from mdl_config, sometimes this test was failing
because an order was being presumed. Now we convert the records
array to an associative one to perform tests against it.
2020-05-29 16:26:07 +02:00
Jun Pataleta 6079a72373 Merge branch 'MDL-68353-38' of git://github.com/rezaies/moodle into MOODLE_38_STABLE 2020-05-29 22:25:54 +08:00
Sara Arjona 111fc893da weekly release 3.8.3+ 2020-05-29 12:52:30 +02:00
Sara Arjona 5d7f88d98b Merge branch 'install_38_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_38_STABLE 2020-05-29 12:52:27 +02:00
Mikel Martín 3eb69a0a9e MDL-68844 formslib: Fix inline layout for static elements 2020-05-29 11:11:40 +02:00
Shamim Rezaie 465c6e7c45 MDL-68353 test: Update existing tests to work with file elements 2020-05-29 14:51:58 +10:00
Shamim Rezaie 46323748fa MDL-68353 test: Update filemanager/filepicker xpath selector 2020-05-29 14:51:58 +10:00
Shamim Rezaie 32d28f8fac MDL-68353 test: get_field_locator to support custom field labels 2020-05-29 14:51:58 +10:00
Shamim Rezaie 2591f4ce79 MDL-68353 form: filepicker label fix 2020-05-29 14:51:54 +10:00
Shamim Rezaie c3764823cd MDL-68353 admin: Not use label tag in admin setting elements when needed 2020-05-29 14:35:46 +10:00
Shamim Rezaie 49e32e25ff MDL-68353 message: enclose privacy settings within a fieldset 2020-05-29 14:35:46 +10:00
Shamim Rezaie 46962930f7 MDL-68353 core: replace invalid labels with div 2020-05-29 14:35:46 +10:00
Shamim Rezaie 4c97f30360 MDL-68353 form: filemanager label fix 2020-05-29 14:35:43 +10:00
Jun Pataleta 35282e4d1a Merge branch 'MDL-64175-38' of git://github.com/sarjona/moodle into MOODLE_38_STABLE 2020-05-29 12:01:58 +08:00
Shamim Rezaie 78f4960bce MDL-68353 form: Only include the size attribute if there is a size set 2020-05-29 13:52:39 +10:00
Shamim Rezaie 6fa2f55cd0 MDL-68353 form: Removed the size attribute
The size attribute does not work with the checkbox input type.
2020-05-29 13:52:39 +10:00
Shamim Rezaie d3756efc83 MDL-68353 core: do not output empty labels 2020-05-29 13:52:38 +10:00
Shamim Rezaie 261804e95c MDL-68353 core: Set aria-label for close buttons on YUI dialogues 2020-05-29 13:52:36 +10:00
Mihail Geshoski 53c46ffb2e MDL-68723 filepicker: Display parent content in filemanger tree view 2020-05-29 11:46:32 +08:00
AMOS bot 7ba5f4896e Automatically generated installer lang files 2020-05-29 00:07:50 +00:00
Sara Arjona 3a76c07806 MDL-64175 atto_media: update advanced settings
Some OS, such as Ubuntu, are slightly changing the audio attributes,
from <audio attribute1="true"> to <audio attribute1>.
This patch is for reviewing this piece of code and covering both cases.
2020-05-28 17:27:16 +02:00
Eloy Lafuente (stronk7) 1794636ee6 Merge branch 'MDL-68753-38-enfix' of git://github.com/mudrd8mz/moodle into MOODLE_38_STABLE 2020-05-28 13:02:29 +02:00
Sara Arjona 24906971d7 Merge branch 'MDL-68244-38' of https://github.com/Chocolate-lightning/moodle into MOODLE_38_STABLE 2020-05-28 12:42:50 +02:00
Sara Arjona 1ac59631d8 Merge branch 'MDL-68565-38' of https://github.com/paulholden/moodle into MOODLE_38_STABLE 2020-05-28 12:00:32 +02:00
hiendinh 4a77582d16 MDL-68841 Modal dialogs: Wrong behavior of popup 2020-05-28 16:33:11 +07:00
Eloy Lafuente (stronk7) 2140fe5549 Merge branch 'MDL-68789-38' of git://github.com/crazyserver/moodle into MOODLE_38_STABLE 2020-05-28 10:47:06 +02:00
Pau Ferrer Ocaña fc13b8c1a0 MDL-68789 behat: Rename the app from Moodle Mobile to Moodle app 2020-05-28 08:40:54 +02:00
Jake Dallimore f4163d2748 Merge branch 'MDL-67903-38' of git://github.com/bmbrands/moodle into MOODLE_38_STABLE 2020-05-28 13:59:13 +08:00
Adrian Greeve a90af06899 Merge branch 'MDL-68847-38' of https://github.com/snake/moodle into MOODLE_38_STABLE 2020-05-28 12:01:42 +08:00
Jake Dallimore 81e276c743 Merge branch 'mdl-68425-m38' of https://github.com/deraadt/moodle into MOODLE_38_STABLE 2020-05-28 11:24:07 +08:00
Jake Dallimore 45da2ac9d3 MDL-68847 mod_url: fix bug when using dnd to handle urls
This generates a notice, which wasn't seen because the feature works
asynchronously.
2020-05-28 09:32:34 +08:00
Andrew Nicols 8c83815ab1 Merge branch 'MDL-68846_38' of https://github.com/stronk7/moodle into MOODLE_38_STABLE 2020-05-28 07:35:59 +08:00
Paul Holden e34877300c MDL-68565 tool_usertours: account for optional config in WS response. 2020-05-27 22:10:56 +01:00
Eloy Lafuente (stronk7) e917a595b2 MDL-68846 behat: Avoid asserting AM/PM strings. They are not cross-os
The exists/contains steps of behat are case-sensitive, in the other
side, depending of the OS and locales, time functions are not 100%
consistent. See https://bugs.php.net/bug.php?id=76378 for example.

So only solutions are:

1) Create a specific new step performing the checks case insensitively.
2) Avoid making AM / PM part of the checks.

Here we have opted by the 2nd approach, it's not critical part to check.
2020-05-27 18:05:07 +02:00
Thomas.Ludwig 852cda447f MDL-67903 core_grades: remove outdated CSS for grade import form 2020-05-27 16:02:11 +02:00
Sara Arjona 9e2cb2075c Merge branch 'MDL-68343-38' of git://github.com/rezaies/moodle into MOODLE_38_STABLE 2020-05-27 15:09:52 +02:00
Sara Arjona 13b26170b9 Merge branch 'MDL-68667-38' of git://github.com/aanabit/moodle into MOODLE_38_STABLE 2020-05-27 12:27:00 +02:00
Jake Dallimore 6f792b5ed8 Merge branch 'MDL-52138-38-take4' of git://github.com/lucaboesch/moodle into MOODLE_38_STABLE 2020-05-27 14:25:52 +08:00
Andrew Nicols 1612572a62 Merge branch 'MDL-68765-M38' of https://github.com/ised-isde-canada/moodle into MOODLE_38_STABLE 2020-05-27 12:50:13 +08:00
Andrew Nicols 5c5b0ee137 Merge branch 'm38_MDL-68054' of https://github.com/danmarsden/moodle into MOODLE_38_STABLE 2020-05-27 12:14:12 +08:00
Jun Pataleta 582e43bebe Merge branch 'MDL-68750-38' of git://github.com/andrewnicols/moodle into MOODLE_38_STABLE 2020-05-27 11:04:04 +08:00
Andrew Nicols 2ea2d6a72f MDL-68750 tool_dataprivacy: Correct behat test modal checks 2020-05-27 10:40:30 +08:00
Ilya Tregubov 37d7820816 MDL-68203 restore: Decode quiz links when restore into existing course
or duplicating.
2020-05-27 10:39:49 +10:00
Eloy Lafuente (stronk7) fc2c76e78e Merge branch 'MDL-68789-38' of git://github.com/crazyserver/moodle into MOODLE_38_STABLE 2020-05-26 23:42:56 +02:00
Luca Bösch 4c5684135a MDL-52138 core_grades: gradebook striped styling 2020-05-26 23:32:22 +02:00
Eloy Lafuente (stronk7) 35dd608161 weekly release 3.8.3+ 2020-05-26 22:52:25 +02:00
Sara Arjona 9faa136ca0 Merge branch 'MDL-68388_38' of https://github.com/stronk7/moodle into MOODLE_38_STABLE 2020-05-26 20:03:45 +02:00
Helen Foster 667d004a17 MDL-68753 lang: Import fixed English strings (en_fix) 2020-05-26 19:15:48 +02:00
Eloy Lafuente (stronk7) 640838c117 MDL-68388 core_grades: Tweak unit test assertion to make Oracle happy
Also modify some comments and get rid of some void return types.
2020-05-26 19:02:12 +02:00
Bas Brands f4a77e8381 MDL-68828 theme_classic: fix for mobile
- setting a max width so the page does not overflow its container on
mobile
- fixing dashboard cards to be 100% wide on mobile
2020-05-26 14:13:44 +02:00
Andrew Nicols 833d8bceb8 MDL-68750 analytics: Correct behat test modal checks 2020-05-26 12:56:25 +08:00
Andrew Nicols bc010acae0 MDL-68750 core_tag: Add missing confirmation dialogue title 2020-05-26 12:56:25 +08:00
Andrew Nicols 0deabbfbfd MDL-68750 behat: Correct dialogue selector 2020-05-26 12:56:25 +08:00
Andrew Nicols 404288d3bc Merge branch 'MDL-68099-38' of git://github.com/marinaglancy/moodle into MOODLE_38_STABLE 2020-05-26 11:38:32 +08:00
deraadt b16b681a79 MDL-68425 user: Add capability check for messaging 2020-05-26 13:01:06 +10:00
Andrew Nicols 14cfb3dcbf MDL-68388 grade: Tidy comments and whitespace 2020-05-26 10:19:09 +08:00
Andrew Nicols 074bdceb1f Merge branch 'M3.8-MDL-68388' of https://github.com/marcusboon/moodle into MOODLE_38_STABLE 2020-05-26 10:16:35 +08:00
Andrew Nicols c7545dc852 Merge branch 'MDL-64427-m38' of https://github.com/NeillM/moodle into MOODLE_38_STABLE 2020-05-26 10:05:58 +08:00
Andrew Nicols cd1a39717a Merge branch 'MDL-68270-38' of git://github.com/bmbrands/moodle into MOODLE_38_STABLE 2020-05-26 08:03:06 +08:00
Victor Deniz Falcon c933e28af6 Merge branch 'MDL-68252_38' of https://github.com/timhunt/moodle into MOODLE_38_STABLE 2020-05-26 00:56:32 +01:00
Marcus Boon 0b62a26225 MDL-68388 core_grades: Use MUC for grade letters
In the get_grade_letters there is a static variable that is used
to cache grade letters, we should use MUC for this so that it is
reset properly between unit tests.
2020-05-26 09:27:05 +10:00
Bas Brands 8a977030fc MDL-68270 core_output: prevent blurring of navbar logo 2020-05-25 15:49:19 +02:00
Pau Ferrer Ocaña 0ff1309b3a MDL-68789 behat: Change app page menu text selector 2020-05-25 14:55:52 +02:00
Andrew Nicols 26badfdd1a Merge branch 'MDL-68103-38' of git://github.com/bmbrands/moodle into MOODLE_38_STABLE 2020-05-25 19:55:33 +08:00
Bas Brands 1dafe5fbe5 MDL-68103 theme_classic: show content full width when printing 2020-05-25 13:49:39 +02:00
Nick Phillips f8621e3d58 MDL-68103 theme_classic: hidden-print => d-print-none for BS4. 2020-05-25 13:49:39 +02:00
Amaia Anabitarte e48b197957 MDL-68667 filepicker: Use shortitle parameter 2020-05-25 13:36:56 +02:00
Mathew May 7045cd8e67 MDL-68244 auth_email: Update unit test, remove hard assertion 2020-05-25 16:39:05 +08:00
Adrian Greeve 48583d2740 Merge branch 'MDL-68629_38' of https://github.com/t-schroeder/moodle into MOODLE_38_STABLE 2020-05-25 16:16:44 +08:00
Jake Dallimore 4ad9de59ea Merge branch 'MDL-62853-38' of https://github.com/paulholden/moodle into MOODLE_38_STABLE 2020-05-25 16:12:17 +08:00
Andrew Nicols b22accf82b Merge branch 'MDL-68658_38' of https://github.com/stronk7/moodle into MOODLE_38_STABLE 2020-05-25 15:26:36 +08:00
Adrian Greeve 99f948b4df Merge branch 'MDL-63812_38' of https://github.com/timhunt/moodle into MOODLE_38_STABLE 2020-05-25 14:42:08 +08:00
Ruslan Kabalin e94499f9b3 MDL-68592 formslib: Fix inline layout for nested groups 2020-05-22 17:55:50 +02:00
Eloy Lafuente (stronk7) 4e60865e2c MDL-68658 phpunit: Ensure that the configured proxy is applied always
Previously, if the RSS feed (extests) was being served locally,
CFG->proxybypass was applied and causing the test to fail (proxy
ignored).

In that exact test we need the configured proxy to be applied
always, because the test is exaclty about detecting the problem
when a wrong proxy is used.
2020-05-22 17:07:10 +02:00
Pau Ferrer Ocaña 43268a6a1c MDL-68789 behat: Adapt login step to new app version 2020-05-22 16:45:23 +02:00
Victor Deniz Falcon 38cc6d1071 weekly release 3.8.3+ 2020-05-22 14:21:47 +01:00
Victor Deniz Falcon 92ba52e21d Merge branch 'install_38_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_38_STABLE 2020-05-22 14:21:42 +01:00
Andrew Nicols 13215b2415 Merge branch '68137-moodle38-prevent-removing-all-dots-in-filename' of https://github.com/DSI-Universite-Rennes2/moodle into MOODLE_38_STABLE 2020-05-22 11:55:20 +08:00
Andrew Nicols 0b464b93d8 Merge branch 'MDL-57240_38' of https://github.com/timhunt/moodle into MOODLE_38_STABLE 2020-05-22 11:48:35 +08:00
Andrew Nicols e3b6ebadcc Merge branch 'MDL-68783-38' of git://github.com/junpataleta/moodle into MOODLE_38_STABLE 2020-05-22 11:24:16 +08:00
Andrew Nicols 6944da3315 Merge branch 'MDL-67700-38' of git://github.com/ferranrecio/moodle into MOODLE_38_STABLE 2020-05-22 10:51:47 +08:00
David Mudrák e67a6060e0 MDL-68738 wiki: Prevent URLs inside links from turning into another link
There was a problem with wiki pages in the HTML markup syntax. If they
contain a link and the link text has a URL in it, that URL was converted
into another link. But it was not correctly nested and it caused
additional troubles with filters (particularly the multimedia filter if
the URL was a video such as on youtube).

The solution here is similar to what we do in filters. We protect the
whole explicit link so that its content is not further parsed. That
prevents the inner URL to be converted into another link and the
explicit link has the full control.
2020-05-21 21:12:42 +02:00
Sara Arjona 0aadca7a48 Merge branch 'm38_MDL-67497' of https://github.com/danmarsden/moodle into MOODLE_38_STABLE 2020-05-21 19:01:45 +02:00
Ferran Recio 0efd87b0f2 MDL-67700 message: prevent async loading conversation message mix 2020-05-21 18:04:31 +02:00
Sara Arjona d42ad4800d Merge branch 'MDL-66471-38' of https://github.com/paulholden/moodle into MOODLE_38_STABLE 2020-05-21 17:33:33 +02:00
Sara Arjona 19ebf2dc92 Merge branch 'MDL-67126_38' of https://github.com/ffhs/moodle into MOODLE_38_STABLE 2020-05-21 13:35:18 +02:00
Adrian Greeve a644c50920 Merge branch 'MDL-68733_38' of https://github.com/timhunt/moodle into MOODLE_38_STABLE 2020-05-21 08:36:23 +08:00
AMOS bot de19504712 Automatically generated installer lang files 2020-05-21 00:07:22 +00:00
Eloy Lafuente (stronk7) ff5773d511 Merge branch 'MDL-52578-38' of git://github.com/junpataleta/moodle into MOODLE_38_STABLE 2020-05-21 00:57:22 +02:00
Michael Milette 314e9a4064 MDL-68765 auth: Login form has DIV tag with 2 CLASS attributes. 2020-05-20 14:07:37 -04:00
Neill Magill 2f5490410e MDL-64427 course: Mark activities during course contents deletion
When we want to delete all of the activities in a course we should
mark them as having a deletion in progress, as this makes them
unavailable to users immediately.

This should make it much less likely that a request to get a context
that does not exist should be made when a user accesses a page.
2020-05-20 08:30:05 +01:00
Neill Magill 34f176586b MDL-64427 course: Do not allow dirty cm_info during course delete
When deleting a course (especially one containing a large amount of
data) the course mod info cache could contain entries for deleted
activities for a signifcant amount of time making it possible that
users could see errors in Moodle.
2020-05-20 08:30:04 +01:00
Neill Magill 7a168c3beb MDL-64427 category: Stop error when another user deleting courses
If you try to visit a category where another user is deleting a
course the coursecat cache may not be fresh. This is because there
is a breif time where the course record will have been deleted,
while it is deleting other course information, before the event that
triggers the coursecat cache to be purged is fired.
2020-05-20 08:30:04 +01:00
Neill Magill 0be9bb13c7 MDL-64427 category: Test getting category courses during deletion
Adding a unit test for the situation where a course is partially
deleted when a list of courses in a category is retrived.
2020-05-20 08:30:04 +01:00
Jun Pataleta 55dde65d11 MDL-68783 core_grades: Fix outcome page's add/remove button styles
* Applied proper styles of btn-secondary.
* Added some vertical spacing between the buttons by enclosing them in
divs with 'm-y-1' class instead of just a br tag.
2020-05-20 13:13:27 +08:00
Jun Pataleta 45978220ab MDL-52578 core_course: Peer review fixes
* Fetch parent category only when necessary.
* Fix outdated variable names in original patch.
* Fix variable scope for $outcomeexists.
2020-05-20 10:31:31 +08:00
Steve Bader e8e5f49883 MDL-52578 core_course: Activity weight set to 0 on creation 2020-05-20 10:31:31 +08:00
Dan Marsden efeef8d82d MDL-68054 lib: viewhiddenactivities should be set as captype:read 2020-05-20 14:03:02 +12:00
AMOS bot 9821d4d9a7 Automatically generated installer lang files 2020-05-20 00:07:31 +00:00
Paul Holden f138423971 MDL-66471 user: fix user_selector debug about extra identity fields. 2020-05-19 19:12:23 +01:00
Sara Arjona e6d212fc07 weekly release 3.8.3+ 2020-05-19 17:54:31 +02:00
Sara Arjona 1adda884fd Merge branch 'install_38_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_38_STABLE 2020-05-19 17:54:28 +02:00
Tim Hunt 4fae2c3001 MDL-68733 quiz editing: behat test for altering random question tags 2020-05-19 11:10:04 +01:00
Bence Molnar 3427a6ec76 MDL-68733 quiz editing: be more careful deleting random question tags 2020-05-19 11:10:04 +01:00
Tim Hunt ea5c0c6b61 MDL-68733 question behat: question tag generator and use in quiz test 2020-05-19 11:10:03 +01:00
Ferran Recio fcbc4ccee6 MDL-67700 message: correcting conversation timer reset 2020-05-19 09:58:17 +02:00
Jun Pataleta dd293c28e1 Merge branch 'MDL-68528-38' of git://github.com/andrewnicols/moodle into MOODLE_38_STABLE 2020-05-19 11:45:55 +08:00
Andrew Nicols 79c6d0a453 MDL-68528 js: Normalise core component for template strings 2020-05-19 11:37:55 +08:00
Andrew Nicols 1ac5b70c5a MDL-68528 js: Normalise empty component to "core" for string 2020-05-19 11:34:59 +08:00
AMOS bot 9b38e44dfb Automatically generated installer lang files 2020-05-19 00:07:24 +00:00
Sara Arjona 57382b0e5e Merge branch 'MDL-68760_38' of https://github.com/timhunt/moodle into MOODLE_38_STABLE 2020-05-18 20:33:19 +02:00
Sara Arjona 2d2e93c6c6 Merge branch 'MDL-68728-38-2' of git://github.com/andrewnicols/moodle into MOODLE_38_STABLE 2020-05-18 20:23:47 +02:00
Tim Hunt e23b038479 MDL-68760 timezones: add string for new timezone America/Nuuk 2020-05-18 17:32:13 +01:00
Tim Hunt a2defe29c4 MDL-68760 string tests: make test_timezone_lang_strings message helpful 2020-05-18 17:32:12 +01:00
Marina Glancy aecc9e7170 MDL-68099 gradereport_grader: prevent exception without groups 2020-05-18 15:19:05 +02:00
Andrew Nicols a30ff32351 Merge branch 'MDL-68503_38_STABLE' of https://github.com/marxjohnson/moodle into MOODLE_38_STABLE 2020-05-18 20:31:28 +08:00
Sara Arjona 1b34fbb716 Merge branch 'MDL-68253-38' of git://github.com/lucaboesch/moodle into MOODLE_38_STABLE 2020-05-18 13:56:43 +02:00
Adrian Perez 69e2477f90 MDL-67126 assign: set completion state for all group members 2020-05-18 12:25:57 +02:00
Andrew Nicols bca7a73d14 MDL-68728 calendar: Pending promises for event summary 2020-05-18 13:32:42 +08:00
AMOS bot c27c7abb6b Automatically generated installer lang files 2020-05-18 00:07:46 +00:00
AMOS bot 82d46e5037 Automatically generated installer lang files 2020-05-17 00:07:17 +00:00
Luca Bösch 4853c245c5 MDL-68253 mod_book: Remove prev arrow on the firstmost page. 2020-05-15 12:17:52 +02:00
Eloy Lafuente (stronk7) 4d56bb43b3 weekly release 3.8.3+ 2020-05-15 11:07:01 +02:00
Andrew Nicols 0cbb91e4c0 Merge branch 'MDL-66917-38' of https://github.com/paulholden/moodle into MOODLE_38_STABLE 2020-05-15 10:55:05 +08:00
Eloy Lafuente (stronk7) 2ef16003f1 Merge branch 'MDL-68677-38' of git://github.com/andrewnicols/moodle into MOODLE_38_STABLE 2020-05-15 02:00:39 +02:00
Andrew Nicols 80787a98b3 MDL-68677 core: Correct usage of templaterev for caching templates
The M.cfg.templaterev variable should only be used to present persistent
caching, not caching of content within the same page load.

Preventing caching of same-page content makes it difficult to develop
for real user experiences as content is slow to load and does not give a
realistic and consistent loading experience.

This change affects the loading of partials specifically which notably
includes the loading spinner. Without this patch the loading icon is
often not seen at all because it does not load in a timely fashion and
the content being loaded is loaded first.
2020-05-15 07:55:59 +08:00
Eloy Lafuente (stronk7) 698f0cff54 Merge branch 'MDL-68084-38' of https://github.com/paulholden/moodle into MOODLE_38_STABLE 2020-05-15 01:30:52 +02:00
Sara Arjona 0e73dacaaf Merge branch 'MDL-68200-38-take2' of git://github.com/rezaies/moodle into MOODLE_38_STABLE 2020-05-14 13:12:50 +02:00
Jake Dallimore 2ba93cc439 Merge branch 'MDL-68631_38' of https://github.com/jonof/moodle into MOODLE_38_STABLE 2020-05-13 09:25:22 +08:00
Paul Holden cd0af947a7 MDL-68084 blocks: check capability before getting content.
Some blocks (e.g. Calendar) load additional JS modules when returning
content. We need to make sure they aren't asked to generate content
unless the user can actually view the block, or the expected content
required by the JS will not exist in the DOM and can cause exceptions.
2020-05-12 19:21:35 +01:00
Sara Arjona 9b2253898a weekly release 3.8.3+ 2020-05-12 14:16:49 +02:00
Shamim Rezaie a81508489d MDL-68200 core: Fix phpdoc for the external return functions 2020-05-12 15:07:23 +10:00
Shamim Rezaie 3ec67cf4bb MDL-68200 core: Fix datetime format
date.toISOString() prints out the seconds as well.
Current code supports most valid values for the datetime attribute
2020-05-12 15:07:23 +10:00
Shamim Rezaie 365bfab967 MDL-68200 mod_forum: fix invalid format of the time tag on modern view 2020-05-12 15:07:23 +10:00
Shamim Rezaie a8b4b9f407 MDL-68200 mod_forum: Fix the invalid date format in the time tags 2020-05-12 15:07:23 +10:00
Jun Pataleta c59656006b MDL-68200 mod_forum: Use core/time_element for the discussion list page 2020-05-12 15:05:04 +10:00
Jun Pataleta 84d550cacb MDL-68200 core: Add new time_element template 2020-05-12 15:05:04 +10:00
Jun Pataleta b238304072 MDL-68200 core: Support fixday/hour for core/user_date's get() method 2020-05-12 15:05:04 +10:00
Jun Pataleta 10127ac33d MDL-68200 core: Support fixday/hour for core_external::get_user_dates() 2020-05-12 15:05:04 +10:00
Shamim Rezaie 6a7350d44b MDL-68200 core: Add calendartype param to user_date.loadDatesFromServer 2020-05-12 15:05:03 +10:00
Shamim Rezaie ed19fe85e4 MDL-68200 core: Add type param to core_get_user_dates external function 2020-05-12 15:05:03 +10:00
Shamim Rezaie bd76f0bb66 MDL-68200 mod_forum: remove address tags
Reasons:
- The element “h4” must not appear as a descendant of the “address” element
- This element should not contain more information than the contact
information, like a publication date (which belongs in a <time> element)
 element)
2020-05-12 15:02:05 +10:00
Shamim Rezaie c78ebc9586 MDL-68200 mod_forum: single discussion to follow nestet_v2 display rules 2020-05-12 15:02:05 +10:00
Shamim Rezaie d2886d283a MDL-68200 theme_boost: workaround for IE for flexbox not filling height
read more:
https://philipwalton.com/articles/normalizing-cross-browser-flexbox-bugs/
2020-05-12 15:02:05 +10:00
Eloy Lafuente (stronk7) 3ab743dcd9 Merge branch 'MDL-68579-38' of git://github.com/cescobedo/moodle into MOODLE_38_STABLE 2020-05-11 23:14:10 +02:00
Brendan Heywood 6f0506fa9d MDL-68276 admin: Skip risky tables and columns in db_replace 2020-05-11 23:11:46 +02:00
Jun Pataleta 2faa47c934 Merge branch 'MDL-66109-38' of git://github.com/andrewnicols/moodle into MOODLE_38_STABLE 2020-05-12 00:03:10 +08:00
Mihail Geshoski 6c86327b33 MDL-68576 filepicker: Cover in behat file edition in filemanager
The added behat tests would also confirm whether the behaviour of
a click action on a file using different views in the filemanager
is consistent.
2020-05-11 16:35:09 +02:00
Mihail Geshoski 6619bdf99d MDL-68576 filepicker: Cover in behat file selection from filepicker
The added behat tests would cover the issue in MDL-68576. They test
whether the behaviour of a click action on a file using different
views in the filepicker is consistent.
2020-05-11 16:34:59 +02:00
cescobedo 74860627f2 MDL-68579 core_h5p: Add a check to avoid execute task using BEHAT 2020-05-11 10:15:01 +02:00
Andrew Nicols 738da05555 MDL-66109 js: Built file changes from new Node version 2020-05-11 10:53:49 +08:00
Andrew Nicols 9c07f29d8e MDL-66109 js: Fix circular dependency in Shifter dependency
Shifter is using an ancient and no-longer supported of Istanbul. That
version contains a circular dependency whereby it fetches the version
from the index that included the file in the first place.  This throws a
warning on newer versions of Node.

The fix here is simple and intended to be the bare minimum to remove
these warnings anad resolve the issue.

We have forked the istanbul project and created a v0.1.37_moodle branch
at the root version of the Istanbul version that Shifter uses (v0.1.37
tag). The circular dependency is then addressed and a new tag created.

I have then forked Shifter, pointing its package.json at the tar.gz
download of that new tag and pushed a new branch and tag for that fix.

Following this our own package.json is updated to point to the tar.gz
version of the new Shifter tag.
2020-05-11 10:53:48 +08:00
Andrew Nicols ed68a025ef MDL-66109 js: Upgrade to latest stable version of NodeJS
Version 14.0.0 has just been released as stable, and will make its way
to an LTS release which will be supported until 30th April 2023.

At time of writing it is the "Current stable" release and will remain in
this phase until 20th October 2020, at whciih point it will transition
to LTS status.
2020-05-11 10:53:48 +08:00
Tim Schroeder 1f59f848d7 MDL-68629 mod_choice: multilang coursename support 2020-05-07 15:47:53 +02:00
Jonathon Fowler b9fc865245 MDL-68631 cron: ensure the cron user is reset between scheduled tasks 2020-05-07 13:26:51 +10:00
Dan Marsden d95f185556 MDL-67497 lib: backuptargetimport should be set as captype:read 2020-04-29 08:14:45 +12:00
Julien Boulen af9bf5f609 MDL-68137 core_files: replace consecutive dots in filename by single dot 2020-04-28 11:29:52 +02:00
Tim Hunt f42b67ab2c MDL-68252 question tags: fix tag editing for missingtype questions 2020-04-24 11:26:39 +01:00
Tim Hunt 088d4309fe MDL-68252 question bank: for 'missingtype' questions, hide actions 2020-04-24 11:26:38 +01:00
Mark Johnson a84620c2d5 MDL-68503 user profile: Make sortorders relative to existing records 2020-04-23 15:55:53 +01:00
Tim Hunt 59afcdd850 MDL-63812 qtype_gapselect: fix questions with non-consecutive gap nos 2020-04-23 14:41:38 +01:00
Tim Hunt 69b0bbde10 MDL-63812 qtype_gapselect: test data generator to standard qtype pattern 2020-04-23 14:41:37 +01:00
Tim Hunt 660fa2871a MDL-57240 quiz: don't show useless links on overdue attempt summary page 2020-04-22 21:38:52 +01:00
Shamim Rezaie 24d7375f0f MDL-68312 grade: Fix empty links
If a link contains no text, the function or purpose of the link will not
be presented to the user. This can introduce confusion for keyboard and
screen reader users.
2020-04-22 04:33:05 +10:00
Shamim Rezaie 71caffb7e0 MDL-68312 output: Fix empty links
If a link contains no text, the function or purpose of the link will not
be presented to the user. This can introduce confusion for keyboard and
screen reader users.
2020-04-22 04:33:04 +10:00
Shamim Rezaie 04e9010c92 MDL-68312 gradereport_grader: Remove adjacent links to the same URL 2020-04-22 04:33:04 +10:00
Shamim Rezaie 9912c37afd MDL-68312 gradereport_grader: replace invalid label by aria-describedby
The for attribute of the label element should not refer to a non-hidden
form control.
2020-04-22 04:33:04 +10:00
Shamim Rezaie d37757abf1 MDL-68312 gradereport_grader: Use caption instead of summary in table
The summary attribute on the table element is obsolete.
2020-04-22 04:33:04 +10:00
Shamim Rezaie f9b144d6bf MDL-68343 gradereport_singleview: Remove adjacent links to the same URL 2020-04-22 04:31:06 +10:00
Shamim Rezaie 85bf5b2e2c MDL-68343 gradereport_singleview: Use caption instead of summary
The summary attribute on the table element is obsolete.
2020-04-22 04:31:06 +10:00
Shamim Rezaie cc36c39b46 MDL-68343 gradereport_singleview: fix empty links 2020-04-22 04:31:06 +10:00
Shamim Rezaie 5d2be187a2 MDL-68343 gradereport_singleview: Only output label tag if label exists
This also fixes the issue of having multiple form labels for a single
element.
2020-04-22 04:31:06 +10:00
Shamim Rezaie 10bc73d5b6 MDL-68343 output: fix html table structure
A <th> that contains no text may result in cells with missing or
incorrect header information. WAVE advises that we should make a cell
a <td> rather than a <th> if the cell must remain empty (such as the
top-left cell in a data table).

Also note that the scope attribute is only valid for <th>
2020-04-22 04:31:06 +10:00
Paul Holden 80827f076c MDL-62853 privacy: sanitize subcontext paths. 2020-04-21 14:38:14 +01:00
Paul Holden 059f402a51 MDL-66917 admin: validate uploaded plugin version.
Prevent overwriting current plugins with older versions of themselves.
2020-04-21 14:36:18 +01:00
307 changed files with 3651 additions and 1120 deletions
+1 -1
View File
@@ -1 +1 @@
v8.16.1
v14.0.0
+9 -1
View File
@@ -15,6 +15,7 @@ dist: xenial
services:
- mysql
- docker
php:
# We only run the highest and lowest supported versions to reduce the load on travis-ci.org.
@@ -61,8 +62,9 @@ cache:
- $HOME/.npm
before_install:
- docker run -d -p 127.0.0.1:8080:80 --name exttests moodlehq/moodle-exttests
# Avoid IPv6 default binding as service (causes redis not to start).
sudo service redis-server start --bind 127.0.0.1
- sudo service redis-server start --bind 127.0.0.1
install:
- >
@@ -169,6 +171,10 @@ before_script:
-e "/require_once/i \\\$CFG->phpunit_dataroot = '\/home\/travis\/roots\/phpunit';" \
-e "/require_once/i \\\$CFG->phpunit_prefix = 'p_';" \
config.php ;
# Enable test external resources
sed -i \
-e "/require_once/i \\define('TEST_EXTERNAL_FILES_HTTP_URL', 'http://127.0.0.1:8080');" \
config.php ;
# Redis cache store tests
sed -i \
-e "/require_once/i \\define('TEST_CACHESTORE_REDIS_TESTSERVERS', '127.0.0.1');" \
@@ -248,6 +254,8 @@ script:
if [ "$TASK" = 'PHPUNIT' ];
then
vendor/bin/phpunit --fail-on-risky --disallow-test-output --verbose;
EXTTESTS_HITS=$(docker logs exttests 2>&1 | grep -Fv -e 'AH00558' -e '[pid 1]' | wc -l)
echo -e "\nTest local resources number of hits: ${EXTTESTS_HITS}.\n"
fi
- >
-7
View File
@@ -105,13 +105,6 @@ if (($hassiteconfig || has_any_capability(array(
new lang_string('sitebackpack_help', 'badges'),
1, $choices));
$warning = badges_verify_site_backpack();
if (!empty($warning)) {
$backpacksettings->add(new admin_setting_description('badges_site_backpack_verify',
new lang_string('sitebackpackverify', 'badges'),
$warning));
}
$ADMIN->add('badges', $backpacksettings);
$ADMIN->add('badges',
+18
View File
@@ -260,10 +260,28 @@ if ($hassiteconfig) {
$temp->add($setting);
// See {@link https://gdpr-info.eu/art-8-gdpr/}.
// See {@link https://www.betterinternetforkids.eu/web/portal/practice/awareness/detail?articleId=3017751}.
$ageofdigitalconsentmap = implode(PHP_EOL, [
'*, 16',
'AT, 14',
'BE, 13',
'BG, 14',
'CY, 14',
'CZ, 15',
'DK, 13',
'EE, 13',
'ES, 14',
'FI, 13',
'FR, 15',
'GB, 13',
'GR, 15',
'IT, 14',
'LT, 14',
'LV, 13',
'MT, 13',
'NO, 13',
'PT, 13',
'SE, 13',
'US, 13'
]);
$setting = new admin_setting_agedigitalconsentmap('agedigitalconsentmap',
+1 -1
View File
@@ -64,7 +64,7 @@ $renderer = $PAGE->get_renderer('tool_task');
echo $OUTPUT->header();
echo $OUTPUT->render_from_template('core_admin/tasklogs', (object) [
'action' => $pageurl->out(),
'filter' => $filter,
'filter' => htmlentities($filter),
'resultfilteroptions' => [
(object) [
'value' => -1,
+35 -9
View File
@@ -49,15 +49,28 @@
}}
<div class="form-item row" id="{{id}}">
<div class="form-label col-sm-3 text-sm-right">
<label {{#labelfor}}for="{{labelfor}}"{{/labelfor}}>
{{{title}}}
{{#override}}
<div class="form-overridden">{{override}}</div>
{{/override}}
{{#warning}}
<div class="form-warning">{{warning}}</div>
{{/warning}}
</label>
{{#customcontrol}}
<p {{#labelfor}}id="{{labelfor}}_label"{{/labelfor}}>
{{{title}}}
{{#override}}
<div class="form-overridden">{{override}}</div>
{{/override}}
{{#warning}}
<div class="form-warning">{{warning}}</div>
{{/warning}}
</p>
{{/customcontrol}}
{{^customcontrol}}
<label {{#labelfor}}for="{{labelfor}}"{{/labelfor}}>
{{{title}}}
{{#override}}
<div class="form-overridden">{{override}}</div>
{{/override}}
{{#warning}}
<div class="form-warning">{{warning}}</div>
{{/warning}}
</label>
{{/customcontrol}}
<span class="form-shortname d-block small text-muted">{{{name}}}</span>
</div>
<div class="form-setting col-sm-9">
@@ -72,3 +85,16 @@
{{#dependenton}}<div class="form-dependenton mb-4 text-muted">{{{.}}}</div>{{/dependenton}}
</div>
</div>
{{#customcontrol}}
{{#js}}
require(['jquery'], function($) {
$('#{{id}}_label').css('cursor', 'default');
$('#{{id}}_label').click(function() {
$('#{{id}}')
.find('button, a, input:not([type="hidden"]), select, textarea, [tabindex]')
.filter(':not([disabled]):not([tabindex="0"]):not([tabindex="-1"])')
.first().focus();
});
});
{{/js}}
{{/customcontrol}}
+6
View File
@@ -164,6 +164,8 @@ if ($options['install']) {
mtrace("Acceptance tests site installed");
}
// Note: Do not build the themes here. This is done during the 'enable' stage.
} else if ($options['drop']) {
// Ensure no tests are running.
test_lock::acquire('behat');
@@ -182,6 +184,10 @@ if ($options['install']) {
// Enable test mode.
behat_util::start_test_mode($options['add-core-features-to-theme'], $options['optimize-runs'], $parallel, $run);
// Themes are only built in the 'enable' command.
behat_util::build_themes();
mtrace("Testing environment themes built");
// This is only displayed once for parallel install.
if (empty($run)) {
// Notify user that 2.5 profile has been converted to 3.5.
+1 -1
View File
@@ -24,7 +24,7 @@
$string['aim'] = 'This administration tool helps developers and test writers to create .feature files describing Moodle\'s functionalities and run them automatically. Step definitions available for use in .feature files are listed below.';
$string['allavailablesteps'] = 'All available step definitions';
$string['errorapproot'] = '$CFG->behat_ionic_dirroot is not pointing to a valid Moodle Mobile developer install.';
$string['errorapproot'] = '$CFG->behat_ionic_dirroot is not pointing to a valid Moodle app developer install.';
$string['errorbehatcommand'] = 'Error running behat CLI command. Try running "{$a} --help" manually from CLI to find out more about the problem.';
$string['errorcomposer'] = 'Composer dependencies are not installed.';
$string['errordataroot'] = '$CFG->behat_dataroot is not set or is invalid.';
@@ -36,7 +36,7 @@ $string['customlang:view'] = 'View local translation';
$string['filter'] = 'Filter strings';
$string['filtercomponent'] = 'Show strings of these components';
$string['filtercustomized'] = 'Customised only';
$string['filtermodified'] = 'Modified only';
$string['filtermodified'] = 'Modified in this session only';
$string['filteronlyhelps'] = 'Help only';
$string['filtershowstrings'] = 'Show strings';
$string['filterstringid'] = 'String identifier';
+23
View File
@@ -322,5 +322,28 @@ function xmldb_tool_dataprivacy_upgrade($oldversion) {
// Automatically generated Moodle v3.8.0 release upgrade line.
// Put any upgrade step following this.
if ($oldversion < 2019111801) {
// Define field commentsformat to be added to tool_dataprivacy_request.
$table = new xmldb_table('tool_dataprivacy_request');
$field = new xmldb_field('commentsformat', XMLDB_TYPE_INTEGER, '2', null, XMLDB_NOTNULL, null, '0', 'comments');
// Conditionally launch add field commentsformat.
if (!$dbman->field_exists($table, $field)) {
$dbman->add_field($table, $field);
}
// Define field dpocommentformat to be added to tool_dataprivacy_request.
$field = new xmldb_field('dpocommentformat', XMLDB_TYPE_INTEGER, '2', null, XMLDB_NOTNULL, null, '0', 'dpocomment');
// Conditionally launch add field dpocommentformat.
if (!$dbman->field_exists($table, $field)) {
$dbman->add_field($table, $field);
}
// Dataprivacy savepoint reached.
upgrade_plugin_savepoint(true, 2019111801, 'tool', 'dataprivacy');
}
return true;
}
@@ -12,7 +12,7 @@ Feature: Manage data categories
And I press "Add category"
And I set the field "Name" to "Category 1"
And I set the field "Description" to "Category 1 description"
When I click on "Save" "button" in the "Delete category" "dialogue"
When I click on "Save" "button" in the "Add category" "dialogue"
Then I should see "Category 1" in the "List of data categories" "table"
And I should see "Category 1 description" in the "Category 1" "table_row"
@@ -30,5 +30,5 @@ Feature: Manage data categories
And I choose "Delete" in the open action menu
And I should see "Delete category"
And I should see "Are you sure you want to delete the category 'Category 1'?"
When I click on "Delete" "button" in the "Confirm" "dialogue"
When I click on "Delete" "button" in the "Delete category" "dialogue"
Then I should not see "Category 1" in the "List of data categories" "table"
@@ -52,5 +52,5 @@ Feature: Manage data storage purposes
And I choose "Delete" in the open action menu
And I should see "Delete purpose"
And I should see "Are you sure you want to delete the purpose 'Purpose 1'?"
When I click on "Delete" "button" in the "Confirm" "dialogue"
When I click on "Delete" "button" in the "Delete purpose" "dialogue"
Then I should not see "Purpose 1" in the "List of data purposes" "table"
+1 -1
View File
@@ -24,6 +24,6 @@
defined('MOODLE_INTERNAL') || die;
$plugin->version = 2019111800;
$plugin->version = 2019111801;
$plugin->requires = 2019111200; // Moodle 3.5dev (Build 2018031600) and upwards.
$plugin->component = 'tool_dataprivacy';
+1 -1
View File
@@ -1,2 +1,2 @@
define ("tool_lp/dialogue",["core/yui"],function(a){var b=function(b,c,d,e,f){this.yuiDialogue=null;var g=this;if("undefined"==typeof f){f=!1}a.use("moodle-core-notification","timers",function(){var h="480px";if(f){h="800px"}g.yuiDialogue=new M.core.dialogue({headerContent:b,bodyContent:c,draggable:!0,visible:!1,center:!0,modal:!0,width:h});g.yuiDialogue.after("visibleChange",function(b){if(b.newVal){if("undefined"!=typeof d){a.soon(function(){d(g);g.yuiDialogue.centerDialogue()})}}else{if("undefined"!=typeof e){a.soon(function(){e(g)})}}});g.yuiDialogue.show()})};b.prototype.close=function(){this.yuiDialogue.hide();this.yuiDialogue.destroy()};b.prototype.getContent=function(){return this.yuiDialogue.bodyNode.getDOMNode()};return b});
define ("tool_lp/dialogue",["core/yui"],function(a){var b=function(b,c,d,e,f){M.util.js_pending("tool_lp/dialogue:dialogue");this.yuiDialogue=null;var g=this;if("undefined"==typeof f){f=!1}a.use("moodle-core-notification","timers",function(){var h="480px";if(f){h="800px"}g.yuiDialogue=new M.core.dialogue({headerContent:b,bodyContent:c,draggable:!0,visible:!1,center:!0,modal:!0,width:h});g.yuiDialogue.before("visibleChange",function(){M.util.js_pending("tool_lp/dialogue:before:visibleChange")});g.yuiDialogue.after("visibleChange",function(b){if(b.newVal){if("undefined"!=typeof d){a.soon(function(){d(g);g.yuiDialogue.centerDialogue();M.util.js_complete("tool_lp/dialogue:before:visibleChange")})}else{M.util.js_complete("tool_lp/dialogue:before:visibleChange")}}else{if("undefined"!=typeof e){a.soon(function(){e(g);M.util.js_complete("tool_lp/dialogue:before:visibleChange")})}else{M.util.js_complete("tool_lp/dialogue:before:visibleChange")}}});g.yuiDialogue.show();M.util.js_complete("tool_lp/dialogue:dialogue")})};b.prototype.close=function(){this.yuiDialogue.hide();this.yuiDialogue.destroy()};b.prototype.getContent=function(){return this.yuiDialogue.bodyNode.getDOMNode()};return b});
//# sourceMappingURL=dialogue.min.js.map
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1,2 +1,2 @@
define ("tool_lp/grade_dialogue",["jquery","core/notification","core/templates","tool_lp/dialogue","tool_lp/event_base","core/str"],function(a,b,c,d,e,f){var g=function(a){e.prototype.constructor.apply(this,[]);this._ratingOptions=a};g.prototype=Object.create(e.prototype);g.prototype._popup=null;g.prototype._ratingOptions=null;g.prototype._afterRender=function(){var b=this._find("[data-action=\"rate\"]"),c=this._find("[name=\"rating\"]"),d=this._find("[name=\"comment\"]");this._find("[data-action=\"cancel\"]").click(function(a){a.preventDefault();this._trigger("cancelled");this.close()}.bind(this));c.change(function(){var c=a(this);if(!c.val()){b.prop("disabled",!0)}else{b.prop("disabled",!1)}}).change();b.click(function(a){a.preventDefault();var b=c.val();if(!b){return}this._trigger("rated",{rating:b,note:d.val()});this.close()}.bind(this))};g.prototype.close=function(){this._popup.close();this._popup=null};g.prototype.display=function(){return a.when(f.get_string("rate","tool_lp"),this._render()).then(function(a,b){this._popup=new d(a,b[0],this._afterRender.bind(this));return this._popup}.bind(this)).catch(b.exception)};g.prototype._find=function(b){return a(this._popup.getContent()).find(b)};g.prototype._render=function(){var a={cangrade:this._canGrade,ratings:this._ratingOptions};return c.render("tool_lp/competency_grader",a)};return g});
define ("tool_lp/grade_dialogue",["jquery","core/notification","core/templates","tool_lp/dialogue","tool_lp/event_base","core/str"],function(a,b,c,d,e,f){var g=function(a){e.prototype.constructor.apply(this,[]);this._ratingOptions=a};g.prototype=Object.create(e.prototype);g.prototype._popup=null;g.prototype._ratingOptions=null;g.prototype._afterRender=function(){var b=this._find("[data-action=\"rate\"]"),c=this._find("[name=\"rating\"]"),d=this._find("[name=\"comment\"]");this._find("[data-action=\"cancel\"]").click(function(a){a.preventDefault();this._trigger("cancelled");this.close()}.bind(this));c.change(function(){var c=a(this);if(!c.val()){b.prop("disabled",!0)}else{b.prop("disabled",!1)}}).change();b.click(function(a){a.preventDefault();var b=c.val();if(!b){return}this._trigger("rated",{rating:b,note:d.val()});this.close()}.bind(this))};g.prototype.close=function(){this._popup.close();this._popup=null};g.prototype.display=function(){M.util.js_pending("tool_lp/grade_dialogue:display");return a.when(f.get_string("rate","tool_lp"),this._render()).then(function(a,b){this._popup=new d(a,b[0],function(){this._afterRender();M.util.js_complete("tool_lp/grade_dialogue:display")}.bind(this));return this._popup}.bind(this)).catch(b.exception)};g.prototype._find=function(b){return a(this._popup.getContent()).find(b)};g.prototype._render=function(){var a={cangrade:this._canGrade,ratings:this._ratingOptions};return c.render("tool_lp/competency_grader",a)};return g});
//# sourceMappingURL=grade_dialogue.min.js.map
File diff suppressed because one or more lines are too long
@@ -1,2 +1,2 @@
define ("tool_lp/grade_user_competency_inline",["jquery","core/notification","core/ajax","core/log","tool_lp/grade_dialogue","tool_lp/event_base","tool_lp/scalevalues"],function(a,b,c,d,e,f,g){var h=function(b,c,d,e,g,h,i){f.prototype.constructor.apply(this,[]);var j=a(b);if(!j.length){throw new Error("Could not find the trigger")}this._scaleId=c;this._competencyId=d;this._userId=e;this._planId=g;this._courseId=h;this._chooseStr=i;this._setUp();j.click(function(a){a.preventDefault();this._dialogue.display()}.bind(this));if(this._planId){this._methodName="core_competency_grade_competency_in_plan";this._args={competencyid:this._competencyId,planid:this._planId}}else if(this._courseId){this._methodName="core_competency_grade_competency_in_course";this._args={competencyid:this._competencyId,courseid:this._courseId,userid:this._userId}}else{this._methodName="core_competency_grade_competency";this._args={userid:this._userId,competencyid:this._competencyId}}};h.prototype=Object.create(f.prototype);h.prototype._setUp=function(){var a=[],d=this,f=g.get_values(d._scaleId);f.then(function(b){a.push({value:"",name:d._chooseStr});for(var c=0,e;c<b.length;c++){e=b[c];a.push({value:e.id,name:e.name})}return a}).then(function(a){return new e(a)}).then(function(a){a.on("rated",function(a,e){var f=d._args;f.grade=e.rating;f.note=e.note;c.call([{methodname:d._methodName,args:f,done:function done(a){d._trigger("competencyupdated",{args:f,evidence:a})},fail:b.exception}])});return a}).then(function(a){d._dialogue=a}).fail(b.exception)};h.prototype._scaleId=null;h.prototype._competencyId=null;h.prototype._userId=null;h.prototype._planId=null;h.prototype._courseId=null;h.prototype._chooseStr=null;h.prototype._dialogue=null;return h});
define ("tool_lp/grade_user_competency_inline",["jquery","core/notification","core/ajax","core/log","tool_lp/grade_dialogue","tool_lp/event_base","tool_lp/scalevalues"],function(a,b,c,d,e,f,g){var h=function(b,c,d,e,g,h,i){f.prototype.constructor.apply(this,[]);var j=a(b);if(!j.length){throw new Error("Could not find the trigger")}this._scaleId=c;this._competencyId=d;this._userId=e;this._planId=g;this._courseId=h;this._chooseStr=i;this._setUp();j.click(function(a){a.preventDefault();this._dialogue.display()}.bind(this));if(this._planId){this._methodName="core_competency_grade_competency_in_plan";this._args={competencyid:this._competencyId,planid:this._planId}}else if(this._courseId){this._methodName="core_competency_grade_competency_in_course";this._args={competencyid:this._competencyId,courseid:this._courseId,userid:this._userId}}else{this._methodName="core_competency_grade_competency";this._args={userid:this._userId,competencyid:this._competencyId}}};h.prototype=Object.create(f.prototype);h.prototype._setUp=function(){var a=[],d=this;M.util.js_pending("tool_lp/grade_user_competency_inline:_setUp");var f=g.get_values(d._scaleId);f.then(function(b){a.push({value:"",name:d._chooseStr});for(var c=0,e;c<b.length;c++){e=b[c];a.push({value:e.id,name:e.name})}return a}).then(function(a){return new e(a)}).then(function(a){a.on("rated",function(a,e){var f=d._args;f.grade=e.rating;f.note=e.note;c.call([{methodname:d._methodName,args:f,done:function done(a){d._trigger("competencyupdated",{args:f,evidence:a})},fail:b.exception}])});return a}).then(function(a){d._dialogue=a;M.util.js_complete("tool_lp/grade_user_competency_inline:_setUp")}).fail(b.exception)};h.prototype._scaleId=null;h.prototype._competencyId=null;h.prototype._userId=null;h.prototype._planId=null;h.prototype._courseId=null;h.prototype._chooseStr=null;h.prototype._dialogue=null;return h});
//# sourceMappingURL=grade_user_competency_inline.min.js.map
File diff suppressed because one or more lines are too long
+13
View File
@@ -35,6 +35,8 @@ define(['core/yui'], function(Y) {
* @param {Boolean} wide Specify we want an extra wide dialogue (the size is standard, but wider than the default).
*/
var dialogue = function(title, content, afterShow, afterHide, wide) {
M.util.js_pending('tool_lp/dialogue:dialogue');
this.yuiDialogue = null;
var parent = this;
@@ -59,6 +61,10 @@ define(['core/yui'], function(Y) {
width: width
});
parent.yuiDialogue.before('visibleChange', function() {
M.util.js_pending('tool_lp/dialogue:before:visibleChange');
});
parent.yuiDialogue.after('visibleChange', function(e) {
if (e.newVal) {
// Delay the callback call to the next tick, otherwise it can happen that it is
@@ -67,18 +73,25 @@ define(['core/yui'], function(Y) {
Y.soon(function() {
afterShow(parent);
parent.yuiDialogue.centerDialogue();
M.util.js_complete('tool_lp/dialogue:before:visibleChange');
});
} else {
M.util.js_complete('tool_lp/dialogue:before:visibleChange');
}
} else {
if ((typeof afterHide !== 'undefined')) {
Y.soon(function() {
afterHide(parent);
M.util.js_complete('tool_lp/dialogue:before:visibleChange');
});
} else {
M.util.js_complete('tool_lp/dialogue:before:visibleChange');
}
}
});
parent.yuiDialogue.show();
M.util.js_complete('tool_lp/dialogue:dialogue');
});
};
+5 -1
View File
@@ -102,6 +102,7 @@ define(['jquery',
* @return {Promise}
*/
Grade.prototype.display = function() {
M.util.js_pending('tool_lp/grade_dialogue:display');
return $.when(
Str.get_string('rate', 'tool_lp'),
this._render()
@@ -110,7 +111,10 @@ define(['jquery',
this._popup = new Dialogue(
title,
templateResult[0],
this._afterRender.bind(this)
function() {
this._afterRender();
M.util.js_complete('tool_lp/grade_dialogue:display');
}.bind(this)
);
return this._popup;
@@ -94,6 +94,7 @@ define(['jquery',
var options = [],
self = this;
M.util.js_pending('tool_lp/grade_user_competency_inline:_setUp');
var promise = ScaleValues.get_values(self._scaleId);
promise.then(function(scalevalues) {
options.push({
@@ -134,6 +135,7 @@ define(['jquery',
.then(function(dialogue) {
self._dialogue = dialogue;
M.util.js_complete('tool_lp/grade_user_competency_inline:_setUp');
return;
})
.fail(notification.exception);
+1 -1
View File
@@ -1,2 +1,2 @@
define ("tool_usertours/usertours",["core/ajax","tool_usertours/tour","jquery","core/templates","core/str","core/log","core/notification"],function(a,b,c,d,e,f,g){var h={tourId:null,currentTour:null,context:null,init:function init(a,b,d){h.tourId=a;h.context=d;if("undefined"==typeof b){b=!0}if(b){h.fetchTour(a)}h.addResetLink();c("body").on("click","[data-action=\"tool_usertours/resetpagetour\"]",function(a){a.preventDefault();h.resetTourState(h.tourId)})},fetchTour:function fetchTour(b){M.util.js_pending("admin_usertour_fetchTour"+b);c.when(a.call([{methodname:"tool_usertours_fetch_and_start_tour",args:{tourid:b,context:h.context,pageurl:window.location.href}}])[0],d.render("tool_usertours/tourstep",{})).then(function(a,c){return h.startBootstrapTour(b,c[0],a.tourconfig)}).always(function(){M.util.js_complete("admin_usertour_fetchTour"+b)}).fail(g.exception)},addResetLink:function addResetLink(){var a;M.util.js_pending("admin_usertour_addResetLink");if(c(".tool_usertours-resettourcontainer").length){a=c(".tool_usertours-resettourcontainer")}else if(c(".logininfo").length){a=c(".logininfo")}else if(c("footer").length){a=c("footer")}else{a=c("body")}d.render("tool_usertours/resettour",{}).then(function(b,c){d.appendNodeContents(a,b,c)}).always(function(){M.util.js_complete("admin_usertour_addResetLink")}).fail()},startBootstrapTour:function startBootstrapTour(a,c,d){if(h.currentTour){d.onEnd=null;h.currentTour.endTour();delete h.currentTour}d.eventHandlers={afterEnd:[h.markTourComplete],afterRender:[h.markStepShown]};d.tourName=d.name;delete d.name;d.template=c;d.steps=d.steps.map(function(a){if("undefined"!=typeof a.element){a.target=a.element;delete a.element}if("undefined"!=typeof a.reflex){a.moveOnClick=!!a.reflex;delete a.reflex}if("undefined"!=typeof a.content){a.body=a.content;delete a.content}return a});h.currentTour=new b(d);return h.currentTour.startTour()},markStepShown:function markStepShown(){var b=this.getStepConfig(this.getCurrentStepNumber());c.when(a.call([{methodname:"tool_usertours_step_shown",args:{tourid:h.tourId,context:h.context,pageurl:window.location.href,stepid:b.stepid,stepindex:this.getCurrentStepNumber()}}])[0]).fail(f.error)},markTourComplete:function markTourComplete(){var b=this.getStepConfig(this.getCurrentStepNumber());c.when(a.call([{methodname:"tool_usertours_complete_tour",args:{tourid:h.tourId,context:h.context,pageurl:window.location.href,stepid:b.stepid,stepindex:this.getCurrentStepNumber()}}])[0]).fail(f.error)},resetTourState:function resetTourState(b){c.when(a.call([{methodname:"tool_usertours_reset_tour",args:{tourid:b,context:h.context,pageurl:window.location.href}}])[0]).then(function(a){if(a.startTour){h.fetchTour(a.startTour)}}).fail(g.exception)}};return{init:h.init,resetTourState:h.resetTourState}});
define ("tool_usertours/usertours",["core/ajax","tool_usertours/tour","jquery","core/templates","core/str","core/log","core/notification"],function(a,b,c,d,e,f,g){var h={tourId:null,currentTour:null,context:null,init:function init(a,b,d){h.tourId=a;h.context=d;if("undefined"==typeof b){b=!0}if(b){h.fetchTour(a)}h.addResetLink();c("body").on("click","[data-action=\"tool_usertours/resetpagetour\"]",function(a){a.preventDefault();h.resetTourState(h.tourId)})},fetchTour:function fetchTour(b){M.util.js_pending("admin_usertour_fetchTour"+b);c.when(a.call([{methodname:"tool_usertours_fetch_and_start_tour",args:{tourid:b,context:h.context,pageurl:window.location.href}}])[0],d.render("tool_usertours/tourstep",{})).then(function(a,c){if(!a.hasOwnProperty("tourconfig")){return}return h.startBootstrapTour(b,c[0],a.tourconfig)}).always(function(){M.util.js_complete("admin_usertour_fetchTour"+b)}).fail(g.exception)},addResetLink:function addResetLink(){var a;M.util.js_pending("admin_usertour_addResetLink");if(c(".tool_usertours-resettourcontainer").length){a=c(".tool_usertours-resettourcontainer")}else if(c(".logininfo").length){a=c(".logininfo")}else if(c("footer").length){a=c("footer")}else{a=c("body")}d.render("tool_usertours/resettour",{}).then(function(b,c){d.appendNodeContents(a,b,c)}).always(function(){M.util.js_complete("admin_usertour_addResetLink")}).fail()},startBootstrapTour:function startBootstrapTour(a,c,d){if(h.currentTour){d.onEnd=null;h.currentTour.endTour();delete h.currentTour}d.eventHandlers={afterEnd:[h.markTourComplete],afterRender:[h.markStepShown]};d.tourName=d.name;delete d.name;d.template=c;d.steps=d.steps.map(function(a){if("undefined"!=typeof a.element){a.target=a.element;delete a.element}if("undefined"!=typeof a.reflex){a.moveOnClick=!!a.reflex;delete a.reflex}if("undefined"!=typeof a.content){a.body=a.content;delete a.content}return a});h.currentTour=new b(d);return h.currentTour.startTour()},markStepShown:function markStepShown(){var b=this.getStepConfig(this.getCurrentStepNumber());c.when(a.call([{methodname:"tool_usertours_step_shown",args:{tourid:h.tourId,context:h.context,pageurl:window.location.href,stepid:b.stepid,stepindex:this.getCurrentStepNumber()}}])[0]).fail(f.error)},markTourComplete:function markTourComplete(){var b=this.getStepConfig(this.getCurrentStepNumber());c.when(a.call([{methodname:"tool_usertours_complete_tour",args:{tourid:h.tourId,context:h.context,pageurl:window.location.href,stepid:b.stepid,stepindex:this.getCurrentStepNumber()}}])[0]).fail(f.error)},resetTourState:function resetTourState(b){c.when(a.call([{methodname:"tool_usertours_reset_tour",args:{tourid:b,context:h.context,pageurl:window.location.href}}])[0]).then(function(a){if(a.startTour){h.fetchTour(a.startTour)}}).fail(g.exception)}};return{init:h.init,resetTourState:h.resetTourState}});
//# sourceMappingURL=usertours.min.js.map
File diff suppressed because one or more lines are too long
@@ -69,6 +69,11 @@ function(ajax, BootstrapTour, $, templates, str, log, notification) {
templates.render('tool_usertours/tourstep', {})
)
.then(function(response, template) {
// If we don't have any tour config (because it doesn't need showing for the current user), return early.
if (!response.hasOwnProperty('tourconfig')) {
return;
}
return usertours.startBootstrapTour(tourId, template[0], response.tourconfig);
})
.always(function() {
+3 -3
View File
@@ -70,9 +70,9 @@ class tour extends external_api {
\tool_usertours\event\tour_started::create([
'contextid' => $context->id,
'objectid' => $tourid,
'objectid' => $tour->get_id(),
'other' => [
'pageurl' => $pageurl,
'pageurl' => $params['pageurl'],
],
])->trigger();
@@ -104,7 +104,7 @@ class tour extends external_api {
'tourconfig' => new external_single_structure([
'name' => new external_value(PARAM_RAW, 'Tour Name'),
'steps' => new external_multiple_structure(self::step_structure_returns()),
])
], 'Tour config', VALUE_OPTIONAL)
]);
}
+5
View File
@@ -1,4 +1,9 @@
This files describes API changes in the tool_usertours code.
=== 3.8.4 ===
* The `tourconfig` property returned by the `tool_usertours_fetch_and_start_tour`
external method is now optional, and will be omitted if the tour shouldn't be
shown to the current user
=== 3.5 ===
* Third party library Popper.js was moved from this plugin into core (core/popper)
+1 -1
View File
@@ -158,5 +158,5 @@ Feature: Manage analytics models
Scenario: Delete model
When I open the action menu in "Students at risk of not meeting the course completion conditions" "table_row"
And I choose "Delete" in the open action menu
And I click on "Delete" "button" in the "Confirm" "dialogue"
And I click on "Delete" "button" in the "Delete" "dialogue"
Then I should not see "Students at risk of not meeting the course completion conditions"
+15 -3
View File
@@ -76,9 +76,21 @@ class auth_email_external_testcase extends externallib_advanced_testcase {
$this->assertEquals(print_password_policy(), $result['passwordpolicy']);
$this->assertNotContains('recaptchachallengehash', $result);
$this->assertNotContains('recaptchachallengeimage', $result);
$this->assertCount(2, $result['profilefields']);
$this->assertEquals('text', $result['profilefields'][0]['datatype']);
$this->assertEquals('textarea', $result['profilefields'][1]['datatype']);
// Whip up a array with named entries to easily check against.
$namedarray = array();
foreach ($result['profilefields'] as $key => $value) {
$namedarray[$value['shortname']] = array(
'datatype' => $value['datatype']
);
}
// Just check if we have the fields from this test. If a plugin adds fields we'll let it slide.
$this->assertArrayHasKey('frogname', $namedarray);
$this->assertArrayHasKey('sometext', $namedarray);
$this->assertEquals('text', $namedarray['frogname']['datatype']);
$this->assertEquals('textarea', $namedarray['sometext']['datatype']);
}
public function test_signup_user() {
+4 -3
View File
@@ -455,8 +455,9 @@ class auth extends \auth_plugin_base {
}
}
$issuer = $client->get_issuer();
// First we try and find a defined mapping.
$linkedlogin = api::match_username_to_user($userinfo['username'], $client->get_issuer());
$linkedlogin = api::match_username_to_user($userinfo['username'], $issuer);
if (!empty($linkedlogin) && empty($linkedlogin->get('confirmtoken'))) {
$mappeduser = get_complete_user_data('id', $linkedlogin->get('userid'));
@@ -474,7 +475,7 @@ class auth extends \auth_plugin_base {
$SESSION->loginerrormsg = get_string('invalidlogin');
$client->log_out();
redirect(new moodle_url('/login/index.php'));
} else if ($mappeduser && $mappeduser->confirmed) {
} else if ($mappeduser && ($mappeduser->confirmed || !$issuer->get('requireconfirmation'))) {
// Update user fields.
$userinfo = $this->update_user($userinfo, $mappeduser);
$userwasmapped = true;
@@ -503,7 +504,7 @@ class auth extends \auth_plugin_base {
redirect(new moodle_url('/login/index.php'));
}
$issuer = $client->get_issuer();
if (!$issuer->is_valid_login_domain($oauthemail)) {
// Trigger login failed event.
$failurereason = AUTH_LOGIN_UNAUTHORISED;
@@ -175,6 +175,20 @@ abstract class restore_qtype_plugin extends restore_plugin {
}
}
$rules = restore_course_task::define_decode_rules();
$rulesactivity = restore_quiz_activity_task::define_decode_rules();
$rules = array_merge($rules, $rulesactivity);
$decoder = $this->task->get_decoder();
foreach ($rules as $rule) {
$decoder->add_rule($rule);
}
$contentdecoded = $decoder->decode_content($data->answertext);
if ($contentdecoded) {
$data->answertext = $contentdecoded;
}
if (!isset($this->questionanswercache[$data->answertext])) {
// If we haven't found the matching answer, something has gone really wrong, the question in the DB
// is missing answers, throw an exception.
@@ -0,0 +1,97 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Decode links quiz restore tests.
*
* @package core_backup
* @copyright 2020 Ilya Tregubov <mattp@catalyst-au.net>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
// Include all the needed stuff.
global $CFG;
require_once($CFG->dirroot . '/course/lib.php');
require_once($CFG->dirroot . '/backup/util/includes/restore_includes.php');
require_once($CFG->dirroot . '/question/engine/tests/helpers.php');
/**
* restore_decode tests (both rule and content)
*/
class restore_quiz_decode_testcase extends \core_privacy\tests\provider_testcase {
/**
* Test restore_decode_rule class
*/
public function test_restore_quiz_decode_links() {
global $DB, $CFG, $USER;
$this->resetAfterTest(true);
$this->setAdminUser();
$generator = $this->getDataGenerator();
$course = $generator->create_course(
array('format' => 'topics', 'numsections' => 3,
'enablecompletion' => COMPLETION_ENABLED),
array('createsections' => true));
$quiz = $generator->create_module('quiz', array(
'course' => $course->id));
// Create questions.
$questiongenerator = $this->getDataGenerator()->get_plugin_generator('core_question');
$context = context_course::instance($course->id);
$cat = $questiongenerator->create_question_category(array('contextid' => $context->id));
$question = $questiongenerator->create_question('multichoice', null, array('category' => $cat->id));
// Add to the quiz.
quiz_add_quiz_question($question->id, $quiz);
$questiondata = question_bank::load_question_data($question->id);
$firstanswer = array_shift($questiondata->options->answers);
$DB->set_field('question_answers', 'answer', $CFG->wwwroot . '/course/view.php?id=' . $course->id,
['id' => $firstanswer->id]);
$secondanswer = array_shift($questiondata->options->answers);
$DB->set_field('question_answers', 'answer', $CFG->wwwroot . '/mod/quiz/view.php?id=' . $quiz->cmid,
['id' => $secondanswer->id]);
$thirdanswer = array_shift($questiondata->options->answers);
$DB->set_field('question_answers', 'answer', $CFG->wwwroot . '/grade/report/index.php?id=' . $quiz->cmid,
['id' => $thirdanswer->id]);
$fourthanswer = array_shift($questiondata->options->answers);
$DB->set_field('question_answers', 'answer', $CFG->wwwroot . '/mod/quiz/index.php?id=' . $quiz->cmid,
['id' => $fourthanswer->id]);
$newcm = duplicate_module($course, get_fast_modinfo($course)->get_cm($quiz->cmid));
$sql = "SELECT qa.answer
FROM {quiz} q
LEFT JOIN {quiz_slots} qs ON qs.quizid = q.id
LEFT JOIN {question_answers} qa ON qa.question = qs.questionid
WHERE q.id = :quizid";
$params = array('quizid' => $newcm->instance);
$answers = $DB->get_fieldset_sql($sql, $params);
$this->assertEquals($CFG->wwwroot . '/course/view.php?id=' . $course->id, $answers[0]);
$this->assertEquals($CFG->wwwroot . '/mod/quiz/view.php?id=' . $quiz->cmid, $answers[1]);
$this->assertEquals($CFG->wwwroot . '/grade/report/index.php?id=' . $quiz->cmid, $answers[2]);
$this->assertEquals($CFG->wwwroot . '/mod/quiz/index.php?id=' . $quiz->cmid, $answers[3]);
}
}
+8
View File
@@ -67,6 +67,14 @@ if ($action == 'edit') {
echo $output->heading(get_string('managebackpacks', 'badges'));
$form->display();
} else if ($action == 'test') {
// If no backpack has been selected, there isn't anything to test.
if (empty($id)) {
redirect($url);
}
echo $OUTPUT->header();
echo $output->render_test_backpack_result($id);
} else {
echo $OUTPUT->header();
echo $output->heading(get_string('managebackpacks', 'badges'));
@@ -68,9 +68,9 @@ class external_backpacks_page implements \renderable {
} else {
$backpack->canedit = false;
}
$backpack->cantest = ($backpack->apiversion == OPEN_BADGES_V2);
$data->backpacks[] = $backpack;
}
$data->warning = badges_verify_site_backpack();
return $data;
}
+31
View File
@@ -1362,4 +1362,35 @@ class core_badges_renderer extends plugin_renderer_base {
$data = $page->export_for_template($this);
return parent::render_from_template('core_badges/external_backpacks_page', $data);
}
/**
* Get the result of a backpack validation with its settings. It returns:
* - A informative message if the backpack version is different from OBv2.
* - A warning with the error if it's not possible to connect to this backpack.
* - A successful message if the connection has worked.
*
* @param int $backpackid The backpack identifier.
* @return string A message with the validation result.
*/
public function render_test_backpack_result(int $backpackid): string {
// Get the backpack.
$backpack = badges_get_site_backpack($backpackid);
// Add the header to the result.
$result = $this->heading(get_string('testbackpack', 'badges', $backpack->backpackweburl));
if ($backpack->apiversion != OPEN_BADGES_V2) {
// Only OBv2 supports this validation.
$result .= get_string('backpackconnectionnottested', 'badges');
} else {
$message = badges_verify_backpack($backpackid);
if (empty($message)) {
$result .= get_string('backpackconnectionok', 'badges');
} else {
$result .= $message;
}
}
return $result;
}
}
@@ -25,9 +25,8 @@
Example context (json):
{
"backpacks": [
{"backpackweburl": "http://localhost/", "sitebackpack": true, "canedit": false}
],
"warning": "<span class='text-warning'>Could not login</span>"
{"backpackweburl": "http://localhost/", "sitebackpack": true, "canedit": false, "cantest": true}
]
}
}}
<table class="generaltable fullwidth">
@@ -46,13 +45,15 @@
<td> {{#sitebackpack}}Yes{{/sitebackpack}} </td>
<td>
{{#canedit}}
<a href="{{baseurl}}?id={{id}}&action=edit">
{{#str}}editsettings, core_badges{{/str}}
</a>
<a href="{{baseurl}}?id={{id}}&action=edit">{{#pix}}t/edit, core,{{#str}}editsettings{{/str}}{{/pix}}</a>
{{/canedit}}
{{#cantest}}
<a href="{{baseurl}}?id={{id}}&action=test">
{{#pix}}t/check, core,{{#str}}testsettings, core_badges{{/str}}{{/pix}}
</a>
{{/cantest}}
</td>
</tr>
{{/backpacks}}
</tbody>
</table>
{{{warning}}}
@@ -342,13 +342,13 @@ class block_activity_results extends block_base {
$rank = 0;
if (!empty($best)) {
$this->content->text .= '<table class="grades"><caption>';
$this->content->text .= '<table class="grades"><caption class="pb-0"><h6>';
if ($numbest == 1) {
$this->content->text .= get_string('bestgroupgrade', 'block_activity_results');
} else {
$this->content->text .= get_string('bestgroupgrades', 'block_activity_results', $numbest);
}
$this->content->text .= '</caption><colgroup class="number" />';
$this->content->text .= '</h6></caption><colgroup class="number" />';
$this->content->text .= '<colgroup class="name" /><colgroup class="grade" /><tbody>';
foreach ($best as $groupid => $averagegrade) {
switch ($nameformat) {
@@ -398,13 +398,13 @@ class block_activity_results extends block_base {
$rank = 0;
if (!empty($worst)) {
$worst = array_reverse($worst, true);
$this->content->text .= '<table class="grades"><caption>';
$this->content->text .= '<table class="grades"><caption class="pb-0"><h6>';
if ($numworst == 1) {
$this->content->text .= get_string('worstgroupgrade', 'block_activity_results');
} else {
$this->content->text .= get_string('worstgroupgrades', 'block_activity_results', $numworst);
}
$this->content->text .= '</caption><colgroup class="number" />';
$this->content->text .= '</h6></caption><colgroup class="number" />';
$this->content->text .= '<colgroup class="name" /><colgroup class="grade" /><tbody>';
foreach ($worst as $groupid => $averagegrade) {
switch ($nameformat) {
@@ -529,13 +529,13 @@ class block_activity_results extends block_base {
$rank = 0;
if (!empty($best)) {
$this->content->text .= '<table class="grades"><caption>';
$this->content->text .= '<table class="grades"><caption class="pb-0"><h6>';
if ($numbest == 1) {
$this->content->text .= get_string('bestgrade', 'block_activity_results');
} else {
$this->content->text .= get_string('bestgrades', 'block_activity_results', $numbest);
}
$this->content->text .= '</caption><colgroup class="number" />';
$this->content->text .= '</h6></caption><colgroup class="number" />';
$this->content->text .= '<colgroup class="name" /><colgroup class="grade" /><tbody>';
foreach ($best as $userid => $gradeid) {
switch ($nameformat) {
@@ -592,13 +592,13 @@ class block_activity_results extends block_base {
$rank = 0;
if (!empty($worst)) {
$worst = array_reverse($worst, true);
$this->content->text .= '<table class="grades"><caption>';
$this->content->text .= '<table class="grades"><caption class="pb-0"><h6>';
if ($numbest == 1) {
$this->content->text .= get_string('worstgrade', 'block_activity_results');
} else {
$this->content->text .= get_string('worstgrades', 'block_activity_results', $numworst);
}
$this->content->text .= '</caption><colgroup class="number" />';
$this->content->text .= '</h6></caption><colgroup class="number" />';
$this->content->text .= '<colgroup class="name" /><colgroup class="grade" /><tbody>';
foreach ($worst as $userid => $gradeid) {
switch ($nameformat) {
@@ -678,17 +678,17 @@ class block_activity_results extends block_base {
}
/**
* Generates the Link to the activity module when displaed outside of the module
* Generates the Link to the activity module when displayed outside of the module.
* @param stdclass $activity
* @param stdclass $cm
* @return string
*/
private function activity_link($activity, $cm) {
$o = html_writer::start_tag('h3');
$o = html_writer::start_tag('h5');
$o .= html_writer::link(new moodle_url('/mod/'.$activity->itemmodule.'/view.php',
array('id' => $cm->id)), format_string(($activity->itemname), true, ['context' => context_module::instance($cm->id)]));
$o .= html_writer::end_tag('h3');
$o .= html_writer::end_tag('h5');
return $o;
}
-5
View File
@@ -21,8 +21,3 @@
.block_activity_results table.grades .grade {
text-align: right;
}
.block_activity_results table.grades caption {
font-weight: bold;
font-size: 18px;
}
+8 -4
View File
@@ -99,10 +99,14 @@ class block_blog_menu extends block_base {
// Prepare the footer for this block
if (has_capability('moodle/blog:search', context_system::instance())) {
// Full-text search field
$form = html_writer::tag('label', get_string('search', 'admin'), array('for'=>'blogsearchquery', 'class'=>'accesshide'));
$form .= html_writer::empty_tag('input', array('id'=>'blogsearchquery', 'type'=>'text', 'name'=>'search'));
$form .= html_writer::empty_tag('input', array('type'=>'submit', 'value'=>get_string('search')));
$this->content->footer = html_writer::tag('form', html_writer::tag('div', $form), array('class'=>'blogsearchform', 'method'=>'get', 'action'=>new moodle_url('/blog/index.php')));
$form = html_writer::tag('label', get_string('search', 'admin'), array('for' => 'blogsearchquery',
'class' => 'accesshide'));
$form .= html_writer::empty_tag('input', array('id' => 'blogsearchquery', 'class' => 'form-control mr-1',
'type' => 'text', 'name' => 'search'));
$form .= html_writer::empty_tag('input', array('type' => 'submit', 'class' => 'btn btn-secondary',
'value' => get_string('search')));
$this->content->footer = html_writer::tag('form', html_writer::tag('div', $form), array(
'class' => 'blogsearchform form-inline', 'method' => 'get', 'action' => new moodle_url('/blog/index.php')));
} else {
// No footer to display
$this->content->footer = '';
+5
View File
@@ -221,6 +221,11 @@ class block_base {
public function get_content_for_output($output) {
global $CFG;
// We can exit early if the current user doesn't have the capability to view the block.
if (!has_capability('moodle/block:view', $this->context)) {
return null;
}
$bc = new block_contents($this->html_attributes());
$bc->attributes['data-block'] = $this->name();
$bc->blockinstanceid = $this->instance->id;
+5 -3
View File
@@ -267,9 +267,11 @@ class core_block_externallib_testcase extends externallib_advanced_testcase {
$returnedblocks[] = $block['name'];
// Check the configuration returned for this default block.
if ($block['name'] == 'recentlyaccessedcourses') {
$this->assertEquals('displaycategories', $block['configs'][0]['name']);
$this->assertEquals(json_encode('0'), $block['configs'][0]['value']);
$this->assertEquals('plugin', $block['configs'][0]['type']);
// Convert config to associative array to avoid DB sorting randomness.
$config = array_column($block['configs'], null, 'name');
$this->assertArrayHasKey('displaycategories', $config);
$this->assertEquals(json_encode('0'), $config['displaycategories']['value']);
$this->assertEquals('plugin', $config['displaycategories']['type']);
}
}
// Remove lp block.
+1 -1
View File
@@ -1,2 +1,2 @@
define ("core_calendar/calendar_filter",["jquery","core_calendar/selectors","core_calendar/events","core/str","core/templates"],function(a,b,c,d,e){var f=function(d){d.on("click",b.eventFilterItem,function(b){var c=a(b.currentTarget);g(c);b.preventDefault()});a("body").on(c.viewUpdated,function(){var c=d.find(b.eventFilterItem);c.each(function(b,c){c=a(c);if(c.data("eventtype-hidden")){var d=i(c);h(d)}})})},g=function(a){var b=i(a);b.hidden=!b.hidden;return d.get_string("eventtype"+b.eventtype,"calendar").then(function(a){b.name=a;b.icon=!0;b.key="i/"+b.eventtype+"event";b.component="core";return b}).then(function(a){return e.render("core_calendar/event_filter_key",a)}).then(function(b,c){return e.replaceNode(a,b,c)}).then(function(){h(b)})},h=function(b){M.util.js_pending("month-mini-filterChanged");a("body").trigger(c.filterChanged,{type:b.eventtype,hidden:b.hidden});M.util.js_complete("month-mini-filterChanged")},i=function(a){return{eventtype:a.data("eventtype"),hidden:a.data("eventtype-hidden")}};return{init:function init(b){b=a(b);f(b)}}});
define ("core_calendar/calendar_filter",["jquery","core_calendar/selectors","core_calendar/events","core/str","core/templates"],function(a,b,c,d,e){var f=function(d){d.on("click",b.eventFilterItem,function(b){var c=a(b.currentTarget);g(c);b.preventDefault()});a("body").on(c.viewUpdated,function(){var c=d.find(b.eventFilterItem);c.each(function(b,c){c=a(c);if(c.data("eventtype-hidden")){var d=i(c);h(d)}})})},g=function(a){var b=i(a);b.hidden=!b.hidden;M.util.js_pending("core_calendar/calendar_filter:toggleFilter");return d.get_string("eventtype"+b.eventtype,"calendar").then(function(a){b.name=a;b.icon=!0;b.key="i/"+b.eventtype+"event";b.component="core";return b}).then(function(a){return e.render("core_calendar/event_filter_key",a)}).then(function(b,c){return e.replaceNode(a,b,c)}).then(function(){h(b);M.util.js_complete("core_calendar/calendar_filter:toggleFilter")})},h=function(b){M.util.js_pending("month-mini-filterChanged");a("body").trigger(c.filterChanged,{type:b.eventtype,hidden:b.hidden});M.util.js_complete("month-mini-filterChanged")},i=function(a){return{eventtype:a.data("eventtype"),hidden:a.data("eventtype-hidden")}};return{init:function init(b){b=a(b);f(b)}}});
//# sourceMappingURL=calendar_filter.min.js.map
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1,2 +1,2 @@
define ("core_calendar/crud",["jquery","core/str","core/notification","core/custom_interaction_events","core/modal","core/modal_registry","core/modal_factory","core/modal_events","core_calendar/modal_event_form","core_calendar/repository","core_calendar/events","core_calendar/modal_delete","core_calendar/selectors","core/pending"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){function o(d,e,f){var i=[{key:"deleteevent",component:"calendar"}];f=parseInt(f,10);var m,o=1<f;if(o){i.push({key:"confirmeventseriesdelete",component:"calendar",param:{name:e,count:f}});m=g.create({type:l.TYPE})}else{i.push({key:"confirmeventdelete",component:"calendar",param:e});m=g.create({type:g.types.SAVE_CANCEL})}var p=b.get_strings(i),q=a.when(p,m).then(function(b,e){e.setTitle(b[0]);e.setBody(b[1]);if(!o){e.setSaveButtonText(b[0])}e.show();e.getRoot().on(h.save,function(){var b=new n("calendar/crud:initModal:deletedevent");j.deleteEvent(d,!1).then(function(){a("body").trigger(k.deleted,[d,!1])}).then(b.resolve).catch(c.exception)});e.getRoot().on(k.deleteAll,function(){var b=new n("calendar/crud:initModal:deletedallevent");j.deleteEvent(d,!0).then(function(){a("body").trigger(k.deleted,[d,!0])}).then(b.resolve).catch(c.exception)});return e}).catch(c.exception);return q}return{registerRemove:function(b){b.on("click",m.actions.remove,function(b){var c=a(this).closest(m.eventItem),d=c.data("eventId"),e=c.data("eventTitle"),f=c.data("eventCount");o(d,e,f);b.preventDefault()})},registerEditListeners:function(b,d){d.then(function(c){a("body").on(k.editEvent,function(a,d){var e=b.find(m.wrapper);c.setEventId(d);c.setContextId(e.data("contextId"));c.show();a.stopImmediatePropagation()})}).fail(c.exception);return d},registerEventFormModal:function registerEventFormModal(b){var d=g.create({type:i.TYPE,large:!0});b.on("click",m.actions.create,function(a){d.then(function(a){var c=b.find(m.wrapper),d=c.data("categoryid");if("undefined"!=typeof d){a.setCategoryId(d)}var e=b.find(m.today),f=b.find(m.day);if(!e.length&&f.length){a.setStartTime(f.data("newEventTimestamp"))}a.setContextId(c.data("contextId"));a.setCourseId(c.data("courseid"));a.show()}).fail(c.exception);a.preventDefault()});b.on("click",m.actions.edit,function(b){b.preventDefault();var e=a(b.currentTarget),f=e.closest(m.wrapper),g=e.closest(m.eventItem);d.then(function(a){a.setEventId(g.data("eventId"));a.setContextId(f.data("contextId"));a.show();b.stopImmediatePropagation()}).fail(c.exception)});return d}}});
define ("core_calendar/crud",["jquery","core/str","core/notification","core/custom_interaction_events","core/modal","core/modal_registry","core/modal_factory","core/modal_events","core_calendar/modal_event_form","core_calendar/repository","core_calendar/events","core_calendar/modal_delete","core_calendar/selectors","core/pending"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){function o(d,e,f){var i=[{key:"deleteevent",component:"calendar"}];f=parseInt(f,10);var m,o=1<f;if(o){i.push({key:"confirmeventseriesdelete",component:"calendar",param:{name:e,count:f}});m=g.create({type:l.TYPE})}else{i.push({key:"confirmeventdelete",component:"calendar",param:e});m=g.create({type:g.types.SAVE_CANCEL})}var p=b.get_strings(i),q=a.when(p,m).then(function(b,e){e.setTitle(b[0]);e.setBody(b[1]);if(!o){e.setSaveButtonText(b[0])}e.show();e.getRoot().on(h.save,function(){var b=new n("calendar/crud:initModal:deletedevent");j.deleteEvent(d,!1).then(function(){a("body").trigger(k.deleted,[d,!1])}).then(b.resolve).catch(c.exception)});e.getRoot().on(k.deleteAll,function(){var b=new n("calendar/crud:initModal:deletedallevent");j.deleteEvent(d,!0).then(function(){a("body").trigger(k.deleted,[d,!0])}).then(b.resolve).catch(c.exception)});return e}).catch(c.exception);return q}return{registerRemove:function(b){b.on("click",m.actions.remove,function(b){var c=a(this).closest(m.eventItem),d=c.data("eventId"),e=c.data("eventTitle"),f=c.data("eventCount");o(d,e,f);b.preventDefault()})},registerEditListeners:function(b,d){var e=new n("core_calendar/crud:registerEditListeners");return d.then(function(c){a("body").on(k.editEvent,function(a,d){var e=b.find(m.wrapper);c.setEventId(d);c.setContextId(e.data("contextId"));c.show();a.stopImmediatePropagation()});return c}).then(function(a){e.resolve();return a}).catch(c.exception)},registerEventFormModal:function registerEventFormModal(b){var d=g.create({type:i.TYPE,large:!0});b.on("click",m.actions.create,function(a){d.then(function(a){var c=b.find(m.wrapper),d=c.data("categoryid");if("undefined"!=typeof d){a.setCategoryId(d)}var e=b.find(m.today),f=b.find(m.day);if(!e.length&&f.length){a.setStartTime(f.data("newEventTimestamp"))}a.setContextId(c.data("contextId"));a.setCourseId(c.data("courseid"));a.show()}).fail(c.exception);a.preventDefault()});b.on("click",m.actions.edit,function(b){b.preventDefault();var e=a(b.currentTarget),f=e.closest(m.wrapper),g=e.closest(m.eventItem);d.then(function(a){a.setEventId(g.data("eventId"));a.setContextId(f.data("contextId"));a.show();b.stopImmediatePropagation()}).fail(c.exception)});return d}}});
//# sourceMappingURL=crud.min.js.map
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1,2 +1,2 @@
define ("core_calendar/summary_modal",["jquery","core/str","core/notification","core/custom_interaction_events","core/modal","core/modal_registry","core/modal_factory","core/modal_events","core_calendar/repository","core_calendar/events","core_calendar/crud"],function(a,b,c,d,e,f,g,h,i,j,k){var l=!1,m={ROOT:"[data-region='summary-modal-container']",EDIT_BUTTON:"[data-action=\"edit\"]",DELETE_BUTTON:"[data-action=\"delete\"]"},n=function(a){e.call(this,a)};n.TYPE="core_calendar-event_summary";n.prototype=Object.create(e.prototype);n.prototype.constructor=n;n.prototype.getEditButton=function(){if("undefined"==typeof this.editButton){this.editButton=this.getFooter().find(m.EDIT_BUTTON)}return this.editButton};n.prototype.getDeleteButton=function(){if("undefined"==typeof this.deleteButton){this.deleteButton=this.getFooter().find(m.DELETE_BUTTON)}return this.deleteButton};n.prototype.getEventId=function(){return this.getBody().find(m.ROOT).attr("data-event-id")};n.prototype.getEventTitle=function(){return this.getBody().find(m.ROOT).attr("data-event-title")};n.prototype.getEventCount=function(){return this.getBody().find(m.ROOT).attr("data-event-count")};n.prototype.getEditUrl=function(){return this.getBody().find(m.ROOT).attr("data-edit-url")};n.prototype.isActionEvent=function(){return"true"==this.getBody().find(m.ROOT).attr("data-action-event")};n.prototype.registerEventListeners=function(){e.prototype.registerEventListeners.call(this);this.getRoot().on(h.bodyRendered,function(){this.getModal().data({eventTitle:this.getEventTitle(),eventId:this.getEventId(),eventCount:this.getEventCount()}).attr("data-type","event");k.registerRemove(this.getModal())}.bind(this));a("body").on(j.deleted,function(){this.hide()}.bind(this));d.define(this.getEditButton(),[d.events.activate]);this.getEditButton().on(d.events.activate,function(b,c){if(this.isActionEvent()){a("body").trigger(j.editActionEvent,[this.getEditUrl()])}else{a("body").trigger(j.editEvent,[this.getEventId()])}this.hide();b.preventDefault();b.stopPropagation();c.originalEvent.preventDefault();c.originalEvent.stopPropagation()}.bind(this))};if(!l){f.register(n.TYPE,n,"core_calendar/event_summary_modal");l=!0}return n});
define ("core_calendar/summary_modal",["jquery","core/str","core/notification","core/custom_interaction_events","core/modal","core/modal_registry","core/modal_factory","core/modal_events","core_calendar/repository","core_calendar/events","core_calendar/crud"],function(a,b,c,d,e,f,g,h,i,j,k){var l=!1,m={ROOT:"[data-region='summary-modal-container']",EDIT_BUTTON:"[data-action=\"edit\"]",DELETE_BUTTON:"[data-action=\"delete\"]"},n=function(a){e.call(this,a)};n.TYPE="core_calendar-event_summary";n.prototype=Object.create(e.prototype);n.prototype.constructor=n;n.prototype.getEditButton=function(){if("undefined"==typeof this.editButton){this.editButton=this.getFooter().find(m.EDIT_BUTTON)}return this.editButton};n.prototype.getDeleteButton=function(){if("undefined"==typeof this.deleteButton){this.deleteButton=this.getFooter().find(m.DELETE_BUTTON)}return this.deleteButton};n.prototype.getEventId=function(){return this.getBody().find(m.ROOT).attr("data-event-id")};n.prototype.getEventTitle=function(){return this.getBody().find(m.ROOT).attr("data-event-title")};n.prototype.getEventCount=function(){return this.getBody().find(m.ROOT).attr("data-event-count")};n.prototype.getEditUrl=function(){return this.getBody().find(m.ROOT).attr("data-edit-url")};n.prototype.isActionEvent=function(){return"true"==this.getBody().find(m.ROOT).attr("data-action-event")};n.prototype.registerEventListeners=function(){e.prototype.registerEventListeners.call(this);M.util.js_pending("core_calendar/summary_modal:registerEventListeners:bodyRendered");this.getRoot().on(h.bodyRendered,function(){this.getModal().data({eventTitle:this.getEventTitle(),eventId:this.getEventId(),eventCount:this.getEventCount()}).attr("data-type","event");k.registerRemove(this.getModal());M.util.js_complete("core_calendar/summary_modal:registerEventListeners:bodyRendered")}.bind(this));a("body").on(j.deleted,function(){this.hide()}.bind(this));d.define(this.getEditButton(),[d.events.activate]);this.getEditButton().on(d.events.activate,function(b,c){if(this.isActionEvent()){a("body").trigger(j.editActionEvent,[this.getEditUrl()])}else{a("body").trigger(j.editEvent,[this.getEventId()])}this.hide();b.preventDefault();b.stopPropagation();c.originalEvent.preventDefault();c.originalEvent.stopPropagation()}.bind(this))};if(!l){f.register(n.TYPE,n,"core_calendar/event_summary_modal");l=!0}return n});
//# sourceMappingURL=summary_modal.min.js.map
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
View File
@@ -64,6 +64,7 @@ function(
// Toggle the hidden. We need to render the template before we change the value.
data.hidden = !data.hidden;
M.util.js_pending("core_calendar/calendar_filter:toggleFilter");
return Str.get_string('eventtype' + data.eventtype, 'calendar')
.then(function(nameStr) {
data.name = nameStr;
@@ -81,6 +82,7 @@ function(
})
.then(function() {
fireFilterChangedEvent(data);
M.util.js_complete("core_calendar/calendar_filter:toggleFilter");
return;
});
};
+9 -4
View File
@@ -234,7 +234,9 @@ function(
* @returns {Promise}
*/
function registerEditListeners(root, eventFormModalPromise) {
eventFormModalPromise
var pendingPromise = new Pending('core_calendar/crud:registerEditListeners');
return eventFormModalPromise
.then(function(modal) {
// When something within the calendar tells us the user wants
// to edit an event then show the event form modal.
@@ -246,11 +248,14 @@ function(
e.stopImmediatePropagation();
});
return;
return modal;
})
.fail(Notification.exception);
.then(function(modal) {
pendingPromise.resolve();
return eventFormModalPromise;
return modal;
})
.catch(Notification.exception);
}
return {
+2 -1
View File
@@ -165,6 +165,7 @@ function(
// We have to wait for the modal to finish rendering in order to ensure that
// the data-event-title property is available to use as the modal title.
M.util.js_pending('core_calendar/summary_modal:registerEventListeners:bodyRendered');
this.getRoot().on(ModalEvents.bodyRendered, function() {
this.getModal().data({
eventTitle: this.getEventTitle(),
@@ -173,7 +174,7 @@ function(
})
.attr('data-type', 'event');
CalendarCrud.registerRemove(this.getModal());
M.util.js_complete('core_calendar/summary_modal:registerEventListeners:bodyRendered');
}.bind(this));
$('body').on(CalendarEvents.deleted, function() {
+24 -6
View File
@@ -33,6 +33,7 @@ define([
'core/modal_events',
'core_calendar/summary_modal',
'core/custom_interaction_events',
'core/pending',
], function(
$,
Templates,
@@ -44,7 +45,8 @@ define([
ModalFactory,
ModalEvents,
SummaryModal,
CustomEvents
CustomEvents,
Pending
) {
/**
@@ -57,6 +59,7 @@ define([
// Bind click events to event links.
root.on('click', CalendarSelectors.links.eventLink, function(e) {
var pendingPromise = new Pending('core_calendar/view_manager:eventLink:click');
var target = $(e.target);
var eventId = null;
@@ -81,7 +84,11 @@ define([
// and causing the day click handler to fire.
e.stopPropagation();
renderEventSummaryModal(eventId);
renderEventSummaryModal(eventId)
.then(pendingPromise.resolve())
.catch();
} else {
pendingPromise.resolve();
}
});
@@ -358,8 +365,8 @@ define([
* @param {object} root The container element.
* @param {Number} courseId The course id.
* @param {Number} categoryId The id of the category whose events are shown
* @param {String} template The template to be rendered.
* @param {object} target The element being replaced. If not specified, the calendarwrapper is used.
* @param {String} template The template to be rendered.
* @return {promise}
*/
var reloadCurrentUpcoming = function(root, courseId, categoryId, target, template) {
@@ -408,12 +415,15 @@ define([
* Render the event summary modal.
*
* @param {Number} eventId The calendar event id.
* @returns {Promise}
*/
var renderEventSummaryModal = function(eventId) {
var pendingPromise = new Pending('core_calendar/view_manager:renderEventSummaryModal');
var typeClass = '';
// Calendar repository promise.
CalendarRepository.getEventById(eventId).then(function(getEventResponse) {
return CalendarRepository.getEventById(eventId)
.then(function(getEventResponse) {
if (!getEventResponse.event) {
throw new Error('Error encountered while trying to fetch calendar event with ID: ' + eventId);
}
@@ -439,7 +449,8 @@ define([
// Create the modal.
return ModalFactory.create(modalParams);
}).done(function(modal) {
})
.then(function(modal) {
// Handle hidden event.
modal.getRoot().on(ModalEvents.hidden, function() {
// Destroy when hidden.
@@ -449,7 +460,14 @@ define([
// Finally, render the modal!
modal.show();
}).fail(Notification.exception);
return modal;
})
.then(function(modal) {
pendingPromise.resolve();
return modal;
})
.catch(Notification.exception);
};
return {
+2 -9
View File
@@ -839,13 +839,6 @@ $CFG->admin = 'admin';
// ),
// );
//
// You can force the browser session (not user's sessions) to restart after N seconds. This could
// be useful if you are using a cloud-based service with time restrictions in the browser side.
// Setting this value the browser session that Behat is using will be restarted. Set the time in
// seconds. Is not recommended to use this setting if you don't explicitly need it.
// Example:
// $CFG->behat_restart_browser_after = 7200; // Restarts the browser session after 2 hours
//
// All this page's extra Moodle settings are compared against a white list of allowed settings
// (the basic and behat_* ones) to avoid problems with production environments. This setting can be
// used to expand the default white list with an array of extra settings.
@@ -922,8 +915,8 @@ $CFG->admin = 'admin';
// Example:
// define('BEHAT_DISABLE_HISTOGRAM', true);
//
// Mobile app Behat testing requires this option, pointing to a developer Moodle Mobile directory:
// $CFG->behat_ionic_dirroot = '/where/I/keep/my/git/checkouts/moodlemobile2';
// Mobile app Behat testing requires this option, pointing to a developer Moodle app directory:
// $CFG->behat_ionic_dirroot = '/where/I/keep/my/git/checkouts/moodleapp';
//
// The following option can be used to indicate a running Ionic server (otherwise Behat will start
// one automatically for each test run, which is convenient but takes ages):
+8 -2
View File
@@ -1565,7 +1565,10 @@ class core_course_category implements renderable, cacheable_object, IteratorAggr
}
// Prepare the list of core_course_list_element objects.
foreach ($ids as $id) {
$courses[$id] = new core_course_list_element($records[$id]);
// If a course is deleted after we got the cache entry it may not exist in the database anymore.
if (!empty($records[$id])) {
$courses[$id] = new core_course_list_element($records[$id]);
}
}
}
return $courses;
@@ -1775,7 +1778,10 @@ class core_course_category implements renderable, cacheable_object, IteratorAggr
}
// Prepare the list of core_course_list_element objects.
foreach ($ids as $id) {
$courses[$id] = new core_course_list_element($records[$id]);
// If a course is deleted after we got the cache entry it may not exist in the database anymore.
if (!empty($records[$id])) {
$courses[$id] = new core_course_list_element($records[$id]);
}
}
}
return $courses;
+1 -1
View File
@@ -2568,7 +2568,7 @@ function update_course($data, $editoroptions = NULL) {
// The summary might be very long, we don't wan't to fill up the log record with the full text.
$updatedfields[$field] = '(updated)';
}
} else if ($field == 'tags' && !empty($CFG->usetags)) {
} else if ($field == 'tags' && isset($data->tags)) {
// Tags might not have the same array keys, just check the values.
if (array_values($data->$field) !== array_values($value)) {
$updatedfields[$field] = $data->$field;
+15 -1
View File
@@ -277,6 +277,13 @@ function edit_module_post_actions($moduleinfo, $course) {
if ($update) {
$item->update();
}
if (!empty($moduleinfo->add)) {
$gradecategory = $item->get_parent_category();
if ($item->set_aggregation_fields_for_aggregation(0, $gradecategory->aggregation)) {
$item->update();
}
}
}
}
@@ -298,8 +305,8 @@ function edit_module_post_actions($moduleinfo, $course) {
if (property_exists($moduleinfo, $elname) and $moduleinfo->$elname) {
// Check if this is a new outcome grade item.
$outcomeexists = false;
if ($items) {
$outcomeexists = false;
foreach($items as $item) {
if ($item->outcomeid == $outcome->id) {
$outcomeexists = true;
@@ -333,6 +340,13 @@ function edit_module_post_actions($moduleinfo, $course) {
} else if (isset($moduleinfo->gradecat)) {
$outcomeitem->set_parent($moduleinfo->gradecat);
}
if (!$outcomeexists) {
$gradecategory = $outcomeitem->get_parent_category();
if ($outcomeitem->set_aggregation_fields_for_aggregation(0, $gradecategory->aggregation)) {
$outcomeitem->update();
}
}
}
}
}
+22
View File
@@ -1080,4 +1080,26 @@ class core_course_category_testcase extends advanced_testcase {
}
return $draftid;
}
/**
* This test ensures that is the list of courses in a category can be retrieved while a course is being deleted.
*/
public function test_get_courses_during_delete() {
global $DB;
$category = self::getDataGenerator()->create_category();
$course = self::getDataGenerator()->create_course(['category' => $category->id]);
$othercourse = self::getDataGenerator()->create_course(['category' => $category->id]);
$coursecategory = core_course_category::get($category->id);
// Get a list of courses before deletion to populate the cache.
$originalcourses = $coursecategory->get_courses();
$this->assertCount(2, $originalcourses);
$this->assertArrayHasKey($course->id, $originalcourses);
$this->assertArrayHasKey($othercourse->id, $originalcourses);
// Simulate the course deletion process being part way though.
$DB->delete_records('course', ['id' => $course->id]);
// Get the list of courses while a deletion is in progress.
$courses = $coursecategory->get_courses();
$this->assertCount(1, $courses);
$this->assertArrayHasKey($othercourse->id, $courses);
}
}
@@ -32,7 +32,7 @@ $string['categoryseparator'] = 'Category separator character';
$string['categoryseparator_desc'] = 'Required when "Category idnumber" is enabled. Character to separate the category name and idnumber.';
$string['coursesettings'] = 'Course data options';
$string['createnewcategories'] = 'Create new (hidden) course categories if not found in Moodle';
$string['createnewcategories_desc'] = 'If the <org><orgunit> element is present in a course\'s incoming data, its content will be used to specify a category if the course is to be created from scratch. The plugin will NOT re-categorise existing courses.
$string['createnewcategories_desc'] = 'If the &lt;org&gt;&lt;orgunit&gt; element is present in a course\'s incoming data, its content will be used to specify a category if the course is to be created from scratch. The plugin will NOT re-categorise existing courses.
If no category exists with the desired name, then a hidden category will be created.';
$string['createnewcourses'] = 'Create new (hidden) courses if not found in Moodle';
+7
View File
@@ -99,6 +99,13 @@ switch ($action) {
if (empty($roleid)) {
$roleid = null;
} else {
if (!has_capability('moodle/role:assign', $context)) {
throw new enrol_ajax_exception('assignnotpermitted');
}
if (!array_key_exists($roleid, get_assignable_roles($context, ROLENAME_ALIAS, false))) {
throw new enrol_ajax_exception('invalidrole');
}
}
if (empty($startdate)) {
+16
View File
@@ -137,6 +137,10 @@ if (!$edit) {
redirect($returnurl);
} else if ($data = $mform->get_data()) {
// Make sure we are updating the cache.
$cache = cache::make('core', 'grade_letters');
if (!$admin and empty($data->override)) {
$records = $DB->get_records('grade_letters', array('contextid' => $context->id));
foreach ($records as $record) {
@@ -148,6 +152,9 @@ if (!$edit) {
));
$event->trigger();
}
// Make sure we clear the cache for this context.
$cache->delete($context->id);
redirect($returnurl);
}
@@ -222,6 +229,15 @@ if (!$edit) {
}
}
// Cache the changed letters.
if (!empty($letters)) {
// For some reason, the cache saves it in the order in which they were entered
// but we really want to order them in descending order so we sort it here.
krsort($letters);
$cache->set($context->id, $letters);
}
// Delete the unused records.
foreach($pool as $leftover) {
$DB->delete_records('grade_letters', array('id' => $leftover->id));
+7 -6
View File
@@ -37,13 +37,14 @@
if (has_capability('moodle/grade:manageoutcomes', $context)) {
?>
<td class="p-l-1 p-r-1">
<p class="arrow_button">
<input name="add" class="btn btn_secondary" id="add" type="submit" value="<?php echo '&nbsp; ' . $OUTPUT->larrow() . ' &nbsp; &nbsp; ' .
<div class="m-y-1">
<input name="add" class="btn btn-secondary" id="add" type="submit" value="<?php echo $OUTPUT->larrow() . ' ' .
get_string('add'); ?>" title="<?php print_string('add'); ?>" />
<br />
<input name="remove" class="btn btn_secondary" id="remove" type="submit" value="<?php echo '&nbsp;' . get_string('remove') . ' &nbsp; &nbsp; ' .
$OUTPUT->rarrow(); ?>" title="<?php print_string('remove'); ?>" />
</p>
</div>
<div class="m-y-1">
<input name="remove" class="btn btn-secondary" id="remove" type="submit" value="<?php echo get_string('remove') .
' ' . $OUTPUT->rarrow(); ?>" title="<?php print_string('remove'); ?>" />
</div>
</td>
<?php } ?>
<td>
-5
View File
@@ -1,5 +0,0 @@
.gradeimport_data_area {
margin: 0 0 10px;
width: 475px;
height: 209px;
}
+3 -2
View File
@@ -1791,8 +1791,9 @@ class grade_structure {
return '';
}
return $OUTPUT->action_icon($url, new pix_icon('t/preview',
get_string('gradeanalysis', 'core_grades')));
$title = get_string('gradeanalysis', 'core_grades');
return $OUTPUT->action_icon($url, new pix_icon('t/preview', ''), null,
['title' => $title, 'aria-label' => $title]);
}
/**
+42 -19
View File
@@ -710,24 +710,30 @@ class grade_report_grader extends grade_report {
$rows = $this->get_left_icons_row($rows, $colspan);
$suspendedstring = null;
$usercount = 0;
foreach ($this->users as $userid => $user) {
$userrow = new html_table_row();
$userrow->id = 'fixed_user_'.$userid;
$userrow->attributes['class'] = ($usercount % 2) ? 'userrow even' : 'userrow odd';
$usercell = new html_table_cell();
$usercell->attributes['class'] = 'header user';
$usercell->attributes['class'] = ($usercount % 2) ? 'header user even' : 'header user odd';
$usercount++;
$usercell->header = true;
$usercell->scope = 'row';
if ($showuserimage) {
$usercell->text = $OUTPUT->user_picture($user, array('visibletoscreenreaders' => false));
$usercell->text = $OUTPUT->user_picture($user, ['link' => false, 'visibletoscreenreaders' => false]);
}
$fullname = fullname($user, $viewfullnames);
$usercell->text .= html_writer::link(new moodle_url('/user/view.php', array('id' => $user->id, 'course' => $this->course->id)), $fullname, array(
'class' => 'username',
));
$usercell->text = html_writer::link(
new moodle_url('/user/view.php', ['id' => $user->id, 'course' => $this->course->id]),
$usercell->text . $fullname,
['class' => 'username']
);
if (!empty($user->suspendedenrolment)) {
$usercell->attributes['class'] .= ' usersuspended';
@@ -749,13 +755,18 @@ class grade_report_grader extends grade_report {
$a = new stdClass();
$a->user = $fullname;
$strgradesforuser = get_string('gradesforuser', 'grades', $a);
$url = new moodle_url('/grade/report/'.$CFG->grade_profilereport.'/index.php', array('userid' => $user->id, 'id' => $this->course->id));
$userreportcell->text .= $OUTPUT->action_icon($url, new pix_icon('t/grades', $strgradesforuser));
$url = new moodle_url('/grade/report/'.$CFG->grade_profilereport.'/index.php',
['userid' => $user->id, 'id' => $this->course->id]);
$userreportcell->text .= $OUTPUT->action_icon($url, new pix_icon('t/grades', ''), null,
['title' => $strgradesforuser, 'aria-label' => $strgradesforuser]);
}
if ($canseesingleview) {
$url = new moodle_url('/grade/report/singleview/index.php', array('id' => $this->course->id, 'itemid' => $user->id, 'item' => 'user'));
$singleview = $OUTPUT->action_icon($url, new pix_icon('t/editstring', get_string('singleview', 'grades', $fullname)));
$strsingleview = get_string('singleview', 'grades', $fullname);
$url = new moodle_url('/grade/report/singleview/index.php',
['id' => $this->course->id, 'itemid' => $user->id, 'item' => 'user']);
$singleview = $OUTPUT->action_icon($url, new pix_icon('t/editstring', ''), null,
['title' => $strsingleview, 'aria-label' => $strsingleview]);
$userreportcell->text .= $singleview;
}
@@ -909,13 +920,16 @@ class grade_report_grader extends grade_report {
if (has_all_capabilities(array('gradereport/singleview:view', 'moodle/grade:viewall',
'moodle/grade:edit'), $this->context)) {
$strsingleview = get_string('singleview', 'grades', $element['object']->get_name());
$url = new moodle_url('/grade/report/singleview/index.php', array(
'id' => $this->course->id,
'item' => 'grade',
'itemid' => $element['object']->id));
$singleview = $OUTPUT->action_icon(
$url,
new pix_icon('t/editstring', get_string('singleview', 'grades', $element['object']->get_name()))
$url,
new pix_icon('t/editstring', ''),
null,
['title' => $strsingleview, 'aria-label' => $strsingleview]
);
}
}
@@ -1265,7 +1279,8 @@ class grade_report_grader extends grade_report {
$fulltable = new html_table();
$fulltable->attributes['class'] = 'gradereport-grader-table';
$fulltable->id = 'user-grades';
$fulltable->summary = get_string('summarygrader', 'gradereport_grader');
$fulltable->caption = get_string('summarygrader', 'gradereport_grader');
$fulltable->captionhide = true;
// Extract rows from each side (left and right) and collate them into one row each
foreach ($leftrows as $key => $row) {
@@ -1633,24 +1648,32 @@ class grade_report_grader extends grade_report {
if (in_array($element['object']->id, $this->collapsed['aggregatesonly'])) {
$url->param('action', 'switch_plus');
$icon = $OUTPUT->action_icon($url, new pix_icon('t/switch_plus', $strswitchplus), null, null);
$icon = $OUTPUT->action_icon($url, new pix_icon('t/switch_plus', ''), null,
['title' => $strswitchplus, 'aria-label' => $strswitchplus]);
$showing = get_string('showingaggregatesonly', 'grades');
} else if (in_array($element['object']->id, $this->collapsed['gradesonly'])) {
$url->param('action', 'switch_whole');
$icon = $OUTPUT->action_icon($url, new pix_icon('t/switch_whole', $strswitchwhole), null, null);
$icon = $OUTPUT->action_icon($url, new pix_icon('t/switch_whole', ''), null,
['title' => $strswitchwhole, 'aria-label' => $strswitchwhole]);
$showing = get_string('showinggradesonly', 'grades');
} else {
$url->param('action', 'switch_minus');
$icon = $OUTPUT->action_icon($url, new pix_icon('t/switch_minus', $strswitchminus), null, null);
$icon = $OUTPUT->action_icon($url, new pix_icon('t/switch_minus', ''), null,
['title' => $strswitchminus, 'aria-label' => $strswitchminus]);
$showing = get_string('showingfullmode', 'grades');
}
}
$name = $element['object']->get_name();
$courseheaderid = 'courseheader_' . clean_param($name, PARAM_ALPHANUMEXT);
$courseheader = html_writer::tag('span', $name, array('id' => $courseheaderid,
'title' => $name, 'class' => 'gradeitemheader'));
$courseheader .= html_writer::label($showing, $courseheaderid, false, array('class' => 'accesshide'));
$describedbyid = uniqid();
$courseheader = html_writer::tag('span', $name, [
'title' => $name,
'class' => 'gradeitemheader',
'aria-describedby' => $describedbyid
]);
$courseheader .= html_writer::div($showing, 'sr-only', [
'id' => $describedbyid
]);
$courseheader .= $icon;
return $courseheader;
-19
View File
@@ -46,13 +46,6 @@
white-space: nowrap;
}
/**
* Stripped table.
*/
.path-grade-report-grader .gradeparent tr:nth-of-type(even) .cell {
background-color: #f9f9f9;
}
/**
* All the floating divs.
*/
@@ -75,13 +68,6 @@
text-align: left;
}
/**
* All the floating cells.
*/
.path-grade-report-grader .gradeparent .floater .cell {
background-color: #f9f9f9;
}
/**
* The user cells.
*/
@@ -177,11 +163,6 @@
float: left;
}
.path-grade-report .gradeparent .floater .controls.cell,
.path-grade-report-grader .gradeparent .controls {
background-color: #f3ead8;
}
.path-grade-report-grader .gradeparent .category {
text-align: left;
}
+5 -4
View File
@@ -378,8 +378,9 @@ abstract class grade_report {
$this->currentgroup = -2; // means can not access any groups at all
}
if ($this->currentgroup) {
$group = groups_get_group($this->currentgroup);
$this->currentgroupname = $group->name;
if ($group = groups_get_group($this->currentgroup)) {
$this->currentgroupname = $group->name;
}
$this->groupsql = " JOIN {groups_members} gm ON gm.userid = u.id ";
$this->groupwheresql = " AND gm.groupid = :gr_grpid ";
$this->groupwheresql_params = array('gr_grpid'=>$this->currentgroup);
@@ -416,8 +417,8 @@ abstract class grade_report {
$matrix = array('up' => 'desc', 'down' => 'asc', 'move' => 'desc');
$strsort = $this->get_lang_string('sort' . $matrix[$direction]);
$arrow = $OUTPUT->pix_icon($pix[$direction], $strsort, '', array('class' => 'sorticon'));
return html_writer::link($sortlink, $arrow, array('title'=>$strsort));
$arrow = $OUTPUT->pix_icon($pix[$direction], '', '', ['class' => 'sorticon']);
return html_writer::link($sortlink, $arrow, ['title' => $strsort, 'aria-label' => $strsort]);
}
/**
@@ -208,11 +208,12 @@ class grade extends tablelike implements selectable_items, filterable_items {
$url = new moodle_url("/user/view.php", array('id' => $item->id, 'course' => $this->courseid));
$iconstring = get_string('filtergrades', 'gradereport_singleview', $fullname);
$grade->label = $fullname;
$userpic = $OUTPUT->user_picture($item, ['link' => false, 'visibletoscreenreaders' => false]);
$line = array(
$OUTPUT->action_icon($this->format_link('user', $item->id), new pix_icon('t/editstring', $iconstring)),
$OUTPUT->user_picture($item, array('visibletoscreenreaders' => false)) .
html_writer::link($url, $fullname),
$OUTPUT->action_icon($this->format_link('user', $item->id), new pix_icon('t/editstring', ''), null,
['title' => $iconstring, 'aria-label' => $iconstring]),
html_writer::link($url, $userpic . $fullname),
$this->item_range()
);
$lineclasses = array(
@@ -172,7 +172,8 @@ abstract class tablelike extends screen {
$summary = $this->summary();
if (!empty($summary)) {
$table->summary = $summary;
$table->caption = $summary;
$table->captionhide = true;
}
// To be used for extra formatting.
@@ -190,7 +190,8 @@ class user extends tablelike implements selectable_items {
$grade->label = $item->get_name();
$line = array(
$OUTPUT->action_icon($this->format_link('grade', $item->id), new pix_icon('t/editstring', $iconstring)),
$OUTPUT->action_icon($this->format_link('grade', $item->id), new pix_icon('t/editstring', ''), null,
['title' => $iconstring, 'aria-label' => $iconstring]),
$this->format_icon($item) . $lockicon . $itemlabel,
$this->category($item),
new range($item)
@@ -28,6 +28,6 @@
"disabled": "true"
}
}}
<label for="{{name}}" class="accesshide">{{label}}</label>
{{#label}}<label for="{{name}}" class="accesshide">{{label}}</label>{{/label}}
<input id="{{name}}" name="{{name}}" type="text" value="{{value}}" class="form-control" {{#tabindex}}tabindex="{{.}}"{{/tabindex}} {{#disabled}}disabled{{/disabled}}>
<input type="hidden" name="old{{name}}" value="{{value}}">
+1 -1
View File
@@ -203,7 +203,7 @@ class behat_grade extends behat_base {
$inputxpath = "//input[@class='idnumber'][" .
"parent::li[@class='item'][text()='" . $gradeitem . "']" .
" | " .
"parent::li[@class='categoryitem' | @class='courseitem']" .
"parent::li[@class='categoryitem' or @class='courseitem']" .
"/parent::ul/parent::li[starts-with(text(),'" . $gradeitem . "')]" .
"]";
$this->execute('behat_forms::i_set_the_field_with_xpath_to', array($inputxpath, $idnumber));
+16 -1
View File
@@ -26,6 +26,8 @@ namespace core_h5p;
defined('MOODLE_INTERNAL') || die();
use core\lock\lock_config;
/**
* H5P player class, for displaying any local H5P content.
*
@@ -299,7 +301,20 @@ class player {
$onlyupdatelibs = !helper::can_update_library($file);
// Validate and store the H5P content before displaying it.
$h5pid = helper::save_h5p($this->factory, $file, $config, $onlyupdatelibs, false);
// Start lock to prevent synchronous access to save the same h5p.
$lockfactory = lock_config::get_lock_factory('core_h5p');
$lockkey = 'core_h5p_' . $pathnamehash;
if ($lock = $lockfactory->get_lock($lockkey, 10)) {
try {
// Validate and store the H5P content before displaying it.
$h5pid = helper::save_h5p($this->factory, $file, $config, $onlyupdatelibs, false);
} finally {
$lock->release();
}
} else {
$this->core->h5pF->setErrorMessage(get_string('lockh5pdeploy', 'core_h5p'));
return false;
};
if (!$h5pid && $file->get_userid() != $USER->id && has_capability('moodle/h5p:updatelibraries', $this->context)) {
// The user has permission to update libraries but the package has been uploaded by a different
// user without this permission. Check if there is some missing required library error.
+1 -2
View File
@@ -80,8 +80,7 @@ $string['welcomep10'] = '{$a->installername} ({$a->installerversion})';
$string['welcomep20'] = 'Sie haben das Paket <strong>{$a->packname} {$a->packversion}</strong> erfolgreich auf Ihrem Computer installiert.';
$string['welcomep30'] = 'Diese Version von <strong>{$a->installername}</strong> enthält folgende Anwendungen, mit denen Sie <strong>Moodle</strong> ausführen können:';
$string['welcomep40'] = 'Das Paket enthält: <strong>Moodle {$a->moodlerelease} ({$a->moodleversion})</strong>.';
$string['welcomep50'] = 'Die Nutzung dieser Anwendungen ist lizenzrechtlich geprüft. Alle Anwendungen von <strong>{$a->installername}</strong> sind
<a href="http://www.opensource.org/docs/definition_plain.html"> Open Source </a> und unterliegen der <a href="http://www.gnu.org/copyleft/gpl.html"> GPL</a> Lizenz.';
$string['welcomep50'] = 'Die Verwendung aller Anwendungen in diesem Paket unterliegt den jeweiligen Lizenzen. Das vollständige Paket <strong>{$a->installername}</strong> ist <a href="https://www.opensource.org/docs/definition_plain.html">Open Source</a> und wird unter mit der Lizenz <a href="https://www.gnu.org/copyleft/gpl.html">GPL</a> angeboten.';
$string['welcomep60'] = 'Die folgenden Webseiten führen Sie in einfachen Schritten durch die Installation von <strong>Moodle</strong> auf Ihrem Computer. Sie können die vorgeschlagenen Einstellungen übernehmen oder an eigene Bedürfnisse anpassen.';
$string['welcomep70'] = 'Klicken Sie auf die Taste \'Weiter\', um mit der Installation von Moodle fortzufahren.';
$string['wwwroot'] = 'Webadresse';
+1 -1
View File
@@ -48,6 +48,6 @@ $string['invalidmd5'] = 'Kontrolerako aldagaia gaizki zegoen - saiatu berriz ere
$string['missingrequiredfield'] = 'Beharrezko eremuren bat falta da.';
$string['remotedownloaderror'] = '<p>Errorea osagaia zure zerbitzarian jaistean, mesedez egiaztatu proxy-ezarpenak, PHP cURL hedapena erabat gomendatzen da.</p>
<p> <a href="{$a->url}">{$a->url}</a> fitxategia eskuz jaitsi beharko zenuke, zure zerbitzariko "{$a->dest}"-ra kopiatu eta bertan deskonprimatu.</p>';
$string['wrongdestpath'] = 'Bide desegokia';
$string['wrongdestpath'] = 'Helmuga-bide desegokia';
$string['wrongsourcebase'] = 'URL iturriaren oinarri akastuna';
$string['wrongzipfilename'] = 'ZIP fitxategiaren izen desegokia';
+1 -1
View File
@@ -45,7 +45,7 @@ $string['datarootpermission'] = 'Datu-direktorioen baimena';
$string['dbprefix'] = 'Taulen aurrizkia';
$string['dirroot'] = 'Moodle direktorioa';
$string['environmenthead'] = 'Zure ingurunea egiaztatzen...';
$string['environmentsub2'] = 'Moodleko bertsio bakoitzak PHPko gutxieneko bertsioa eta derrigorrez instalatu beharreko PHP hedapen batzuk ditu. Ingurunearen azterketa oso bat egiten da instalazioa eta eguneraketa bakoitza egin aurretik. Mesedez, jarri harremanetan zerbitzariaren kudeatzailearekin ez badakizu bertsio berria edo PHP hedapenak nola instalatu.';
$string['environmentsub2'] = 'Moodleko bertsio bakoitzak PHPko gutxieneko bertsioa eta derrigorrez instalatu beharreko PHP hedapen batzuk ditu. Ingurunearen azterketa oso bat egiten da instalazioa eta eguneratze bakoitza egin aurretik. Mesedez, jarri harremanetan zerbitzariaren kudeatzailearekin ez badakizu bertsio berria edo PHP hedapenak nola instalatu.';
$string['errorsinenvironment'] = 'Huts egin du ingurunearen egiaztatzeak!';
$string['installation'] = 'Instalazioa';
$string['langdownloaderror'] = 'Zoritxarrez "{$a}" hizkuntza ezin izan da jaitsi. Instalazio-prozesuak ingelesez jarraituko du.';
+34
View File
@@ -0,0 +1,34 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Automatically generated strings for Moodle installer
*
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
$string['parentlanguage'] = 'no';
$string['thislanguage'] = 'Kvääni';
+35
View File
@@ -0,0 +1,35 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Automatically generated strings for Moodle installer
*
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
$string['clianswerno'] = 'n';
$string['cliansweryes'] = 'w';
$string['cliyesnoprompt'] = 'Tape w (pou wi) oswa n (pou non)';
+1
View File
@@ -31,6 +31,7 @@
defined('MOODLE_INTERNAL') || die();
$string['language'] = '언어';
$string['moodlelogo'] = '무들 로고';
$string['next'] = '다음';
$string['previous'] = '이전으로';
$string['reload'] = '다시 로딩';
+33
View File
@@ -0,0 +1,33 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Automatically generated strings for Moodle installer
*
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
$string['thislanguage'] = 'Mirandés';
+34
View File
@@ -0,0 +1,34 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Automatically generated strings for Moodle installer
*
* Do not edit this file manually! It contains just a subset of strings
* needed during the very first steps of installation. This file was
* generated automatically by export-installer.php (which is part of AMOS
* {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
* list of strings defined in /install/stringnames.txt.
*
* @package installer
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
$string['moodlelogo'] = 'د موډل نښان';
$string['next'] = 'بل';
+2
View File
@@ -30,6 +30,8 @@
defined('MOODLE_INTERNAL') || die();
$string['cannotcreatelangdir'] = 'Ii sáhte ráhkadit máhpa \'lang\'.';
$string['cannotcreatetempdir'] = 'Ii sáhttán ráhkadit máhpa \'temp\\';
$string['cannotsavemd5file'] = 'Ii sáhte vurket md5-fiilla.';
$string['cannotsavezipfile'] = 'Ii sáhte vurket ZIP-fiilla.';
$string['wrongzipfilename'] = 'Boasttu ZIP-fiilanamma.';
+2
View File
@@ -30,6 +30,7 @@
defined('MOODLE_INTERNAL') || die();
$string['admindirname'] = 'Adminmáhppa';
$string['availablelangs'] = 'Giellapáhkat mat leat gávdnamis';
$string['chooselanguagehead'] = 'Vállje giela';
$string['chooselanguagesub'] = 'Vállje giela (dušše installašuvdnjii). Don sáhtát válljet neahttabáikki ja geavaheaddji giela šearbmagovas maŋŋelaš.';
@@ -38,3 +39,4 @@ $string['clialreadyinstalled'] = 'Fiila config.php gávdno jo. Geavat admin/cli/
$string['databasename'] = 'Diehtovuođđonamma';
$string['langdownloaderror'] = 'Dađibahábut ii installerejuvvon giellapáhkka "{$a}". Installašuvdnaproseassa joatká eaŋgalsgillii.';
$string['phpextension'] = '{$a} PHP gilkor';
$string['welcomep70'] = 'Coahkkal "Boahtte"-boalu joatkit<strong>Moodle</strong>-installašuvnnain';
+3
View File
@@ -42,3 +42,6 @@ $string['cannotsavemd5file'] = 'Md5 ఫైల్ను సేవ్ చేయల
$string['cannotsavezipfile'] = 'జిప్ ఫైల్ను సేవ్ చేయడం సాధ్యపడదు';
$string['cannotunzipfile'] = 'ఫైల్ అన్జిప్ చేయలేరు';
$string['componentisuptodate'] = 'కాంపొనెంటు తాజాగా ఉంది';
$string['dmlexceptiononinstall'] = '<p>A డేటాబేస్ లోపం ఏర్పడింది [{$ a-> errorcode}]. <br /> {$a->debuginfo} </p>';
$string['downloadedfilecheckfailed'] = 'డౌన్లోడ్ చేసిన ఫైల్ తనిఖీ విఫలమైంది';
$string['invalidmd5'] = 'చెక్ వేరియబుల్ తప్పు. - మళ్ళీ ప్రయత్నించండి';
+1 -1
View File
@@ -31,5 +31,5 @@
defined('MOODLE_INTERNAL') || die();
$string['parentlanguage'] = '';
$string['thisdirection'] = '符号(ltr)';
$string['thisdirection'] = 'ltr';
$string['thislanguage'] = '简体中文';
+2 -2
View File
@@ -32,6 +32,6 @@ defined('MOODLE_INTERNAL') || die();
$string['language'] = '语言';
$string['moodlelogo'] = 'Moodle图标';
$string['next'] = '向后';
$string['previous'] = '向前';
$string['next'] = '下一个';
$string['previous'] = '上一个';
$string['reload'] = '重新载入';
+1 -1
View File
@@ -241,7 +241,7 @@ $string['configenablewsdocumentation'] = 'Enable auto-generation of web services
$string['configerrorlevel'] = 'Choose the amount of PHP warnings that you want to be displayed. Normal is usually the best choice.';
$string['configexportlookahead'] = 'Days to look ahead during export';
$string['configexportlookback'] = 'Days to look back during export';
$string['configextendedusernamechars'] = 'Enable this setting to allow students to use any characters in their usernames (note this does not affect their actual names). The default is "false" which restricts usernames to be alphanumeric lowercase characters, underscore (_), hyphen (-), period (.) or at symbol (@).';
$string['configextendedusernamechars'] = 'If enabled, usernames may include any characters except uppercase letters. Otherwise, only alphanumeric characters with lowercase letters, underscore (_), hyphen (-), period (.) and at symbol (@) are allowed.';
$string['configextramemorylimit'] = 'Some scripts like search, backup/restore or cron require more memory. Set higher values for large sites.';
$string['configfilterall'] = 'Filter all strings, including headings, titles, navigation bar and so on. This is mostly useful when using the multilang filter, otherwise it will just create extra load on your site for little gain.';
$string['configfiltermatchoneperpage'] = 'Automatic linking filters will only generate a single link for the first matching text instance found on the complete page. All others are ignored.';
+1 -1
View File
@@ -32,7 +32,7 @@ $string['analyticslogstore_help'] = 'The log store that will be used by the anal
$string['analyticssettings'] = 'Analytics settings';
$string['analyticssiteinfo'] = 'Site information';
$string['defaulttimesplittingmethods'] = 'Default analysis intervals for model\'s evaluation';
$string['defaulttimesplittingmethods_help'] = 'The analysis interval defines when the system will calculate predictions and the portion of activity logs that will be considered for those predictions.The model evaluation process will iterate through these analysis intervals unless a specific analysis interval is specified.';
$string['defaulttimesplittingmethods_help'] = 'The analysis interval defines when the system will calculate predictions and the portion of activity logs that will be considered for those predictions. The model evaluation process will iterate through these analysis intervals unless a specific analysis interval is specified.';
$string['defaultpredictionsprocessor'] = 'Default predictions processor';
$string['defaultpredictoroption'] = 'Default processor ({$a})';
$string['disabledmodel'] = 'Disabled model';
+3 -3
View File
@@ -75,11 +75,11 @@ $string['emailnowexists'] = 'The email address you tried to assign to your profi
$string['emailupdate'] = 'Email address update';
$string['emailupdatemessage'] = 'Dear {$a->fullname},
You have requested a change of your email address for your user account at {$a->site}. Please open the following URL in your browser in order to confirm this change.
You have requested a change of your email address for your account on {$a->site}. To confirm this change, please go to the following web address:
If you have any questions please contact support on: {$a->supportemail}
{$a->url}
{$a->url}';
{$a->supportemail}';
$string['emailupdatesuccess'] = 'Email address of user <em>{$a->fullname}</em> was successfully updated to <em>{$a->email}</em>.';
$string['emailupdatetitle'] = 'Confirmation of email update at {$a->site}';
$string['errormaxconsecutiveidentchars'] = 'Passwords must have at most {$a} consecutive identical characters.';
+4
View File
@@ -81,6 +81,8 @@ $string['awardedtoyou'] = 'Issued to me';
$string['awardoncron'] = 'Access to the badges was successfully enabled. Too many users can instantly earn this badge. To ensure site performance, this action will take some time to process.';
$string['awards'] = 'Recipients';
$string['backpackavailability'] = 'External badge verification';
$string['backpackconnectionok'] = 'Backpack connection successfully established';
$string['backpackconnectionnottested'] = 'The connection cannot be tested for this backpack because only Open Badges v2.0 backpacks support it.';
$string['backpackneedsupdate'] = 'The backpack connected to this profile does not match the backpack for the site. You need to disconnect and reconnect the backpack.';
$string['backpackavailability_help'] = 'For badge recipients to be able to prove they earned their badges from you, an external backpack service should be able to access your site and verify badges issued from it. Your site does not currently appear to be accessible, which means that badges you have already issued or will issue in the future cannot be verified.
@@ -536,6 +538,8 @@ $string['targetframework'] = 'Framework';
$string['targetframework_help'] = 'The name of the external skill or standard framework.';
$string['targetcode'] = 'Code';
$string['targetcode_help'] = 'A unique string identifier for referencing the external skill or standard within its framework.';
$string['testbackpack'] = 'Test backpack \'{$a}\'';
$string['testsettings'] = 'Test settings';
$string['type'] = 'Type';
$string['variablesubstitution'] = 'Variable substitution in messages.';
$string['variablesubstitution_help'] = 'In a badge message, certain variables can be inserted into the subject and/or body of a message so that they will be replaced with real values when the message is sent. The variables should be inserted into the text exactly as they are shown below. The following variables can be used:
+1
View File
@@ -74,6 +74,7 @@ $string['cachedef_questiondata'] = 'Question definitions';
$string['cachedef_repositories'] = 'Repositories instances data';
$string['cachedef_roledefs'] = 'Role definitions';
$string['cachedef_grade_categories'] = 'Grade category queries';
$string['cachedef_grade_letters'] = 'Grade letter queries';
$string['cachedef_string'] = 'Language string cache';
$string['cachedef_tags'] = 'Tags collections and areas';
$string['cachedef_temp_tables'] = 'Temporary tables cache';
+1 -1
View File
@@ -31,7 +31,7 @@ $string['privacy:metadata:files:contenthash'] = 'A hash of the file\'s content';
$string['privacy:metadata:files:filename'] = 'The name of the file in its file area';
$string['privacy:metadata:files:filepath'] = 'The path to the file in its file area';
$string['privacy:metadata:files:filesize'] = 'The size of the file';
$string['privacy:metadata:files:license'] = 'The license of the file\'s content';
$string['privacy:metadata:files:license'] = 'The licence of the file\'s content';
$string['privacy:metadata:files:mimetype'] = 'The MIME type of the file';
$string['privacy:metadata:files:source'] = 'The source of the file';
$string['privacy:metadata:files:timecreated'] = 'The time when the file was created';
+5 -4
View File
@@ -29,7 +29,7 @@ $string['addedandupdatedsp'] = 'Added {$a->%new} new H5P library and updated {$a
$string['addedandupdatedss'] = 'Added {$a->%new} new H5P library and updated {$a->%old} old one.';
$string['addednewlibraries'] = 'Added {$a->%new} new H5P libraries.';
$string['addednewlibrary'] = 'Added {$a->%new} new H5P library.';
$string['additionallicenseinfo'] = 'Any additional information about the license';
$string['additionallicenseinfo'] = 'Any additional information about the licence';
$string['author'] = 'Author';
$string['authorcomments'] = 'Author comments';
$string['authorcommentsdescription'] = 'Comments for the editor of the content. (This text will not be published as a part of the copyright info.)';
@@ -108,7 +108,7 @@ $string['invalidsemanticstype'] = 'H5P internal error: unknown content type "{$a
$string['invalidstring'] = 'Provided string is not valid according to regexp in semantics. (value: "{$a->%value}", regexp: "{$a->%regexp}")';
$string['librarydirectoryerror'] = 'Library directory name must match machineName or machineName-majorVersion.minorVersion (from library.json). (Directory: {$a->%directoryName} , machineName: {$a->%machineName}, majorVersion: {$a->%majorVersion}, minorVersion: {$a->%minorVersion})';
$string['librariesmanagerdescription'] = '<p>H5P enables users to create interactive content by providing a range of content types.</p><p>To ensure that only trusted H5P content types are used on your site, you need to <i>either</i></p><ul><li>Upload H5P content types from h5p.org <i>or</i></li><li>Enable the scheduled task \'Download available H5P content types from h5p.org\'</li></ul><p>Note that users will only be able to use the H5P content types which are installed on your site.</p>';
$string['license'] = 'License';
$string['license'] = 'Licence';
$string['licenseCC010'] = 'CC0 1.0 Universal (CC0 1.0) Public Domain Dedication';
$string['licenseCC010U'] = 'CC0 1.0 Universal';
$string['licenseCC10'] = '1.0 Generic';
@@ -121,8 +121,9 @@ $string['licenseV1'] = 'Version 1';
$string['licenseV2'] = 'Version 2';
$string['licenseV3'] = 'Version 3';
$string['licensee'] = 'Licensee';
$string['licenseextras'] = 'License extras';
$string['licenseversion'] = 'License version';
$string['licenseextras'] = 'Licence extras';
$string['licenseversion'] = 'Licence version';
$string['lockh5pdeploy'] = 'This H5P content cannot be accessed because it is being deployed. Please try again later.';
$string['missingcontentfolder'] = 'A valid content folder is missing';
$string['missingcoreversion'] = 'The system was unable to install the {$a->%component} component from the package, as it requires a newer version of the H5P plugin. This site is currently running version {$a->%current}, whereas the required version is {$a->%required} or higher. Please upgrade and then try again.';
$string['missingdependency'] = 'Missing dependency {$a->@dep} required by {$a->@lib}.';
+1 -1
View File
@@ -46,7 +46,7 @@ $string['clialreadyconfigured'] = 'The configuration file config.php already exi
$string['clialreadyinstalled'] = 'The configuration file config.php already exists. Please use admin/cli/install_database.php to upgrade Moodle for this site.';
$string['cliinstallfinished'] = 'Installation completed successfully.';
$string['cliinstallheader'] = 'Moodle {$a} command line installation program';
$string['climustagreelicense'] = 'In non interactive mode you must agree to license by specifying --agree-license option';
$string['climustagreelicense'] = 'In non-interactive mode you must agree to the licence by specifying --agree-license option';
$string['cliskipdatabase'] = 'Skipping database installation.';
$string['clitablesexist'] = 'Database tables already present; CLI installation cannot continue.';
$string['compatibilitysettings'] = 'Checking your PHP settings ...';
+1 -1
View File
@@ -61,7 +61,7 @@ $string['enterausername'] = 'Please enter a username, or a list of usernames sep
$string['error7020'] = 'This error normally occurs if the remote site has created a record for you with the wrong wwwroot, for example, https://yoursite.com instead of https://www.yoursite.com. Please contact the administrator of the remote site with your wwwroot (as specified in config.php) and ask them to update the record for your host.';
$string['error7022'] = 'The message you sent to the remote site was encrypted properly, but not signed. This is very unexpected; you should probably file a bug if this occurs (giving as much information as possible about the application versions in question etc).';
$string['error7023'] = 'The remote site has tried to decrypt your message with all the keys it has on record for your site. They have all failed. You might be able to fix this problem by manually re-keying with the remote site. This is unlikely to occur unless you\'ve been out of communication with the remote site for a few months.';
$string['error7024'] = 'You send an unencrypted message to the remote site, but the remote site doesn\'t accept unencrypted communication from your site. This is very unexpected; you should probably file a bug if this occurs (giving as much information as possible about the application versions in question, etc.';
$string['error7024'] = 'You send an unencrypted message to the remote site, but the remote site doesn\'t accept unencrypted communication from your site. This is very unexpected; you should probably file a bug if this occurs (giving as much information as possible about the application versions in question, etc).';
$string['error7026'] = 'The key that your message was signed with differs from the key that the remote host has on file for your server. Further, the remote host attempted to fetch your current key and failed to do so. Please manually re-key with the remote host and try again.';
$string['error709'] = 'The remote site failed to obtain a SSL key from you.';
$string['eventaccesscontrolcreated'] = 'Access control created';
+4
View File
@@ -841,6 +841,7 @@ $string['first'] = 'First';
$string['firstaccess'] = 'First access';
$string['firstname'] = 'First name';
$string['firstnamephonetic'] = 'First name - phonetic';
$string['firstpage'] = 'First page';
$string['firstsiteaccess'] = 'First access to site';
$string['firsttime'] = 'Is this your first time here?';
$string['folder'] = 'Folder';
@@ -1114,6 +1115,7 @@ $string['lastlogin'] = 'Last login';
$string['lastmodified'] = 'Last modified';
$string['lastname'] = 'Surname';
$string['lastnamephonetic'] = 'Surname - phonetic';
$string['lastpage'] = 'Last page';
$string['lastsiteaccess'] = 'Last access to site';
$string['lastyear'] = 'Last year';
$string['latestlanguagepack'] = 'Check for latest language pack on moodle.org';
@@ -1396,6 +1398,7 @@ Cheers from the \'{$a->sitename}\' administrator,
$string['newusers'] = 'New users';
$string['newwindow'] = 'New window';
$string['next'] = 'Next';
$string['nextpage'] = 'Next page';
$string['nextsection'] = 'Next section';
$string['no'] = 'No';
$string['noblockstoaddhere'] = 'There are no blocks that you can add to this page.';
@@ -1578,6 +1581,7 @@ $string['preview'] = 'Preview';
$string['previeworchoose'] = 'Preview or choose a theme';
$string['previous'] = 'Previous';
$string['previouslyselectedusers'] = 'Previously selected users not matching \'{$a}\'';
$string['previouspage'] = 'Previous page';
$string['previoussection'] = 'Previous section';
$string['primaryadminsetup'] = 'Setup administrator account';
$string['privacy:metadata:config_log'] = 'The log of configuration changes.';
+1
View File
@@ -225,6 +225,7 @@ $string['validationmsg_onedir'] = 'Invalid structure of the ZIP package.';
$string['validationmsg_onedir_help'] = 'The ZIP package must contain just one root directory that holds the plugin code. The name of that root directory must match the name of the plugin.';
$string['validationmsg_pathwritable'] = 'Write access check';
$string['validationmsg_pluginversion'] = 'Plugin version';
$string['validationmsg_pluginversiontoolow'] = 'A higher version of this plugin is already installed';
$string['validationmsg_release'] = 'Plugin release';
$string['validationmsg_requiresmoodle'] = 'Required Moodle version';
$string['validationmsg_rootdir'] = 'Name of the plugin to be installed';
+1
View File
@@ -182,6 +182,7 @@ $string['america/noronha'] = 'America/Noronha';
$string['america/north_dakota/beulah'] = 'America/North_Dakota/Beulah';
$string['america/north_dakota/center'] = 'America/North_Dakota/Center';
$string['america/north_dakota/new_salem'] = 'America/North_Dakota/New_Salem';
$string['america/nuuk'] = 'America/Nuuk';
$string['america/ojinaga'] = 'America/Ojinaga';
$string['america/panama'] = 'America/Panama';
$string['america/pangnirtung'] = 'America/Pangnirtung';
+1 -1
View File
@@ -2206,7 +2206,7 @@ function reset_role_capabilities($roleid) {
* the database.
*
* @access private
* @param string $component examples: 'moodle', 'mod/forum', 'block/quiz_results'
* @param string $component examples: 'moodle', 'mod_forum', 'block_quiz_results'
* @return boolean true if success, exception in case of any problems
*/
function update_capabilities($component = 'moodle') {
+52 -6
View File
@@ -1685,6 +1685,8 @@ abstract class admin_setting {
private $forceltr = null;
/** @var array list of other settings that may cause this setting to be hidden */
private $dependenton = [];
/** @var bool Whether this setting uses a custom form control */
protected $customcontrol = false;
/**
* Constructor
@@ -2070,6 +2072,16 @@ abstract class admin_setting {
public function get_dependent_on() {
return $this->dependenton;
}
/**
* Whether this setting uses a custom form control.
* This function is especially useful to decide if we should render a label element for this setting or not.
*
* @return bool
*/
public function has_custom_form_control(): bool {
return $this->customcontrol;
}
}
/**
@@ -8758,6 +8770,7 @@ function format_admin_setting($setting, $title='', $form='', $description='', $l
$context->description = highlight($query, markdown_to_html($description));
$context->element = $form;
$context->forceltr = $setting->get_force_ltr();
$context->customcontrol = $setting->has_custom_form_control();
return $OUTPUT->render_from_template('core_admin/setting', $context);
}
@@ -8790,6 +8803,40 @@ function any_new_admin_settings($node) {
return false;
}
/**
* Given a table and optionally a column name should replaces be done?
*
* @param string $table name
* @param string $column name
* @return bool success or fail
*/
function db_should_replace($table, $column = ''): bool {
// TODO: this is horrible hack, we should do whitelisting and each plugin should be responsible for proper replacing...
$skiptables = ['config', 'config_plugins', 'filter_config', 'sessions',
'events_queue', 'repository_instance_config', 'block_instances', 'files'];
// Don't process these.
if (in_array($table, $skiptables)) {
return false;
}
// To be safe never replace inside a table that looks related to logging.
if (preg_match('/(^|_)logs?($|_)/', $table)) {
return false;
}
// Do column based exclusions.
if (!empty($column)) {
// Don't touch anything that looks like a hash.
if (preg_match('/hash$/', $column)) {
return false;
}
}
return true;
}
/**
* Moved from admin/replace.php so that we can use this in cron
*
@@ -8800,11 +8847,6 @@ function any_new_admin_settings($node) {
function db_replace($search, $replace) {
global $DB, $CFG, $OUTPUT;
// TODO: this is horrible hack, we should do whitelisting and each plugin should be responsible for proper replacing...
$skiptables = array('config', 'config_plugins', 'config_log', 'upgrade_log', 'log',
'filter_config', 'sessions', 'events_queue', 'repository_instance_config',
'block_instances', '');
// Turn off time limits, sometimes upgrades can be slow.
core_php_time_limit::raise();
@@ -8813,13 +8855,16 @@ function db_replace($search, $replace) {
}
foreach ($tables as $table) {
if (in_array($table, $skiptables)) { // Don't process these
if (!db_should_replace($table)) {
continue;
}
if ($columns = $DB->get_columns($table)) {
$DB->set_debug(true);
foreach ($columns as $column) {
if (!db_should_replace($table, $column->name)) {
continue;
}
$DB->replace_all_text($table, $column, $search, $replace);
}
$DB->set_debug(false);
@@ -10185,6 +10230,7 @@ class admin_setting_configstoredfile extends admin_setting {
$this->filearea = $filearea;
$this->itemid = $itemid;
$this->options = (array)$options;
$this->customcontrol = true;
}
/**

Some files were not shown because too many files have changed in this diff Show More