MDL-82936 reportbuilder: new APIs for enhancing report rendering.

We're introducing two new sets of APIs for both custom and system
reports:

* Report actions allow for the definition of an action to belong
  to the report and be rendered alongside the filters button;
* Report info container allows for the definition of content to
  render between the aforementioned action buttons and the table
  content itself
This commit is contained in:
Paul Holden
2025-03-06 14:22:53 +00:00
parent 5670447ece
commit c439e2d3c1
11 changed files with 330 additions and 35 deletions
@@ -0,0 +1,20 @@
issueNumber: MDL-82936
notes:
core_reportbuilder:
- message: >-
The `render_new_report_button` method of the `core_reportbuilder`
renderer has been deprecated. Instead, refer to the report instance
`set_report_action` method
type: deprecated
- message: >-
The base report class, used by both `\core_reportbuilder\system_report`
and `\core_reportbuilder\datasource`, contains new methods for enhancing
report rendering
* `set_report_action` allows for an action button to belong to your
report, and be rendered alongside the filters button;
* `set_report_info_container` allows for content to be rendered by your
report, between the action buttons and the table content
type: improved
+18 -7
View File
@@ -90,6 +90,11 @@ class custom_report_exporter extends persistent_exporter {
protected static function define_other_properties(): array { protected static function define_other_properties(): array {
return [ return [
'table' => ['type' => PARAM_RAW], 'table' => ['type' => PARAM_RAW],
'button' => [
'type' => report_action_exporter::read_properties_definition(),
'optional' => true,
],
'infocontainer' => ['type' => PARAM_RAW],
'filtersapplied' => ['type' => PARAM_INT], 'filtersapplied' => ['type' => PARAM_INT],
'filterspresent' => ['type' => PARAM_BOOL], 'filterspresent' => ['type' => PARAM_BOOL],
'filtersform' => ['type' => PARAM_RAW], 'filtersform' => ['type' => PARAM_RAW],
@@ -136,6 +141,7 @@ class custom_report_exporter extends persistent_exporter {
/** @var datasource $report */ /** @var datasource $report */
$report = manager::get_report_from_persistent($this->persistent); $report = manager::get_report_from_persistent($this->persistent);
$optionalvalues = [];
$filterspresent = false; $filterspresent = false;
$filtersform = ''; $filtersform = '';
$attributes = []; $attributes = [];
@@ -151,6 +157,11 @@ class custom_report_exporter extends persistent_exporter {
$table = custom_report_table_view::create($this->persistent->get('id'), $this->download); $table = custom_report_table_view::create($this->persistent->get('id'), $this->download);
$table->set_filterset($filterset); $table->set_filterset($filterset);
// Export global report action.
if ($reportaction = $report->get_report_action()) {
$optionalvalues['button'] = $reportaction->export_for_template($output);
}
// Generate filters form if report contains any filters. // Generate filters form if report contains any filters.
$filterspresent = !empty($report->get_active_filters()); $filterspresent = !empty($report->get_active_filters());
if ($filterspresent && empty($this->download)) { if ($filterspresent && empty($this->download)) {
@@ -169,26 +180,26 @@ class custom_report_exporter extends persistent_exporter {
} }
// If we are editing we need all this information for the template. // If we are editing we need all this information for the template.
$editordata = [];
if ($this->editmode) { if ($this->editmode) {
$menucardsexporter = new custom_report_column_cards_exporter(null, ['report' => $report]); $menucardsexporter = new custom_report_column_cards_exporter(null, ['report' => $report]);
$editordata['sidebarmenucards'] = (array) $menucardsexporter->export($output); $optionalvalues['sidebarmenucards'] = (array) $menucardsexporter->export($output);
$conditionsexporter = new custom_report_conditions_exporter(null, ['report' => $report]); $conditionsexporter = new custom_report_conditions_exporter(null, ['report' => $report]);
$editordata['conditions'] = (array) $conditionsexporter->export($output); $optionalvalues['conditions'] = (array) $conditionsexporter->export($output);
$filtersexporter = new custom_report_filters_exporter(null, ['report' => $report]); $filtersexporter = new custom_report_filters_exporter(null, ['report' => $report]);
$editordata['filters'] = (array) $filtersexporter->export($output); $optionalvalues['filters'] = (array) $filtersexporter->export($output);
$sortingexporter = new custom_report_columns_sorting_exporter(null, ['report' => $report]); $sortingexporter = new custom_report_columns_sorting_exporter(null, ['report' => $report]);
$editordata['sorting'] = (array) $sortingexporter->export($output); $optionalvalues['sorting'] = (array) $sortingexporter->export($output);
$cardviewexporter = new custom_report_card_view_exporter(null, ['report' => $report]); $cardviewexporter = new custom_report_card_view_exporter(null, ['report' => $report]);
$editordata['cardview'] = (array) $cardviewexporter->export($output); $optionalvalues['cardview'] = (array) $cardviewexporter->export($output);
} }
return [ return [
'table' => $output->render($table), 'table' => $output->render($table),
'infocontainer' => $report->get_report_info_container(),
'filtersapplied' => $report->get_applied_filter_count(), 'filtersapplied' => $report->get_applied_filter_count(),
'filterspresent' => $filterspresent, 'filterspresent' => $filterspresent,
'filtersform' => $filtersform, 'filtersform' => $filtersform,
@@ -196,7 +207,7 @@ class custom_report_exporter extends persistent_exporter {
'classes' => $classes ?? '', 'classes' => $classes ?? '',
'editmode' => $this->editmode, 'editmode' => $this->editmode,
'javascript' => '', 'javascript' => '',
] + $editordata; ] + $optionalvalues;
} }
/** /**
@@ -0,0 +1,106 @@
<?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/>.
declare(strict_types=1);
namespace core_reportbuilder\external;
use core\context\system;
use core\external\exporter;
use core\output\renderer_base;
use core_reportbuilder\output\report_action;
/**
* Encapsulate a report action
*
* @package core_reportbuilder
* @copyright 2025 Paul Holden <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class report_action_exporter extends exporter {
/**
* Return a list of objects that are related to the exporter
*
* @return array
*/
protected static function define_related(): array {
return [
'reportaction' => report_action::class,
];
}
/**
* Return the list of additional properties for read structure and export
*
* @return array[]
*/
protected static function define_other_properties(): array {
return [
'tag' => [
'type' => PARAM_ALPHA,
],
'title' => [
'type' => PARAM_TEXT,
],
'attributes' => [
'type' => [
'name' => [
'type' => PARAM_RAW,
'optional' => true,
],
'value' => [
'type' => PARAM_RAW,
'optional' => true,
],
],
],
];
}
/**
* Return text formatting parameters for title property
*
* @return array
*/
protected function get_format_parameters_for_title(): array {
return [
'context' => system::instance(),
];
}
/**
* Get the additional values to inject while exporting
*
* @param renderer_base $output
* @return array
*/
protected function get_other_values(renderer_base $output): array {
/** @var report_action $reportaction */
$reportaction = $this->related['reportaction'];
$attributes = array_map(static function($key, $value): array {
return ['name' => $key, 'value' => $value];
}, array_keys($reportaction->attributes), $reportaction->attributes);
return [
'tag' => $reportaction->tag ?: 'button',
'title' => $reportaction->title,
'attributes' => $attributes,
];
}
}
+13 -1
View File
@@ -67,6 +67,11 @@ class system_report_exporter extends persistent_exporter {
return [ return [
'table' => ['type' => PARAM_RAW], 'table' => ['type' => PARAM_RAW],
'parameters' => ['type' => PARAM_RAW], 'parameters' => ['type' => PARAM_RAW],
'button' => [
'type' => report_action_exporter::read_properties_definition(),
'optional' => true,
],
'infocontainer' => ['type' => PARAM_RAW],
'filterspresent' => ['type' => PARAM_BOOL], 'filterspresent' => ['type' => PARAM_BOOL],
'filtersapplied' => ['type' => PARAM_INT], 'filtersapplied' => ['type' => PARAM_INT],
'filtersform' => ['type' => PARAM_RAW], 'filtersform' => ['type' => PARAM_RAW],
@@ -108,6 +113,12 @@ class system_report_exporter extends persistent_exporter {
$table = system_report_table::create($reportid, $params); $table = system_report_table::create($reportid, $params);
$table->set_filterset($filterset); $table->set_filterset($filterset);
// Export global report action.
$optionalvalues = [];
if ($reportaction = $source->get_report_action()) {
$optionalvalues['button'] = $reportaction->export_for_template($output);
}
// Generate filters form if report uses the default form, and contains any filters. // Generate filters form if report uses the default form, and contains any filters.
$filterspresent = $source->get_filter_form_default() && !empty($source->get_active_filters()); $filterspresent = $source->get_filter_form_default() && !empty($source->get_active_filters());
if ($filterspresent && empty($params['download'])) { if ($filterspresent && empty($params['download'])) {
@@ -131,11 +142,12 @@ class system_report_exporter extends persistent_exporter {
return [ return [
'table' => $output->render($table), 'table' => $output->render($table),
'parameters' => $parameters, 'parameters' => $parameters,
'infocontainer' => $source->get_report_info_container(),
'filterspresent' => $filterspresent, 'filterspresent' => $filterspresent,
'filtersapplied' => $source->get_applied_filter_count(), 'filtersapplied' => $source->get_applied_filter_count(),
'filtersform' => $filterspresent ? $filtersform->render() : '', 'filtersform' => $filterspresent ? $filtersform->render() : '',
'attributes' => $attributes, 'attributes' => $attributes,
'classes' => $classes ?? '', 'classes' => $classes ?? '',
]; ] + $optionalvalues;
} }
} }
+44 -2
View File
@@ -23,9 +23,9 @@ use context;
use lang_string; use lang_string;
use core_reportbuilder\local\entities\base as entity_base; use core_reportbuilder\local\entities\base as entity_base;
use core_reportbuilder\local\filters\base as filter_base; use core_reportbuilder\local\filters\base as filter_base;
use core_reportbuilder\local\helpers\database; use core_reportbuilder\local\helpers\{database, user_filter_manager};
use core_reportbuilder\local\helpers\user_filter_manager;
use core_reportbuilder\local\models\report; use core_reportbuilder\local\models\report;
use core_reportbuilder\output\report_action;
/** /**
* Base class for all reports * Base class for all reports
@@ -87,6 +87,12 @@ abstract class base {
/** @var int Default paging size */ /** @var int Default paging size */
private $defaultperpage = self::DEFAULT_PAGESIZE; private $defaultperpage = self::DEFAULT_PAGESIZE;
/** @var report_action $reportaction */
private report_action|null $reportaction = null;
/** @var string $reportinfocontainer */
private string $reportinfocontainer = '';
/** @var array $attributes */ /** @var array $attributes */
private $attributes = []; private $attributes = [];
@@ -882,6 +888,42 @@ abstract class base {
return $this->defaultperpage; return $this->defaultperpage;
} }
/**
* Sets the report action to be rendered above the table
*
* @param report_action $reportaction
*/
final public function set_report_action(report_action $reportaction): void {
$this->reportaction = $reportaction;
}
/**
* Gets the report action to be rendered abover the table
*
* @return report_action|null
*/
final public function get_report_action(): ?report_action {
return $this->reportaction;
}
/**
* Sets the report info container content to be rendered between action buttons and table
*
* @param string $reportinfocontainer
*/
final public function set_report_info_container(string $reportinfocontainer): void {
$this->reportinfocontainer = $reportinfocontainer;
}
/**
* Gets the report info container content to be rendered between action buttons and table
*
* @return string
*/
final public function get_report_info_container(): string {
return $this->reportinfocontainer;
}
/** /**
* Add report attributes (data-, class, etc.) that will be included in HTML when report is displayed * Add report attributes (data-, class, etc.) that will be included in HTML when report is displayed
* *
@@ -108,8 +108,13 @@ class renderer extends plugin_renderer_base {
* Renders the New report button * Renders the New report button
* *
* @return string * @return string
*
* @deprecated since Moodle 5.0 - please use {@see \core_reportbuilder\system_report::set_report_action} instead
*/ */
#[\core\attribute\deprecated('\core_reportbuilder\system_report::set_report_action', mdl: 'MDL-82936', since: '5.0')]
public function render_new_report_button(): string { public function render_new_report_button(): string {
\core\deprecation::emit_deprecation_if_present([self::class, __FUNCTION__]);
return html_writer::tag('button', get_string('newreport', 'core_reportbuilder'), [ return html_writer::tag('button', get_string('newreport', 'core_reportbuilder'), [
'class' => 'btn btn-primary my-auto', 'class' => 'btn btn-primary my-auto',
'data-action' => 'report-create', 'data-action' => 'report-create',
@@ -0,0 +1,57 @@
<?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/>.
declare(strict_types=1);
namespace core_reportbuilder\output;
use core\output\{renderer_base, templatable};
use core_reportbuilder\external\report_action_exporter;
/**
* Encapsulate a report action
*
* @package core_reportbuilder
* @copyright 2025 Paul Holden <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class report_action implements templatable {
/**
* Constructor
*
* @param string $title
* @param array $attributes
* @param string $tag
*/
public function __construct(
/** @var string */
public readonly string $title,
/** @var array */
public readonly array $attributes,
/** @var string */
public readonly string $tag = 'button',
) {
}
#[\Override]
public function export_for_template(renderer_base $output): array {
$exporter = new report_action_exporter(null, ['reportaction' => $this]);
return (array) $exporter->export($output);
}
}
+20 -7
View File
@@ -30,6 +30,15 @@
"value": "1" "value": "1"
}], }],
"table": "table", "table": "table",
"button": {
"tag": "button",
"title": "Click me",
"attributes": [{
"name": "class",
"value": "btn btn-primary"
}]
},
"infocontainer": "Here's some information",
"filterspresent": true, "filterspresent": true,
"filtersform": "form" "filtersform": "form"
} }
@@ -41,15 +50,19 @@
data-parameter="{{parameters}}" data-parameter="{{parameters}}"
{{#attributes}}{{name}}="{{value}}" {{/attributes}}> {{#attributes}}{{name}}="{{value}}" {{/attributes}}>
<div class="reportbuilder-wrapper"> <div class="reportbuilder-wrapper">
{{#filterspresent}} {{! Action buttons }}
<div class="dropdown d-flex justify-content-end"> <div class="dropdown d-flex justify-content-end mb-3">
{{#button}}
<{{{tag}}} {{#attributes}}{{name}}="{{value}}" {{/attributes}}>{{title}}</{{{tag}}}>
{{/button}}
{{#filterspresent}}
{{>core_reportbuilder/local/filters/area}} {{>core_reportbuilder/local/filters/area}}
</div> {{/filterspresent}}
{{/filterspresent}}
{{! Table }}
<div class="mt-2">
{{{table}}}
</div> </div>
{{! Info container }}
{{#infocontainer}}<div class="mt-2">{{{.}}}</div>{{/infocontainer}}
{{! Table }}
<div class="mt-2">{{{table}}}</div>
</div> </div>
</div> </div>
@@ -24,6 +24,7 @@ use core_reportbuilder_generator;
use moodle_url; use moodle_url;
use core_reportbuilder\local\helpers\user_filter_manager; use core_reportbuilder\local\helpers\user_filter_manager;
use core_reportbuilder\local\filters\text; use core_reportbuilder\local\filters\text;
use core_reportbuilder\output\report_action;
use core_user\reportbuilder\datasource\users; use core_user\reportbuilder\datasource\users;
/** /**
@@ -47,7 +48,11 @@ final class custom_report_exporter_test extends advanced_testcase {
/** @var core_reportbuilder_generator $generator */ /** @var core_reportbuilder_generator $generator */
$generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder');
$report = $generator->create_report(['name' => 'My report', 'source' => users::class, 'default' => false]); $report = $generator->create_report(['name' => 'My report', 'source' => users::class, 'default' => false]);
manager::get_report_from_persistent($report)->add_attributes(['data-foo' => 'bar', 'data-another' => '1']);
$instance = manager::get_report_from_persistent($report);
$instance->set_report_action(new report_action('Add', []));
$instance->set_report_info_container('Hello');
$instance->add_attributes(['data-foo' => 'bar', 'data-another' => '1']);
$PAGE->set_url(new moodle_url('/')); $PAGE->set_url(new moodle_url('/'));
@@ -55,6 +60,7 @@ final class custom_report_exporter_test extends advanced_testcase {
$export = $exporter->export($PAGE->get_renderer('core_reportbuilder')); $export = $exporter->export($PAGE->get_renderer('core_reportbuilder'));
$this->assertNotEmpty($export->table); $this->assertNotEmpty($export->table);
$this->assertEquals('Hello', $export->infocontainer);
$this->assertEquals(0, $export->filtersapplied); $this->assertEquals(0, $export->filtersapplied);
$this->assertFalse($export->filterspresent); $this->assertFalse($export->filterspresent);
$this->assertEmpty($export->filtersform); $this->assertEmpty($export->filtersform);
@@ -62,6 +68,7 @@ final class custom_report_exporter_test extends advanced_testcase {
$this->assertEmpty($export->attributes); $this->assertEmpty($export->attributes);
// The following are all generated by additional exporters. // The following are all generated by additional exporters.
$this->assertEmpty($export->button);
$this->assertNotEmpty($export->sidebarmenucards); $this->assertNotEmpty($export->sidebarmenucards);
$this->assertNotEmpty($export->conditions); $this->assertNotEmpty($export->conditions);
$this->assertNotEmpty($export->filters); $this->assertNotEmpty($export->filters);
@@ -80,7 +87,11 @@ final class custom_report_exporter_test extends advanced_testcase {
/** @var core_reportbuilder_generator $generator */ /** @var core_reportbuilder_generator $generator */
$generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder');
$report = $generator->create_report(['name' => 'My report', 'source' => users::class, 'default' => false]); $report = $generator->create_report(['name' => 'My report', 'source' => users::class, 'default' => false]);
manager::get_report_from_persistent($report)->add_attributes(['data-foo' => 'bar', 'data-another' => '1']);
$instance = manager::get_report_from_persistent($report);
$instance->set_report_action(new report_action('Add', []));
$instance->set_report_info_container('Hello');
$instance->add_attributes(['data-foo' => 'bar', 'data-another' => '1']);
$PAGE->set_url(new moodle_url('/')); $PAGE->set_url(new moodle_url('/'));
@@ -88,6 +99,7 @@ final class custom_report_exporter_test extends advanced_testcase {
$export = $exporter->export($PAGE->get_renderer('core_reportbuilder')); $export = $exporter->export($PAGE->get_renderer('core_reportbuilder'));
$this->assertNotEmpty($export->table); $this->assertNotEmpty($export->table);
$this->assertEquals('Hello', $export->infocontainer);
$this->assertEquals(0, $export->filtersapplied); $this->assertEquals(0, $export->filtersapplied);
$this->assertFalse($export->filterspresent); $this->assertFalse($export->filterspresent);
$this->assertEmpty($export->filtersform); $this->assertEmpty($export->filtersform);
@@ -97,7 +109,10 @@ final class custom_report_exporter_test extends advanced_testcase {
['name' => 'data-another', 'value' => '1'] ['name' => 'data-another', 'value' => '1']
], $export->attributes); ], $export->attributes);
// The following are all generated by additional exporters, and should not be present when not editing. // The following are all generated by additional exporters.
$this->assertNotEmpty($export->button);
// The following should not be present when not editing.
$this->assertObjectNotHasProperty('sidebarmenucards', $export); $this->assertObjectNotHasProperty('sidebarmenucards', $export);
$this->assertObjectNotHasProperty('conditions', $export); $this->assertObjectNotHasProperty('conditions', $export);
$this->assertObjectNotHasProperty('filters', $export); $this->assertObjectNotHasProperty('filters', $export);
+18 -10
View File
@@ -23,6 +23,8 @@ use core_reportbuilder_generator;
use core_external\external_api; use core_external\external_api;
use externallib_advanced_testcase; use externallib_advanced_testcase;
use core_reportbuilder\exception\report_access_exception; use core_reportbuilder\exception\report_access_exception;
use core_reportbuilder\manager;
use core_reportbuilder\output\report_action;
use core_user\reportbuilder\datasource\users; use core_user\reportbuilder\datasource\users;
defined('MOODLE_INTERNAL') || die(); defined('MOODLE_INTERNAL') || die();
@@ -49,12 +51,11 @@ final class get_test extends externallib_advanced_testcase {
/** @var core_reportbuilder_generator $generator */ /** @var core_reportbuilder_generator $generator */
$generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder');
$report = $generator->create_report(['name' => 'My report', 'source' => users::class, 'default' => false]);
$report = $generator->create_report([ $instance = manager::get_report_from_persistent($report);
'name' => 'My report', $instance->set_report_action(new report_action('Add', []));
'source' => users::class, $instance->set_report_info_container('Hello');
'default' => false,
]);
// Add two filters. // Add two filters.
$filterfullname = $generator->create_filter(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:fullname']); $filterfullname = $generator->create_filter(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:fullname']);
@@ -68,6 +69,8 @@ final class get_test extends externallib_advanced_testcase {
$this->assertEquals($result['source'], users::class); $this->assertEquals($result['source'], users::class);
$this->assertNotEmpty($result['table']); $this->assertNotEmpty($result['table']);
$this->assertNotEmpty($result['javascript']); $this->assertNotEmpty($result['javascript']);
$this->assertEmpty($result['button']);
$this->assertEquals('Hello', $result['infocontainer']);
$this->assertFalse($result['filterspresent']); $this->assertFalse($result['filterspresent']);
$this->assertEmpty($result['filtersform']); $this->assertEmpty($result['filtersform']);
$this->assertTrue($result['editmode']); $this->assertTrue($result['editmode']);
@@ -94,12 +97,11 @@ final class get_test extends externallib_advanced_testcase {
/** @var core_reportbuilder_generator $generator */ /** @var core_reportbuilder_generator $generator */
$generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder');
$report = $generator->create_report(['name' => 'My report', 'source' => users::class, 'default' => false]);
$report = $generator->create_report([ $instance = manager::get_report_from_persistent($report);
'name' => 'My report', $instance->set_report_action(new report_action('Add', []));
'source' => users::class, $instance->set_report_info_container('Hello');
'default' => false,
]);
// Add two filters. // Add two filters.
$generator->create_filter(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:fullname']); $generator->create_filter(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:fullname']);
@@ -113,6 +115,12 @@ final class get_test extends externallib_advanced_testcase {
$this->assertEquals($result['source'], users::class); $this->assertEquals($result['source'], users::class);
$this->assertNotEmpty($result['table']); $this->assertNotEmpty($result['table']);
$this->assertNotEmpty($result['javascript']); $this->assertNotEmpty($result['javascript']);
$this->assertEquals([
'tag' => 'button',
'title' => 'Add',
'attributes' => [],
], $result['button']);
$this->assertEquals('Hello', $result['infocontainer']);
$this->assertTrue($result['filterspresent']); $this->assertTrue($result['filterspresent']);
$this->assertNotEmpty($result['filtersform']); $this->assertNotEmpty($result['filtersform']);
$this->assertFalse($result['editmode']); $this->assertFalse($result['editmode']);
@@ -21,6 +21,7 @@ namespace core_reportbuilder\external;
use advanced_testcase; use advanced_testcase;
use context_system; use context_system;
use moodle_url; use moodle_url;
use core_reportbuilder\output\report_action;
use core_reportbuilder\system_report_available; use core_reportbuilder\system_report_available;
use core_reportbuilder\system_report_factory; use core_reportbuilder\system_report_factory;
@@ -71,16 +72,21 @@ final class system_report_exporter_test extends advanced_testcase {
// Prevent debug warnings from flexible_table. // Prevent debug warnings from flexible_table.
$PAGE->set_url(new moodle_url('/')); $PAGE->set_url(new moodle_url('/'));
$systemreport = system_report_factory::create(system_report_available::class, context_system::instance(), '', '', 0, $instance = system_report_factory::create(system_report_available::class, context_system::instance(), '', '', 0,
['withfilters' => $withfilters])->add_attributes(['data-foo' => 'bar', 'data-another' => '1']); ['withfilters' => $withfilters]);
$instance->set_report_action(new report_action('Add', []));
$instance->set_report_info_container('Hello');
$instance->add_attributes(['data-foo' => 'bar', 'data-another' => '1']);
$exporter = new system_report_exporter($systemreport->get_report_persistent(), [ $exporter = new system_report_exporter($instance->get_report_persistent(), [
'source' => $systemreport, 'source' => $instance,
'parameters' => json_encode($systemreport->get_parameters()), 'parameters' => json_encode($instance->get_parameters()),
]); ]);
$data = $exporter->export($PAGE->get_renderer('core_reportbuilder')); $data = $exporter->export($PAGE->get_renderer('core_reportbuilder'));
$this->assertNotEmpty($data->table); $this->assertNotEmpty($data->table);
$this->assertNotEmpty($data->button);
$this->assertEquals('Hello', $data->infocontainer);
if ($withfilters) { if ($withfilters) {
$this->assertEquals('{"withfilters":true}', $data->parameters); $this->assertEquals('{"withfilters":true}', $data->parameters);