HEX
Server: Microsoft-IIS/10.0
System: Windows NT ITPWINWEBSVR22 10.0 build 20348 (Windows Server 2022) AMD64
User: www.conferencesearch.co.uk (0)
PHP: 8.3.30
Disabled: NONE
Upload Files
File: D:/web/matomo.vdk/plugins/CoreHome/vue/src/MobileLeftMenu/MobileLeftMenu.vue
<!--
  Matomo - free/libre analytics platform

  @link    https://matomo.org
  @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
-->

<template>
  <ul id="mobile-left-menu" class="sidenav hide-on-large-only">
    <li class="no-padding" v-for="(level2, level1) in menuWithSubmenuItems" :key="level1">
      <ul class="collapsible collapsible-accordion" v-side-nav="{activator: activateLeftMenu}">
        <li>
          <a class="collapsible-header">
            {{ translateOrDefault(level1) }}<i :class="level2._icon || 'icon-chevron-down'"></i>
          </a>

          <div class="collapsible-body">
            <ul>
              <li
                v-for="([name, params]) in Object.entries(level2).filter(([n]) => n[0] !== '_')"
                :key="name"
              >
                <a
                  :title="params._tooltip ? translateIfNecessary(params._tooltip) : ''"
                  target="_self"
                  :href="getMenuUrl(params._url)"
                >
                  {{ translateIfNecessary(name) }}
                </a>
              </li>
            </ul>
          </div>
        </li>
      </ul>
    </li>
  </ul>
</template>

<script lang="ts">
import { defineComponent } from 'vue';
import MatomoUrl from '../MatomoUrl/MatomoUrl';
import SideNav from '../SideNav/SideNav';
import { translate } from '../translate';

interface UrlParamsInfo {
  _tooltip: string;
  _url: QueryParameters;
}

type Menu = Record<string, Record<string, UrlParamsInfo>>;

const { $ } = window;

export default defineComponent({
  props: {
    menu: {
      type: Object,
      required: true,
    },
  },
  directives: {
    SideNav,
  },
  methods: {
    getMenuUrl(params: QueryParameters) {
      return `?${MatomoUrl.stringify({
        ...MatomoUrl.urlParsed.value,
        ...params,
      })}`;
    },
    translateIfNecessary(name: string) {
      if (name.includes('_')) {
        return translate(name);
      }

      return name;
    },
  },
  computed: {
    menuWithSubmenuItems() {
      const menu = (this.menu || {}) as Menu;
      return Object.fromEntries(
        Object.entries(menu)
          // remove submenus that have no items that do not start w/ '_'
          .filter(([, level2]) => {
            const itemsWithoutUnderscore = Object.entries(level2)
              .filter(([name]) => name[0] !== '_');
            return Object.keys(itemsWithoutUnderscore).length;
          }),
      );
    },
    activateLeftMenu() {
      return $('nav .activateLeftMenu')[0];
    },
  },
});
</script>