|
@@ -75,8 +75,8 @@ function parseDurationToMs(value: string): number | null {
|
|
|
if (!value.trim()) return null
|
|
if (!value.trim()) return null
|
|
|
const num = parseFloat(value)
|
|
const num = parseFloat(value)
|
|
|
if (isNaN(num)) return null
|
|
if (isNaN(num)) return null
|
|
|
- // Assume seconds if no unit, convert to ms
|
|
|
|
|
- return num * 1000
|
|
|
|
|
|
|
+ // Value is already in milliseconds
|
|
|
|
|
+ return num
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function StatusBadge({ status }: { status: string }) {
|
|
function StatusBadge({ status }: { status: string }) {
|
|
@@ -259,25 +259,25 @@ export function ExecutionListPanel({
|
|
|
|
|
|
|
|
{/* Duration Range */}
|
|
{/* Duration Range */}
|
|
|
<div className="space-y-1.5">
|
|
<div className="space-y-1.5">
|
|
|
- <label className="text-xs text-gray-500 dark:text-gray-400">Duration (seconds)</label>
|
|
|
|
|
|
|
+ <label className="text-xs text-gray-500 dark:text-gray-400">Duration (ms)</label>
|
|
|
<div className="flex gap-2">
|
|
<div className="flex gap-2">
|
|
|
<input
|
|
<input
|
|
|
type="number"
|
|
type="number"
|
|
|
value={filters.durationMin}
|
|
value={filters.durationMin}
|
|
|
onChange={(e) => setFilters(f => ({ ...f, durationMin: e.target.value }))}
|
|
onChange={(e) => setFilters(f => ({ ...f, durationMin: e.target.value }))}
|
|
|
- className="flex-1 px-2 py-1.5 text-xs bg-white dark:bg-slate-700 border border-gray-300 dark:border-slate-600 rounded-md focus:ring-1 focus:ring-primary-500 focus:border-primary-500"
|
|
|
|
|
|
|
+ className="w-0 flex-1 min-w-0 px-2 py-1.5 text-xs bg-white dark:bg-slate-700 border border-gray-300 dark:border-slate-600 rounded-md focus:ring-1 focus:ring-primary-500 focus:border-primary-500"
|
|
|
placeholder="Min"
|
|
placeholder="Min"
|
|
|
min="0"
|
|
min="0"
|
|
|
- step="0.1"
|
|
|
|
|
|
|
+ step="1"
|
|
|
/>
|
|
/>
|
|
|
<input
|
|
<input
|
|
|
type="number"
|
|
type="number"
|
|
|
value={filters.durationMax}
|
|
value={filters.durationMax}
|
|
|
onChange={(e) => setFilters(f => ({ ...f, durationMax: e.target.value }))}
|
|
onChange={(e) => setFilters(f => ({ ...f, durationMax: e.target.value }))}
|
|
|
- className="flex-1 px-2 py-1.5 text-xs bg-white dark:bg-slate-700 border border-gray-300 dark:border-slate-600 rounded-md focus:ring-1 focus:ring-primary-500 focus:border-primary-500"
|
|
|
|
|
|
|
+ className="w-0 flex-1 min-w-0 px-2 py-1.5 text-xs bg-white dark:bg-slate-700 border border-gray-300 dark:border-slate-600 rounded-md focus:ring-1 focus:ring-primary-500 focus:border-primary-500"
|
|
|
placeholder="Max"
|
|
placeholder="Max"
|
|
|
min="0"
|
|
min="0"
|
|
|
- step="0.1"
|
|
|
|
|
|
|
+ step="1"
|
|
|
/>
|
|
/>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|