From 48983fb9e7ef75e92c14cfad54901cbf66deec67 Mon Sep 17 00:00:00 2001 From: Marina Glancy Date: Mon, 8 Feb 2016 16:50:37 +0800 Subject: [PATCH] MDL-53026 cohorts: edit names and idnumbers in place --- cohort/classes/output/cohortidnumber.php | 70 +++++++++++++++++++++++ cohort/classes/output/cohortname.php | 73 ++++++++++++++++++++++++ cohort/index.php | 6 +- cohort/lib.php | 16 ++++++ cohort/tests/behat/add_cohort.feature | 11 ++++ lang/en/cohort.php | 4 ++ 6 files changed, 178 insertions(+), 2 deletions(-) create mode 100644 cohort/classes/output/cohortidnumber.php create mode 100644 cohort/classes/output/cohortname.php diff --git a/cohort/classes/output/cohortidnumber.php b/cohort/classes/output/cohortidnumber.php new file mode 100644 index 00000000000..56289174e41 --- /dev/null +++ b/cohort/classes/output/cohortidnumber.php @@ -0,0 +1,70 @@ +. + +/** + * Contains class core_cohort\output\cohortidnumber + * + * @package core_cohort + * @copyright 2016 Marina Glancy + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace core_cohort\output; + +use lang_string; + +/** + * Class to prepare a cohort idnumber for display. + * + * @package core_cohort + * @copyright 2016 Marina Glancy + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class cohortidnumber extends \core\output\inplace_editable { + /** + * Constructor. + * + * @param stdClass $cohort + */ + public function __construct($cohort) { + $cohortcontext = \context::instance_by_id($cohort->contextid); + $editable = has_capability('moodle/cohort:manage', $cohortcontext); + $displayvalue = s($cohort->idnumber); // All idnumbers are plain text. + parent::__construct('core_cohort', 'cohortidnumber', $cohort->id, $editable, + $displayvalue, + $cohort->idnumber, + new lang_string('editcohortidnumber', 'cohort'), + new lang_string('newidnumberfor', 'cohort', $displayvalue)); + } + + /** + * Updates cohort name and returns instance of this object + * + * @param int $cohortid + * @param string $newvalue + * @return static + */ + public static function update($cohortid, $newvalue) { + global $DB; + $cohort = $DB->get_record('cohort', array('id' => $cohortid), '*', MUST_EXIST); + $cohortcontext = \context::instance_by_id($cohort->contextid); + require_capability('moodle/cohort:manage', $cohortcontext); + $record = (object)array('id' => $cohort->id, 'idnumber' => $newvalue, 'contextid' => $cohort->contextid); + cohort_update_cohort($record); + $cohort->idnumber = $newvalue; + return new static($cohort); + } +} diff --git a/cohort/classes/output/cohortname.php b/cohort/classes/output/cohortname.php new file mode 100644 index 00000000000..7c748094c16 --- /dev/null +++ b/cohort/classes/output/cohortname.php @@ -0,0 +1,73 @@ +. + +/** + * Contains class core_cohort\output\cohortname + * + * @package core_cohort + * @copyright 2016 Marina Glancy + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace core_cohort\output; + +use lang_string; + +/** + * Class to prepare a cohort name for display. + * + * @package core_cohort + * @copyright 2016 Marina Glancy + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class cohortname extends \core\output\inplace_editable { + /** + * Constructor. + * + * @param stdClass $cohort + */ + public function __construct($cohort) { + $cohortcontext = \context::instance_by_id($cohort->contextid); + $editable = has_capability('moodle/cohort:manage', $cohortcontext); + $displayvalue = format_string($cohort->name, true, array('context' => $cohortcontext)); + parent::__construct('core_cohort', 'cohortname', $cohort->id, $editable, + $displayvalue, + $cohort->name, + new lang_string('editcohortname', 'cohort'), + new lang_string('newnamefor', 'cohort', $displayvalue)); + } + + /** + * Updates cohort name and returns instance of this object + * + * @param int $cohortid + * @param string $newvalue + * @return static + */ + public static function update($cohortid, $newvalue) { + global $DB; + $cohort = $DB->get_record('cohort', array('id' => $cohortid), '*', MUST_EXIST); + $cohortcontext = \context::instance_by_id($cohort->contextid); + require_capability('moodle/cohort:manage', $cohortcontext); + $newvalue = clean_param($newvalue, PARAM_TEXT); + if (strval($newvalue) !== '') { + $record = (object)array('id' => $cohort->id, 'name' => $newvalue, 'contextid' => $cohort->contextid); + cohort_update_cohort($record); + $cohort->name = $newvalue; + } + return new static($cohort); + } +} diff --git a/cohort/index.php b/cohort/index.php index 923e464f2f6..7352bb81354 100644 --- a/cohort/index.php +++ b/cohort/index.php @@ -132,8 +132,10 @@ foreach($cohorts['cohorts'] as $cohort) { $line[] = $cohortcontext->get_context_name(false); } } - $line[] = format_string($cohort->name); - $line[] = s($cohort->idnumber); // All idnumbers are plain text. + $tmpl = new \core_cohort\output\cohortname($cohort); + $line[] = $OUTPUT->render_from_template('core/inplace_editable', $tmpl->export_for_template($OUTPUT)); + $tmpl = new \core_cohort\output\cohortidnumber($cohort); + $line[] = $OUTPUT->render_from_template('core/inplace_editable', $tmpl->export_for_template($OUTPUT)); $line[] = format_text($cohort->description, $cohort->descriptionformat); $line[] = $DB->count_records('cohort_members', array('cohortid'=>$cohort->id)); diff --git a/cohort/lib.php b/cohort/lib.php index 5c515782c88..de015a41c66 100644 --- a/cohort/lib.php +++ b/cohort/lib.php @@ -516,3 +516,19 @@ function cohort_edit_controls(context $context, moodle_url $currenturl) { } return null; } + +/** + * Implements callback inplace_editable() allowing to edit values in-place + * + * @param string $itemtype + * @param int $itemid + * @param mixed $newvalue + * @return \core\output\inplace_editable + */ +function core_cohort_inplace_editable($itemtype, $itemid, $newvalue) { + if ($itemtype === 'cohortname') { + return \core_cohort\output\cohortname::update($itemid, $newvalue); + } else if ($itemtype === 'cohortidnumber') { + return \core_cohort\output\cohortidnumber::update($itemid, $newvalue); + } +} diff --git a/cohort/tests/behat/add_cohort.feature b/cohort/tests/behat/add_cohort.feature index f6b551212d4..e6983b274e2 100644 --- a/cohort/tests/behat/add_cohort.feature +++ b/cohort/tests/behat/add_cohort.feature @@ -56,3 +56,14 @@ Feature: Add cohorts of users And the "Current users" select box should contain "Third User (third@example.com)" And the "Current users" select box should contain "Forth User (forth@example.com)" And the "Current users" select box should not contain "First User (first@example.com)" + + @javascript + Scenario: Edit cohort name in-place + When I follow "Cohorts" + And I click on "Edit cohort name" "link" in the "Test cohort name" "table_row" + And I set the field "New name for cohort Test cohort name" to "Students cohort" + And I press key "13" in the field "New name for cohort Test cohort name" + Then I should not see "Test cohort name" + And I should see "Students cohort" + And I follow "Cohorts" + And I should see "Students cohort" diff --git a/lang/en/cohort.php b/lang/en/cohort.php index 7b1dc38903d..3aa114e61bb 100644 --- a/lang/en/cohort.php +++ b/lang/en/cohort.php @@ -50,6 +50,8 @@ $string['description'] = 'Description'; $string['displayedrows'] = '{$a->displayed} rows displayed out of {$a->total}.'; $string['duplicateidnumber'] = 'Cohort with the same ID number already exists'; $string['editcohort'] = 'Edit cohort'; +$string['editcohortidnumber'] = 'Edit cohort ID'; +$string['editcohortname'] = 'Edit cohort name'; $string['eventcohortcreated'] = 'Cohort created'; $string['eventcohortdeleted'] = 'Cohort deleted'; $string['eventcohortmemberadded'] = 'User added to a cohort'; @@ -61,6 +63,8 @@ $string['memberscount'] = 'Cohort size'; $string['name'] = 'Name'; $string['namecolumnmissing'] = 'There is something wrong with the format of the CSV file. Please check that it includes column names.'; $string['namefieldempty'] = 'Field name can not be empty'; +$string['newnamefor'] = 'New name for cohort {$a}'; +$string['newidnumberfor'] = 'New idnumber for cohort {$a}'; $string['nocomponent'] = 'Created manually'; $string['potusers'] = 'Potential users'; $string['potusersmatching'] = 'Potential matching users';