diff --git a/AppImage/components/host-update-status.tsx b/AppImage/components/host-update-status.tsx index f2a30ff1..20693da3 100644 --- a/AppImage/components/host-update-status.tsx +++ b/AppImage/components/host-update-status.tsx @@ -88,7 +88,7 @@ export function RestartAfterUpdate({ getApiUrl, disabled, label, detail, icon }:
{icon}
{label}{detail}
+ disabled={disabled || pending || accepted} onClick={() => setOpen(true)}>{t("healthStatus.restart.button")} {disabled &&

{t("healthStatus.restart.blocked")}

} {accepted &&

{t("healthStatus.restart.accepted")}

} @@ -103,7 +103,7 @@ export function RestartAfterUpdate({ getApiUrl, disabled, label, detail, icon }: {(error || context?.reason === "unknown") &&

{t("healthStatus.restart.unconfirmed")}

}
-
diff --git a/tests/test_host_update_controls.cjs b/tests/test_host_update_controls.cjs index 665d377b..460c5816 100644 --- a/tests/test_host_update_controls.cjs +++ b/tests/test_host_update_controls.cjs @@ -2,8 +2,14 @@ const assert=require('node:assert/strict'),fs=require('node:fs'),path=require('node:path'),vm=require('node:vm') const app=path.resolve(__dirname,'../AppImage'),ts=require(path.join(app,'node_modules/typescript')) const tree=ts.createSourceFile('controls.tsx',fs.readFileSync(path.join(app,'components/host-update-status.tsx'),'utf8'),ts.ScriptTarget.Latest,true,ts.ScriptKind.TSX) -let callback -function walk(n){if(ts.isVariableDeclaration(n)&&n.name.getText(tree)==='confirm')callback=n.initializer.getText(tree);ts.forEachChild(n,walk)} +let callback,triggerDisabled +function walk(n){ + if(ts.isVariableDeclaration(n)&&n.name.getText(tree)==='confirm')callback=n.initializer.getText(tree) + if(ts.isJsxElement(n)&&n.openingElement.tagName.getText(tree)==='Button'&&n.children.some(c=>c.getText(tree).includes('healthStatus.restart.button'))){ + triggerDisabled=n.openingElement.attributes.properties.find(p=>p.name?.getText(tree)==='disabled').initializer.expression.getText(tree) + } + ts.forEachChild(n,walk) +} walk(tree);assert.ok(callback) function fixture(){ const calls=[],events=[] @@ -16,6 +22,8 @@ function fixture(){ return {scope,calls,events,run} } async function main(){ + assert.ok(triggerDisabled) + assert.equal(vm.runInNewContext(triggerDisabled,{disabled:false,accepted:false,pending:true}),true,'closing confirmation while its request is pending must not enable another request') for(const block of ['disabled','submitted','sending','missing-context','not-allowed']){ const x=fixture() if(block==='sending')x.scope.sending.current=true