feat(07.1-05): user-tz on shared client components
- DetailModal: thread tz through resolveLabel(...) module helper + default export's 3 inline date/time calls. - IntegrationStatusTabs: thread tz through fmtDate helper + VeeamTab sub-component prop. - SyncScheduler: thread tz into closure-scoped formatDate helper. - audit-log-table, user-table, user-sessions, active-sessions: inline toLocale calls in component body. - analysis-view: useUserTimezone in AnalysisView; thread tz into 4 toLocaleString calls. - resolution-trend, volume-trend (recharts): module-scope fmtDate(iso) → fmtDate(iso, tz); useUserTimezone in named export; thread tz into axis tickFormatter + tooltip labelFormatter. - ticket-detail-modal: thread tz into formatDate arrow inside TicketDetailModal. - TimelineView: useUserTimezone; thread tz into 4 toLocale*String calls (hour/day/month/event-time formatters). - ScoreCard: useUserTimezone in AggregateScoreCard; thread tz into the date-range latest call. - addigy-tab: useUserTimezone in AddigyTab; thread tz into 2 inline calls. - activity-sparkline: module-scope fmtHour(iso) → fmtHour(iso, tz); useUserTimezone in ActivitySparkline; update 3 callsites in title/aria. - compliance-detail-table: thread tz from ComplianceDetailTable into ContractCoverageModal sub-component (2 inline date calls). - company-backup-detail: module-scope formatDate(d) → formatDate(d, tz); useUserTimezone in CompanyBackupDetail; update 3 callsites. Migrates 31 of 81 audit leak callsites.
This commit is contained in:
parent
91b876310e
commit
8f955a0ff9
17 changed files with 94 additions and 53 deletions
|
|
@ -13,6 +13,7 @@
|
|||
'use client';
|
||||
|
||||
import { cn } from '@/lib/utils';
|
||||
import { useUserTimezone } from '@/lib/hooks/use-user-timezone';
|
||||
|
||||
interface ActivityBucket {
|
||||
hour: string;
|
||||
|
|
@ -26,10 +27,11 @@ interface ActivitySparklineProps {
|
|||
height?: number;
|
||||
}
|
||||
|
||||
function fmtHour(iso: string): string {
|
||||
function fmtHour(iso: string, tz: string): string {
|
||||
return new Date(iso).toLocaleTimeString(undefined, {
|
||||
hour: 'numeric',
|
||||
minute: '2-digit',
|
||||
timeZone: tz,
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -38,6 +40,7 @@ export function ActivitySparkline({
|
|||
className,
|
||||
height = 32,
|
||||
}: ActivitySparklineProps) {
|
||||
const tz = useUserTimezone();
|
||||
if (data.length === 0) {
|
||||
return null;
|
||||
}
|
||||
|
|
@ -57,10 +60,10 @@ export function ActivitySparkline({
|
|||
key={bucket.hour}
|
||||
title={
|
||||
empty
|
||||
? `${fmtHour(bucket.hour)} · idle`
|
||||
: `${fmtHour(bucket.hour)} · ${bucket.success} ok · ${bucket.failure} fail`
|
||||
? `${fmtHour(bucket.hour, tz)} · idle`
|
||||
: `${fmtHour(bucket.hour, tz)} · ${bucket.success} ok · ${bucket.failure} fail`
|
||||
}
|
||||
aria-label={`${fmtHour(bucket.hour)}: ${bucket.success} ok, ${bucket.failure} fail`}
|
||||
aria-label={`${fmtHour(bucket.hour, tz)}: ${bucket.success} ok, ${bucket.failure} fail`}
|
||||
className="relative flex-1 min-w-[1px] flex flex-col-reverse rounded-[1px] overflow-hidden"
|
||||
style={{ height: `${empty ? 12 : Math.max(totalPct, 8)}%` }}
|
||||
data-bucket-index={i}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue