<script setup>

import { onMounted, ref, useTemplateRef, provide } from 'vue';
import { Notification, fetcher, SideBar } from '@cloudron/pankow';
import { setLanguage } from './i18n.js';
import { API_ORIGIN, TOKEN_TYPES } from './constants.js';
import { redirectIfNeeded } from './utils.js';
import ProfileModel from './models/ProfileModel.js';
import ProvisionModel from './models/ProvisionModel.js';
import DashboardModel from './models/DashboardModel.js';
import BrandingModel from './models/BrandingModel.js';
import Headerbar from './components/Headerbar.vue';
import SubscriptionRequiredDialog from './components/SubscriptionRequiredDialog.vue';
import OfflineOverlay from './components/OfflineOverlay.vue';
import AppsView from './views/AppsView.vue';
import AppConfigureView from './views/AppConfigureView.vue';
import AppearanceView from './views/AppearanceView.vue';
import AppstoreView from './views/AppstoreView.vue';
import BackupSitesView from './views/BackupSitesView.vue';
import AppArchiveView from './views/AppArchiveView.vue';
import CloudronAccountView from './views/CloudronAccountView.vue';
import DomainsView from './views/DomainsView.vue';
import EmailDomainView from './views/EmailDomainView.vue';
import EmailDomainsView from './views/EmailDomainsView.vue';
import EmailMailboxesView from './views/EmailMailboxesView.vue';
import EmailMailinglistsView from './views/EmailMailinglistsView.vue';
import EmailSettingsView from './views/EmailSettingsView.vue';
import EmailEventlogView from './views/EmailEventlogView.vue';
import EventlogView from './views/EventlogView.vue';
import NetworkView from './views/NetworkView.vue';
import ProfileView from './views/ProfileView.vue';
import ServicesView from './views/ServicesView.vue';
import SystemSettingsView from './views/SystemSettingsView.vue';
import SystemUpdateView from './views/SystemUpdateView.vue';
import DockerView from './views/DockerView.vue';
import ServerView from './views/ServerView.vue';
import UserDirectorySettingsView from './views/UserDirectorySettingsView.vue';
import LdapView from './views/LdapView.vue';
import OpenIdView from './views/OpenIdView.vue';
import UsersView from './views/UsersView.vue';
import GroupsView from './views/GroupsView.vue';
import VolumesView from './views/VolumesView.vue';

const VIEWS = Object.freeze({
  APP: '#/app', // this is a prefix
  APPEARANCE: '#/appearance',
  APPS: '#/apps',
  APPSTORE: '#/appstore', // this is a prefix
  BACKUP_SITES: '#/backup-sites',
  APP_ARCHIVE: '#/app-archive',
  CLOUDRON_ACCOUNT: '#/cloudron-account',
  DOMAINS: '#/domains',
  EMAIL_DOMAIN: '#/email-domain',
  EMAIL_DOMAINS: '#/email-domains',
  MAILBOXES: '#/mailboxes',
  MAILINGLISTS: '#/mailinglists',
  EMAIL_SETTINGS: '#/email-settings',
  EMAIL_EVENTLOG: '#/email-eventlog',
  SERVER: '#/server',
  NETWORK: '#/network',
  PROFILE: '#/profile',
  SERVICES: '#/services',
  SYSTEM_SETTINGS: '#/system-settings',
  DOCKER: '#/docker',
  SYSTEM_EVENTLOG: '#/system-eventlog',
  SYSTEM_UPDATE: '#/system-update',
  USER_DIRECTORY_SETTINGS: '#/user-directory-settings',
  LDAP: '#/ldap',
  OPENID: '#/openid',
  USERS: '#/users',
  GROUPS: '#/groups',
  VOLUMES: '#/volumes',
});

const offlineOverlay = useTemplateRef('offlineOverlay');

