Add Super Viewer read-only administrator role
CI / checks (push) Successful in 5m40s

This commit is contained in:
2026-10-11 23:30:40 -04:00
parent 253d47300c
commit 4ea291d305
48 changed files with 1684 additions and 933 deletions
+27 -21
View File
@@ -4,6 +4,7 @@
import { timeFormat } from '$ui/stores/time-zone.js';
import { onMount } from 'svelte';
import { page } from '$app/stores';
import { canOperate } from '$lib/auth.js';
import { artifactVersionLabel } from '$lib/artifact-version.js';
import type { BetaTestView } from '$lib/beta-plan.js';
import type { BetaPromotionPreview } from '$lib/beta-promotion.js';
@@ -92,7 +93,9 @@
let updateOpen = $state(false),
updateRevision = $state(1),
updateFiles = $state<BetaFile[]>([]);
const editable = $derived(canOperate($page.data?.user?.role));
function openUpdate() {
if (!editable) return;
updateRevision = revision.revision;
updateFiles = [...scripts];
updateOpen = true;
@@ -157,6 +160,7 @@
);
function testAction(action: string) {
if (!editable) return;
moreActionsOpen = false;
void testProgress?.action(action);
}
@@ -260,7 +264,7 @@
}
}
async function promote() {
if (!preview) return;
if (!editable || !preview) return;
acting = 'promote';
reviewError = '';
flash = '';
@@ -288,6 +292,7 @@
}
}
async function rollback() {
if (!editable) return;
const reject = beta?.state === 'ready-promote';
const restarts =
test?.plan.rollbackRestart === 'manual'
@@ -318,6 +323,7 @@
}
}
async function retry(server: string) {
if (!editable) return;
acting = `retry:${server}`;
flash = '';
try {
@@ -392,7 +398,7 @@
$page.url
)}>View rollback campaign</Button
>
{:else if closed}<Button
{:else if closed && editable}<Button
variant="primary"
href={contextHref(`/betas/new?reuse=${id}`, $page.url)}
>Reuse files and test plan</Button
@@ -410,12 +416,12 @@
? 'failures'
: 'issues'}</Button
>
{:else if presentation.key === 'paused' && !testExpired}<Button
{:else if editable && presentation.key === 'paused' && !testExpired}<Button
variant="primary"
onclick={() => testAction('resume')}
disabled={busy}>Resume testing</Button
>{/if}
{#if !closed || promotion || rollbackCampaign}<details
{#if editable && (!closed || promotion || rollbackCampaign)}<details
class="more-actions"
bind:open={moreActionsOpen}
>
@@ -583,7 +589,7 @@
$page.url
)}>View provisioning</a
>{/if}
{#if server.stage === 'failed' && !server.server_deleted_at && !closed}<Button
{#if editable && server.stage === 'failed' && !server.server_deleted_at && !closed}<Button
size="sm"
onclick={() => retry(server.server)}
disabled={busy}
@@ -694,15 +700,15 @@
</div>
{/if}
<BetaRevisionDialog
bind:open={updateOpen}
betaId={id}
revision={updateRevision}
files={updateFiles}
servers={servers.map((server) => server.server)}
timeoutHours={test?.plan.timeoutHours}
onUpdate={load}
/>
{#if editable}<BetaRevisionDialog
bind:open={updateOpen}
betaId={id}
revision={updateRevision}
files={updateFiles}
servers={servers.map((server) => server.server)}
timeoutHours={test?.plan.timeoutHours}
onUpdate={load}
/>{/if}
<Dialog
bind:open={reviewOpen}
@@ -763,13 +769,13 @@
>Cancel</Button
>{#if preview}<Button onclick={reviewPromotion} disabled={acting !== null}
>Refresh review</Button
><Button
variant="primary"
onclick={promote}
loading={acting === 'promote'}
disabled={acting !== null || !!preview.blockers.length}
>Promote to {preview.servers.length} servers</Button
>{/if}{/snippet}
>{#if editable}<Button
variant="primary"
onclick={promote}
loading={acting === 'promote'}
disabled={acting !== null || !!preview.blockers.length}
>Promote to {preview.servers.length} servers</Button
>{/if}{/if}{/snippet}
</Dialog>
<style>