fix(result): gate record/save buttons behind RECORD_EXAM_RESULT

Record Result (POST /results) and the detail-modal Save (PUT /results/:id)
had no RequirePermission gate, unlike every other action on this page —
both routes are backend-guarded (RECORD_EXAM_RESULT, or
RECORD_EXAM_RESULT|MODERATE_EXAM_RESULT for the update), the buttons just
never mirrored it client-side.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
mihretue
2026-08-13 17:17:14 +00:00
parent d8b01a2003
commit d98d6a71fe

View File

@@ -314,9 +314,11 @@ export function ResultPage() {
{t('result.review.publish')} {t('result.review.publish')}
</Button> </Button>
</RequirePermission> </RequirePermission>
<Button leftSection={<IconPlus size={15} />} onClick={openPicker} size="sm"> <RequirePermission anyOf={[LICENSE_PERMISSIONS.RECORD_EXAM_RESULT]} hideOnly>
{t('result.record')} <Button leftSection={<IconPlus size={15} />} onClick={openPicker} size="sm">
</Button> {t('result.record')}
</Button>
</RequirePermission>
</Group> </Group>
</Group> </Group>
@@ -504,14 +506,22 @@ export function ResultPage() {
<ModalFooter> <ModalFooter>
<Button variant="default" onClick={handleDetailClose} size="sm">{t('result.close')}</Button> <Button variant="default" onClick={handleDetailClose} size="sm">{t('result.close')}</Button>
<Button <RequirePermission
onClick={handleDetailSave} anyOf={[
size="sm" LICENSE_PERMISSIONS.RECORD_EXAM_RESULT,
loading={detailSaving} LICENSE_PERMISSIONS.MODERATE_EXAM_RESULT,
leftSection={<IconDeviceFloppy size={15} />} ]}
hideOnly
> >
{t('result.save')} <Button
</Button> onClick={handleDetailSave}
size="sm"
loading={detailSaving}
leftSection={<IconDeviceFloppy size={15} />}
>
{t('result.save')}
</Button>
</RequirePermission>
</ModalFooter> </ModalFooter>
</Stack> </Stack>
) : ( ) : (