fetcher.globalOptions.errorHook = (error) => {
  // network error, request killed by browser
  if (error instanceof TypeError) {
    return offlineOverlay.value.open();
  }

  // re-login will make the code get a new token
  if (error.status === 401) return profileModel.logout();

  if (error.status === 500 || error.status === 501) {
    // actual internal server error, most likely a bug or timeout log to console only to not alert the user
    console.error(error);
    console.log('------\nCloudron Internal Error\n\nIf you see this, please send a mail with above log to support@cloudron.io\n------\n');
  }

  if (error.status >= 502) {
    // This means the box service is not reachable. We just show offline banner for now
    ready.value = false;
    return offlineOverlay.value.open();
  }
};

const dashboardModel = DashboardModel.create();
const profileModel = ProfileModel.create();
const provisionModel = ProvisionModel.create();

const sidebar = useTemplateRef('sidebar');
const subscriptionRequiredDialog = useTemplateRef('subscriptionRequiredDialog');
const ready = ref(false);
const view = ref('');
const profile = ref({});
const dashboardDomain = ref('');
const subscription = ref({
  plan: {},
});
const config = ref({});
const avatarUrl = ref('');
const features = ref({});

function onSidebarClose() {
  sidebar.value.close();
}

const SIDEBAR_GROUPS = Object.freeze({
  BACKUP: 'backup',
  EMAIL: 'email',
  SYSTEM: 'system',
  USERS: 'users'
});

const activeSidebarGroups = ref({});
function onToggleGroup(group) {
  activeSidebarGroups.value[group] = !activeSidebarGroups.value[group];
}

function onHashChange() {
  const v = location.hash;

  if (v === VIEWS.APPS) {
    view.value = VIEWS.APPS;
  } else if (v.indexOf(VIEWS.APPSTORE) === 0 && profile.value.isAtLeastAdmin) {
    view.value = VIEWS.APPSTORE;
  } else if (v.indexOf(VIEWS.APP+'/') === 0) { // this checks permissions within the view as we may have an app operator
    view.value = VIEWS.APP;
  } else if (v === VIEWS.APPEARANCE && profile.value.isAtLeastAdmin) {
    view.value = VIEWS.APPEARANCE;
  } else if (v === VIEWS.BACKUP_SITES && profile.value.isAtLeastAdmin) {
    view.value = VIEWS.BACKUP_SITES;
  } else if (v === VIEWS.APP_ARCHIVE && profile.value.isAtLeastAdmin) {
    view.value = VIEWS.APP_ARCHIVE;
  } else if (v === VIEWS.CLOUDRON_ACCOUNT && profile.value.isAtLeastOwner) {
    view.value = VIEWS.CLOUDRON_ACCOUNT;
  } else if (v === VIEWS.DOMAINS && profile.value.isAtLeastAdmin) {
    view.value = VIEWS.DOMAINS;
  } else if (v.indexOf(VIEWS.EMAIL_DOMAIN+'/') === 0 && profile.value.isAtLeastMailManager) {
    view.value = VIEWS.EMAIL_DOMAIN;
  } else if (v === VIEWS.EMAIL_DOMAINS && profile.value.isAtLeastMailManager) {
    view.value = VIEWS.EMAIL_DOMAINS;
  } else if (v === VIEWS.MAILBOXES && profile.value.isAtLeastMailManager) {
    view.value = VIEWS.MAILBOXES;
  } else if (v === VIEWS.MAILINGLISTS && profile.value.isAtLeastMailManager) {
    view.value = VIEWS.MAILINGLISTS;
  } else if (v === VIEWS.EMAIL_SETTINGS && profile.value.isAtLeastMailManager) {
    view.value = VIEWS.EMAIL_SETTINGS;
  } else if (v === VIEWS.EMAIL_EVENTLOG && profile.value.isAtLeastMailManager) {
    view.value = VIEWS.EMAIL_EVENTLOG;
  } else if (v === VIEWS.SERVER && profile.value.isAtLeastAdmin) {
    view.value = VIEWS.SERVER;
  } else if (v === VIEWS.NETWORK && profile.value.isAtLeastAdmin) {
    view.value = VIEWS.NETWORK;
  } else if (v === VIEWS.PROFILE) {
    view.value = VIEWS.PROFILE;
  } else if (v === VIEWS.SERVICES && profile.value.isAtLeastAdmin) {
    view.value = VIEWS.SERVICES;
  } else if (v === VIEWS.SYSTEM_SETTINGS && profile.value.isAtLeastAdmin) {
    view.value = VIEWS.SYSTEM_SETTINGS;
  } else if (v === VIEWS.DOCKER && profile.value.isAtLeastAdmin) {
    view.value = VIEWS.DOCKER;
  } else if (v === VIEWS.SYSTEM_EVENTLOG && profile.value.isAtLeastAdmin) {
    view.value = VIEWS.SYSTEM_EVENTLOG;
  } else if (v === VIEWS.SYSTEM_UPDATE && profile.value.isAtLeastAdmin) {
    view.value = VIEWS.SYSTEM_UPDATE;
  } else if (v === VIEWS.USER_DIRECTORY_SETTINGS && profile.value.isAtLeastAdmin) {
    view.value = VIEWS.USER_DIRECTORY_SETTINGS;
  } else if (v === VIEWS.LDAP && profile.value.isAtLeastAdmin) {
    view.value = VIEWS.LDAP;
  } else if (v === VIEWS.OPENID && profile.value.isAtLeastAdmin) {
    view.value = VIEWS.OPENID;
  } else if (v === VIEWS.USERS && profile.value.isAtLeastUserManager) {
    view.value = VIEWS.USERS;
  } else if (v === VIEWS.GROUPS && profile.value.isAtLeastUserManager) {
    view.value = VIEWS.GROUPS;
  } else if (v === VIEWS.VOLUMES && profile.value.isAtLeastAdmin) {
    view.value = VIEWS.VOLUMES;
  } else {
    window.location.href = VIEWS.APPS;
  }
}

