Réglages : préférences (langue, notifications push + test), gestion complète des tokens d'accès (liste/création/révocation, garde anti lock-out sur le dernier token), URL Gitea configurable, infos serveur en lecture seule (port/bind/origines/VAPID + flags CLI). Aide : documentation bilingue EN/FR de toutes les fonctionnalités, avec recherche. Icône Gitea (lien externe) dans la nav (sidebar + MoreSheet mobile). Backend : routes /api/v1/auth/tokens (GET/POST/DELETE) + tokenId dans /me ; routes/settings.ts (GET/PATCH, allow-list stricte gitea_url, aucun secret exposé, URL validée http/https anti-XSS) ; AuthService.listTokens/revokeToken (transaction). Front : NavItem gère les liens externes, nav primaire/secondaire, store settings, vues SettingsView/HelpView. 236 tests verts (+15 nouveaux : auth-tokens, settings-routes). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
54 lines
1.7 KiB
Vue
54 lines
1.7 KiB
Vue
<template>
|
|
<div class="flex min-h-0 w-full flex-1 overflow-hidden">
|
|
<AppSidebar />
|
|
<div class="flex min-h-0 min-w-0 flex-1 flex-col">
|
|
<main v-if="fullbleed" class="flex min-h-0 flex-1 flex-col pb-14 md:pb-0">
|
|
<slot />
|
|
</main>
|
|
<main v-else class="flex-1 overflow-y-auto pb-14 md:pb-0">
|
|
<div class="mx-auto flex w-full max-w-3xl flex-col gap-4 px-4 py-4 md:py-6">
|
|
<slot />
|
|
</div>
|
|
</main>
|
|
<MobileTabBar />
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
// Coquille des vues authentifiées. Propriétaire unique du chargement initial et des abonnements
|
|
// temps réel (sessions/worktrees/groups) pour toute la durée de la session : fiabilise le badge
|
|
// de navigation, la palette ⌘K et la section « À traiter » quelle que soit la vue active.
|
|
import { onMounted, onUnmounted } from 'vue';
|
|
import { useSessionsStore } from '../../stores/sessions';
|
|
import { useWorktreesStore } from '../../stores/worktrees';
|
|
import { useGroupsStore } from '../../stores/groups';
|
|
import { useSettingsStore } from '../../stores/settings';
|
|
import AppSidebar from './AppSidebar.vue';
|
|
import MobileTabBar from './MobileTabBar.vue';
|
|
|
|
defineProps<{ fullbleed?: boolean }>();
|
|
|
|
const sessions = useSessionsStore();
|
|
const worktrees = useWorktreesStore();
|
|
const groups = useGroupsStore();
|
|
const settings = useSettingsStore();
|
|
|
|
onMounted(() => {
|
|
void worktrees.fetchAll();
|
|
void sessions.fetchSessions();
|
|
void groups.fetchGroups();
|
|
void settings.fetch(); // alimente l'icône de nav Gitea et la vue Réglages
|
|
|
|
worktrees.startRealtime();
|
|
sessions.startRealtime();
|
|
groups.startRealtime();
|
|
});
|
|
|
|
onUnmounted(() => {
|
|
worktrees.stopRealtime();
|
|
sessions.stopRealtime();
|
|
groups.stopRealtime();
|
|
});
|
|
</script>
|