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 |