BrandingModel.onChange(BrandingModel.KEYS.NAME, (value) => {
  window.document.title = value;
  config.value.cloudronName = value;
});

BrandingModel.onChange(BrandingModel.KEYS.AVATAR, (value) => {
  avatarUrl.value = value;
  if (document.querySelector('link[rel="icon"]')) document.querySelector('link[rel="icon"]').href = value;
});

ProfileModel.onChange(ProfileModel.KEYS.AVATAR, (value) => {
  profile.value.avatarUrl = value;
});

async function refreshProfile() {
  const [error, result] = await profileModel.get();
  if (error) return console.error(error);
  profile.value = result;
}

async function refreshConfigAndFeatures() {
  const [error, result] = await dashboardModel.config();
  if (error) return console.error(error);

  const currentVersion = localStorage.getItem('version');
  if (currentVersion === null) {
    localStorage.setItem('version', result.version);
  } else if (result.version !== currentVersion) {
    console.log('Dashboard version changed, reloading');
    localStorage.setItem('version', result.version);
    window.location.reload(true);
  }

  config.value = result;
  features.value = result.features;
  dashboardDomain.value = result.adminDomain;
}

async function onOnline() {
  ready.value = true;
  await refreshConfigAndFeatures(); // reload dashboard if needed after an update
}

provide('subscriptionRequiredDialog', subscriptionRequiredDialog);
provide('features', features);
provide('profile', profile);
provide('refreshProfile', refreshProfile);
provide('refreshFeatures', refreshConfigAndFeatures);
provide('dashboardDomain', dashboardDomain);

onMounted(async () => {
  const [error, result] = await provisionModel.status();
  if (error) return console.error(error);

  if (redirectIfNeeded(result, 'dashboard')) return; // redirected to some other view...

  if (!localStorage.token) {
    localStorage.setItem('redirectToHash', window.location.hash);

    // start oidc flow
    window.location.href =  `${API_ORIGIN}/openid/auth?client_id=` + (API_ORIGIN ? TOKEN_TYPES.ID_DEVELOPMENT : TOKEN_TYPES.ID_WEBADMIN) + '&scope=openid email profile&response_type=code token&redirect_uri=' + window.location.origin + '/authcallback.html';

    return;
  }

  await refreshProfile();

  // ensure language from profile if set
  if (profile.value.language) await setLanguage(profile.value.language, true);

  await refreshConfigAndFeatures();

  avatarUrl.value = `https://${config.value.adminFqdn}/api/v1/cloudron/avatar`;

  if (config.value.mandatory2FA && !profile.value.twoFactorAuthenticationEnabled) window.location.hash = `/${VIEWS.PROFILE}?setup2fa`;

  window.addEventListener('hashchange', onHashChange);
  onHashChange();

  console.log(`Cloudron dashboard v${config.value.version}`);

  ready.value = true;
});

