Skip to content

Commit 1ee7296

Browse files
authored
fix: refine object dialog values and focus
1 parent 587b7ce commit 1ee7296

2 files changed

Lines changed: 45 additions & 34 deletions

File tree

ui/src/components/app/CopyableValue.tsx

Lines changed: 11 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,7 @@ export function CopyableValue({
5353
{model.displayText}
5454
</a>
5555
) : (
56-
<span
57-
role="note"
58-
aria-label={`${label}: ${model.displayText}`}
59-
// biome-ignore lint/a11y/noNoninteractiveTabindex: the value tooltip needs keyboard focus without adding button semantics.
60-
tabIndex={0}
61-
className={cn(
62-
valueClassName,
63-
'rounded-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring'
64-
)}
65-
>
56+
<span role="note" aria-label={`${label}: ${model.tooltipValue}`} className={valueClassName}>
6657
{model.displayText}
6758
</span>
6859
)
@@ -78,20 +69,16 @@ export function CopyableValue({
7869
<span className={cn(monospace && 'font-mono text-xs')}>{model.tooltipValue}</span>
7970
</TooltipContent>
8071
</Tooltip>
81-
<Tooltip delayDuration={200}>
82-
<TooltipTrigger asChild>
83-
<Button
84-
type="button"
85-
variant="ghost"
86-
size="icon-xs"
87-
onClick={() => copy(model.copyValue)}
88-
aria-label={`${copyLabel} ${label}`}
89-
>
90-
{copyState === 'copied' ? <Check data-icon="inline-start" /> : <Copy data-icon="inline-start" />}
91-
</Button>
92-
</TooltipTrigger>
93-
<TooltipContent>{copyLabel}</TooltipContent>
94-
</Tooltip>
72+
<Button
73+
type="button"
74+
variant="ghost"
75+
size="icon-xs"
76+
onClick={() => copy(model.copyValue)}
77+
aria-label={`${copyLabel} ${label}`}
78+
title={copyLabel}
79+
>
80+
{copyState === 'copied' ? <Check data-icon="inline-start" /> : <Copy data-icon="inline-start" />}
81+
</Button>
9582
</span>
9683
)
9784
}

ui/src/routes/buckets.$name.tsx

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,13 @@ function ObjectVersionsDialog({
342342
<span className="sr-only">Object versions for selected object.</span>
343343
</DialogDescription>
344344
<div className="pr-8 text-muted-foreground">
345-
<CopyableValue label="Object key" value={objectKey} monospace className="max-w-full" />
345+
<CopyableValue
346+
label="Object key"
347+
value={objectKey}
348+
monospace
349+
maxLength={objectKey.length}
350+
className="max-w-full"
351+
/>
346352
</div>
347353
</DialogHeader>
348354
{versions.isLoading ? (
@@ -690,8 +696,20 @@ function ObjectProvenanceDialog({
690696
<span className="sr-only">Storage provenance for selected object version.</span>
691697
</DialogDescription>
692698
<div className="flex min-w-0 flex-col gap-1 pr-8 text-muted-foreground">
693-
<CopyableValue label="Object key" value={objectKey} monospace className="max-w-full" />
694-
<CopyableValue label="Version" value={versionID} monospace className="max-w-full" />
699+
<CopyableValue
700+
label="Object key"
701+
value={objectKey}
702+
monospace
703+
maxLength={objectKey.length}
704+
className="max-w-full"
705+
/>
706+
<CopyableValue
707+
label="Version"
708+
value={versionID}
709+
monospace
710+
maxLength={versionID.length}
711+
className="max-w-full"
712+
/>
695713
</div>
696714
</DialogHeader>
697715

@@ -730,24 +748,30 @@ function ProvenanceSummary({ data }: { data: ObjectProvenance }) {
730748
const uploadLabel = data.upload_status ? uploadStatusLabel(data.upload_status, progressPercent) : 'No upload recorded'
731749

732750
return (
733-
<dl className="grid gap-3 rounded-md border border-border p-3 text-sm sm:grid-cols-2 lg:grid-cols-4">
751+
<dl className="grid gap-x-8 gap-y-4 rounded-md border border-border p-3 text-sm sm:grid-cols-2 lg:grid-cols-6">
734752
<ProvenanceSummaryItem
735753
label="Object status"
736754
value={objectStateLabel(data.state, data.status, data.upload_status, progressPercent)}
755+
className="lg:col-span-2"
737756
/>
738-
<ProvenanceSummaryItem label="Upload" value={uploadLabel} />
757+
<ProvenanceSummaryItem label="Upload" value={uploadLabel} className="lg:col-span-2" />
739758
<ProvenanceSummaryItem label="Replicas" value={`${data.success_copies} / ${data.requested_copies}`} />
740759
<ProvenanceSummaryItem
741760
label="Object copy health"
742761
value={copyHealthSummaryLabel(data.copy_health)}
743762
title={copyHealthSummaryTitle(data.copy_health)}
744763
/>
745-
<ProvenanceSummaryItem label="Updated" value={timeAgo(data.updated_at)} title={data.updated_at} />
764+
<ProvenanceSummaryItem
765+
label="Updated"
766+
value={timeAgo(data.updated_at)}
767+
title={data.updated_at}
768+
className="sm:col-span-2 lg:col-span-1"
769+
/>
746770
<ProvenanceSummaryItem
747771
label="Piece CID"
748772
value={data.piece_cid ?? '—'}
749773
title={data.piece_cid}
750-
className="sm:col-span-2 lg:col-span-4"
774+
className="sm:col-span-2 lg:col-span-5"
751775
mono
752776
copyable={Boolean(data.piece_cid)}
753777
/>
@@ -773,16 +797,16 @@ function ProvenanceSummaryItem({
773797
const copyableValue = copyable && value !== '—'
774798

775799
return (
776-
<div className={className}>
800+
<div className={cn('min-w-0', className)}>
777801
<dt className="text-xs text-muted-foreground">{label}</dt>
778802
<dd
779803
className={cn('mt-1 min-w-0', mono ? 'font-mono text-xs' : 'font-medium')}
780804
title={copyableValue ? undefined : (title ?? value)}
781805
>
782806
{copyableValue ? (
783-
<CopyableValue label={label} value={value} monospace={mono} maxLength={36} />
807+
<CopyableValue label={label} value={value} monospace={mono} maxLength={value.length} />
784808
) : (
785-
<span className="truncate">{value}</span>
809+
<span className="block break-words">{value}</span>
786810
)}
787811
</dd>
788812
</div>

0 commit comments

Comments
 (0)