| undefined
+ server.use(
+ http.post(`${LIST}/st1/enable`, async ({ request }) => {
+ const payload = await request.json()
+ if (!isRecord(payload)) {
+ return HttpResponse.json({ error: 'expected object' }, { status: 400 })
+ }
+ approval = payload
+ return HttpResponse.json({ resource: task({ enabled: true }) })
+ }),
+ )
+ const user = userEvent.setup()
+ renderPage()
+ await screen.findByRole('article', { name: '每日同步' })
+ const enable = screen.getByRole('button', { name: '重新同意并启用' })
+ expect(enable).toBeDisabled()
+ await user.click(screen.getByLabelText('同意无人值守授权'))
+ await user.click(enable)
+ await waitFor(() =>
+ expect(approval).toEqual({ approval: { policy: 'full_auto_in_cloud_workspace' } }),
+ )
+ })
+
+ it('clears a stale consent box after enable and revoke so re-consent is explicit', async () => {
+ let current: ScheduledTask = task({
+ enabled: false,
+ unattendedPolicy: 'full_auto_in_cloud_workspace',
+ })
+ server.use(
+ http.get(LIST, () => HttpResponse.json({ tasks: [current], acceptanceEnabled: false })),
+ http.post(`${LIST}/st1/enable`, () => {
+ current = task({ enabled: true, unattendedPolicy: 'full_auto_in_cloud_workspace' })
+ return HttpResponse.json({ resource: current })
+ }),
+ http.post(`${LIST}/st1/revoke-consent`, () => {
+ current = task({ enabled: false })
+ return HttpResponse.json({ resource: current })
+ }),
+ )
+ const userEventSetup = userEvent.setup()
+ renderPage()
+
+ await screen.findByRole('article', { name: '每日同步' })
+ await userEventSetup.click(screen.getByLabelText('同意无人值守授权'))
+ await userEventSetup.click(screen.getByRole('button', { name: '重新同意并启用' }))
+ await waitFor(() => expect(screen.getByRole('switch')).toBeChecked())
+
+ await userEventSetup.click(screen.getByRole('button', { name: '撤销授权' }))
+ await userEventSetup.click(screen.getByRole('button', { name: '确认撤销授权' }))
+ const fresh = await screen.findByLabelText('同意无人值守授权')
+ expect(fresh).not.toBeChecked()
+ expect(screen.getByRole('button', { name: '重新同意并启用' })).toBeDisabled()
+
+ await userEventSetup.click(fresh)
+ expect(screen.getByRole('button', { name: '重新同意并启用' })).toBeEnabled()
+ })
})
diff --git a/frontend/src/features/scheduled-tasks/scheduled-tasks-page.tsx b/frontend/src/features/scheduled-tasks/scheduled-tasks-page.tsx
index 1e844093..0b08e14f 100644
--- a/frontend/src/features/scheduled-tasks/scheduled-tasks-page.tsx
+++ b/frontend/src/features/scheduled-tasks/scheduled-tasks-page.tsx
@@ -12,7 +12,7 @@ import {
useSetScheduledTaskEnabled,
type ScheduledTask,
} from './api'
-import { ScheduledTaskForm } from './scheduled-task-form'
+import { ConsentAgreement, ScheduledTaskForm } from './scheduled-task-form'
import { ScheduledTaskHistory } from './scheduled-task-history'
function ConfirmButton({
@@ -54,6 +54,7 @@ function ScheduledTaskCard({
const remove = useDeleteScheduledTask(tid)
const revoke = useRevokeScheduledTaskConsent(tid)
const toggle = useSetScheduledTaskEnabled(tid, task)
+ const [consented, setConsented] = useState(false)
const failure = toggle.error ?? remove.error ?? revoke.error
return (
@@ -70,16 +71,35 @@ function ScheduledTaskCard({
{task.disabledReason && (
停用原因:{task.disabledReason}
)}
-
- 启用
- {
- if (!next) toggle.mutate(false)
- }}
- />
-
+ {task.enabled ? (
+
+ 启用
+ {
+ if (!next) toggle.mutate({ enabled: false }, { onSuccess: () => setConsented(false) })
+ }}
+ />
+
+ ) : (
+
+
+
+
+ )}