Files
windmill/frontend/src/lib/components/runs/RunsQueue.svelte
T
Guilhem 484fdfa2bc fix(frontend): update workers page ui (#7264)
* Improve workers page

* Update group config drawer

* improve dirty workergroup config

* Make layout reactive

* fix section animation

* prevent opening dropdown while clicking New group config

* migrate workers page to svelte 5

* Open drawer upon adding a worker group

* nit critical alert table

* improve queue metrics drawer

* improve agent worker drawer

* harmonize copy icon

* improve agent worker doc

* improve layout

* Improve autoscaling event list

* Improve tags managment

* Remove default tags

* fix npm check

* Add info for agent workers

* improve agent worker jwt token creation

* Improve token display

* nit

* improve tag display

* create EE component

* nit

* harmonize tag overflow

* handle permission better

* improve env var presets

* handle permission for config

* nit alerts

* nit

* Improve custom tag creation in tag select

* optimistic tag addition

* nit

* nit

* fix typo

* improve workers table

* Group config tags

* show mismatch

* fix typo

* optimistic update when adding tag

* do not allow to create tag when picking a tag to watch in alerts
2025-12-04 22:09:25 +00:00

131 lines
3.5 KiB
Svelte

<script lang="ts">
import type { Tweened } from 'svelte/motion'
import { Button } from '../common'
import { Bot, Hourglass, ListFilterPlus, X } from 'lucide-svelte'
import RunOption from './RunOption.svelte'
import { Popover } from '../meltComponents'
interface Props {
queue_count?: Tweened<number> | undefined
suspended_count?: Tweened<number> | undefined
success: string | undefined
small?: boolean
onJobsWaiting?: () => void
onJobsSuspended?: () => void
}
let {
queue_count = undefined,
suspended_count = undefined,
success,
small = false,
onJobsWaiting,
onJobsSuspended
}: Props = $props()
</script>
<div class="flex flex-row gap-4 items-center">
{#if small}
<Popover contentClasses="p-4" openOnHover debounceDelay={100}>
{#snippet trigger()}
<div class="relative">
<Bot size={16} />
{#if queue_count && ($queue_count ?? 0) > 0}
<div
class="absolute top-0 right-0 translate-x-1/2 -translate-y-1/2 bg-yellow-500 rounded-full text-white text-2xs h-4 min-w-4 px-1"
>
{queue_count ? ($queue_count ?? 0).toFixed(0) : '...'}
</div>
{/if}
</div>
{/snippet}
{#snippet content()}
{@render queuedContent()}
{/snippet}
</Popover>
{:else}
{@render queuedContent()}
{/if}
{#if small}
<Popover
contentClasses="p-4"
openOnHover
debounceDelay={100}
disablePopup={!suspended_count || ($suspended_count ?? 0) <= 0}
>
{#snippet trigger()}
<div class="relative">
<Hourglass size={16} />
<div
class="absolute top-0 right-0 translate-x-1/2 -translate-y-1/2 bg-surface-secondary-inverse rounded-full text-primary-inverse text-2xs h-4 min-w-4 px-1"
>
{suspended_count ? ($suspended_count ?? 0).toFixed(0) : '...'}
</div>
</div>
{/snippet}
{#snippet content()}
{@render suspendedContent()}
{/snippet}
</Popover>
{:else}
{@render suspendedContent()}
{/if}
</div>
{#snippet queuedContent()}
<RunOption label="Waiting for workers">
{#snippet tooltip()}
Jobs waiting for a worker being available to be executed
{/snippet}
<button
class={queue_count && ($queue_count ?? 0) > 0
? 'bg-yellow-500 text-white rounded-full min-w-6 h-6 flex center-center'
: ''}
onclick={() => onJobsWaiting?.()}
>
{queue_count ? ($queue_count ?? 0).toFixed(0) : '...'}
</button>
<div class="truncate text-2xs !text-secondary mt-0.5">
<Button variant="subtle" unifiedSize="md" on:click={() => onJobsWaiting?.()}>
{#if success == 'waiting'}
<div class="flex flex-row items-center gap-1">
Reset filter
<X size={12} />
</div>
{:else}
<ListFilterPlus size={14} />
{/if}
</Button>
</div>
</RunOption>
{/snippet}
{#snippet suspendedContent()}
{#if suspended_count && ($suspended_count ?? 0) > 0}
<RunOption label="Suspended">
{#snippet tooltip()}
Jobs waiting for an event or approval before being resumed
{/snippet}
<div
class={suspended_count && ($suspended_count ?? 0) > 0
? 'bg-surface-secondary-inverse text-primary-inverse rounded-full min-w-6 h-6 flex center-center'
: ''}>{suspended_count ? ($suspended_count ?? 0).toFixed(0) : '...'}</div
>
<div class="truncate text-2xs !text-secondary">
<Button unifiedSize="md" variant="subtle" on:click={() => onJobsSuspended?.()}>
{#if success == 'suspended'}
<div class="flex flex-row items-center gap-1">
Reset filter
<X size={12} />
</div>
{:else}
<ListFilterPlus size={14} />
{/if}
</Button>
</div>
</RunOption>
{/if}
{/snippet}