Add publisher release versions to plugins

This commit is contained in:
2026-09-18 01:16:45 -04:00
parent 166f039ae6
commit a718efc9e7
15 changed files with 167 additions and 29 deletions
+16 -6
View File
@@ -1,5 +1,6 @@
<script lang="ts">
import { onMount, onDestroy } from 'svelte';
import { artifactVersionLabel } from '$lib/artifact-version.js';
import { goto } from '$app/navigation';
import Card from './primitives/Card.svelte';
import Badge from './primitives/Badge.svelte';
@@ -28,6 +29,7 @@
}
interface Version {
id: number; version: number; sha256: string; size: number;
release_version: string | null;
notes: string | null; state: 'untested' | 'tested' | 'test-failed';
uploaded_at: string;
}
@@ -49,6 +51,7 @@
let versionFile = $state<File | null>(null);
let versionNotes = $state('');
let releaseVersion = $state('');
let uploadingVersion = $state(false);
let scopeDialog = $state<HTMLDialogElement | null>(null);
@@ -143,6 +146,7 @@
}
function openUploadModal(): void {
if (runningBetaId !== null) return;
releaseVersion = '';
versionFile = null;
versionNotes = '';
flash = null;
@@ -169,6 +173,7 @@
uploadingVersion = true; flash = null;
const form = new FormData();
form.append('content', versionFile);
if (family === 'plugin') form.append('releaseVersion', releaseVersion.trim());
if (versionNotes.trim()) form.append('notes', versionNotes.trim());
try {
const res = await fetch(`/api/scripts/${id}/versions`, { method: 'POST', body: form });
@@ -302,7 +307,7 @@
<span class="k">Current version</span>
<span class="v mono">
{#if currentVersion}
v{currentVersion.version} · {currentVersion.sha256.slice(0, 8)}
{artifactVersionLabel(currentVersion)} · {currentVersion.sha256.slice(0, 8)}
<Badge variant="online" size="sm">Promoted</Badge>
{:else}
<span class="dim">Never promoted — open a <a href="/betas">beta</a></span>
@@ -313,7 +318,7 @@
<div class="kv">
<span class="k">Latest version</span>
<span class="v mono">
v{latestVersion.version} · {latestVersion.sha256.slice(0, 8)}
{artifactVersionLabel(latestVersion)} · {latestVersion.sha256.slice(0, 8)}
<Badge variant={stateVariant(latestVersion.state)} size="sm">{latestVersion.state}</Badge>
</span>
</div>
@@ -332,7 +337,7 @@
<div class="version-list">
{#each versions as v (v.id)}
<div class="version-row" class:current={a.current_version_id === v.id}>
<span class="v-num">v{v.version}</span>
<span class="v-num">{artifactVersionLabel(v)}</span>
<span class="v-sha">{v.sha256.slice(0, 12)}</span>
<span class="v-size">{v.size} B</span>
<span class="v-notes">{v.notes ?? ''}</span>
@@ -391,8 +396,13 @@
<button type="button" class="close" onclick={cancelUploadModal} aria-label="Close">×</button>
</header>
<Field label="File">
<Input type="file" onchange={pickVersionFile} disabled={uploadingVersion} />
<Input type="file" accept={family === 'plugin' ? '.dll' : undefined} onchange={pickVersionFile} disabled={uploadingVersion} />
</Field>
{#if family === 'plugin'}
<Field label="Release version" hint="Optional. Use the publisher’s version or release tag, such as v3.1.0.">
<Input bind:value={releaseVersion} placeholder="v3.1.0" disabled={uploadingVersion} />
</Field>
{/if}
<Field label="Notes" hint="Optional. What changed since the previous version.">
<Input bind:value={versionNotes} placeholder="what changed" disabled={uploadingVersion} />
</Field>
@@ -473,7 +483,7 @@
.version-list { display: flex; flex-direction: column; gap: var(--space-1); }
.version-row {
display: grid;
grid-template-columns: 60px 130px 80px 1fr 220px auto;
grid-template-columns: minmax(100px, 1fr) 130px 80px 1fr 220px auto;
gap: var(--space-3);
align-items: center;
padding: var(--space-2) var(--space-3);
@@ -487,7 +497,7 @@
border-color: rgba(124, 212, 255, 0.35);
background: rgba(124, 212, 255, 0.04);
}
.v-num { color: var(--text-primary); font-weight: var(--weight-semibold); }
.v-num { color: var(--text-primary); font-weight: var(--weight-semibold); overflow-wrap: anywhere; }
.v-sha, .v-size, .v-when { color: var(--text-tertiary); font-variant-numeric: tabular-nums; }
.v-notes { color: var(--text-secondary); font-family: var(--font-body); font-size: var(--text-sm); }