This commit is contained in:
Sara Arjona 2022-12-14 17:29:13 +01:00
commit 63cbadb161
11 changed files with 220 additions and 44 deletions

View File

@ -93,6 +93,13 @@ class custom_report_exporter extends persistent_exporter {
'filtersapplied' => ['type' => PARAM_INT],
'filterspresent' => ['type' => PARAM_BOOL],
'filtersform' => ['type' => PARAM_RAW],
'attributes' => [
'type' => [
'name' => ['type' => PARAM_TEXT],
'value' => ['type' => PARAM_TEXT]
],
'multiple' => true,
],
'editmode' => ['type' => PARAM_BOOL],
'sidebarmenucards' => [
'type' => custom_report_column_cards_exporter::read_properties_definition(),
@ -130,6 +137,7 @@ class custom_report_exporter extends persistent_exporter {
$filterspresent = false;
$filtersform = '';
$attributes = [];
if ($this->editmode) {
$table = custom_report_table::create($this->persistent->get('id'));
@ -147,6 +155,10 @@ class custom_report_exporter extends persistent_exporter {
if ($filterspresent) {
$filtersform = $this->generate_filters_form()->render();
}
// Get the report attributes.
$attributes = array_map(static function($key, $value): array {
return ['name' => $key, 'value' => $value];
}, array_keys($report->get_attributes()), $report->get_attributes());
}
// If we are editing we need all this information for the template.
@ -173,6 +185,7 @@ class custom_report_exporter extends persistent_exporter {
'filtersapplied' => $report->get_applied_filter_count(),
'filterspresent' => $filterspresent,
'filtersform' => $filtersform,
'attributes' => $attributes,
'editmode' => $this->editmode,
'javascript' => '',
] + $editordata;

View File

@ -70,6 +70,13 @@ class system_report_exporter extends persistent_exporter {
'filterspresent' => ['type' => PARAM_BOOL],
'filtersapplied' => ['type' => PARAM_INT],
'filtersform' => ['type' => PARAM_RAW],
'attributes' => [
'type' => [
'name' => ['type' => PARAM_TEXT],
'value' => ['type' => PARAM_TEXT]
],
'multiple' => true,
],
];
}
@ -109,12 +116,18 @@ class system_report_exporter extends persistent_exporter {
$filtersform->set_data_for_dynamic_submission();
}
// Get the report attributes.
$attributes = array_map(static function($key, $value): array {
return ['name' => $key, 'value' => $value];
}, array_keys($source->get_attributes()), $source->get_attributes());
return [
'table' => $output->render($table),
'parameters' => $parameters,
'filterspresent' => $filterspresent,
'filtersapplied' => $source->get_applied_filter_count(),
'filtersform' => $filterspresent ? $filtersform->render() : '',
'attributes' => $attributes,
];
}
}

View File

@ -87,6 +87,9 @@ abstract class base {
/** @var int Default paging size */
private $defaultperpage = self::DEFAULT_PAGESIZE;
/** @var array $attributes */
private $attributes = [];
/**
* Base report constructor
*
@ -744,4 +747,24 @@ abstract class base {
public function get_default_per_page(): int {
return $this->defaultperpage;
}
/**
* Add report attributes (data-, class, etc.) that will be included in HTML when report is displayed
*
* @param array $attributes
* @return self
*/
public function add_attributes(array $attributes): self {
$this->attributes = $attributes + $this->attributes;
return $this;
}
/**
* Returns the report HTML attributes
*
* @return array
*/
public function get_attributes(): array {
return $this->attributes;
}
}

View File

@ -25,6 +25,10 @@
"type": 1,
"table": "table",
"editmode": true,
"attributes": [{
"name": "data-custom",
"value": "1"
}],
"sidebarmenucards": [{
"menucards": [{
"name": "General",
@ -93,7 +97,8 @@
data-report-id="{{id}}"
data-report-type="{{type}}"
data-parameter="[]"
{{#editmode}}data-editing{{/editmode}}>
{{#editmode}}data-editing{{/editmode}}
{{#attributes}}{{name}}="{{value}}" {{/attributes}}>
<div class="reportbuilder-wrapper d-flex flex-column flex-lg-row">
{{#editmode}}
{{! Menu sidebar }}

View File

@ -25,6 +25,10 @@
"contextid": 1,
"type": 1,
"parameters": [],
"attributes": [{
"name": "data-custom",
"value": "1"
}],
"table": "table",
"filterspresent": true,
"filtersform": "form"
@ -34,7 +38,8 @@
data-region="core_reportbuilder/report"
data-report-id="{{id}}"
data-report-type="{{type}}"
data-parameter="{{parameters}}">
data-parameter="{{parameters}}"
{{#attributes}}{{name}}="{{value}}" {{/attributes}}>
<div class="reportbuilder-wrapper">
{{#filterspresent}}
<div class="dropdown d-flex justify-content-end">

View File

@ -19,6 +19,7 @@ declare(strict_types=1);
namespace core_reportbuilder\external;
use advanced_testcase;
use core_reportbuilder\manager;
use core_reportbuilder_generator;
use moodle_url;
use core_reportbuilder\local\helpers\user_filter_manager;
@ -46,6 +47,7 @@ class custom_report_exporter_test extends advanced_testcase {
/** @var core_reportbuilder_generator $generator */
$generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder');
$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']);
$PAGE->set_url(new moodle_url('/'));
@ -57,6 +59,7 @@ class custom_report_exporter_test extends advanced_testcase {
$this->assertFalse($export->filterspresent);
$this->assertEmpty($export->filtersform);
$this->assertTrue($export->editmode);
$this->assertEmpty($export->attributes);
// The following are all generated by additional exporters.
$this->assertNotEmpty($export->sidebarmenucards);
@ -77,6 +80,7 @@ class custom_report_exporter_test extends advanced_testcase {
/** @var core_reportbuilder_generator $generator */
$generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder');
$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']);
$PAGE->set_url(new moodle_url('/'));
@ -88,6 +92,10 @@ class custom_report_exporter_test extends advanced_testcase {
$this->assertFalse($export->filterspresent);
$this->assertEmpty($export->filtersform);
$this->assertFalse($export->editmode);
$this->assertEquals([
['name' => 'data-foo', 'value' => 'bar'],
['name' => 'data-another', 'value' => '1']
], $export->attributes);
// The following are all generated by additional exporters, and should not be present when not editing.
$this->assertObjectNotHasAttribute('sidebarmenucards', $export);

View File

@ -71,7 +71,7 @@ class system_report_exporter_test extends advanced_testcase {
$PAGE->set_url(new moodle_url('/'));
$systemreport = system_report_factory::create(system_report_available::class, context_system::instance(), '', '', 0,
['withfilters' => $withfilters]);
['withfilters' => $withfilters])->add_attributes(['data-foo' => 'bar', 'data-another' => '1']);
$exporter = new system_report_exporter($systemreport->get_report_persistent(), [
'source' => $systemreport,
@ -90,5 +90,10 @@ class system_report_exporter_test extends advanced_testcase {
$this->assertFalse($data->filterspresent);
$this->assertEmpty($data->filtersform);
}
$this->assertEquals([
['name' => 'data-foo', 'value' => 'bar'],
['name' => 'data-another', 'value' => '1']
], $data->attributes);
}
}

View File

@ -1,6 +1,12 @@
This file describes API changes in /reportbuilder/*
Information provided here is intended especially for developers.
=== 4.2 ===
* New methods `[add|get]_attributes` added to report base class, for including custom attributes in report container HTML
* The following attributes can be added to custom reports in order to control card view display (via the `add_attributes` method):
- `data-force-card` to force cards view
- `data-force-table` to force table view
=== 4.1 ===
* New method `add_action_divider()` in base system report class, to allow adding a divider to the action menu.
* New external method `core_reportbuilder_set_filters` for setting report filter values (plus `setFilters` AJAX repository

View File

@ -282,10 +282,7 @@ $rb-right-sidebar-width: 350px;
}
}
/**
* Audiences.
*/
/* Audiences. */
.reportbuilder-audiences-container {
/* 'OR' separator. */
.audience-separator {
@ -378,10 +375,17 @@ $rb-right-sidebar-width: 350px;
}
}
}
/* Report table card view for small screens */
.reportbuilder-report[data-report-type="0"]:not([data-editing]) {
// Report card view for small screens (if not forcing table).
@include media-breakpoint-down(xs) {
@include table-cards;
&:not([data-force-table]) {
@include table-cards;
}
}
// Report card view for bigger screens (if forcing card).
@include media-breakpoint-up(sm) {
&[data-force-card] {
@include table-cards;
}
}
}

View File

@ -21575,9 +21575,7 @@ div.editor_atto_toolbar button .icon {
.reportbuilder-toggle-card .toggle-card-button.collapsed .expanded-icon-container {
display: none; }
/**
* Audiences.
*/
/* Audiences. */
.reportbuilder-audiences-container {
/* 'OR' separator. */
/* Card action icons. */ }
@ -21595,11 +21593,10 @@ div.editor_atto_toolbar button .icon {
margin-right: 0; }
/* Report table card view styles */
/* Report table card view for small screens */
@media (max-width: 575.98px) {
.reportbuilder-report[data-report-type="0"]:not([data-editing]) table.reportbuilder-table thead {
.reportbuilder-report[data-report-type="0"]:not([data-editing]):not([data-force-table]) table.reportbuilder-table thead {
display: none; }
.reportbuilder-report[data-report-type="0"]:not([data-editing]) table.reportbuilder-table tr {
.reportbuilder-report[data-report-type="0"]:not([data-editing]):not([data-force-table]) table.reportbuilder-table tr {
display: flex;
flex-direction: column;
margin: .5rem 0;
@ -21610,39 +21607,89 @@ div.editor_atto_toolbar button .icon {
background-clip: border-box;
border: 1px solid rgba(0, 0, 0, 0.125);
border-radius: 0.5rem; }
.reportbuilder-report[data-report-type="0"]:not([data-editing]) table.reportbuilder-table tr:hover {
.reportbuilder-report[data-report-type="0"]:not([data-editing]):not([data-force-table]) table.reportbuilder-table tr:hover {
background-color: #fff !important;
/* stylelint-disable-line declaration-no-important */ }
.reportbuilder-report[data-report-type="0"]:not([data-editing]) table.reportbuilder-table tr.emptyrow {
.reportbuilder-report[data-report-type="0"]:not([data-editing]):not([data-force-table]) table.reportbuilder-table tr.emptyrow {
display: none; }
.reportbuilder-report[data-report-type="0"]:not([data-editing]) table.reportbuilder-table tr:not(.show) td[data-cardviewhidden] {
.reportbuilder-report[data-report-type="0"]:not([data-editing]):not([data-force-table]) table.reportbuilder-table tr:not(.show) td[data-cardviewhidden] {
display: none; }
.reportbuilder-report[data-report-type="0"]:not([data-editing]) table.reportbuilder-table tr td {
.reportbuilder-report[data-report-type="0"]:not([data-editing]):not([data-force-table]) table.reportbuilder-table tr td {
display: block;
min-height: 3.6rem;
padding: .5rem .25rem;
border: none; }
.reportbuilder-report[data-report-type="0"]:not([data-editing]) table.reportbuilder-table tr td::before {
.reportbuilder-report[data-report-type="0"]:not([data-editing]):not([data-force-table]) table.reportbuilder-table tr td::before {
content: attr(data-cardtitle);
display: block;
text-transform: uppercase;
font-size: 70%;
color: #343a40; }
.reportbuilder-report[data-report-type="0"]:not([data-editing]) table.reportbuilder-table tr td:not([data-cardtitle]) {
.reportbuilder-report[data-report-type="0"]:not([data-editing]):not([data-force-table]) table.reportbuilder-table tr td:not([data-cardtitle]) {
min-height: 3rem; }
.reportbuilder-report[data-report-type="0"]:not([data-editing]) table.reportbuilder-table tr td:not(:first-child):not(.card-toggle) {
.reportbuilder-report[data-report-type="0"]:not([data-editing]):not([data-force-table]) table.reportbuilder-table tr td:not(:first-child):not(.card-toggle) {
border-top: 1px solid rgba(0, 0, 0, 0.125); }
.reportbuilder-report[data-report-type="0"]:not([data-editing]) table.reportbuilder-table tr td:first-child {
.reportbuilder-report[data-report-type="0"]:not([data-editing]):not([data-force-table]) table.reportbuilder-table tr td:first-child {
padding-right: 2rem; }
.reportbuilder-report[data-report-type="0"]:not([data-editing]) table.reportbuilder-table tr td.card-toggle {
.reportbuilder-report[data-report-type="0"]:not([data-editing]):not([data-force-table]) table.reportbuilder-table tr td.card-toggle {
display: block !important;
/* stylelint-disable-line declaration-no-important */
position: absolute;
right: 10px; }
.reportbuilder-report[data-report-type="0"]:not([data-editing]) table.reportbuilder-table tr td.card-toggle button {
.reportbuilder-report[data-report-type="0"]:not([data-editing]):not([data-force-table]) table.reportbuilder-table tr td.card-toggle button {
padding: 0 .5rem;
color: #6a737b; }
.reportbuilder-report[data-report-type="0"]:not([data-editing]) table.reportbuilder-table tr td.card-toggle button i {
.reportbuilder-report[data-report-type="0"]:not([data-editing]):not([data-force-table]) table.reportbuilder-table tr td.card-toggle button i {
font-size: 1.5em;
font-weight: bold; } }
@media (min-width: 576px) {
.reportbuilder-report[data-report-type="0"]:not([data-editing])[data-force-card] table.reportbuilder-table thead {
display: none; }
.reportbuilder-report[data-report-type="0"]:not([data-editing])[data-force-card] table.reportbuilder-table tr {
display: flex;
flex-direction: column;
margin: .5rem 0;
padding: .25rem .5rem 0 .5rem;
background-color: #fff !important;
/* stylelint-disable-line declaration-no-important */
word-wrap: break-word;
background-clip: border-box;
border: 1px solid rgba(0, 0, 0, 0.125);
border-radius: 0.5rem; }
.reportbuilder-report[data-report-type="0"]:not([data-editing])[data-force-card] table.reportbuilder-table tr:hover {
background-color: #fff !important;
/* stylelint-disable-line declaration-no-important */ }
.reportbuilder-report[data-report-type="0"]:not([data-editing])[data-force-card] table.reportbuilder-table tr.emptyrow {
display: none; }
.reportbuilder-report[data-report-type="0"]:not([data-editing])[data-force-card] table.reportbuilder-table tr:not(.show) td[data-cardviewhidden] {
display: none; }
.reportbuilder-report[data-report-type="0"]:not([data-editing])[data-force-card] table.reportbuilder-table tr td {
display: block;
min-height: 3.6rem;
padding: .5rem .25rem;
border: none; }
.reportbuilder-report[data-report-type="0"]:not([data-editing])[data-force-card] table.reportbuilder-table tr td::before {
content: attr(data-cardtitle);
display: block;
text-transform: uppercase;
font-size: 70%;
color: #343a40; }
.reportbuilder-report[data-report-type="0"]:not([data-editing])[data-force-card] table.reportbuilder-table tr td:not([data-cardtitle]) {
min-height: 3rem; }
.reportbuilder-report[data-report-type="0"]:not([data-editing])[data-force-card] table.reportbuilder-table tr td:not(:first-child):not(.card-toggle) {
border-top: 1px solid rgba(0, 0, 0, 0.125); }
.reportbuilder-report[data-report-type="0"]:not([data-editing])[data-force-card] table.reportbuilder-table tr td:first-child {
padding-right: 2rem; }
.reportbuilder-report[data-report-type="0"]:not([data-editing])[data-force-card] table.reportbuilder-table tr td.card-toggle {
display: block !important;
/* stylelint-disable-line declaration-no-important */
position: absolute;
right: 10px; }
.reportbuilder-report[data-report-type="0"]:not([data-editing])[data-force-card] table.reportbuilder-table tr td.card-toggle button {
padding: 0 .5rem;
color: #6a737b; }
.reportbuilder-report[data-report-type="0"]:not([data-editing])[data-force-card] table.reportbuilder-table tr td.card-toggle button i {
font-size: 1.5em;
font-weight: bold; } }

View File

@ -21521,9 +21521,7 @@ div.editor_atto_toolbar button .icon {
.reportbuilder-toggle-card .toggle-card-button.collapsed .expanded-icon-container {
display: none; }
/**
* Audiences.
*/
/* Audiences. */
.reportbuilder-audiences-container {
/* 'OR' separator. */
/* Card action icons. */ }
@ -21541,11 +21539,10 @@ div.editor_atto_toolbar button .icon {
margin-right: 0; }
/* Report table card view styles */
/* Report table card view for small screens */
@media (max-width: 575.98px) {
.reportbuilder-report[data-report-type="0"]:not([data-editing]) table.reportbuilder-table thead {
.reportbuilder-report[data-report-type="0"]:not([data-editing]):not([data-force-table]) table.reportbuilder-table thead {
display: none; }
.reportbuilder-report[data-report-type="0"]:not([data-editing]) table.reportbuilder-table tr {
.reportbuilder-report[data-report-type="0"]:not([data-editing]):not([data-force-table]) table.reportbuilder-table tr {
display: flex;
flex-direction: column;
margin: .5rem 0;
@ -21556,39 +21553,89 @@ div.editor_atto_toolbar button .icon {
background-clip: border-box;
border: 1px solid rgba(0, 0, 0, 0.125);
border-radius: 0.25rem; }
.reportbuilder-report[data-report-type="0"]:not([data-editing]) table.reportbuilder-table tr:hover {
.reportbuilder-report[data-report-type="0"]:not([data-editing]):not([data-force-table]) table.reportbuilder-table tr:hover {
background-color: #fff !important;
/* stylelint-disable-line declaration-no-important */ }
.reportbuilder-report[data-report-type="0"]:not([data-editing]) table.reportbuilder-table tr.emptyrow {
.reportbuilder-report[data-report-type="0"]:not([data-editing]):not([data-force-table]) table.reportbuilder-table tr.emptyrow {
display: none; }
.reportbuilder-report[data-report-type="0"]:not([data-editing]) table.reportbuilder-table tr:not(.show) td[data-cardviewhidden] {
.reportbuilder-report[data-report-type="0"]:not([data-editing]):not([data-force-table]) table.reportbuilder-table tr:not(.show) td[data-cardviewhidden] {
display: none; }
.reportbuilder-report[data-report-type="0"]:not([data-editing]) table.reportbuilder-table tr td {
.reportbuilder-report[data-report-type="0"]:not([data-editing]):not([data-force-table]) table.reportbuilder-table tr td {
display: block;
min-height: 3.6rem;
padding: .5rem .25rem;
border: none; }
.reportbuilder-report[data-report-type="0"]:not([data-editing]) table.reportbuilder-table tr td::before {
.reportbuilder-report[data-report-type="0"]:not([data-editing]):not([data-force-table]) table.reportbuilder-table tr td::before {
content: attr(data-cardtitle);
display: block;
text-transform: uppercase;
font-size: 70%;
color: #343a40; }
.reportbuilder-report[data-report-type="0"]:not([data-editing]) table.reportbuilder-table tr td:not([data-cardtitle]) {
.reportbuilder-report[data-report-type="0"]:not([data-editing]):not([data-force-table]) table.reportbuilder-table tr td:not([data-cardtitle]) {
min-height: 3rem; }
.reportbuilder-report[data-report-type="0"]:not([data-editing]) table.reportbuilder-table tr td:not(:first-child):not(.card-toggle) {
.reportbuilder-report[data-report-type="0"]:not([data-editing]):not([data-force-table]) table.reportbuilder-table tr td:not(:first-child):not(.card-toggle) {
border-top: 1px solid rgba(0, 0, 0, 0.125); }
.reportbuilder-report[data-report-type="0"]:not([data-editing]) table.reportbuilder-table tr td:first-child {
.reportbuilder-report[data-report-type="0"]:not([data-editing]):not([data-force-table]) table.reportbuilder-table tr td:first-child {
padding-right: 2rem; }
.reportbuilder-report[data-report-type="0"]:not([data-editing]) table.reportbuilder-table tr td.card-toggle {
.reportbuilder-report[data-report-type="0"]:not([data-editing]):not([data-force-table]) table.reportbuilder-table tr td.card-toggle {
display: block !important;
/* stylelint-disable-line declaration-no-important */
position: absolute;
right: 10px; }
.reportbuilder-report[data-report-type="0"]:not([data-editing]) table.reportbuilder-table tr td.card-toggle button {
.reportbuilder-report[data-report-type="0"]:not([data-editing]):not([data-force-table]) table.reportbuilder-table tr td.card-toggle button {
padding: 0 .5rem;
color: #6a737b; }
.reportbuilder-report[data-report-type="0"]:not([data-editing]) table.reportbuilder-table tr td.card-toggle button i {
.reportbuilder-report[data-report-type="0"]:not([data-editing]):not([data-force-table]) table.reportbuilder-table tr td.card-toggle button i {
font-size: 1.5em;
font-weight: bold; } }
@media (min-width: 576px) {
.reportbuilder-report[data-report-type="0"]:not([data-editing])[data-force-card] table.reportbuilder-table thead {
display: none; }
.reportbuilder-report[data-report-type="0"]:not([data-editing])[data-force-card] table.reportbuilder-table tr {
display: flex;
flex-direction: column;
margin: .5rem 0;
padding: .25rem .5rem 0 .5rem;
background-color: #fff !important;
/* stylelint-disable-line declaration-no-important */
word-wrap: break-word;
background-clip: border-box;
border: 1px solid rgba(0, 0, 0, 0.125);
border-radius: 0.25rem; }
.reportbuilder-report[data-report-type="0"]:not([data-editing])[data-force-card] table.reportbuilder-table tr:hover {
background-color: #fff !important;
/* stylelint-disable-line declaration-no-important */ }
.reportbuilder-report[data-report-type="0"]:not([data-editing])[data-force-card] table.reportbuilder-table tr.emptyrow {
display: none; }
.reportbuilder-report[data-report-type="0"]:not([data-editing])[data-force-card] table.reportbuilder-table tr:not(.show) td[data-cardviewhidden] {
display: none; }
.reportbuilder-report[data-report-type="0"]:not([data-editing])[data-force-card] table.reportbuilder-table tr td {
display: block;
min-height: 3.6rem;
padding: .5rem .25rem;
border: none; }
.reportbuilder-report[data-report-type="0"]:not([data-editing])[data-force-card] table.reportbuilder-table tr td::before {
content: attr(data-cardtitle);
display: block;
text-transform: uppercase;
font-size: 70%;
color: #343a40; }
.reportbuilder-report[data-report-type="0"]:not([data-editing])[data-force-card] table.reportbuilder-table tr td:not([data-cardtitle]) {
min-height: 3rem; }
.reportbuilder-report[data-report-type="0"]:not([data-editing])[data-force-card] table.reportbuilder-table tr td:not(:first-child):not(.card-toggle) {
border-top: 1px solid rgba(0, 0, 0, 0.125); }
.reportbuilder-report[data-report-type="0"]:not([data-editing])[data-force-card] table.reportbuilder-table tr td:first-child {
padding-right: 2rem; }
.reportbuilder-report[data-report-type="0"]:not([data-editing])[data-force-card] table.reportbuilder-table tr td.card-toggle {
display: block !important;
/* stylelint-disable-line declaration-no-important */
position: absolute;
right: 10px; }
.reportbuilder-report[data-report-type="0"]:not([data-editing])[data-force-card] table.reportbuilder-table tr td.card-toggle button {
padding: 0 .5rem;
color: #6a737b; }
.reportbuilder-report[data-report-type="0"]:not([data-editing])[data-force-card] table.reportbuilder-table tr td.card-toggle button i {
font-size: 1.5em;
font-weight: bold; } }