Skip to content
Draft
Show file tree
Hide file tree
Changes from 45 commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
7962b74
RunsPage redesign v0
diegoimbert Feb 5, 2026
c7370ec
nit
diegoimbert Feb 5, 2026
d6d6893
Remove manualdatepicker
diegoimbert Feb 5, 2026
5a96142
remove shadow
diegoimbert Feb 5, 2026
d290ff0
ui nits
diegoimbert Feb 5, 2026
0b8681c
nit scrollbar bg
diegoimbert Feb 5, 2026
bacdbbb
prettier cards
diegoimbert Feb 5, 2026
6558efd
nit
diegoimbert Feb 5, 2026
5eac04e
Remove code
diegoimbert Feb 5, 2026
33a03f4
command/meta multi select
diegoimbert Feb 5, 2026
a98ac00
Shift select
diegoimbert Feb 5, 2026
05dc037
RightClickPopover
diegoimbert Feb 5, 2026
b675281
nit
diegoimbert Feb 6, 2026
547470a
Ctrl A
diegoimbert Feb 6, 2026
d230b52
nit card
diegoimbert Feb 6, 2026
2bd0e18
DropdownMenu
diegoimbert Feb 6, 2026
bd5528f
nit
diegoimbert Feb 6, 2026
35c6052
count hint
diegoimbert Feb 6, 2026
1091ac9
fix stuck keys
diegoimbert Feb 6, 2026
d2ee90e
opacity UX
diegoimbert Feb 6, 2026
9c14d60
error toasts pickhubscript
diegoimbert Feb 6, 2026
e8d7940
Improve UX
diegoimbert Feb 6, 2026
47edc87
fix undefined error
diegoimbert Feb 6, 2026
2369a43
keyboard nav
diegoimbert Feb 6, 2026
c6f6746
nit batch rerun fixes
diegoimbert Feb 6, 2026
5e2cf43
nit fix scroll / height
diegoimbert Feb 6, 2026
de95f4f
Batch reruns actions + nits
diegoimbert Feb 9, 2026
8570da3
nit
diegoimbert Feb 9, 2026
7a15414
Cancel selected jobs
diegoimbert Feb 9, 2026
1b579df
Cancel / re-run all filtered jobs
diegoimbert Feb 9, 2026
ec3cede
Go to job / flow / script action
diegoimbert Feb 9, 2026
8ea7362
nit
diegoimbert Feb 9, 2026
08a21ad
add batch actions back
diegoimbert Feb 9, 2026
f6975e3
nit
diegoimbert Feb 9, 2026
85dc2c0
nit
diegoimbert Feb 9, 2026
04333cd
bar on splitpane hover
diegoimbert Feb 9, 2026
bbb74b1
nit
diegoimbert Feb 9, 2026
151fc9a
New Timeframe system
diegoimbert Feb 9, 2026
b140526
reset btn
diegoimbert Feb 9, 2026
19eb673
nit fixes
diegoimbert Feb 9, 2026
e84c334
dead code
diegoimbert Feb 9, 2026
63e0f9e
nits
diegoimbert Feb 10, 2026
db05dbb
typecheck
diegoimbert Feb 10, 2026
186ebbf
Merge branch 'main' into di/runs-page-redesign
diegoimbert Feb 10, 2026
b2eb6ac
naming clarity
diegoimbert Feb 10, 2026
3ff5261
Update frontend/src/lib/components/RightClickPopover.svelte
diegoimbert Feb 10, 2026
25f27d1
unnecessary json stringify
diegoimbert Feb 10, 2026
8885dd9
dedup 'the'
diegoimbert Feb 10, 2026
ddabba9
Merge branch 'main' into di/runs-page-redesign
diegoimbert Feb 10, 2026
ba5334d
fix bug with maxTs
diegoimbert Feb 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion frontend/src/lib/components/ConcurrentJobsChart.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,6 @@
} as any)
</script>

<div class="relative max-h-40">
<div class="relative h-44">
<Line {data} {options} />
</div>
6 changes: 3 additions & 3 deletions frontend/src/lib/components/DateTimeInput.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -184,13 +184,13 @@
unifiedSize="md"
wrapperClasses="h-full"
{disabled}
iconOnly
endIcon={{ icon: X }}
on:click={() => {
value = null
dispatch('clear')
}}
>
<X size={14} />
</Button>
></Button>
{/if}
<!-- <div>
<ToggleButtonGroup bind:selected={format} let:item>
Expand Down
50 changes: 50 additions & 0 deletions frontend/src/lib/components/DropdownMenu.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<script lang="ts">
type Item = {
label: string
icon?: any
right?: string
onClick?: () => void
onHover?: (hover: boolean) => void
}
export type Props = {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The icon type is any — consider typing this more specifically (e.g., typeof import('lucide-svelte').Icon or Component) for better type safety and IDE support.

closeCallback?: () => void
items: Item[]
}
let { items, closeCallback }: Props = $props()
</script>

