Skip to content

Commit 47cb0a2

Browse files
committed
fix(formatting): return null for missing values, strip trailing zeros
1 parent a529db1 commit 47cb0a2

File tree

4 files changed

+16
-12
lines changed

4 files changed

+16
-12
lines changed

apps/sim/app/workspace/[workspaceId]/logs/utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ export function mapToExecutionLogAlt(log: RawLogResponse): ExecutionLog {
370370
*/
371371
export function formatLatency(ms: number): string {
372372
if (!Number.isFinite(ms) || ms <= 0) return '—'
373-
return formatDuration(ms, { precision: 2 })
373+
return formatDuration(ms, { precision: 2 }) ?? '—'
374374
}
375375

376376
export const formatDate = (dateString: string) => {

apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/terminal/terminal.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ const BlockRow = memo(function BlockRow({
128128
<StatusDisplay
129129
isRunning={isRunning}
130130
isCanceled={isCanceled}
131-
formattedDuration={formatDuration(entry.durationMs, { precision: 2 })}
131+
formattedDuration={formatDuration(entry.durationMs, { precision: 2 }) ?? '-'}
132132
/>
133133
</span>
134134
</div>
@@ -201,7 +201,7 @@ const IterationNodeRow = memo(function IterationNodeRow({
201201
<StatusDisplay
202202
isRunning={hasRunningChild}
203203
isCanceled={hasCanceledChild}
204-
formattedDuration={formatDuration(entry.durationMs, { precision: 2 })}
204+
formattedDuration={formatDuration(entry.durationMs, { precision: 2 }) ?? '-'}
205205
/>
206206
</span>
207207
</div>
@@ -314,7 +314,7 @@ const SubflowNodeRow = memo(function SubflowNodeRow({
314314
<StatusDisplay
315315
isRunning={hasRunningDescendant}
316316
isCanceled={hasCanceledDescendant}
317-
formattedDuration={formatDuration(entry.durationMs, { precision: 2 })}
317+
formattedDuration={formatDuration(entry.durationMs, { precision: 2 }) ?? '-'}
318318
/>
319319
</span>
320320
</div>

apps/sim/background/workspace-notification-delivery.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ async function deliverEmail(
297297
workflowName: payload.data.workflowName || 'Unknown Workflow',
298298
status: payload.data.status,
299299
trigger: payload.data.trigger,
300-
duration: formatDuration(payload.data.totalDurationMs, { precision: 1 }),
300+
duration: formatDuration(payload.data.totalDurationMs, { precision: 1 }) ?? '-',
301301
cost: formatCost(payload.data.cost),
302302
logUrl,
303303
alertReason,
@@ -310,7 +310,7 @@ async function deliverEmail(
310310
to: subscription.emailRecipients,
311311
subject,
312312
html,
313-
text: `${subject}\n${alertReason ? `\nReason: ${alertReason}\n` : ''}\nWorkflow: ${payload.data.workflowName}\nStatus: ${statusText}\nTrigger: ${payload.data.trigger}\nDuration: ${formatDuration(payload.data.totalDurationMs, { precision: 1 })}\nCost: ${formatCost(payload.data.cost)}\n\nView Log: ${logUrl}${includedDataText}`,
313+
text: `${subject}\n${alertReason ? `\nReason: ${alertReason}\n` : ''}\nWorkflow: ${payload.data.workflowName}\nStatus: ${statusText}\nTrigger: ${payload.data.trigger}\nDuration: ${formatDuration(payload.data.totalDurationMs, { precision: 1 }) ?? '-'}\nCost: ${formatCost(payload.data.cost)}\n\nView Log: ${logUrl}${includedDataText}`,
314314
emailType: 'notifications',
315315
})
316316

@@ -370,7 +370,7 @@ async function deliverSlack(
370370
{ type: 'mrkdwn', text: `*Trigger:*\n${payload.data.trigger}` },
371371
{
372372
type: 'mrkdwn',
373-
text: `*Duration:*\n${formatDuration(payload.data.totalDurationMs, { precision: 1 })}`,
373+
text: `*Duration:*\n${formatDuration(payload.data.totalDurationMs, { precision: 1 }) ?? '-'}`,
374374
},
375375
{ type: 'mrkdwn', text: `*Cost:*\n${formatCost(payload.data.cost)}` },
376376
],

apps/sim/lib/core/utils/formatting.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -156,15 +156,15 @@ export function formatCompactTimestamp(iso: string): string {
156156
* Format a duration to a human-readable format
157157
* @param duration - Duration in milliseconds (number) or as string (e.g., "500ms")
158158
* @param options - Optional formatting options
159-
* @param options.precision - Number of decimal places for seconds (default: 0)
160-
* @returns A formatted duration string
159+
* @param options.precision - Number of decimal places for seconds (default: 0), trailing zeros are stripped
160+
* @returns A formatted duration string, or null if input is null/undefined
161161
*/
162162
export function formatDuration(
163163
duration: number | string | undefined | null,
164164
options?: { precision?: number }
165-
): string {
165+
): string | null {
166166
if (duration === undefined || duration === null) {
167-
return '-'
167+
return null
168168
}
169169

170170
// Parse string durations (e.g., "500ms", "0.44ms", "1234")
@@ -192,7 +192,11 @@ export function formatDuration(
192192

193193
const seconds = ms / 1000
194194
if (seconds < 60) {
195-
return precision > 0 ? `${seconds.toFixed(precision)}s` : `${Math.floor(seconds)}s`
195+
if (precision > 0) {
196+
// Strip trailing zeros (e.g., "5.00s" -> "5s", "5.10s" -> "5.1s")
197+
return `${seconds.toFixed(precision).replace(/\.?0+$/, '')}s`
198+
}
199+
return `${Math.floor(seconds)}s`
196200
}
197201

198202
const minutes = Math.floor(seconds / 60)

0 commit comments

Comments
 (0)