Merge branch 'MDL-68427-master' of git://github.com/andrewnicols/moodle
authorEloy Lafuente (stronk7) <stronk7@moodle.org>
Thu, 30 Apr 2020 21:35:09 +0000 (23:35 +0200)
committerEloy Lafuente (stronk7) <stronk7@moodle.org>
Thu, 30 Apr 2020 21:35:09 +0000 (23:35 +0200)
953 files changed:
.eslintignore
.github/FUNDING.yml [new file with mode: 0644]
.stylelintignore
.travis.yml
Gruntfile.js
admin/contentbank.php [new file with mode: 0644]
admin/message.php
admin/renderer.php
admin/settings/development.php
admin/settings/plugins.php
admin/testoutgoingmailconf.php
admin/tool/dataprivacy/amd/build/myrequestactions.min.js
admin/tool/dataprivacy/amd/build/myrequestactions.min.js.map
admin/tool/dataprivacy/amd/src/myrequestactions.js
admin/tool/messageinbound/lang/en/tool_messageinbound.php
admin/tool/recyclebin/tests/behat/basic_functionality.feature
admin/tool/task/lang/en/tool_task.php
admin/tool/task/tests/behat/clear_fail_delay.feature
admin/tool/xmldb/actions/check_indexes/check_indexes.class.php
admin/tool/xmldb/lang/en/tool_xmldb.php
backup/util/dbops/restore_dbops.class.php
backup/util/dbops/tests/restore_dbops_test.php
blocks/activity_modules/block_activity_modules.php
blocks/site_main_menu/tests/behat/add_url.feature
cache/classes/helper.php
cache/classes/loaders.php
cache/classes/store.php
cache/tests/cache_test.php
cache/upgrade.txt
calendar/amd/build/crud.min.js
calendar/amd/build/crud.min.js.map
calendar/amd/src/crud.js
composer.json
composer.lock
config-dist.php
contentbank/amd/build/actions.min.js [new file with mode: 0644]
contentbank/amd/build/actions.min.js.map [new file with mode: 0644]
contentbank/amd/src/actions.js [new file with mode: 0644]
contentbank/classes/content.php [new file with mode: 0644]
contentbank/classes/contentbank.php [new file with mode: 0644]
contentbank/classes/contenttype.php [new file with mode: 0644]
contentbank/classes/external/delete_content.php [new file with mode: 0644]
contentbank/classes/helper.php [new file with mode: 0644]
contentbank/classes/output/bankcontent.php [new file with mode: 0644]
contentbank/classes/privacy/provider.php [new file with mode: 0644]
contentbank/contenttype/h5p/classes/content.php [new file with mode: 0644]
contentbank/contenttype/h5p/classes/contenttype.php [new file with mode: 0644]
contentbank/contenttype/h5p/classes/privacy/provider.php [moved from mod/quiz/accessrule/safebrowser/classes/privacy/provider.php with 76% similarity]
contentbank/contenttype/h5p/db/access.php [new file with mode: 0644]
contentbank/contenttype/h5p/lang/en/contenttype_h5p.php [new file with mode: 0644]
contentbank/contenttype/h5p/tests/behat/admin_upload_content.feature [new file with mode: 0644]
contentbank/contenttype/h5p/tests/behat/teacher_upload_content.feature [new file with mode: 0644]
contentbank/contenttype/h5p/tests/content_h5p_test.php [new file with mode: 0644]
contentbank/contenttype/h5p/tests/contenttype_h5p_test.php [new file with mode: 0644]
contentbank/contenttype/h5p/version.php [new file with mode: 0644]
contentbank/files_form.php [new file with mode: 0644]
contentbank/index.php [new file with mode: 0644]
contentbank/templates/bankcontent.mustache [new file with mode: 0644]
contentbank/templates/toolbar.mustache [new file with mode: 0644]
contentbank/tests/behat/access_permissions.feature [new file with mode: 0644]
contentbank/tests/behat/delete_content.feature [new file with mode: 0644]
contentbank/tests/content_test.php [new file with mode: 0644]
contentbank/tests/contentbank_test.php [new file with mode: 0644]
contentbank/tests/contenttype_test.php [new file with mode: 0644]
contentbank/tests/external/delete_content_test.php [new file with mode: 0644]
contentbank/tests/fixtures/testable_content.php [new file with mode: 0644]
contentbank/tests/fixtures/testable_contenttype.php [new file with mode: 0644]
contentbank/tests/generator/lib.php [new file with mode: 0644]
contentbank/upload.php [new file with mode: 0644]
contentbank/view.php [new file with mode: 0644]
course/amd/build/local/activitychooser/selectors.min.js
course/amd/build/local/activitychooser/selectors.min.js.map
course/amd/src/local/activitychooser/selectors.js
course/classes/local/service/content_item_service.php
course/classes/management/helper.php
course/classes/output/recommendations/activity_list.php
course/format/renderer.php
course/recommendations.php
course/resources.php
course/templates/activity_list.mustache
course/templates/local/activitychooser/search.mustache
course/tests/behat/activity_chooser.feature
course/tests/behat/search_recommended_activities.feature [new file with mode: 0644]
course/tests/services_content_item_service_test.php
grade/grading/form/guide/lang/en/gradingform_guide.php
grade/grading/form/rubric/renderer.php
grade/grading/form/rubric/styles.css
grade/import/lib.php
h5p/ajax.php [new file with mode: 0644]
h5p/amd/build/editor_display.min.js [new file with mode: 0644]
h5p/amd/build/editor_display.min.js.map [new file with mode: 0644]
h5p/amd/src/editor_display.js [new file with mode: 0644]
h5p/classes/api.php
h5p/classes/core.php
h5p/classes/editor.php [new file with mode: 0644]
h5p/classes/editor_ajax.php [new file with mode: 0644]
h5p/classes/editor_framework.php [new file with mode: 0644]
h5p/classes/factory.php
h5p/classes/file_storage.php
h5p/classes/framework.php
h5p/classes/helper.php
h5p/classes/local/library/autoloader.php
h5p/classes/local/library/handler.php
h5p/classes/output/h5peditor.php [new file with mode: 0644]
h5p/classes/output/renderer.php [moved from mod/quiz/accessrule/safebrowser/version.php with 68% similarity]
h5p/classes/player.php
h5p/embed.php
h5p/h5plib/v124/joubel/editor/README.md [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/CHANGES.md [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/LICENSE.md [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/adapters/jquery.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/build-config.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/ckeditor.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/config.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/contents.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/af.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/ar.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/az.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/bg.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/bn.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/bs.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/ca.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/cs.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/cy.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/da.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/de-ch.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/de.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/el.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/en-au.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/en-ca.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/en-gb.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/en.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/eo.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/es-mx.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/es.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/et.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/eu.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/fa.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/fi.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/fo.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/fr-ca.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/fr.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/gl.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/gu.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/he.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/hi.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/hr.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/hu.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/id.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/is.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/it.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/ja.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/ka.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/km.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/ko.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/ku.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/lt.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/lv.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/mk.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/mn.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/ms.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/nb.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/nl.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/no.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/oc.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/pl.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/pt-br.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/pt.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/ro.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/ru.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/si.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/sk.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/sl.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/sq.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/sr-latn.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/sr.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/sv.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/th.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/tr.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/tt.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/ug.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/uk.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/vi.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/zh-cn.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/lang/zh.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/_translationstatus.txt [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/af.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/ar.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/az.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/bg.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/ca.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/cs.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/cy.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/da.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/de-ch.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/de.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/el.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/en-au.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/en-gb.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/en.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/eo.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/es-mx.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/es.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/et.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/eu.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/fa.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/fi.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/fo.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/fr-ca.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/fr.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/gl.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/gu.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/he.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/hi.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/hr.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/hu.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/id.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/it.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/ja.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/km.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/ko.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/ku.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/lt.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/lv.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/mk.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/mn.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/nb.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/nl.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/no.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/oc.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/pl.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/pt-br.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/pt.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/ro.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/ru.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/si.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/sk.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/sl.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/sq.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/sr-latn.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/sr.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/sv.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/th.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/tr.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/tt.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/ug.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/uk.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/vi.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/zh-cn.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/a11yhelp/dialogs/lang/zh.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/clipboard/dialogs/paste.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codeTag/README.md [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/dialogs/codesnippet.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/CHANGES.md [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/LICENSE [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/README.md [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/README.ru.md [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/highlight.pack.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/arta.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/ascetic.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-dune.dark.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-dune.light.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-forest.dark.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-forest.light.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-heath.dark.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-heath.light.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-lakeside.dark.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-lakeside.light.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-seaside.dark.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/atelier-seaside.light.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/brown_paper.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/brown_papersq.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/dark.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/default.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/docco.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/far.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/foundation.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/github.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/googlecode.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/idea.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/ir_black.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/magula.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/mono-blue.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/monokai.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/monokai_sublime.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/obsidian.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/paraiso.dark.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/paraiso.light.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/pojoaque.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/pojoaque.jpg [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/railscasts.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/rainbow.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/school_book.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/school_book.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/solarized_dark.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/solarized_light.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/sunburst.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night-blue.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night-bright.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night-eighties.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow-night.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/tomorrow.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/vs.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/xcode.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/codesnippet/lib/highlight/styles/zenburn.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/colordialog/dialogs/colordialog.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/colordialog/dialogs/colordialog.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/customCodeHighlighter/plugin.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/dialog/dialogDefinition.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/dialog/styles/dialog.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/icons.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/icons_hidpi.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/lineheight/LICENSE [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/lineheight/README.md [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/lineheight/readme.txt [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/link/dialogs/anchor.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/link/dialogs/link.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/link/images/anchor.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/link/images/hidpi/anchor.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/magicline/images/hidpi/icon-rtl.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/magicline/images/hidpi/icon.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/magicline/images/icon-rtl.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/magicline/images/icon.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/pastefromword/filter/default.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/pastetools/filter/common.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/removeRedundantNBSP/plugin.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/af.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/ar.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/az.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/bg.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/ca.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/cs.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/cy.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/da.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/de-ch.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/de.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/el.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/en-au.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/en-ca.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/en-gb.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/en.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/eo.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/es-mx.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/es.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/et.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/eu.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/fa.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/fi.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/fr-ca.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/fr.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/gl.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/he.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/hr.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/hu.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/id.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/it.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/ja.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/km.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/ko.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/ku.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/lt.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/lv.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/nb.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/nl.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/no.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/oc.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/pl.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/pt.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/ro.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/ru.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/si.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/sk.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/sl.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/sq.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/sr-latn.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/sr.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/sv.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/th.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/tr.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/tt.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/ug.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/uk.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/vi.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/lang/zh.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/specialchar/dialogs/specialchar.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/table/dialogs/table.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/tabletools/dialogs/tableCell.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/plugins/widget/images/handle.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/css/samples.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/img/github-top.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/img/header-bg.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/img/header-separator.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/img/logo.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/img/logo.svg [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/img/navigation-tip.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/index.html [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/js/sample.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/js/sf.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/ajax.html [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/api.html [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/appendto.html [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/assets/inlineall/logo.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/assets/outputxhtml/outputxhtml.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/assets/posteddata.php [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/assets/sample.jpg [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/assets/uilanguages/languages.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/autogrow/autogrow.html [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/codesnippet/codesnippet.html [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/datafiltering.html [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/dialog/assets/my_dialog.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/dialog/dialog.html [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/divreplace.html [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/enterkey/enterkey.html [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/htmlwriter/assets/outputforflash/outputforflash.fla [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/htmlwriter/assets/outputforflash/outputforflash.swf [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/htmlwriter/assets/outputforflash/swfobject.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/htmlwriter/outputforflash.html [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/htmlwriter/outputhtml.html [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/index.html [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/inlineall.html [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/inlinebycode.html [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/inlinetextarea.html [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/jquery.html [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/magicline/magicline.html [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/readonly.html [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/replacebyclass.html [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/replacebycode.html [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/sample.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/sample.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/sample_posteddata.php [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/tabindex.html [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/toolbar/toolbar.html [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/uicolor.html [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/uilanguages.html [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/wysiwygarea/fullpage.html [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/old/xhtmlstyle.html [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/toolbarconfigurator/css/fontello.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/toolbarconfigurator/font/LICENSE.txt [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/toolbarconfigurator/font/config.json [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/toolbarconfigurator/font/fontello.eot [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/toolbarconfigurator/font/fontello.svg [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/toolbarconfigurator/font/fontello.ttf [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/toolbarconfigurator/font/fontello.woff [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/toolbarconfigurator/index.html [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/toolbarconfigurator/js/abstracttoolbarmodifier.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/toolbarconfigurator/js/fulltoolbareditor.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/toolbarconfigurator/js/toolbarmodifier.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/toolbarconfigurator/js/toolbartextmodifier.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/toolbarconfigurator/lib/codemirror/LICENSE [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/toolbarconfigurator/lib/codemirror/codemirror.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/toolbarconfigurator/lib/codemirror/codemirror.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/toolbarconfigurator/lib/codemirror/javascript.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/toolbarconfigurator/lib/codemirror/neo.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/toolbarconfigurator/lib/codemirror/show-hint.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/samples/toolbarconfigurator/lib/codemirror/show-hint.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/.temp/css/dialog.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/.temp/css/dialog_ie.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/.temp/css/dialog_ie7.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/.temp/css/dialog_ie8.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/.temp/css/dialog_iequirks.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/.temp/css/dialog_opera.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/.temp/css/editor.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/.temp/css/editor_gecko.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/.temp/css/editor_ie.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/.temp/css/editor_ie7.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/.temp/css/editor_ie8.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/.temp/css/editor_iequirks.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/dialog.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/dialog_ie.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/dialog_ie7.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/dialog_ie8.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/dialog_iequirks.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/dialog_opera.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/editor.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/editor_gecko.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/editor_ie.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/editor_ie7.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/editor_ie8.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/editor_iequirks.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/icons.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/icons_hidpi.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/images/arrow.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/images/close.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/images/hidpi/close.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/images/hidpi/lock-open.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/images/hidpi/lock.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/images/hidpi/refresh.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/images/lock-open.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/images/lock.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/images/refresh.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/readme.md [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/sample/bootstrapck-sample.html [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/sample/css/bootstrapck-sample.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/sample/js/analytics.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/sample/js/jquery-1.11.0.min.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/scss/browser-specific/gecko/editor_gecko.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/scss/browser-specific/ie/dialog_ie.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/scss/browser-specific/ie/editor_ie.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/scss/browser-specific/ie7/dialog_ie7.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/scss/browser-specific/ie7/editor_ie7.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/scss/browser-specific/ie8/dialog_ie8.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/scss/browser-specific/ie8/editor_ie8.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/scss/browser-specific/iequirks/dialog_iequirks.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/scss/browser-specific/iequirks/editor_iequirks.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/scss/browser-specific/opera/dialog_opera.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/scss/components/_colorpanel.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/scss/components/_elementspath.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/scss/components/_mainui.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/scss/components/_menu.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/scss/components/_panel.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/scss/components/_presets.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/scss/components/_reset.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/scss/components/_richcombo.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/scss/components/_toolbar.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/scss/components/editor.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/scss/config/_colors.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/scss/config/_config.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/scss/config/_defaults.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/skins/bootstrapck/scss/dialog/dialog.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/ckeditor/styles.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/h5peditor-ajax.class.php [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/h5peditor-ajax.interface.php [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/h5peditor-file.class.php [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/h5peditor-storage.interface.php [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/h5peditor.class.php [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/images/add.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/images/binary-file.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/images/collapse.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/images/down.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/images/expand.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/images/order.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/images/remove.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/images/transparent-background.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/images/webm-file.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/language/ar.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/language/bs.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/language/de.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/language/el.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/language/en.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/language/es-cr.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/language/es-mx.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/language/es.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/language/et.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/language/eu.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/language/fi.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/language/fr.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/language/it.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/language/nb.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/language/nl.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/language/nn.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/language/pl.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/language/pt-br.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/language/pt.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/language/ru.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/language/tr.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/libs/darkroom.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/libs/darkroom.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/libs/fabric.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/libs/zebra_datepicker.min.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/readme_moodle.txt [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5p-hub-client.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-av.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-boolean.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-coordinates.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-dimensions.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-editor.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-file-uploader.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-file.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-form.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-fullscreen-bar.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-group.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-html.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-image-popup.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-image.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-init.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-library-list-cache.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-library-selector.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-library.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-list-editor.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-list.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-metadata-author-widget.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-metadata-changelog-widget.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-metadata.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-none.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-number.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-pre-save.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-select.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-selector-hub.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-selector-legacy.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-semantic-structure.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-text.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor-textarea.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/scripts/h5peditor.js [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/config.rb [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/css/application.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/css/cke-contents.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/css/fonts.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/css/fonts/h5p-fullscreen-bar.eot [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/css/fonts/h5p-fullscreen-bar.svg [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/css/fonts/h5p-fullscreen-bar.ttf [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/css/fonts/h5p-fullscreen-bar.woff [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/css/fonts/h5p-hub.eot [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/css/fonts/h5p-hub.svg [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/css/fonts/h5p-hub.ttf [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/css/fonts/h5p-hub.woff [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/css/fonts/h5p-metadata-icons.eot [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/css/fonts/h5p-metadata-icons.svg [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/css/fonts/h5p-metadata-icons.ttf [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/css/fonts/h5p-metadata-icons.woff [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/css/h5p-hub-client.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/css/libs/icons.png [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/css/libs/zebra_datepicker.min.css [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/scss/_copy-paste.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/scss/_deprecated.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/scss/_form-field.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/scss/_form-groups.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/scss/_fullscreen-bar.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/scss/_h5peditor-image-edit-popup.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/scss/_h5peditor-image-edit.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/scss/_metadata-author-widget.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/scss/_metadata-changelog-widget.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/scss/_metadata-form.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/scss/_metadata-popup.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/scss/_mixins.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/scss/_utils.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/scss/_variables.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/scss/application.scss [new file with mode: 0644]
h5p/h5plib/v124/joubel/editor/styles/scss/cke-contents.scss [new file with mode: 0644]
h5p/h5plib/v124/lang/en/h5plib_v124.php
h5p/h5plib/v124/thirdpartylibs.xml
h5p/js/embed.js
h5p/js/h5p_overrides.js
h5p/lib.php
h5p/templates/h5peditor.mustache [new file with mode: 0644]
h5p/tests/api_test.php
h5p/tests/editor_ajax_test.php [new file with mode: 0644]
h5p/tests/editor_framework_test.php [new file with mode: 0644]
h5p/tests/editor_test.php [new file with mode: 0644]
h5p/tests/fixtures/multiple-choice-2-6.h5p [new file with mode: 0644]
h5p/tests/framework_test.php
h5p/tests/generator/lib.php
h5p/tests/generator_test.php
h5p/tests/h5p_file_storage_test.php
h5p/tests/helper_test.php
h5p/upgrade.txt
install/lang/eu/install.php
install/lang/eu/moodle.php
install/lang/om/install.php [new file with mode: 0644]
install/lang/om/moodle.php [new file with mode: 0644]
install/lang/prs/langconfig.php [new file with mode: 0644]
install/lang/ps/langconfig.php
install/lang/zh_cn/langconfig.php
lang/en/admin.php
lang/en/cache.php
lang/en/contentbank.php [new file with mode: 0644]
lang/en/course.php
lang/en/enrol.php
lang/en/error.php
lang/en/h5p.php
lang/en/moodle.php
lang/en/plugin.php
lang/en/repository.php
lang/en/role.php
lib/adminlib.php
lib/ajax/getnavbranch.php
lib/ajax/service.php
lib/amd/build/chart_base.min.js
lib/amd/build/chart_base.min.js.map
lib/amd/build/chart_output_chartjs.min.js
lib/amd/build/chart_output_chartjs.min.js.map
lib/amd/build/chart_series.min.js
lib/amd/build/chart_series.min.js.map
lib/amd/build/custom_interaction_events.min.js
lib/amd/build/custom_interaction_events.min.js.map
lib/amd/build/drawer.min.js
lib/amd/build/drawer.min.js.map
lib/amd/build/form-autocomplete.min.js
lib/amd/build/form-autocomplete.min.js.map
lib/amd/src/chart_base.js
lib/amd/src/chart_output_chartjs.js
lib/amd/src/chart_series.js
lib/amd/src/custom_interaction_events.js
lib/amd/src/drawer.js
lib/amd/src/form-autocomplete.js
lib/antivirus/clamav/lang/en/antivirus_clamav.php
lib/behat/classes/behat_config_util.php
lib/behat/lib.php
lib/classes/chart_base.php
lib/classes/chart_series.php
lib/classes/component.php
lib/classes/filetypes.php
lib/classes/ip_utils.php
lib/classes/output/icon_system_fontawesome.php
lib/classes/plugin_manager.php
lib/classes/plugininfo/contenttype.php [new file with mode: 0644]
lib/classes/session/database.php
lib/classes/session/handler.php
lib/classes/session/manager.php
lib/classes/session/memcached.php
lib/classes/session/redis.php
lib/classes/task/manager.php
lib/classes/task/messaging_cleanup_task.php
lib/components.json
lib/db/access.php
lib/db/caches.php
lib/db/install.xml
lib/db/services.php
lib/db/upgrade.php
lib/ddl/database_manager.php
lib/ddl/tests/ddl_test.php
lib/dtl/database_exporter.php
lib/dtl/database_importer.php
lib/externallib.php
lib/filelib.php
lib/filestorage/file_storage.php
lib/filestorage/file_system.php
lib/ldaplib.php
lib/moodlelib.php
lib/navigationlib.php
lib/outputcomponents.php
lib/outputrenderers.php
lib/php-jwt/README.md
lib/php-jwt/composer.json
lib/php-jwt/src/BeforeValidException.php
lib/php-jwt/src/ExpiredException.php
lib/php-jwt/src/JWK.php [new file with mode: 0644]
lib/php-jwt/src/JWT.php
lib/php-jwt/src/SignatureInvalidException.php
lib/plist/LICENSE [new file with mode: 0644]
lib/plist/README.md [new file with mode: 0644]
lib/plist/classes/CFPropertyList/CFBinaryPropertyList.php [new file with mode: 0644]
lib/plist/classes/CFPropertyList/CFPropertyList.php [new file with mode: 0644]
lib/plist/classes/CFPropertyList/CFType.php [new file with mode: 0644]
lib/plist/classes/CFPropertyList/CFTypeDetector.php [new file with mode: 0644]
lib/plist/classes/CFPropertyList/IOException.php [new file with mode: 0644]
lib/plist/classes/CFPropertyList/PListException.php [new file with mode: 0644]
lib/plist/readme_moodle.txt [new file with mode: 0644]
lib/table/amd/build/dynamic.min.js
lib/table/amd/build/dynamic.min.js.map
lib/table/amd/build/local/dynamic/repository.min.js
lib/table/amd/build/local/dynamic/repository.min.js.map
lib/table/amd/build/local/dynamic/selectors.min.js
lib/table/amd/build/local/dynamic/selectors.min.js.map
lib/table/amd/src/dynamic.js
lib/table/amd/src/local/dynamic/repository.js
lib/table/amd/src/local/dynamic/selectors.js
lib/table/classes/external/dynamic/fetch.php
lib/table/tests/external/dynamic/fetch_test.php
lib/tablelib.php
lib/tcpdf/readme_moodle.txt
lib/tcpdf/tcpdf.php
lib/templates/custom_menu_item.mustache
lib/templates/drawer.mustache
lib/templates/paging_bar.mustache
lib/templates/single_select.mustache
lib/templates/url_select.mustache
lib/tests/behat/behat_hooks.php
lib/tests/component_test.php
lib/tests/moodlelib_test.php
lib/tests/other/chartjstestpage.php
lib/tests/outputcomponents_test.php
lib/tests/session_manager_test.php
lib/tests/session_redis_test.php
lib/thirdpartylibs.xml
lib/typo3/class.t3lib_cs.php
lib/typo3/readme_moodle.txt
lib/upgrade.txt
message/amd/build/message_preferences.min.js [new file with mode: 0644]
message/amd/build/message_preferences.min.js.map [new file with mode: 0644]
message/amd/src/message_preferences.js [new file with mode: 0644]
message/output/airnotifier/lang/en/message_airnotifier.php
message/output/lib.php
message/output/popup/db/services.php
message/output/popup/db/upgrade.php
message/output/popup/message_output_popup.php
message/output/popup/tests/messaging_cleanup_test.php [new file with mode: 0644]
message/output/popup/version.php
message/templates/message_preferences.mustache [new file with mode: 0644]
message/templates/message_preferences_component.mustache [new file with mode: 0644]
message/templates/message_preferences_notification_processor.mustache [new file with mode: 0644]
message/tests/behat/message_preferences.feature [new file with mode: 0644]
message/upgrade.txt
mod/assign/lang/en/assign.php
mod/forum/amd/build/local/grades/grader.min.js
mod/forum/amd/build/local/grades/grader.min.js.map
mod/forum/amd/build/local/grades/local/grader/selectors.min.js
mod/forum/amd/build/local/grades/local/grader/selectors.min.js.map
mod/forum/amd/build/local/grades/local/grader/user_picker.min.js
mod/forum/amd/build/local/grades/local/grader/user_picker.min.js.map
mod/forum/amd/build/local/grades/local/grader/user_picker/selectors.min.js
mod/forum/amd/build/local/grades/local/grader/user_picker/selectors.min.js.map
mod/forum/amd/src/local/grades/grader.js
mod/forum/amd/src/local/grades/local/grader/selectors.js
mod/forum/amd/src/local/grades/local/grader/user_picker.js
mod/forum/amd/src/local/grades/local/grader/user_picker/selectors.js
mod/forum/lang/en/forum.php
mod/forum/report/summary/templates/bulk_action_menu.mustache
mod/forum/templates/local/grades/grader.mustache
mod/forum/templates/local/grades/local/grader/content.mustache
mod/forum/templates/local/grades/local/grader/grading.mustache
mod/forum/templates/local/grades/local/grader/navigation.mustache
mod/forum/templates/local/grades/local/grader/user_picker.mustache
mod/forum/templates/local/grades/local/grader/user_picker/user.mustache
mod/h5pactivity/classes/event/course_module_instance_list_viewed.php
mod/h5pactivity/classes/event/course_module_viewed.php
mod/h5pactivity/classes/event/statement_received.php [new file with mode: 0644]
mod/h5pactivity/classes/local/attempt.php [new file with mode: 0644]
mod/h5pactivity/classes/privacy/provider.php
mod/h5pactivity/classes/xapi/handler.php [new file with mode: 0644]
mod/h5pactivity/db/access.php
mod/h5pactivity/db/install.xml
mod/h5pactivity/db/upgrade.php [new file with mode: 0644]
mod/h5pactivity/lang/en/h5pactivity.php
mod/h5pactivity/lib.php
mod/h5pactivity/pix/icon.png
mod/h5pactivity/pix/icon.svg
mod/h5pactivity/tests/behat/add_h5pactivity.feature
mod/h5pactivity/tests/behat/sending_attempt.feature [new file with mode: 0644]
mod/h5pactivity/tests/event/course_module_instance_list_viewed_test.php [new file with mode: 0644]
mod/h5pactivity/tests/event/course_module_viewed_test.php [moved from mod/h5pactivity/tests/events_test.php with 61% similarity]
mod/h5pactivity/tests/event/statement_received_test.php [new file with mode: 0644]
mod/h5pactivity/tests/generator/lib.php
mod/h5pactivity/tests/local/attempt_test.php [new file with mode: 0644]
mod/h5pactivity/tests/privacy_test.php [new file with mode: 0644]
mod/h5pactivity/tests/xapi/handler_test.php [new file with mode: 0644]
mod/h5pactivity/version.php
mod/h5pactivity/view.php
mod/lesson/lang/en/lesson.php
mod/lti/db/caches.php [new file with mode: 0644]
mod/lti/edit_form.php
mod/lti/lang/en/lti.php
mod/lti/locallib.php
mod/lti/tests/fixtures/test_keyset [new file with mode: 0644]
mod/lti/tests/locallib_test.php
mod/lti/token.php
mod/lti/version.php
mod/quiz/accessrule/safebrowser/rule.php [deleted file]
mod/quiz/accessrule/safebrowser/tests/rule_test.php [deleted file]
mod/quiz/accessrule/seb/amd/build/managetemplates.min.js [new file with mode: 0644]
mod/quiz/accessrule/seb/amd/build/managetemplates.min.js.map [new file with mode: 0644]
mod/quiz/accessrule/seb/amd/src/managetemplates.js [new file with mode: 0644]
mod/quiz/accessrule/seb/backup/moodle2/backup_quizaccess_seb_subplugin.class.php [new file with mode: 0644]
mod/quiz/accessrule/seb/backup/moodle2/restore_quizaccess_seb_subplugin.class.php [new file with mode: 0644]
mod/quiz/accessrule/seb/classes/access_manager.php [new file with mode: 0644]
mod/quiz/accessrule/seb/classes/config_key.php [new file with mode: 0644]
mod/quiz/accessrule/seb/classes/event/access_prevented.php [new file with mode: 0644]
mod/quiz/accessrule/seb/classes/event/template_created.php [new file with mode: 0644]
mod/quiz/accessrule/seb/classes/event/template_deleted.php [new file with mode: 0644]
mod/quiz/accessrule/seb/classes/event/template_disabled.php [new file with mode: 0644]
mod/quiz/accessrule/seb/classes/event/template_enabled.php [new file with mode: 0644]
mod/quiz/accessrule/seb/classes/event/template_updated.php [new file with mode: 0644]
mod/quiz/accessrule/seb/classes/helper.php [new file with mode: 0644]
mod/quiz/accessrule/seb/classes/hideif_rule.php [new file with mode: 0644]
mod/quiz/accessrule/seb/classes/link_generator.php [new file with mode: 0644]
mod/quiz/accessrule/seb/classes/local/form/template.php [new file with mode: 0644]
mod/quiz/accessrule/seb/classes/local/table/template_list.php [new file with mode: 0644]
mod/quiz/accessrule/seb/classes/privacy/provider.php [new file with mode: 0644]
mod/quiz/accessrule/seb/classes/property_list.php [new file with mode: 0644]
mod/quiz/accessrule/seb/classes/quiz_settings.php [new file with mode: 0644]
mod/quiz/accessrule/seb/classes/settings_provider.php [new file with mode: 0644]
mod/quiz/accessrule/seb/classes/template.php [new file with mode: 0644]
mod/quiz/accessrule/seb/classes/template_controller.php [new file with mode: 0644]
mod/quiz/accessrule/seb/config.php [new file with mode: 0644]
mod/quiz/accessrule/seb/db/access.php [new file with mode: 0644]
mod/quiz/accessrule/seb/db/caches.php [new file with mode: 0644]
mod/quiz/accessrule/seb/db/install.php [new file with mode: 0644]
mod/quiz/accessrule/seb/db/install.xml [new file with mode: 0644]
mod/quiz/accessrule/seb/db/upgrade.php [moved from mod/quiz/accessrule/safebrowser/lang/en/quizaccess_safebrowser.php with 53% similarity]
mod/quiz/accessrule/seb/lang/en/quizaccess_seb.php [new file with mode: 0644]
mod/quiz/accessrule/seb/lib.php [new file with mode: 0644]
mod/quiz/accessrule/seb/rule.php [new file with mode: 0644]
mod/quiz/accessrule/seb/settings.php [new file with mode: 0644]
mod/quiz/accessrule/seb/template.php [new file with mode: 0644]
mod/quiz/accessrule/seb/tests/behat/edit_form.feature [new file with mode: 0644]
mod/quiz/accessrule/seb/tests/generator/behat_quizaccess_seb_generator.php [new file with mode: 0644]
mod/quiz/accessrule/seb/tests/generator/lib.php [new file with mode: 0644]
mod/quiz/accessrule/seb/tests/phpunit/access_manager_test.php [new file with mode: 0644]
mod/quiz/accessrule/seb/tests/phpunit/backup_restore_test.php [new file with mode: 0644]
mod/quiz/accessrule/seb/tests/phpunit/base.php [new file with mode: 0644]
mod/quiz/accessrule/seb/tests/phpunit/config_key_test.php [new file with mode: 0644]
mod/quiz/accessrule/seb/tests/phpunit/event_test.php [new file with mode: 0644]
mod/quiz/accessrule/seb/tests/phpunit/helper_test.php [new file with mode: 0644]
mod/quiz/accessrule/seb/tests/phpunit/hideif_rule_test.php [new file with mode: 0644]
mod/quiz/accessrule/seb/tests/phpunit/link_generator_test.php [new file with mode: 0644]
mod/quiz/accessrule/seb/tests/phpunit/privacy_provider_test.php [new file with mode: 0644]
mod/quiz/accessrule/seb/tests/phpunit/property_list_test.php [new file with mode: 0644]
mod/quiz/accessrule/seb/tests/phpunit/quiz_settings_test.php [new file with mode: 0644]
mod/quiz/accessrule/seb/tests/phpunit/rule_test.php [new file with mode: 0644]
mod/quiz/accessrule/seb/tests/phpunit/sample_data/JSON_unencrypted_mac_001.txt [new file with mode: 0644]
mod/quiz/accessrule/seb/tests/phpunit/sample_data/encrypted.seb [new file with mode: 0644]
mod/quiz/accessrule/seb/tests/phpunit/sample_data/simpleunencrypted.seb [new file with mode: 0644]
mod/quiz/accessrule/seb/tests/phpunit/sample_data/simpleunencryptedwithoutoriginator.seb [new file with mode: 0644]
mod/quiz/accessrule/seb/tests/phpunit/sample_data/unencrypted.seb [new file with mode: 0644]
mod/quiz/accessrule/seb/tests/phpunit/sample_data/unencrypted_mac_001.seb [new file with mode: 0644]
mod/quiz/accessrule/seb/tests/phpunit/sample_data/unencrypted_win_223.seb [new file with mode: 0644]
mod/quiz/accessrule/seb/tests/phpunit/settings_provider_test.php [new file with mode: 0644]
mod/quiz/accessrule/seb/tests/phpunit/template_test.php [new file with mode: 0644]
mod/quiz/accessrule/seb/version.php [new file with mode: 0644]
mod/quiz/accessrule/timelimit/lang/en/quizaccess_timelimit.php
mod/quiz/backup/moodle2/restore_quiz_stepslib.php
mod/quiz/lang/en/quiz.php
mod/quiz/report/responses/tests/fixtures/questions00.csv
mod/quiz/tests/attempt_walkthrough_from_csv_test.php
mod/quiz/tests/behat/attempt_begin.feature
mod/workshop/tests/behat/file_type_restriction.feature
phpunit.xml.dist
pix/i/upload.png [new file with mode: 0644]
pix/i/upload.svg [new file with mode: 0644]
question/type/calculated/questiontype.php
question/type/calculated/tests/questiontype_test.php
question/type/ddimageortext/lang/en/qtype_ddimageortext.php
question/type/ddmarker/lang/en/qtype_ddmarker.php
question/type/ddwtos/amd/build/ddwtos.min.js
question/type/ddwtos/amd/build/ddwtos.min.js.map
question/type/ddwtos/amd/src/ddwtos.js
question/type/ddwtos/renderer.php
question/type/ddwtos/styles.css
question/type/ddwtos/tests/behat/behat_qtype_ddwtos.php
question/type/multianswer/questiontype.php
question/type/multianswer/tests/questiontype_test.php
question/type/numerical/db/upgradelib.php
question/type/questiontypebase.php
question/type/random/questiontype.php
question/type/random/tests/questiontype_test.php
question/type/truefalse/questiontype.php
question/type/truefalse/tests/questiontype_test.php
report/log/classes/renderable.php
report/log/locallib.php
theme/boost/scss/moodle.scss
theme/boost/scss/moodle/contentbank.scss [new file with mode: 0644]
theme/boost/scss/moodle/core.scss
theme/boost/scss/moodle/grade.scss
theme/boost/scss/moodle/modules.scss
theme/boost/scss/preset/default.scss
theme/boost/style/moodle.css
theme/classic/style/moodle.css
user/amd/build/participants.min.js
user/amd/build/participants.min.js.map
user/amd/build/repository.min.js [new file with mode: 0644]
user/amd/build/repository.min.js.map [new file with mode: 0644]
user/amd/build/status_field.min.js
user/amd/build/status_field.min.js.map
user/amd/src/participants.js
user/amd/src/repository.js [new file with mode: 0644]
user/amd/src/status_field.js
user/classes/table/participants.php [moved from user/classes/participants_table.php with 98% similarity]
user/index.php
user/tests/behat/course_preference.feature
version.php

index a13efd1..b9c0b6a 100644 (file)
@@ -10,6 +10,7 @@ enrol/lti/ims-blti/
 filter/algebra/AlgParser.pm
 filter/tex/mimetex.*
 h5p/h5plib/v124/joubel/core/
+h5p/h5plib/v124/joubel/editor/
 lib/editor/atto/plugins/html/yui/src/codemirror/
 lib/editor/atto/plugins/html/yui/src/beautify/
 lib/editor/atto/yui/src/rangy/js/*.*
@@ -64,6 +65,7 @@ lib/php-jwt/
 lib/babel-polyfill/
 lib/polyfills/
 lib/emoji-data/
+lib/plist/
 media/player/videojs/amd/src/video-lazy.js
 media/player/videojs/amd/src/Youtube-lazy.js
 media/player/videojs/videojs/
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644 (file)
index 0000000..adb6942
--- /dev/null
@@ -0,0 +1,2 @@
+# Primary donations pages.
+custom: ["https://moodle.com/donations/", moodle.org]
index ac09a33..5d9e5c1 100644 (file)
@@ -11,6 +11,7 @@ enrol/lti/ims-blti/
 filter/algebra/AlgParser.pm
 filter/tex/mimetex.*
 h5p/h5plib/v124/joubel/core/
+h5p/h5plib/v124/joubel/editor/
 lib/editor/atto/plugins/html/yui/src/codemirror/
 lib/editor/atto/plugins/html/yui/src/beautify/
 lib/editor/atto/yui/src/rangy/js/*.*
@@ -65,6 +66,7 @@ lib/php-jwt/
 lib/babel-polyfill/
 lib/polyfills/
 lib/emoji-data/
+lib/plist/
 media/player/videojs/amd/src/video-lazy.js
 media/player/videojs/amd/src/Youtube-lazy.js
 media/player/videojs/videojs/
index 321c133..245d7fc 100644 (file)
@@ -2,8 +2,6 @@
 # process (which uses our internal CI system) this file is here for the benefit
 # of community developers git clones - see MDL-51458.
 
-sudo: required
-
 # We currently disable Travis notifications entirely until https://github.com/travis-ci/travis-ci/issues/4976
 # is fixed.
 notifications:
@@ -11,6 +9,8 @@ notifications:
 
 language: php
 
+os: linux
+
 dist: xenial
 
 services:
@@ -41,7 +41,7 @@ env:
     # Perform an upgrade test too.
     - DB=pgsql    TASK=UPGRADE
 
-matrix:
+jobs:
     # Enable fast finish.
     # This will fail the build if a single job fails (except those in allow_failures).
     # It will not stop the jobs from running.
index bd39185..657bd77 100644 (file)
@@ -289,7 +289,13 @@ module.exports = function(grunt) {
         eslint: {
             // Even though warnings dont stop the build we don't display warnings by default because
             // at this moment we've got too many core warnings.
-            options: {quiet: !grunt.option('show-lint-warnings')},
+            // To display warnings call: grunt eslint --show-lint-warnings
+            // To fail on warnings call: grunt eslint --max-lint-warnings=0
+            // Also --max-lint-warnings=-1 can be used to display warnings but not fail.
+            options: {
+                quiet: (!grunt.option('show-lint-warnings')) && (typeof grunt.option('max-lint-warnings') === 'undefined'),
+                maxWarnings: ((typeof grunt.option('max-lint-warnings') !== 'undefined') ? grunt.option('max-lint-warnings') : -1)
+            },
             amd: {src: files ? files : amdSrc},
             // Check YUI module source files.
             yui: {src: files ? files : yuiSrc},
@@ -536,12 +542,8 @@ module.exports = function(grunt) {
         formatter.printResults(results);
 
         // Report on the results.
-        // We exit 1 if there is at least one error, otherwise we exit cleanly.
-        if (results.some(result => result.errors.length > 0)) {
-            done(1);
-        } else {
-            done(0);
-        }
+        // The done function takes a bool whereby a falsey statement causes the task to fail.
+        done(results.every(result => result.errors.length === 0));
     };
 
     tasks.startup = function() {
diff --git a/admin/contentbank.php b/admin/contentbank.php
new file mode 100644 (file)
index 0000000..da29e6b
--- /dev/null
@@ -0,0 +1,84 @@
+<?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/>.
+
+/**
+ * Content bank and its plugins settings.
+ *
+ * @package    core
+ * @subpackage contentbank
+ * @copyright  2020 Amaia Anabitarte <amaia@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+require_once('../config.php');
+require_once($CFG->libdir.'/adminlib.php');
+
+$action = required_param('action', PARAM_ALPHANUMEXT);
+$name   = required_param('name', PARAM_PLUGIN);
+
+$syscontext = context_system::instance();
+$PAGE->set_url('/admin/contentbank.php');
+$PAGE->set_context($syscontext);
+
+require_admin();
+require_sesskey();
+
+$return = new moodle_url('/admin/settings.php', array('section' => 'managecontentbanktypes'));
+
+$plugins = core_plugin_manager::instance()->get_plugins_of_type('contenttype');
+$sortorder = array_flip(array_keys($plugins));
+
+if (!isset($plugins[$name])) {
+    print_error('contenttypenotfound', 'error', $return, $name);
+}
+
+switch ($action) {
+    case 'disable':
+        if ($plugins[$name]->is_enabled()) {
+            set_config('disabled', 1, 'contentbank_'. $name);
+        }
+        break;
+    case 'enable':
+        if (!$plugins[$name]->is_enabled()) {
+            unset_config('disabled', 'contentbank_'. $name);
+        }
+        break;
+    case 'up':
+        if ($sortorder[$name]) {
+            $currentindex = $sortorder[$name];
+            $seq = array_keys($plugins);
+            $seq[$currentindex] = $seq[$currentindex - 1];
+            $seq[$currentindex - 1] = $name;
+            set_config('contentbank_plugins_sortorder', implode(',', $seq));
+        }
+        break;
+    case 'down':
+        if ($sortorder[$name] < count($sortorder) - 1) {
+            $currentindex = $sortorder[$name];
+            $seq = array_keys($plugins);
+            $seq[$currentindex] = $seq[$currentindex + 1];
+            $seq[$currentindex + 1] = $name;
+            set_config('contentbank_plugins_sortorder', implode(',', $seq));
+        }
+        break;
+}
+core_plugin_manager::reset_caches();
+$cache = cache::make('core', 'contentbank_enabled_extensions');
+$cache->purge();
+$cache = cache::make('core', 'contentbank_context_extensions');
+$cache->purge();
+
+redirect($return);
index d004e9e..b5c31d7 100644 (file)
@@ -83,7 +83,7 @@ if (($form = data_submitted()) && confirm_sesskey()) {
                 }
             } else {
                 $newsettings = array();
-                if (array_key_exists($componentprovidersetting, $form)) {
+                if (property_exists($form, $componentprovidersetting)) {
                     // We must be processing loggedin or loggedoff checkboxes.
                     // Store defained comma-separated processors as setting value.
                     // Using array_filter eliminates elements set to 0 above.
index f904352..5931a26 100644 (file)
@@ -813,7 +813,7 @@ class core_admin_renderer extends plugin_renderer_base {
             }
         }
 
-        $updateinfo .= $this->container_start('checkforupdates');
+        $updateinfo .= $this->container_start('checkforupdates mt-1');
         $fetchurl = new moodle_url('/admin/index.php', array('fetchupdates' => 1, 'sesskey' => sesskey(), 'cache' => 0));
         $updateinfo .= $this->single_button($fetchurl, get_string('checkforupdates', 'core_plugin'));
         if ($fetch) {
@@ -902,7 +902,7 @@ class core_admin_renderer extends plugin_renderer_base {
      */
     protected function moodle_available_update_info(\core\update\info $updateinfo) {
 
-        $boxclasses = 'moodleupdateinfo';
+        $boxclasses = 'moodleupdateinfo mb-2';
         $info = array();
 
         if (isset($updateinfo->release)) {
@@ -922,7 +922,8 @@ class core_admin_renderer extends plugin_renderer_base {
         }
 
         if (isset($updateinfo->download)) {
-            $info[] = html_writer::link($updateinfo->download, get_string('download'), array('class' => 'info download'));
+            $info[] = html_writer::link($updateinfo->download, get_string('download'),
+                array('class' => 'info download btn btn-secondary'));
         }
 
         if (isset($updateinfo->url)) {
@@ -930,9 +931,9 @@ class core_admin_renderer extends plugin_renderer_base {
                 array('class' => 'info more'));
         }
 
-        $box  = $this->output->box_start($boxclasses);
-        $box .= $this->output->box(implode(html_writer::tag('span', ' ', array('class' => 'separator')), $info), '');
-        $box .= $this->output->box_end();
+        $box  = $this->output->container_start($boxclasses);
+        $box .= $this->output->container(implode(html_writer::tag('span', ' | ', array('class' => 'separator')), $info), '');
+        $box .= $this->output->container_end();
 
         return $box;
     }
index f8a5ceb..46206fc 100644 (file)
@@ -10,7 +10,6 @@ if ($hassiteconfig) { // speedup for non-admins, add all caps used on this page
     $temp = new admin_settingpage('experimentalsettings', new lang_string('experimentalsettings', 'admin'));
     //TODO: Re-enable cc-import once re-implemented in 2.0.x
     //$temp->add(new admin_setting_configcheckbox('enableimsccimport', new lang_string('enable_cc_import', 'imscc'), new lang_string('enable_cc_import_description', 'imscc'), 0));
-    $temp->add(new admin_setting_configcheckbox('enablesafebrowserintegration', new lang_string('enablesafebrowserintegration', 'admin'), new lang_string('configenablesafebrowserintegration', 'admin'), 0));
 
     $temp->add(new admin_setting_configcheckbox('dndallowtextandlinks', new lang_string('dndallowtextandlinks', 'admin'), new lang_string('configdndallowtextandlinks', 'admin'), 0));
 
index 6b3848b..278d4f3 100644 (file)
@@ -657,6 +657,19 @@ if ($hassiteconfig) {
     }
 }
 
+// Content bank content types.
+if ($hassiteconfig) {
+    $ADMIN->add('modules', new admin_category('contenbanksettings', new lang_string('contentbank')));
+    $temp = new admin_settingpage('managecontentbanktypes', new lang_string('managecontentbanktypes'));
+    $temp->add(new admin_setting_managecontentbankcontenttypes());
+    $ADMIN->add('contenbanksettings', $temp);
+    $plugins = core_plugin_manager::instance()->get_plugins_of_type('contenttype');
+    foreach ($plugins as $plugin) {
+        /** @var \core\plugininfo\contentbank $plugin */
+        $plugin->load_settings($ADMIN, 'contenbanksettings', $hassiteconfig);
+    }
+}
+
 /// Add all local plugins - must be always last!
 if ($hassiteconfig) {
     $ADMIN->add('modules', new admin_category('localplugins', new lang_string('localplugins')));
index 7d0db03..b1f9c58 100644 (file)
@@ -46,7 +46,8 @@ if ($data) {
     $emailuser->email = $data->recipient;
     $emailuser->id = -99;
 
-    $subject = get_string('testoutgoingmailconf_subject', 'admin', $SITE->fullname);
+    $subject = get_string('testoutgoingmailconf_subject', 'admin',
+        format_string($SITE->fullname, true, ['context' => context_system::instance()]));
     $messagetext = get_string('testoutgoingmailconf_message', 'admin');
 
     // Manage Moodle debugging options.
index f510cd2..a6ba759 100644 (file)
Binary files a/admin/tool/dataprivacy/amd/build/myrequestactions.min.js and b/admin/tool/dataprivacy/amd/build/myrequestactions.min.js differ
index 6d17dee..c9f78ed 100644 (file)
Binary files a/admin/tool/dataprivacy/amd/build/myrequestactions.min.js.map and b/admin/tool/dataprivacy/amd/build/myrequestactions.min.js.map differ
index 5ec631e..54f94fb 100644 (file)
@@ -28,8 +28,9 @@ define([
     'core/str',
     'core/modal_factory',
     'core/modal_events',
-    'core/templates'],
-function($, Ajax, Notification, Str, ModalFactory, ModalEvents, Templates) {
+    'core/templates',
+    'core/pending'],
+function($, Ajax, Notification, Str, ModalFactory, ModalEvents, Templates, Pending) {
 
     /**
      * List of action selectors.
@@ -118,6 +119,7 @@ function($, Ajax, Notification, Str, ModalFactory, ModalEvents, Templates) {
         });
 
         $(ACTIONS.CONTACT_DPO).click(function(e) {
+            var pendingPromise = new Pending('dataprivacy/crud:initModal:contactdpo');
             e.preventDefault();
 
             var replyToEmail = $(this).data('replytoemail');
@@ -146,9 +148,12 @@ function($, Ajax, Notification, Str, ModalFactory, ModalEvents, Templates) {
                     type: ModalFactory.types.SAVE_CANCEL,
                     large: true
                 });
-            }).done(function(modal) {
+            }).then(function(modal) {
                 modal.setSaveButtonText(sendButtonText);
 
+                // Show the modal!
+                modal.show();
+
                 // Handle send event.
                 modal.getRoot().on(ModalEvents.save, function(e) {
                     var message = $('#message').val().trim();
@@ -169,9 +174,9 @@ function($, Ajax, Notification, Str, ModalFactory, ModalEvents, Templates) {
                     modal.destroy();
                 });
 
-                // Show the modal!
-                modal.show();
-            }).fail(Notification.exception);
+                return;
+            }).then(pendingPromise.resolve)
+            .catch(Notification.exception);
         });
     };
 
index 8daab15..fd0b465 100644 (file)
@@ -24,7 +24,7 @@
 
 $string['classname'] = 'Class name';
 $string['component'] = 'Component';
-$string['configmessageinboundhost'] = 'The address of the server that Moodle should check mail against. To specify a non-default port, use [server]:[port], for example mail.example.com:587. If a port isn\'t specified, the default port for the type of mail server will be used.';
+$string['configmessageinboundhost'] = 'The address of the server that Moodle should check mail against. To specify a non-default port, use [server]:[port], for example mail.example.com:993. If a port isn\'t specified, the default port for the type of mail server will be used.';
 $string['defaultexpiration'] = 'Default address expiry period';
 $string['defaultexpiration_help'] = 'When an email address is generated by the handler, it can be set to automatically expire after a period of time, so that it can no longer be used. It is advisable to set an expiry period.';
 $string['description'] = 'Description';
index 4d0c7f2..ce2d8fd 100644 (file)
@@ -127,3 +127,36 @@ Feature: Basic recycle bin functionality
     And I press "Yes"
     And I should see "Recycle bin has been emptied"
     And I should see "There are no items in the recycle bin."
+
+  @javascript
+  Scenario: Show recycle bin on category action menu
+    Given I log in as "admin"
+    And I navigate to "Courses >  Manage courses and categories" in site administration
+    And I click on "Actions menu" "link"
+    And I click on "Recycle bin" "link"
+    Then I should see "There are no items in the recycle bin."
+
+  @javascript
+  Scenario: Not show recycle bin empty on category action menu whit autohide enable
+    Given I log in as "admin"
+    And the following config values are set as admin:
+      | categorybinenable | 0 | tool_recyclebin |
+    And I navigate to "Courses >  Manage courses and categories" in site administration
+    And I click on "Actions menu" "link"
+    Then I should not see "Recycle bin"
+
+  @javascript
+  Scenario: Show recycle bin not empty on category action menu whit autohide enable
+    Given I log in as "admin"
+    And the following config values are set as admin:
+      | autohide | 1 | tool_recyclebin |
+    And I navigate to "Courses >  Manage courses and categories" in site administration
+    And I click on "Actions menu" "link"
+    Then I should not see "Recycle bin"
+    And I click on "delete" action for "Course 2" in management course listing
+    And I press "Delete"
+    And I should see "Deleting C2"
+    And I should see "C2 has been completely deleted"
+    And I press "Continue"
+    When I click on "Actions menu" "link"
+    Then I should see "Recycle bin"
index 9ccd292..299603f 100644 (file)
  */
 
 $string['asap'] = 'ASAP';
-$string['adhocempty'] = 'Adhoc task queue is empty';
-$string['adhocqueuesize'] = 'Adhoc task queue has {$a} tasks';
+$string['adhocempty'] = 'Ad hoc task queue is empty';
+$string['adhocqueuesize'] = 'Ad hoc task queue has {$a} tasks';
 $string['adhocqueueold'] = 'Oldest task is {$a->age} which is more than {$a->max}';
 $string['backtoscheduledtasks'] = 'Back to scheduled tasks';
 $string['blocking'] = 'Blocking';
 $string['cannotfindthepathtothecli'] = 'Cannot find the path to the PHP CLI executable so task execution aborted. Set the \'Path to PHP CLI\' setting in Site administration / Server / System paths.';
-$string['checkadhocqueue'] = 'Adhoc task queue';
+$string['checkadhocqueue'] = 'Ad hoc task queue';
 $string['checkcronrunning'] = 'Cron running';
 $string['checkmaxfaildelay'] = 'Tasks max fail delay';
 $string['clearfaildelay_confirm'] = 'Are you sure you want to clear the fail delay for task \'{$a}\'? After clearing the delay, the task will run according to its normal schedule.';
@@ -58,7 +58,7 @@ $string['runpattern'] = 'Run pattern';
 $string['scheduledtasks'] = 'Scheduled tasks';
 $string['scheduledtaskchangesdisabled'] = 'Modifications to the list of scheduled tasks have been prevented in Moodle configuration';
 $string['taskdisabled'] = 'Task disabled';
-$string['taskfailures'] = 'There are {$a} task(s) failing';
+$string['taskfailures'] = '{$a} task(s) failing';
 $string['tasklogs'] = 'Task logs';
 $string['tasknofailures'] = 'There are no tasks failing';
 $string['taskscheduleday'] = 'Day';
index 643750b..ceee867 100644 (file)
@@ -23,7 +23,6 @@ Feature: Clear scheduled task fail delay
     And I should not see "Clear" in the "Send new user passwords" "table_row"
     And I should see "Send new user passwords" in the "tr.table-primary" "css_element"
 
-
   Scenario: Cancel clearing the fail delay
     When I click on "Clear" "text" in the "Send new user passwords" "table_row"
     And I press "Cancel"
index ba03bac..b7c175c 100644 (file)
@@ -44,11 +44,13 @@ class check_indexes extends XMLDBCheckAction {
 
         // Get needed strings
         $this->loadStrings(array(
+            'extraindexesfound' => 'tool_xmldb',
             'missing' => 'tool_xmldb',
             'key' => 'tool_xmldb',
             'index' => 'tool_xmldb',
             'missingindexes' => 'tool_xmldb',
-            'nomissingindexesfound' => 'tool_xmldb',
+            'nomissingorextraindexesfound' => 'tool_xmldb',
+            'yesextraindexesfound' => 'tool_xmldb',
             'yesmissingindexesfound' => 'tool_xmldb',
         ));
     }
@@ -58,6 +60,7 @@ class check_indexes extends XMLDBCheckAction {
         $dbman = $DB->get_manager();
 
         $o = '';
+        $dbindexes = $DB->get_indexes($xmldb_table->getName());
         $missing_indexes = array();
 
         // Keys
@@ -88,6 +91,7 @@ class check_indexes extends XMLDBCheckAction {
                     // Check if the index exists in DB
                     if ($dbman->index_exists($xmldb_table, $xmldb_index)) {
                         $o.='<font color="green">' . $this->str['ok'] . '</font>';
+                        $this->remove_index_from_dbindex($dbindexes, $xmldb_index);
                     } else {
                         $o.='<font color="red">' . $this->str['missing'] . '</font>';
                         // Add the missing index to the list
@@ -109,6 +113,7 @@ class check_indexes extends XMLDBCheckAction {
                 // Check if the index exists in DB
                 if ($dbman->index_exists($xmldb_table, $xmldb_index)) {
                     $o.='<font color="green">' . $this->str['ok'] . '</font>';
+                    $this->remove_index_from_dbindex($dbindexes, $xmldb_index);
                 } else {
                     $o.='<font color="red">' . $this->str['missing'] . '</font>';
                     // Add the missing index to the list
@@ -122,6 +127,14 @@ class check_indexes extends XMLDBCheckAction {
             $o.='        </ul>';
         }
 
+        // Hack - skip for table 'search_simpledb_index' as this plugin adds indexes dynamically on install
+        // which are not included in install.xml. See search/engine/simpledb/db/install.php.
+        if ($xmldb_table->getName() != 'search_simpledb_index') {
+            foreach ($dbindexes as $indexname => $index) {
+                $missing_indexes[] = $indexname;
+            }
+        }
+
         return array($o, $missing_indexes);
     }
 
@@ -129,33 +142,56 @@ class check_indexes extends XMLDBCheckAction {
         global $DB;
         $dbman = $DB->get_manager();
 
+        $missingindexes = [];
+        $extraindexes = [];
+
+        foreach ($missing_indexes as $missingindex) {
+            if (is_object($missingindex)) {
+                $missingindexes[] = $missingindex;
+            } else {
+                $extraindexes[] = $missingindex;
+            }
+        }
+
         $s = '';
         $r = '<table class="generaltable boxaligncenter boxwidthwide" border="0" cellpadding="5" cellspacing="0" id="results">';
         $r.= '  <tr><td class="generalboxcontent">';
         $r.= '    <h2 class="main">' . $this->str['searchresults'] . '</h2>';
-        $r.= '    <p class="centerpara">' . $this->str['missingindexes'] . ': ' . count($missing_indexes) . '</p>';
+        $r .= '    <p class="centerpara">' . $this->str['missingindexes'] . ': ' . count($missingindexes) . '</p>';
+        $r .= '    <p class="centerpara">' . $this->str['extraindexesfound'] . ': ' . count($extraindexes) . '</p>';
         $r.= '  </td></tr>';
         $r.= '  <tr><td class="generalboxcontent">';
 
-        // If we have found missing indexes inform about them
-        if (count($missing_indexes)) {
-            $r.= '    <p class="centerpara">' . $this->str['yesmissingindexesfound'] . '</p>';
-            $r.= '        <ul>';
-            foreach ($missing_indexes as $obj) {
-                $xmldb_table = $obj->table;
-                $xmldb_index = $obj->index;
-                $sqlarr = $dbman->generator->getAddIndexSQL($xmldb_table, $xmldb_index);
-                $r.= '            <li>' . $this->str['table'] . ': ' . $xmldb_table->getName() . '. ' .
-                                          $this->str['index'] . ': ' . $xmldb_index->readableInfo() . '</li>';
-                $sqlarr = $dbman->generator->getEndedStatements($sqlarr);
-                $s.= '<code>' . str_replace("\n", '<br />', implode('<br />', $sqlarr)) . '</code><br />';
+        // If we have found missing indexes or extra indexes inform the user about them.
+        if (!empty($missingindexes) || !empty($extraindexes)) {
+            if ($missingindexes) {
+                $r.= '    <p class="centerpara">' . $this->str['yesmissingindexesfound'] . '</p>';
+                $r.= '        <ul>';
+                foreach ($missingindexes as $obj) {
+                    $xmldb_table = $obj->table;
+                    $xmldb_index = $obj->index;
+                    $sqlarr = $dbman->generator->getAddIndexSQL($xmldb_table, $xmldb_index);
+                    $r.= '            <li>' . $this->str['table'] . ': ' . $xmldb_table->getName() . '. ' .
+                                              $this->str['index'] . ': ' . $xmldb_index->readableInfo() . '</li>';
+                    $sqlarr = $dbman->generator->getEndedStatements($sqlarr);
+                    $s.= '<code>' . str_replace("\n", '<br />', implode('<br />', $sqlarr)) . '</code><br />';
 
+                }
+                $r.= '        </ul>';
+                // Add the SQL statements (all together)
+                $r.= '<hr />' . $s;
+            }
+            if ($extraindexes) {
+                $r .= '<p class="centerpara">' . $this->str['yesextraindexesfound'] . '</p>';
+                $r .= '<ul>';
+                foreach ($extraindexes as $ei) {
+                    $r .= '<li>' . $ei . '</li>';
+                }
+                $r .= '</ul>';
+                $r .= '<hr />';
             }
-            $r.= '        </ul>';
-            // Add the SQL statements (all together)
-            $r.= '<hr />' . $s;
         } else {
-            $r.= '    <p class="centerpara">' . $this->str['nomissingindexesfound'] . '</p>';
+            $r .= '<p class="centerpara">' . $this->str['nomissingorextraindexesfound'] . '</p>';
         }
         $r.= '  </td></tr>';
         $r.= '  <tr><td class="generalboxcontent">';
@@ -166,4 +202,18 @@ class check_indexes extends XMLDBCheckAction {
 
         return $r;
     }
+
+    /**
+     * Removes an index from the array $dbindexes if it is found.
+     *
+     * @param array $dbindexes
+     * @param xmldb_index $index
+     */
+    private function remove_index_from_dbindex(array &$dbindexes, xmldb_index $index) {
+        foreach ($dbindexes as $key => $dbindex) {
+            if ($dbindex['columns'] == $index->getFields()) {
+                unset($dbindexes[$key]);
+            }
+        }
+    }
 }
index c465ed1..e879835 100644 (file)
@@ -99,6 +99,7 @@ $string['edit_xml_file'] = 'Edit XML file';
 $string['enumvaluesincorrect'] = 'Incorrect values for enum field';
 $string['expected'] = 'Expected';
 $string['extensionrequired'] = 'Sorry - the PHP extension \'{$a}\' is required for this action. Please install the extension if you want to use this feature.';
+$string['extraindexesfound'] = 'Extra indexes found';
 $string['field'] = 'Field';
 $string['fieldnameempty'] = 'Name field empty';
 $string['fields'] = 'Fields';
@@ -157,7 +158,7 @@ $string['newtablefrommysql'] = 'New table from MySQL';
 $string['new_table_from_mysql'] = 'New table from MySQL';
 $string['nofieldsspecified'] = 'No fields specified';
 $string['nomasterprimaryuniquefound'] = 'The column(s) that your foreign key references must be included in a primary or unique KEY in the referenced table. Note that the column being in a UNIQUE INDEX is not good enough.';
-$string['nomissingindexesfound'] = 'No missing indexes have been found, your DB doesn\'t need further actions.';
+$string['nomissingorextraindexesfound'] = 'No missing or extra indexes have been found, so no further action is required.';
 $string['noreffieldsspecified'] = 'No reference fields specified';
 $string['noreftablespecified'] = 'Specified reference table not found';
 $string['noviolatedforeignkeysfound'] = 'No violated foreign keys found';
@@ -215,6 +216,7 @@ $string['wronglengthforenum'] = 'Incorrect length for enum field';
 $string['wrongnumberofreffields'] = 'Wrong number of reference fields';
 $string['wrongreservedwords'] = 'Currently used reserved words<br />(note that table names aren\'t important if using $CFG->prefix)';
 $string['wrongoraclesemantics'] = 'Wrong Oracle BYTE semantics found';
+$string['yesextraindexesfound'] = 'The following additional indexes were found.';
 $string['yesmissingindexesfound'] = '<p>Some missing indexes have been found in your DB. Here are their details and the needed SQL statements to be executed with your favourite SQL interface to create all of them. Remember to backup your data first!</p>
 <p>After doing that, it\'s highly recommended to execute this utility again to check that no more missing indexes are found.</p>';
 $string['yeswrongdefaultsfound'] = '<p>Some inconsistent defaults have been found in your DB. Here are their details and the needed SQL statements to be executed with your favourite SQL interface to fix them all. Remember to backup your data first!</p>
index 0911c68..eef73fc 100644 (file)
@@ -1394,7 +1394,9 @@ abstract class restore_dbops {
             // Note: for DB deleted users md5(username) is stored *sometimes* in the email field,
             //       hence we are looking there for usernames if not empty. See delete_user()
             // If match by id and mnethost and user is deleted in DB and
-            // match by username LIKE 'backup_email.%' or by non empty email = md5(username) => ok, return target user
+            // match by username LIKE 'substring(backup_email).%' where the substr length matches the retained data in the
+            // username field (100 - (timestamp + 1) characters), or by non empty email = md5(username) => ok, return target user.
+            $usernamelookup = core_text::substr($user->email, 0, 89) . '.%';
             if ($rec = $DB->get_record_sql("SELECT *
                                               FROM {user} u
                                              WHERE id = ?
@@ -1407,13 +1409,14 @@ abstract class restore_dbops {
                                                        AND email = ?
                                                        )
                                                    )",
-                                           array($user->id, $user->mnethostid, $user->email.'.%', md5($user->username)))) {
+                                           array($user->id, $user->mnethostid, $usernamelookup, md5($user->username)))) {
                 return $rec; // Matching user, deleted in DB found, return it
             }
 
             // 1D - Handle users deleted in backup file and "alive" in DB
             // If match by id and mnethost and user is deleted in backup file
-            // and match by email = email_without_time(backup_email) => ok, return target user
+            // and match by substring(email) = email_without_time(backup_email) where the substr length matches the retained data
+            // in the username field (100 - (timestamp + 1) characters) => ok, return target user.
             if ($user->deleted) {
                 // Note: for DB deleted users email is stored in username field, hence we
                 //       are looking there for emails. See delete_user()
@@ -1423,7 +1426,7 @@ abstract class restore_dbops {
                                                   FROM {user} u
                                                  WHERE id = ?
                                                    AND mnethostid = ?
-                                                   AND UPPER(email) = UPPER(?)",
+                                                   AND " . $DB->sql_substr('UPPER(email)', 1, 89) . " = UPPER(?)",
                                                array($user->id, $user->mnethostid, $trimemail))) {
                     return $rec; // Matching user, deleted in backup file found, return it
                 }
@@ -1470,7 +1473,8 @@ abstract class restore_dbops {
             // Note: for DB deleted users md5(username) is stored *sometimes* in the email field,
             //       hence we are looking there for usernames if not empty. See delete_user()
             // 2B1 - If match by mnethost and user is deleted in DB and not empty email = md5(username) and
-            //       (by username LIKE 'backup_email.%' or non-zero firstaccess) => ok, return target user
+            //       (by username LIKE 'substring(backup_email).%' or non-zero firstaccess) => ok, return target user.
+            $usernamelookup = core_text::substr($user->email, 0, 89) . '.%';
             if ($rec = $DB->get_record_sql("SELECT *
                                               FROM {user} u
                                              WHERE mnethostid = ?
@@ -1484,14 +1488,15 @@ abstract class restore_dbops {
                                                        AND firstaccess = ?
                                                        )
                                                    )",
-                                           array($user->mnethostid, md5($user->username), $user->email.'.%', $user->firstaccess))) {
+                                           array($user->mnethostid, md5($user->username), $usernamelookup, $user->firstaccess))) {
                 return $rec; // Matching user found, return it
             }
 
             // 2B2 - If match by mnethost and user is deleted in DB and
-            //       username LIKE 'backup_email.%' and non-zero firstaccess) => ok, return target user
+            //       username LIKE 'substring(backup_email).%' and non-zero firstaccess) => ok, return target user
             //       (this covers situations where md5(username) wasn't being stored so we require both
             //        the email & non-zero firstaccess to match)
+            $usernamelookup = core_text::substr($user->email, 0, 89) . '.%';
             if ($rec = $DB->get_record_sql("SELECT *
                                               FROM {user} u
                                              WHERE mnethostid = ?
@@ -1499,13 +1504,13 @@ abstract class restore_dbops {
                                                AND UPPER(username) LIKE UPPER(?)
                                                AND firstaccess != 0
                                                AND firstaccess = ?",
-                                           array($user->mnethostid, $user->email.'.%', $user->firstaccess))) {
+                                           array($user->mnethostid, $usernamelookup, $user->firstaccess))) {
                 return $rec; // Matching user found, return it
             }
 
             // 2C - Handle users deleted in backup file and "alive" in DB
             // If match mnethost and user is deleted in backup file
-            // and match by email = email_without_time(backup_email) and non-zero firstaccess=> ok, return target user
+            // and match by substring(email) = email_without_time(backup_email) and non-zero firstaccess=> ok, return target user.
             if ($user->deleted) {
                 // Note: for DB deleted users email is stored in username field, hence we
                 //       are looking there for emails. See delete_user()
@@ -1514,7 +1519,7 @@ abstract class restore_dbops {
                 if ($rec = $DB->get_record_sql("SELECT *
                                                   FROM {user} u
                                                  WHERE mnethostid = ?
-                                                   AND UPPER(email) = UPPER(?)
+                                                   AND " . $DB->sql_substr('UPPER(email)', 1, 89) . " = UPPER(?)
                                                    AND firstaccess != 0
                                                    AND firstaccess = ?",
                                                array($user->mnethostid, $trimemail, $user->firstaccess))) {
index d0fd2cc..59c127b 100644 (file)
@@ -119,4 +119,246 @@ class restore_dbops_testcase extends advanced_testcase {
             $this->assertSame('Table "backup_ids_temp" does not exist', $e->getMessage());
         }
     }
+
+    /**
+     * Data provider for {@link test_precheck_user()}
+     */
+    public function precheck_user_provider() {
+
+        $emailmultiplier = [
+            'shortmail' => 'normalusername@example.com',
+            'longmail' => str_repeat('a', 100)  // It's not validated, hence any string is ok.
+        ];
+
+        $providercases = [];
+
+        foreach ($emailmultiplier as $emailk => $email) {
+            // Get the related cases.
+            $cases = $this->precheck_user_cases($email);
+            // Rename them (keys).
+            foreach ($cases as $key => $case) {
+                $providercases[$key . ' - ' . $emailk] = $case;
+            }
+        }
+
+        return $providercases;
+    }
+
+    /**
+     * Get all the cases implemented in {@link restore_dbops::precheck_users()}
+     *
+     * @param string $email
+     */
+    private function precheck_user_cases($email) {
+        global $CFG;
+
+        $baseuserarr = [
+            'username' => 'normalusername',
+            'email'    => $email,
+            'mnethostid' => $CFG->mnet_localhost_id,
+            'firstaccess' => 123456789,
+            'deleted'    => 0,
+            'forceemailcleanup' => false, // Hack to force the DB record to have empty mail.
+            'forceduplicateadminallowed' => false]; // Hack to enable import_general_duplicate_admin_allowed.
+
+        return [
+            // Cases with samesite = true.
+            'samesite match existing (1A)' => [
+                'dbuser' => $baseuserarr,
+                'backupuser' => $baseuserarr,
+                'samesite' => true,
+                'outcome' => 'match'
+            ],
+            'samesite match existing anon (1B)' => [
+                'dbuser' => array_merge($baseuserarr, [
+                    'username' => 'anon01']),
+                'backupuser' => array_merge($baseuserarr, [
+                    'id' => -1, 'username' => 'anon01', 'firstname' => 'anonfirstname01',
+                    'lastname' => 'anonlastname01', 'email' => 'anon01@doesntexist.invalid']),
+                'samesite' => true,
+                'outcome' => 'match'
+            ],
+            'samesite match existing deleted in db, alive in backup, by db username (1C)' => [
+                'dbuser' => array_merge($baseuserarr, [
+                    'deleted' => 1]),
+                'backupuser' => array_merge($baseuserarr, [
+                    'username' => 'this_wont_match']),
+                'samesite' => true,
+                'outcome' => 'match'
+            ],
+            'samesite match existing deleted in db, alive in backup, by db email (1C)' => [
+                'dbuser' => array_merge($baseuserarr, [
+                    'deleted' => 1]),
+                'backupuser' => array_merge($baseuserarr, [
+                    'email' => 'this_wont_match']),
+                'samesite' => true,
+                'outcome' => 'match'
+            ],
+            'samesite match existing alive in db, deleted in backup (1D)' => [
+                'dbuser' => $baseuserarr,
+                'backupuser' => array_merge($baseuserarr, [
+                    'deleted' => 1]),
+                'samesite' => true,
+                'outcome' => 'match'
+            ],
+            'samesite conflict (1E)' => [
+                'dbuser' => $baseuserarr,
+                'backupuser' => array_merge($baseuserarr, ['id' => -1]),
+                'samesite' => true,
+                'outcome' => false
+            ],
+            'samesite create user (1F)' => [
+                'dbuser' => $baseuserarr,
+                'backupuser' => array_merge($baseuserarr, [
+                    'username' => 'newusername']),
+                'samesite' => false,
+                'outcome' => true
+            ],
+
+            // Cases with samesite = false.
+            'no samesite match existing, by db email (2A1)' => [
+                'dbuser' => $baseuserarr,
+                'backupuser' => array_merge($baseuserarr, [
+                    'firstaccess' => 0]),
+                'samesite' => false,
+                'outcome' => 'match'
+            ],
+            'no samesite match existing, by db firstaccess (2A1)' => [
+                'dbuser' => $baseuserarr,
+                'backupuser' => array_merge($baseuserarr, [
+                    'email' => 'this_wont_match@example.con']),
+                'samesite' => false,
+                'outcome' => 'match'
+            ],
+            'no samesite match existing anon (2A1 too)' => [
+                'dbuser' => array_merge($baseuserarr, [
+                    'username' => 'anon01']),
+                'backupuser' => array_merge($baseuserarr, [
+                    'id' => -1, 'username' => 'anon01', 'firstname' => 'anonfirstname01',
+                    'lastname' => 'anonlastname01', 'email' => 'anon01@doesntexist.invalid']),
+                'samesite' => false,
+                'outcome' => 'match'
+            ],
+            'no samesite match dupe admin (2A2)' => [
+                'dbuser' => array_merge($baseuserarr, [
+                    'username' => 'admin_old_site_id',
+                    'forceduplicateadminallowed' => true]),
+                'backupuser' => array_merge($baseuserarr, [
+                    'username' => 'admin']),
+                'samesite' => false,
+                'outcome' => 'match'
+            ],
+            'no samesite match existing deleted in db, alive in backup, by db username (2B1)' => [
+                'dbuser' => array_merge($baseuserarr, [
+                    'deleted' => 1]),
+                'backupuser' => array_merge($baseuserarr, [
+                    'firstaccess' => 0]),
+                'samesite' => false,
+                'outcome' => 'match'
+            ],
+            'no samesite match existing deleted in db, alive in backup, by db firstaccess (2B1)' => [
+                'dbuser' => array_merge($baseuserarr, [
+                    'deleted' => 1]),
+                'backupuser' => array_merge($baseuserarr, [
+                    'mail' => 'this_wont_match']),
+                'samesite' => false,
+                'outcome' => 'match'
+            ],
+            'no samesite match existing deleted in db, alive in backup (2B2)' => [
+                'dbuser' => array_merge($baseuserarr, [
+                    'deleted' => 1,
+                    'forceemailcleanup' => true]),
+                'backupuser' => $baseuserarr,
+                'samesite' => false,
+                'outcome' => 'match'
+            ],
+            'no samesite match existing alive in db, deleted in backup (2C)' => [
+                'dbuser' => $baseuserarr,
+                'backupuser' => array_merge($baseuserarr, [
+                    'deleted' => 1]),
+                'samesite' => false,
+                'outcome' => 'match'
+            ],
+            'no samesite conflict (2D)' => [
+                'dbuser' => $baseuserarr,
+                'backupuser' => array_merge($baseuserarr, [
+                    'email' => 'anotheruser@example.com', 'firstaccess' => 0]),
+                'samesite' => false,
+                'outcome' => false
+            ],
+            'no samesite create user (2E)' => [
+                'dbuser' => $baseuserarr,
+                'backupuser' => array_merge($baseuserarr, [
+                    'username' => 'newusername']),
+                'samesite' => false,
+                'outcome' => true
+            ],
+
+        ];
+    }
+
+    /**
+     * Test restore precheck_user method
+     *
+     * @dataProvider precheck_user_provider
+     * @covers restore_dbops::precheck_user()
+     *
+     * @param array $dbuser
+     * @param array $backupuser
+     * @param bool $samesite
+     * @param mixed $outcome
+     **/
+    public function test_precheck_user($dbuser, $backupuser, $samesite, $outcome) {
+        global $DB;
+
+        $this->resetAfterTest();
+
+        $dbuser = (object)$dbuser;
+        $backupuser = (object)$backupuser;
+
+        $siteid = null;
+
+        // If the backup user must be deleted, simulate it (by temp inserting to DB, deleting and fetching it back).
+        if ($backupuser->deleted) {
+            $backupuser->id = $DB->insert_record('user', array_merge((array)$backupuser, ['deleted' => 0]));
+            delete_user($backupuser);
+            $backupuser = $DB->get_record('user', ['id' => $backupuser->id]);
+            $DB->delete_records('user', ['id' => $backupuser->id]);
+            unset($backupuser->id);
+        }
+
+        // Create the db user, normally.
+        $dbuser->id = $DB->insert_record('user', array_merge((array)$dbuser, ['deleted' => 0]));
+        $backupuser->id = $backupuser->id ?? $dbuser->id;
+
+        // We may want to enable the import_general_duplicate_admin_allowed setting and look for old admin records.
+        if ($dbuser->forceduplicateadminallowed) {
+            set_config('import_general_duplicate_admin_allowed', true, 'backup');
+            $siteid = 'old_site_id';
+        }
+
+        // If the DB user must be deleted, do it and fetch it back.
+        if ($dbuser->deleted) {
+            delete_user($dbuser);
+            // We may want to clean the mail field (old behavior, not containing the current md5(username).
+            if ($dbuser->forceemailcleanup) {
+                $DB->set_field('user', 'email', '', ['id' => $dbuser->id]);
+            }
+        }
+
+        // Get the dbuser  record, because we may have changed it above.
+        $dbuser = $DB->get_record('user', ['id' => $dbuser->id]);
+
+        $method = (new ReflectionClass('restore_dbops'))->getMethod('precheck_user');
+        $method->setAccessible(true);
+        $result = $method->invoke(null, $backupuser, $samesite, $siteid);
+
+        if (is_bool($result)) {
+            $this->assertSame($outcome, $result);
+        } else {
+            $outcome = $dbuser; // Outcome is not bool, matching found, so it must be the dbuser,
+            // Just check ids, it means the expected match has been found in database.
+            $this->assertSame($outcome->id, $result->id);
+        }
+    }
 }
index af67de2..6d3a60c 100644 (file)
@@ -52,8 +52,8 @@ class block_activity_modules extends block_list {
         $archetypes = array();
 
         foreach($modinfo->cms as $cm) {
-            // Exclude activities which are not visible or have no link (=label)
-            if (!$cm->uservisible or !$cm->has_view()) {
+            // Exclude activities that aren't visible or have no view link (e.g. label). Account for folder being displayed inline.
+            if (!$cm->uservisible || (!$cm->has_view() && strcmp($cm->modname, 'folder') !== 0)) {
                 continue;
             }
             if (array_key_exists($cm->modname, $modfullnames)) {
index 1b2a7df..ac42715 100644 (file)
@@ -16,4 +16,4 @@ Feature: Add URL to main menu block
       | External URL | http://www.google.com |
       | id_display | In pop-up |
     Then "google" "link" should exist in the "Main menu" "block"
-    And "Add an activity or resource" "button" should exist in the "Main menu" "block"
+    And "Add an activity" "button" should exist in the "Main menu" "block"
index 2776339..dc4821b 100644 (file)
@@ -361,20 +361,23 @@ class cache_helper {
     /**
      * Ensure that the stats array is ready to collect information for the given store and definition.
      * @param string $store
+     * @param string $storeclass
      * @param string $definition A string that identifies the definition.
      * @param int $mode One of cache_store::MODE_*. Since 2.9.
      */
-    protected static function ensure_ready_for_stats($store, $definition, $mode = cache_store::MODE_APPLICATION) {
+    protected static function ensure_ready_for_stats($store, $storeclass, $definition, $mode = cache_store::MODE_APPLICATION) {
         // This function is performance-sensitive, so exit as quickly as possible
         // if we do not need to do anything.
         if (isset(self::$stats[$definition]['stores'][$store])) {
             return;
         }
+
         if (!array_key_exists($definition, self::$stats)) {
             self::$stats[$definition] = array(
                 'mode' => $mode,
                 'stores' => array(
                     $store => array(
+                        'class' => $storeclass,
                         'hits' => 0,
                         'misses' => 0,
                         'sets' => 0,
@@ -383,6 +386,7 @@ class cache_helper {
             );
         } else if (!array_key_exists($store, self::$stats[$definition]['stores'])) {
             self::$stats[$definition]['stores'][$store] = array(
+                'class' => $storeclass,
                 'hits' => 0,
                 'misses' => 0,
                 'sets' => 0,
@@ -418,15 +422,22 @@ class cache_helper {
      * In Moodle 2.9 the $definition argument changed from accepting only a string to accepting a string or a
      * cache_definition instance. It is preferable to pass a cache definition instance.
      *
+     * In Moodle 3.9 the first argument changed to also accept a cache_store.
+     *
      * @internal
-     * @param cache_definition $store
+     * @param string|cache_store $store
      * @param cache_definition $definition You used to be able to pass a string here, however that is deprecated please pass the
      *      actual cache_definition object now.
      * @param int $hits The number of hits to record (by default 1)
      */
     public static function record_cache_hit($store, $definition, $hits = 1) {
+        $storeclass = '';
+        if ($store instanceof cache_store) {
+            $storeclass = get_class($store);
+            $store = $store->my_name();
+        }
         list($definitionstr, $mode) = self::get_definition_stat_id_and_mode($definition);
-        self::ensure_ready_for_stats($store, $definitionstr, $mode);
+        self::ensure_ready_for_stats($store, $storeclass, $definitionstr, $mode);
         self::$stats[$definitionstr]['stores'][$store]['hits'] += $hits;
     }
 
@@ -436,15 +447,22 @@ class cache_helper {
      * In Moodle 2.9 the $definition argument changed from accepting only a string to accepting a string or a
      * cache_definition instance. It is preferable to pass a cache definition instance.
      *
+     * In Moodle 3.9 the first argument changed to also accept a cache_store.
+     *
      * @internal
-     * @param string $store
+     * @param string|cache_store $store
      * @param cache_definition $definition You used to be able to pass a string here, however that is deprecated please pass the
      *      actual cache_definition object now.
      * @param int $misses The number of misses to record (by default 1)
      */
     public static function record_cache_miss($store, $definition, $misses = 1) {
+        $storeclass = '';
+        if ($store instanceof cache_store) {
+            $storeclass = get_class($store);
+            $store = $store->my_name();
+        }
         list($definitionstr, $mode) = self::get_definition_stat_id_and_mode($definition);
-        self::ensure_ready_for_stats($store, $definitionstr, $mode);
+        self::ensure_ready_for_stats($store, $storeclass, $definitionstr, $mode);
         self::$stats[$definitionstr]['stores'][$store]['misses'] += $misses;
     }
 
@@ -454,15 +472,22 @@ class cache_helper {
      * In Moodle 2.9 the $definition argument changed from accepting only a string to accepting a string or a
      * cache_definition instance. It is preferable to pass a cache definition instance.
      *
+     * In Moodle 3.9 the first argument changed to also accept a cache_store.
+     *
      * @internal
-     * @param string $store
+     * @param string|cache_store $store
      * @param cache_definition $definition You used to be able to pass a string here, however that is deprecated please pass the
      *      actual cache_definition object now.
      * @param int $sets The number of sets to record (by default 1)
      */
     public static function record_cache_set($store, $definition, $sets = 1) {
+        $storeclass = '';
+        if ($store instanceof cache_store) {
+            $storeclass = get_class($store);
+            $store = $store->my_name();
+        }
         list($definitionstr, $mode) = self::get_definition_stat_id_and_mode($definition);
-        self::ensure_ready_for_stats($store, $definitionstr, $mode);
+        self::ensure_ready_for_stats($store, $storeclass, $definitionstr, $mode);
         self::$stats[$definitionstr]['stores'][$store]['sets'] += $sets;
     }
 
index 8cd7914..6236cb0 100644 (file)
@@ -414,7 +414,7 @@ class cache implements cache_loader {
         $setaftervalidation = false;
         if ($result === false) {
             if ($this->perfdebug) {
-                cache_helper::record_cache_miss($this->storetype, $this->definition);
+                cache_helper::record_cache_miss($this->store, $this->definition);
             }
             if ($this->loader !== false) {
                 // We must pass the original (unparsed) key to the next loader in the chain.
@@ -426,7 +426,7 @@ class cache implements cache_loader {
             }
             $setaftervalidation = ($result !== false);
         } else if ($this->perfdebug) {
-            cache_helper::record_cache_hit($this->storetype, $this->definition);
+            cache_helper::record_cache_hit($this->store, $this->definition);
         }
         // 5. Validate strictness.
         if ($strictness === MUST_EXIST && $result === false) {
@@ -580,8 +580,8 @@ class cache implements cache_loader {
                     $hits++;
                 }
             }
-            cache_helper::record_cache_hit($this->storetype, $this->definition, $hits);
-            cache_helper::record_cache_miss($this->storetype, $this->definition, $misses);
+            cache_helper::record_cache_hit($this->store, $this->definition, $hits);
+            cache_helper::record_cache_miss($this->store, $this->definition, $misses);
         }
 
         // Return the result. Phew!
@@ -607,7 +607,7 @@ class cache implements cache_loader {
      */
     public function set($key, $data) {
         if ($this->perfdebug) {
-            cache_helper::record_cache_set($this->storetype, $this->definition);
+            cache_helper::record_cache_set($this->store, $this->definition);
         }
         if ($this->loader !== false) {
             // We have a loader available set it there as well.
@@ -762,7 +762,7 @@ class cache implements cache_loader {
         }
         $successfullyset = $this->store->set_many($data);
         if ($this->perfdebug && $successfullyset) {
-            cache_helper::record_cache_set($this->storetype, $this->definition, $successfullyset);
+            cache_helper::record_cache_set($this->store, $this->definition, $successfullyset);
         }
         return $successfullyset;
     }
@@ -1112,7 +1112,7 @@ class cache implements cache_loader {
         }
         if ($result !== false) {
             if ($this->perfdebug) {
-                cache_helper::record_cache_hit('** static acceleration **', $this->definition);
+                cache_helper::record_cache_hit(cache_store::STATIC_ACCEL, $this->definition);
             }
             if ($this->staticaccelerationsize > 1 && $this->staticaccelerationcount > 1) {
                 // Check to see if this is the last item on the static acceleration keys array.
@@ -1126,7 +1126,7 @@ class cache implements cache_loader {
             return $result;
         } else {
             if ($this->perfdebug) {
-                cache_helper::record_cache_miss('** static acceleration **', $this->definition);
+                cache_helper::record_cache_miss(cache_store::STATIC_ACCEL, $this->definition);
             }
             return false;
         }
@@ -1830,7 +1830,7 @@ class cache_session extends cache {
         // 4. Load if from the loader/datasource if we don't already have it.
         if ($result === false) {
             if ($this->perfdebug) {
-                cache_helper::record_cache_miss($this->storetype, $this->get_definition());
+                cache_helper::record_cache_miss($this->get_store(), $this->get_definition());
             }
             if ($this->get_loader() !== false) {
                 // We must pass the original (unparsed) key to the next loader in the chain.
@@ -1845,7 +1845,7 @@ class cache_session extends cache {
                 $this->set($key, $result);
             }
         } else if ($this->perfdebug) {
-            cache_helper::record_cache_hit($this->storetype, $this->get_definition());
+            cache_helper::record_cache_hit($this->get_store(), $this->get_definition());
         }
         // 5. Validate strictness.
         if ($strictness === MUST_EXIST && $result === false) {
@@ -1889,7 +1889,7 @@ class cache_session extends cache {
             $loader->set($key, $data);
         }
         if ($this->perfdebug) {
-            cache_helper::record_cache_set($this->storetype, $this->get_definition());
+            cache_helper::record_cache_set($this->get_store(), $this->get_definition());
         }
         if (is_object($data) && $data instanceof cacheable_object) {
             $data = new cache_cached_object($data);
@@ -2019,8 +2019,8 @@ class cache_session extends cache {
                     $hits++;
                 }
             }
-            cache_helper::record_cache_hit($this->storetype, $this->get_definition(), $hits);
-            cache_helper::record_cache_miss($this->storetype, $this->get_definition(), $misses);
+            cache_helper::record_cache_hit($this->get_store(), $this->get_definition(), $hits);
+            cache_helper::record_cache_miss($this->get_store(), $this->get_definition(), $misses);
         }
         return $return;
 
@@ -2097,7 +2097,7 @@ class cache_session extends cache {
         }
         $successfullyset = $this->get_store()->set_many($data);
         if ($this->perfdebug && $successfullyset) {
-            cache_helper::record_cache_set($this->storetype, $this->get_definition(), $successfullyset);
+            cache_helper::record_cache_set($this->store, $this->get_definition(), $successfullyset);
         }
         return $successfullyset;
     }
index 4fcb03f..a2cfe3e 100644 (file)
@@ -144,6 +144,10 @@ abstract class cache_store implements cache_store_interface {
      * Request caches. Static caches really.
      */
     const MODE_REQUEST = 4;
+    /**
+     * Static caches.
+     */
+    const STATIC_ACCEL = '** static accel. **';
 
     /**
      * Constructs an instance of the cache store.
index 9c0f1d9..0e6b203 100644 (file)
@@ -2092,15 +2092,15 @@ class core_cache_testcase extends advanced_testcase {
         $this->assertFalse($request->get('missMe'));
 
         $endstats = cache_helper::get_stats();
-        $this->assertEquals(2, $endstats[$applicationid]['stores']['cachestore_file']['misses']);
-        $this->assertEquals(0, $endstats[$applicationid]['stores']['cachestore_file']['hits']);
-        $this->assertEquals(0, $endstats[$applicationid]['stores']['cachestore_file']['sets']);
-        $this->assertEquals(3, $endstats[$sessionid]['stores']['cachestore_session']['misses']);
-        $this->assertEquals(0, $endstats[$sessionid]['stores']['cachestore_session']['hits']);
-        $this->assertEquals(1, $endstats[$sessionid]['stores']['cachestore_session']['sets']);
-        $this->assertEquals(4, $endstats[$requestid]['stores']['cachestore_static']['misses']);
-        $this->assertEquals(0, $endstats[$requestid]['stores']['cachestore_static']['hits']);
-        $this->assertEquals(0, $endstats[$requestid]['stores']['cachestore_static']['sets']);
+        $this->assertEquals(2, $endstats[$applicationid]['stores']['default_application']['misses']);
+        $this->assertEquals(0, $endstats[$applicationid]['stores']['default_application']['hits']);
+        $this->assertEquals(0, $endstats[$applicationid]['stores']['default_application']['sets']);
+        $this->assertEquals(3, $endstats[$sessionid]['stores']['default_session']['misses']);
+        $this->assertEquals(0, $endstats[$sessionid]['stores']['default_session']['hits']);
+        $this->assertEquals(1, $endstats[$sessionid]['stores']['default_session']['sets']);
+        $this->assertEquals(4, $endstats[$requestid]['stores']['default_request']['misses']);
+        $this->assertEquals(0, $endstats[$requestid]['stores']['default_request']['hits']);
+        $this->assertEquals(0, $endstats[$requestid]['stores']['default_request']['sets']);
 
         $startstats = cache_helper::get_stats();
 
@@ -2116,24 +2116,24 @@ class core_cache_testcase extends advanced_testcase {
         $this->assertTrue($request->set('setMe4', 4));
 
         $endstats = cache_helper::get_stats();
-        $this->assertEquals(0, $endstats[$applicationid]['stores']['cachestore_file']['misses'] -
-            $startstats[$applicationid]['stores']['cachestore_file']['misses']);
-        $this->assertEquals(0, $endstats[$applicationid]['stores']['cachestore_file']['hits'] -
-            $startstats[$applicationid]['stores']['cachestore_file']['hits']);
-        $this->assertEquals(2, $endstats[$applicationid]['stores']['cachestore_file']['sets'] -
-            $startstats[$applicationid]['stores']['cachestore_file']['sets']);
-        $this->assertEquals(0, $endstats[$sessionid]['stores']['cachestore_session']['misses'] -
-            $startstats[$sessionid]['stores']['cachestore_session']['misses']);
-        $this->assertEquals(0, $endstats[$sessionid]['stores']['cachestore_session']['hits'] -
-            $startstats[$sessionid]['stores']['cachestore_session']['hits']);
-        $this->assertEquals(3, $endstats[$sessionid]['stores']['cachestore_session']['sets'] -
-            $startstats[$sessionid]['stores']['cachestore_session']['sets']);
-        $this->assertEquals(0, $endstats[$requestid]['stores']['cachestore_static']['misses'] -
-            $startstats[$requestid]['stores']['cachestore_static']['misses']);
-        $this->assertEquals(0, $endstats[$requestid]['stores']['cachestore_static']['hits'] -
-            $startstats[$requestid]['stores']['cachestore_static']['hits']);
-        $this->assertEquals(4, $endstats[$requestid]['stores']['cachestore_static']['sets'] -
-            $startstats[$requestid]['stores']['cachestore_static']['sets']);
+        $this->assertEquals(0, $endstats[$applicationid]['stores']['default_application']['misses'] -
+                             $startstats[$applicationid]['stores']['default_application']['misses']);
+        $this->assertEquals(0, $endstats[$applicationid]['stores']['default_application']['hits'] -
+                             $startstats[$applicationid]['stores']['default_application']['hits']);
+        $this->assertEquals(2, $endstats[$applicationid]['stores']['default_application']['sets'] -
+                             $startstats[$applicationid]['stores']['default_application']['sets']);
+        $this->assertEquals(0, $endstats[$sessionid]['stores']['default_session']['misses'] -
+                             $startstats[$sessionid]['stores']['default_session']['misses']);
+        $this->assertEquals(0, $endstats[$sessionid]['stores']['default_session']['hits'] -
+                             $startstats[$sessionid]['stores']['default_session']['hits']);
+        $this->assertEquals(3, $endstats[$sessionid]['stores']['default_session']['sets'] -
+                             $startstats[$sessionid]['stores']['default_session']['sets']);
+        $this->assertEquals(0, $endstats[$requestid]['stores']['default_request']['misses'] -
+                             $startstats[$requestid]['stores']['default_request']['misses']);
+        $this->assertEquals(0, $endstats[$requestid]['stores']['default_request']['hits'] -
+                             $startstats[$requestid]['stores']['default_request']['hits']);
+        $this->assertEquals(4, $endstats[$requestid]['stores']['default_request']['sets'] -
+                             $startstats[$requestid]['stores']['default_request']['sets']);
 
         $startstats = cache_helper::get_stats();
 
@@ -2149,24 +2149,24 @@ class core_cache_testcase extends advanced_testcase {
         $this->assertEquals($request->get('setMe4'), 4);
 
         $endstats = cache_helper::get_stats();
-        $this->assertEquals(0, $endstats[$applicationid]['stores']['cachestore_file']['misses'] -
-            $startstats[$applicationid]['stores']['cachestore_file']['misses']);
-        $this->assertEquals(2, $endstats[$applicationid]['stores']['cachestore_file']['hits'] -
-            $startstats[$applicationid]['stores']['cachestore_file']['hits']);
-        $this->assertEquals(0, $endstats[$applicationid]['stores']['cachestore_file']['sets'] -
-            $startstats[$applicationid]['stores']['cachestore_file']['sets']);
-        $this->assertEquals(0, $endstats[$sessionid]['stores']['cachestore_session']['misses'] -
-            $startstats[$sessionid]['stores']['cachestore_session']['misses']);
-        $this->assertEquals(3, $endstats[$sessionid]['stores']['cachestore_session']['hits'] -
-            $startstats[$sessionid]['stores']['cachestore_session']['hits']);
-        $this->assertEquals(0, $endstats[$sessionid]['stores']['cachestore_session']['sets'] -
-            $startstats[$sessionid]['stores']['cachestore_session']['sets']);
-        $this->assertEquals(0, $endstats[$requestid]['stores']['cachestore_static']['misses'] -
-            $startstats[$requestid]['stores']['cachestore_static']['misses']);
-        $this->assertEquals(4, $endstats[$requestid]['stores']['cachestore_static']['hits'] -
-            $startstats[$requestid]['stores']['cachestore_static']['hits']);
-        $this->assertEquals(0, $endstats[$requestid]['stores']['cachestore_static']['sets'] -
-            $startstats[$requestid]['stores']['cachestore_static']['sets']);
+        $this->assertEquals(0, $endstats[$applicationid]['stores']['default_application']['misses'] -
+                             $startstats[$applicationid]['stores']['default_application']['misses']);
+        $this->assertEquals(2, $endstats[$applicationid]['stores']['default_application']['hits'] -
+                             $startstats[$applicationid]['stores']['default_application']['hits']);
+        $this->assertEquals(0, $endstats[$applicationid]['stores']['default_application']['sets'] -
+                             $startstats[$applicationid]['stores']['default_application']['sets']);
+        $this->assertEquals(0, $endstats[$sessionid]['stores']['default_session']['misses'] -
+                             $startstats[$sessionid]['stores']['default_session']['misses']);
+        $this->assertEquals(3, $endstats[$sessionid]['stores']['default_session']['hits'] -
+                             $startstats[$sessionid]['stores']['default_session']['hits']);
+        $this->assertEquals(0, $endstats[$sessionid]['stores']['default_session']['sets'] -
+                             $startstats[$sessionid]['stores']['default_session']['sets']);
+        $this->assertEquals(0, $endstats[$requestid]['stores']['default_request']['misses'] -
+                             $startstats[$requestid]['stores']['default_request']['misses']);
+        $this->assertEquals(4, $endstats[$requestid]['stores']['default_request']['hits'] -
+                             $startstats[$requestid]['stores']['default_request']['hits']);
+        $this->assertEquals(0, $endstats[$requestid]['stores']['default_request']['sets'] -
+                             $startstats[$requestid]['stores']['default_request']['sets']);
 
         $startstats = cache_helper::get_stats();
 
@@ -2176,24 +2176,24 @@ class core_cache_testcase extends advanced_testcase {
         $request->get_many(array('setMe1', 'setMe2', 'setMe3', 'setMe4'));
 
         $endstats = cache_helper::get_stats();
-        $this->assertEquals(0, $endstats[$applicationid]['stores']['cachestore_file']['misses'] -
-            $startstats[$applicationid]['stores']['cachestore_file']['misses']);
-        $this->assertEquals(2, $endstats[$applicationid]['stores']['cachestore_file']['hits'] -
-            $startstats[$applicationid]['stores']['cachestore_file']['hits']);
-        $this->assertEquals(0, $endstats[$applicationid]['stores']['cachestore_file']['sets'] -
-            $startstats[$applicationid]['stores']['cachestore_file']['sets']);
-        $this->assertEquals(0, $endstats[$sessionid]['stores']['cachestore_session']['misses'] -
-            $startstats[$sessionid]['stores']['cachestore_session']['misses']);
-        $this->assertEquals(3, $endstats[$sessionid]['stores']['cachestore_session']['hits'] -
-            $startstats[$sessionid]['stores']['cachestore_session']['hits']);
-        $this->assertEquals(0, $endstats[$sessionid]['stores']['cachestore_session']['sets'] -
-            $startstats[$sessionid]['stores']['cachestore_session']['sets']);
-        $this->assertEquals(0, $endstats[$requestid]['stores']['cachestore_static']['misses'] -
-            $startstats[$requestid]['stores']['cachestore_static']['misses']);
-        $this->assertEquals(4, $endstats[$requestid]['stores']['cachestore_static']['hits'] -
-            $startstats[$requestid]['stores']['cachestore_static']['hits']);
-        $this->assertEquals(0, $endstats[$requestid]['stores']['cachestore_static']['sets'] -
-            $startstats[$requestid]['stores']['cachestore_static']['sets']);
+        $this->assertEquals(0, $endstats[$applicationid]['stores']['default_application']['misses'] -
+                             $startstats[$applicationid]['stores']['default_application']['misses']);
+        $this->assertEquals(2, $endstats[$applicationid]['stores']['default_application']['hits'] -
+                             $startstats[$applicationid]['stores']['default_application']['hits']);
+        $this->assertEquals(0, $endstats[$applicationid]['stores']['default_application']['sets'] -
+                             $startstats[$applicationid]['stores']['default_application']['sets']);
+        $this->assertEquals(0, $endstats[$sessionid]['stores']['default_session']['misses'] -
+                             $startstats[$sessionid]['stores']['default_session']['misses']);
+        $this->assertEquals(3, $endstats[$sessionid]['stores']['default_session']['hits'] -
+                             $startstats[$sessionid]['stores']['default_session']['hits']);
+        $this->assertEquals(0, $endstats[$sessionid]['stores']['default_session']['sets'] -
+                             $startstats[$sessionid]['stores']['default_session']['sets']);
+        $this->assertEquals(0, $endstats[$requestid]['stores']['default_request']['misses'] -
+                             $startstats[$requestid]['stores']['default_request']['misses']);
+        $this->assertEquals(4, $endstats[$requestid]['stores']['default_request']['hits'] -
+                             $startstats[$requestid]['stores']['default_request']['hits']);
+        $this->assertEquals(0, $endstats[$requestid]['stores']['default_request']['sets'] -
+                             $startstats[$requestid]['stores']['default_request']['sets']);
     }
 
     public function test_static_cache() {
@@ -2225,8 +2225,8 @@ class core_cache_testcase extends advanced_testcase {
 
         // Check that the static acceleration worked, even on empty arrays and the number 0.
         $endstats = cache_helper::get_stats();
-        $this->assertEquals(0, $endstats[$applicationid]['stores']['** static acceleration **']['misses']);
-        $this->assertEquals(3, $endstats[$applicationid]['stores']['** static acceleration **']['hits']);
+        $this->assertEquals(0, $endstats[$applicationid]['stores']['** static accel. **']['misses']);
+        $this->assertEquals(3, $endstats[$applicationid]['stores']['** static accel. **']['hits']);
     }
 
     public function test_performance_debug_off() {
index eaf6344..076bd53 100644 (file)
@@ -1,6 +1,9 @@
 This files describes API changes in /cache/stores/* - cache store plugins.
 Information provided here is intended especially for developers.
 
+=== 3.9 ===
+* The record_cache_hit/miss/set methods now take a cache_store instead of a cache_definition object
+
 === 3.8 ===
 * The Redis cache store can now make use of the Zstandard compression algorithm (see MDL-66428).
 
index 54e4ac1..d44cd94 100644 (file)
Binary files a/calendar/amd/build/crud.min.js and b/calendar/amd/build/crud.min.js differ
index 283f9da..c6e0e09 100644 (file)
Binary files a/calendar/amd/build/crud.min.js.map and b/calendar/amd/build/crud.min.js.map differ
index b757df8..7853a67 100644 (file)
@@ -35,6 +35,7 @@ define([
     'core_calendar/events',
     'core_calendar/modal_delete',
     'core_calendar/selectors',
+    'core/pending',
 ],
 function(
     $,
@@ -49,7 +50,8 @@ function(
     CalendarRepository,
     CalendarEvents,
     ModalDelete,
-    CalendarSelectors
+    CalendarSelectors,
+    Pending
 ) {
 
     /**
@@ -101,13 +103,6 @@ function(
             );
         }
 
-        deletePromise.then(function(deleteModal) {
-            deleteModal.show();
-
-            return;
-        })
-        .fail(Notification.exception);
-
         var stringsPromise = Str.get_strings(deleteStrings);
 
         var finalPromise = $.when(stringsPromise, deletePromise)
@@ -118,27 +113,33 @@ function(
                 deleteModal.setSaveButtonText(strings[0]);
             }
 
+            deleteModal.show();
+
             deleteModal.getRoot().on(ModalEvents.save, function() {
+                var pendingPromise = new Pending('calendar/crud:initModal:deletedevent');
                 CalendarRepository.deleteEvent(eventId, false)
                     .then(function() {
                         $('body').trigger(CalendarEvents.deleted, [eventId, false]);
                         return;
                     })
+                    .then(pendingPromise.resolve)
                     .catch(Notification.exception);
             });
 
             deleteModal.getRoot().on(CalendarEvents.deleteAll, function() {
+                var pendingPromise = new Pending('calendar/crud:initModal:deletedallevent');
                 CalendarRepository.deleteEvent(eventId, true)
                     .then(function() {
                         $('body').trigger(CalendarEvents.deleted, [eventId, true]);
                         return;
                     })
+                    .then(pendingPromise.resolve)
                     .catch(Notification.exception);
             });
 
             return deleteModal;
         })
-        .fail(Notification.exception);
+        .catch(Notification.exception);
 
         return finalPromise;
     }
index b58e8c0..3b08693 100644 (file)
@@ -13,7 +13,7 @@
     "require-dev": {
         "phpunit/phpunit": "7.5.*",
         "phpunit/dbunit": "4.0.*",
-        "moodlehq/behat-extension": "3.39.1",
+        "moodlehq/behat-extension": "3.39.3",
         "mikey179/vfsstream": "^1.6",
         "instaclick/php-webdriver": "dev-local as 1.x-dev"
     }
index bd2613c..11dbff6 100644 (file)
@@ -4,42 +4,44 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "7d4095e9af1e9ef59e2a74273a5c55b2",
+    "content-hash": "b1953ceec577434625a7aee12f650daa",
     "packages": [],
     "packages-dev": [
         {
             "name": "behat/behat",
-            "version": "v3.5.0",
+            "version": "v3.6.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/Behat/Behat.git",
-   &nb