Skip to content

Commit

Permalink
MDL-82302 quiz: keep inplace editable edit when drag drop.
Browse files Browse the repository at this point in the history
  • Loading branch information
hieuvu committed Oct 10, 2024
1 parent 67f5ee3 commit 2b3ab22
Show file tree
Hide file tree
Showing 5 changed files with 113 additions and 10 deletions.
13 changes: 10 additions & 3 deletions mod/quiz/classes/output/edit_renderer.php
Original file line number Diff line number Diff line change
Expand Up @@ -746,6 +746,7 @@ protected function add_question_form(structure $structure, $page, \moodle_url $p
public function question(structure $structure, int $slot, \moodle_url $pageurl) {
// Get the data required by the question_slot template.
$slotid = $structure->get_slot_id_for_slot($slot);
$slotobject = $structure->get_slot_by_id($slotid);

$output = '';
$output .= html_writer::start_tag('div');
Expand All @@ -765,7 +766,8 @@ public function question(structure $structure, int $slot, \moodle_url $pageurl)
'slotid' => $slotid,
'canbeedited' => $structure->can_be_edited(),
'checkbox' => $this->get_checkbox_render($structure, $slot),
'questionnumber' => $this->question_number($questionnumber, $structure->get_slot_by_number($slot)->defaultnumber),
'questionnumber' => $this->question_number($questionnumber, $structure->get_slot_by_number($slot)->defaultnumber,
$slotobject->displaynumber),
'questionname' => $this->get_question_name_for_slot($structure, $slot, $pageurl),
'questionicons' => $this->get_action_icon($structure, $slot, $pageurl),
'questiondependencyicon' => ($structure->can_be_edited() ? $this->question_dependency_icon($structure, $slot) : ''),
Expand Down Expand Up @@ -872,14 +874,19 @@ public function question_move_icon(structure $structure, $slot) {
*
* @param string $editablenumber The, which may be an in-place editable.
* @param string $uncustomisednumber The un-customised number number, or 'i'.
* @param string|null $customisednumber The customised slot number.
* @return string HTML to output.
*/
public function question_number(string $editablenumber, string $uncustomisednumber) {
public function question_number(string $editablenumber, string $uncustomisednumber, ?string $customisednumber = null) {
if ($customisednumber === $uncustomisednumber) {
$customisednumber = '';
}
if ($editablenumber !== get_string('infoshort', 'quiz')) {
$editablenumber = html_writer::span(get_string('question'), 'accesshide') . ' ' . $editablenumber;
$uncustomisednumber = html_writer::span(get_string('question'), 'accesshide') . ' ' . $uncustomisednumber;
}
return html_writer::tag('span', $editablenumber, ['class' => 'slotnumber unshuffled']) .
return html_writer::tag('span', $editablenumber, ['class' => 'slotnumber unshuffled',
'data-customnumber' => $customisednumber]) .
html_writer::tag('span', $uncustomisednumber, ['class' => 'slotnumber shuffled']);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,11 +112,43 @@ Y.Moodle.mod_quiz.util.slot = {
*
* @method setNumber
* @param slot {Node} The slot to update the number for.
* @param number {Number} The number will be set for this slot.
* @return void
*/
setNumber: function(slot, number) {
var numbernode = slot.one(this.SELECTORS.NUMBER);
numbernode.setHTML('<span class="accesshide">' + this.CONSTANTS.QUESTION + '</span> ' + number);
var yui = this;
require(['core/inplace_editable', 'core/templates', 'core/str', 'core/notification'],
function(InplaceEditable, Templates, str, Notification) {
var numberNode = slot.one(yui.SELECTORS.NUMBER)._node;
var inplaceElement = InplaceEditable.getInplaceEditable(numberNode);
// We don't need to change custom number.
if (inplaceElement && !numberNode.dataset.customnumber) {
str.get_strings([
{key: 'edit_slotdisplaynumber_hint', component: 'mod_quiz'},
{key: 'edit_slotdisplaynumber_label', component: 'mod_quiz', param: number},
]).then(function(strings) {
var context = {
displayvalue: number,
value: number,
itemid: slot,
component: 'mod_quiz',
itemtype: 'slotdisplaynumber',
edithint: strings[0],
editlabel: strings[1],
editicon: {
'key': 't/editstring',
'component': 'core',
'title': strings[1],
},
linkeverything: true,
};
return Templates.render('core/inplace_editable', context).then(function(html, js) {
Templates.replaceNodeContents(numberNode, html, js);
});
}).catch(Notification.exception);
}
}
);
},

/**
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -112,11 +112,43 @@ Y.Moodle.mod_quiz.util.slot = {
*
* @method setNumber
* @param slot {Node} The slot to update the number for.
* @param number {Number} The number will be set for this slot.
* @return void
*/
setNumber: function(slot, number) {
var numbernode = slot.one(this.SELECTORS.NUMBER);
numbernode.setHTML('<span class="accesshide">' + this.CONSTANTS.QUESTION + '</span> ' + number);
var yui = this;
require(['core/inplace_editable', 'core/templates', 'core/str', 'core/notification'],
function(InplaceEditable, Templates, str, Notification) {
var numberNode = slot.one(yui.SELECTORS.NUMBER)._node;
var inplaceElement = InplaceEditable.getInplaceEditable(numberNode);
// We don't need to change custom number.
if (inplaceElement && !numberNode.dataset.customnumber) {
str.get_strings([
{key: 'edit_slotdisplaynumber_hint', component: 'mod_quiz'},
{key: 'edit_slotdisplaynumber_label', component: 'mod_quiz', param: number},
]).then(function(strings) {
var context = {
displayvalue: number,
value: number,
itemid: slot,
component: 'mod_quiz',
itemtype: 'slotdisplaynumber',
edithint: strings[0],
editlabel: strings[1],
editicon: {
'key': 't/editstring',
'component': 'core',
'title': strings[1],
},
linkeverything: true,
};
return Templates.render('core/inplace_editable', context).then(function(html, js) {
Templates.replaceNodeContents(numberNode, html, js);
});
}).catch(Notification.exception);
}
}
);
},

/**
Expand Down
36 changes: 34 additions & 2 deletions mod/quiz/yui/src/util/js/slot.js
Original file line number Diff line number Diff line change
Expand Up @@ -110,11 +110,43 @@ Y.Moodle.mod_quiz.util.slot = {
*
* @method setNumber
* @param slot {Node} The slot to update the number for.
* @param number {Number} The number will be set for this slot.
* @return void
*/
setNumber: function(slot, number) {
var numbernode = slot.one(this.SELECTORS.NUMBER);
numbernode.setHTML('<span class="accesshide">' + this.CONSTANTS.QUESTION + '</span> ' + number);
var yui = this;
require(['core/inplace_editable', 'core/templates', 'core/str', 'core/notification'],
function(InplaceEditable, Templates, str, Notification) {
var numberNode = slot.one(yui.SELECTORS.NUMBER)._node;
var inplaceElement = InplaceEditable.getInplaceEditable(numberNode);
// We don't need to change custom number.
if (inplaceElement && !numberNode.dataset.customnumber) {
str.get_strings([
{key: 'edit_slotdisplaynumber_hint', component: 'mod_quiz'},
{key: 'edit_slotdisplaynumber_label', component: 'mod_quiz', param: number},
]).then(function(strings) {
var context = {
displayvalue: number,
value: number,
itemid: slot,
component: 'mod_quiz',
itemtype: 'slotdisplaynumber',
edithint: strings[0],
editlabel: strings[1],
editicon: {
'key': 't/editstring',
'component': 'core',
'title': strings[1],
},
linkeverything: true,
};
return Templates.render('core/inplace_editable', context).then(function(html, js) {
Templates.replaceNodeContents(numberNode, html, js);
});
}).catch(Notification.exception);
}
}
);
},

/**
Expand Down

0 comments on commit 2b3ab22

Please sign in to comment.