Merge branch 'MDL-85159-500' of https://github.com/stevandoMoodle/moodle into MOODLE_500_STABLE

This commit is contained in:
Huong Nguyen
2025-06-19 10:03:39 +07:00
15 changed files with 62 additions and 43 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -513,14 +513,18 @@ export class EmbedHandler {
* @returns {object}
*/
getContextForMediaHTML = (tab, details) => {
const tracks = Array.from(tab.querySelectorAll(Selectors.EMBED.elements.track)).map(track => ({
track: track.querySelector(Selectors.EMBED.elements.trackSource + ' ' + Selectors.EMBED.elements.url).value,
kind: this.getTrackTypeFromTabPane(track.closest('.tab-pane')),
label: track.querySelector(Selectors.EMBED.elements.trackLabel).value ||
track.querySelector(Selectors.EMBED.elements.trackLang).value,
srclang: track.querySelector(Selectors.EMBED.elements.trackLang).value,
defaultTrack: track.querySelector(Selectors.EMBED.elements.trackDefault).checked ? "true" : null
})).filter((track) => !!track.track);
const tracks = Array.from(tab.querySelectorAll(Selectors.EMBED.elements.track)).map(track => {
const langTrack = track.querySelector(Selectors.EMBED.elements.trackLang);
const selectedLangTrack = langTrack.options[langTrack.selectedIndex];
return {
track: track.querySelector(Selectors.EMBED.elements.trackSource + ' ' + Selectors.EMBED.elements.url).value,
kind: this.getTrackTypeFromTabPane(track.closest('.tab-pane')),
label: track.querySelector(Selectors.EMBED.elements.trackLabel).value || langTrack.value,
srclang: selectedLangTrack.dataset.languageCode ?? false,
defaultTrack: track.querySelector(Selectors.EMBED.elements.trackDefault).checked ? "true" : null
};
}).filter((track) => !!track.track);
const mediaPreviewContainer = details.querySelector(Selectors.EMBED.elements.mediaPreviewContainer);
let sources = mediaPreviewContainer.dataset.originalUrl ?? null;
@@ -224,16 +224,16 @@ export const prepareMoodleLang = (editor) => {
const moodleLangs = getMoodleLang(editor);
const currentLanguage = getCurrentLanguage(editor);
const installed = Object.entries(moodleLangs.installed).map(([lang, code]) => ({
const installed = Object.entries(moodleLangs.installed).map(([code, lang]) => ({
lang,
code,
"default": lang === currentLanguage,
"default": code === currentLanguage,
}));
const available = Object.entries(moodleLangs.available).map(([lang, code]) => ({
const available = Object.entries(moodleLangs.available).map(([code, lang]) => ({
lang,
code,
"default": lang === currentLanguage,
"default": code === currentLanguage,
}));
return {
@@ -385,7 +385,22 @@ export class EmbedPreview extends MediaBase {
langTracks.forEach((dropdown) => {
const defaultVal = dropdown.getAttribute('data-value');
if (defaultVal) {
dropdown.value = defaultVal;
// ISO 639-1: 2-letter codes (e.g., en for English, fr for French).
// Most widely used in applications like web development (lang="en" in HTML).
// Let's check if the value of srclang is language code or language name.
if (defaultVal.length === 2) {
const options = dropdown.options;
for (let i = 0; i < options.length; i++) {
if (options[i].dataset.languageCode === defaultVal) {
dropdown.value = options[i].value;
break;
}
}
} else {
// It means the value of srclang in track is a full language name like "English (en)",
// which has been like this before this patch.
dropdown.value = defaultVal;
}
}
});
}
@@ -61,12 +61,12 @@
<select id="caption-video-lang-input" class="form-select tiny_media_track_lang_entry" data-value="{{srclang}}">
<optgroup label="{{#str}} languagesinstalled, tiny_media {{/str}}">
{{#langsInstalled}}
<option value="{{code}}" {{#default}}selected="selected"{{/default}}>{{lang}}</option>
<option value="{{lang}}" data-language-code="{{code}}" {{#default}}selected="selected"{{/default}}>{{lang}}</option>
{{/langsInstalled}}
</optgroup>
<optgroup label="{{#str}} languagesavailable, tiny_media {{/str}} ">
{{#langsAvailable}}
<option value="{{code}}">{{lang}}</option>
<option value="{{lang}}" data-language-code="{{code}}">{{lang}}</option>
{{/langsAvailable}}
</optgroup>
</select>
@@ -113,12 +113,12 @@
<select id="caption-video-lang-input" class="form-select tiny_media_track_lang_entry">
<optgroup label="{{#str}} languagesinstalled, tiny_media {{/str}}">
{{#langsInstalled}}
<option value="{{code}}" {{#default}}selected="selected"{{/default}}>{{lang}}</option>
<option value="{{lang}}" data-language-code="{{code}}" {{#default}}selected="selected"{{/default}}>{{lang}}</option>
{{/langsInstalled}}
</optgroup>
<optgroup label="{{#str}} languagesavailable, tiny_media {{/str}} ">
{{#langsAvailable}}
<option value="{{code}}">{{lang}}</option>
<option value="{{lang}}" data-language-code="{{code}}">{{lang}}</option>
{{/langsAvailable}}
</optgroup>
</select>
@@ -61,12 +61,12 @@
<select id="chapter-video-lang-input" class="form-select tiny_media_track_lang_entry" data-value="{{srclang}}">
<optgroup label="{{#str}} languagesinstalled, tiny_media {{/str}}">
{{#langsInstalled}}
<option value="{{code}}" {{#default}}selected="selected"{{/default}}>{{lang}}</option>
<option value="{{lang}}" data-language-code="{{code}}" {{#default}}selected="selected"{{/default}}>{{lang}}</option>
{{/langsInstalled}}
</optgroup>
<optgroup label="{{#str}} languagesavailable, tiny_media {{/str}} ">
{{#langsAvailable}}
<option value="{{code}}">{{lang}}</option>
<option value="{{lang}}" data-language-code="{{code}}">{{lang}}</option>
{{/langsAvailable}}
</optgroup>
</select>
@@ -113,12 +113,12 @@
<select id="chapter-video-lang-input" class="form-select tiny_media_track_lang_entry">
<optgroup label="{{#str}} languagesinstalled, tiny_media {{/str}}">
{{#langsInstalled}}
<option value="{{code}}" {{#default}}selected="selected"{{/default}}>{{lang}}</option>
<option value="{{lang}}" data-language-code="{{code}}" {{#default}}selected="selected"{{/default}}>{{lang}}</option>
{{/langsInstalled}}
</optgroup>
<optgroup label="{{#str}} languagesavailable, tiny_media {{/str}} ">
{{#langsAvailable}}
<option value="{{code}}">{{lang}}</option>
<option value="{{lang}}" data-language-code="{{code}}">{{lang}}</option>
{{/langsAvailable}}
</optgroup>
</select>
@@ -61,12 +61,12 @@
<select id="description-video-lang-input" class="form-select tiny_media_track_lang_entry" data-value="{{srclang}}">
<optgroup label="{{#str}} languagesinstalled, tiny_media {{/str}}">
{{#langsInstalled}}
<option value="{{code}}" {{#default}}selected="selected"{{/default}}>{{lang}}</option>
<option value="{{lang}}" data-language-code="{{code}}" {{#default}}selected="selected"{{/default}}>{{lang}}</option>
{{/langsInstalled}}
</optgroup>
<optgroup label="{{#str}} languagesavailable, tiny_media {{/str}} ">
{{#langsAvailable}}
<option value="{{code}}">{{lang}}</option>
<option value="{{lang}}" data-language-code="{{code}}">{{lang}}</option>
{{/langsAvailable}}
</optgroup>
</select>
@@ -113,12 +113,12 @@
<select id="description-video-lang-input" class="form-select tiny_media_track_lang_entry">
<optgroup label="{{#str}} languagesinstalled, tiny_media {{/str}}">
{{#langsInstalled}}
<option value="{{code}}" {{#default}}selected="selected"{{/default}}>{{lang}}</option>
<option value="{{lang}}" data-language-code="{{code}}" {{#default}}selected="selected"{{/default}}>{{lang}}</option>
{{/langsInstalled}}
</optgroup>
<optgroup label="{{#str}} languagesavailable, tiny_media {{/str}} ">
{{#langsAvailable}}
<option value="{{code}}">{{lang}}</option>
<option value="{{lang}}" data-language-code="{{code}}">{{lang}}</option>
{{/langsAvailable}}
</optgroup>
</select>
@@ -61,12 +61,12 @@
<select id="metadata-video-lang-input" class="form-select tiny_media_track_lang_entry" data-value="{{srclang}}">
<optgroup label="{{#str}} languagesinstalled, tiny_media {{/str}}">
{{#langsInstalled}}
<option value="{{code}}" {{#default}}selected="selected"{{/default}}>{{lang}}</option>
<option value="{{lang}}" data-language-code="{{code}}" {{#default}}selected="selected"{{/default}}>{{lang}}</option>
{{/langsInstalled}}
</optgroup>
<optgroup label="{{#str}} languagesavailable, tiny_media {{/str}} ">
{{#langsAvailable}}
<option value="{{code}}">{{lang}}</option>
<option value="{{lang}}" data-language-code="{{code}}">{{lang}}</option>
{{/langsAvailable}}
</optgroup>
</select>
@@ -113,12 +113,12 @@
<select id="metadata-video-lang-input" class="form-select tiny_media_track_lang_entry">
<optgroup label="{{#str}} languagesinstalled, tiny_media {{/str}}">
{{#langsInstalled}}
<option value="{{code}}" {{#default}}selected="selected"{{/default}}>{{lang}}</option>
<option value="{{lang}}" data-language-code="{{code}}" {{#default}}selected="selected"{{/default}}>{{lang}}</option>
{{/langsInstalled}}
</optgroup>
<optgroup label="{{#str}} languagesavailable, tiny_media {{/str}} ">
{{#langsAvailable}}
<option value="{{code}}">{{lang}}</option>
<option value="{{lang}}" data-language-code="{{code}}">{{lang}}</option>
{{/langsAvailable}}
</optgroup>
</select>
@@ -61,12 +61,12 @@
<select id="subtitle-video-lang-input" class="form-select tiny_media_track_lang_entry" data-value="{{srclang}}">
<optgroup label="{{#str}} languagesinstalled, tiny_media {{/str}}">
{{#langsInstalled}}
<option value="{{code}}" {{#default}}selected="selected"{{/default}}>{{lang}}</option>
<option value="{{lang}}" data-language-code="{{code}}" {{#default}}selected="selected"{{/default}}>{{lang}}</option>
{{/langsInstalled}}
</optgroup>
<optgroup label="{{#str}} languagesavailable, tiny_media {{/str}} ">
{{#langsAvailable}}
<option value="{{code}}">{{lang}}</option>
<option value="{{lang}}" data-language-code="{{code}}">{{lang}}</option>
{{/langsAvailable}}
</optgroup>
</select>
@@ -113,12 +113,12 @@
<select id="subtitle-video-lang-input" class="form-select tiny_media_track_lang_entry">
<optgroup label="{{#str}} languagesinstalled, tiny_media {{/str}}">
{{#langsInstalled}}
<option value="{{code}}" {{#default}}selected="selected"{{/default}}>{{lang}}</option>
<option value="{{lang}}" data-language-code="{{code}}" {{#default}}selected="selected"{{/default}}>{{lang}}</option>
{{/langsInstalled}}
</optgroup>
<optgroup label="{{#str}} languagesavailable, tiny_media {{/str}} ">
{{#langsAvailable}}
<option value="{{code}}">{{lang}}</option>
<option value="{{lang}}" data-language-code="{{code}}">{{lang}}</option>
{{/langsAvailable}}
</optgroup>
</select>
@@ -46,13 +46,13 @@ Feature: Use the TinyMCE editor to upload a media file
And I click on "Subtitles and captions" "link" in the "Media details" "dialogue"
And I click on "Browse repositories..." "button" in the "Media details" "dialogue"
And I upload "/lib/editor/tiny/tests/behat/fixtures/<subtitlefile>" to the file picker for TinyMCE
And I set the field "Language" in the "Media details" "dialogue" to "<subtitlelangcode>"
And I set the field "Language" in the "Media details" "dialogue" to "<subtitlelang>"
And I set the field "Label" in the "Media details" "dialogue" to "<subtitletitle>"
And I click on "Save" "button" in the "Media details" "dialogue"
And I switch to the "Description" TinyMCE editor iframe
And "//*[contains(@data-id, 'id_description_editor')]//<mediatype>[@title='<newfixturetitle>' and @autoplay='autoplay' and @loop='loop' and @muted='true' and @controls='controls']" "xpath_element" should exist
And "//*[contains(@data-id, 'id_description_editor')]//<mediatype>//source[contains(@src, '<fixturefile>')]" "xpath_element" should exist
And "//*[contains(@data-id, 'id_description_editor')]//<mediatype>//track[contains(@src, '<subtitlefile>') and @kind='subtitles' and contains(@srclang, '<subtitlelang>') and @label='<subtitletitle>']" "xpath_element" should exist
And "//*[contains(@data-id, 'id_description_editor')]//<mediatype>//track[contains(@src, '<subtitlefile>') and @kind='subtitles' and contains(@srclang, '<subtitlelangcode>') and @label='<subtitletitle>']" "xpath_element" should exist
And I switch to the main frame
And I select the "video" element in position "1" of the "Description" TinyMCE editor
And I click on the "Multimedia" button for the "Description" TinyMCE editor
@@ -65,12 +65,12 @@ Feature: Use the TinyMCE editor to upload a media file
And <customsizeverify3>
And I click on "Subtitles and captions" "link" in the "Media details" "dialogue"
And the field "Subtitle track URL" in the "Media details" "dialogue" does not match value ""
And the field "Language" in the "Media details" "dialogue" matches value "<subtitlelangcode>"
And the field "Language" in the "Media details" "dialogue" matches value "<subtitlelang>"
And the field "Label" in the "Media details" "dialogue" matches value "<subtitletitle>"
Examples:
| mediatype | fixturefile | fixturetitle | newfixturetitle | subtitlefile | subtitletitle | subtitlelangcode | subtitlelang | thumbnailaction | originalsizeverify | customsizeverify1 | customsizeverify2 | customsizeverify3 | customsizestep | customsizeaction |
| video | moodle-logo.mp4 | moodle-logo | Moodle LMS Logo | subtitle-sample.vtt | Subtitle sample for video | en | English | should exist | the field "Original size" in the "Media details" "dialogue" matches value "1" | the field "Custom size" in the "Media details" "dialogue" matches value "0" | the field "Custom size" in the "Media details" "dialogue" matches value "1" | the field "Width" in the "Media details" "dialogue" matches value "300" | I click on "Custom size" "radio" in the "Media details" "dialogue" | I set the field "Width" in the "Media details" "dialogue" to "300" |
| video | moodle-logo.mp4 | moodle-logo | Moodle LMS Logo | subtitle-sample.vtt | Subtitle sample for video | he | Hebrew | should exist | the field "Original size" in the "Media details" "dialogue" matches value "1" | the field "Custom size" in the "Media details" "dialogue" matches value "0" | the field "Custom size" in the "Media details" "dialogue" matches value "1" | the field "Width" in the "Media details" "dialogue" matches value "300" | I click on "Custom size" "radio" in the "Media details" "dialogue" | I set the field "Width" in the "Media details" "dialogue" to "300" |
| audio | audio-sample.mp3 | audio-sample | Sample Audio File | subtitle-sample.vtt | Subtitle sample for audio | fr | French | should not exist | "Original size" "field" should not exist in the "Media details" "dialogue" | "Custom size" "field" should not exist in the "Media details" "dialogue" | "Custom size" "field" should not exist in the "Media details" "dialogue" | "Width" "field" should not exist in the "Media details" "dialogue" | "Original size" "field" should not exist in the "Media details" "dialogue" | "Custom size" "field" should not exist in the "Media details" "dialogue" |
@_file_upload