</script>

<template>
  <div style="overflow: hidden; height: 100%;">
    <Notification />
    <OfflineOverlay ref="offlineOverlay" @online="onOnline()" :href="'https://docs.cloudron.io/troubleshooting/'" :label="$t('main.offline')" />
    <SubscriptionRequiredDialog ref="subscriptionRequiredDialog"/>

    <div v-if="ready" style="display: flex; flex-direction: row; overflow: hidden; height: 100%;">
      <SideBar v-if="profile.isAtLeastUserManager" ref="sidebar">
        <a href="#/" class="sidebar-logo" @click="onSidebarClose()">
          <img :src="avatarUrl" :alt="(config.cloudronName || 'Cloudron') + ' icon'"/> {{ config.cloudronName || 'Cloudron' }}
        </a>
        <div class="sidebar-list">
          <a class="sidebar-item" :class="{ active: view === VIEWS.APPS || view === VIEWS.APP }" :href="VIEWS.APPS" @click="onSidebarClose()"><i class="fa fa-grip fa-fw"></i> {{ $t('apps.title') }}</a>
          <a class="sidebar-item" :class="{ active: view === VIEWS.APPSTORE }" v-show="profile.isAtLeastAdmin" :href="VIEWS.APPSTORE" @click="onSidebarClose()"><i class="fa fa-cloud-download-alt fa-fw"></i> {{ $t('appstore.title') }}</a>
          <hr/>

          <a class="sidebar-item" :class="{ active: view === VIEWS.DOMAINS }" v-show="profile.isAtLeastAdmin" :href="VIEWS.DOMAINS" @click="onSidebarClose()"><i class="fa fa-globe fa-fw"></i> {{ $t('domains.title') }}</a>

          <div class="sidebar-item" v-show="profile.isAtLeastUserManager" @click="onToggleGroup(SIDEBAR_GROUPS.USERS)"><i class="fa fa-users-gear fa-fw"></i> {{ $t('users.title') }} <i class="collapse fa-solid fa-angle-right" :class="{ expanded: activeSidebarGroups[SIDEBAR_GROUPS.USERS] }" style="margin-left: 6px;"></i></div>
          <Transition name="sidebar-item-group-animation">
            <div class="sidebar-item-group" v-if="activeSidebarGroups[SIDEBAR_GROUPS.USERS]">
              <a class="sidebar-item" :class="{ active: view === VIEWS.USERS }" v-show="profile.isAtLeastUserManager" :href="VIEWS.USERS" @click="onSidebarClose()"><i class="fa fa-user fa-fw"></i> {{ $t('main.navbar.users') }}</a>
              <a class="sidebar-item" :class="{ active: view === VIEWS.GROUPS }" v-show="profile.isAtLeastUserManager" :href="VIEWS.GROUPS" @click="onSidebarClose()"><i class="fa fa-users fa-fw"></i> {{ $t('main.navbar.groups') }}</a>
              <a class="sidebar-item" :class="{ active: view === VIEWS.LDAP }" v-show="profile.isAtLeastAdmin" :href="VIEWS.LDAP" @click="onSidebarClose()"><i class="fa fa-fw fa-users-rays"></i> LDAP</a>
              <a class="sidebar-item" :class="{ active: view === VIEWS.OPENID }" v-show="profile.isAtLeastAdmin" :href="VIEWS.OPENID" @click="onSidebarClose()"><i class="fa fa-fw fa-brands fa-openid"></i> OpenID</a>
              <a class="sidebar-item" :class="{ active: view === VIEWS.USER_DIRECTORY_SETTINGS }" v-show="profile.isAtLeastAdmin" :href="VIEWS.USER_DIRECTORY_SETTINGS" @click="onSidebarClose()"><i class="fa fa-fw fa-screwdriver-wrench"></i> {{ $t('userdirectory.settings.title') }}</a>
            </div>
          </Transition>

          <div class="sidebar-item" v-show="profile.isAtLeastMailManager" @click="onToggleGroup(SIDEBAR_GROUPS.EMAIL)"><i class="fa fa-envelope fa-fw"></i> {{ $t('emails.title') }} <i class="collapse fa-solid fa-angle-right" :class="{ expanded: activeSidebarGroups[SIDEBAR_GROUPS.EMAIL] }" style="margin-left: 6px;"></i></div>
          <Transition name="sidebar-item-group-animation">
            <div class="sidebar-item-group" v-if="activeSidebarGroups[SIDEBAR_GROUPS.EMAIL]">
              <a class="sidebar-item" :class="{ active: view === VIEWS.EMAIL_DOMAINS || view === VIEWS.EMAIL_DOMAIN }" v-show="profile.isAtLeastAdmin" :href="VIEWS.EMAIL_DOMAINS" @click="onSidebarClose()"><i class="fa fa-fw fa-globe"></i> Domains</a>
              <a class="sidebar-item" :class="{ active: view === VIEWS.MAILBOXES }" :href="VIEWS.MAILBOXES" @click="onSidebarClose()"><i class="fa fa-fw fa-inbox"></i> {{ $t('email.incoming.mailboxes.title') }}</a>
              <a class="sidebar-item" :class="{ active: view === VIEWS.MAILINGLISTS }" :href="VIEWS.MAILINGLISTS" @click="onSidebarClose()"><i class="fa fa-fw-solid fa-envelopes-bulk"></i> {{ $t('email.incoming.mailinglists.title') }}</a>
              <a class="sidebar-item" :class="{ active: view === VIEWS.EMAIL_EVENTLOG }" v-show="profile.isAtLeastAdmin" :href="VIEWS.EMAIL_EVENTLOG" @click="onSidebarClose()"><i class="fa fa-fw fa-list-alt"></i> {{ $t('emails.eventlog.title') }}</a>
              <a class="sidebar-item" :class="{ active: view === VIEWS.EMAIL_SETTINGS }" v-show="profile.isAtLeastAdmin" :href="VIEWS.EMAIL_SETTINGS" @click="onSidebarClose()"><i class="fa fa-fw fa-screwdriver-wrench"></i> {{ $t('emails.settings.title') }}</a>
            </div>
          </Transition>

          <a class="sidebar-item" :class="{ active: view === VIEWS.NETWORK }" v-show="profile.isAtLeastAdmin" :href="VIEWS.NETWORK" @click="onSidebarClose()"><i class="fas fa-network-wired fa-fw"></i> {{ $t('network.title') }}</a>
          <a class="sidebar-item" :class="{ active: view === VIEWS.VOLUMES }" v-show="profile.isAtLeastAdmin" :href="VIEWS.VOLUMES" @click="onSidebarClose()"><i class="fa fa-hdd fa-fw"></i> {{ $t('volumes.title') }}</a>

          <div class="sidebar-item" v-show="profile.isAtLeastAdmin" @click="onToggleGroup(SIDEBAR_GROUPS.BACKUP)"><i class="fa fa-archive fa-fw"></i> {{ $t('backups.title') }} <i class="collapse fa-solid fa-angle-right" :class="{ expanded: activeSidebarGroups[SIDEBAR_GROUPS.BACKUP] }" style="margin-left: 6px;"></i></div>
          <Transition name="sidebar-item-group-animation">
            <div class="sidebar-item-group" v-if="activeSidebarGroups[SIDEBAR_GROUPS.BACKUP]">
              <a class="sidebar-item" :class="{ active: view === VIEWS.BACKUP_SITES }" :href="VIEWS.BACKUP_SITES" @click="onSidebarClose()"><i class="fa fa-fw fa-hard-drive"></i> {{ $t('backups.sites.title') }}</a>
              <a class="sidebar-item" :class="{ active: view === VIEWS.APP_ARCHIVE }" :href="VIEWS.APP_ARCHIVE" @click="onSidebarClose()"><i class="fa fa-fw fa-grip"></i> {{ $t('backups.archives.title') }}</a>
            </div>
          </Transition>

          <a class="sidebar-item" :class="{ active: view === VIEWS.APPEARANCE }" v-show="profile.isAtLeastAdmin" :href="VIEWS.APPEARANCE" @click="onSidebarClose()"><i class="fa fa-pen-ruler fa-fw"></i> {{ $t('appearance.title') }}</a>

          <div class="sidebar-item" v-show="profile.isAtLeastAdmin" @click="onToggleGroup(SIDEBAR_GROUPS.SYSTEM)"><i class="fa fa-server fa-fw"></i> {{ $t('system.title') }} <i class="collapse fa-solid fa-angle-right" :class="{ expanded: activeSidebarGroups[SIDEBAR_GROUPS.SYSTEM] }" style="margin-left: 6px;"></i></div>
          <Transition name="sidebar-item-group-animation">
            <div class="sidebar-item-group" v-if="activeSidebarGroups[SIDEBAR_GROUPS.SYSTEM]">
              <a class="sidebar-item" :class="{ active: view === VIEWS.DOCKER }" :href="VIEWS.DOCKER" @click="onSidebarClose()"><i class="fa-brands fa-fw fa-docker"></i> Docker</a>
              <a class="sidebar-item" :class="{ active: view === VIEWS.SERVICES }" v-show="profile.isAtLeastAdmin" :href="VIEWS.SERVICES" @click="onSidebarClose()"><i class="fa fa-diagram-project fa-fw"></i> {{ $t('services.title') }}</a>
              <a class="sidebar-item" :class="{ active: view === VIEWS.SYSTEM_EVENTLOG }" :href="VIEWS.SYSTEM_EVENTLOG" @click="onSidebarClose()"><i class="fa fa-list-alt fa-fw"></i> {{ $t('eventlog.title') }}</a>
              <a class="sidebar-item" :class="{ active: view === VIEWS.SYSTEM_UPDATE }" :href="VIEWS.SYSTEM_UPDATE" @click="onSidebarClose()"><i class="fa fa-fw fa-square-up-right"></i> {{ $t('settings.updates.title') }}</a>
              <a class="sidebar-item" :class="{ active: view === VIEWS.SYSTEM_SETTINGS }" :href="VIEWS.SYSTEM_SETTINGS" @click="onSidebarClose()"><i class="fa fa-fw fa-screwdriver-wrench"></i> {{ $t('system.settings.title') }}</a>
            </div>
          </Transition>

          <hr v-show="profile.isAtLeastAdmin"/>

          <a class="sidebar-item" :class="{ active: view === VIEWS.SERVER }" v-show="profile.isAtLeastAdmin" :href="VIEWS.SERVER" @click="onSidebarClose()"><i class="fa fa-microchip fa-fw"></i> {{ $t('server.title') }}</a>
          <a class="sidebar-item" :class="{ active: view === VIEWS.CLOUDRON_ACCOUNT }" v-show="profile.isAtLeastOwner" :href="VIEWS.CLOUDRON_ACCOUNT" @click="onSidebarClose()"><i class="fa fa-crown fa-fw"></i> {{ $t('settings.appstoreAccount.title') }}</a>
        </div>
      </SideBar>

      <div style="flex-grow: 1; display: flex; flex-direction: column; overflow: hidden; height: 100%;">
        <Headerbar :config="config" :subscription="subscription"/>

        <div style="display: flex; justify-content: center; overflow: auto; flex-grow: 1; padding: 0; margin: 0 10px; position: relative;">
          <KeepAlive>
            <AppsView v-if="view === VIEWS.APPS" />
            <AppstoreView v-else-if="view === VIEWS.APPSTORE" />
          </KeepAlive>
          <AppConfigureView v-if="view === VIEWS.APP" />
          <AppearanceView v-else-if="view === VIEWS.APPEARANCE" />
          <BackupSitesView v-else-if="view === VIEWS.BACKUP_SITES" />
          <AppArchiveView v-else-if="view === VIEWS.APP_ARCHIVE" />
          <CloudronAccountView v-else-if="view === VIEWS.CLOUDRON_ACCOUNT" />
          <DomainsView v-else-if="view === VIEWS.DOMAINS" />
          <EmailDomainsView v-else-if="view === VIEWS.EMAIL_DOMAINS" />
          <EmailDomainView v-else-if="view === VIEWS.EMAIL_DOMAIN" />
          <EmailMailboxesView v-else-if="view === VIEWS.MAILBOXES" />
          <EmailMailinglistsView v-else-if="view === VIEWS.MAILINGLISTS" />
          <EmailSettingsView v-else-if="view === VIEWS.EMAIL_SETTINGS" />
          <EmailEventlogView v-else-if="view === VIEWS.EMAIL_EVENTLOG" />
          <EventlogView v-else-if="view === VIEWS.SYSTEM_EVENTLOG" />
          <ServerView v-else-if="view === VIEWS.SERVER" />
          <NetworkView v-else-if="view === VIEWS.NETWORK" />
          <ProfileView v-else-if="view === VIEWS.PROFILE" />
          <ServicesView v-else-if="view === VIEWS.SERVICES" />
          <SystemSettingsView v-else-if="view === VIEWS.SYSTEM_SETTINGS" />
          <DockerView v-else-if="view === VIEWS.DOCKER" />
          <SystemUpdateView v-else-if="view === VIEWS.SYSTEM_UPDATE" />
          <UserDirectorySettingsView v-else-if="view === VIEWS.USER_DIRECTORY_SETTINGS" />
          <LdapView v-else-if="view === VIEWS.LDAP" />
          <OpenIdView v-else-if="view === VIEWS.OPENID" />
          <UsersView v-else-if="view === VIEWS.USERS" />
          <GroupsView v-else-if="view === VIEWS.GROUPS" />
          <VolumesView v-else-if="view === VIEWS.VOLUMES" />
        </div>
      </div>
    </div>
  </div>
