feat(frontend): bell, chat, uploads, glass, teams UI, fixes
ci / backend (push) Canceled after 0s
ci / frontend (push) Canceled after 0s

- 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:
x3
2026-09-22 14:27:33 +02:00
parent c3c77333db
commit 0bb4e5c1cd
22 changed files with 898 additions and 157 deletions
+15 -6
View File
@@ -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>