From c19d9693e92c87def4ec159a77f64de0c1b3584f Mon Sep 17 00:00:00 2001
From: Paul Holden <paulh@moodle.com>
Date: Thu, 6 Jul 2023 12:03:10 +0100
Subject: [PATCH] MDL-78656 output: display menu item titles in primary
 navigation.

Since custom menu items were merged into the primary navigation/more
menu as part of 56c34d71 and related work, the "title" attribute of
each custom menu item was lost.
---
 lib/navigationlib.php                    | 17 +++++++++++++----
 lib/templates/moremenu_children.mustache | 19 ++++++++++++++++---
 2 files changed, 29 insertions(+), 7 deletions(-)

diff --git a/lib/navigationlib.php b/lib/navigationlib.php
index 11522aa9c9b..4dc220ffd1b 100644
--- a/lib/navigationlib.php
+++ b/lib/navigationlib.php
@@ -582,11 +582,20 @@ class navigation_node implements renderable {
 
     /**
      * Sets the title for this node and forces Moodle to utilise it.
-     * @param string $title
+     *
+     * Note that this method is named identically to the public "title" property of the class, which unfortunately confuses
+     * our Mustache renderer, because it will see the method and try and call it without any arguments (hence must be nullable)
+     * before trying to access the public property
+     *
+     * @param string|null $title
+     * @return string
      */
-    public function title($title) {
-        $this->title = $title;
-        $this->forcetitle = true;
+    public function title(?string $title = null): string {
+        if ($title !== null) {
+            $this->title = $title;
+            $this->forcetitle = true;
+        }
+        return (string) $this->title;
     }
 
     /**
diff --git a/lib/templates/moremenu_children.mustache b/lib/templates/moremenu_children.mustache
index cc7d5b56673..65fddc1bf94 100644
--- a/lib/templates/moremenu_children.mustache
+++ b/lib/templates/moremenu_children.mustache
@@ -34,6 +34,7 @@
     <li class="dropdown nav-item" role="none" data-forceintomoremenu="{{#forceintomoremenu}}true{{/forceintomoremenu}}{{^forceintomoremenu}}false{{/forceintomoremenu}}">
         <a class="dropdown-toggle nav-link {{#isactive}}active{{/isactive}} {{#classes}}{{.}} {{/classes}}" id="drop-down-{{moremenuid}}" role="menuitem" data-toggle="dropdown"
             aria-haspopup="true" aria-expanded="false" href="#" aria-controls="drop-down-menu-{{moremenuid}}"
+            {{#title}}title="{{.}}"{{/title}}
             {{#isactive}}aria-current="true"{{/isactive}}
             {{^isactive}}tabindex="-1"{{/isactive}}
         >
@@ -44,6 +45,7 @@
                 {{^divider}}
                     {{#is_action_link}}
                         <a class="dropdown-item" role="menuitem" {{#actionattributes}}{{name}}="{{value}}" {{/actionattributes}} href="{{{url}}}{{{action}}}"
+                            {{#title}}title="{{.}}"{{/title}}
                             data-disableactive="true" tabindex="-1"
                         >
                             {{{text}}}
@@ -53,7 +55,11 @@
                         {{/action_link_actions}}
                     {{/is_action_link}}
                     {{^is_action_link}}
-                        <a class="dropdown-item" role="menuitem" href="{{{url}}}{{{action}}}" {{#isactive}}aria-current="true"{{/isactive}} tabindex="-1">{{{text}}}</a>
+                        <a class="dropdown-item" role="menuitem" href="{{{url}}}{{{action}}}" {{#isactive}}aria-current="true"{{/isactive}} tabindex="-1"
+                            {{#title}}title="{{.}}"{{/title}}
+                        >
+                            {{{text}}}
+                        </a>
                     {{/is_action_link}}
                 {{/divider}}
                 {{#divider}}
@@ -67,7 +73,9 @@
     <li data-key="{{key}}" class="nav-item" role="none" data-forceintomoremenu="{{#forceintomoremenu}}true{{/forceintomoremenu}}{{^forceintomoremenu}}false{{/forceintomoremenu}}">
         {{#istablist}}
             {{#is_action_link}}
-                <a role="tab" class="nav-link {{#classes}}{{.}} {{/classes}}" href="{{tab}}" data-toggle="tab" data-text="{{{text}}}" data-disableactive="true" tabindex="-1">
+                <a role="tab" class="nav-link {{#classes}}{{.}} {{/classes}}" href="{{tab}}" data-toggle="tab" data-text="{{{text}}}" data-disableactive="true" tabindex="-1"
+                    {{#title}}title="{{.}}"{{/title}}
+                >
                     {{{text}}}
                 </a>
                 {{#action_link_actions}}
@@ -77,6 +85,7 @@
             {{^is_action_link}}
                 <a role="tab" class="nav-link {{#isactive}}active{{/isactive}} {{#classes}}{{.}} {{/classes}}"
                     href="{{tab}}" data-toggle="tab" data-text="{{{text}}}"
+                    {{#title}}title="{{.}}"{{/title}}
                     {{#isactive}}aria-selected="true"{{/isactive}}
                     {{^isactive}}tabindex="-1"{{/isactive}}
                 >
@@ -86,7 +95,10 @@
         {{/istablist}}
         {{^istablist}}
             {{#is_action_link}}
-                <a role="menuitem" class="nav-link {{#classes}}{{.}} {{/classes}}" {{#actionattributes}}{{name}}="{{value}}" {{/actionattributes}} href="{{{url}}}{{{action}}}" data-disableactive="true" tabindex="-1">
+                <a role="menuitem" class="nav-link {{#classes}}{{.}} {{/classes}}" {{#actionattributes}}{{name}}="{{value}}" {{/actionattributes}} href="{{{url}}}{{{action}}}"
+                    {{#title}}title="{{.}}"{{/title}}
+                    data-disableactive="true" tabindex="-1"
+                >
                     {{{text}}}
                 </a>
                 {{#action_link_actions}}
@@ -96,6 +108,7 @@
             {{^is_action_link}}
                 <a role="menuitem" class="nav-link {{#isactive}}active{{/isactive}} {{#classes}}{{.}} {{/classes}}"
                     href="{{{url}}}{{{action}}}"
+                    {{#title}}title="{{.}}"{{/title}}
                     {{#isactive}}aria-current="true"{{/isactive}}
                     {{^isactive}}tabindex="-1"{{/isactive}}
                 >