From efe7cf0064a124f9abe62d35246b298c3481089a Mon Sep 17 00:00:00 2001 From: Mathias Jakobsen Date: Thu, 11 Dec 2025 10:00:14 +0000 Subject: [PATCH] Merge pull request #30237 from overleaf/ae-workbench-popover Add a popover to the AI assistant rail button GitOrigin-RevId: 5bc141ba10ef0bc798ab79a847d73804d60353d6 --- .../Features/Tutorial/TutorialController.mjs | 1 + services/web/config/settings.defaults.js | 1 + .../rail/rail-overflow-dropdown.tsx | 4 +-- .../components/rail/rail-panel.tsx | 4 +-- .../ide-redesign/components/rail/rail.tsx | 26 ++++++++++++++++--- .../contexts/new-editor-tour-context.tsx | 3 +++ .../features/ide-redesign/utils/rail-utils.ts | 8 +++--- 7 files changed, 36 insertions(+), 11 deletions(-) diff --git a/services/web/app/src/Features/Tutorial/TutorialController.mjs b/services/web/app/src/Features/Tutorial/TutorialController.mjs index d7c1f49f9f..d31cd2da39 100644 --- a/services/web/app/src/Features/Tutorial/TutorialController.mjs +++ b/services/web/app/src/Features/Tutorial/TutorialController.mjs @@ -29,6 +29,7 @@ const VALID_KEYS = [ 'new-editor-intro', 'new-editor-intro-2', 'old-editor-warning-tooltip', + 'workbench-rail-popover', ] async function completeTutorial(req, res, next) { diff --git a/services/web/config/settings.defaults.js b/services/web/config/settings.defaults.js index 49fbbbaca1..419b2d0ff9 100644 --- a/services/web/config/settings.defaults.js +++ b/services/web/config/settings.defaults.js @@ -1048,6 +1048,7 @@ module.exports = { errorLogsComponents: [], referenceIndices: [], railEntries: [], + railPopovers: [], }, moduleImportSequence: [ diff --git a/services/web/frontend/js/features/ide-redesign/components/rail/rail-overflow-dropdown.tsx b/services/web/frontend/js/features/ide-redesign/components/rail/rail-overflow-dropdown.tsx index abf6572bae..893bf75fe4 100644 --- a/services/web/frontend/js/features/ide-redesign/components/rail/rail-overflow-dropdown.tsx +++ b/services/web/frontend/js/features/ide-redesign/components/rail/rail-overflow-dropdown.tsx @@ -2,7 +2,7 @@ import { DropdownMenu } from '@/shared/components/dropdown/dropdown-menu' import { RailTabKey } from '../../contexts/rail-context' import { RailElement } from '../../utils/rail-types' import RailTab from './rail-tab' -import { shouldIncludeRailTab } from '../../utils/rail-utils' +import { shouldIncludeElement } from '../../utils/rail-utils' export default function RailOverflowDropdown({ tabs, @@ -16,7 +16,7 @@ export default function RailOverflowDropdown({ return ( {tabs - .filter(shouldIncludeRailTab) + .filter(shouldIncludeElement) .map(({ icon, key, indicator, title, disabled }) => ( {railTabs - .filter(shouldIncludeRailTab) + .filter(shouldIncludeElement) .map(({ key, component, mountOnFirstLoad }) => ( element) +const moduleRailPopovers = ( + importOverleafModules('railPopovers') as { + import: { + default: { + key: string + Component: FC<{ ref: RefObject }> + ref: RefObject + hide: boolean | (() => boolean) + } + } + path: string + }[] +).map(({ import: { default: element } }) => element) export const RailLayout = () => { const { sendEvent } = useEditorAnalytics() @@ -175,7 +188,7 @@ export const RailLayout = () => { useEffect(() => { const validTabKeys = railTabs - .filter(shouldIncludeRailTab) + .filter(shouldIncludeElement) .map(tab => tab.key) if (!validTabKeys.includes(selectedTab) && isOpen) { // If the selected tab is no longer valid (e.g. due to permissions changes), @@ -225,7 +238,7 @@ export const RailLayout = () => {