MDL-75187 mod_data: Move delete preset to a modal

Co-author: Ferran Recio <[email protected]>
This commit is contained in:
Amaia Anabitarte
2022-09-02 16:01:38 +02:00
committed by Sara Arjona
parent a7514f231d
commit ae5dc809ec
15 changed files with 646 additions and 66 deletions
+122
View File
@@ -0,0 +1,122 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace mod_data\external;
use core\notification;
use mod_data\manager;
use mod_data\preset;
defined('MOODLE_INTERNAL') || die();
global $CFG;
require_once($CFG->libdir . '/externallib.php');
/**
* This is the external method for deleting a saved preset.
*
* @package mod_data
* @since Moodle 4.1
* @copyright 2022 Amaia Anabitarte <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class delete_saved_preset extends \external_api {
/**
* Parameters.
*
* @return \external_function_parameters
*/
public static function execute_parameters(): \external_function_parameters {
return new \external_function_parameters([
'dataid' => new \external_value(PARAM_INT, 'Id of the data activity', VALUE_REQUIRED),
'presetnames' => new \external_multiple_structure(
new \external_value(PARAM_TEXT, 'The preset name to delete', VALUE_REQUIRED)
)
]);
}
/**
* Delete saved preset from the file system.
*
* @param int $dataid Id of the data activity to check context and permissions.
* @param array $presetnames List of saved preset names to delete.
* @return array True if the content has been deleted; false and the warning, otherwise.
*/
public static function execute(int $dataid, array $presetnames): array {
global $DB;
$result = false;
$warnings = [];
$params = self::validate_parameters(self::execute_parameters(), ['dataid' => $dataid, 'presetnames' => $presetnames]);
$instance = $DB->get_record('data', ['id' => $params['dataid']], '*', MUST_EXIST);
$manager = manager::create_from_instance($instance);
foreach ($params['presetnames'] as $presetname) {
try {
$preset = preset::create_from_instance($manager, $presetname);
if ($preset->can_manage()) {
if ($preset->delete()) {
notification::success(get_string('presetdeleted', 'mod_data'));
$result = true;
} else {
// An error ocurred while deleting the preset.
$warnings[] = [
'item' => $presetname,
'warningcode' => 'failedpresetdelete',
'message' => get_string('failedpresetdelete', 'mod_data')
];
notification::error(get_string('failedpresetdelete', 'mod_data'));
}
} else {
// The user has no permission to delete the preset.
$warnings[] = [
'item' => $presetname,
'warningcode' => 'cannotdeletepreset',
'message' => get_string('cannotdeletepreset', 'mod_data')
];
notification::error(get_string('cannotdeletepreset', 'mod_data'));
}
} catch (\moodle_exception $e) {
// The saved preset has not been deleted.
$warnings[] = [
'item' => $presetname,
'warningcode' => 'exception',
'message' => $e->getMessage()
];
notification::error($e->getMessage());
}
}
return [
'result' => $result,
'warnings' => $warnings
];
}
/**
* Return.
*
* @return \external_single_structure
*/
public static function execute_returns(): \external_single_structure {
return new \external_single_structure([
'result' => new \external_value(PARAM_BOOL, 'The processing result'),
'warnings' => new \external_warnings()
]);
}
}
+4 -4
View File
@@ -95,7 +95,7 @@ class save_as_preset extends dynamic_form {
break;
}
}
if (isset($selectedpreset->name) && !data_user_can_delete_preset($context, $selectedpreset)) {
if (!$selectedpreset instanceof preset || !$selectedpreset->can_manage()) {
$errors['name'] = get_string('cannotoverwritepreset', 'data');
}
} else if ($formdata['action'] == 'saveaspreset' || $formdata['oldpresetname'] != $formdata['name']) {
@@ -105,7 +105,7 @@ class save_as_preset extends dynamic_form {
$usercandelete = false;
foreach ($sitepresets as $preset) {
if ($formdata['name'] == $preset->name) {
if (data_user_can_delete_preset($context, $preset)) {
if ($preset->can_manage()) {
$errors['name'] = get_string('errorpresetexists', 'data');
$usercandelete = true;
} else {
@@ -176,8 +176,8 @@ class save_as_preset extends dynamic_form {
break;
}
}
if (isset($selectedpreset->name) && data_user_can_delete_preset($context, $selectedpreset)) {
data_delete_site_preset($formdata->name);
if ($selectedpreset instanceof preset && $selectedpreset->can_manage()) {
$selectedpreset->delete();
}
}
$presetname = $formdata->name;
+8 -3
View File
@@ -136,7 +136,7 @@ class presets implements templatable, renderable {
$actionmenu->attributes['class'] .= ' presets-actions';
// Only users with mod/data:manageuserpresets capability have options to edit the preset.
if (data_user_can_delete_preset($PAGE->context, $preset)) {
if ($preset->can_manage()) {
$params = [
'd' => $this->id,
'action' => 'edit',
@@ -158,14 +158,19 @@ class presets implements templatable, renderable {
// Delete.
$params = [
'd' => $this->id,
'fullname' => "{$userid}/{$preset->shortname}",
'action' => 'confirmdelete',
'action' => 'delete',
];
$deleteactionurl = new moodle_url('/mod/data/preset.php', $params);
$attributes = [
'data-action' => 'deletepreset',
'data-dataid' => $this->id,
"data-presetname" => $preset->name,
];
$actionmenu->add(new action_menu_link_secondary(
$deleteactionurl,
null,
get_string('delete'),
$attributes,
));
}
}
+63
View File
@@ -535,4 +535,67 @@ class preset {
return $preset->asXML();
}
/**
* Checks to see if the user has permission to manage the preset.
*
* @return bool Returns true if the user can manage this preset, false otherwise.
*/
public function can_manage(): bool {
global $USER;
if ($this->isplugin) {
// Plugin presets can't be removed or edited.
return false;
}
$context = $this->manager->get_context();
if (has_capability('mod/data:manageuserpresets', $context)) {
return true;
} else {
if ($this->get_userid() == $USER->id) {
return true;
}
}
return false;
}
/**
* Deletes all files related to a saved preset.
*
* @return bool True if the preset is a saved preset and the file exists in the file system; false otherwise.
*/
public function delete(): bool {
if ($this->isplugin) {
// Plugin presets can't be removed.
return false;
}
$exists = false;
$filepath = $this->get_path();
$dir = self::get_file($filepath, '.');
if (!empty($dir)) {
$exists = true;
$fs = get_file_storage();
$files = $fs->get_directory_files(
$dir->get_contextid(),
$dir->get_component(),
$dir->get_filearea(),
$dir->get_itemid(),
$filepath
);
if (!empty($files)) {
foreach ($files as $file) {
$file->delete();
}
}
$dir->delete();
// Reseting storedfile property because the file has been removed.
$this->storedfile = null;
}
return $exists;
}
}