MDL-76867 core_admin: Add support for editor sorting via ajax

This commit is contained in:
Andrew Nicols
2023-03-14 08:44:15 +08:00
parent f54cc61e4b
commit 6d978dd35a
13 changed files with 719 additions and 25 deletions
+75 -4
View File
@@ -23,10 +23,9 @@
*/
namespace core\plugininfo;
use moodle_url, part_of_admin_tree, admin_settingpage;
defined('MOODLE_INTERNAL') || die();
use admin_settingpage;
use moodle_url;
use part_of_admin_tree;
/**
* Class for HTML editors
@@ -138,4 +137,76 @@ class editor extends base {
public static function get_manage_url() {
return new moodle_url('/admin/settings.php', array('section'=>'manageeditors'));
}
public static function plugintype_supports_ordering(): bool {
return true;
}
public static function get_sorted_plugins(bool $enabledonly = false): ?array {
global $CFG;
$pluginmanager = \core_plugin_manager::instance();
$plugins = $pluginmanager->get_plugins_of_type('editor');
// The Editor list is stored in an ordered string.
$activeeditors = explode(',', $CFG->texteditors);
$sortedplugins = [];
foreach ($activeeditors as $editor) {
if (isset($plugins[$editor])) {
$sortedplugins[$editor] = $plugins[$editor];
unset($plugins[$editor]);
}
}
if ($enabledonly) {
return $sortedplugins;
}
// Sort the rest of the plugins lexically.
uasort($plugins, function ($a, $b) {
return strnatcasecmp($a->name, $b->name);
});
return array_merge(
$sortedplugins,
$plugins,
);
}
public static function change_plugin_order(string $pluginname, int $direction): bool {
$activeeditors = array_keys(self::get_sorted_plugins(true));
$key = array_search($pluginname, $activeeditors);
if ($key === false) {
return false;
}
if ($direction === self::MOVE_DOWN) {
// Move down the list.
if ($key < (count($activeeditors) - 1)) {
$fsave = $activeeditors[$key];
$activeeditors[$key] = $activeeditors[$key + 1];
$activeeditors[$key + 1] = $fsave;
add_to_config_log('editor_position', $key, $key + 1, $pluginname);
set_config('texteditors', implode(',', $activeeditors));
\core_plugin_manager::reset_caches();
return true;
}
} else if ($direction === self::MOVE_UP) {
if ($key >= 1) {
$fsave = $activeeditors[$key];
$activeeditors[$key] = $activeeditors[$key - 1];
$activeeditors[$key - 1] = $fsave;
add_to_config_log('editor_position', $key, $key - 1, $pluginname);
set_config('texteditors', implode(',', $activeeditors));
\core_plugin_manager::reset_caches();
return true;
}
}
return false;
}
}