diff --git a/lib/Controller/CallController.php b/lib/Controller/CallController.php index d15307930822..5fb7156272f3 100644 --- a/lib/Controller/CallController.php +++ b/lib/Controller/CallController.php @@ -127,6 +127,7 @@ public function getPeersForCall(): DataResponse { */ #[PublicPage] #[RequireModeratorParticipant] + #[Http\Attribute\NoCSRFRequired] public function downloadParticipantsForCall(string $format = 'csv'): DataDownloadResponse|Response { $timeout = $this->timeFactory->getTime() - Session::SESSION_TIMEOUT; $participants = $this->participantService->getParticipantsInCall($this->room, $timeout); diff --git a/src/components/TopBar/TopBarMenu.vue b/src/components/TopBar/TopBarMenu.vue index 187913701820..a5000e480b4b 100644 --- a/src/components/TopBar/TopBarMenu.vue +++ b/src/components/TopBar/TopBarMenu.vue @@ -139,6 +139,14 @@ {{ t('spreed', 'Conversation settings') }} + + + {{ t('spreed', 'Download attendance list') }} + @@ -147,6 +155,7 @@ import Cog from 'vue-material-design-icons/Cog.vue' import DotsCircle from 'vue-material-design-icons/DotsCircle.vue' import DotsHorizontal from 'vue-material-design-icons/DotsHorizontal.vue' +import IconDownload from 'vue-material-design-icons/Download.vue' import File from 'vue-material-design-icons/File.vue' import Fullscreen from 'vue-material-design-icons/Fullscreen.vue' import FullscreenExit from 'vue-material-design-icons/FullscreenExit.vue' @@ -161,6 +170,7 @@ import GridView from 'vue-material-design-icons/ViewGrid.vue' import { showWarning } from '@nextcloud/dialogs' import { emit } from '@nextcloud/event-bus' import { t } from '@nextcloud/l10n' +import { generateOcsUrl } from '@nextcloud/router' import NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton.js' import NcActionLink from '@nextcloud/vue/dist/Components/NcActionLink.js' @@ -208,6 +218,7 @@ export default { FullscreenExit, GridView, HandBackLeft, + IconDownload, MicrophoneOff, PromotedView, RecordCircle, @@ -369,6 +380,10 @@ export default { showCallLayoutSwitch() { return !this.callViewStore.isEmptyCallView }, + + downloadCallParticipantsLink() { + return generateOcsUrl('apps/spreed/api/v4/call/{token}/download', { token: this.token }) + }, }, watch: {