diff --git a/reportbuilder/classes/external/custom_report_columns_sorting_exporter.php b/reportbuilder/classes/external/custom_report_columns_sorting_exporter.php
index 7eaef089b93..df9e63d4340 100644
--- a/reportbuilder/classes/external/custom_report_columns_sorting_exporter.php
+++ b/reportbuilder/classes/external/custom_report_columns_sorting_exporter.php
@@ -102,7 +102,7 @@ class custom_report_columns_sorting_exporter extends exporter {
$sortablecolumns = array_map(function(column $persistent) use ($report) {
$columntitle = $report->get_column($persistent->get('uniqueidentifier'))->get_title();
- $columnheading = $persistent->get('heading') ?: $columntitle;
+ $columnheading = $persistent->get_formatted_heading($report->get_context());
$columnsortascending = ($persistent->get('sortdirection') == SORT_ASC);
$sortenabledtitle = $persistent->get('sortenabled') ? 'columnsortdisable' : 'columnsortenable';
@@ -114,7 +114,7 @@ class custom_report_columns_sorting_exporter extends exporter {
return [
'id' => $persistent->get('id'),
'title' => $columntitle,
- 'heading' => $columnheading,
+ 'heading' => $columnheading !== '' ? $columnheading : $columntitle,
'sortdirection' => $persistent->get('sortdirection'),
'sortenabled' => (int)$persistent->get('sortenabled'),
'sortorder' => $persistent->get('sortorder'),
diff --git a/reportbuilder/classes/form/filter.php b/reportbuilder/classes/form/filter.php
index 29d2ce2afac..99c8bf66850 100644
--- a/reportbuilder/classes/form/filter.php
+++ b/reportbuilder/classes/form/filter.php
@@ -124,11 +124,13 @@ class filter extends dynamic_form {
// Allow each filter instance to add itself to this form, wrapping each inside custom header/footer template.
$filterinstances = $this->get_report()->get_filter_instances();
foreach ($filterinstances as $filterinstance) {
+ $header = $filterinstance->get_header();
+
// Check if filter has a custom header set.
- if ($filterinstance->get_filter_persistent() && !empty($filterinstance->get_filter_persistent()->get('heading'))) {
- $header = $filterinstance->get_filter_persistent()->get('heading');
- } else {
- $header = $filterinstance->get_header();
+ if ($persistent = $filterinstance->get_filter_persistent()) {
+ if ('' !== (string) $persistent->get('heading')) {
+ $header = $persistent->get_formatted_heading($this->get_report()->get_context());
+ }
}
$mform->addElement('html', $OUTPUT->render_from_template('core_reportbuilder/local/filters/header', [
diff --git a/reportbuilder/classes/local/models/column.php b/reportbuilder/classes/local/models/column.php
index a4a4bf29825..f8a19aca8a3 100644
--- a/reportbuilder/classes/local/models/column.php
+++ b/reportbuilder/classes/local/models/column.php
@@ -18,6 +18,7 @@ declare(strict_types=1);
namespace core_reportbuilder\local\models;
+use context;
use lang_string;
use core\persistent;
@@ -119,4 +120,18 @@ class column extends persistent {
return (int) $DB->get_field(static::TABLE, "MAX({$columnname})", ['reportid' => $reportid], MUST_EXIST);
}
+
+ /**
+ * Return formatted column name
+ *
+ * @param context|null $context If the context of the report is already known, it should be passed here
+ * @return string
+ */
+ public function get_formatted_heading(?context $context = null): string {
+ if ($context === null) {
+ $context = $this->get_report()->get_context();
+ }
+
+ return format_string($this->raw_get('heading'), true, ['context' => $context]);
+ }
}
diff --git a/reportbuilder/classes/local/models/filter.php b/reportbuilder/classes/local/models/filter.php
index 82d47230239..8457ce65341 100644
--- a/reportbuilder/classes/local/models/filter.php
+++ b/reportbuilder/classes/local/models/filter.php
@@ -18,6 +18,7 @@ declare(strict_types=1);
namespace core_reportbuilder\local\models;
+use context;
use lang_string;
use core\persistent;
@@ -152,4 +153,18 @@ class filter extends persistent {
return (int) $DB->get_field(static::TABLE, "MAX(filterorder)", $params, MUST_EXIST);
}
+
+ /**
+ * Return formatted filter heading
+ *
+ * @param context|null $context If the context of the report is already known, it should be passed here
+ * @return string
+ */
+ public function get_formatted_heading(?context $context = null): string {
+ if ($context === null) {
+ $context = $this->get_report()->get_context();
+ }
+
+ return format_string($this->raw_get('heading'), true, ['context' => $context]);
+ }
}
diff --git a/reportbuilder/classes/output/column_heading_editable.php b/reportbuilder/classes/output/column_heading_editable.php
index 1b6a6cf97a5..aa70507a199 100644
--- a/reportbuilder/classes/output/column_heading_editable.php
+++ b/reportbuilder/classes/output/column_heading_editable.php
@@ -50,9 +50,14 @@ class column_heading_editable extends inplace_editable {
$columninstance = manager::get_report_from_persistent($report)
->get_column($column->get('uniqueidentifier'));
- $displayvalue = $column->get('heading') ?: $columninstance->get_title();
+ // Use column defined title if custom heading not set.
+ if ('' !== $value = (string) $column->get('heading')) {
+ $displayvalue = $column->get_formatted_heading($report->get_context());
+ } else {
+ $displayvalue = $value = $columninstance->get_title();
+ }
- parent::__construct('core_reportbuilder', 'columnheading', $column->get('id'), $editable, $displayvalue, $displayvalue,
+ parent::__construct('core_reportbuilder', 'columnheading', $column->get('id'), $editable, $displayvalue, $value,
get_string('renamecolumn', 'core_reportbuilder', $columninstance->get_title()));
}
@@ -73,7 +78,7 @@ class column_heading_editable extends inplace_editable {
$value = clean_param($value, PARAM_TEXT);
$column
- ->set('heading', $value)
+ ->set('heading', trim($value))
->update();
return new self(0, $column);
diff --git a/reportbuilder/classes/output/filter_heading_editable.php b/reportbuilder/classes/output/filter_heading_editable.php
index 2353a43ddfc..ec7d8273163 100644
--- a/reportbuilder/classes/output/filter_heading_editable.php
+++ b/reportbuilder/classes/output/filter_heading_editable.php
@@ -19,11 +19,10 @@ declare(strict_types=1);
namespace core_reportbuilder\output;
use core_external;
-use core_reportbuilder\local\models\filter;
use core\output\inplace_editable;
use core_reportbuilder\manager;
use core_reportbuilder\permission;
-use core_reportbuilder\local\models\report;
+use core_reportbuilder\local\models\filter;
/**
* Filter heading editable component
@@ -51,10 +50,15 @@ class filter_heading_editable extends inplace_editable {
$filterinstance = manager::get_report_from_persistent($report)
->get_filter($filter->get('uniqueidentifier'));
- $displayvalue = $filter->get('heading') ?: $filterinstance->get_header();
+ // Use filter defined header if custom heading not set.
+ if ('' !== $value = (string) $filter->get('heading')) {
+ $displayvalue = $filter->get_formatted_heading($report->get_context());
+ } else {
+ $displayvalue = $value = $filterinstance->get_header();
+ }
- parent::__construct('core_reportbuilder', 'filterheading', $filter->get('id'), $editable, $displayvalue,
- $displayvalue, get_string('renamefilter', 'core_reportbuilder', $filterinstance->get_header()));
+ parent::__construct('core_reportbuilder', 'filterheading', $filter->get('id'), $editable, $displayvalue, $value,
+ get_string('renamefilter', 'core_reportbuilder', $filterinstance->get_header()));
}
/**
@@ -73,7 +77,7 @@ class filter_heading_editable extends inplace_editable {
$value = clean_param($value, PARAM_TEXT);
$filter
- ->set('heading', $value)
+ ->set('heading', trim($value))
->update();
return new self(0, $filter);
diff --git a/reportbuilder/classes/table/custom_report_table.php b/reportbuilder/classes/table/custom_report_table.php
index 92de896cec3..ca877247379 100644
--- a/reportbuilder/classes/table/custom_report_table.php
+++ b/reportbuilder/classes/table/custom_report_table.php
@@ -94,7 +94,8 @@ class custom_report_table extends base_report_table {
$columnheaders = [];
foreach ($columns as $column) {
- $columnheaders[$column->get_column_alias()] = $column->get_persistent()->get('heading') ?: $column->get_title();
+ $columnheading = $column->get_persistent()->get_formatted_heading($this->report->get_context());
+ $columnheaders[$column->get_column_alias()] = $columnheading !== '' ? $columnheading : $column->get_title();
$columnaggregation = $column->get_aggregation();
if ($hasaggregatedcolumns && empty($columnaggregation)) {
diff --git a/reportbuilder/tests/behat/columneditor.feature b/reportbuilder/tests/behat/columneditor.feature
index ac2af904751..f95816f62d6 100644
--- a/reportbuilder/tests/behat/columneditor.feature
+++ b/reportbuilder/tests/behat/columneditor.feature
@@ -25,6 +25,21 @@ Feature: Manage custom report columns
And I reload the page
Then I should see "My renamed column" in the "reportbuilder-table" "table"
+ Scenario: Rename column in report using filters
+ Given the "multilang" filter is "on"
+ And the "multilang" filter applies to "content and headings"
+ And the following "core_reportbuilder > Reports" exist:
+ | name | source | default |
+ | My report | core_user\reportbuilder\datasource\users | 0 |
+ And the following "core_reportbuilder > Columns" exist:
+ | report | uniqueidentifier |
+ | My report | user:fullname |
+ And I am on the "My report" "reportbuilder > Editor" page logged in as "admin"
+ When I set the field "Rename column 'Full name'" to "EnglishSpanish"
+ And I reload the page
+ Then I should see "English" in the "reportbuilder-table" "table"
+ And I should not see "Spanish" in the "reportbuilder-table" "table"
+
Scenario: Move column in report
Given the following "core_reportbuilder > Reports" exist:
| name | source | default |
diff --git a/reportbuilder/tests/behat/filtereditor.feature b/reportbuilder/tests/behat/filtereditor.feature
index 9e4a6cf07fc..ff0f0243d14 100644
--- a/reportbuilder/tests/behat/filtereditor.feature
+++ b/reportbuilder/tests/behat/filtereditor.feature
@@ -25,14 +25,33 @@ Feature: Manage custom report filters
| report | uniqueidentifier |
| My report | user:email |
And I am on the "My report" "reportbuilder > Editor" page logged in as "admin"
- When I click on "Show/hide settings sidebar" "button"
+ And I click on "Show/hide settings sidebar" "button"
And I click on "Show/hide 'Filters'" "button"
- And I set the field "Rename filter 'Email address'" to "My Email filter"
+ When I set the field "Rename filter 'Email address'" to "My Email filter"
And I reload the page
And I click on "Show/hide settings sidebar" "button"
And I click on "Show/hide 'Filters'" "button"
Then I should see "My Email filter" in the "[data-region='active-filters']" "css_element"
+ Scenario: Rename filter in report using filters
+ Given the "multilang" filter is "on"
+ And the "multilang" filter applies to "content and headings"
+ And the following "core_reportbuilder > Reports" exist:
+ | name | source | default |
+ | My report | core_user\reportbuilder\datasource\users | 0 |
+ And the following "core_reportbuilder > Filters" exist:
+ | report | uniqueidentifier |
+ | My report | user:email |
+ And I am on the "My report" "reportbuilder > Editor" page logged in as "admin"
+ And I click on "Show/hide settings sidebar" "button"
+ And I click on "Show/hide 'Filters'" "button"
+ When I set the field "Rename filter 'Email address'" to "EnglishSpanish"
+ And I reload the page
+ And I click on "Show/hide settings sidebar" "button"
+ And I click on "Show/hide 'Filters'" "button"
+ Then I should see "English" in the "[data-region='active-filters']" "css_element"
+ And I should not see "Spanish" in the "[data-region='active-filters']" "css_element"
+
Scenario: Move filter in report
Given the following "core_reportbuilder > Reports" exist:
| name | source | default |