<ul class="bg-surface-tertiary rounded-md border w-56 relative drop-shadow-base">
{#each items as item}
<li class="w-full">
<button
class="px-3 h-9 text-xs cursor-pointer hover:bg-surface-hover font-normal w-full text-left flex items-center gap-2.5"
onclick={() => {
item.onClick?.()
item.onHover?.(false)
closeCallback?.()
}}
onmouseenter={() => item.onHover?.(true)}
onmouseleave={() => item.onHover?.(false)}
>
{#if item.icon}
<item.icon size="16"></item.icon>
{/if}
<span class="flex-1">
{item.label}
</span>
{#if item.right}
<span class="text-xs text-hint">{item.right}</span>
{/if}
</button>
</li>
{/each}
{#if items.length === 0}
<li class="w-full">
<div
class="px-3 h-9 text-xs font-normal w-full text-left flex items-center gap-2.5 text-hint"
>
No actions available
</div>
</li>
{/if}
</ul>
38 changes: 0 additions & 38 deletions frontend/src/lib/components/DropdownSelect.svelte

This file was deleted.

2 changes: 1 addition & 1 deletion frontend/src/lib/components/DropdownV2.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@
variant="subtle"
startIcon={{ icon: EllipsisVertical }}
btnClasses="bg-transparent"
iconOnly
iconOnly={!btnText}
>
{btnText}
</Button>
Expand Down
1 change: 0 additions & 1 deletion frontend/src/lib/components/HistoricInputs.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,6 @@
jobKinds: getJobKinds(runnableType),
syncQueuedRunsCount: false,
refreshRate: 10000,
computeMinAndMax: undefined,
currentWorkspace: $workspaceStore ?? '',
skip: !runnableId
}) satisfies UseJobLoaderArgs
Expand Down
46 changes: 46 additions & 0 deletions frontend/src/lib/components/RightClickPopover.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<script lang="ts">
import { clickOutside } from '$lib/utils'
import { fly } from 'svelte/transition'
import Portal from './Portal.svelte'
import type { Snippet } from 'svelte'

type Props = {
children: Snippet
}

const { children }: Props = $props()

let _isOpen = $state(false)
let mousePos = $state({ x: 0, y: 0 })
export function open(e: MouseEvent) {
e.preventDefault()
_isOpen = true
mousePos = { x: e.clientX, y: e.clientY }
console.log('Opening popover at', mousePos)
}
export function close() {
_isOpen = false
}
export function isOpen() {
return _isOpen
}
</script>

<Portal>
{#if _isOpen}
<div
in:fly={{ x: 0, y: -10, duration: 120 }}
use:clickOutside={{
onClickOutside: (e) => {
_isOpen = false
e.preventDefault()
e.stopPropagation()
Comment on lines +34 to +37
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Calling e.preventDefault() and e.stopPropagation() on click-outside events prevents normal interactions (like clicking buttons elsewhere on the page) when the context menu is open. The user would need to click twice — once to dismiss the menu, once to actually interact. This is a common UX tradeoff but can feel unintuitive. Consider only preventing default if the click target is within the runs table area.

}
}}
class="absolute left-0 top-0 z-[9999] w-fit"
style="transform: translate({mousePos.x + 2}px, {mousePos.y + 2}px)"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The popover is positioned using transform: translate(...) from the top-left corner. If the user right-clicks near the bottom or right edge of the viewport, the menu could overflow off-screen. Consider adding viewport boundary clamping logic (e.g., checking if mousePos.x + menuWidth > window.innerWidth).

>
{@render children()}
</div>
{/if}
</Portal>
27 changes: 1 addition & 26 deletions frontend/src/lib/components/RunChart.svelte
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
<script lang="ts">
import 'chartjs-adapter-date-fns'
import zoomPlugin from 'chartjs-plugin-zoom'
import Tooltip2 from '$lib/components/Tooltip.svelte'
import {
Chart as ChartJS,
Title,
Expand All @@ -17,7 +16,6 @@
} from 'chart.js'
import type { CompletedJob } from '$lib/gen'
import { getDbClockNow } from '$lib/forLater'
import Button from './common/button/Button.svelte'
import { Scatter } from '$lib/components/chartjs-wrappers/chartJs'
import DarkModeObserver from './DarkModeObserver.svelte'

Expand All @@ -28,10 +26,7 @@
maxTimeSet?: string | null
selectedIds?: string[]
canSelect?: boolean
lastFetchWentToEnd?: boolean
totalRowsFetched: number
onPointClicked: (ids: string[]) => void
onLoadExtra: () => void
onZoom: (zoom: { min: Date; max: Date }) => void
}

Expand All @@ -42,10 +37,7 @@
maxTimeSet = null,
selectedIds = $bindable([]),
canSelect = true,
lastFetchWentToEnd = false,
totalRowsFetched,
onPointClicked,
onLoadExtra,
onZoom
}: Props = $props()

Expand Down Expand Up @@ -299,23 +291,6 @@

<DarkModeObserver bind:darkMode />

<!-- {JSON.stringify(minTime)}
{JSON.stringify(maxTime)}

{JSON.stringify(jobs?.map((x) => x.started_at))} -->
<!-- {minTime}
{maxTime} -->
<!-- {JSON.stringify(jobs?.map((x) => x.started_at))} -->
<div class="relative max-h-40">
{#if !lastFetchWentToEnd}
<div class="absolute top-[-28px] left-[220px]">
<Button size="xs" color="transparent" variant="contained" on:click={() => onLoadExtra()}>
Load more
<Tooltip2>
There are more jobs to load but only the first {totalRowsFetched} were fetched
</Tooltip2>
</Button>
</div>
{/if}
<div class="relative h-44">
<Scatter {data} options={scatterOptions} />
</div>
Loading