MDL-62640 removed the 'slasharguments' config, and 3229dda3 attempted to
restore it by setting it to 1. This could unintentionally reset the
'slasharguments' config for all sites upgrading to 4.5.
In https://h5ptechnology.atlassian.net/browse/HFP-4105, the
fonts/h5p-core-29.svg was merged with some conflicts.
Looking at the patch there, it seems all the h5p-core-29* fonts
can be removed because the ones used by the library are the
h5p-core-30-*.
I haven't added a note in the upgrade because it seems an error
on their release process (so I don't think it's worth adding
a note because it should be fixed in future releases).
This change:
- Moves the API to use the `before_file_created` hook
- Remove the newly created `$notify` param for `after_file_created` hook
- Stop persisting redactable content
- Update manager to not deal with `stored_file` instances
- Correct namespace from `\core\filereact` to `\core_files\redactor`
- Add `redactor` as a valid L2 namespace within the `core_files` API
- Correct config setting names
- Adds missing unit tests
- Disables the service for PHPUnit tests
AMOS BEGIN
MOV [fileredact,core_files],[redactor,core_files]
MOV [fileredact,core_files],[redactor:exifremover,core_files]
MOV [fileredact,core_files],[redactor:exifremover:emptyremovetags,core_files]
MOV [fileredact,core_files],[redactor:exifremover:enabled,core_files]
MOV [fileredact,core_files],[redactor:exifremover:enabled_desc,core_files]
MOV [fileredact,core_files],[redactor:exifremover:failedprocessexiftool,core_files]
MOV [fileredact,core_files],[redactor:exifremover:failedprocessgd,core_files]
MOV [fileredact,core_files],[redactor:exifremover:heading,core_files]
MOV [fileredact,core_files],[redactor:exifremover:mimetype,core_files]
MOV [fileredact,core_files],[redactor:exifremover:mimetype_desc,core_files]
MOV [fileredact,core_files],[redactor:exifremover:removetags,core_files]
MOV [fileredact,core_files],[redactor:exifremover:removetags_desc,core_files]
MOV [fileredact,core_files],[redactor:exifremover:tag:all,core_files]
MOV [fileredact,core_files],[redactor:exifremover:tag:gps,core_files]
MOV [fileredact,core_files],[redactor:exifremover:tooldoesnotexist,core_files]
MOV [fileredact,core_files],[redactor:exifremover:toolpath,core_files]
MOV [fileredact,core_files],[redactor:exifremover:toolpath_desc,core_files]
AMOS END
This commit is upgrading the joubel/core library to the one
tagged as moodle-1.27.0 (which also increases the coreApi minorVersion).
That's why the previous commit was duplicating the existing
h5plib_v126.
This setting will avoid conflicts between checkmark and
bfcache. The removed function added as part of the MDL-77732
is no longer required as the behaviour on the menu items (including the
secondary navigation) is not altered anymore by the menuItemHelper function
(menu_navigation file).
This class was rolling its own version of get_template_name, which
meant that calling code needed to first call get_template and was forced
to use render_from_template(). This fixes that by implementing the
named_templatable interface and the get_template_name method. Now,
renderables that extend comboboxsearch can just be passed to render()
for rendering.
This code was unnecessarily pre-rendering some context properties used
by the action_menu, which also meant the mustache template expected HTML
in the context, which should be avoided. Instead of pre-rendering, just
export_for_template() and adjust the mustache template to render the sub
template for the respective templatables. Doing this also reveals two
unecessary renderer methods which have now been deprecated.
This code was unnecessarily pre-rendering some context properties used
by the action_menu, which also meant the mustache template expected HTML
in the context, which should be avoided. Instead of pre-rendering, just
export_for_template() and adjust the mustache template to render the sub
template for the respective templatables.
As per prior commit, this fixes the export_for_template() method as
well as the template itself, ensuring no rendering is done in the
renderable, and ensuring the template defers to the comboboxsearch
or dialog partials with the data-only (no html) contexts.
This change:
- Fixes the group_selector constructor, removing the unnecessarily
deprecated param (this code is main-only, so no need to deprecate) and
fixes all calling code.
- moves the button and content into separate named_templatable
renderables, cleaning up the group_selector code so that it only needs
to make a single call to render and doesn't concern itself with contexts
of other renderables.
This change:
- Fixes naming of initials_selector class (making plural to match its
predecessor), and addresses relevant calling code.
- Adds an initials_dropdown_form renderable, templatable
- Removes superfluous course/classes/output/actionbar renderer
- Replaces the rendering logic inside initial_selector with calls to
render the new renderable
- Simplifies the initials_selector class, using instance vars instead of
passing args to helpers, removing unnecessary vars, etc.
Prior to this change the order of upgrade notes changed depending on
what was encountered first when looping through the list of upgrade
notes.
This change ensures that the core component is always first, followed by
core subsystems sorted lexically, and finally a lexical sorting of
everything else.
The note types are also sorted in the order suggested at keep a
changelog, that is:
- Added
- Changed
- Deprecated
- Removed
- Fixed
There is a unique index on plugin/name, so having a trailing order
clause on value would produce no effect. We also cannot order by
CLOB fields on Oracle, lest it complain loudly.
Includes migrating AWS settings from the SMS MFA factor to a new gateway
in the SMS subsystem and notifying admins of the update.
Originally implemented as MDL-81732 and MDL-82660.
Co-authored by: Michael Hawkins <michaelh@moodle.com>
This form class has been deprecated in MDL-82857, following the standard
class deprecation policy. It is highly unlikely that any external code
is using it; therefore, the form class has been removed, while the file
remains to prevent fatal errors from attempts to require or include it.
This approachy aligns with recent form deprecations in the quiz module.
Additionally, any code using this form and its supporting functions,
such as M.mod_assign.init_grading_options, has been removed.
Also, if there is not currently an extension set, the set extension form
will default to whatever is the latest out of the due date, the cut-off date
and midnight tonight (in the server time-zone).
Also, some other improvements.
* In Behat you can now use either idnumber of name to identify an
assignment you are generating things for.
* create_submission generator methods now wants the cmid in $data['cmid']
not the confusingly named 'assignid'. The old name is accepted, but
generates a debugging warning. (That will fail the test, but in a way
that explains how to fix it.)
When all providers for a certain action are disabled, or if providers
are enabled but all individual actions of a type are disabled, then
a warning is shown on the placement admin settings page for actions
that have no providers available.
Also the text editor placement will not show the option to generate
images or text if there are no actions available.
The grading_options_temp_form class and
process_save_grading_options_temp() method were temporarily introduced
to migrate form elements across the submission page while preserving
the original class and method, as they are part of the public API and
may be used by external code. Now that the migration is complete, both
the temporary class and method can be removed.
The grading_options_form class was deprecated in 4.5, and a temporary
copy of this class was introduced to facilitate the migration of its
elements across different areas of the submission page, ensuring no
breakages if any external code is using this form (MDL-82857).
However, the process_save_grading_options() method, which processes
data from this form, was modified and this should not have occurred.
To maintain proper backward compatibility, a similar approach should
be taken by introducing a temporary copy of the method. Both the
temporary method and temporary form class should be removed once the
migration of elements is complete.
Removes the old Marker and Suspended participants filters from the
assignment submissions page, along with all associated logic.
Also, cleans up residual code from the old marking workflow filter
that was not properly removed in MDL-82508.
Extends the functionality of the 'Clear all' filters option to reset
the new 'Marker' and 'Suspended participants' filters on the
assignment submissions page.
PHP allows the specification of invalid values for `max_execution_time`,
including negative values. These should be normalised the same way that
an empty (unlimited) value is.
When a terminating SSL proxy is in use, the scheme and port received by
the web server may be different to the wwwroot.
When a reverse proxy is in use, the scheme, port, and host name received
by the web server may be different to the wwwroot.
In both of these cases the incoming request URI must be updated to use
the correct host scheme, and port. In the case of the reverse proxy,
the host name must also be updated.
In both cases the actual path is expected to be correct, and neither the
path nor query parameters should be modified.
The base bulk actions class supports deselecting all selected items but
lacks knowledge of the element types. To enhance flexibility and
maintain the class's generic nature, this change introduces a mechanism
that allows each subclass to explicitly define how to reset the
attributes indicating a selected state.
Updated ARIA handling code to not assume the presence of a .dropdown
element.
- Modified keypress event listener to match
`[role="menu"] [role="menuitem"]` directly.
- Changed keyboard navigation handling to avoid assuming `.dropdown`.
- Updated focus trapping to use `.dropdown-menu[role="dialog"]` selector
ensuring compatibility with `.dropup` and other variations.
- Ensured focus untrapping logic uses the same improved selector.
The order of bulk actions was not preserved when rendering the bulk
actions content due to asynchronous operations. This fix ensures that
the actions are added to the `data.actions` array in the correct order
by using a temporary array to store the promises and then processing
them sequentially.
Also improved the JSDoc for better clarity on what the function returns
and what it resolves to.
Continuing from the last commit, the code to restore question
bank entries, versions and questions, was not taking note of
whether the first stage had indentified questions that did not
need to be restored. This is tricky, but the mapping can only be
worked out for questions, but in the backup file, the questions are
inside the question_bank_entries, and versions, so we encounter
those first.
Now, the code just saves the QBE and QV when it encounters them,
and then does all the processing when it gets to the question,
correctly taking note of whether each question should be restored or not.
In cases where a particular question does not need to be restored,
we still set up the corresponding mappings.
Restore of categories and questions happens in several phases.
First, the file is scanned for which questions and categories
it contains, to work out if these are new questions which need
to be restored, or if they already exist in the database in a
place that can be used.
That code had not been updated to cope with the Moodle 4.0
versioning changes, so it is updated here (while still keeping
the code to cope with the old backup format.)
When an image is generated using AI a watermark is added.
This patch examines the area of the image where the water
mark is to be added and changes the font color of the mark
to either black or white, so it can be read against the
background color.
Change the core:t/move icon from four-directional arrows (up-down-left-right)
to two-directional arrows (up-down) to reduce confusion, as it is used in areas
where drag-and-drop functionality is not supported
* ScrollSpy relies on offset to determine the current element in
in the course index. We need to make sure that those elements are
not positionned so the offset is calculated from the top of the page.
- Quiz is setting the text editor id in this format: `#q2:1_answer`.
This will break the querySelector(). We need to update the code to
escape those colons.
- Generate AI image requires users to have the capability to upload files.
A new extra condition is added to verify this one.
To make the plugin name a bit more generic, we renamed as below
- Shortname: `aiplacement_tinymce` -> `aiplacement_editor`
- Fullname: `TinyMCE Editor Placement` -> HTML Text Editor Placement
Initial AI placement plugin for the TinyMCE editor.
It includes a TinyMCE plugin and the AI placement plugin.
It supports both text and image generation.
Originally implemented in MDL-80891
Co-authored-by: Huong Nguyen <huongnv13@gmail.com>
In MDL-82211, the preview icon was updated to use the "fa-regular fa-eye" icon.
However, this icon is also used elsewhere to represent hide/show functionality,
leading to potential confusion.
To address this, the UX team has requested that the change be reverted, and the
preview icon should now be replaced with "fa-magnifying-glass-plus".
The fa-check-double icon for correct/incorrect/partial grades were updated
in MDL-82497. However, the UX team has decided to replace these icons with
the following:
- core:i/grade_correct : fa-check-double --> fa-regular fa-circle-check
- core:i/grade_incorrect : fa-xmark --> fa-regular fa-circle-xmark
- core:i/grade_partiallycorrect : fa-check --> fa-circle-half-stroke
These changes should be consistent with the Navigation quiz block too.
* The new Boostrap color constrast made apparent an visual issue
appearing when we use drag and drop as the outline of the activity
is cut out of the drag/drop image.
This restores the original random failure fix from 9a5eb76a56, and
adds assertions appropriate to d9ea6bc804 without re-introducing the
same random test failures.
Also improve non-sensical conditional assertions.
* Fix behat tests to take into consideration the new add subsection
workflow
* modulename_help is only used in the activity chooser so has been
removed
Adding capabilities 'quizaccess/seb:manage_seb_configuremanually' and
'quizaccess/seb:manage_seb_usesebclientconfig' to control SEB
requirement options 'Yes – configure manually' and
'Yes – Use SEB client config' respectively.
Other changes include code indentation corrections within quizacess_seb.
Implementing MDL-81031 caused a regression because
lib/phpspreadsheet/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/*
was inadvertently deleted. Re-adding those files now.
Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
The badges/index.php and badges/view.php pages are quite similar and
have been merged into index.php.
This commit updates index.php to incorporate the missing information
previously found in view.php.
- Added unit tests for 'core_courseformat\external\create_module' web service.
- Added unit tests for 'create_module' state action.
Both tests need at least a module with 'FEATURE_QUICKCREATE', so mod_subsection
was used.
- Add the new 'FEATURE_QUICKCREATE' to mod_subsection.
- Implement the 'before_activitychooserbutton_exported' hook callback that adds
an extra action_link to add subsections in a course section.
- Add a new permission class.
- Add new 'FEATURE_QUICKCREATE' plugin feature that indicates the module can
be created with a single click. It will use its own 'quickcreatename' defined
string as the initial default name.
- Add new 'core_courseformat\external\create_module' web service to create new
modules with the quickcreate featuer in the course page.
- Add a new 'create_module' state action.
Storage of session metadata has moved into the session handler class.
This allows for other classes to fully control session handling and
removes the dependancy on the core sessions database table.
Previously, the standard method of interaction with the
session metadata was direct DB calls; this may break other plugins as there
are now proper APIs available through the session manager.
Co-authored-by: Darren Cocco <moodle@darren.cocco.id.au>
Co-authored-by: Trisha Milan <trishamilan@catalyst-au.net>
Co-authored-by: Andrew Nicols <andrew@nicols.co.uk>
The icon used in the full preview link for submissions and feedback was
inadequately replaced with an eye icon, which is typically associated
with visibility toggling or state indication. The previous magnifying
glass icon was more appropriate for this purpose, so this issue restores
it.
- Add new 'activitychooserbutton' output class that allows adding extra action_links through hooks.
- Add new 'before_activitychooserbutton_exported' hook so plugins could add extra action links
to the activity chooser button.
- Unify activitychooserbutton and activitychooserbuttonactivity into a single template.
With MDL-81031 psr/log was added to moodle core, so amending the instructions
in readme_moodle.txt accordingly.
Notable upstream changes:
- With the upstream PR #422 the file `source/CAS.php` is now also
autoloaded.
- With the upstream PR #428 the list of composer ignored files got
updated. So we can now remove some of the upgrade steps in the
readme_moodle.txt
Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
From the new badge page, when the form is cancelled, a redirect should
be done to the badges/index.php.
This is a regression introduced when newbadge.php and edit.php pages
were merged.
When doing so from calling code, the property is not persisted when
filtering/paging (or any AJAX interaction); instead, it should be
set from within the report instance itself.
The icons have been updated to make them more consistent abroad Moodle and
take advantage of the benefits of FontAwesome 6.
This commit removes the actions from the first actions menu and moves them to
buttons as suggested by the UX team. Based on recent UX decisions, the following
changes have been implemented:
- The "View Quickstart Guide" is no longer displayed as a button. Instead, this
link will now appear within the text preceding the buttons (when available).
- When no courses are available on the site, the "Manage courses" button has been
replaced by "Manage course categories".
- A "Manage courses/Manage course categories" button has been added to the zero-state
view, ensuring consistency whether courses are present on the site or not.
The contextmembershipsurl property on the nrsp_info object is itself
an object of type moodle_url so its getter should return a copy
of the moodle_url object instead of a reference to the class-internal
object. This commit adds a test for get_context_memberships_url and
updates the getter so the property is immutable.
File redact is a core plugin to remove or obsure from a file (image, doc) prior to publication/release.
Currently, it has an EXIF remover service using exiftool command, but it is also possible to
add other services related to file redacting.
The plugin admin settings is under Server as it's parent.
Co-authored-by: Huong Nguyen <huongnv13@gmail.com>
The edit icon in the learning plans page has been replaced from pen
to cog, for consistency with changes done in MDL-82211.
This patch also reduces the size for this icon.
This replaces the limit on the number of students per page with a number
of grades per page, to take into account the number of grade items on a
course.
This also deprecates moodle_list and list_item, which were only being
used by qbank_managecategories, and the QUESTION_PAGE_LENGTH constant
which was defined in question_category_object.php but only used by
moodle_list.
This implementation will introduce a new user interface for
"qbank_managecategories" plugin which will allow user to drag and drop.
Having this plugin will give users the flexibility of reordering, adding
or editing
categories from the qbank_managecategories view.
Co-authored-by: Marc-Alexandre Ghaly <marc-alexandreghaly@catalyst-ca.net>
Co-authored-by: Luca Bösch <luca.boesch@bfh.ch>
When qbank plugins were first introduced, the method to add a question
category was put inside qbank_managecategories. This created an invalid
call between the mod_quiz and qbank_managecategories plugins.
Now that this method has been moved to the core_question namespace, we
can update mod_quiz to call the method there instead.
This splits the API functions required for the reorganised category UI,
to properly separate the qbank_managecategories and core_question APIs.
This methods that were part of question_category_object that should live
in the core_question namespace (generate CRUD operations related to
categories) are moved to the new \core_question\category_manager class.
The parts that belong in the qbank_managecategories plugin as they are
used to display the editing UI are moved to the
\qbank_managecategories\question_categories class.
Static methods that were defined in \qbank_managecategories\helper and
were only used within methods that have been moved to one of the new
classes have been deprecated and moved to those new classes as well.
This will allow the entire
\qbank_managecategories\question_category_object class to be deprecated
in the following commit.
The markerfilter form element was removed too aggressively from the
mod_assign_grading_options_form class. To avoid potentially introducing
unwanted behavior-especially if any external code relies on this
form-the original structure should be preserved.
Creates a temporary assignment grading options form class as a
replacement for mod_assign_grading_options_form, which will be
deprecated but must remain unchanged to avoid introducing any
unwanted behaviour in case an external code is currently using it.
This temporary form is intended for exclusive use on the assignment
submissions page during the gradual migration of form elements. It
will be removed from the core once the migration process is complete.
The logic about adding links to view user posts in the forum module
was previously in core code, but there is an existing callback that
means this can be implemented entirely within the forum module.
Co-authored-by: sam marshall <s.marshall@open.ac.uk>
* Subsections are considered as section and need to be prevented to
be moved into itself so to avoid infinite recursive structures.
This prevent this from happenning at a lower level (state)
A check for deprecated icons has been integrated into Behat tests.
This check can be disabled by adding the --no-icon-deprecations flag
to the Behat initialization command.
A new method, get_deprecated_icons(), has been added to the icon_system class.
All deprecated icons should be registered through this method.
When $CFG->debugpageinfo is enabled, a console message will display a list of
the deprecated icons.
Some databases may have case-sensitive collation that will cause the
generated SQL query in `\enrol_database_plugin::sync_courses()` to fail
when using values for the plugin settings `newcoursestartdate` and
`newcourseenddate` with a different case compared to the columns
in the actual external database table.
For the sake of testing sync with start and end dates, let's make sure
that the config values match the case of the enrol test table's columns
for the start and end dates.
AMOS BEGIN
MOV [postrating1,mod_forum],[separateandconnected1,core]
MOV [postrating2,mod_forum],[separateandconnected2,core]
MOV [postrating3,mod_forum],[separateandconnected3,core]
AMOS END
Introduces a new capability moodle/user:viewprofilepics, granted by
default to 'user' and 'guest'. If the 'forcelogin' option or
'forceloginforprofileimage' option is enabled, then users must have
this capability in order to see profile pictures (except their own).
As the OTPHP library now utilizes a PSR-20: clock we can make use of it.
Also the the parameter '' will become mandatory in 12.0.0. So we are
asked to set a valid PSR Clock implementation instead of 'null'.
Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
With the OTPHP upgrade from v10.x to v11.x, the behaviour of the window
feature changed substantially. With version 10, the window of timestamps
goes from `timestamp - window * period` to `timestamp + window *
period`. For example, if the window is 5, the period 30 and the
timestamp 1476822000, the OTP tested are within 1476821850 (`1476822000
- 5 * 30`) and 1476822150 (`1476822000 + 5 * 30`). In other words, this
validated the 5 OTP before and after the current timestamp. With version
11, the TOTP window acts as a time drift. If the window is 15, the
period 30, and the current timestamp is 147682209, the OTP tested are
within 147682194 (`147682209 - 15`), 147682209 and 147682224 (`147682209
+ 15`). The window shall be lower than the period. Therefore, this test
includes the previous OTP but not the next one.
This change required an adaption to align our implementation with OTPHP.
The window of valid TOTP tokens is now much narrower. This change in
functionality is a security improvement, but it also means that the time
on the device generating the TOTP token must be more accurate. As OTPHP
restricts the window to be strictly lower than the period, our admin
setting now has a maximum allowed value of 29. To ensure we only have
valid window values, we need to update the admin setting to a value
lower than 30; therefore, we include an upgrade step.
Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
Each method of adding notes, either via UI or external service (via
course participant actions), defined the format of the content
different from one another. Neither of those formats were correct.
Integrates a submissions page link into the assignment's secondary
navigation, eliminates the redundant 'View all submissions' button
from the assignment's homepage and updates the existing behat tests.
Create entity definitions for competencies, frameworks and users
for new report source to provide data for report editor.
AMOS BEGIN
CPY [competencyframework,tool_lp],[competencyframework,core_competency]
CPY [proficient,tool_lp],[proficient,core_competency]
CPY [rating,tool_lp],[rating,core_competency]
CPY [taxonomy_competency,core_competency],[competency,core_competency]
AMOS END
Unfortunately PHP does not provide any means to autoload the files that
a functions is located in, even if they are in an namespace.
To work around this, Composer makes use of an `autoload.files` section
in the `composer.json` file. Shortly after the Composer autoloader is
registered with the `spl_autoload_register` call it also includes any
files listed in this section.
Moodle does not do this and really we should be doing so.
This change adds a section to the autoloader registration method which
loads all of the files defined in any third-party library included in
our `lib` directory which contains any `composer.json` file with such a
stanza.
This commit removes the dependency Assert that once was required by
OTPHP, but is no longer needed as of version 11.2.0.
Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
Notable changes:
- The OTPHP library requires now at least PHP 8.1.
- The OTPHP library now relies on the MBString extension. This extension
is now a required dependency.
- The OTPHP library now utilizes a PSR-20: clock.
Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
On the My Courses page, the actions in the Course Overview block menu
can be ignored by users who have access to them, so the UX team
suggested hiding these actions
Apart from updating the SVG icons, the big icons have been added to
take advantage of the FA icons (and remove the old ones).
The icons.scss has been updated too, to display properly the big
icons.
The tool_generator creates a testing scenario that can execute
all steps from behat_data_generators (with some limitations),
change admin settings and delete courses and users to cleanup
the created entities. However, this list of valid steps will
change over time and it will be great if all available steps
are listed with examples.
- Add SCSS code for border direction utility classes to the Boostrap 5 bridge SCSS file
- Replace all occurrences in the codebase (border-left > border-start, border-right-0 > border-end-0, ...)
- Add SCSS code for text direction utility classes to the Boostrap 5 bridge SCSS file
- Replace all occurrences in the codebase (text-left > text-start, text-sm-right > text-sm-end, ...)
- Add SCSS code for float utility classes to the Boostrap 5 bridge SCSS file
- Replace all occurrences in the codebase (float-left > float-start, float-sm-right > float-sm-end, ...)
Removes the default null value from the deprecated parameter $course,
which was introduced as part of its deprecation. Since PHP 8.0, it
is deprecated to declare functions where an optional parameter is
followed by a required parameter, as is the case here. Therefore,
the default value needs to be removed.
Deprecates the $course parameter in the constructor of the
core_course\output\actionbar\group_selector class. This parameter is no
longer used, as the $course object can now be obtained through the
$context class property. Additionaly, the $course class property has
been removed in accordance with this change.
The group selector renderable class should extend the comboboxsearch
renderable class to eliminate the need for initializing the
comboboxsearch object within the export_for_template() method and to
prevent duplicating the get_template() method.
This change ensures that the group selector correctly appears on the
submission page, adhering to the assignment's group mode settings or
the enforced group mode set by the course.
The group selector component should be sensitive to the current context
to ensure accurate validation and retrieval of group settings
(e.g. group mode).
Curl has the option CURLOPT_UNRESTRICTED_AUTH. If true, curl will send
the credentials to a different host. If false, they will not be sent.
CURLOPT_UNRESTRICTED_AUTH can only work if the CURLOPT_FOLLOWLOCATION
option is true. The filelib forces the CURLOPT_FOLLOWLOCATION option
to be false, because all redirects are emulated at the PHP level. So,
in this case, the CURLOPT_UNRESTRICTED_AUTH option is only being used
in our logic and will not work as you might expect it to.
This patch works almost the same as CURLOPT_UNRESTRICTED_AUTH in ideal
conditions. It will check whether the host is different. If so, the
system will check what value CURLOPT_UNRESTRICTED_AUTH has. If it is
not specified, then by default, it will be false. If false, then
credentials will not be sent.
A more reliable way of obtaining room power levels is now used in the
new trait get_room_power_levels_v3. This makes
get_room_powerlevels_from_sync_v3 less needed, but not necessarily
redundant. The names of the containing methods have been adjusted to
make better sense of which trait they belong to.
On Postgres, at least, get_recordset_sql performs signficantly worse
if you don't pass a limit. So, we add a limit to the query, but one
that in enormously too large, so it should never have an effect.
(And, there is code to check we never hit the limit, to avoid subtle bugs.)
Before this change if some settings were:
* read only
* visible on a settings page
* are set or have values selected
when the settings page was saved the setting would be set tobe empty,
because the hidden input remained on the page, while the other inputs
where not posted to Moodle.
Revamps and relocates the existing marking workflow filter on the
assignment submissions page into a new 'extra filters' dropdown
component within the tertiary navigation area.
* Set a background colour for the .page-header-headings class.
* Assign the .page-header-headings class to the maintenance mode
template's page header div.
The "Hide/Show/Duplicate" actions should be considered self-contained,
and not also require "manageactivities" capability (per existing docs)
in addition to the specific capability that controls the action itself.
Also ensure the "Duplicate" capability checks are in the course context.
With more methods being added to the notification_helper, some
adjustments to the existing notification_helper_test method names
were needed to differentiate them.
Provide field type to allow for number type data to be stored and
presented within those components that already support custom fields.
This is especially useful for reporting purposes.
This tests several variations of SEB config files, to ensure Moodle
is able to parse them and generate a config key hash that matches
what SEB expects.
Additional values have been added to the unencrypted_win_233.seb
config file to cover the existence of floating point values,
ensuring they are serialized correctly. The config hash value
has been updated in real_ck_hash_provider to reflect the change.
Also added coverage information to the test case class docblock.
This commit adds one new step to disable plugins, and also replaces the
regexp from the enable plugins method to make ti compatible with the
tool_generator create testing scenario.
Some email body strings use first names as greetings,
some use full names, and some do not.
Using the first name for greeting makes it consistent and
a bit more "personal".
Some email body strings use first names as greetings,
some use full names, and some do not.
Using the first name for greeting makes it consistent and
a bit more "personal".
Some places where using the wrong icon and now that they have changed,
they need to be updated. For instance:
- i/settings (cog) should be used for settings or configure.
- t/edit (pen) should be used for editing
This 'fix' is basically a work-around, but one that is already used in
some places. Now it is used in all similar places.
Exactly what causes the current file path in a file manager to become
unset is still unclear to me, but it seems to be an obscure race
condition that is very hard to reproduce.
However, when it happens, currently we are effectively defaulting to
path '/undefined/'. Using '/' is never worse, and is infinitely better
in the case where the filepicker does not allow folders to be used
(which includes important cases like essay questions in a quiz, which
some people use for exams!). In that case, falling back to non-top-level
path leads to dataloss.
Also, this is all historic JavaScript which will get replaced in the
grand de-YUI-fication, so I think a pragmatic fix is justified here.
The Open ID Connect plugin uses null for the password,
which makes the internal password update fail to proceed.
Allowing null resolved the problem.
As a note, there is a potential issue if the authentication method has
a false return for the prevent_local_password because it will trigger
the hash_internal_user_password() where the $password can not be null.
Since this only addresses the oauth2 issue, we should ignore it.
The COUNT window function can be helpful to fasten the complex query,
but it's not recommended to be used for a single table query.
The patch is specifically for PostgreSQL, MariaDB and Oracle databases as they have better performance
compared to MySQL and MSSQL. Although these databases support the COUNT window functions,
the results indicate that the query runs slower when using them.
This was added in MDL-78916 in 4.3 but makes configuring a generic
launch to the default tool URL impossible, since a content item must be
selected. This fix:
- Makes this element optional again, which allows teachers to choose
whether a given instance launches into selected content, or launches
the default tool URL.
- Changes the style to btn-secondary, given it's now optional again
Filename is no longer required (since 83db25c330), given it never
did anything so can be removed. Requiring the "Private files" block
also isn't necessary since original switch to generator methods.
A course id hidden field is needed to edit availability conditions
directly from behat. This fields is not relevant to normal execution but
it is not harmfull as section update will ignore it.
The drawer router was modifying the DOM in a variety of ways and hiding
content, without any pendingJS checks. As a result, there were cases
where a part of the UI was not visible, but had been rendered and was in
the DOM.
This change wraps the router Go method in a pendingJS call that only
resolves when the router transition completes.
Additionally the lazy load manager had a similar issue.
The conditions for updating the progress in the progress bar were
mistakenly removed. We need to revert these to ensure proper operation
of the progress bar.
- Use $DB->count_records_select() and $DB->get_recordset_select()
instead of using full SQL queries.
- Other fixes:
- Remove unused variable in progress_bar::update_raw()
- poll_stored_progress tidy-ups:
- Use validated parameter.
- Add return types for the external methods.
- Alters existing progress_bar class to support extension
- Adds stored_progress_bar class as child of progress_bar
- Adds webservice to poll stored progress
- Updates database tables
- Bumps version
- Adds unit/behat tests
Note: No backwards-compatability layer is included for manual inclusion
of filter.php as this is not a public API. Inclusion should have always
been through the filter manager, and the filter's own unit tests.
When using drag and drop with activities and subsection combination, the dropzone
of the last element was incorrectly calculated. Fixed the 'getLastCm()' function.
* Disable the Add new Section button when max has been reached
* It also grays out the (+) button between sections and display a tooltip
* When adding a new section via the (+) button between section
should add a section with the (+) (add) button disabled.
- Methods add_columns_from_entity(), add_filters_from_entity() and
report_element_search() have been moved from
\core_reportbuilder\datasource class to \core_reportbuilder\base class
in order to be available also for system reports
Make the display of both custom and user profile fields consistent in
column callbacks. The defaults for each should be considered when both
rendering the column data and also when aggregating them (specifically
for numeric columns to ensure calculations are accurate).
When such fields are filtered, and they have user defined default
values then we should also take that into account to ensure that the
same values rendered in columns can always be filtered for.
During this change, I've updated some of the variables to improve
readability and future maintainability of these classes. Annoyingly
there are a non-zero number of changes just for Oracle support.
Where the previous output was simple count of days, switch to using
the new format helper to return a time duration.
AMOS BEGIN
CPY [daystakingcourse,core_course],[daystakingcourse,core_completion]
AMOS END
The only backpack implementing OBv1.0 was Mozilla Backpack. It closed
in 2019 and their badges were moved to https://backpack.openbadges.org/
by Badgr.
However, as Badgr is supporting OBv2.0 too, it makes no sense keep OBv1.0
implementation in Moodle: it has caused some issues and over-complicates
current code.
Most of the PNG/JPG/GIF icons in the pix folder are redundant if an SVG
file is available, so they have been removed to simplify maintenance.
This commit removes all redundant icons from the pix/ folder. Additional
redundant icons in the icons/ folder will be addressed separately while
reviewing the FontAwesome icons and their SVG versions.
* Move the shared drag fixture out of the Atto plugin;
* Switch to using faster generators for populating private files;
* Clarify required fields for private files generator
The patch added a couple of things:
- Add a new feed in the RSS block form
- Make the image responsive to the parent container
- Each feed now includes a channel link
It seems that the loading of the h5p content upsets other interactions
with the page in Firefox as it loads. Unfortunately I haven't found a
reliable way to handle this with pendingJS yet.
This is the poor man's fix and we should find a better solution.
I would suggest that this is a stop gap to solve some failing tests. We
really need to look at whether we can improve the usability of this
interface on smaller displays as a longer-term fix.
If there's a driver error, for example from a step taking too long, then
this kills the entire Behat run and we have to start from scratch.
This change instead throws away the original connection and starts a new
one to try and continue the test.
W3C WebDriver Element::Click, Element::Clear, and Element::SendKeys all
state that the WebDriver implementation (chromedriver, geckodriver,
edgedriver) should scroll the element into view if it is not already
visible.
It is wrong for us to check if the element is visible or not before
calling these as it may not be but will during the click/clear/type
event.
Recent versions of Chrome do not re-render the page but return previous
page state from cache. The page state had the Submit button disabled
before navigating away.
Refreshing the page addresses this.
This upstream bug prevents creation of an anchor with a hyperlink where
the content has a block-like display.
The workaround is to wrap the content in a span, set the display to
inline, call the `createLink` command on the span, move the content out
of the span, and then remove it.
This is only done for Firefox-based browsers.
This upstream bug prevents creation of an anchor with a hyperlink where
the content has a block-like display.
The workaround is to wrap the content in a span, set the display to
inline, call the `createLink` command on the span, move the content out
of the span, and then remove it.
This is only done for Firefox-based browsers.
For columns whose values can be represented purely in SQL, we don't
need to/shouldn't select extra data because it confuses the column
output during aggregation for numeric/boolean columns.
Where columns were previously of type `TYPE_INTEGER` or `TYPE_FLOAT`
but did not provide numeric data on output, we should change their
type to `TYPE_TEXT` (i.e. the default) to ensure that future work on
numeric aggregation doesn't affect them.
The comboboxsearch component now has uses beyond the grade subcomponent
and includes alternative step definitions in behat_general.php. This
change deprecates the redundant behat step definitions related to this
component in behat_grade.php and replaces current usages with the
alternative definitions.
This commit:
- introduces a \tests\ sub-namespace for use in unit tests only
- the path to this the tests/classes directory of the owning parent
- files here are excluded from unit test runs
This is agreed per policy in MDL-80855.
This change moves the reset of global test state to the finally section
rather than doing it only if the test passes.
Previously if a test which modifies the `core_component` internals
failed, it would not reset the internal state and impact subsequent
tests.
The solid family was chosen by default when Font Awesome was upgraded
from 4 to 6, but FA6 has more families, like regular or brands.
This commit adds only the fa class to the icon when no other family
class is used.
The tool_generator creates a testing scenario that can
execute all steps from behat_data_generators (with some
limitations) and admin settings. With the patch the scenario file can
incorporate a cleanup steps to be executed when the manual test is done.
Standardise the same test cases, e.g. make final, covers notation,
static data providers, namespaces, etc.
Once the tests run, a couple of them failed. They required changes
to assertions to make them pass.
Per the previous commit, default homepage configuration (set either
for the site or as a user preference) can now be extended by third
party hook callbacks, in which case a URL is stored.
Duplicate data provider keys were overwriting and/or duplicating
one another, leading to some cases being skipped.
Other "duplicate array key" errors were picked up by `phpcs` in
this dragnet across all tests, which have also been fixed.
The tool_generator creates a testing scenario that can execute
all steps from behat_data_generators (with some limitations).
However, it cannot set any admin settings, which limits the
tool's ability to generate many real test scenarios.
The dependency of badges on user data and activities has been
removed when copying, importing, or creating backups in courses.
Now, badges can be imported or copied even if user data and activities
are not selected:
- If user data is not selected (during backup or course copying), the badge
information (name, description, image, etc.) and criteria will be included,
but the users who have been awarded the badge will be excluded.
- If activities are not selected (during backup), the badge information
(name, description, image, etc.) will be copied, but the criteria and users
who have been awarded the badge will be excluded.
By prematurely loading custom profile data in the constructor, under
specific circumstances it would happen before the page was fully
initialised which meant that any attempt at applying filters when
formatting profile field data would result in thrown exception.
Added functionality to locate static text elements within the form,
improving the ability to target and manipulate the static elements for
hiding and disabling purposes.
The feedback was exporting the percentage in the Analysis file using
a wrong value for the format, so instead of having only 2 decimals,
the number was not formatted.
The newbadge.php and edit.php pages have been merged in edit.php
to make them easier to maintain because they were quite similar
(newbadge.php was only used for creating badges and edit.php for
editing badge details and messages).
Having mod_subsection into core was a pre-requisite to incorporate some
phpunit and behat tests that are pending from previous issues. Also,
some new sectiondelegatemodule methods are added tu support the new
plugin.
- Fix Clock API is not used correctly. We need to make sure
not to reset the DI system halfway through a test.
- Switched to use Message sink to speed up the test, no need
to query the DB to verify the result anymore.
- Used Data generator to create a submission
- Fix Clock API is not used correctly. We need to make sure
not to reset the DI system halfway through a test.
- Switched to use Message sink to speed up the test, no need
to query the DB to verify the result anymore.
* Subsection are "modules" and should not be handled as "sections" in the
drag and drop process. Preventing delegated section from being dragged in
the dndsectionitems module fixes the drag and drop issues with subsections
in course index.
This commit adds two new levels to the restore course structure form:
subsection (a delegated section that belongs to a course module) and
subactivity (a course module in a subsection).
Restore form can only use information from the backup file. To allow
activities to know if they are inside a subsection, the backup now
incorporates an "insubsection" attribute. This attribute is used only
for the form display but not for the restore logic.
The patch adds two new levels to the backup form structure: subsection
(a delegated section which parent is a course module) and subactivity
(an activity inside a subsection). Those new elements are displayed as a
inner section below the parent activitiy.
For now the UI is the same as a regular section but future issues will
define how the UX should be. The new two levels have their own classes
to represents settings and have extra dependencies.
`position: sticky` doesn't work in responsive tables because responsive
tables have scrollbars, making them the nearest ancestor with a
scrolling mechanism for the sticky header. As a result, the table can no
longer be responsive. This change is actually desired and was intended
for MDL-81860. Since we implemented it here, we can close the other
issue.
Remove functionality to migrate from MyISAM, and remove tests of whether
the existing database is using this.
Support for MyISAM was dropped in Moodle 2.9 (MDL-46064) so it should
not be possible for any subsequent Moodle version to be using this.
The only remaining MyISAM-aware code is the environment check via
check_database_storage_engine() to prevent installation/upgrade if the
database is set to use this.
- Admin presets list has been converted to use Report builder
- Added ability to filter by name in the report
- Added confirmation modal when deleting presets
- Added inplace editable to rename custom presets
This commit adds all the logic to allow delegate sections backup and
restore. The backup and restore process is quite complex and it is not
designed to have task hierarchy. To solve the subsection problem, the
backup/restore planners do not include delegated sections at a course
level, but they are included when the activity with delegated section is
processed.
To allow restoing, the activity is responsible to store the
component/itemid mapping in the backup_structure_dbops. This way, when
the delegated section is restored (delegated sections are always
processed right after the parent activity) it can use the itemid
mapping.
Backup and restore settings needs to be refactored before introducing
subsections. With the current code adding two new hierachy levels
(subsections and activities in subsections) will require many
unnecessary lines of code because most of the structure is hard-coded.
With this patch when backup/restore present the course structure uses a
stack to control how mani divs are opened, instead of relying on adhoc
class attributes per each div.
About the tasks for sections and activities, the class has been
refactored. This way when subsections are introduced it will require
less lines of code and the final patch will be more comprehensible.
* Use the namespaced classes in imports instead of their aliases
* Add missing imports
* Add moved `\core\output\local\action_menu\subpanel` in the upgrade
notes
* With \core_renderer in lib/outputrenderers.php moved to its
standalone class in \core\output, the method ::render_context_header()
introduced in MDL-82160 also needs to be moved to the new class.
The quickbars selection toolbar is not displayed correctly
if the target element is too small. We will wait for it
to be fixed in the future before we re-enable it in Moodle
- Move styles in css to modules.scss
- Add new styles for questions
- Change Delete action to red colour
- Add "Page break" text to pagebreak elements in edit page
The following changes have been done to improve the reset course:
- Reset course button moved to sticky footer. Select default and
deselect all buttons set as secondary and left at the end of the form
- Adjusted page layout to a standardized format, centering the form for
improving presentation and recolocating the Reset course button away
from the bottom-right corner
- Changed page layout to standard, to display the form centered and
avoid having the Reset course button in the right bottom corner
- Modal added before resetting a course, asking user for confirmation
- Reset course buttons displayed with danger styling, because they
remove information
- All sections are expanded by default
- Default options are selected by default
This commit includes the following changes:
- Implemented a scheduled task to automate the download and update of the GeoIP database.
- Integrated checksum verification for the downloaded database file.
- Added new configuration settings to enable administrators to enter MaxMind account credentials,
allowing authenticated access to both free and paid GeoIP database versions from Maxmind.
Including any empty directories, which would cause validation to
subsequently fail when they were skipped.
Co-authored-by: Leon Stringer <leon.stringer@ntlworld.com>
This fixes various (not all) wrong @covers annotations that
are reported as warnings by PHPUnit when it's run with
code-coverage enabled.
When possible, the preferred solution is to change to
@covers at class level, that is the recommended way.
If multiple classes are involved, then a mix of @coversDefaultClass
and @covers at method level are used (always trying to use the
minimum needed patch).
This is the first of a series of issues created as sub-tasks
of MDL-82142.
Subsystems do not support the notion of a `db` folder. Instead we must
conflate the lib/db/legacyclasses.php syntax to allow it to support
paths as either a string, or an array with [subsystem, path].
This adds support for new language tags in OAuth2's
"Additional Parameters Included in a Login Request"
field. Available tags include:
Tags Example value
-----------------------------
{lang} fr
{LANG} FR
{language} fr_ca
{LANGUAGE} FR_CA
{lan-guage} fr-ca
{LAN-GUAGE} FR-CA
In can_edit_submission() when the assign group mode is SEPARATEGROUPS
check if the user has the moodle/site:accessallgroups capability before
checking if they are a shared groupmember. Due to the teamsubmission
setting students might not be in a group but can still submit, which
means they are not returned in get_shared_group_members().
`<span>` tags only permit "phrasing content" but `<div>` (and also the
`<ins>` tag) are flow content. So, switching to div all along.
Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
In MDL-81597 the original render_context_header method was removed and converted to a template.
That caused a regression, so this patch adds the method again but using the new template.
Replace the "eye" icon for enabling and disabling plugins in tables
that use the Plugin Management Table (plugin_management_table) class
with the Font Awesome "toggle" icon.
Currently, the cache_cron_task is set to look for 'sess_' as a key prefix,
which is not used in any code. As a result, sessions that have exceeded the timeout are never deleted.
The proposed patch involves changing the prefix to the LASTACCESS key prefix and
fixing the return value of get_many in the Redis cache so that it can return the required keys.
Co-authored-by: Renaud Lemaire <rlemaire@cblue.be>
* Fix review method for award_criteria_courseset when courseset is empty
* Add unit tests for coverage of the award_criteria_courseset class
@co-authored jz-reichert@web.de
* If user has been deleted we consider that the content can be deployed
by a user who can deploy other packages
* Add behat test to cover for this use case
* Fix the content bank generator as it was failing to upload the content
as the given user
All setUp(), tearDown(), setUpBeforeClass() and tearDownAfterClass()
must, always, call to parent, to ensure that everything is properly
set and cleaned.
While in a lot of situations this is not needed (parents may not
have anything to run), with PHPUnit >= 10 this can become more
important because we are going to move the reset code from current
placement @ runBare() to setUp()/tearDown().
Note that all the changes performed in this commit have been detected
and fixed by moodle-cs (ParentSetUpTearDownSniffTest).
These classes were all introduced in Moodle 4.4.
Originally they were scheduled for removal in MDL-81134, but now that we
have MDL-82156 we can remove them immediately as the autoloader now
checks for the presence of a newer class and resets if that class is not
present in the autoloader cache.
- Move all webservice related behat tests to the correct namespace.
- Add missing @core_webservice tags
- Fix behat scenarios after systemreport conversion.
- Remove 'Use template' from edit page tertiary navigation
- Create a new 'Actions' menu in the tertiary naviagation
- Move 'Import' tertiary navigation to the actions menu
- Move 'Export' button to the actions menu
- Move 'Save as new template' to the actions menu
- Convert add question select into an action menu
- Fix related behat scenarios
When the runtestscenario is executed via CLI, generators requiring a valid
$USER will fail.
This patch switches to the admin user, consistent with the approach used
in other simlar CLI scripts.
This is the final (3rd) commit, where we are adding missing
return types to a few tests (using @depends) which return
types are non-void, but something really returned (for consume
by the dependent test).
This commit includes more changes, all them also adding the :void
return type to unit tests missing them.
The difference is that all these changes, while also detected
perfectly by the moodle.PHPUnit.TestReturnType sniff, were not
auto-fixed (like the previous commit ones), because all them
do include some "return" statement and, for safety, we don't
fix them.
All the cases have been visually inspected and confirmed that
the existing "return" statements always belong to anon
functions within the test body and not the test own return statement.
While this change is not 100% required now, it's good habit
and we are checking for it since Moodle 4.4.
All the changes in this commit have been applied automatically
using the moodle.PHPUnit.TestReturnType sniff and are, exclusively
adding the ": void" return types when missing.
Currently in Firefox, if we opened a popover that was inside a modal
and closed the modal by pressing the ESC key, the popover remained on
the screen. With this change, we will ensure that popovers are closed
when the modal is closed.
Activity chooser is saving section number in a data attribute called
data-sectionid. We should use data-sectionnum instead to make it easier
to understand.
Now that system reports support aggregation natively, we can replace
a whole bunch of similar code containing hand-rolled versions with much
simpler/consistent use of API.
Per cd85e090f3 all content was escaped, however we should only do that
when displaying the value in browser or exporting to file format which
supports HTML.
There is a difference in the behaviour of the calendar block when it is on the calendar page and when it is not.
On the calendar page, when the user clicks on the date or link next/previous month or day name in the calendar block,
it will have the effect of changing the URL, which should not happen.
The patch also includes hiding popover after the user clicks the day number. When the user clicks on the date or
is focused on the date and then presses enter on the keyboard, the popover does not automatically close.
To fix this, I added an event type, "click", to be attached to the hidePopover function and added conditioning to
the target element when there was a "click" event.
An additional step was added to the Behat calendar for the click event to ease the testing process.
For the popover, I set the "animation" to false to avoid the random Behat failure caused by the slow animation.
* When a course activity is specified via an anchor in the URL we
should expand the course content containing the activity
* When we point to a specific activity via an anchor in the URL we should
expand the course index (section) surrounding the actitity.
Replace identical implementation of the same in various classes with
usage of the new trait. Implement constructor property promotion in
modified classes at the same time, to help clean up/clarify class
properties.
Autolinks are used in the database for text fields via
the auto-linking filter.
The revert is partial here because of changes made
in MDL-70384 to all field forms/templates
This reverts commit 42edaba5 from MDL-80949
The tool_generator creates a testing scenario that can
execute all steps from behat_data_generators (with some
limitations). However, it cannot set any admin settings,
which limits the tool's ability to generate many
real test scenarios.
Where current implementation, and more specifically tests, rely on the
current time then replace that with the PSR-20 Clock from 298c13ac3b.
Applicable updates to the date filter and report scheduling calculation.
It's not available during, and breaks, site installation. The output
class doesn't necessarily need it in 78db6bbce8, so switch to simple
templatable interface instead.
- Created sectiondelegatemodule abstract class for those delegated sections
managed by a module
- This class will override get_parent_section from the base class, retrieving
the parent section from the module
- If an element is being hidden visually with `display: none;` (e.g. by
using the class `.d-none`), there's no need to set `aria-hidden` because
it is already hidden from the accessibility tree.
- Setting `aria-hidden=false` is also not recommended and it's better to
remove the `aria-hidden` attribute instead of setting it to false.
The fix covers two places:
- The Redis session.
- The Redis cache store.
The PHP Redis has the option to establish the connection using TLS/SSL instead of using the "tls://" prefix.
This is done to ensure consistency with the Redis cluster connection,
as the code for both single and cluster connections is located in one place.
- Refactot context_header class to implement named templatable so
render_context_header in core and theme_boost can be removed
- Refactor context_header to use templates
- Fix context header layout and styles
Rather than exclusively relying on the image icon in the global search
documents, the 'pix' method is used now, which allows to incorporate
FontAwesome icons whenever they're available.
After some tests, it seems that we can safely cover
phpunit_util::reset_all_data() executing it within
own basic_test self tests.
That way we can confirm that the reset code is doing its job
and detecting unexpected changes at various levels (database,
globals, ...).
Note that, in order to catch the E_USER_WARNINGS, for PHPUnit 9.6
and up, we have to convert them to exceptions, because the notice/
warning/error expectations have been deprecated and will be removed
in PHPUnit 10. So we are using a trick, already used also by
advanced_test. And, no matter that we are repeating the trick
a few times, that's ok in order to have all its uses controlled.
The changes here are heterogeneous:
- Include stuff that is not available (other test has included it).
Sometimes local to a unit test, others in setupBeforeClass() or
globally, ... depends on every case.
- Rename some tests (namespaces, test name, ...) towards getting it
running.
- Amend small bits here and there.
Important note: I've left any "cosmetic" warning out from the
changes, only a few errors (like long array syntax) have been fixed.
There are a few tests in core that are commented since the
beginning. That's not useful at all, so with this commit we
are un-commenting them instead.
Note that this is an initial step to have them back with skipped
outcome. Later in this issue we'll decide about to keep them or
completely remove them (each test can have a different outcome).
This workflow just finds all the individual
tests available in core (all the test_ methods
in _test.php file) and runs them one by one,
with a total isolation, because each one is
executed by a different PHPUnit invocation..
Any test ending with error, will be reported
as part of the output.
Note that we are not using PHPUnit's own
isolation here, just running them one by one.
Where calling code was previously using either the 32-bit limit, or a
value equal to SQL_INT_MAX inside a database read/write, instead use
our new constant.
The constant can be used by calling code in place of various adhoc
versions of the same, when they require a large value with known cross
platform support.
See notes on:
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Charset
Warning: Do not use this header. Browsers omit this header and servers
should ignore it.
The Accept-Charset request HTTP header was a header that advertised a
client's supported character encodings. It is no longer widely used.
UTF-8 is well-supported and the overwhelmingly preferred choice for
character encoding. To guarantee better privacy through less
configuration-based entropy, all browsers omit the Accept-Charset
header.
Prior to this change, when importing grades from .csv (or another
method) and you choose to map the grades to a 'New grade item', you get
the following error message:
```
"Mapping collision detected - two fields maps to the same grade item
new."
```
A workaround existed that required users to import one column at a time,
which was cumbersome.
This change fixes importing multiple new grade items and adds a behat
test.
Co-authored-by: hehe009 <max_kan@hotmail.com>
Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
The default option "ASSIGN_ATTEMPT_REOPEN_METHOD_NONE" for the
"attemptreopenmethod" setting, which disallows multiple attempts at the
assignment, has been removed. This option was unnecessary because
limiting attempts to 1 through the "maxattempts" setting achieves the
same behavior.
Apart from removing this setting option (including removal of usage in
code and updating existing data in the DB), these changes include:
- Introducing a more effective progressive disclosure by allowing the
"maxattempts" setting to control the visibility of the
"attemptreopenmethod" setting in the form.
- String improvements to the labels and help text for the "maxattempts"
and "attemptreopenmethod" settings
- Changing the default value of the "maxattempts" setting from
"unlimited" to "1"
Usage:
node .grunt/upgradenotes.mjs
OR
npm run upgradenote
Arguments can be provided to specify the issue number, component,
message, and type of change.
node .grunt/upgradenotes.mjs -- \
-c [component] \
-i [issue number] \
-t [type] \
-m [message]
OR
npm run upgradenote -- \
-c [component] \
-i [issue number] \
-t [type] \
-m [message]
Summary Markdown files can be created using:
node .grunt/upgradenotes.mjs summary
Weekly release files can be created using:
node .grunt/upgradenotes.mjs release
Final release files can be created using:
using:
node .grunt/upgradenotes.mjs release [version]
Generally speaking the integration team will be responsible for updating
the UPGRADING.md notes as part of the weekly integration processes.
When the question custom fields were deleted, if there were any
hidden columns in qbank Column sort order referring those fields they
were throwing 'Custom field does not exist' exception. Changes done to
ignore such fields and display valid hiddencols, as these references
were breaking the qbank Column sort order and Question bank pages.
Finding the page layout fallback was trying to get a default layout from
the ancient theme called "base". This default theme do not exists
anymore and defining a wrong layout in a theme is a code mistake that
should not be bypassed.
In the case of bulk user actions that are implemented via Javascript,
we should ensure that once they are complete the selected action is
reset to its default state of "Choose..." so that it can be selected
again.
Prior to this, a custom grader role that has mod/assign:grade but not
mod/assign:releasegrades or mod/assign:managegrades would see a select
with only the states available to them - not the current state, and
could reset a grade from released to Not marked/In marking/Marking
completed.
This change fixes an edge case that could be triggered by creating a
custom report that contained a filter instance that was active as both
a filter and condition, where the filter instance provides parameters
to it's SQL fragment.
There is only one such filter present currently with which we can test
this, see 2f9001cbe9.
Support localised float values in filter forms, so that locales that
use different decimal separators work as expected.
Note lack of current support in the date filter.
The original workaround was put in place to address the mathjax.sre.js bug that was causing JS errors
as explained in https://github.com/mathjax/MathJax/issues/1854). However, since MathJax 2.7.3,
the underlying problem has been fixed, making the workaround unnecessary.
Additionally, the workaround was causing conflicts with some jQuery plugins.
Removing the workaround has resolved the problem of jQuery plugins failing to load properly.
Add the ability for a third party plugin to add or reorder nodes in the course navigation menu.
This will allow secondary navigation to be overridden by using Hooks API.
new file: lib/classes/hook/navigation/secondary_extend.php
modified: lib/classes/navigation/views/secondary.php
The section header from the section template has been moved to the content template
so we don't close it from within the content template.
Nothing seems to use the content template, so there should not be any
differences in HTML output anywhere.
The TinyMCE.remove() function is killing other events on Firefox
We need to modify the setupForElementId() to make TinyMCE to
remove itself outside of the event loop
There are various pages (e.g. many related to permissions), where the
form element is not a descendent of `.mform` - so the previous selector
never matched them and led to unstyled inputs.
Co-authored-by: Mikel Martín <mikel@moodle.com>
Before Moodle 4.3, config_plugins settings for qbank_columnsortorder
(disabledcol, enabledcol) had a value like
qbank_statistics\columns\facility_index,
qbank_statistics\columns\discriminative_efficiency, ...
In Moodle 4.3, the values are stored as
qbank_statistics\columns\facility_index-facility_index.
So updating the old values to match the new format.
Use the "Forum" module rather than the "Book" module, because the latter
emits two events when a student views it - if these two events happened
either side of a single second, then the report would count two distinct
views (when it was trying to assert only one).
The initial filtering for category was redundant, as it's applied
by default. While present it also caused reproducible failures on
CI due to timing issues when trying to apply multiple filters.
After discussing it in the issue, we have agreed to apply
the new phpunit_util::normalise_line_endings() method to
all the remaining cases (within tests!) where the manual
replacement was being done. This commits achieves that.
Note that I've looked for both str_replace() and preg_replace()
cases, but only the former had cases worth converting. All the
later ones are different and cannot be replaced by the new
utility method.
core_courseformat\external\get_state calls export_for_tempalte for each
course module, which in turn calls completion_info::is_tracked_user()
for the current user on the current course. The result of this call will
be the same for every course module, so does not need to be called what
may be several hundred times.
This change allows the result of is_tracked_user to be passed to the cm
state object, then calls it once and passes it to each cm's object. If
it is not passed in, it will be computed on demand as before.
Behat tests of this functionality could trigger the unlikely (in real
world usage) scenario where a user has an identical "timeaccess" value
for multiple course activities.
This led to random failures in said tests when the DB ordered items in
apparently random order, where the "timeaccess" value was equal.
- The HTTP Server setting "Use slash arguments" (slasharguments) configuration setting and related to it has been removed. Calling the option with $CFG->slasharguments or get_config('slasharguments') is no longer available.
For more information see [MDL-62640](https://tracker.moodle.org/browse/MDL-62640)
{"version":3,"file":"expand_hash.min.js","sources":["../src/expand_hash.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Expand the collapse section element.\n *\n * @module core_admin/expand_hash\n * @copyright Meirza <meirza.arson@moodle.com>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 4.5\n */\n\nconst SELECTORS = {\n COLLAPSE_ELEMENTS: '[data-toggle=\"collapse\"]',\n FOCUSTHENEXPAND_ELEMENTS: '.focus-expand',\n};\n\n/**\n * Initializes the focus and expand functionality.\n */\nexport const init = () => {\n // Select all collapsible elements only.\n const focusexpand = document.querySelector(SELECTORS.FOCUSTHENEXPAND_ELEMENTS);\n\n // Add click event listener to the anchor element\n focusexpand?.addEventListener('click', () => {\n expandSection(`${focusexpand.getAttribute('href')}`);\n });\n};\n\n/**\n * Expands a section based on the provided URL hash.\n *\n * This function takes a hash string, finds the corresponding element in the DOM,\n * and expands it if it is currently collapsed. It updates the necessary ARIA\n * attributes and classes to reflect the expanded state.\n *\n * @param {string} hash - The hash (e.g., '#elementId') of the element to expand.\n */\nexport const expandSection = (hash) => {\n const container = document.querySelector(hash);\n const targetContainer = container?.querySelector(SELECTORS.COLLAPSE_ELEMENTS);\n\n if (targetContainer?.getAttribute('aria-expanded') === 'false') {\n const collapseId = targetContainer.getAttribute('aria-controls');\n const collapseContainer = document.getElementById(collapseId);\n\n // Show the content.\n collapseContainer.classList.remove('collapse');\n collapseContainer.classList.add('show');\n\n // Update aria-expanded attribute to reflect the new state.\n targetContainer.setAttribute('aria-expanded', 'true');\n targetContainer.classList.remove('collapsed');\n\n // Get collapse expand menu element.\n const collapseElement = document.querySelector('.collapseexpand.collapsemenu');\n // Ensure it gets noticed to make it work.\n collapseElement.setAttribute('aria-expanded', 'true');\n collapseElement.classList.remove('collapsed');\n }\n};\n"],"names":["SELECTORS","focusexpand","document","querySelector","addEventListener","expandSection","getAttribute","hash","container","targetContainer","collapseId","collapseContainer","getElementById","classList","remove","add","setAttribute","collapseElement"],"mappings":";;;;;;;;;MAwBMA,4BACiB,2BADjBA,mCAEwB,8BAMV,WAEVC,YAAcC,SAASC,cAAcH,oCAG3CC,MAAAA,aAAAA,YAAaG,iBAAiB,SAAS,KACnCC,wBAAiBJ,YAAYK,aAAa,oBAarCD,cAAiBE,aACpBC,UAAYN,SAASC,cAAcI,MACnCE,gBAAkBD,MAAAA,iBAAAA,UAAWL,cAAcH,gCAEM,WAAnDS,MAAAA,uBAAAA,gBAAiBH,aAAa,kBAA8B,OACtDI,WAAaD,gBAAgBH,aAAa,iBAC1CK,kBAAoBT,SAASU,eAAeF,YAGlDC,kBAAkBE,UAAUC,OAAO,YACnCH,kBAAkBE,UAAUE,IAAI,QAGhCN,gBAAgBO,aAAa,gBAAiB,QAC9CP,gBAAgBI,UAAUC,OAAO,mBAG3BG,gBAAkBf,SAASC,cAAc,gCAE/Cc,gBAAgBD,aAAa,gBAAiB,QAC9CC,gBAAgBJ,UAAUC,OAAO"}
{"version":3,"file":"plugins_overview.min.js","sources":["../src/plugins_overview.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Allows to filter the plugin list on plugins overview page\n *\n * @module core_admin/plugins_overview\n * @copyright 2024 Marina Glancy\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nconst SELECTORS = {\n PLUGIN_FILTERS: '#plugins-overview-panel [data-filterby]',\n PLUGIN_ROWS: 'table#plugins-control-panel tbody tr:not(.plugintypeheader)',\n PLUGIN_TYPE_ROWS: 'table#plugins-control-panel tbody tr.plugintypeheader',\n};\n\n/**\n * Initialise filters for the \"Plugins overview\" page\n */\nexport function init() {\n const filters = document.querySelectorAll(SELECTORS.PLUGIN_FILTERS);\n const pluginRows = document.querySelectorAll(SELECTORS.PLUGIN_ROWS);\n const pluginTypeRows = document.querySelectorAll(SELECTORS.PLUGIN_TYPE_ROWS);\n\n const filterPlugins = (target) => {\n const filterBy = target.getAttribute('data-filterby');\n const headerVisibility = {};\n\n // Hide all plugin rows in the plugin table that do not match the filter and show all others.\n for (const row of pluginRows) {\n const type = [...row.classList].find(s => s.startsWith('type-'));\n const visible = filterBy === 'all' ? true : row.classList.contains(filterBy);\n row.style.display = visible ? null : 'none';\n if (visible && type) {\n headerVisibility[type] = true;\n }\n }\n\n // Hide all the plugin type headers that do not have any visible plugins and show all others.\n for (const row of pluginTypeRows) {\n const type = [...row.classList].find(s => s.startsWith('type-'));\n if (type) {\n const visible = filterBy === 'all' || headerVisibility[type];\n row.style.display = visible ? null : 'none';\n }\n }\n\n // Toggle 'active' class for the selected filter.\n filters.forEach(el => el.classList.remove('active'));\n target.classList.add('active');\n };\n\n // Add event listeners for the links changing plugins filters.\n filters\n .forEach(target => target.addEventListener('click', (e) => {\n e.preventDefault();\n window.history.replaceState({}, null, e.target.href);\n filterPlugins(target);\n }));\n\n // Pre-filter plugins based on the current url anchor.\n if (window.location.hash.length > 1) {\n const anchor = window.location.hash.substring(1);\n const target = [...filters].find(t => t.getAttribute('data-filterby') === anchor);\n if (target) {\n filterPlugins(target);\n }\n }\n}\n"],"names":["filters","document","querySelectorAll","SELECTORS","pluginRows","pluginTypeRows","filterPlugins","target","filterBy","getAttribute","headerVisibility","row","type","classList","find","s","startsWith","visible","contains","style","display","forEach","el","remove","add","addEventListener","e","preventDefault","window","history","replaceState","href","location","hash","length","anchor","substring","t"],"mappings":"4JAiCUA,QAAUC,SAASC,iBAAiBC,0BACpCC,WAAaH,SAASC,iBAAiBC,uBACvCE,eAAiBJ,SAASC,iBAAiBC,4BAE3CG,cAAiBC,eACbC,SAAWD,OAAOE,aAAa,iBAC/BC,iBAAmB,OAGpB,MAAMC,OAAOP,WAAY,OACpBQ,KAAO,IAAID,IAAIE,WAAWC,MAAKC,GAAKA,EAAEC,WAAW,WACjDC,QAAuB,QAAbT,UAA4BG,IAAIE,UAAUK,SAASV,UACnEG,IAAIQ,MAAMC,QAAUH,QAAU,KAAO,OACjCA,SAAWL,OACXF,iBAAiBE,OAAQ,OAK5B,MAAMD,OAAON,eAAgB,OACxBO,KAAO,IAAID,IAAIE,WAAWC,MAAKC,GAAKA,EAAEC,WAAW,cACnDJ,KAAM,OACAK,QAAuB,QAAbT,UAAsBE,iBAAiBE,MACvDD,IAAIQ,MAAMC,QAAUH,QAAU,KAAO,QAK7CjB,QAAQqB,SAAQC,IAAMA,GAAGT,UAAUU,OAAO,YAC1ChB,OAAOM,UAAUW,IAAI,cAIzBxB,QACCqB,SAAQd,QAAUA,OAAOkB,iBAAiB,SAAUC,IACjDA,EAAEC,iBACFC,OAAOC,QAAQC,aAAa,GAAI,KAAMJ,EAAEnB,OAAOwB,MAC/CzB,cAAcC,aAIdqB,OAAOI,SAASC,KAAKC,OAAS,EAAG,OAC3BC,OAASP,OAAOI,SAASC,KAAKG,UAAU,GACxC7B,OAAS,IAAIP,SAASc,MAAKuB,GAAKA,EAAE5B,aAAa,mBAAqB0B,SACtE5B,QACAD,cAAcC;;;;;;;;MAvDpBJ,yBACc,0CADdA,sBAEW,8DAFXA,2BAGgB"}
{"version":3,"file":"admin_presets_list.min.js","sources":["../src/admin_presets_list.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Admin presets list management\n *\n * @module tool_admin_presets/admin_presets_list\n * @copyright 2024 David Carrillo <davidmc@moodle.com>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n\"use strict\";\n\nimport {dispatchEvent} from 'core/event_dispatcher';\nimport Notification from 'core/notification';\nimport {prefetchStrings} from 'core/prefetch';\nimport {getString} from 'core/str';\nimport Pending from 'core/pending';\nimport * as reportEvents from 'core_reportbuilder/local/events';\nimport * as reportSelectors from 'core_reportbuilder/local/selectors';\nimport {add as addToast} from 'core/toast';\nimport {deletePreset} from 'tool_admin_presets/repository';\n\n/**\n * Initialise module\n */\nexport const init = () => {\n prefetchStrings('core', [\n 'delete',\n ]);\n\n prefetchStrings('tool_admin_presets', [\n 'deleteshow',\n 'deletepreset',\n 'eventpresetdeleted',\n 'deletepreviouslyapplied'\n ]);\n\n document.addEventListener('click', event => {\n const presetDelete = event.target.closest('[data-action=\"admin-preset-delete\"]');\n if (presetDelete) {\n event.preventDefault();\n\n // Use triggerElement to return focus to the action menu toggle.\n const triggerElement = presetDelete.closest('.dropdown').querySelector('.dropdown-toggle');\n const stringid = presetDelete.dataset.presetRollback ? 'deletepreviouslyapplied' : 'deletepreset';\n\n /* eslint-disable promise/no-nesting */\n Notification.saveCancelPromise(\n getString('deleteshow', 'tool_admin_presets'),\n getString(stringid, 'tool_admin_presets', presetDelete.dataset.presetName),\n getString('delete', 'core'),\n {triggerElement}\n ).then(() => {\n const pendingPromise = new Pending('tool/admin_presets:deletepreset');\n const reportElement = event.target.closest(reportSelectors.regions.report);\n\n return deletePreset(presetDelete.dataset.presetId)\n .then(() => addToast(getString('eventpresetdeleted', 'tool_admin_presets')))\n .then(() => {\n dispatchEvent(reportEvents.tableReload, {preservePagination: true}, reportElement);\n return pendingPromise.resolve();\n })\n .catch(Notification.exception);\n }).catch(() => {\n return;\n });\n }\n });\n};\n"],"names":["document","addEventListener","event","presetDelete","target","closest","preventDefault","triggerElement","querySelector","stringid","dataset","presetRollback","saveCancelPromise","presetName","then","pendingPromise","Pending","reportElement","reportSelectors","regions","report","presetId","reportEvents","tableReload","preservePagination","resolve","catch","Notification","exception"],"mappings":"+qDAsCoB,mCACA,OAAQ,CACpB,yCAGY,qBAAsB,CAClC,aACA,eACA,qBACA,4BAGJA,SAASC,iBAAiB,SAASC,cACzBC,aAAeD,MAAME,OAAOC,QAAQ,0CACtCF,aAAc,CACdD,MAAMI,uBAGAC,eAAiBJ,aAAaE,QAAQ,aAAaG,cAAc,oBACjEC,SAAWN,aAAaO,QAAQC,eAAiB,0BAA4B,qCAGtEC,mBACT,kBAAU,aAAc,uBACxB,kBAAUH,SAAU,qBAAsBN,aAAaO,QAAQG,aAC/D,kBAAU,SAAU,QACpB,CAACN,eAAAA,iBACHO,MAAK,WACGC,eAAiB,IAAIC,iBAAQ,mCAC7BC,cAAgBf,MAAME,OAAOC,QAAQa,gBAAgBC,QAAQC,eAE5D,4BAAajB,aAAaO,QAAQW,UACpCP,MAAK,KAAM,eAAS,kBAAU,qBAAsB,yBACpDA,MAAK,yCACYQ,aAAaC,YAAa,CAACC,oBAAoB,GAAOP,eAC7DF,eAAeU,aAEzBC,MAAMC,sBAAaC,cACzBF,OAAM"}
{"version":3,"file":"repository.min.js","sources":["../src/repository.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Module to handle presets AJAX requests\n *\n * @module tool_admin_presets/repository\n * @copyright 2024 David Carrillo <davidmc@moodle.com>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Ajax from 'core/ajax';\n\n/**\n * Delete given preset\n *\n * @param {Number} presetId\n * @return {Promise}\n */\nexport const deletePreset = presetId => {\n const request = {\n methodname: 'tool_admin_presets_delete_preset',\n args: {id: presetId}\n };\n\n return Ajax.call([request])[0];\n};\n"],"names":["presetId","request","methodname","args","id","Ajax","call"],"mappings":";;;;;;;oKA+B4BA,iBAClBC,QAAU,CACZC,WAAY,mCACZC,KAAM,CAACC,GAAIJ,kBAGRK,cAAKC,KAAK,CAACL,UAAU"}
@@ -34,9 +34,10 @@ $string['basedescription'] = 'Presets allow you to easily switch between differe
$string['created']='Created';
$string['currentvalue']='Current value';
$string['deletepreset']='Are you sure you want to delete the site admin preset {$a}?';
$string['deletepreviouslyapplied']='This preset has been previously applied. Deleting a preset removes it from your site completely. You will not be able to revert your settings to how they were before applying this preset.';
$string['deletepreviouslyapplied']='Are you sure you want to delete the site admin preset {$a}?<br><br>This preset has been previously applied. Deleting a preset removes it from your site completely. You will not be able to revert your settings to how they were before applying this preset.';
@@ -70,7 +70,7 @@ class base_test extends \advanced_testcase {
*
*@returnarray
*/
publicstaticfunctionlog_provider():array{
publicfunctionlog_provider():array{
return[
// Action = base.
'action=base and mode = show'=>[
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.