feat(frontend): bell, chat, uploads, glass, teams UI, fixes
- Notification bell with invites (accept/decline refreshes workspaces) and unread badge (polling + socket push); team chat view realtime - Avatar/background uploads in settings + glassmorphism widgets toggle; background layer resolves /uploads URLs; full-bleed blurred backdrop - Sidebar: visible creation errors, working sub-pages (parent_id), TEAM badge workspaces, refresh button, chat nav; admin creates users - Tasks: per-team boards, assignee select with avatars; admin tabs for users/teams/groups (team workspaces, permission checkboxes) - Register view removed (admin-only accounts); login localized; prettier emoji set; scaling/overflow + mobile fixes
This commit is contained in:
+15
-6
@@ -4,21 +4,29 @@ import { useAuthStore } from './stores/auth';
|
||||
import { useThemeStore } from './stores/theme';
|
||||
import { useLocaleStore } from './stores/locale';
|
||||
import { useUiStore } from './stores/ui';
|
||||
import { fileUrl } from './files';
|
||||
import SettingsWindow from './components/SettingsWindow.vue';
|
||||
import TimeTrackerButton from './components/TimeTrackerButton.vue';
|
||||
import Bell from './components/Bell.vue';
|
||||
|
||||
const auth = useAuthStore();
|
||||
const theme = useThemeStore();
|
||||
const locale = useLocaleStore();
|
||||
const ui = useUiStore();
|
||||
|
||||
const bgRaw = computed(() => auth.user?.bgImage || '');
|
||||
const bgIsImage = computed(() => /^(https?:\/\/|\/uploads|data:)/.test(bgRaw.value));
|
||||
const bgStyle = computed(() => {
|
||||
const bg = auth.user?.bgImage || '';
|
||||
if (!bg) return {};
|
||||
const style = { backgroundImage: bg.startsWith('http') ? `url("${bg}")` : bg };
|
||||
if (auth.user?.bgBlur !== false) style.filter = 'blur(14px) brightness(0.85)';
|
||||
if (!bgRaw.value) return {};
|
||||
const style = {
|
||||
backgroundImage: bgIsImage.value ? `url("${fileUrl(bgRaw.value)}")` : bgRaw.value,
|
||||
backgroundSize: 'cover',
|
||||
backgroundPosition: 'center',
|
||||
};
|
||||
if (auth.user?.bgBlur !== false) style.filter = 'blur(16px) brightness(0.9)';
|
||||
return style;
|
||||
});
|
||||
const glassOn = computed(() => !!bgRaw.value && auth.user?.bgGlass !== false);
|
||||
|
||||
onMounted(() => {
|
||||
locale.set(locale.locale);
|
||||
@@ -28,9 +36,10 @@ onMounted(() => {
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<div v-if="bgStyle.backgroundImage" class="bg-layer" :style="bgStyle"></div>
|
||||
<div :class="{ 'has-bg': !!bgRaw, glass: glassOn }">
|
||||
<div v-if="bgRaw" class="bg-layer" :style="bgStyle"></div>
|
||||
<div v-if="auth.isLoggedIn" class="top-right">
|
||||
<Bell />
|
||||
<TimeTrackerButton />
|
||||
<button class="ghost icon-btn" @click="ui.openSettings()" title="⚙️">⚙️</button>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user