Update Owliver language and suggestions

This commit is contained in:
2026-10-07 19:15:44 +05:30
parent 8ac4e1ee88
commit 81e5979f8f
156 changed files with 7330 additions and 1755 deletions

View File

@@ -1,6 +1,7 @@
import type { Staff } from '@/types/entities';
import React, { useMemo } from 'react';
import { TrendingUp, TrendingDown, Clock, Activity } from 'lucide-react';
import { useTranslation } from 'react-i18next';
const MS_PER_DAY = 1000 * 60 * 60 * 24;
@@ -16,6 +17,7 @@ interface RetentionMetricsProps {
}
export default function RetentionMetrics({ staff }: RetentionMetricsProps) {
const { t } = useTranslation();
const stats = useMemo(() => {
const total = staff.length;
const active = staff.filter((s) => s.status === 'active').length;
@@ -53,28 +55,28 @@ export default function RetentionMetrics({ staff }: RetentionMetricsProps) {
<div className="grid grid-cols-2 lg:grid-cols-4 gap-3">
<Metric
icon={<TrendingUp className="w-4 h-4" />}
label="Retention Rate"
label={t('retentionMetrics.retentionRate')}
value={stats.retentionRate == null ? '—' : `${stats.retentionRate}%`}
tone={stats.retentionRate == null ? 'neutral' : stats.retentionRate >= 70 ? 'good' : stats.retentionRate >= 40 ? 'warn' : 'bad'}
sub={`${stats.active} active · ${stats.churned} churned`}
/>
<Metric
icon={<Activity className="w-4 h-4" />}
label="Still Active"
label={t('retentionMetrics.stillActive')}
value={stats.active}
tone="good"
sub={stats.onboarding > 0 ? `+ ${stats.onboarding} onboarding` : 'On track'}
/>
<Metric
icon={<TrendingDown className="w-4 h-4" />}
label="Churned"
label={t('retentionMetrics.churned')}
value={stats.churned}
tone={stats.churned === 0 ? 'good' : 'bad'}
sub={`${stats.total} total hires`}
/>
<Metric
icon={<Clock className="w-4 h-4" />}
label="Avg Tenure"
label={t('retentionMetrics.avgTenure')}
value={stats.avgTenure > 0 ? `${stats.avgTenure}d` : '—'}
tone="neutral"
sub={`30d: ${stats.c30 ?? '—'} · 90d: ${stats.c90 ?? '—'}`}