From d8593ad72b0897c92d0754ecc3eab9fcb748ba54 Mon Sep 17 00:00:00 2001 From: Julio Montoya Date: Wed, 21 Aug 2019 11:46:23 +0200 Subject: [PATCH 01/12] WIP - Fix ordering see BT#15967 --- main/lp/learnpath.class.php | 2 +- main/lp/lp_controller.php | 113 +++++++++++++++++++++++++++++++++--- 2 files changed, 105 insertions(+), 10 deletions(-) diff --git a/main/lp/learnpath.class.php b/main/lp/learnpath.class.php index 14ecd220ef..7960ccb4e6 100755 --- a/main/lp/learnpath.class.php +++ b/main/lp/learnpath.class.php @@ -6535,7 +6535,7 @@ class learnpath $sub_list = ''; if (isset($item['type']) && $item['type'] == 'dir') { // empty value - $sub_list = Display::tag('li', '', ['class' => 'sub_item empty record li_container']); + $sub_list = Display::tag('li', '', ['class' => 'sub_item empty']); } if (empty($item['children'])) { $sub_list = Display::tag('ul', $sub_list, ['id' => 'UL_'.$key, 'class' => 'record li_container']); diff --git a/main/lp/lp_controller.php b/main/lp/lp_controller.php index 8589843d4a..dd9af80223 100755 --- a/main/lp/lp_controller.php +++ b/main/lp/lp_controller.php @@ -102,36 +102,131 @@ $htmlHeadXtra[] = ' var jItems = $("#lp_item_list li.li_container"); var jItem = $("#"+ itemId); var index = jItems.index(jItem); - var total = jItems.length; + var total = jItems.length; + //console.log(jItems); + console.log("total " + total); + console.log("current " + index); + switch (dir) { case "up": if (index != 0 && jItems[index - 1]) { - var subItems = $(jItems[index - 1]).find("li.sub_item"); + /*var subItems = $(jItems[index - 1]).find("li.sub_item"); if (subItems.length >= 0) { index = index - 1; + }*/ + var subItems = $(jItems[index - 1]).find("li.sub_item"); + var parentClass = $(jItems[index - 1]).parent().parent().attr("class"); + + var parentId = $(jItems[index]).parent().parent().attr("id"); + var myParentId = $(jItems[index - 1]).parent().parent().attr("id"); + console.log(parentId + " - " + myParentId); + + // We are brothers! + if (parentId == myParentId) { + console.log("Brothers"); + console.log(subItems.length); + if (subItems.length > 0) { + var lastItem = $(jItems[index - 1]).find("li.sub_item"); + parentIndex = jItems.index(lastItem); + console.log(parentIndex); + jItem.detach().insertAfter(lastItem); + + console.log("not classic"); + } else { + console.log("classic"); + jItem.detach().insertBefore(jItems[index - 1]); + } + + break; } - jItem.detach().insertBefore(jItems[index - 1]); + + console.log(parentClass); + if (parentClass == "record li_container") { + // previous is a chapter + var lastItem = $(jItems[index - 1]).parent().parent().find("li.li_container").last(); + parentIndex = jItems.index(lastItem); + console.log(parentIndex); + jItem.detach().insertAfter(jItems[parentIndex]); + } else { + jItem.detach().insertBefore(jItems[index - 1]); + } } break; case "down": - if (index != jItems.length - 1) { + if (index != total - 1) { + const originIndex = index; + // The element is a chapter with items var subItems = jItem.find("li.li_container"); - if (subItems.length >= 0) { + if (subItems.length > 0) { index = subItems.length + index; - } + console.log("element is a chapter with items"); + + console.log("new index = " + index); + } - // is a chapter? var subItems = $(jItems[index + 1]).find("li.sub_item"); - if (subItems.length >= 0) { - index = index + 1; + console.log("next subItems.length: "+subItems.length); + // This is an element entering in a chapter + if (subItems.length > 0) { + // Check if im a child + var parentClass = jItem.parent().parent().attr("class"); + console.log(parentClass); + if (parentClass == "record li_container") { + // Parent position + var parentIndex = jItems.index(jItem.parent().parent()); + console.log(jItem.parent().parent().attr("id")); + console.log(parentIndex); + jItem.detach().insertAfter(jItems[parentIndex]); + } else { + jItem.detach().insertAfter(subItems); + } + break; + } + + var currentSubItems = $(jItems[index]).parent().find("li.sub_item"); + console.log("currentSubItems"+currentSubItems.length); + + var parentId = $(jItems[originIndex]).parent().parent().attr("id"); + var myParentId = $(jItems[index + 1]).parent().parent().attr("id"); + console.log("parent ids: "+ parentId + " - " + myParentId); + + // We are brothers! + if (parentId == myParentId) { + if ((index + 1) < total) { + console.log(index + 1); + console.log("We are brothers"); + jItem.detach().insertAfter(jItems[index + 1]); + } + break; + } + + if (currentSubItems.length > 0) { + var parentIndex = jItems.index(jItem.parent().parent()); + console.log("has currentSubItems"); + console.log(jItem.parent().parent().attr("id")); + console.log(parentIndex); + if (parentIndex > 0) { + jItem.detach().insertAfter(jItems[parentIndex]); + break; + } + //jItem.detach().insertAfter($(jItems[index]).parent().parent()); + } + + //var lastItem = $(jItems[index + 1]).parent().parent().find("li.li_container").last(); + if (subItems.length > 0) { + index = originIndex; } + if ((index + 1) < total) { + console.log(index + 1); + console.log("changed"); jItem.detach().insertAfter(jItems[index + 1]); } } break; } + console.log("rebuild"); buildLPtree($("#lp_item_list"), 0); var order = "new_order="+ newOrderData + "&a=update_lp_item_order"; From dd2fb31e482c6eb83a8c2d390891bdff51bd675a Mon Sep 17 00:00:00 2001 From: Yannick Warnier Date: Wed, 21 Aug 2019 15:06:03 +0200 Subject: [PATCH 02/12] Temporarily use exercise ID instead of IID to avoid conflict with the delete and other methods not yet migrated to IID - refs BT#15983 --- main/exercise/exercise.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/exercise/exercise.class.php b/main/exercise/exercise.class.php index b48f8c2a1b..4c0eb55406 100755 --- a/main/exercise/exercise.class.php +++ b/main/exercise/exercise.class.php @@ -9147,7 +9147,7 @@ class Exercise } $currentRow = [ - $row['iid'], + $row['id'], $currentRow['title'], $currentRow['count_questions'], $actions, From eb2417e44ac4baddaeb57f529d6b8006eed24c32 Mon Sep 17 00:00:00 2001 From: Julio Montoya Date: Wed, 21 Aug 2019 15:21:30 +0200 Subject: [PATCH 03/12] Fix ordering, logs removed see BT#15967 --- main/lp/lp_controller.php | 62 ++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 33 deletions(-) diff --git a/main/lp/lp_controller.php b/main/lp/lp_controller.php index dd9af80223..26860fd3f0 100755 --- a/main/lp/lp_controller.php +++ b/main/lp/lp_controller.php @@ -102,10 +102,10 @@ $htmlHeadXtra[] = ' var jItems = $("#lp_item_list li.li_container"); var jItem = $("#"+ itemId); var index = jItems.index(jItem); - var total = jItems.length; - //console.log(jItems); - console.log("total " + total); - console.log("current " + index); + var total = jItems.length; + + //console.log("total " + total); + //console.log("current " + index); switch (dir) { case "up": @@ -115,11 +115,10 @@ $htmlHeadXtra[] = ' index = index - 1; }*/ var subItems = $(jItems[index - 1]).find("li.sub_item"); - var parentClass = $(jItems[index - 1]).parent().parent().attr("class"); - + var parentClass = $(jItems[index - 1]).parent().parent().attr("class"); var parentId = $(jItems[index]).parent().parent().attr("id"); var myParentId = $(jItems[index - 1]).parent().parent().attr("id"); - console.log(parentId + " - " + myParentId); + //console.log(parentId + " - " + myParentId); // We are brothers! if (parentId == myParentId) { @@ -129,23 +128,21 @@ $htmlHeadXtra[] = ' var lastItem = $(jItems[index - 1]).find("li.sub_item"); parentIndex = jItems.index(lastItem); console.log(parentIndex); - jItem.detach().insertAfter(lastItem); - - console.log("not classic"); + jItem.detach().insertAfter(lastItem); + //console.log("not classic"); } else { - console.log("classic"); + //console.log("classic"); jItem.detach().insertBefore(jItems[index - 1]); - } - + } break; } - console.log(parentClass); + //console.log(parentClass); if (parentClass == "record li_container") { // previous is a chapter var lastItem = $(jItems[index - 1]).parent().parent().find("li.li_container").last(); parentIndex = jItems.index(lastItem); - console.log(parentIndex); + //console.log(parentIndex); jItem.detach().insertAfter(jItems[parentIndex]); } else { jItem.detach().insertBefore(jItems[index - 1]); @@ -159,23 +156,22 @@ $htmlHeadXtra[] = ' var subItems = jItem.find("li.li_container"); if (subItems.length > 0) { index = subItems.length + index; - console.log("element is a chapter with items"); - - console.log("new index = " + index); + //console.log("element is a chapter with items"); + //console.log("new index = " + index); } var subItems = $(jItems[index + 1]).find("li.sub_item"); - console.log("next subItems.length: "+subItems.length); + //console.log("next subItems.length: "+subItems.length); // This is an element entering in a chapter if (subItems.length > 0) { // Check if im a child var parentClass = jItem.parent().parent().attr("class"); - console.log(parentClass); + //console.log(parentClass); if (parentClass == "record li_container") { // Parent position var parentIndex = jItems.index(jItem.parent().parent()); - console.log(jItem.parent().parent().attr("id")); - console.log(parentIndex); + //console.log(jItem.parent().parent().attr("id")); + //console.log(parentIndex); jItem.detach().insertAfter(jItems[parentIndex]); } else { jItem.detach().insertAfter(subItems); @@ -184,17 +180,17 @@ $htmlHeadXtra[] = ' } var currentSubItems = $(jItems[index]).parent().find("li.sub_item"); - console.log("currentSubItems"+currentSubItems.length); + //console.log("currentSubItems"+currentSubItems.length); var parentId = $(jItems[originIndex]).parent().parent().attr("id"); var myParentId = $(jItems[index + 1]).parent().parent().attr("id"); - console.log("parent ids: "+ parentId + " - " + myParentId); + //console.log("parent ids: "+ parentId + " - " + myParentId); // We are brothers! if (parentId == myParentId) { if ((index + 1) < total) { - console.log(index + 1); - console.log("We are brothers"); + //console.log(index + 1); + //console.log("We are brothers"); jItem.detach().insertAfter(jItems[index + 1]); } break; @@ -202,10 +198,10 @@ $htmlHeadXtra[] = ' if (currentSubItems.length > 0) { var parentIndex = jItems.index(jItem.parent().parent()); - console.log("has currentSubItems"); - console.log(jItem.parent().parent().attr("id")); - console.log(parentIndex); - if (parentIndex > 0) { + //console.log("has currentSubItems"); + //console.log("id " + jItem.parent().parent().attr("id")); + //console.log("parentIndex: " + parentIndex); + if (parentIndex >= 0) { jItem.detach().insertAfter(jItems[parentIndex]); break; } @@ -218,15 +214,15 @@ $htmlHeadXtra[] = ' } if ((index + 1) < total) { - console.log(index + 1); - console.log("changed"); + //console.log(index + 1); + //console.log("changed"); jItem.detach().insertAfter(jItems[index + 1]); } } break; } - console.log("rebuild"); + //console.log("rebuild"); buildLPtree($("#lp_item_list"), 0); var order = "new_order="+ newOrderData + "&a=update_lp_item_order"; From d98760dd88f8a1196a527beb51e74ef1305e74c7 Mon Sep 17 00:00:00 2001 From: Angel Fernando Quiroz Campos Date: Wed, 21 Aug 2019 16:14:11 -0500 Subject: [PATCH 04/12] Quiz: Don't update question positions when saving - refs BT#15996 --- main/exercise/exercise.class.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/main/exercise/exercise.class.php b/main/exercise/exercise.class.php index 4c0eb55406..6d520d6bec 100755 --- a/main/exercise/exercise.class.php +++ b/main/exercise/exercise.class.php @@ -1730,9 +1730,6 @@ class Exercise $this->save_categories_in_exercise($this->categories); - // Updates the question position - $this->update_question_positions(); - return $this->iId; } From f5feaecc2ef2c2a7b4f3eeebe85ef5e088dfda46 Mon Sep 17 00:00:00 2001 From: Angel Fernando Quiroz Campos Date: Wed, 21 Aug 2019 17:01:15 -0500 Subject: [PATCH 05/12] Quiz: Show complete question list on admin view - refs BT#15996 --- main/exercise/exercise.class.php | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/main/exercise/exercise.class.php b/main/exercise/exercise.class.php index 6d520d6bec..98165974df 100755 --- a/main/exercise/exercise.class.php +++ b/main/exercise/exercise.class.php @@ -1048,18 +1048,18 @@ class Exercise switch ($questionSelectionType) { case EX_Q_SELECTION_ORDERED: - $questionList = $this->getQuestionOrderedList(); + $questionList = $this->getQuestionOrderedList($adminView); break; case EX_Q_SELECTION_RANDOM: // Not a random exercise, or if there are not at least 2 questions if ($this->random == 0 || $nbQuestions < 2) { - $questionList = $this->getQuestionOrderedList(); + $questionList = $this->getQuestionOrderedList($adminView); } else { $questionList = $this->getRandomList($adminView); } break; default: - $questionList = $this->getQuestionOrderedList(); + $questionList = $this->getQuestionOrderedList($adminView); $result = $this->getQuestionListWithCategoryListFilteredByCategorySettings( $questionList, $questionSelectionType @@ -9652,9 +9652,11 @@ class Exercise /** * Gets the question list ordered by the question_order setting (drag and drop). * + * @param bool $adminView Optional. + * * @return array */ - private function getQuestionOrderedList() + private function getQuestionOrderedList($adminView = false) { $TBL_EXERCICE_QUESTION = Database::get_course_table(TABLE_QUIZ_TEST_QUESTION); $TBL_QUESTIONS = Database::get_course_table(TABLE_QUIZ_QUESTION); @@ -9690,8 +9692,13 @@ class Exercise $counter = 1; $questionList = []; while ($new_object = Database::fetch_object($result)) { - // Correct order. - $questionList[$new_object->question_order] = $new_object->question_id; + if (!$adminView) { + // Correct order. + $questionList[$new_object->question_order] = $new_object->question_id; + } else { + $questionList[$counter] = $new_object->question_id; + } + // Just in case we save the order in other array $temp_question_list[$counter] = $new_object->question_id; $counter++; From 509437e2579d79f753d2f5904872df6f740edb2f Mon Sep 17 00:00:00 2001 From: Angel Fernando Quiroz Campos Date: Fri, 23 Aug 2019 17:57:23 -0500 Subject: [PATCH 06/12] FormValidator return SelectAjax added - refs BT#15941 --- main/inc/lib/formvalidator/FormValidator.class.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/main/inc/lib/formvalidator/FormValidator.class.php b/main/inc/lib/formvalidator/FormValidator.class.php index e2430b6430..cb7268922c 100755 --- a/main/inc/lib/formvalidator/FormValidator.class.php +++ b/main/inc/lib/formvalidator/FormValidator.class.php @@ -262,14 +262,17 @@ EOT; * @param array $options * @param array $attributes * - * @throws + * @throws Exception + * + * @return HTML_QuickForm_element */ public function addSelectAjax($name, $label, $options = [], $attributes = []) { if (!isset($attributes['url'])) { throw new \Exception('select_ajax needs an URL'); } - $this->addElement( + + return $this->addElement( 'select_ajax', $name, $label, From fbadf1bf7f4684537384ed9ed741170c50beeea8 Mon Sep 17 00:00:00 2001 From: Angel Fernando Quiroz Campos Date: Mon, 26 Aug 2019 15:43:29 -0500 Subject: [PATCH 07/12] CKeditor: Fix oEmbed plugin - refs BT#16003 --- .../javascript/ckeditor/plugins/oembed/plugin.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/main/inc/lib/javascript/ckeditor/plugins/oembed/plugin.js b/main/inc/lib/javascript/ckeditor/plugins/oembed/plugin.js index 586f3ead5d..ed86872626 100644 --- a/main/inc/lib/javascript/ckeditor/plugins/oembed/plugin.js +++ b/main/inc/lib/javascript/ckeditor/plugins/oembed/plugin.js @@ -197,7 +197,7 @@ } if (elementAdded) { - if (closeDialog) { + if (closeDialog && CKEDITOR.dialog.getCurrent()) { CKEDITOR.dialog.getCurrent().hide(); } } @@ -223,9 +223,9 @@ minWidth: CKEDITOR.env.ie && CKEDITOR.env.quirks ? 568 : 550, minHeight: 155, onShow: function() { - var resizetype = this.getContentElement('general', 'resizeType').getValue(), - maxSizeBox = this.getContentElement('general', 'maxSizeBox').getElement(), - sizeBox = this.getContentElement('general', 'sizeBox').getElement(); + var resizetype = CKEDITOR.dialog.getCurrent().getContentElement('general', 'resizeType').getValue(), + maxSizeBox = CKEDITOR.dialog.getCurrent().getContentElement('general', 'maxSizeBox').getElement(), + sizeBox = CKEDITOR.dialog.getCurrent().getContentElement('general', 'sizeBox').getElement(); if (resizetype == 'noresize') { maxSizeBox.hide(); @@ -284,19 +284,19 @@ responsiveResize = false; } else { if (resizetype == "responsive") { - maxWidth = this.getContentElement('general', 'maxWidth'). + maxWidth = CKEDITOR.dialog.getCurrent().getContentElement('general', 'maxWidth'). getInputElement(). getValue(); - maxHeight = this.getContentElement('general', 'maxHeight'). + maxHeight = CKEDITOR.dialog.getCurrent().getContentElement('general', 'maxHeight'). getInputElement(). getValue(); responsiveResize = true; } else if (resizetype == "custom") { - maxWidth = this.getContentElement('general', 'width'). + maxWidth = CKEDITOR.dialog.getCurrent().getContentElement('general', 'width'). getInputElement(). getValue(); - maxHeight = this.getContentElement('general', 'height'). + maxHeight = CKEDITOR.dialog.getCurrent().getContentElement('general', 'height'). getInputElement(). getValue(); From 14001517782d6d5dd15255639e874bd14bc85cd6 Mon Sep 17 00:00:00 2001 From: Angel Fernando Quiroz Campos Date: Mon, 26 Aug 2019 16:04:10 -0500 Subject: [PATCH 08/12] CKEditor: Allow responsive Vimeo videos with oEmbed - refs BT#16003 --- .../inc/lib/javascript/ckeditor/plugins/oembed/plugin.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/main/inc/lib/javascript/ckeditor/plugins/oembed/plugin.js b/main/inc/lib/javascript/ckeditor/plugins/oembed/plugin.js index ed86872626..1f03e0caf5 100644 --- a/main/inc/lib/javascript/ckeditor/plugins/oembed/plugin.js +++ b/main/inc/lib/javascript/ckeditor/plugins/oembed/plugin.js @@ -148,6 +148,12 @@ } function embedCode(url, instance, closeDialog, maxWidth, maxHeight, responsiveResize, widget) { + var extraProviderParams = {}; + + if (responsiveResize) { + extraProviderParams.responsive = true; + } + jQuery('body').oembed(url, { onEmbed: function(e) { var codeElement, @@ -213,7 +219,8 @@ maxHeight: maxHeight, maxWidth: maxWidth, useResponsiveResize: responsiveResize, - embedMethod: 'editor' + embedMethod: 'editor', + 'vimeo': extraProviderParams }); } From 58d67bf87aaa029034e2e24056c9b693fe19f1b0 Mon Sep 17 00:00:00 2001 From: Angel Fernando Quiroz Campos Date: Tue, 27 Aug 2019 16:27:27 -0500 Subject: [PATCH 09/12] Ckeditor: Allow add video responsive with Video plugin - refs BT#16003 --- .../ckeditor/plugins/video/dialogs/video.js | 109 ++++++++++++------ .../ckeditor/plugins/video/plugin.js | 15 ++- 2 files changed, 88 insertions(+), 36 deletions(-) diff --git a/main/inc/lib/javascript/ckeditor/plugins/video/dialogs/video.js b/main/inc/lib/javascript/ckeditor/plugins/video/dialogs/video.js index e2c05d696e..c08edb281b 100644 --- a/main/inc/lib/javascript/ckeditor/plugins/video/dialogs/video.js +++ b/main/inc/lib/javascript/ckeditor/plugins/video/dialogs/video.js @@ -38,14 +38,17 @@ CKEDITOR.dialog.add( 'video', function ( editor ) return; switch( this.id ) { + case 'responsive': + videoNode.addClass('embed-responsive-item'); + break; case 'poster': extraStyles.backgroundImage = 'url(' + value + ')'; break; case 'width': - extraStyles.width = value + 'px'; + extraStyles.width = value.indexOf('%') > 0 ? '100%' : ( value + 'px'); break; case 'height': - extraStyles.height = value + 'px'; + extraStyles.height = value.indexOf('%') > 0 ? '100%' : ( value + 'px'); break; } } @@ -176,6 +179,15 @@ CKEDITOR.dialog.add( 'video', function ( editor ) } var extraStyles = {}, videos = []; + var responsive = this.getValueOf('info', 'responsive'); + + videoNode.removeClass('embed-responsive-item'); + + if (responsive) { + this.setValueOf('info', 'width', '100%'); + this.setValueOf('info', 'height', '100%'); + } + this.commitContent( videoNode, extraStyles, videos ); var innerHtml = '', links = '', @@ -191,6 +203,7 @@ CKEDITOR.dialog.add( 'video', function ( editor ) } videoNode.setHtml( innerHtml + fallbackTemplate.replace( '%links%', links ) ); + var responsiveParent = null; // Refresh the fake image. var newFakeImage = editor.createFakeElement( videoNode, 'cke_video', 'video', false ); newFakeImage.setStyles( extraStyles ); @@ -198,6 +211,13 @@ CKEDITOR.dialog.add( 'video', function ( editor ) { newFakeImage.replace( this.fakeImage ); editor.getSelection().selectElement( newFakeImage ); + + if (responsive) { + responsiveParent = newFakeImage.getParent(); + responsiveParent.removeClass('embed-responsive'); + responsiveParent.removeClass('embed-responsive-16by9'); + responsiveParent.removeClass('embed-responsive-4by3'); + } } else { @@ -205,6 +225,21 @@ CKEDITOR.dialog.add( 'video', function ( editor ) var div = new CKEDITOR.dom.element( 'DIV', editor.document ); editor.insertElement( div ); div.append( newFakeImage ); + + responsiveParent = div; + } + + if (responsive) { + responsiveParent.addClass('embed-responsive'); + + switch (responsive) { + case '16by9': + responsiveParent.addClass('embed-responsive-16by9'); + break; + case '4by3': + responsiveParent.addClass('embed-responsive-4by3'); + break; + } } }, onHide : function() @@ -226,37 +261,6 @@ CKEDITOR.dialog.add( 'video', function ( editor ) label: lang.infoLabel, elements : [ - { - type : 'hbox', - widths: [ '33%', '33%', '33%'], - children : [ - { - type : 'text', - id : 'width', - label : editor.lang.common.width, - 'default' : 400, - validate : CKEDITOR.dialog.validate.notEmpty( lang.widthRequired ), - commit : commitValue, - setup : loadValue - }, - { - type : 'text', - id : 'height', - label : editor.lang.common.height, - 'default' : 300, - //validate : CKEDITOR.dialog.validate.notEmpty(lang.heightRequired ), - commit : commitValue, - setup : loadValue - }, - { - type : 'text', - id : 'id', - label : 'Id', - commit : commitValue, - setup : loadValue - } - ] - }, { type : 'hbox', widths: [ '', '100px', '75px'], @@ -375,6 +379,45 @@ CKEDITOR.dialog.add( 'video', function ( editor ) }, label : editor.lang.common.browseServer }] + }, + { + type : 'hbox', + widths: [ '33%', '33%', '33%'], + children : [ + { + type : 'text', + id : 'width', + label : editor.lang.common.width, + 'default' : 400, + validate : CKEDITOR.dialog.validate.notEmpty( lang.widthRequired ), + commit : commitValue, + setup : loadValue + }, + { + type : 'text', + id : 'height', + label : editor.lang.common.height, + 'default' : 300, + //validate : CKEDITOR.dialog.validate.notEmpty(lang.heightRequired ), + commit : commitValue, + setup : loadValue + }, + { + type : 'text', + id : 'id', + label : 'Id', + commit : commitValue, + setup : loadValue + } + ] + }, + { + type: 'radio', + id: 'responsive', + label: lang.responsive, + items: [ [ lang.ratio16by9, '16by9' ], [ lang.ratio4by3, '4by3' ] ], + commit : commitValue, + setup : loadValue } ] }, diff --git a/main/inc/lib/javascript/ckeditor/plugins/video/plugin.js b/main/inc/lib/javascript/ckeditor/plugins/video/plugin.js index 17c12672c7..d70cf7e086 100644 --- a/main/inc/lib/javascript/ckeditor/plugins/video/plugin.js +++ b/main/inc/lib/javascript/ckeditor/plugins/video/plugin.js @@ -183,7 +183,10 @@ var en = { infoLabel: 'Information', html360: 'This feature (only MP4 videos) is currently still in BETA mode.
It only works on dynamic pages, not inside documents created
in the documents tool or seen through learning paths.
Please do not add more than one 360° video on a single page
as more than one on the same page might generate conflicts.', video360: 'Enable 360° video player', - video360stereo: 'Stereo video (1:1 aspect ratio)' + video360stereo: 'Stereo video (1:1 aspect ratio)', + responsive: 'Resposive size (mobile-optimized)', + ratio16by9: '16:9 aspect ratio', + ratio4by3: '4:3 aspect ratio' }; var es = { @@ -201,7 +204,10 @@ var es = { infoLabel: 'Información', html360: 'Esta funcionalidad (sólo MP4) todavía se encuentra en modo BETA.
Sólo funciona en páginas dinámicas, mas no dentro de documentos
creados en la herramienta de documentos o visualizados a través
de las lecciones.
Por favor no colocar más de un vídeo 360° en una misma página
ya que puede provocar conflictos y bloquearlos todos.', video360: 'Habilitar reproductor de vídeo 360°', - video360stereo: 'Vídeo estéreo (relación de aspecto 1:1)' + video360stereo: 'Vídeo estéreo (relación de aspecto 1:1)', + responsive: 'Tamaño adaptable (tamaño optimizado para móviles)', + ratio16by9: 'Relación de aspecto 16:9', + ratio4by3: 'Relación de aspecto 4:3' }; var fr = { @@ -219,7 +225,10 @@ var fr = { infoLabel: 'Information', html360: 'Cette fonctionnalité (MP4 uniquement) est actuellement en mode BETA.
Elle ne fonctionne que sur les pages dynamiques, et pas
dans les documents créés à partir de l\'outil document ou visualisés
au travers de l\'outil parcours.
Merci de ne pas placer plus d\'une vidéo 360° par page. Cela
peut causer des conflits et toutes les rendre inactives.', video360: 'Activer la visualisation 360°', - video360stereo: 'Vidéo stéréo (proportions 1:1 / apparence de 2 vidéos superposées)' + video360stereo: 'Vidéo stéréo (proportions 1:1 / apparence de 2 vidéos superposées)', + responsive: 'Resposive', + ratio16by9: '16:9 aspect ratio', + ratio4by3: '4:3 aspect ratio' }; // v3 From d868d51f73bd8d7ae0384aec87e8ab267f361c4a Mon Sep 17 00:00:00 2001 From: Yannick Warnier Date: Wed, 28 Aug 2019 16:55:28 +0200 Subject: [PATCH 10/12] Fix issue linking external career names in automated CSV import of calendar events - refs BT#15628 --- main/cron/import_csv.php | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/main/cron/import_csv.php b/main/cron/import_csv.php index 0bb0e7301f..9921f94004 100755 --- a/main/cron/import_csv.php +++ b/main/cron/import_csv.php @@ -1429,20 +1429,26 @@ class ImportCsv $courseTitle = $courseInfo['title']; + // Get the value of the "careerid" extra field of this + // session $sessionExtraFieldValue = new ExtraFieldValue('session'); - $values = $sessionExtraFieldValue->get_values_by_handler_and_field_variable( + $externalCareerId = $sessionExtraFieldValue->get_values_by_handler_and_field_variable( $event['session_id'], - $this->extraFieldIdNameList['session_career'] + 'careerid' + ); + $externalCareerId = substr($externalCareerId, 1, -1); + + // Using the external_career_id field (from above), + // find the career ID + $careerExtraFieldValue = new ExtraFieldValue('career'); + $careerId = $careerExtraFieldValue->get_item_id_from_field_variable_and_field_value( + 'external_career_id', + $externalCareerId ); - $careerName = ''; - if (!empty($values)) { - foreach ($values as $value) { - if (isset($value['value'])) { - $careerName = $value['value']; - } - } - } + $career = new Career(); + $career = $career->find($careerId); + $careerName = $career['name']; $subject = sprintf( get_lang('WelcomeToPortalXInCourseSessionX'), From dfd5bc8d7ce1feac4b1f678f2eaddf4cd56237af Mon Sep 17 00:00:00 2001 From: Yannick Warnier Date: Wed, 28 Aug 2019 17:56:12 +0200 Subject: [PATCH 11/12] Fix issue linking external career names in automated CSV import of calendar events (2/2) - refs BT#15628 --- main/cron/import_csv.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/main/cron/import_csv.php b/main/cron/import_csv.php index 9921f94004..3dec5776a7 100755 --- a/main/cron/import_csv.php +++ b/main/cron/import_csv.php @@ -1436,18 +1436,21 @@ class ImportCsv $event['session_id'], 'careerid' ); - $externalCareerId = substr($externalCareerId, 1, -1); + $externalCareerId = $externalCareerId['value']; + if (substr($externalCareerId, 0, 1) === '[') { + $externalCareerId = substr($externalCareerId, 1, -1); + } // Using the external_career_id field (from above), // find the career ID $careerExtraFieldValue = new ExtraFieldValue('career'); - $careerId = $careerExtraFieldValue->get_item_id_from_field_variable_and_field_value( + $careerValue = $careerExtraFieldValue->get_item_id_from_field_variable_and_field_value( 'external_career_id', $externalCareerId ); $career = new Career(); - $career = $career->find($careerId); + $career = $career->find($careerValue['item_id']); $careerName = $career['name']; $subject = sprintf( From 2eeabfa3a2cc1e32f080ff3e200d86949784cc7b Mon Sep 17 00:00:00 2001 From: Yannick Warnier Date: Wed, 28 Aug 2019 18:43:23 +0200 Subject: [PATCH 12/12] Allow more than one career to be printed in mails sent from events in import_csv.php - refs BT#15628 --- main/cron/import_csv.php | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/main/cron/import_csv.php b/main/cron/import_csv.php index 3dec5776a7..7973d7a40b 100755 --- a/main/cron/import_csv.php +++ b/main/cron/import_csv.php @@ -1432,26 +1432,36 @@ class ImportCsv // Get the value of the "careerid" extra field of this // session $sessionExtraFieldValue = new ExtraFieldValue('session'); - $externalCareerId = $sessionExtraFieldValue->get_values_by_handler_and_field_variable( + $externalCareerIdList = $sessionExtraFieldValue->get_values_by_handler_and_field_variable( $event['session_id'], 'careerid' ); - $externalCareerId = $externalCareerId['value']; - if (substr($externalCareerId, 0, 1) === '[') { - $externalCareerId = substr($externalCareerId, 1, -1); + $externalCareerIdList = $externalCareerIdList['value']; + $externalCareerIds = []; + if (substr($externalCareerIdList, 0, 1) === '[') { + $externalCareerIdList = substr($externalCareerIdList, 1, -1); + $externalCareerIds = preg_split('/,/',$externalCareerIdList); + } else { + $externalCareerIds = [$externalCareerIdList]; } - // Using the external_career_id field (from above), - // find the career ID $careerExtraFieldValue = new ExtraFieldValue('career'); - $careerValue = $careerExtraFieldValue->get_item_id_from_field_variable_and_field_value( - 'external_career_id', - $externalCareerId - ); - $career = new Career(); - $career = $career->find($careerValue['item_id']); - $careerName = $career['name']; + $careerName = ''; + + // Concat the names of each career linked to this session + foreach ($externalCareerIds as $externalCareerId) { + // Using the external_career_id field (from above), + // find the career ID + $careerValue = $careerExtraFieldValue->get_item_id_from_field_variable_and_field_value( + 'external_career_id', + $externalCareerId + ); + $career = $career->find($careerValue['item_id']); + $careerName .= $career['name'].', '; + } + // Remove trailing comma + $careerName = substr($careerName, 0, -2); $subject = sprintf( get_lang('WelcomeToPortalXInCourseSessionX'),