myCRM/assets/js/layout/AppTopbar.vue
olli b84dc6c6e9 feat: add typography and utility styles for layout
- Introduced typography styles in _typography.scss for headings, paragraphs, blockquotes, and horizontal rules.
- Added utility classes in _utils.scss for card styling and clearfix.
- Updated layout.scss to include new typography and utility styles.
- Defined common CSS variables in _common.scss for consistent theming.
- Created dark and light theme variables in _dark.scss and _light.scss respectively.
- Integrated Tailwind CSS with custom configurations in tailwind.config.js and postcss.config.js.
- Implemented database migrations for contact and contact_persons tables.
- Added data fixtures for generating sample contact data.
- Developed Contact and ContactPerson entities with appropriate validation and serialization.
- Enhanced ContactRepository with search and type filtering methods.
2025-11-09 11:02:15 +01:00

97 lines
5.0 KiB
Vue

<script setup>
import { useLayout } from './composables/layout';
import { useAuthStore } from '../stores/auth';
import AppConfigurator from './AppConfigurator.vue';
const { toggleMenu, toggleDarkMode, isDarkTheme } = useLayout();
const authStore = useAuthStore();
async function logout() {
await authStore.logout();
}
</script>
<template>
<div class="layout-topbar">
<div class="layout-topbar-logo-container">
<button class="layout-menu-button layout-topbar-action" @click="toggleMenu">
<i class="pi pi-bars"></i>
</button>
<router-link to="/" class="layout-topbar-logo">
<span class="text-2xl font-bold">myCRM</span>
</router-link>
</div>
<div class="layout-topbar-actions">
<div class="layout-config-menu">
<button type="button" class="layout-topbar-action" @click="toggleDarkMode">
<i :class="['pi', { 'pi-moon': isDarkTheme, 'pi-sun': !isDarkTheme }]"></i>
</button>
<div class="relative">
<button
v-styleclass="{ selector: '@next', enterFromClass: 'hidden', enterActiveClass: 'animate-scalein', leaveToClass: 'hidden', leaveActiveClass: 'animate-fadeout', hideOnOutsideClick: true }"
type="button"
class="layout-topbar-action layout-topbar-action-highlight"
>
<i class="pi pi-palette"></i>
</button>
<AppConfigurator />
</div>
</div>
<button
class="layout-topbar-menu-button layout-topbar-action lg:hidden"
v-styleclass="{ selector: '@next', enterFromClass: 'hidden', enterActiveClass: 'animate-scalein', leaveToClass: 'hidden', leaveActiveClass: 'animate-fadeout', hideOnOutsideClick: true }"
>
<i class="pi pi-ellipsis-v"></i>
</button>
<div class="layout-topbar-menu hidden lg:flex">
<div class="relative">
<button
type="button"
class="layout-topbar-action"
v-styleclass="{ selector: '@next', enterFromClass: 'hidden', enterActiveClass: 'animate-scalein', leaveToClass: 'hidden', leaveActiveClass: 'animate-fadeout', hideOnOutsideClick: true }"
>
<i class="pi pi-user"></i>
<span>{{ authStore.user?.email?.split('@')[0] }}</span>
</button>
<div class="hidden absolute right-0 top-full mt-2 bg-surface-0 dark:bg-surface-900 border border-surface-200 dark:border-surface-700 rounded-lg shadow-lg p-4 min-w-[280px] z-[1000]">
<div class="flex items-center gap-3 pb-3 border-b border-surface-200 dark:border-surface-700">
<div class="w-12 h-12 rounded-full bg-primary text-primary-contrast flex items-center justify-center text-xl font-bold">
{{ (authStore.user?.fullName || authStore.user?.email || 'U').charAt(0).toUpperCase() }}
</div>
<div class="flex-1">
<div class="font-semibold text-surface-900 dark:text-surface-0">
{{ authStore.user?.fullName || authStore.user?.email?.split('@')[0] }}
</div>
<div class="text-sm text-surface-600 dark:text-surface-400">
{{ authStore.user?.email }}
</div>
</div>
</div>
<div class="pt-3 space-y-2">
<div class="flex items-center gap-2 text-sm">
<i class="pi pi-shield text-surface-500"></i>
<span class="text-surface-700 dark:text-surface-300">
{{ authStore.user?.roles?.join(', ') || 'Keine Rolle' }}
</span>
</div>
<div class="flex items-center gap-2 text-sm" v-if="authStore.user?.createdAt">
<i class="pi pi-calendar text-surface-500"></i>
<span class="text-surface-700 dark:text-surface-300">
Mitglied seit {{ new Date(authStore.user.createdAt).toLocaleDateString('de-DE') }}
</span>
</div>
</div>
</div>
</div>
<button type="button" class="layout-topbar-action" @click="logout">
<i class="pi pi-sign-out"></i>
<span>Logout</span>
</button>
</div>
</div>
</div>
</template>