diff --git a/services/web/app/src/infrastructure/ExpressLocals.mjs b/services/web/app/src/infrastructure/ExpressLocals.mjs index 78ef583125..a48cbc56fc 100644 --- a/services/web/app/src/infrastructure/ExpressLocals.mjs +++ b/services/web/app/src/infrastructure/ExpressLocals.mjs @@ -423,6 +423,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 375ca9f566..91cdf75230 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 Notification from '@/shared/components/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 b7804f8de5..796fe5d369 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, setSettingsShown, 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 b59c2a25f7..90cba4d730 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 = 'start', }: 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') || [] @@ -164,7 +164,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 d4d76901cc..273768b09a 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 @@ -67,7 +67,7 @@ function WelcomeMessageCreateNewProjectDropdown({ useFeatureFlag('import-markdown') && getMeta('ol-ExposedSettings').enablePandocConversions - const { isOverleaf } = getMeta('ol-ExposedSettings') + const { isOverleaf, githubSyncEnabled } = getMeta('ol-ExposedSettings') const handleDropdownItemClick = useCallback( ( @@ -167,7 +167,7 @@ function WelcomeMessageCreateNewProjectDropdown({ )} - {isOverleaf && ( + {(isOverleaf || githubSyncEnabled) && (
  • + (githubSyncEnabled || !path.includes('github-sync')) +) + function LinkingSection() { useBroadcastUser() const { t } = useTranslation() @@ -33,20 +42,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 a1f55f538d..e82b82df7a 100644 --- a/services/web/types/exposed-settings.ts +++ b/services/web/types/exposed-settings.ts @@ -54,5 +54,7 @@ export type ExposedSettings = { wikiEnabled?: boolean templatesEnabled?: boolean linkedInInsightsPartnerId?: string + githubSyncEnabled: boolean + zoteroEnabled: boolean enablePandocConversions: boolean }