{#if loadError}{/if} {#if loading}
Loading…
{:else} {#if driftError}{/if}
{#if driftOpen}
{#if drift && drift.totalDrift > 0} {#each filteredDriftServers.slice(0,driftLimit) as s (s.server)}
{s.files.length} entr{s.files.length === 1 ? 'y' : 'ies'}
{#each s.files as f (f.driftKind + ':' + f.kind + ':' + f.relPath)} [{f.driftKind === 'missing' ? '+' : f.driftKind === 'replace' ? '↻' : '−'} {f.kind}] {f.relPath} {/each}
{/each} {:else if drift?.totalDrift === 0} {:else} {/if}
{/if} {#if flash}
{flash}
{/if}

Active

{active.length}
{#if active.length === 0} {:else}
{#each active as d (d.id)} {@render deployRow(d)} {/each}
{/if}

History

{history.length}
{#if history.length === 0} {:else} {#each historyByDay as [day, rows] (day)}
{day}
{#each rows as d (d.id)} {@render deployRow(d)} {/each}
{/each} {/if}
{/if}
{#snippet deployRow(d: Deployment)}
{d.action} rollout {d.id} {#if d.action === 'promote' || d.action === 'rollback'} {scriptSummary(d)} {/if} {#if d.rolled_back_by} Rolled back {/if}
{#if d.action === 'promote' && !d.rolled_back_by} {/if} {ago(d.started_at)}
{#each d.servers as s (s.server)} {serverTitle(s.server)}{s.players !== null && s.players > 0 ? ` (${s.players}p)` : ''} {/each}
{d.id}
{#each ['done','pending','failed','held','manual'] as state} {@const n = d.servers.filter((s) => s.restart_state === state).length} {#if n > 0} {n} {/if} {/each}
{/snippet}