diff --git a/web/workspace/src/routes/w/[workspaceId]/settings/repository-access/+page.svelte b/web/workspace/src/routes/w/[workspaceId]/settings/repository-access/+page.svelte
index 56a35c826..74094deba 100644
--- a/web/workspace/src/routes/w/[workspaceId]/settings/repository-access/+page.svelte
+++ b/web/workspace/src/routes/w/[workspaceId]/settings/repository-access/+page.svelte
@@ -186,6 +186,10 @@
if (!isCurrentOperation(operationKey)) throw new StaleRepositoryAccessRequestError();
}
+ function credentialLifecyclePending(credentialId: string): boolean {
+ return isPending(`copy-${credentialId}`) || isPending(`rotate-${credentialId}`) || isPending(`delete-${credentialId}`);
+ }
+
function credentialEditorPending(): boolean {
const credentialRotationPrefix = `${pageEpoch}:rotate-`;
const hostRotationPrefix = `${pageEpoch}:rotate-host-`;
@@ -354,6 +358,7 @@
}
async function copyPublicKey(credential: RepositorySshCredential) {
+ if (credentialLifecyclePending(credential.credential_id)) return;
const operation = startOperation(`copy-${credential.credential_id}`);
if (!operation) return;
publicKeyNotices = { ...publicKeyNotices, [credential.credential_id]: { tone: 'success', text: 'Loading public key…' } };
@@ -414,6 +419,7 @@
}
async function openCredentialRotation(credential: RepositorySshCredential) {
+ if (credentialLifecyclePending(credential.credential_id)) return;
credentialReturnFocus = currentFocus();
credentialForm = null;
credentialFormNotice = null;
@@ -439,6 +445,7 @@
}
async function rotateCredential(credential: RepositorySshCredential) {
+ if (credentialLifecyclePending(credential.credential_id)) return;
rotateErrors = validateCredentialRotation(rotatePrivateKey);
if (Object.keys(rotateErrors).length > 0) {
await focusFirstInvalid(rotationFormElement);
@@ -485,9 +492,8 @@
}
async function deleteCredential(credential: RepositorySshCredential) {
- if (credential.referenced_repositories.length > 0) return;
+ if (credential.referenced_repositories.length > 0 || credentialLifecyclePending(credential.credential_id)) return;
const operationName = `delete-${credential.credential_id}`;
- if (isPending(operationName)) return;
if (!confirm(`Delete SSH credential ${credential.name} (${credential.credential_id})? This cannot be undone.`)) return;
const operation = startOperation(operationName);
if (!operation) return;
@@ -711,7 +717,7 @@
Credential Role Fingerprint Repository application Actions
{credential.credential_id}{credential.public_key_algorithm}{credential.public_key_fingerprint}