From 79e4b76551daef0c9c98e2554d148b4ce68af63e Mon Sep 17 00:00:00 2001 From: Tim Down <158919+timdown@users.noreply.github.com> Date: Mon, 16 Dec 2024 11:39:46 +0000 Subject: [PATCH] Merge pull request #22222 from overleaf/td-thin-footer-react Implement thin footer in Bootstrap 5 GitOrigin-RevId: c45f63b3d2536e6266eb55cc95df11b53a6b77ec --- server-ce/test/learn-wiki.spec.ts | 3 +- .../app/src/infrastructure/ExpressLocals.js | 4 +- services/web/app/views/layout-marketing.pug | 5 +- services/web/app/views/layout-react.pug | 11 +- .../layout-website-redesign-bootstrap-5.pug | 2 +- .../web/app/views/layout-website-redesign.pug | 2 +- .../layout/fat-footer-react-bootstrap-5.pug | 2 +- .../layout/language-picker-bootstrap-5.pug | 14 +- .../views/layout/thin-footer-bootstrap-5.pug | 38 +++++ .../{footer-marketing.pug => thin-footer.pug} | 0 .../web/frontend/extracted-translations.json | 1 + .../js/features/header-footer-react/index.tsx | 6 +- .../components/project-list-ds-nav.tsx | 3 +- .../components/project-list-root.tsx | 4 +- .../bootstrap-5/footer/fat-footer-base.tsx | 2 +- .../bootstrap-5/footer/fat-footer.tsx | 3 +- .../components/bootstrap-5/footer/footer.tsx | 9 ++ .../bootstrap-5/footer/thin-footer.tsx | 90 ++++++++++++ .../bootstrap-5/language-picker.tsx | 17 +-- .../components/types/fat-footer-metadata.ts | 7 - .../ui/components/types/footer-metadata.ts | 18 +++ services/web/frontend/js/utils/meta.ts | 4 +- .../bootstrap-5/abstracts/variables.scss | 10 +- .../stylesheets/bootstrap-5/base/layout.scss | 8 ++ .../stylesheets/bootstrap-5/base/links.scss | 2 + .../bootstrap-5/components/button.scss | 4 +- .../bootstrap-5/components/dropdown-menu.scss | 7 +- .../bootstrap-5/components/footer.scss | 130 +++++++----------- .../pages/project-list-default.scss | 14 +- .../bootstrap-5/pages/project-list.scss | 12 -- .../shared/language-picker.spec.tsx | 7 +- .../components/project-list-root.test.tsx | 1 + .../project-tools-rename.test.tsx | 1 + 33 files changed, 294 insertions(+), 147 deletions(-) create mode 100644 services/web/app/views/layout/thin-footer-bootstrap-5.pug rename services/web/app/views/layout/{footer-marketing.pug => thin-footer.pug} (100%) create mode 100644 services/web/frontend/js/features/ui/components/bootstrap-5/footer/footer.tsx create mode 100644 services/web/frontend/js/features/ui/components/bootstrap-5/footer/thin-footer.tsx delete mode 100644 services/web/frontend/js/features/ui/components/types/fat-footer-metadata.ts create mode 100644 services/web/frontend/js/features/ui/components/types/footer-metadata.ts diff --git a/server-ce/test/learn-wiki.spec.ts b/server-ce/test/learn-wiki.spec.ts index 802aeeac3e..c0cc8729fe 100644 --- a/server-ce/test/learn-wiki.spec.ts +++ b/server-ce/test/learn-wiki.spec.ts @@ -83,8 +83,7 @@ describe('LearnWiki', function () { }) function checkDisabled() { - // eslint-disable-next-line mocha/no-skipped-tests - it.skip('should not add a documentation entry to the nav bar', () => { + it('should not add a documentation entry to the nav bar', () => { login(REGULAR_USER) cy.visit('/project') cy.findByText('Documentation').should('not.exist') diff --git a/services/web/app/src/infrastructure/ExpressLocals.js b/services/web/app/src/infrastructure/ExpressLocals.js index 975ca7d07c..e6ce12d74a 100644 --- a/services/web/app/src/infrastructure/ExpressLocals.js +++ b/services/web/app/src/infrastructure/ExpressLocals.js @@ -244,8 +244,8 @@ module.exports = function (webRouter, privateApiRouter, publicApiRouter) { } // This function is used to add translations from the server for main - // navigation items because it's tricky to get them in the front end - // otherwise. + // navigation and footer items because it's tricky to get them in the front + // end otherwise. res.locals.cloneAndTranslateText = obj => { const clone = _.cloneDeep(obj) addTranslatedTextDeep(clone) diff --git a/services/web/app/views/layout-marketing.pug b/services/web/app/views/layout-marketing.pug index ecdfb7cd8f..20126beda3 100644 --- a/services/web/app/views/layout-marketing.pug +++ b/services/web/app/views/layout-marketing.pug @@ -17,7 +17,10 @@ block body if (typeof suppressFooter === "undefined") if showThinFooter - include layout/footer-marketing + if bootstrapVersion === 5 + include layout/thin-footer-bootstrap-5 + else + include layout/thin-footer else include layout/fat-footer diff --git a/services/web/app/views/layout-react.pug b/services/web/app/views/layout-react.pug index c64b768ab9..4fba24c226 100644 --- a/services/web/app/views/layout-react.pug +++ b/services/web/app/views/layout-react.pug @@ -40,8 +40,12 @@ block append meta items: cloneAndTranslateText(nav.header_extras) }) meta(name="ol-footer" data-type="json" content={ + showThinFooter: showThinFooter, + showPoweredBy: !hasFeature('saas') && !settings.nav.hide_powered_by, subdomainLang: settings.i18n.subdomainLang, - translatedLanguages: settings.translatedLanguages + translatedLanguages: settings.translatedLanguages, + leftItems: cloneAndTranslateText(settings.nav.left_footer), + rightItems: settings.nav.right_footer }) block body @@ -55,7 +59,10 @@ block body if (typeof suppressFooter === "undefined") if showThinFooter - include layout/footer-marketing + if bootstrapVersion === 5 + include layout/thin-footer-bootstrap-5 + else + include layout/thin-footer else if bootstrapVersion === 5 include layout/fat-footer-react-bootstrap-5 diff --git a/services/web/app/views/layout-website-redesign-bootstrap-5.pug b/services/web/app/views/layout-website-redesign-bootstrap-5.pug index d1354a617d..092f5b765d 100644 --- a/services/web/app/views/layout-website-redesign-bootstrap-5.pug +++ b/services/web/app/views/layout-website-redesign-bootstrap-5.pug @@ -16,7 +16,7 @@ block body if (typeof(suppressFooter) == "undefined") if showThinFooter - include layout/footer-marketing + include layout/thin-footer-bootstrap-5 else include layout/fat-footer-website-redesign diff --git a/services/web/app/views/layout-website-redesign.pug b/services/web/app/views/layout-website-redesign.pug index e848600e15..37ba2f9f32 100644 --- a/services/web/app/views/layout-website-redesign.pug +++ b/services/web/app/views/layout-website-redesign.pug @@ -14,7 +14,7 @@ block body if (typeof(suppressFooter) == "undefined") if showThinFooter - include layout/footer-marketing + include layout/thin-footer else include layout/fat-footer-website-redesign diff --git a/services/web/app/views/layout/fat-footer-react-bootstrap-5.pug b/services/web/app/views/layout/fat-footer-react-bootstrap-5.pug index 297afdf746..95b2605b86 100644 --- a/services/web/app/views/layout/fat-footer-react-bootstrap-5.pug +++ b/services/web/app/views/layout/fat-footer-react-bootstrap-5.pug @@ -1 +1 @@ -#fat-footer-container +#footer-container diff --git a/services/web/app/views/layout/language-picker-bootstrap-5.pug b/services/web/app/views/layout/language-picker-bootstrap-5.pug index 2e20cadadc..47a9bc5d53 100644 --- a/services/web/app/views/layout/language-picker-bootstrap-5.pug +++ b/services/web/app/views/layout/language-picker-bootstrap-5.pug @@ -1,21 +1,19 @@ li.dropdown.dropup.subdued(dropdown).language-picker - a#language-picker-toggle( - href="#", + button#language-picker-toggle.btn.btn-link.btn-inline-link( dropdown-toggle, data-ol-lang-selector-tooltip, data-bs-toggle="dropdown", - role="button" aria-haspopup="true", aria-expanded="false", aria-label="Select " + translate('language'), tooltip=translate('language') title=translate('language') ) - i.fa.fa-fw.fa-language - | - | #{settings.translatedLanguages[currentLngCode]} + span.material-symbols(aria-hidden="true") translate + |   + span.language-picker-text #{settings.translatedLanguages[currentLngCode]} - ul.dropdown-menu(role="menu" aria-labelledby="language-picker-toggle") + ul.dropdown-menu.dropdown-menu-sm-width(role="menu" aria-labelledby="language-picker-toggle") li.dropdown-header #{translate("language")} each subdomainDetails, subdomain in settings.i18n.subdomainLang if !subdomainDetails.hide @@ -24,4 +22,4 @@ li.dropdown.dropup.subdued(dropdown).language-picker a.menu-indent(href=subdomainDetails.url+currentUrlWithQueryParams, role="menuitem", class=isActive ? 'dropdown-item active' : 'dropdown-item', aria-selected=isActive ? 'true' : 'false') | #{settings.translatedLanguages[subdomainDetails.lngCode]} if subdomainDetails.lngCode === currentLngCode - span.material-symbols.dropdown-item-trailing-icon.pull-right(aria-hidden="true") check + span.material-symbols.dropdown-item-trailing-icon(aria-hidden="true") check diff --git a/services/web/app/views/layout/thin-footer-bootstrap-5.pug b/services/web/app/views/layout/thin-footer-bootstrap-5.pug new file mode 100644 index 0000000000..0baef6a3fb --- /dev/null +++ b/services/web/app/views/layout/thin-footer-bootstrap-5.pug @@ -0,0 +1,38 @@ +footer.site-footer + - var showLanguagePicker = Object.keys(settings.i18n.subdomainLang).length > 1 + - var hasCustomLeftNav = nav.left_footer && nav.left_footer.length > 0 + .site-footer-content.hidden-print + .row + ul.site-footer-items.col-lg-9 + if !settings.nav.hide_powered_by + li + //- year of Server Pro release, static + | © 2024 + | + a(href='https://www.overleaf.com/for/enterprises') Powered by Overleaf + + if showLanguagePicker || hasCustomLeftNav + li + strong.text-muted | + + if showLanguagePicker + include language-picker-bootstrap-5 + + if showLanguagePicker && hasCustomLeftNav + li + strong.text-muted | + + each item in nav.left_footer + li + if item.url + a(href=item.url, class=item.class) !{translate(item.text)} + else + | !{item.text} + + ul.site-footer-items.col-lg-3.text-end + each item in nav.right_footer + li + if item.url + a(href=item.url, class=item.class, aria-label=item.label) !{item.text} + else + | !{item.text} diff --git a/services/web/app/views/layout/footer-marketing.pug b/services/web/app/views/layout/thin-footer.pug similarity index 100% rename from services/web/app/views/layout/footer-marketing.pug rename to services/web/app/views/layout/thin-footer.pug diff --git a/services/web/frontend/extracted-translations.json b/services/web/frontend/extracted-translations.json index 56f4f532eb..cfb29b91f5 100644 --- a/services/web/frontend/extracted-translations.json +++ b/services/web/frontend/extracted-translations.json @@ -790,6 +790,7 @@ "knowledge_base": "", "labels_help_you_to_easily_reference_your_figures": "", "labels_help_you_to_reference_your_tables": "", + "language": "", "language_feedback": "", "large_or_high-resolution_images_taking_too_long": "", "last_active": "", diff --git a/services/web/frontend/js/features/header-footer-react/index.tsx b/services/web/frontend/js/features/header-footer-react/index.tsx index f3395fe316..2ac25a090f 100644 --- a/services/web/frontend/js/features/header-footer-react/index.tsx +++ b/services/web/frontend/js/features/header-footer-react/index.tsx @@ -1,7 +1,7 @@ import ReactDOM from 'react-dom' import getMeta from '@/utils/meta' import DefaultNavbar from '@/features/ui/components/bootstrap-5/navbar/default-navbar' -import FatFooter from '@/features/ui/components/bootstrap-5/footer/fat-footer' +import Footer from '@/features/ui/components/bootstrap-5/footer/footer' const navbarElement = document.getElementById('navbar-container') if (navbarElement) { @@ -9,8 +9,8 @@ if (navbarElement) { ReactDOM.render(, navbarElement) } -const footerElement = document.getElementById('fat-footer-container') +const footerElement = document.getElementById('footer-container') if (footerElement) { const footerProps = getMeta('ol-footer') - ReactDOM.render(, footerElement) + ReactDOM.render(