From 661bbf1de1008b81b0c54c189215da7d4c205f10 Mon Sep 17 00:00:00 2001 From: yu-i-i Date: Tue, 14 Jul 2026 19:01:13 +0200 Subject: [PATCH] Fix: hide Git Bridge, GitHub Sync and Zotero UI elements when the corresponding feature is disabled --- .../app/src/infrastructure/ExpressLocals.mjs | 2 ++ .../file-tree-modal-create-file-body.tsx | 7 ++++++- .../features/ide-react/components/rail/rail.tsx | 6 ++++-- .../integrations-panel/integrations-panel.tsx | 10 +++++++++- .../components/new-project-button.tsx | 4 ++-- ...come-message-create-new-project-dropdown.tsx | 4 ++-- .../settings/components/linking-section.tsx | 17 +++++++++++++---- services/web/types/exposed-settings.ts | 2 ++ 8 files changed, 40 insertions(+), 12 deletions(-) diff --git a/services/web/app/src/infrastructure/ExpressLocals.mjs b/services/web/app/src/infrastructure/ExpressLocals.mjs index ca8135d89e..de214c9b3e 100644 --- a/services/web/app/src/infrastructure/ExpressLocals.mjs +++ b/services/web/app/src/infrastructure/ExpressLocals.mjs @@ -417,6 +417,8 @@ export default async function (webRouter, privateApiRouter, publicApiRouter) { cioWriteKey: Settings.analytics?.cio?.writeKey, cioSiteId: Settings.analytics?.cio?.siteId, linkedInInsightsPartnerId: Settings.analytics?.linkedIn?.partnerId, + githubSyncEnabled: !!Settings.githubSync?.clientID && !!Settings.githubSync?.clientSecret, + zoteroEnabled: !!Settings.zotero?.clientKey && !!Settings.zotero?.clientSecret, enablePandocConversions: Settings.enablePandocConversions, mixpanelLabsToken: Settings.labs?.enable && Settings.analytics?.mixpanel?.labsToken, diff --git a/services/web/frontend/js/features/file-tree/components/file-tree-create/file-tree-modal-create-file-body.tsx b/services/web/frontend/js/features/file-tree/components/file-tree-create/file-tree-modal-create-file-body.tsx index 42cb64ce45..66e36182cd 100644 --- a/services/web/frontend/js/features/file-tree/components/file-tree-create/file-tree-modal-create-file-body.tsx +++ b/services/web/frontend/js/features/file-tree/components/file-tree-create/file-tree-modal-create-file-body.tsx @@ -13,11 +13,16 @@ import { FullSizeLoadingSpinner } from '@/shared/components/loading-spinner' import getMeta from '@/utils/meta' import OLNotification from '@/shared/components/ol/ol-notification' -const createFileModeModules = importOverleafModules('createFileModes') as { +const allCreateFileModeModules = importOverleafModules('createFileModes') as { import: { CreateFilePane: ElementType; CreateFileMode: ElementType } path: string }[] +const createFileModeModules = allCreateFileModeModules.filter( + ({ path }) => + (getMeta('ol-ExposedSettings').zoteroEnabled || !path.includes('zotero-create-file')) +) + const FileTreeUploadDoc = lazy(() => import('./modes/file-tree-upload-doc')) export default function FileTreeModalCreateFileBody() { diff --git a/services/web/frontend/js/features/ide-react/components/rail/rail.tsx b/services/web/frontend/js/features/ide-react/components/rail/rail.tsx index 1ce173c497..2ea5a65d02 100644 --- a/services/web/frontend/js/features/ide-react/components/rail/rail.tsx +++ b/services/web/frontend/js/features/ide-react/components/rail/rail.tsx @@ -71,7 +71,7 @@ export const RailLayout = () => { const { features } = useProjectContext() const { isRestrictedTokenMember } = useEditorContext() const gitBridgeEnabled = getMeta('ol-gitBridgeEnabled') - const { isOverleaf } = getMeta('ol-ExposedSettings') + const { isOverleaf, githubSyncEnabled, zoteroEnabled } = getMeta('ol-ExposedSettings') const { view, setLeftMenuShown, focusMode } = useLayoutContext() @@ -119,7 +119,7 @@ export const RailLayout = () => { icon: 'integration_instructions', title: t('integrations'), component: , - hide: !isOverleaf && !gitBridgeEnabled, + hide: !isOverleaf && !gitBridgeEnabled && !githubSyncEnabled && !zoteroEnabled, }, { key: 'review-panel', @@ -148,6 +148,8 @@ export const RailLayout = () => { isRestrictedTokenMember, isOverleaf, gitBridgeEnabled, + githubSyncEnabled, + zoteroEnabled, ] ) diff --git a/services/web/frontend/js/features/integrations-panel/integrations-panel.tsx b/services/web/frontend/js/features/integrations-panel/integrations-panel.tsx index e4d8dc153e..c931dd79b8 100644 --- a/services/web/frontend/js/features/integrations-panel/integrations-panel.tsx +++ b/services/web/frontend/js/features/integrations-panel/integrations-panel.tsx @@ -2,11 +2,19 @@ import { ElementType } from 'react' import importOverleafModules from '../../../macros/import-overleaf-module.macro' import { useTranslation } from 'react-i18next' import RailPanelHeader from '@/features/ide-react/components/rail/rail-panel-header' +import getMeta from '../../utils/meta' -const integrationPanelComponents = importOverleafModules( +const allIntegrationPanelComponents = importOverleafModules( 'integrationPanelComponents' ) as { import: { default: ElementType }; path: string }[] +const integrationPanelComponents = allIntegrationPanelComponents.filter( + ({ path }) => + (getMeta('ol-gitBridgeEnabled') || !path.includes('git-bridge')) && + (getMeta('ol-ExposedSettings').githubSyncEnabled || !path.includes('github-sync')) && + (getMeta('ol-ExposedSettings').zoteroEnabled || !path.includes('zotero')) +) + export default function IntegrationsPanel() { const { t } = useTranslation() diff --git a/services/web/frontend/js/features/project-list/components/new-project-button.tsx b/services/web/frontend/js/features/project-list/components/new-project-button.tsx index 2fc07f17b7..1ee6786e24 100644 --- a/services/web/frontend/js/features/project-list/components/new-project-button.tsx +++ b/services/web/frontend/js/features/project-list/components/new-project-button.tsx @@ -58,7 +58,7 @@ function NewProjectButton({ align, }: NewProjectButtonProps) { const { t } = useTranslation() - const { templateLinks } = getMeta('ol-ExposedSettings') + const { templateLinks, githubSyncEnabled } = getMeta('ol-ExposedSettings') const [modal, setModal] = useState>(null) const portalTemplates = getMeta('ol-portalTemplates') || [] @@ -166,7 +166,7 @@ function NewProjectButton({ [sendProjectListMB, sendTrackingEvent] ) - const [importProjectFromGithubMenu] = importOverleafModules( + const [importProjectFromGithubMenu] = !githubSyncEnabled ? [] : importOverleafModules( 'importProjectFromGithubMenu' ) diff --git a/services/web/frontend/js/features/project-list/components/welcome-message-new/welcome-message-create-new-project-dropdown.tsx b/services/web/frontend/js/features/project-list/components/welcome-message-new/welcome-message-create-new-project-dropdown.tsx index 7c3b0e9573..08ad1f630e 100644 --- a/services/web/frontend/js/features/project-list/components/welcome-message-new/welcome-message-create-new-project-dropdown.tsx +++ b/services/web/frontend/js/features/project-list/components/welcome-message-new/welcome-message-create-new-project-dropdown.tsx @@ -68,7 +68,7 @@ function WelcomeMessageCreateNewProjectDropdown({ useFeatureFlag('import-markdown') && getMeta('ol-ExposedSettings').enablePandocConversions - const { isOverleaf } = getMeta('ol-ExposedSettings') + const { isOverleaf, githubSyncEnabled } = getMeta('ol-ExposedSettings') const handleDropdownItemClick = useCallback( ( @@ -170,7 +170,7 @@ function WelcomeMessageCreateNewProjectDropdown({ )} - {isOverleaf && ( + {(isOverleaf || githubSyncEnabled) && (
  • + (githubSyncEnabled || !path.includes('github-sync')) +) + function LinkingSection() { useBroadcastUser() const { t } = useTranslation() @@ -29,20 +38,20 @@ function LinkingSection() { const integrationLinkingWidgets = getMeta('ol-hideLinkingWidgets') ? [] : availableIntegrationLinkingWidgets - const referenceLinkingWidgets = getMeta('ol-hideLinkingWidgets') + const referenceLinkingWidgets = getMeta('ol-hideLinkingWidgets') || !zoteroEnabled ? [] : availableReferenceLinkingWidgets const langFeedbackLinkingWidgets = getMeta('ol-hideLinkingWidgets') ? [] : availableLangFeedbackLinkingWidgets - const oauth2ServerComponents = importOverleafModules('oauth2Server') as { + const oauth2ServerComponents = !gitBridgeEnabled ? [] : importOverleafModules('oauth2Server') as { import: { default: ElementType } path: string }[] const renderSyncSection = - getMeta('ol-isSaas') || getMeta('ol-gitBridgeEnabled') + getMeta('ol-isSaas') || gitBridgeEnabled || githubSyncEnabled const allIntegrationLinkingWidgets = integrationLinkingWidgets.concat( oauth2ServerComponents diff --git a/services/web/types/exposed-settings.ts b/services/web/types/exposed-settings.ts index e8f939bfc9..0bea6e641a 100644 --- a/services/web/types/exposed-settings.ts +++ b/services/web/types/exposed-settings.ts @@ -52,5 +52,7 @@ export type ExposedSettings = { wikiEnabled?: boolean templatesEnabled?: boolean linkedInInsightsPartnerId?: string + githubSyncEnabled: boolean + zoteroEnabled: boolean enablePandocConversions: boolean }