refactor: improve team management, OKRs, and session components
This commit is contained in:
@@ -47,86 +47,99 @@ export function CurrentQuarterOKRs({ okrs, period, canEdit = false }: CurrentQua
|
||||
viewBox="0 0 24 24"
|
||||
stroke="currentColor"
|
||||
>
|
||||
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" />
|
||||
<path
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
strokeWidth={2}
|
||||
d="M19 9l-7 7-7-7"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</CardTitle>
|
||||
</CardHeader>
|
||||
{isExpanded && (
|
||||
<CardContent>
|
||||
<div className="space-y-3">
|
||||
{okrs.map((okr) => {
|
||||
const statusColors = getOKRStatusColor(okr.status);
|
||||
return (
|
||||
<div
|
||||
key={okr.id}
|
||||
className="rounded-lg border border-border bg-card p-3 hover:bg-card-hover transition-colors"
|
||||
>
|
||||
<div className="flex items-start justify-between gap-3">
|
||||
<div className="flex-1">
|
||||
<div className="flex items-center gap-2 mb-1">
|
||||
<EditableObjective
|
||||
okr={okr}
|
||||
canEdit={canEdit}
|
||||
onUpdate={() => router.refresh()}
|
||||
/>
|
||||
<Badge
|
||||
variant="default"
|
||||
style={{
|
||||
backgroundColor: statusColors.bg,
|
||||
color: statusColors.color,
|
||||
borderColor: statusColors.color + '30',
|
||||
}}
|
||||
>
|
||||
{OKR_STATUS_LABELS[okr.status]}
|
||||
</Badge>
|
||||
{okr.progress !== undefined && (
|
||||
<span className="text-xs text-muted whitespace-nowrap">{okr.progress}%</span>
|
||||
<div className="space-y-3">
|
||||
{okrs.map((okr) => {
|
||||
const statusColors = getOKRStatusColor(okr.status);
|
||||
return (
|
||||
<div
|
||||
key={okr.id}
|
||||
className="rounded-lg border border-border bg-card p-3 hover:bg-card-hover transition-colors"
|
||||
>
|
||||
<div className="flex items-start justify-between gap-3">
|
||||
<div className="flex-1">
|
||||
<div className="flex items-center gap-2 mb-1">
|
||||
<EditableObjective
|
||||
okr={okr}
|
||||
canEdit={canEdit}
|
||||
onUpdate={() => router.refresh()}
|
||||
/>
|
||||
<Badge
|
||||
variant="default"
|
||||
style={{
|
||||
backgroundColor: statusColors.bg,
|
||||
color: statusColors.color,
|
||||
borderColor: statusColors.color + '30',
|
||||
}}
|
||||
>
|
||||
{OKR_STATUS_LABELS[okr.status]}
|
||||
</Badge>
|
||||
{okr.progress !== undefined && (
|
||||
<span className="text-xs text-muted whitespace-nowrap">
|
||||
{okr.progress}%
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
{okr.description && (
|
||||
<p className="text-sm text-muted mb-2">{okr.description}</p>
|
||||
)}
|
||||
{okr.keyResults && okr.keyResults.length > 0 && (
|
||||
<ul className="space-y-1 mt-2">
|
||||
{okr.keyResults.slice(0, 5).map((kr) => (
|
||||
<EditableKeyResultRow
|
||||
key={kr.id}
|
||||
kr={kr}
|
||||
okrId={okr.id}
|
||||
canEdit={canEdit}
|
||||
onUpdate={() => router.refresh()}
|
||||
/>
|
||||
))}
|
||||
{okr.keyResults.length > 5 && (
|
||||
<li className="text-xs text-muted pl-3.5">
|
||||
+{okr.keyResults.length - 5} autre
|
||||
{okr.keyResults.length - 5 > 1 ? 's' : ''}
|
||||
</li>
|
||||
)}
|
||||
</ul>
|
||||
)}
|
||||
{okr.team && (
|
||||
<div className="mt-2">
|
||||
<span className="text-xs text-muted">Équipe: {okr.team.name}</span>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
{okr.description && (
|
||||
<p className="text-sm text-muted mb-2">{okr.description}</p>
|
||||
)}
|
||||
{okr.keyResults && okr.keyResults.length > 0 && (
|
||||
<ul className="space-y-1 mt-2">
|
||||
{okr.keyResults.slice(0, 5).map((kr) => (
|
||||
<EditableKeyResultRow
|
||||
key={kr.id}
|
||||
kr={kr}
|
||||
okrId={okr.id}
|
||||
canEdit={canEdit}
|
||||
onUpdate={() => router.refresh()}
|
||||
/>
|
||||
))}
|
||||
{okr.keyResults.length > 5 && (
|
||||
<li className="text-xs text-muted pl-3.5">
|
||||
+{okr.keyResults.length - 5} autre{okr.keyResults.length - 5 > 1 ? 's' : ''}
|
||||
</li>
|
||||
)}
|
||||
</ul>
|
||||
)}
|
||||
{okr.team && (
|
||||
<div className="mt-2">
|
||||
<span className="text-xs text-muted">Équipe: {okr.team.name}</span>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
<div className="mt-4 pt-4 border-t border-border">
|
||||
<Link
|
||||
href="/objectives"
|
||||
className="text-sm text-primary hover:underline flex items-center gap-1"
|
||||
>
|
||||
Voir tous les objectifs
|
||||
<svg className="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5l7 7-7 7" />
|
||||
</svg>
|
||||
</Link>
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
<div className="mt-4 pt-4 border-t border-border">
|
||||
<Link
|
||||
href="/objectives"
|
||||
className="text-sm text-primary hover:underline flex items-center gap-1"
|
||||
>
|
||||
Voir tous les objectifs
|
||||
<svg className="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
strokeWidth={2}
|
||||
d="M9 5l7 7-7 7"
|
||||
/>
|
||||
</svg>
|
||||
</Link>
|
||||
</div>
|
||||
</CardContent>
|
||||
)}
|
||||
</Card>
|
||||
@@ -222,8 +235,7 @@ function EditableKeyResultRow({
|
||||
const [currentValue, setCurrentValue] = useState(kr.currentValue);
|
||||
const [updating, setUpdating] = useState(false);
|
||||
|
||||
const krProgress =
|
||||
kr.targetValue > 0 ? Math.round((kr.currentValue / kr.targetValue) * 100) : 0;
|
||||
const krProgress = kr.targetValue > 0 ? Math.round((kr.currentValue / kr.targetValue) * 100) : 0;
|
||||
|
||||
const handleSave = async () => {
|
||||
setUpdating(true);
|
||||
@@ -263,7 +275,9 @@ function EditableKeyResultRow({
|
||||
step="0.1"
|
||||
className="h-6 w-16 text-xs"
|
||||
/>
|
||||
<span className="text-muted">/ {kr.targetValue} {kr.unit}</span>
|
||||
<span className="text-muted">
|
||||
/ {kr.targetValue} {kr.unit}
|
||||
</span>
|
||||
</div>
|
||||
<div className="flex items-center gap-1 flex-shrink-0">
|
||||
<Button size="sm" onClick={handleSave} disabled={updating} className="h-6 text-xs">
|
||||
|
||||
Reference in New Issue
Block a user