(frontend) add configurable documentation link

Expose a room options Documentation link via FRONTEND_DOCUMENTATION_URL
so deployers can set or hide it.
This commit is contained in:
Arnaud Robin
2026-07-24 18:02:26 +02:00
committed by aleb_the_flash
parent a5b79afde1
commit 0c0b2f2616
11 changed files with 40 additions and 4 deletions
+1
View File
@@ -11,6 +11,7 @@ and this project adheres to
### Added ### Added
- ✨(summary) report exception type in failure analytics - ✨(summary) report exception type in failure analytics
- ✨(frontend) add configurable documentation menu item
## Fixed ## Fixed
+1
View File
@@ -344,6 +344,7 @@ These are the environmental options available on meet backend.
| FRONTEND_SILENCE_LIVEKIT_DEBUG | Silence LiveKit debug logs | false | | FRONTEND_SILENCE_LIVEKIT_DEBUG | Silence LiveKit debug logs | false |
| FRONTEND_IS_SILENT_LOGIN_ENABLED | Enable silent login feature | true | | FRONTEND_IS_SILENT_LOGIN_ENABLED | Enable silent login feature | true |
| FRONTEND_FEEDBACK | Frontend feedback configuration | {} | | FRONTEND_FEEDBACK | Frontend feedback configuration | {} |
| FRONTEND_DOCUMENTATION_URL | URL of the documentation opened from the room options menu. If unset, the documentation menu item is hidden | |
| FRONTEND_USE_FRENCH_GOV_FOOTER | Show the French government footer in the homepage | false | | FRONTEND_USE_FRENCH_GOV_FOOTER | Show the French government footer in the homepage | false |
| FRONTEND_USE_PROCONNECT_BUTTON | Show a "Login with ProConnect" button in the homepage instead of a "Login" button | false | | FRONTEND_USE_PROCONNECT_BUTTON | Show a "Login with ProConnect" button in the homepage instead of a "Login" button | false |
| DJANGO_EMAIL_BACKEND | Email backend library | django.core.mail.backends.smtp.EmailBackend | | DJANGO_EMAIL_BACKEND | Email backend library | django.core.mail.backends.smtp.EmailBackend |
+3
View File
@@ -398,6 +398,9 @@ class Base(Configuration):
"feedback": values.DictValue( "feedback": values.DictValue(
{}, environ_name="FRONTEND_FEEDBACK", environ_prefix=None {}, environ_name="FRONTEND_FEEDBACK", environ_prefix=None
), ),
"documentation_url": values.Value(
None, environ_name="FRONTEND_DOCUMENTATION_URL", environ_prefix=None
),
"external_home_url": values.Value( "external_home_url": values.Value(
None, environ_name="FRONTEND_EXTERNAL_HOME_URL", environ_prefix=None None, environ_name="FRONTEND_EXTERNAL_HOME_URL", environ_prefix=None
), ),
+1
View File
@@ -20,6 +20,7 @@ export interface ApiConfig {
feedback: { feedback: {
url: string url: string
} }
documentation_url?: string
external_home_url?: string external_home_url?: string
silence_livekit_debug_logs?: boolean silence_livekit_debug_logs?: boolean
is_silent_login_enabled?: boolean is_silent_login_enabled?: boolean
@@ -0,0 +1,23 @@
import { RiBookOpenLine } from '@remixicon/react'
import { MenuItem } from 'react-aria-components'
import { useTranslation } from 'react-i18next'
import { menuRecipe } from '@/primitives/menuRecipe'
import { useConfig } from '@/api/useConfig'
export const DocumentationMenuItem = () => {
const { t } = useTranslation('rooms', { keyPrefix: 'options.items' })
const { data } = useConfig()
if (!data?.documentation_url) return
return (
<MenuItem
href={data.documentation_url}
target="_blank"
className={menuRecipe({ icon: true, variant: 'dark' }).item}
>
<RiBookOpenLine size={20} />
{t('documentation')}
</MenuItem>
)
}
@@ -5,6 +5,7 @@ import { SettingsMenuItem } from './SettingsMenuItem'
import { FeedbackMenuItem } from './FeedbackMenuItem' import { FeedbackMenuItem } from './FeedbackMenuItem'
import { EffectsMenuItem } from './EffectsMenuItem' import { EffectsMenuItem } from './EffectsMenuItem'
import { SupportMenuItem } from './SupportMenuItem' import { SupportMenuItem } from './SupportMenuItem'
import { DocumentationMenuItem } from './DocumentationMenuItem'
import { TranscriptMenuItem } from './TranscriptMenuItem' import { TranscriptMenuItem } from './TranscriptMenuItem'
import { ScreenRecordingMenuItem } from './ScreenRecordingMenuItem' import { ScreenRecordingMenuItem } from './ScreenRecordingMenuItem'
import { PictureInPictureMenuItem } from '@/features/rooms/livekit/components/controls/Options/PictureInPictureMenuItem' import { PictureInPictureMenuItem } from '@/features/rooms/livekit/components/controls/Options/PictureInPictureMenuItem'
@@ -28,6 +29,7 @@ export const OptionsMenuItems = () => {
<Separator /> <Separator />
<MenuSection> <MenuSection>
<SupportMenuItem /> <SupportMenuItem />
<DocumentationMenuItem />
<FeedbackMenuItem /> <FeedbackMenuItem />
<SettingsMenuItem /> <SettingsMenuItem />
</MenuSection> </MenuSection>
+2 -1
View File
@@ -260,7 +260,8 @@
"enter": "Vollbild", "enter": "Vollbild",
"exit": "Vollbildmodus verlassen" "exit": "Vollbildmodus verlassen"
}, },
"support": "Support kontaktieren" "support": "Support kontaktieren",
"documentation": "Dokumentation"
} }
}, },
"effects": { "effects": {
+2 -1
View File
@@ -260,7 +260,8 @@
"enter": "Fullscreen", "enter": "Fullscreen",
"exit": "Exit fullscreen mode" "exit": "Exit fullscreen mode"
}, },
"support": "Contact support" "support": "Contact support",
"documentation": "Documentation"
} }
}, },
"effects": { "effects": {
+2 -1
View File
@@ -260,7 +260,8 @@
"enter": "Plein écran", "enter": "Plein écran",
"exit": "Quitter le mode plein écran" "exit": "Quitter le mode plein écran"
}, },
"support": "Contacter l'aide" "support": "Contacter l'aide",
"documentation": "Documentation"
} }
}, },
"effects": { "effects": {
+2 -1
View File
@@ -260,7 +260,8 @@
"enter": "Volledig scherm", "enter": "Volledig scherm",
"exit": "Stop volledig scherm stand" "exit": "Stop volledig scherm stand"
}, },
"support": "Contact ondersteuning" "support": "Contact ondersteuning",
"documentation": "Documentatie"
} }
}, },
"effects": { "effects": {
+1
View File
@@ -154,6 +154,7 @@ backend:
FRONTEND_SILENCE_LIVEKIT_DEBUG: False FRONTEND_SILENCE_LIVEKIT_DEBUG: False
FRONTEND_SUPPORT: "{'id': '58ea6697-8eba-4492-bc59-ad6562585041', 'help_article_transcript': 'https://lasuite.crisp.help/fr/article/visio-transcript-1sjq43x', 'help_article_recording': 'https://lasuite.crisp.help/fr/article/visio-enregistrement-wgc8o0', 'help_article_more_tools': 'https://lasuite.crisp.help/fr/article/visio-tools-bvxj23'}" FRONTEND_SUPPORT: "{'id': '58ea6697-8eba-4492-bc59-ad6562585041', 'help_article_transcript': 'https://lasuite.crisp.help/fr/article/visio-transcript-1sjq43x', 'help_article_recording': 'https://lasuite.crisp.help/fr/article/visio-enregistrement-wgc8o0', 'help_article_more_tools': 'https://lasuite.crisp.help/fr/article/visio-tools-bvxj23'}"
FRONTEND_FEEDBACK: "{'url': 'https://grist.numerique.gouv.fr/o/docs/cbMv4G7pLY3Z/USER-RESEARCH-or-LA-SUITE/f/26'}" FRONTEND_FEEDBACK: "{'url': 'https://grist.numerique.gouv.fr/o/docs/cbMv4G7pLY3Z/USER-RESEARCH-or-LA-SUITE/f/26'}"
FRONTEND_DOCUMENTATION_URL: "https://docs.numerique.gouv.fr/docs/7c5bd65d-3c21-486f-bce1-26e0a921d642/"
FRONTEND_MANIFEST_LINK: "https://docs.numerique.gouv.fr/docs/1ef86abf-f7e0-46ce-b6c7-8be8b8af4c3d/" FRONTEND_MANIFEST_LINK: "https://docs.numerique.gouv.fr/docs/1ef86abf-f7e0-46ce-b6c7-8be8b8af4c3d/"
FRONTEND_IDLE_DISCONNECT_WARNING_DELAY: 9000 FRONTEND_IDLE_DISCONNECT_WARNING_DELAY: 9000
FRONTEND_TRANSCRIPTION_DESTINATION: "https://docs.numerique.gouv.fr" FRONTEND_TRANSCRIPTION_DESTINATION: "https://docs.numerique.gouv.fr"