</template>

<style scoped>

.pankow-sidebar {
  background-color: var(--navbar-background);
  padding: 22px 10px 10px 10px;
  margin-right: 20px;
  /* width is optimized for english */
  min-width: 250px;
}

.sidebar-logo img {
  margin-right: 10px;
  height: 40px;
  width: 40px;
  border-radius: var(--pankow-border-radius);
}

.sidebar-logo,
.sidebar-logo:hover {
  display: flex;
  align-items: center;
  color: var(--pankow-text-color);
  text-decoration: none;
  padding-left: 10px;
  max-width: 300px;
  overflow: hidden;
  line-height: 55px;
}

.sidebar-list {
  overflow: auto;
  padding-top: 25px;
  scrollbar-color: transparent transparent;
  scrollbar-width: thin;
}

.sidebar-list:hover {
  scrollbar-color: var(--color-neutral-border) transparent;
}

.sidebar-item {
  display: block;
  color: var(--pankow-text-color);
  border-radius: 3px;
  padding: 10px 15px;
  white-space: nowrap;
  cursor: pointer;
  transition: all 180ms ease-out;
}

.sidebar-item i {
  opacity: 0.5;
  margin-right: 10px;
}

.sidebar-item.active {
  color: var(--pankow-color-primary);
  text-decoration: none;
  font-weight: bold;
}

.sidebar-item:hover {
  background-color: #e9ecef;
  text-decoration: none;
}

@media (prefers-color-scheme: dark) {
  .sidebar-item:hover {
    background-color: var(--card-background);
  }
}

.sidebar-item.active i ,
.sidebar-item:hover i {
  opacity: 1;
}

.sidebar-item-group {
  padding-left: 20px;
  height: auto;
  overflow: hidden;
  /* we need height to auto so we animate max-height. needs to be bigger than we need */
  max-height: 300px;
}

.sidebar-item-group-animation-enter-active,
.sidebar-item-group-animation-leave-active {
  transition: all 0.2s linear;
}

.sidebar-item-group-animation-leave-to,
.sidebar-item-group-animation-enter-from {
  transform: translateX(-100px);
  opacity: 0;
  max-height: 0;
}

.slide-fade-enter-active {
  transition: all 0.1s ease-out;
}

.slide-fade-leave-active {
  transition: all 0.1s ease-out;
}

.slide-fade-enter-from,
.slide-fade-leave-to {
  transform: translateX(20px);
  opacity: 0;
}


</style>
