This commit is contained in:
Huong Nguyen
2024-08-27 10:04:55 +07:00
2 changed files with 61 additions and 22 deletions
@@ -18,13 +18,12 @@ declare(strict_types=1);
namespace core_role\reportbuilder\local\entities;
use context;
use context_helper;
use lang_string;
use stdClass;
use core\{context, context_helper};
use core\lang_string;
use core_reportbuilder\local\entities\base;
use core_reportbuilder\local\filters\select;
use core_reportbuilder\local\report\{column, filter};
use stdClass;
/**
* Role entity
@@ -96,7 +95,6 @@ class role extends base {
$this->get_entity_name()
))
->add_joins($this->get_joins())
->set_type(column::TYPE_TEXT)
->add_fields("{$rolealias}.name, {$rolealias}.shortname, {$rolealias}.id, {$contextalias}.id AS contextid")
->add_fields(context_helper::get_preload_record_columns_sql($contextalias))
// The sorting is on name, unless empty (determined by single space - thanks Oracle) then we use shortname.
@@ -106,7 +104,7 @@ class role extends base {
ELSE {$rolealias}.name
END",
])
->set_callback(static function($name, stdClass $role): string {
->add_callback(static function(?string $name, stdClass $role): string {
if ($name === null) {
return '';
}
@@ -124,7 +122,6 @@ class role extends base {
$this->get_entity_name()
))
->add_joins($this->get_joins())
->set_type(column::TYPE_TEXT)
->add_fields("{$rolealias}.name, {$rolealias}.shortname")
// The sorting is on name, unless empty (determined by single space - thanks Oracle) then we use shortname.
->set_is_sortable(true, [
@@ -133,12 +130,9 @@ class role extends base {
ELSE {$rolealias}.name
END",
])
->set_callback(static function($name, stdClass $role): string {
if ($name === null) {
return '';
}
return role_get_name($role, null, ROLENAME_ORIGINAL);
->add_callback(fn(?string $name, stdClass $role) => match ($name) {
null => '',
default => role_get_name($role, null, ROLENAME_ORIGINAL),
});
// Short name column.
@@ -148,8 +142,22 @@ class role extends base {
$this->get_entity_name()
))
->add_joins($this->get_joins())
->set_type(column::TYPE_TEXT)
->add_fields("{$rolealias}.shortname")
->add_field("{$rolealias}.shortname")
->set_is_sortable(true);
// Archetype column.
$columns[] = (new column(
'archetype',
new lang_string('archetype', 'core_role'),
$this->get_entity_name(),
))
->add_joins($this->get_joins())
->add_field("{$rolealias}.archetype")
->add_callback(fn(?string $archetype) => match ($archetype) {
null => '',
'' => get_string('none'),
default => get_string("archetype{$archetype}", 'core_role'),
})
->set_is_sortable(true);
// Description column.
@@ -166,12 +174,9 @@ class role extends base {
->set_type(column::TYPE_LONGTEXT)
->add_field($descriptionfieldsql, 'description')
->add_field("{$rolealias}.shortname")
->set_callback(static function($description, stdClass $role): string {
if ($description === null) {
return '';
}
return role_get_description($role);
->add_callback(fn(?string $description, stdClass $role) => match ($description) {
null => '',
default => role_get_description($role),
});
return $columns;
@@ -198,6 +203,22 @@ class role extends base {
return role_get_names(null, ROLENAME_ORIGINAL, true);
});
// Archetype filter.
$filters[] = (new filter(
select::class,
'archetype',
new lang_string('archetype', 'core_role'),
$this->get_entity_name(),
"{$rolealias}.archetype",
))
->add_joins($this->get_joins())
->set_options_callback(static function(): array {
return array_map(
fn(string $archetype) => get_string("archetype{$archetype}", 'core_role'),
get_role_archetypes(),
);
});
return $filters;
}
}
@@ -104,6 +104,7 @@ final class roles_test extends core_reportbuilder_testcase {
// Role.
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'role:name']);
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'role:shortname']);
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'role:archetype']);
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'role:description']);
// Role assignment.
@@ -114,11 +115,20 @@ final class roles_test extends core_reportbuilder_testcase {
$content = $this->get_custom_report_content($report->get('id'));
$this->assertCount(1, $content);
[$rolename, $roleshortname, $roledescription, $timemodified, $component, $itemid] = array_values($content[0]);
[
$rolename,
$roleshortname,
$rolearchetype,
$roledescription,
$timemodified,
$component,
$itemid,
] = array_values($content[0]);
// Role.
$this->assertEquals('Moocher (Manager)', $rolename);
$this->assertEquals('manager', $roleshortname);
$this->assertEquals('ARCHETYPE: Manager', $rolearchetype);
$this->assertEquals('Managers can access courses and modify them, but usually do not participate in them.',
$roledescription);
@@ -146,6 +156,14 @@ final class roles_test extends core_reportbuilder_testcase {
'role:name_operator' => select::EQUAL_TO,
'role:name_value' => -1,
], false],
'Filter role archetype' => ['role:archetype', [
'role:archetype_operator' => select::EQUAL_TO,
'role:archetype_value' => 'student',
], true],
'Filter role archetype (no match)' => ['role:archetype', [
'role:archetype_operator' => select::EQUAL_TO,
'role:archetype_value' => 'teacher',
], false],
// Role assignment.
'Filter role assignment time modified' => ['role_assignment:timemodified', [