diff --git a/src/app/sessions/NewWorkshopDropdown.tsx b/src/app/sessions/NewWorkshopDropdown.tsx
new file mode 100644
index 0000000..ff08db2
--- /dev/null
+++ b/src/app/sessions/NewWorkshopDropdown.tsx
@@ -0,0 +1,58 @@
+'use client';
+
+import { useState } from 'react';
+import Link from 'next/link';
+import { Button } from '@/components/ui';
+
+const WORKSHOPS = [
+ { href: '/sessions/new', icon: '📊', label: 'SWOT', desc: 'Forces, faiblesses, opportunités' },
+ { href: '/motivators/new', icon: '🎯', label: 'Moving Motivators', desc: 'Motivations intrinsèques' },
+ { href: '/year-review/new', icon: '📅', label: 'Year Review', desc: "Bilan de l'année" },
+ { href: '/weekly-checkin/new', icon: '📝', label: 'Weekly Check-in', desc: 'Suivi hebdomadaire' },
+ { href: '/weather/new', icon: '🌤️', label: 'Météo d\'équipe', desc: 'Humeur et énergie' },
+];
+
+export function NewWorkshopDropdown() {
+ const [open, setOpen] = useState(false);
+
+ return (
+
+
setOpen(!open)}
+ onBlur={() => setTimeout(() => setOpen(false), 150)}
+ className="gap-1.5"
+ >
+ Nouvel atelier
+
+
+
+
+ {open && (
+
+ {WORKSHOPS.map((w) => (
+
setOpen(false)}
+ >
+
{w.icon}
+
+
+ ))}
+
+ )}
+
+ );
+}
diff --git a/src/app/sessions/WorkshopTabs.tsx b/src/app/sessions/WorkshopTabs.tsx
index dda415f..55d8a8c 100644
--- a/src/app/sessions/WorkshopTabs.tsx
+++ b/src/app/sessions/WorkshopTabs.tsx
@@ -30,6 +30,15 @@ const VALID_TABS: WorkshopType[] = [
'byPerson',
];
+const TYPE_TABS: { value: WorkshopType; icon: string; label: string }[] = [
+ { value: 'all', icon: '📋', label: 'Tous' },
+ { value: 'swot', icon: '📊', label: 'SWOT' },
+ { value: 'motivators', icon: '🎯', label: 'Motivators' },
+ { value: 'year-review', icon: '📅', label: 'Year Review' },
+ { value: 'weekly-checkin', icon: '📝', label: 'Check-in' },
+ { value: 'weather', icon: '🌤️', label: 'Météo' },
+];
+
interface ShareUser {
id: string;
name: string | null;
@@ -199,6 +208,7 @@ export function WorkshopTabs({
}: WorkshopTabsProps) {
const searchParams = useSearchParams();
const router = useRouter();
+ const [typeDropdownOpen, setTypeDropdownOpen] = useState(false);
// Get tab from URL or default to 'all'
const tabParam = searchParams.get('tab');
@@ -251,7 +261,7 @@ export function WorkshopTabs({
return (
{/* Tabs */}
-
+
setActiveTab('all')}
@@ -266,40 +276,18 @@ export function WorkshopTabs({
label="Par personne"
count={sessionsByPerson.size}
/>
- setActiveTab('swot')}
- icon="📊"
- label="SWOT"
- count={swotSessions.length}
- />
- setActiveTab('motivators')}
- icon="🎯"
- label="Moving Motivators"
- count={motivatorSessions.length}
- />
- setActiveTab('year-review')}
- icon="📅"
- label="Year Review"
- count={yearReviewSessions.length}
- />
- setActiveTab('weekly-checkin')}
- icon="📝"
- label="Weekly Check-in"
- count={weeklyCheckInSessions.length}
- />
- setActiveTab('weather')}
- icon="🌤️"
- label="Météo"
- count={weatherSessions.length}
+
@@ -367,6 +355,92 @@ export function WorkshopTabs({
);
}
+function TypeFilterDropdown({
+ activeTab,
+ setActiveTab,
+ open,
+ onOpenChange,
+ counts,
+}: {
+ activeTab: WorkshopType;
+ setActiveTab: (t: WorkshopType) => void;
+ open: boolean;
+ onOpenChange: (v: boolean) => void;
+ counts: Record
;
+}) {
+ const typeTabs = TYPE_TABS.filter((t) => t.value !== 'all');
+ const current = TYPE_TABS.find((t) => t.value === activeTab) ?? TYPE_TABS[0];
+ const isTypeSelected = activeTab !== 'all' && activeTab !== 'byPerson';
+ const totalCount = typeTabs.reduce((s, t) => s + (counts[t.value] ?? 0), 0);
+
+ return (
+
+
onOpenChange(!open)}
+ onBlur={() => setTimeout(() => onOpenChange(false), 150)}
+ className={`
+ flex items-center gap-2 px-3 py-2 rounded-lg font-medium text-sm transition-colors
+ ${isTypeSelected ? 'bg-primary text-primary-foreground' : 'text-muted hover:bg-card-hover hover:text-foreground'}
+ `}
+ >
+ {current.icon}
+ {current.label}
+
+ {isTypeSelected ? counts[activeTab] ?? 0 : totalCount}
+
+
+
+
+
+ {open && (
+
+ {
+ setActiveTab('all');
+ onOpenChange(false);
+ }}
+ className="flex w-full items-center justify-between gap-2 px-4 py-2 text-left text-sm text-foreground hover:bg-card-hover border-b border-border"
+ >
+
+ 📋
+ Tous
+
+
+ {totalCount}
+
+
+ {typeTabs.map((t) => (
+ {
+ setActiveTab(t.value);
+ onOpenChange(false);
+ }}
+ className="flex w-full items-center justify-between gap-2 px-4 py-2 text-left text-sm text-foreground hover:bg-card-hover"
+ >
+
+ {t.icon}
+ {t.label}
+
+
+ {counts[t.value] ?? 0}
+
+
+ ))}
+
+ )}
+
+ );
+}
+
function TabButton({
active,
onClick,
@@ -382,9 +456,10 @@ function TabButton({
}) {
return (
{icon}
{label}
-
+
{count}
diff --git a/src/app/sessions/page.tsx b/src/app/sessions/page.tsx
index 9882568..8cf9a2a 100644
--- a/src/app/sessions/page.tsx
+++ b/src/app/sessions/page.tsx
@@ -1,13 +1,13 @@
import { Suspense } from 'react';
-import Link from 'next/link';
import { auth } from '@/lib/auth';
import { getSessionsByUserId } from '@/services/sessions';
import { getMotivatorSessionsByUserId } from '@/services/moving-motivators';
import { getYearReviewSessionsByUserId } from '@/services/year-review';
import { getWeeklyCheckInSessionsByUserId } from '@/services/weekly-checkin';
import { getWeatherSessionsByUserId } from '@/services/weather';
-import { Card, Button } from '@/components/ui';
+import { Card } from '@/components/ui';
import { WorkshopTabs } from './WorkshopTabs';
+import { NewWorkshopDropdown } from './NewWorkshopDropdown';
function WorkshopTabsSkeleton() {
return (
@@ -90,38 +90,7 @@ export default async function SessionsPage() {
Mes Ateliers
Tous vos ateliers en un seul endroit
-
-
-
- 📊
- Nouveau SWOT
-
-
-
-
- 🎯
- Nouveau Motivators
-
-
-
-
- 📅
- Nouveau Year Review
-
-
-
-
- 📝
- Nouveau Check-in
-
-
-
-
- 🌤️
- Nouvelle Météo
-
-
-
+
{/* Content */}
@@ -136,37 +105,8 @@ export default async function SessionsPage() {
découvrir les motivations, un Year Review pour faire le bilan de l'année, ou un
Weekly Check-in pour le suivi hebdomadaire.
-
-
-
- 📊
- Créer un SWOT
-
-
-
-
- 🎯
- Créer un Moving Motivators
-
-
-
-
- 📅
- Créer un Year Review
-
-
-
-
- 📝
- Créer un Check-in
-
-
-
-
- 🌤️
- Créer une Météo
-
-
+
+
) : (
diff --git a/src/components/layout/Header.tsx b/src/components/layout/Header.tsx
index a10c1a6..26f45f5 100644
--- a/src/components/layout/Header.tsx
+++ b/src/components/layout/Header.tsx
@@ -59,18 +59,22 @@ export function Header() {
👥 Équipes
- {/* Workshops Dropdown */}
+ {/* New Workshop Dropdown */}
setWorkshopsOpen(!workshopsOpen)}
onBlur={() => setTimeout(() => setWorkshopsOpen(false), 150)}
className={`flex items-center gap-1 text-sm font-medium transition-colors ${
- isActiveLink('/sessions/') || isActiveLink('/motivators')
+ isActiveLink('/sessions/') ||
+ isActiveLink('/motivators') ||
+ isActiveLink('/year-review') ||
+ isActiveLink('/weekly-checkin') ||
+ isActiveLink('/weather')
? 'text-primary'
: 'text-muted hover:text-foreground'
}`}
>
- Ateliers
+ Nouvel atelier
Motivations intrinsèques
+ setWorkshopsOpen(false)}
+ >
+ 📅
+
+
Year Review
+
Bilan de l'année
+
+
+ setWorkshopsOpen(false)}
+ >
+ 📝
+
+
Weekly Check-in
+
Suivi hebdomadaire
+
+
+ setWorkshopsOpen(false)}
+ >
+ 🌤️
+
+
Météo d'équipe
+
Humeur et énergie
+
+
)}