diff --git a/public/lib/javascript-static.js b/public/lib/javascript-static.js
index c581376d533..e7147195900 100644
--- a/public/lib/javascript-static.js
+++ b/public/lib/javascript-static.js
@@ -826,6 +826,7 @@ M.util.add_spinner = function(Y, node) {
var spinner = Y.Node.create('
')
.setAttribute('src', M.util.image_url(WAITICON.pix, WAITICON.component))
+ .setAttribute('alt', M.util.get_string('loading', 'core'))
.addClass('spinner icon')
.hide();
diff --git a/public/lib/yui/build/moodle-core-dragdrop/moodle-core-dragdrop-debug.js b/public/lib/yui/build/moodle-core-dragdrop/moodle-core-dragdrop-debug.js
index 0d0613b4271..9883e6137a9 100644
--- a/public/lib/yui/build/moodle-core-dragdrop/moodle-core-dragdrop-debug.js
+++ b/public/lib/yui/build/moodle-core-dragdrop/moodle-core-dragdrop-debug.js
@@ -183,6 +183,7 @@ Y.extend(DRAGDROP, Y.Base, {
var dragelement = Y.Node.create('')
.addClass(classname)
.setAttribute('title', title)
+ .setAttribute('aria-label', title)
.setAttribute('tabIndex', 0)
.setAttribute('data-draggroups', this.groups)
.setAttribute('role', 'button');
diff --git a/public/lib/yui/build/moodle-core-dragdrop/moodle-core-dragdrop-min.js b/public/lib/yui/build/moodle-core-dragdrop/moodle-core-dragdrop-min.js
index 19dffe2c308..51c5acb1843 100644
--- a/public/lib/yui/build/moodle-core-dragdrop/moodle-core-dragdrop-min.js
+++ b/public/lib/yui/build/moodle-core-dragdrop/moodle-core-dragdrop-min.js
@@ -1,2 +1,2 @@
-YUI.add("moodle-core-dragdrop",function(h,t){var d="moodle-core-dragdrop-draghandle",e=function(){e.superclass.constructor.apply(this,arguments)};h.extend(e,h.Base,{goingup:null,absgoingup:null,samenodeclass:null,parentnodeclass:null,samenodelabel:null,parentnodelabel:null,groups:[],lastdroptarget:null,detectkeyboarddirection:!1,listeners:null,initializer:function(){this.listeners=[],this.listeners.push(h.DD.DDM.on("drag:start",this.global_drag_start,this)),this.listeners.push(h.DD.DDM.on("drag:over",this.globalDragOver,this)),this.listeners.push(h.DD.DDM.on("drag:end",this.global_drag_end,this)),this.listeners.push(h.DD.DDM.on("drag:drag",this.global_drag_drag,this)),this.listeners.push(h.DD.DDM.on("drop:over",this.global_drop_over,this)),this.listeners.push(h.DD.DDM.on("drop:hit",this.global_drop_hit,this)),this.listeners.push(h.DD.DDM.on("drag:dropmiss",this.global_drag_dropmiss,this)),this.listeners.push(h.one(h.config.doc.body).delegate("key",this.global_keydown,"down:32, enter, esc","."+d,this)),this.listeners.push(h.one(h.config.doc.body).delegate("click",this.global_keydown,"."+d,this))},destructor:function(){new h.EventHandle(this.listeners).detach()},get_drag_handle:function(t,e,o){var r=h.Node.create("").addClass(e).setAttribute("title",t).setAttribute("tabIndex",0).setAttribute("data-draggroups",this.groups).setAttribute("role","button");return r.addClass(d),window.require(["core/templates"],function(t){t.renderPix("i/move_2d","core").then(function(t){t=h.Node.create(t);t.setStyle("cursor","move"),void 0!==o&&t.addClass(o),r.appendChild(t)})}),r},lock_drag_handle:function(t,e){t.removeHandle("."+e)},unlock_drag_handle:function(t,e){t.addHandle("."+e),t.get("activeHandle").focus()},ajax_failure:function(t){t={name:t.status+" "+t.statusText,message:t.responseText};return new M.core.exception(t)},in_group:function(e){var o=!1;return h.each(this.groups,function(t){e._groups[t]&&(o=!0)},this),o},global_drag_start:function(t){var e=t.target;this.in_group(e)&&(this.originalstyle=e.get("node").getAttribute("style"),e.get("node").setStyle("opacity",".25"),e.get("dragNode").setStyles({opacity:".75",borderColor:e.get("node").getStyle("borderColor"),backgroundColor:e.get("node").getStyle("backgroundColor")}),e.get("dragNode").empty(),this.drag_start(t))},globalDragOver:function(t){this.dragOver(t)},global_drag_end:function(t){var e=t.target;this.in_group(e)&&(e.get("node").setAttribute("style",this.originalstyle),this.drag_end(t))},global_drag_drag:function(t){var e=t.target,o=t.info;this.in_group(e)&&(o.start[1]o.xy[1]&&(this.absgoingup=!1),o.delta[1]<0?this.goingup=!0:0")).addClass("dragdrop-keyboard-drag ps-2"),h.all("."+this.samenodeclass+", ."+this.parentnodeclass).each(function(t){var e,o,r,a=!1,n=t,i=t.getAttribute("class").split(" ").join(", .");if(t.drop&&t.drop.inGroup(this.groups)&&t.drop.get("node")!==d&&(t.next(i)!==d||this.detectkeyboarddirection))a=!0;else for(e=t.getAttribute("data-draggroups").split(" "),o=0;o"),p=h.Node.create(""),s=this.find_element_text(n),u=this.samenodelabel&&t.hasClass(this.samenodeclass)?M.util.get_string(this.samenodelabel.identifier,this.samenodelabel.component,s):this.parentnodelabel&&t.hasClass(this.parentnodeclass)?M.util.get_string(this.parentnodelabel.identifier,this.parentnodelabel.component,s):M.util.get_string("tocontent","moodle",s),p.setContent(u),p.setAttribute("class","aalink d-inline-block mw-100 text-truncate"),p.setAttribute("data-drop-target",t.get("id")),p.setAttribute("tabindex","0"),p.setAttribute("role","button"),p.on("click",this.global_keyboard_drop,this),p.on("key",this.global_keyboard_drop,"down:enter,32",this),g.append(p),l.append(g))},this),M.core.dragdrop.dropui=new M.core.dialogue({headerContent:e,bodyContent:l,draggable:!0,visible:!0,center:!0,modal:!0}),M.core.dragdrop.dropui.after("visibleChange",function(t){t.prevVal&&!t.newVal&&this.global_cancel_keyboard_drag()},this),l.one("a")&&l.one("a").focus()},simulated_drag_drop_event:function(t,e){var o=function(t){this.node=t};o.prototype.get=function(t){return"node"===t||"dragNode"===t||"dropNode"===t?this.node:"activeHandle"===t?this.node.one(".editing_move"):null},o.prototype.inGroup=function(){return!0},o.prototype.addHandle=function(){},o.prototype.removeHandle=function(){},this.drop=new o(e),this.drag=new o(t),this.target=this.drop},global_keyboard_drop:function(t){var e,
-o=M.core.dragdrop.keydragcontainer,r=h.one("#"+t.target.getAttribute("data-drop-target"));M.core.dragdrop.dropui.hide(),t.preventDefault(),this.detectkeyboarddirection&&o.getY()>r.getY()?(this.absgoingup=!0,this.goingup=!0):(this.absgoingup=!1,this.goingup=!1),t=new this.simulated_drag_drop_event(o,o),e=new this.simulated_drag_drop_event(o,r),this.drag_start(t),this.global_drop_over(e),r.hasClass(this.parentnodeclass)&&r.contains(o)&&r.prepend(o),this.global_drop_hit(e)},global_cancel_keyboard_drag:function(){M.core.dragdrop.keydragcontainer&&(M.core.dragdrop.keydraghandle.focus(),M.core.dragdrop.keydragcontainer=null),M.core.dragdrop.dropui&&M.core.dragdrop.dropui.destroy()},global_keydown:function(t){var e,o,r,a,n,i=t.target.ancestor("."+d,!0);if(null!==i){if(27===t.keyCode)return this.global_cancel_keyboard_drag(),void t.preventDefault();if(i.hasClass(d)&&(13===t.keyCode||32===t.keyCode||"click"===t.type)){for(o=i.getAttribute("data-draggroups").split(" "),n=!1,r=0;r").addClass(e).setAttribute("title",t).setAttribute("aria-label",t).setAttribute("tabIndex",0).setAttribute("data-draggroups",this.groups).setAttribute("role","button");return o.addClass(d),window.require(["core/templates"],function(t){t.renderPix("i/move_2d","core").then(function(t){t=h.Node.create(t);t.setStyle("cursor","move"),void 0!==r&&t.addClass(r),o.appendChild(t)})}),o},lock_drag_handle:function(t,e){t.removeHandle("."+e)},unlock_drag_handle:function(t,e){t.addHandle("."+e),t.get("activeHandle").focus()},ajax_failure:function(t){t={name:t.status+" "+t.statusText,message:t.responseText};return new M.core.exception(t)},in_group:function(e){var r=!1;return h.each(this.groups,function(t){e._groups[t]&&(r=!0)},this),r},global_drag_start:function(t){var e=t.target;this.in_group(e)&&(this.originalstyle=e.get("node").getAttribute("style"),e.get("node").setStyle("opacity",".25"),e.get("dragNode").setStyles({opacity:".75",borderColor:e.get("node").getStyle("borderColor"),backgroundColor:e.get("node").getStyle("backgroundColor")}),e.get("dragNode").empty(),this.drag_start(t))},globalDragOver:function(t){this.dragOver(t)},global_drag_end:function(t){var e=t.target;this.in_group(e)&&(e.get("node").setAttribute("style",this.originalstyle),this.drag_end(t))},global_drag_drag:function(t){var e=t.target,r=t.info;this.in_group(e)&&(r.start[1]r.xy[1]&&(this.absgoingup=!1),r.delta[1]<0?this.goingup=!0:0")).addClass("dragdrop-keyboard-drag ps-2"),h.all("."+this.samenodeclass+", ."+this.parentnodeclass).each(function(t){var e,r,o,a=!1,n=t,i=t.getAttribute("class").split(" ").join(", .");if(t.drop&&t.drop.inGroup(this.groups)&&t.drop.get("node")!==d&&(t.next(i)!==d||this.detectkeyboarddirection))a=!0;else for(e=t.getAttribute("data-draggroups").split(" "),r=0;r"),p=h.Node.create(""),s=this.find_element_text(n),u=this.samenodelabel&&t.hasClass(this.samenodeclass)?M.util.get_string(this.samenodelabel.identifier,this.samenodelabel.component,s):this.parentnodelabel&&t.hasClass(this.parentnodeclass)?M.util.get_string(this.parentnodelabel.identifier,this.parentnodelabel.component,s):M.util.get_string("tocontent","moodle",s),p.setContent(u),p.setAttribute("class","aalink d-inline-block mw-100 text-truncate"),p.setAttribute("data-drop-target",t.get("id")),p.setAttribute("tabindex","0"),p.setAttribute("role","button"),p.on("click",this.global_keyboard_drop,this),p.on("key",this.global_keyboard_drop,"down:enter,32",this),g.append(p),l.append(g))},this),M.core.dragdrop.dropui=new M.core.dialogue({headerContent:e,bodyContent:l,draggable:!0,visible:!0,center:!0,modal:!0}),M.core.dragdrop.dropui.after("visibleChange",function(t){t.prevVal&&!t.newVal&&this.global_cancel_keyboard_drag()},this),l.one("a")&&l.one("a").focus()},simulated_drag_drop_event:function(t,e){var r=function(t){this.node=t};r.prototype.get=function(t){return"node"===t||"dragNode"===t||"dropNode"===t?this.node:"activeHandle"===t?this.node.one(".editing_move"):null},r.prototype.inGroup=function(){return!0},r.prototype.addHandle=function(){},r.prototype.removeHandle=function(){},this.drop=new r(e),this.drag=new r(t),this.target=this.drop},global_keyboard_drop:function(t){
+var e,r=M.core.dragdrop.keydragcontainer,o=h.one("#"+t.target.getAttribute("data-drop-target"));M.core.dragdrop.dropui.hide(),t.preventDefault(),this.detectkeyboarddirection&&r.getY()>o.getY()?(this.absgoingup=!0,this.goingup=!0):(this.absgoingup=!1,this.goingup=!1),t=new this.simulated_drag_drop_event(r,r),e=new this.simulated_drag_drop_event(r,o),this.drag_start(t),this.global_drop_over(e),o.hasClass(this.parentnodeclass)&&o.contains(r)&&o.prepend(r),this.global_drop_hit(e)},global_cancel_keyboard_drag:function(){M.core.dragdrop.keydragcontainer&&(M.core.dragdrop.keydraghandle.focus(),M.core.dragdrop.keydragcontainer=null),M.core.dragdrop.dropui&&M.core.dragdrop.dropui.destroy()},global_keydown:function(t){var e,r,o,a,n,i=t.target.ancestor("."+d,!0);if(null!==i){if(27===t.keyCode)return this.global_cancel_keyboard_drag(),void t.preventDefault();if(i.hasClass(d)&&(13===t.keyCode||32===t.keyCode||"click"===t.type)){for(r=i.getAttribute("data-draggroups").split(" "),n=!1,o=0;o')
.addClass(classname)
.setAttribute('title', title)
+ .setAttribute('aria-label', title)
.setAttribute('tabIndex', 0)
.setAttribute('data-draggroups', this.groups)
.setAttribute('role', 'button');
diff --git a/public/lib/yui/src/dragdrop/js/dragdrop.js b/public/lib/yui/src/dragdrop/js/dragdrop.js
index b93cc627ec1..b03b000cfef 100644
--- a/public/lib/yui/src/dragdrop/js/dragdrop.js
+++ b/public/lib/yui/src/dragdrop/js/dragdrop.js
@@ -181,6 +181,7 @@ Y.extend(DRAGDROP, Y.Base, {
var dragelement = Y.Node.create('')
.addClass(classname)
.setAttribute('title', title)
+ .setAttribute('aria-label', title)
.setAttribute('tabIndex', 0)
.setAttribute('data-draggroups', this.groups)
.setAttribute('role', 'button');
diff --git a/public/mod/quiz/classes/output/edit_renderer.php b/public/mod/quiz/classes/output/edit_renderer.php
index ce4277983f6..3114eab3611 100644
--- a/public/mod/quiz/classes/output/edit_renderer.php
+++ b/public/mod/quiz/classes/output/edit_renderer.php
@@ -101,8 +101,11 @@ class edit_renderer extends \plugin_renderer_base {
if ($structure->is_last_section($section)) {
$output .= \html_writer::start_div('last-add-menu');
- $output .= html_writer::tag('span', $this->add_menu_actions($structure, 0,
- $pageurl, $contexts, $pagevars), ['class' => 'add-menu-outer']);
+ $output .= html_writer::tag(
+ 'span',
+ $this->add_menu_actions($structure, 0, $pageurl, $contexts, $pagevars),
+ ['class' => 'add-menu-outer pe-3']
+ );
$output .= \html_writer::end_div();
}
@@ -588,9 +591,11 @@ class edit_renderer extends \plugin_renderer_base {
if ($structure->is_first_slot_on_page($slot)) {
// Add the add-menu at the page level.
- $addmenu = html_writer::tag('span', $this->add_menu_actions($structure,
- $pagenumber, $pageurl, $contexts, $pagevars),
- ['class' => 'add-menu-outer']);
+ $addmenu = html_writer::tag(
+ 'span',
+ $this->add_menu_actions($structure, $pagenumber, $pageurl, $contexts, $pagevars),
+ ['class' => 'add-menu-outer pe-2']
+ );
$addquestionform = $this->add_question_form($structure,
$pagenumber, $pageurl, $pagevars);
@@ -889,9 +894,15 @@ class edit_renderer extends \plugin_renderer_base {
* @return string The markup for the move action.
*/
public function question_move_icon(structure $structure, $slot) {
- return html_writer::link(new \moodle_url('#'),
- $this->pix_icon('i/dragdrop', get_string('move'), 'moodle', ['class' => 'iconsmall', 'title' => '']),
- ['class' => 'editing_move', 'data-action' => 'move']
+ $slotnumber = $structure->get_displayed_number_for_slot($slot);
+ return html_writer::link(
+ new \moodle_url('#'),
+ $this->pix_icon('i/dragdrop', '', 'moodle', ['class' => 'iconsmall']),
+ [
+ 'class' => 'editing_move',
+ 'data-action' => 'move',
+ 'aria-label' => get_string('movequestionnumber', 'quiz', $slotnumber),
+ ]
);
}
@@ -983,13 +994,14 @@ class edit_renderer extends \plugin_renderer_base {
$url = new \moodle_url('repaginate.php', ['quizid' => $structure->get_quizid(),
'slot' => $slot, 'repag' => $insertpagebreak ? 2 : 1, 'sesskey' => sesskey()]);
+ $slotname = $structure->get_displayed_number_for_slot($slot);
if ($insertpagebreak) {
- $title = get_string('addpagebreak', 'quiz');
- $image = $this->image_icon('e/insert_page_break', $title);
+ $title = get_string('addpagebreakafter', 'quiz', $slotname);
+ $image = $this->image_icon('e/insert_page_break', '');
$action = 'addpagebreak';
} else {
- $title = get_string('removepagebreak', 'quiz');
- $image = $this->image_icon('e/remove_page_break', $title);
+ $title = get_string('removepagebreakafter', 'quiz', $slotname);
+ $image = $this->image_icon('e/remove_page_break', '');
$action = 'removepagebreak';
}
@@ -998,9 +1010,22 @@ class edit_renderer extends \plugin_renderer_base {
if (!$structure->can_be_edited()) {
$disabled = 'disabled';
}
- return html_writer::span($this->action_link($url, $image, null, ['title' => $title,
- 'class' => 'page_split_join cm-edit-action', 'disabled' => $disabled, 'data-action' => $action]),
- 'page_split_join_wrapper');
+ return html_writer::span(
+ $this->action_link(
+ $url,
+ $image,
+ null,
+ [
+ 'title' => $title,
+ 'aria-label' => $title,
+ 'class' => 'page_split_join cm-edit-action btn btn-sm icon-no-margin',
+ 'disabled' => $disabled,
+ 'data-action' => $action,
+ 'role' => 'button',
+ ]
+ ),
+ 'page_split_join_wrapper'
+ );
}
/**
@@ -1018,13 +1043,11 @@ class edit_renderer extends \plugin_renderer_base {
];
if ($structure->is_question_dependent_on_previous_slot($slot)) {
$title = get_string('questiondependencyremove', 'quiz', $a);
- $image = $this->pix_icon('t/locked', get_string('questiondependsonprevious', 'quiz'),
- 'moodle', ['title' => '']);
+ $image = $this->pix_icon('t/locked', '');
$action = 'removedependency';
} else {
$title = get_string('questiondependencyadd', 'quiz', $a);
- $image = $this->pix_icon('t/unlocked', get_string('questiondependencyfree', 'quiz'),
- 'moodle', ['title' => '']);
+ $image = $this->pix_icon('t/unlocked', '');
$action = 'adddependency';
}
@@ -1037,9 +1060,22 @@ class edit_renderer extends \plugin_renderer_base {
if (!$structure->can_question_depend_on_previous_slot($slot)) {
$extraclass = ' question_dependency_cannot_depend';
}
- return html_writer::span($this->action_link('#', $image, null, ['title' => $title,
- 'class' => 'cm-edit-action', 'disabled' => $disabled, 'data-action' => $action]),
- 'question_dependency_wrapper' . $extraclass);
+ return html_writer::span(
+ $this->action_link(
+ '#',
+ $image,
+ null,
+ [
+ 'title' => $title,
+ 'aria-label' => $title,
+ 'class' => 'cm-edit-action btn btn-link btn-sm icon-no-margin',
+ 'disabled' => $disabled,
+ 'data-action' => $action,
+ 'role' => 'button',
+ ]
+ ),
+ 'question_dependency_wrapper' . $extraclass
+ );
}
/**
@@ -1303,7 +1339,7 @@ class edit_renderer extends \plugin_renderer_base {
], 'moodle');
$this->page->requires->strings_for_js([
- 'addpagebreak',
+ 'addpagebreakafter',
'cannotremoveallsectionslots',
'cannotremoveslots',
'confirmremovesectionheading',
@@ -1314,7 +1350,7 @@ class edit_renderer extends \plugin_renderer_base {
'sectionheadingedit',
'sectionheadingremove',
'sectionnoname',
- 'removepagebreak',
+ 'removepagebreakafter',
'questiondependencyadd',
'questiondependencyfree',
'questiondependencyremove',
diff --git a/public/mod/quiz/lang/en/quiz.php b/public/mod/quiz/lang/en/quiz.php
index 6292e0be533..2235291e18b 100644
--- a/public/mod/quiz/lang/en/quiz.php
+++ b/public/mod/quiz/lang/en/quiz.php
@@ -44,6 +44,7 @@ $string['addnewpagesafterselected'] = 'Add new pages after selected questions';
$string['addnewquestionsqbank'] = 'Add questions to the category {$a->catname}: {$a->link}';
$string['addnewuseroverride'] = 'Add user override';
$string['addpagebreak'] = 'Add page break';
+$string['addpagebreakafter'] = 'Add page break after question {$a}';
$string['addpagehere'] = 'Add page here';
$string['addquestion'] = 'Add question';
$string['addquestionfrombankatend'] = 'Add from the question bank at the end';
@@ -583,6 +584,7 @@ Quizzes may be used
* For self-assessment';
$string['modulename_link'] = 'mod/quiz/view';
$string['modulenameplural'] = 'Quizzes';
+$string['movequestionnumber'] = 'Move question: {$a}';
$string['moveselectedonpage'] = 'Move selected questions to page: {$a}';
$string['multichoice'] = 'Multiple choice';
$string['multipleanswers'] = 'Choose at least one answer.';
@@ -901,6 +903,7 @@ $string['removeallquizattempts'] = 'All quiz attempts';
$string['removealluseroverrides'] = 'All user overrides';
$string['removeemptypage'] = 'Remove empty page';
$string['removepagebreak'] = 'Remove page break';
+$string['removepagebreakafter'] = 'Remove page break after question {$a}';
$string['removeselected'] = 'Remove selected';
$string['rename'] = 'Rename';
$string['renderingserverconnectfailed'] = 'The server {$a} failed to process an RQP request. Check that the URL is correct.';
diff --git a/public/mod/quiz/styles.css b/public/mod/quiz/styles.css
index 33ab3fe8db2..9aad4c6e943 100644
--- a/public/mod/quiz/styles.css
+++ b/public/mod/quiz/styles.css
@@ -615,7 +615,7 @@ table.quizreviewsummary td.cell {
#page-mod-quiz-edit ul.section {
margin: 0;
- padding: 0 20px;
+ padding: 0 38px;
}
#page-mod-quiz-edit ul.slots {
@@ -688,8 +688,11 @@ table.quizreviewsummary td.cell {
#page-mod-quiz-edit ul.slots li.section li.activity .page_split_join_wrapper {
position: absolute;
- left: -20px;
- bottom: -11px;
+ left: -38px;
+ bottom: -18px;
+ .icon {
+ width: auto;
+ }
}
#page-mod-quiz-edit ul.slots li.section li.activity .instancemaxmark.decimalplaces_0 {
@@ -742,8 +745,8 @@ table.quizreviewsummary td.cell {
#page-mod-quiz-edit ul.slots li.section li.activity .question_dependency_wrapper {
position: absolute;
- top: -1em;
- right: -20px;
+ top: -1.25em;
+ right: -38px;
}
#page-mod-quiz-edit ul.slots li.section li.activity .question_dependency_wrapper.question_dependency_cannot_depend {
diff --git a/public/mod/quiz/tests/behat/behat_mod_quiz.php b/public/mod/quiz/tests/behat/behat_mod_quiz.php
index 2aa850178bd..d89898583a2 100644
--- a/public/mod/quiz/tests/behat/behat_mod_quiz.php
+++ b/public/mod/quiz/tests/behat/behat_mod_quiz.php
@@ -565,7 +565,7 @@ class behat_mod_quiz extends behat_question_base {
*/
protected function get_xpath_page_break_icon_after_question($addorremoves, $questionname) {
return "//li[contains(@class, 'slot') and contains(., '" . $this->escape($questionname) .
- "')]//a[contains(@class, 'page_split_join') and @title = '" . $addorremoves . " page break']";
+ "')]//a[contains(@class, 'page_split_join') and contains(@aria-label, '$addorremoves page break')]";
}
/**
diff --git a/public/mod/quiz/tests/behat/editing_require_previous.feature b/public/mod/quiz/tests/behat/editing_require_previous.feature
index a0c07568928..01b49712f31 100644
--- a/public/mod/quiz/tests/behat/editing_require_previous.feature
+++ b/public/mod/quiz/tests/behat/editing_require_previous.feature
@@ -51,7 +51,7 @@ Feature: Edit quizzes where some questions require the previous one to have been
| TF1 | 1 | 0 |
| TF2 | 1 | 1 |
And I am on the "Quiz 1" "mod_quiz > Edit" page
- Then "This question cannot be attempted until the previous question has been completed." "link" should be visible
+ Then "Question 2 cannot be attempted until the previous question 1 has been completed" "button" should be visible
@javascript
Scenario: A question can depend on a random question
@@ -67,9 +67,9 @@ Feature: Edit quizzes where some questions require the previous one to have been
| Random (Test questions) | 1 | 0 |
| TF1 | 1 | 1 |
And I am on the "Quiz 1" "mod_quiz > Edit" page
- Then "This question cannot be attempted until the previous question has been completed." "link" should be visible
+ Then "Question 2 cannot be attempted until the previous question 1 has been completed" "button" should be visible
- @javascript
+ @javascript @accessibility
Scenario: The second question can be set to depend on the first
Given the following "activities" exist:
| activity | name | intro | course | idnumber | preferredbehaviour |
@@ -85,9 +85,10 @@ Feature: Edit quizzes where some questions require the previous one to have been
| TF2 | 1 | 0 |
| TF3 | 1 | 0 |
And I am on the "Quiz 1" "mod_quiz > Edit" page
- When I follow "No restriction on when question 2 can be attempted • Click to change"
- Then "Question 2 cannot be attempted until the previous question 1 has been completed • Click to change" "link" should be visible
- And "No restriction on when question 3 can be attempted • Click to change" "link" should be visible
+ When I click on "No restriction on when question 2 can be attempted • Click to change" "button"
+ Then "Question 2 cannot be attempted until the previous question 1 has been completed • Click to change" "button" should be visible
+ And "No restriction on when question 3 can be attempted • Click to change" "button" should be visible
+ And the "region-main" "region" should meet accessibility standards with "best-practice" extra tests
@javascript
Scenario: A question that did depend on the previous can be un-linked
@@ -105,9 +106,9 @@ Feature: Edit quizzes where some questions require the previous one to have been
| TF2 | 1 | 1 |
| TF3 | 1 | 1 |
And I am on the "Quiz 1" "mod_quiz > Edit" page
- When I follow "Question 3 cannot be attempted until the previous question 2 has been completed • Click to change"
- Then "Question 2 cannot be attempted until the previous question 1 has been completed • Click to change" "link" should be visible
- And "No restriction on when question 3 can be attempted • Click to change" "link" should be visible
+ When I click on "Question 3 cannot be attempted until the previous question 2 has been completed • Click to change" "button"
+ Then "Question 2 cannot be attempted until the previous question 1 has been completed • Click to change" "button" should be visible
+ And "No restriction on when question 3 can be attempted • Click to change" "button" should be visible
@javascript
Scenario: Question dependency cannot apply to deferred feedback quizzes so UI is hidden
@@ -232,6 +233,6 @@ Feature: Edit quizzes where some questions require the previous one to have been
| TF3 | 1 | 1 |
And I am on the "Quiz 1" "mod_quiz > Edit" page
When I move "TF1" to "After Question 3" in the quiz by clicking the move icon
- Then "Question 2 cannot be attempted until the previous question 1 has been completed • Click to change" "link" should be visible
- And "No restriction on when question 3 can be attempted • Click to change" "link" should be visible
+ Then "Question 2 cannot be attempted until the previous question 1 has been completed • Click to change" "button" should be visible
+ And "No restriction on when question 3 can be attempted • Click to change" "button" should be visible
And "be attempted" "link" in the "TF2" "list_item" should not be visible
diff --git a/public/mod/quiz/yui/build/moodle-mod_quiz-dragdrop/moodle-mod_quiz-dragdrop-debug.js b/public/mod/quiz/yui/build/moodle-mod_quiz-dragdrop/moodle-mod_quiz-dragdrop-debug.js
index 77bb876564f..43ef07ec361 100644
--- a/public/mod/quiz/yui/build/moodle-mod_quiz-dragdrop/moodle-mod_quiz-dragdrop-debug.js
+++ b/public/mod/quiz/yui/build/moodle-mod_quiz-dragdrop/moodle-mod_quiz-dragdrop-debug.js
@@ -384,8 +384,9 @@ Y.extend(DRAGRESOURCE, M.core.dragdrop, {
// Replace move icons
var move = resourcesnode.one('a.' + CSS.EDITINGMOVE);
if (move) {
- var resourcedraghandle = this.get_drag_handle(M.util.get_string('move', 'moodle'),
- CSS.EDITINGMOVE, CSS.ICONCLASS, true);
+ var slotName = move.getAttribute('aria-label');
+ var dragHandleClass = 'btn px-1 icon-no-margin ' + CSS.EDITINGMOVE;
+ var resourcedraghandle = this.get_drag_handle(slotName, dragHandleClass, CSS.ICONCLASS);
move.replace(resourcedraghandle);
}
}, this);
diff --git a/public/mod/quiz/yui/build/moodle-mod_quiz-dragdrop/moodle-mod_quiz-dragdrop-min.js b/public/mod/quiz/yui/build/moodle-mod_quiz-dragdrop/moodle-mod_quiz-dragdrop-min.js
index 47197659f29..31fb1ebf6bc 100644
--- a/public/mod/quiz/yui/build/moodle-mod_quiz-dragdrop/moodle-mod_quiz-dragdrop-min.js
+++ b/public/mod/quiz/yui/build/moodle-mod_quiz-dragdrop/moodle-mod_quiz-dragdrop-min.js
@@ -1,2 +1,2 @@
-YUI.add("moodle-mod_quiz-dragdrop",function(g,e){var o,u=".actions",t="activity",p="mod-quiz-edit-content",r="editing_move",s="iconsmall",c="jumpmenu",n="left",h="movedown",_="moveup",m="page-content",d="right",f="slots",a="section-handle",v="slots",l="sectiondraggable",z="li.page",q="li.slot",i=function(){i.superclass.constructor.apply(this,arguments)};g.extend(i,M.core.dragdrop,{sectionlistselector:null,initializer:function(){if(this.groups=[l],this.samenodeclass="section",this.parentnodeclass="slots",g.Node.one("."+c))return!1;var e;this.sectionlistselector="li.section",this.sectionlistselector&&(this.sectionlistselector="."+p+" "+this.sectionlistselector,this.setup_for_section(this.sectionlistselector),(e=new g.DD.Delegate({container:"."+p,nodes:"."+l,target:!0,handles:["."+n],dragConfig:{groups:this.groups}})).dd.plug(g.Plugin.DDProxy,{moveOnEnd:!1}),e.dd.plug(g.Plugin.DDConstrained,{constrain:"#"+m,stickY:!0}),e.dd.plug(g.Plugin.DDWinScroll))},setup_for_section:function(e){g.Node.all(e).each(function(e){var o,t,i,s=g.Moodle.core_course.util.section.getId(e);0'),t=g.Node.create('');t.setStyle("margin",0),t.setContent(e.get("node").get("innerHTML")),o.appendChild(t),e.get("dragNode").setContent(o),e.get("dragNode").addClass(p)},drag_dropmiss:function(e){this.drop_hit(e)},get_section_index:function(e){var o="."+p+" li.section",o=g.all(o);return o.indexOf(e)-o.indexOf(g.one("#section-0"))},drop_hit:function(d){var r,a,e,n,o,t=d.drag,c=t.get("node"),i=g.Moodle.core_course.util.section.getId(c),l=i,s=this.get_section_index(c),u=s;if(i!==s){for(o in ug.Moodle.core_course.util.section.getId(r.item(i))&&(n=r.item(i-1).get("id"),r.item(i-1).set("id",r.item(i).get("id")),r.item(i).set("id",n),M.mod_quiz.edit.swap_sections(g,i-1,i),s=!0)}while(u-=1,s);window.setTimeout(function(){a.hide()},250)},failure:function(e,o){this.ajax_failure(o),a.hide()}},context:this})}}},{NAME:"mod_quiz-dragdrop-section",ATTRS:{courseid:{value:null},quizid:{value:null},ajaxurl:{value:0},config:{value:0}}}),M.mod_quiz=M.mod_quiz||{},M.mod_quiz.init_section_dragdrop=function(e){new i(e)},g.extend(o=function(){o.superclass.constructor.apply(this,arguments)},M.core.dragdrop,{initializer:function(){var e;this.groups=["resource"],this.samenodeclass=t,this.parentnodeclass=f,this.samenodelabel={identifier:"dragtoafter",component:"quiz"},this.parentnodelabel={identifier:"dragtostart",component:"quiz"},this.setup_for_section(),e="li."+t,(e=new g.DD.Delegate({container:"."+p,nodes:e,target:!0,handles:["."+r],dragConfig:{groups:this.groups}})).dd.plug(g.Plugin.DDProxy,{moveOnEnd:!1,cloneNode:!0}),e.dd.plug(g.Plugin.DDConstrained,{constrain:"#"+v}),e.dd.plug(g.Plugin.DDWinScroll),M.mod_quiz.quizbase.register_module(this),M.mod_quiz.dragres=this},setup_for_section:function(){g.Node.all(".mod-quiz-edit-content ul.slots ul.section").each(function(e){e.setAttribute("data-draggroups",this.groups.join(" ")),new g.DD.Drop({node:e,groups:this.groups,padding:"20 0 20 0"}),this.setup_for_resource("li.activity")},this)},setup_for_resource:function(e){g.Node.all(e).each(function(e){var o,e=e.one("a."+r);e&&(o=this.get_drag_handle(M.util.get_string("move","moodle"),r,s,!0),e.replace(o))},this)},drag_start:function(e){e=e.target;e.get("dragNode").setContent(e.get("node").get("innerHTML")),e.get("dragNode").all(".icon").setStyle("vertical-align","baseline")},drag_dropmiss:function(e){this.drop_hit(e)},drop_hit:function(e){var o,t=e.drag,i=t.get("node"),e=i.one(u),s=M.util.add_spinner(g,e),n={},d=this.get("config").pageparams;for(o in d)n[o]=d[o];n.sesskey=M.cfg.sesskey,n.courseid=this.get("courseid"),n.quizid=this.get("quizid"),n["class"]="resource",n.field="move",n.id=Number(g.Moodle.mod_quiz.util.slot.getId(i)),n.sectionId=g.Moodle.core_course.util.section.getId(i.ancestor("li.section",!0)),(e=i.previous(q))&&(n.previousid=Number(g.Moodle.mod_quiz.util.slot.getId(e))),(e=i.previous(z))&&(n.page=Number(g.Moodle.mod_quiz.util.page.getId(e))),e=M.cfg.wwwroot+this.get("ajaxurl"),g.io(e,{method:"POST",data:n,on:{start:function(){this.lock_drag_handle(t,r),s.show()},success:function(e,o){o=g.JSON.parse(o.responseText),o={element:i,visible:o.visible};M.mod_quiz.quizbase.invoke_function("set_visibility_resource_ui",o),this.unlock_drag_handle(t,r),window.setTimeout(function(){s.hide()},250),M.mod_quiz.resource_toolbox.reorganise_edit_page()},failure:function(e,o){this.ajax_failure(o),this.unlock_drag_handle(t,a),s.hide(),window.location.reload(!0)}},context:this})},global_drop_over:function(e){var o,t,i;e.drop&&e.drop.inGroup(this.groups)&&(o=e.drag.get("node"),t=e.drop.get("node"),this.lastdroptarget=e.drop,t.hasClass(this.samenodeclass)?(i=this.goingup?"before":"after",t.insert(o,i)):!t.hasClass(this.parentnodeclass)&&!t.test('[data-droptarget="1"]')||t.contains(o)||(this.goingup?t.append(o):t.prepend(o)),this.drop_over(e))}},{NAME:"mod_quiz-dragdrop-resource",ATTRS:{courseid:{value:null},quizid:{value:null},ajaxurl:{value:0},config:{value:0}}}),
-M.mod_quiz=M.mod_quiz||{},M.mod_quiz.init_resource_dragdrop=function(e){new o(e)}},"@VERSION@",{requires:["base","node","io","dom","dd","dd-scroll","moodle-core-dragdrop","moodle-core-notification","moodle-mod_quiz-quizbase","moodle-mod_quiz-util-base","moodle-mod_quiz-util-page","moodle-mod_quiz-util-slot","moodle-course-util"]});
\ No newline at end of file
+YUI.add("moodle-mod_quiz-dragdrop",function(g,e){var o,u=".actions",t="activity",p="mod-quiz-edit-content",d="editing_move",s="iconsmall",c="jumpmenu",n="left",h="movedown",_="moveup",m="page-content",r="right",f="slots",a="section-handle",v="slots",l="sectiondraggable",z="li.page",q="li.slot",i=function(){i.superclass.constructor.apply(this,arguments)};g.extend(i,M.core.dragdrop,{sectionlistselector:null,initializer:function(){if(this.groups=[l],this.samenodeclass="section",this.parentnodeclass="slots",g.Node.one("."+c))return!1;var e;this.sectionlistselector="li.section",this.sectionlistselector&&(this.sectionlistselector="."+p+" "+this.sectionlistselector,this.setup_for_section(this.sectionlistselector),(e=new g.DD.Delegate({container:"."+p,nodes:"."+l,target:!0,handles:["."+n],dragConfig:{groups:this.groups}})).dd.plug(g.Plugin.DDProxy,{moveOnEnd:!1}),e.dd.plug(g.Plugin.DDConstrained,{constrain:"#"+m,stickY:!0}),e.dd.plug(g.Plugin.DDWinScroll))},setup_for_section:function(e){g.Node.all(e).each(function(e){var o,t,i,s=g.Moodle.core_course.util.section.getId(e);0'),t=g.Node.create('');t.setStyle("margin",0),t.setContent(e.get("node").get("innerHTML")),o.appendChild(t),e.get("dragNode").setContent(o),e.get("dragNode").addClass(p)},drag_dropmiss:function(e){this.drop_hit(e)},get_section_index:function(e){var o="."+p+" li.section",o=g.all(o);return o.indexOf(e)-o.indexOf(g.one("#section-0"))},drop_hit:function(r){var d,a,e,n,o,t=r.drag,c=t.get("node"),i=g.Moodle.core_course.util.section.getId(c),l=i,s=this.get_section_index(c),u=s;if(i!==s){for(o in ug.Moodle.core_course.util.section.getId(d.item(i))&&(n=d.item(i-1).get("id"),d.item(i-1).set("id",d.item(i).get("id")),d.item(i).set("id",n),M.mod_quiz.edit.swap_sections(g,i-1,i),s=!0)}while(u-=1,s);window.setTimeout(function(){a.hide()},250)},failure:function(e,o){this.ajax_failure(o),a.hide()}},context:this})}}},{NAME:"mod_quiz-dragdrop-section",ATTRS:{courseid:{value:null},quizid:{value:null},ajaxurl:{value:0},config:{value:0}}}),M.mod_quiz=M.mod_quiz||{},M.mod_quiz.init_section_dragdrop=function(e){new i(e)},g.extend(o=function(){o.superclass.constructor.apply(this,arguments)},M.core.dragdrop,{initializer:function(){var e;this.groups=["resource"],this.samenodeclass=t,this.parentnodeclass=f,this.samenodelabel={identifier:"dragtoafter",component:"quiz"},this.parentnodelabel={identifier:"dragtostart",component:"quiz"},this.setup_for_section(),e="li."+t,(e=new g.DD.Delegate({container:"."+p,nodes:e,target:!0,handles:["."+d],dragConfig:{groups:this.groups}})).dd.plug(g.Plugin.DDProxy,{moveOnEnd:!1,cloneNode:!0}),e.dd.plug(g.Plugin.DDConstrained,{constrain:"#"+v}),e.dd.plug(g.Plugin.DDWinScroll),M.mod_quiz.quizbase.register_module(this),M.mod_quiz.dragres=this},setup_for_section:function(){g.Node.all(".mod-quiz-edit-content ul.slots ul.section").each(function(e){e.setAttribute("data-draggroups",this.groups.join(" ")),new g.DD.Drop({node:e,groups:this.groups,padding:"20 0 20 0"}),this.setup_for_resource("li.activity")},this)},setup_for_resource:function(e){g.Node.all(e).each(function(e){var o,t,e=e.one("a."+d);e&&(t=e.getAttribute("aria-label"),o="btn px-1 icon-no-margin "+d,t=this.get_drag_handle(t,o,s),e.replace(t))},this)},drag_start:function(e){e=e.target;e.get("dragNode").setContent(e.get("node").get("innerHTML")),e.get("dragNode").all(".icon").setStyle("vertical-align","baseline")},drag_dropmiss:function(e){this.drop_hit(e)},drop_hit:function(e){var o,t=e.drag,i=t.get("node"),e=i.one(u),s=M.util.add_spinner(g,e),n={},r=this.get("config").pageparams;for(o in r)n[o]=r[o];n.sesskey=M.cfg.sesskey,n.courseid=this.get("courseid"),n.quizid=this.get("quizid"),n["class"]="resource",n.field="move",n.id=Number(g.Moodle.mod_quiz.util.slot.getId(i)),n.sectionId=g.Moodle.core_course.util.section.getId(i.ancestor("li.section",!0)),(e=i.previous(q))&&(n.previousid=Number(g.Moodle.mod_quiz.util.slot.getId(e))),(e=i.previous(z))&&(n.page=Number(g.Moodle.mod_quiz.util.page.getId(e))),e=M.cfg.wwwroot+this.get("ajaxurl"),g.io(e,{method:"POST",data:n,on:{start:function(){this.lock_drag_handle(t,d),s.show()},success:function(e,o){o=g.JSON.parse(o.responseText),o={element:i,visible:o.visible};M.mod_quiz.quizbase.invoke_function("set_visibility_resource_ui",o),this.unlock_drag_handle(t,d),window.setTimeout(function(){s.hide()},250),M.mod_quiz.resource_toolbox.reorganise_edit_page()},failure:function(e,o){this.ajax_failure(o),this.unlock_drag_handle(t,a),s.hide(),window.location.reload(!0)}},context:this})},global_drop_over:function(e){var o,t,i;e.drop&&e.drop.inGroup(this.groups)&&(o=e.drag.get("node"),t=e.drop.get("node"),this.lastdroptarget=e.drop,t.hasClass(this.samenodeclass)?(i=this.goingup?"before":"after",t.insert(o,i)):!t.hasClass(this.parentnodeclass)&&!t.test('[data-droptarget="1"]')||t.contains(o)||(this.goingup?t.append(o):t.prepend(o)),this.drop_over(e))}},{NAME:"mod_quiz-dragdrop-resource",ATTRS:{courseid:{value:null},quizid:{value:null},ajaxurl:{
+value:0},config:{value:0}}}),M.mod_quiz=M.mod_quiz||{},M.mod_quiz.init_resource_dragdrop=function(e){new o(e)}},"@VERSION@",{requires:["base","node","io","dom","dd","dd-scroll","moodle-core-dragdrop","moodle-core-notification","moodle-mod_quiz-quizbase","moodle-mod_quiz-util-base","moodle-mod_quiz-util-page","moodle-mod_quiz-util-slot","moodle-course-util"]});
\ No newline at end of file
diff --git a/public/mod/quiz/yui/build/moodle-mod_quiz-dragdrop/moodle-mod_quiz-dragdrop.js b/public/mod/quiz/yui/build/moodle-mod_quiz-dragdrop/moodle-mod_quiz-dragdrop.js
index d9f7a67875b..69ff2f0ce30 100644
--- a/public/mod/quiz/yui/build/moodle-mod_quiz-dragdrop/moodle-mod_quiz-dragdrop.js
+++ b/public/mod/quiz/yui/build/moodle-mod_quiz-dragdrop/moodle-mod_quiz-dragdrop.js
@@ -378,8 +378,9 @@ Y.extend(DRAGRESOURCE, M.core.dragdrop, {
// Replace move icons
var move = resourcesnode.one('a.' + CSS.EDITINGMOVE);
if (move) {
- var resourcedraghandle = this.get_drag_handle(M.util.get_string('move', 'moodle'),
- CSS.EDITINGMOVE, CSS.ICONCLASS, true);
+ var slotName = move.getAttribute('aria-label');
+ var dragHandleClass = 'btn px-1 icon-no-margin ' + CSS.EDITINGMOVE;
+ var resourcedraghandle = this.get_drag_handle(slotName, dragHandleClass, CSS.ICONCLASS);
move.replace(resourcedraghandle);
}
}, this);
diff --git a/public/mod/quiz/yui/build/moodle-mod_quiz-util-slot/moodle-mod_quiz-util-slot-debug.js b/public/mod/quiz/yui/build/moodle-mod_quiz-util-slot/moodle-mod_quiz-util-slot-debug.js
index 5653cef9c9e..2b9ff6dd296 100644
--- a/public/mod/quiz/yui/build/moodle-mod_quiz-util-slot/moodle-mod_quiz-util-slot-debug.js
+++ b/public/mod/quiz/yui/build/moodle-mod_quiz-util-slot/moodle-mod_quiz-util-slot-debug.js
@@ -335,21 +335,24 @@ Y.Moodle.mod_quiz.util.slot = {
// Get the correct title.
var action = '';
var iconname = '';
+ var actionStr = '';
+ var slotNumber = this.getNumber(slot);
if (Y.Moodle.mod_quiz.util.page.isPage(nextitem)) {
action = 'removepagebreak';
+ actionStr = 'removepagebreakafter';
iconname = 'e/remove_page_break';
} else {
action = 'addpagebreak';
+ actionStr = 'addpagebreakafter';
iconname = 'e/insert_page_break';
}
// Update the link and image titles
- pagebreaklink.set('title', M.util.get_string(action, 'quiz'));
+ pagebreaklink.set('title', M.util.get_string(actionStr, 'quiz', slotNumber));
+ pagebreaklink.set('aria-label', M.util.get_string(actionStr, 'quiz', slotNumber));
pagebreaklink.setData('action', action);
// Update the image title.
var icon = pagebreaklink.one(this.SELECTORS.ICON);
- icon.set('title', M.util.get_string(action, 'quiz'));
- icon.set('alt', M.util.get_string(action, 'quiz'));
// Update the image src.
icon.set('src', M.util.image_url(iconname));
@@ -417,27 +420,27 @@ Y.Moodle.mod_quiz.util.slot = {
requiresprevious = link.getData('action') === 'removedependency';
}
+ var iconname = '';
if (requiresprevious) {
link.set('title', M.util.get_string('questiondependencyremove', 'quiz', a));
+ link.set('aria-label', M.util.get_string('questiondependencyremove', 'quiz', a));
link.setData('action', 'removedependency');
- window.require(['core/templates'], function(Templates) {
- Templates.renderPix('t/locked', 'core', M.util.get_string('questiondependsonprevious', 'quiz')).then(
- function(html) {
- icon.replace(html);
- }
- );
- });
+ iconname = 't/locked';
} else {
link.set('title', M.util.get_string('questiondependencyadd', 'quiz', a));
+ link.set('aria-label', M.util.get_string('questiondependencyadd', 'quiz', a));
link.setData('action', 'adddependency');
- window.require(['core/templates'], function(Templates) {
- Templates.renderPix('t/unlocked', 'core', M.util.get_string('questiondependencyfree', 'quiz')).then(
+ iconname = 't/unlocked';
+ }
+ window.require(['core/templates', 'core/notification'], function(Templates, Notification) {
+ Templates.renderPix(iconname, 'core', '')
+ .then(
function(html) {
icon.replace(html);
+ return;
}
- );
- });
- }
+ ).catch(Notification.exception);
+ });
}
};
diff --git a/public/mod/quiz/yui/build/moodle-mod_quiz-util-slot/moodle-mod_quiz-util-slot-min.js b/public/mod/quiz/yui/build/moodle-mod_quiz-util-slot/moodle-mod_quiz-util-slot-min.js
index b062aafe066..11c44c0fdbc 100644
--- a/public/mod/quiz/yui/build/moodle-mod_quiz-util-slot/moodle-mod_quiz-util-slot-min.js
+++ b/public/mod/quiz/yui/build/moodle-mod_quiz-util-slot/moodle-mod_quiz-util-slot-min.js
@@ -1 +1 @@
-YUI.add("moodle-mod_quiz-util-slot",function(u,e){u.namespace("Moodle.mod_quiz.util.slot"),u.Moodle.mod_quiz.util.slot={CSS:{SLOT:"slot",QUESTIONTYPEDESCRIPTION:"qtype_description",CANNOT_DEPEND:"question_dependency_cannot_depend"},CONSTANTS:{SLOTIDPREFIX:"slot-",QUESTION:M.util.get_string("question","moodle")},SELECTORS:{SLOT:"li.slot",INSTANCENAME:".instancename",NUMBER:"span.slotnumber",PAGECONTENT:"div#page-content",PAGEBREAK:"span.page_split_join_wrapper",ICON:".icon",QUESTIONTYPEDESCRIPTION:".qtype_description",SECTIONUL:"ul.section",DEPENDENCY_WRAPPER:".question_dependency_wrapper",DEPENDENCY_LINK:".question_dependency_wrapper .cm-edit-action",DEPENDENCY_ICON:".question_dependency_wrapper .icon"},getSlotFromComponent:function(e){return u.one(e).ancestor(this.SELECTORS.SLOT,!0)},getId:function(e){e=e.get("id").replace(this.CONSTANTS.SLOTIDPREFIX,"");return!("number"!=typeof(e=parseInt(e,10))||!isFinite(e))&&e},getName:function(e){e=e.one(this.SELECTORS.INSTANCENAME);return e?e.get("firstChild").get("data"):null},getNumber:function(e){if(!e)return!1;e=e.one(this.SELECTORS.NUMBER).get("text").replace(this.CONSTANTS.QUESTION,"");return!("number"!=typeof(e=parseInt(e,10))||!isFinite(e))&&e},setNumber:function(e,t){e.one(this.SELECTORS.NUMBER).setHTML(''+this.CONSTANTS.QUESTION+" "+t)},getSlots:function(){return u.all(this.SELECTORS.PAGECONTENT+" "+this.SELECTORS.SECTIONUL+" "+this.SELECTORS.SLOT)},getNumberedSlots:function(){var e=this.SELECTORS.PAGECONTENT+" "+this.SELECTORS.SECTIONUL;return e+=" "+this.SELECTORS.SLOT+":not("+this.SELECTORS.QUESTIONTYPEDESCRIPTION+")",u.all(e)},getPrevious:function(e){return e.previous(this.SELECTORS.SLOT)},getPreviousNumbered:function(e){var t,i,n=e.previous(this.SELECTORS.SLOT+":not("+this.SELECTORS.QUESTIONTYPEDESCRIPTION+")");if(n)return n;for(t=e.ancestor("li.section").previous("li.section");t;){if(0<(i=t.all(this.SELECTORS.SLOT+":not("+this.SELECTORS.QUESTIONTYPEDESCRIPTION+")")).size())return i.item(i.size()-1);t=t.previous("li.section")}return!1},reorderSlots:function(){this.getSlots().each(function(e){var t,i;u.Moodle.mod_quiz.util.page.getPageFromSlot(e)||(t=e.next(u.Moodle.mod_quiz.util.page.SELECTORS.PAGE),e.swap(t)),t=this.getPreviousNumbered(e),i=0,e.hasClass(this.CSS.QUESTIONTYPEDESCRIPTION)||(t&&(i=this.getNumber(t)),this.setNumber(e,i+1))},this)},updateOneSlotSections:function(){u.all(".mod-quiz-edit-content ul.slots li.section").each(function(e){1'+this.CONSTANTS.QUESTION+" "+t)},getSlots:function(){return l.all(this.SELECTORS.PAGECONTENT+" "+this.SELECTORS.SECTIONUL+" "+this.SELECTORS.SLOT)},getNumberedSlots:function(){var e=this.SELECTORS.PAGECONTENT+" "+this.SELECTORS.SECTIONUL;return e+=" "+this.SELECTORS.SLOT+":not("+this.SELECTORS.QUESTIONTYPEDESCRIPTION+")",l.all(e)},getPrevious:function(e){return e.previous(this.SELECTORS.SLOT)},getPreviousNumbered:function(e){var t,i,n=e.previous(this.SELECTORS.SLOT+":not("+this.SELECTORS.QUESTIONTYPEDESCRIPTION+")");if(n)return n;for(t=e.ancestor("li.section").previous("li.section");t;){if(0<(i=t.all(this.SELECTORS.SLOT+":not("+this.SELECTORS.QUESTIONTYPEDESCRIPTION+")")).size())return i.item(i.size()-1);t=t.previous("li.section")}return!1},reorderSlots:function(){this.getSlots().each(function(e){var t,i;l.Moodle.mod_quiz.util.page.getPageFromSlot(e)||(t=e.next(l.Moodle.mod_quiz.util.page.SELECTORS.PAGE),e.swap(t)),t=this.getPreviousNumbered(e),i=0,e.hasClass(this.CSS.QUESTIONTYPEDESCRIPTION)||(t&&(i=this.getNumber(t)),this.setNumber(e,i+1))},this)},updateOneSlotSections:function(){l.all(".mod-quiz-edit-content ul.slots li.section").each(function(e){1