From 28468e134c80ff0733a3c407bc1a0a8f8389e24e Mon Sep 17 00:00:00 2001 From: Tim Down <158919+timdown@users.noreply.github.com> Date: Wed, 9 Apr 2025 09:36:07 +0100 Subject: [PATCH 001/170] Merge pull request #24660 from overleaf/td-bs5-remove-react-bootstrap-0 Remove react-bootstrap 0.33.1 GitOrigin-RevId: c320a6b18c576afdc0fd49559915d3d2f3a7a1ef --- package-lock.json | 128 --- services/web/.storybook/preview.tsx | 38 +- .../utils/with-bootstrap-switcher.tsx | 20 - services/web/cypress/support/ct/window.ts | 1 - .../components/file-tree-context-menu.tsx | 19 - .../components/change-list/change-list.tsx | 5 +- .../change-list/dropdown/actions-dropdown.tsx | 22 +- .../dropdown/compare-version-dropdown.tsx | 1 - .../change-list/dropdown/history-dropdown.tsx | 1 - .../make-primary/confirmation-modal.tsx | 3 +- .../reconfirmation-info-prompt-text.tsx | 3 - .../dashboard/group-settings-button.tsx | 44 +- .../dashboard/leave-group-modal.tsx | 5 - .../dashboard/managed-group-subscriptions.tsx | 6 +- ...rsonal-subscription-recurly-sync-email.tsx | 3 - .../components/dashboard/row-link.tsx | 24 +- .../dashboard/states/active/active-new.tsx | 14 +- .../cancel-plan/downgrade-plan-button.tsx | 3 - .../cancel-plan/extend-trial-button.tsx | 3 - .../modals/cancel-ai-add-on-modal.tsx | 5 - .../modals/change-to-group-modal.tsx | 14 +- .../modals/confirm-change-plan-modal.tsx | 5 - .../modals/keep-current-plan-modal.tsx | 5 - .../bootstrap-3/dropdown-menu-with-ref.tsx | 71 -- .../dropdown-toggle-with-tooltip.tsx | 53 - .../bootstrap-3/form/form-control.tsx | 21 - .../bootstrap-3/toast-container.tsx | 14 - .../ui/components/bootstrap-3/toast.tsx | 51 - .../bootstrap-3/toggle-button-group.tsx | 99 -- .../bootstrap-version-switcher.tsx | 15 - .../ui/components/ol/icons/ol-tag-icon.tsx | 9 +- .../js/features/ui/components/ol/ol-badge.tsx | 37 +- .../ui/components/ol/ol-button-group.tsx | 27 +- .../ui/components/ol/ol-button-toolbar.tsx | 28 +- .../features/ui/components/ol/ol-button.tsx | 127 +-- .../js/features/ui/components/ol/ol-card.tsx | 13 +- .../ui/components/ol/ol-close-button.tsx | 22 +- .../js/features/ui/components/ol/ol-col.tsx | 70 +- .../components/ol/ol-dropdown-menu-item.tsx | 38 +- .../ui/components/ol/ol-form-checkbox.tsx | 135 +-- .../ui/components/ol/ol-form-control.tsx | 81 +- .../ui/components/ol/ol-form-feedback.tsx | 28 +- .../ui/components/ol/ol-form-group.tsx | 38 +- .../ui/components/ol/ol-form-label.tsx | 25 +- .../ui/components/ol/ol-form-select.tsx | 51 +- .../ui/components/ol/ol-form-switch.tsx | 48 +- .../ui/components/ol/ol-form-text.tsx | 31 +- .../js/features/ui/components/ol/ol-form.tsx | 41 +- .../ui/components/ol/ol-icon-button.tsx | 45 +- .../ui/components/ol/ol-list-group-item.tsx | 39 +- .../ui/components/ol/ol-list-group.tsx | 31 +- .../js/features/ui/components/ol/ol-modal.tsx | 126 +-- .../ui/components/ol/ol-notification.tsx | 40 +- .../features/ui/components/ol/ol-overlay.tsx | 58 +- .../ui/components/ol/ol-page-content-card.tsx | 14 +- .../features/ui/components/ol/ol-popover.tsx | 75 +- .../js/features/ui/components/ol/ol-row.tsx | 13 +- .../features/ui/components/ol/ol-spinner.tsx | 25 +- .../js/features/ui/components/ol/ol-table.tsx | 29 +- .../js/features/ui/components/ol/ol-tag.tsx | 31 +- .../ui/components/ol/ol-toast-container.tsx | 18 +- .../js/features/ui/components/ol/ol-toast.tsx | 35 +- .../components/ol/ol-toggle-button-group.tsx | 39 +- .../ui/components/ol/ol-toggle-button.tsx | 45 +- .../features/ui/components/ol/ol-tooltip.tsx | 45 +- .../frontend/js/features/utils/bootstrap-5.ts | 26 - .../js/shared/components/accessible-modal.tsx | 30 - .../frontend/js/shared/components/badge.tsx | 29 - .../js/shared/components/beta-badge-icon.tsx | 23 +- .../js/shared/components/beta-badge.tsx | 5 +- .../frontend/js/shared/components/close.tsx | 14 +- .../shared/components/controlled-dropdown.tsx | 58 -- .../shared/components/copy-to-clipboard.tsx | 8 +- .../generic-error-boundary-fallback.tsx | 27 +- .../frontend/js/shared/components/icon.tsx | 5 +- .../labs/labs-experiments-widget.tsx | 8 +- .../js/shared/components/loading-spinner.tsx | 13 +- .../js/shared/components/material-icon.tsx | 5 +- .../frontend/js/shared/components/select.tsx | 209 ++-- .../web/frontend/js/shared/components/tag.tsx | 56 - .../frontend/js/shared/components/tooltip.tsx | 57 -- .../js/shared/components/upgrade-benefits.jsx | 9 +- .../stories/contact-us-modal.stories.tsx | 60 +- .../web/frontend/stories/dropdown.stories.jsx | 45 - .../stories/feedback-badge.stories.tsx | 4 - .../frontend/stories/input-switch.stories.tsx | 7 +- .../stories/loading/loading.stories.tsx | 2 - .../web/frontend/stories/menu-bar.stories.tsx | 3 - .../unsaved-docs-locked-modal.stories.tsx | 7 - .../frontend/stories/pdf-preview.stories.jsx | 10 +- .../project-list/add-affiliation.stories.tsx | 3 - .../project-list/color-picker.stories.tsx | 3 - ...mpile-and-download-project-pdf.stories.tsx | 3 - .../current-plan-widget.stories.tsx | 3 - .../project-list/inr-banner.stories.tsx | 3 - .../new-project-button.stories.tsx | 3 - .../project-list/notifications.stories.tsx | 3 - .../project-list/project-list.stories.tsx | 3 - .../project-list/project-search.stories.tsx | 3 - .../project-list/survey-widget.stories.tsx | 3 - .../project-list/system-messages.stories.tsx | 3 - .../start-free-trial-button.stories.jsx | 4 - .../frontend/stories/style-guide.stories.jsx | 962 ------------------ .../group-invites/group-invites.stories.tsx | 2 - .../frontend/stories/ui/badge-bs3.stories.tsx | 59 -- ...adge-bs5.stories.tsx => badge.stories.tsx} | 5 +- .../frontend/stories/ui/button.stories.tsx | 7 +- .../stories/ui/dropdown-menu.stories.tsx | 5 +- .../ui/form/form-check-bs5.stories.tsx | 5 +- .../ui/form/form-input-bs5.stories.tsx | 5 +- .../ui/form/form-radio-bs5.stories.tsx | 5 +- .../ui/form/form-select-bs5.stories.tsx | 5 +- .../ui/form/form-textarea-bs5.stories.tsx | 5 +- .../stories/ui/icon-button.stories.tsx | 5 +- .../web/frontend/stories/ui/row.stories.tsx | 5 +- .../stories/ui/split-button.stories.tsx | 5 +- .../frontend/stories/ui/tag-bs3.stories.tsx | 70 -- .../{tag-bs5.stories.tsx => tag.stories.tsx} | 5 +- .../frontend/stories/ui/tooltip.stories.tsx | 19 +- .../stories/upgrade-prompt.stories.tsx | 5 - .../bootstrap-5/components/button.scss | 8 - .../bootstrap-5/pages/onboarding.scss | 4 - services/web/package.json | 3 - .../shared/accessible-modal.spec.tsx | 36 - .../components/shared/select.spec.tsx | 16 +- .../components/shared/tooltip.spec.tsx | 8 +- .../components/notifications.test.tsx | 13 +- .../components/project-list-title.tsx | 3 - .../project-tools-rename.test.tsx | 11 - .../components/share-project-modal.test.jsx | 5 - .../components/dashboard/pause-modal.test.tsx | 1 - .../dashboard/states/active/active.test.tsx | 12 +- .../group-invite/accepted-invite.test.tsx | 64 +- .../group-invite/group-invite.test.tsx | 181 ++-- .../web/test/frontend/helpers/bootstrap-3.ts | 5 - .../web/test/frontend/helpers/reset-meta.ts | 1 - 136 files changed, 428 insertions(+), 4132 deletions(-) delete mode 100644 services/web/.storybook/utils/with-bootstrap-switcher.tsx delete mode 100644 services/web/frontend/js/features/ui/components/bootstrap-3/dropdown-menu-with-ref.tsx delete mode 100644 services/web/frontend/js/features/ui/components/bootstrap-3/dropdown-toggle-with-tooltip.tsx delete mode 100644 services/web/frontend/js/features/ui/components/bootstrap-3/form/form-control.tsx delete mode 100644 services/web/frontend/js/features/ui/components/bootstrap-3/toast-container.tsx delete mode 100644 services/web/frontend/js/features/ui/components/bootstrap-3/toast.tsx delete mode 100644 services/web/frontend/js/features/ui/components/bootstrap-3/toggle-button-group.tsx delete mode 100644 services/web/frontend/js/features/ui/components/bootstrap-5/bootstrap-version-switcher.tsx delete mode 100644 services/web/frontend/js/features/utils/bootstrap-5.ts delete mode 100644 services/web/frontend/js/shared/components/accessible-modal.tsx delete mode 100644 services/web/frontend/js/shared/components/badge.tsx delete mode 100644 services/web/frontend/js/shared/components/controlled-dropdown.tsx delete mode 100644 services/web/frontend/js/shared/components/tag.tsx delete mode 100644 services/web/frontend/js/shared/components/tooltip.tsx delete mode 100644 services/web/frontend/stories/dropdown.stories.jsx delete mode 100644 services/web/frontend/stories/style-guide.stories.jsx delete mode 100644 services/web/frontend/stories/ui/badge-bs3.stories.tsx rename services/web/frontend/stories/ui/{badge-bs5.stories.tsx => badge.stories.tsx} (92%) delete mode 100644 services/web/frontend/stories/ui/tag-bs3.stories.tsx rename services/web/frontend/stories/ui/{tag-bs5.stories.tsx => tag.stories.tsx} (93%) delete mode 100644 services/web/test/frontend/components/shared/accessible-modal.spec.tsx delete mode 100644 services/web/test/frontend/helpers/bootstrap-3.ts diff --git a/package-lock.json b/package-lock.json index 5f0eb0baf1..bd3eb0b2e9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3267,27 +3267,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/runtime-corejs2": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.16.7.tgz", - "integrity": "sha512-ec0BM0J/9M5Cncha++AlgvvDlk+uM+m6f7K0t74ClcYzsE8LgX4RstRreksMSCI82o3LJS//UswmA0pUWkJpqg==", - "dev": true, - "dependencies": { - "core-js": "^2.6.5", - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime-corejs2/node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", - "dev": true, - "hasInstallScript": true - }, "node_modules/@babel/runtime-corejs3": { "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.8.tgz", @@ -12634,16 +12613,6 @@ "@types/react": "*" } }, - "node_modules/@types/react-overlays": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@types/react-overlays/-/react-overlays-1.1.3.tgz", - "integrity": "sha512-oOq5NWbyfNz2w2sKvjkHdvGQSMA+VDVfI5UOfGPR0wkik2welad1RDVnVgH15jKf58jrZNBa1Ee4SVBgCGFxCg==", - "dev": true, - "dependencies": { - "@types/react": "*", - "@types/react-transition-group": "*" - } - }, "node_modules/@types/react-redux": { "version": "7.1.33", "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.33.tgz", @@ -19802,15 +19771,6 @@ "utila": "~0.4" } }, - "node_modules/dom-helpers": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", - "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.1.2" - } - }, "node_modules/dom-serializer": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", @@ -27577,12 +27537,6 @@ "node": ">=12.0.0" } }, - "node_modules/keycode": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.1.tgz", - "integrity": "sha512-Rdgz9Hl9Iv4QKi8b0OlCRQEzp4AgVxyCtz5S/+VIHezDmrDhkp2N2TqBWOLz0/gbeREXOOiI9/4b8BY9uw2vFg==", - "dev": true - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -34620,30 +34574,6 @@ "react": ">=16.4.1" } }, - "node_modules/react-bootstrap": { - "version": "0.33.1", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-0.33.1.tgz", - "integrity": "sha512-qWTRravSds87P8WC82tETy2yIso8qDqlIm0czsrduCaYAFtHuyLu0XDbUlfLXeRzqgwm5sRk2wRaTNoiVkk/YQ==", - "dev": true, - "dependencies": { - "@babel/runtime-corejs2": "^7.0.0", - "classnames": "^2.2.5", - "dom-helpers": "^3.2.0", - "invariant": "^2.2.4", - "keycode": "^2.2.0", - "prop-types": "^15.6.1", - "prop-types-extra": "^1.0.1", - "react-overlays": "^0.9.0", - "react-prop-types": "^0.4.0", - "react-transition-group": "^2.0.0", - "uncontrollable": "^7.0.2", - "warning": "^3.0.0" - }, - "peerDependencies": { - "react": ">=16.3.0", - "react-dom": ">=16.3.0" - } - }, "node_modules/react-chartjs-2": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.0.1.tgz", @@ -34849,36 +34779,6 @@ "uc.micro": "^1.0.1" } }, - "node_modules/react-overlays": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-0.9.3.tgz", - "integrity": "sha512-u2T7nOLnK+Hrntho4p0Nxh+BsJl0bl4Xuwj/Y0a56xywLMetgAfyjnDVrudLXsNcKGaspoC+t3C1V80W9QQTdQ==", - "dev": true, - "dependencies": { - "classnames": "^2.2.5", - "dom-helpers": "^3.2.1", - "prop-types": "^15.5.10", - "prop-types-extra": "^1.0.1", - "react-transition-group": "^2.2.1", - "warning": "^3.0.0" - }, - "peerDependencies": { - "react": ">=16.3.0", - "react-dom": ">=16.3.0" - } - }, - "node_modules/react-prop-types": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/react-prop-types/-/react-prop-types-0.4.0.tgz", - "integrity": "sha1-+ZsL+0AGkpya8gUefBQUpcdbk9A=", - "dev": true, - "dependencies": { - "warning": "^3.0.0" - }, - "peerDependencies": { - "react": ">=0.14.0" - } - }, "node_modules/react-proxy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/react-proxy/-/react-proxy-1.1.8.tgz", @@ -34989,22 +34889,6 @@ "react-proxy": "^1.1.7" } }, - "node_modules/react-transition-group": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", - "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", - "dev": true, - "dependencies": { - "dom-helpers": "^3.4.0", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2", - "react-lifecycles-compat": "^3.0.4" - }, - "peerDependencies": { - "react": ">=15.0.0", - "react-dom": ">=15.0.0" - } - }, "node_modules/reactcss": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz", @@ -40502,15 +40386,6 @@ "node": ">=6.0.0" } }, - "node_modules/warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", - "dev": true, - "dependencies": { - "loose-envify": "^1.0.0" - } - }, "node_modules/watchpack": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", @@ -44482,7 +44357,6 @@ "@types/react-dom": "^17.0.13", "@types/react-google-recaptcha": "^2.1.5", "@types/react-linkify": "^1.0.0", - "@types/react-overlays": "^1.1.3", "@types/recurly__recurly-js": "^4.22.0", "@types/sinon-chai": "^3.2.8", "@types/uuid": "^9.0.8", @@ -44570,7 +44444,6 @@ "prop-types": "^15.7.2", "qrcode": "^1.4.4", "react": "^17.0.2", - "react-bootstrap": "^0.33.1", "react-bootstrap-5": "npm:react-bootstrap@^2.10.5", "react-chartjs-2": "^5.0.1", "react-color": "^2.19.3", @@ -44581,7 +44454,6 @@ "react-google-recaptcha": "^3.1.0", "react-i18next": "^13.3.1", "react-linkify": "^1.0.0-alpha", - "react-overlays": "^0.9.3", "react-refresh": "^0.14.0", "react-resizable-panels": "^2.1.1", "resolve-url-loader": "^5.0.0", diff --git a/services/web/.storybook/preview.tsx b/services/web/.storybook/preview.tsx index ed67abc3c4..e3838a6f97 100644 --- a/services/web/.storybook/preview.tsx +++ b/services/web/.storybook/preview.tsx @@ -9,14 +9,10 @@ import i18n from 'i18next' import { initReactI18next } from 'react-i18next' // @ts-ignore import en from '../../../services/web/locales/en.json' -import { bootstrapVersionArg } from './utils/with-bootstrap-switcher' -function resetMeta(bootstrapVersion?: 3 | 5) { +function resetMeta() { window.metaAttributesCache = new Map() window.metaAttributesCache.set('ol-i18n', { currentLangCode: 'en' }) - if (bootstrapVersion) { - window.metaAttributesCache.set('ol-bootstrapVersion', bootstrapVersion) - } window.metaAttributesCache.set('ol-ExposedSettings', { adminEmail: 'placeholder@example.com', appName: 'Overleaf', @@ -126,8 +122,6 @@ const preview: Preview = { // render stories in iframes, to isolate modals inlineStories: false, }, - // Default to Bootstrap 5 styles - bootstrap5: true, }, globalTypes: { theme: { @@ -144,17 +138,9 @@ const preview: Preview = { }, }, loaders: [ - async ({ globals }) => { - const { theme } = globals - + async () => { return { - // NOTE: this uses `${theme}style.less` rather than `${theme}.less` - // so that webpack only bundles files ending with "style.less" - bootstrap3Style: await import( - `!!to-string-loader!css-loader!less-loader!../../../services/web/frontend/stylesheets/${theme}style.less` - ), - // Themes are applied differently in Bootstrap 5 code - bootstrap5Style: await import( + mainStyle: await import( // @ts-ignore `!!to-string-loader!css-loader!resolve-url-loader!sass-loader!../../../services/web/frontend/stylesheets/bootstrap-5/main-style.scss` ), @@ -163,15 +149,9 @@ const preview: Preview = { ], decorators: [ (Story, context) => { - const { bootstrap3Style, bootstrap5Style } = context.loaded - const bootstrapVersion = Number( - context.args[bootstrapVersionArg] || - (context.parameters.bootstrap5 === false ? 3 : 5) - ) as 3 | 5 - const activeStyle = - bootstrapVersion === 3 ? bootstrap3Style : bootstrap5Style + const { mainStyle } = context.loaded - resetMeta(bootstrapVersion) + resetMeta() return (
{subscription.plan.annual ? (
{t('want_change_to_apply_before_plan_end')}
-
- {t('plan')}
-
-
- {planName}
-
+ {t('plan')}
+ {planName}
{subscription.pendingPlan &&
subscription.pendingPlan.name !== subscription.plan.name && (