From 048a771ee137bac10d8d352fd2bbe3ba5db34025 Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Wed, 9 Apr 2025 11:35:26 +0200
Subject: [PATCH] feat: refs #8891 enhance LeftMenu with expandable item groups
 and improved pinning functionality

---
 src/components/LeftMenu.vue | 98 +++++++++++++++++++++++++++----------
 1 file changed, 72 insertions(+), 26 deletions(-)

diff --git a/src/components/LeftMenu.vue b/src/components/LeftMenu.vue
index 8e83bf579..1b31f3f31 100644
--- a/src/components/LeftMenu.vue
+++ b/src/components/LeftMenu.vue
@@ -225,37 +225,83 @@ const searchModule = () => {
                             (item.children && !filteredPinnedModules.has(item.name))
                         "
                     >
+                        <QList v-if="item.children.length > 1">
+                            <QExpansionItem
+                                v-ripple
+                                clickable
+                                :content-inset-level="0.5"
+                                @after-show="handleItemExpansion(item.name)"
+                            >
+                                <template #header>
+                                    <QItemSection avatar>
+                                        <QIcon :name="item.icon" />
+                                    </QItemSection>
+                                    <QItemSection>
+                                        <QItemLabel>{{ t(item.title) }}</QItemLabel>
+                                    </QItemSection>
+                                    <QBtn
+                                        v-if="item.isPinned === true"
+                                        @click="togglePinned(item, $event)"
+                                        icon="remove_circle"
+                                        size="xs"
+                                        flat
+                                        round
+                                    >
+                                        <QTooltip>
+                                            {{
+                                                t('components.leftMenu.removeFromPinned')
+                                            }}
+                                        </QTooltip>
+                                    </QBtn>
+                                    <QBtn
+                                        v-if="item.isPinned === false"
+                                        @click="togglePinned(item, $event)"
+                                        icon="push_pin"
+                                        size="xs"
+                                        flat
+                                        round
+                                    >
+                                        <QTooltip>
+                                            {{ t('components.leftMenu.addToPinned') }}
+                                        </QTooltip>
+                                    </QBtn>
+                                </template>
+                                <LeftMenuItemGroup
+                                    :ref="(el) => (expansionItemElements[item.name] = el)"
+                                    :item="item"
+                                />
+                            </QExpansionItem>
+                        </QList>
                         <LeftMenuItem
+                            v-else
                             :item="item"
                             group="modules"
                             :class="search && index === 0 ? 'searched' : ''"
                         >
-                            <template #side>
-                                <QBtn
-                                    v-if="item.isPinned === true"
-                                    @click="togglePinned(item, $event)"
-                                    icon="remove_circle"
-                                    size="xs"
-                                    flat
-                                    round
-                                >
-                                    <QTooltip>
-                                        {{ t('components.leftMenu.removeFromPinned') }}
-                                    </QTooltip>
-                                </QBtn>
-                                <QBtn
-                                    v-if="item.isPinned === false"
-                                    @click="togglePinned(item, $event)"
-                                    icon="push_pin"
-                                    size="xs"
-                                    flat
-                                    round
-                                >
-                                    <QTooltip>
-                                        {{ t('components.leftMenu.addToPinned') }}
-                                    </QTooltip>
-                                </QBtn>
-                            </template>
+                            <QBtn
+                                v-if="item.isPinned === true"
+                                @click="togglePinned(item, $event)"
+                                icon="remove_circle"
+                                size="xs"
+                                flat
+                                round
+                            >
+                                <QTooltip>
+                                    {{ t('components.leftMenu.removeFromPinned') }}
+                                </QTooltip>
+                            </QBtn>
+                            <QBtn
+                                v-if="item.isPinned === false"
+                                @click="togglePinned(item, $event)"
+                                icon="push_pin"
+                                size="xs"
+                                flat
+                                round
+                            >
+                                <QTooltip>
+                                    {{ t('components.leftMenu.addToPinned') }}
+                                </QTooltip>
+                            </QBtn>
                         </LeftMenuItem>
                     </template>
                 </template>