Merge pull request #26440 from overleaf/mj-ide-co-branding-submit

[web] Editor redesign: Add co-branded submit button to toolbar

GitOrigin-RevId: 45f7ba93de8b28868d88a4ad913f6543e0f7e0a6
This commit is contained in:
Mathias Jakobsen
2025-06-25 10:54:32 +01:00
committed by Copybot
parent e562e3d1bf
commit 4fd9c6fd18
6 changed files with 36 additions and 3 deletions

View File

@@ -74,6 +74,10 @@ function sanitizeBrandVariationDetails(details) {
details.submit_button_html,
settings.modules.sanitize.options
)
details.submit_button_html_no_br = sanitizeHtml(
details.submit_button_html.replace(/<br\s*\/?>/gi, ' '),
settings.modules.sanitize.options
)
}
}

View File

@@ -16,9 +16,10 @@ import EditableLabel from './editable-label'
import { DuplicateProject } from './duplicate-project'
const [publishModalModules] = importOverleafModules('publishModal')
const SubmitProjectButton = publishModalModules?.import.NewPublishToolbarButton
const SubmitProjectButton = publishModalModules?.import.NewPublishDropdownButton
export const ToolbarProjectTitle = () => {
const { cobranding } = useEditorContext()
const { t } = useTranslation()
const { permissionsLevel, renameProject } = useEditorContext()
const { name } = useProjectContext()
@@ -67,7 +68,7 @@ export const ToolbarProjectTitle = () => {
/>
</DropdownToggle>
<DropdownMenu renderOnMount>
{shouldDisplaySubmitButton && (
{shouldDisplaySubmitButton && !cobranding && (
<>
<SubmitProjectButton />
<DropdownDivider />

View File

@@ -11,12 +11,19 @@ import { useCallback } from 'react'
import * as eventTracking from '../../../../infrastructure/event-tracking'
import { ToolbarLogos } from './logos'
import { useEditorContext } from '@/shared/context/editor-context'
import importOverleafModules from '../../../../../macros/import-overleaf-module.macro'
import UpgradeButton from './upgrade-button'
import getMeta from '@/utils/meta'
const [publishModalModules] = importOverleafModules('publishModal')
const SubmitProjectButton = publishModalModules?.import.NewPublishToolbarButton
export const Toolbar = () => {
const { view, setView } = useLayoutContext()
const { cobranding } = useEditorContext()
const { cobranding, permissionsLevel } = useEditorContext()
const shouldDisplaySubmitButton =
(permissionsLevel === 'owner' || permissionsLevel === 'readAndWrite') &&
SubmitProjectButton
const handleBackToEditorClick = useCallback(() => {
eventTracking.sendMB('navigation-clicked-history', { action: 'close' })
@@ -47,6 +54,9 @@ export const Toolbar = () => {
<OnlineUsers />
<ShowHistoryButton />
<ChangeLayoutButton />
{shouldDisplaySubmitButton && cobranding && (
<SubmitProjectButton cobranding={cobranding} />
)}
<ShareProjectButton />
{getMeta('ol-showUpgradePrompt') && <UpgradeButton />}
</div>

View File

@@ -72,6 +72,7 @@ export const EditorProvider: FC<React.PropsWithChildren> = ({ children }) => {
partner: brandVariation.partner,
brandedMenu: brandVariation.branded_menu,
submitBtnHtml: brandVariation.submit_button_html,
submitBtnHtmlNoBreaks: brandVariation.submit_button_html_no_br,
}
)
}, [])

View File

@@ -118,5 +118,21 @@ describe('BrandVariationsHandler', function () {
'<br /><strong style="color:#B39500">AGU Journal</strong>hello'
)
})
it("should sanitize and remove breaks in 'submit_button_html_no_br'", async function () {
this.mockedBrandVariationDetails.submit_button_html =
'Submit to<br class="break"/><strong style="color:#B39500">AGU Journal</strong><iframe>hello</iframe>'
this.V1Api.request.callsArgWith(
1,
null,
{ statusCode: 200 },
this.mockedBrandVariationDetails
)
const brandVariationDetails =
await this.BrandVariationsHandler.promises.getBrandVariationById('12')
expect(brandVariationDetails.submit_button_html_no_br).to.equal(
'Submit to <strong style="color:#B39500">AGU Journal</strong>hello'
)
})
})
})

View File

@@ -8,4 +8,5 @@ export type Cobranding = {
partner?: string
brandedMenu?: boolean
submitBtnHtml?: string
submitBtnHtmlNoBreaks?: string
}