id && handleDismiss(id)}
- body={
+ content={
<>
id && handleDismiss(id)}
- body={
+ content={
<>
) : templateKey === 'notification_personal_and_group_subscriptions' ? (
id && handleDismiss(id)}
- body={
+ content={
) : (
id && handleDismiss(id)}
- body={html}
+ content={html}
/>
)}
>
diff --git a/services/web/frontend/js/features/project-list/components/notifications/groups/confirm-email.tsx b/services/web/frontend/js/features/project-list/components/notifications/groups/confirm-email.tsx
index 0c208726bb..737286255e 100644
--- a/services/web/frontend/js/features/project-list/components/notifications/groups/confirm-email.tsx
+++ b/services/web/frontend/js/features/project-list/components/notifications/groups/confirm-email.tsx
@@ -1,5 +1,4 @@
import { Trans, useTranslation } from 'react-i18next'
-import { Button } from 'react-bootstrap'
import Notification from '../notification'
import Icon from '../../../../../shared/components/icon'
import getMeta from '../../../../../utils/meta'
@@ -11,6 +10,7 @@ import {
} from '../../../../../infrastructure/fetch-json'
import { UserEmailData } from '../../../../../../../types/user-email'
import { debugConsole } from '@/utils/debugging'
+import OLButton from '@/features/ui/components/ol/ol-button'
const ssoAvailable = ({ samlProviderId, affiliation }: UserEmailData) => {
const { hasSamlFeature, hasSamlBeta } = getMeta('ol-ExposedSettings')
@@ -96,8 +96,8 @@ function ConfirmEmailNotification({ userEmail }: { userEmail: UserEmailData }) {
if (emailHasLicenceAfterConfirming(userEmail) && isOnFreeOrIndividualPlan()) {
return (
{isLoading ? (
<>
@@ -112,12 +112,6 @@ function ConfirmEmailNotification({ userEmail }: { userEmail: UserEmailData }) {
i18nKey="one_step_away_from_professional_features"
components={[]} // eslint-disable-line react/jsx-key
/>
-
}
+ action={
+ handleResendConfirmationEmail(userEmail)}
+ >
+ {t('resend_email')}
+
+ }
/>
)
}
return (
{isLoading ? (
<>
@@ -154,13 +156,13 @@ function ConfirmEmailNotification({ userEmail }: { userEmail: UserEmailData }) {
{t('please_confirm_email', {
emailAddress: userEmail.email,
})}{' '}
-
+ {t('resend_confirmation_email')}
+
>
)}
diff --git a/services/web/frontend/js/features/project-list/components/notifications/groups/group-invitation/group-invitation-cancel-subscription.tsx b/services/web/frontend/js/features/project-list/components/notifications/groups/group-invitation/group-invitation-cancel-subscription.tsx
index 5228afa85a..c21438185b 100644
--- a/services/web/frontend/js/features/project-list/components/notifications/groups/group-invitation/group-invitation-cancel-subscription.tsx
+++ b/services/web/frontend/js/features/project-list/components/notifications/groups/group-invitation/group-invitation-cancel-subscription.tsx
@@ -1,10 +1,9 @@
-import { Button } from 'react-bootstrap'
import { useTranslation } from 'react-i18next'
import type { Dispatch, SetStateAction } from 'react'
import Notification from '../../notification'
import { GroupInvitationStatus } from './hooks/use-group-invitation-notification'
import type { NotificationGroupInvitation } from '../../../../../../../../types/project/dashboard/notification'
-import getMeta from '@/utils/meta'
+import OLButton from '@/features/ui/components/ol/ol-button'
type GroupInvitationCancelIndividualSubscriptionNotificationProps = {
setGroupInvitationStatus: Dispatch>
@@ -20,37 +19,32 @@ export default function GroupInvitationCancelIndividualSubscriptionNotification(
notification,
}: GroupInvitationCancelIndividualSubscriptionNotificationProps) {
const { t } = useTranslation()
- const newNotificationStyle = getMeta('ol-newNotificationStyle')
const {
messageOpts: { inviterName },
} = notification
return (
-
-
-
+
+ >
}
/>
)
diff --git a/services/web/frontend/js/features/project-list/components/notifications/groups/group-invitation/group-invitation-join.tsx b/services/web/frontend/js/features/project-list/components/notifications/groups/group-invitation/group-invitation-join.tsx
index fb1c5da6bb..e9710c04cf 100644
--- a/services/web/frontend/js/features/project-list/components/notifications/groups/group-invitation/group-invitation-join.tsx
+++ b/services/web/frontend/js/features/project-list/components/notifications/groups/group-invitation/group-invitation-join.tsx
@@ -1,8 +1,7 @@
-import { Button } from 'react-bootstrap'
import { useTranslation, Trans } from 'react-i18next'
import Notification from '../../notification'
import type { NotificationGroupInvitation } from '../../../../../../../../types/project/dashboard/notification'
-import getMeta from '@/utils/meta'
+import OLButton from '@/features/ui/components/ol/ol-button'
type GroupInvitationNotificationProps = {
acceptGroupInvite: () => void
@@ -18,16 +17,15 @@ export default function GroupInvitationNotificationJoin({
dismissGroupInviteNotification,
}: GroupInvitationNotificationProps) {
const { t } = useTranslation()
- const newNotificationStyle = getMeta('ol-newNotificationStyle')
const {
messageOpts: { inviterName },
} = notification
return (
}
action={
-
+
}
/>
)
diff --git a/services/web/frontend/js/features/project-list/components/notifications/groups/group-invitation/group-invitation-successful.tsx b/services/web/frontend/js/features/project-list/components/notifications/groups/group-invitation/group-invitation-successful.tsx
index bb6ef8ac51..3df96ea8e0 100644
--- a/services/web/frontend/js/features/project-list/components/notifications/groups/group-invitation/group-invitation-successful.tsx
+++ b/services/web/frontend/js/features/project-list/components/notifications/groups/group-invitation/group-invitation-successful.tsx
@@ -1,7 +1,5 @@
import Notification from '../../notification'
import { useTranslation } from 'react-i18next'
-import Icon from '../../../../../../shared/components/icon'
-import getMeta from '@/utils/meta'
type GroupInvitationSuccessfulNotificationProps = {
hideNotification: () => void
@@ -11,20 +9,12 @@ export default function GroupInvitationSuccessfulNotification({
hideNotification,
}: GroupInvitationSuccessfulNotificationProps) {
const { t } = useTranslation()
- const newNotificationStyle = getMeta('ol-newNotificationStyle')
return (
- {!newNotificationStyle && (
-
- )}
- {t('congratulations_youve_successfully_join_group')}
- >
- }
+ content={t('congratulations_youve_successfully_join_group')}
/>
)
}
diff --git a/services/web/frontend/js/features/project-list/components/notifications/groups/institution.tsx b/services/web/frontend/js/features/project-list/components/notifications/groups/institution.tsx
index edddd82b5c..10ed7a2f6e 100644
--- a/services/web/frontend/js/features/project-list/components/notifications/groups/institution.tsx
+++ b/services/web/frontend/js/features/project-list/components/notifications/groups/institution.tsx
@@ -1,16 +1,14 @@
import { Fragment } from 'react'
import { useTranslation, Trans } from 'react-i18next'
-import { Button } from 'react-bootstrap'
import Notification from '../notification'
-import Icon from '../../../../../shared/components/icon'
import getMeta from '../../../../../utils/meta'
import useAsyncDismiss from '../hooks/useAsyncDismiss'
+import OLButton from '@/features/ui/components/ol/ol-button'
function Institution() {
const { t } = useTranslation()
const { samlInitPath, appName } = getMeta('ol-ExposedSettings')
const notificationsInstitution = getMeta('ol-notificationsInstitution') || []
- const newNotificationStyle = getMeta('ol-newNotificationStyle')
const { handleDismiss } = useAsyncDismiss()
if (!notificationsInstitution.length) {
@@ -36,10 +34,9 @@ function Institution() {
{templateKey === 'notification_institution_sso_available' && (
- {' '}
}
action={
-
+
}
/>
)}
{templateKey === 'notification_institution_sso_linked' && (
id && handleDismiss(id)}
- body={
+ content={
}}
@@ -95,15 +90,10 @@ function Institution() {
)}
{templateKey === 'notification_institution_sso_non_canonical' && (
id && handleDismiss(id)}
- body={
+ content={
<>
- {!newNotificationStyle && (
- <>
- {' '}
- >
- )}
}}
@@ -125,9 +115,9 @@ function Institution() {
{templateKey ===
'notification_institution_sso_already_registered' && (
id && handleDismiss(id)}
- body={
+ content={
<>
}
action={
-
+
}
/>
)}
{templateKey === 'notification_institution_sso_error' && (
id && handleDismiss(id)}
- body={
+ content={
<>
- {!newNotificationStyle && (
- <>
- {' '}
- >
- )}
{t('generic_something_went_wrong')}.
{error?.translatedMessage
diff --git a/services/web/frontend/js/features/project-list/components/notifications/ieee-retirement-banner.tsx b/services/web/frontend/js/features/project-list/components/notifications/ieee-retirement-banner.tsx
index e1fd4e90f1..01453e5896 100644
--- a/services/web/frontend/js/features/project-list/components/notifications/ieee-retirement-banner.tsx
+++ b/services/web/frontend/js/features/project-list/components/notifications/ieee-retirement-banner.tsx
@@ -49,10 +49,9 @@ export default function IEEERetirementBanner({
return (
,
+ 'type' | 'action' | 'content' | 'onDismiss' | 'className'
+>
+
+function Notification({ className, ...props }: NotificationProps) {
+ const notificationComponent = (
+
+ )
+
+ return notificationComponent ? (
+
+ {notificationComponent}
+
+ ) : null
}
-/**
- * Renders either a legacy-styled notification using Boostrap `Alert`, or a new-styled notification using
- * the shared `Notification` component.
- *
- * The content of the notification is provided either with `children` (keeping backwards compatibility),
- * or a `body` prop (along with an optional `action`).
- *
- * When the content is provided via `body` prop the notification is rendered with the new Notification component
- * if `ol-newNotificationStyle` meta is set to true.
- */
-function Notification({
- bsStyle,
- children,
- onDismiss,
- className,
- body,
- action,
- newNotificationStyle,
- ...props
-}: NotificationProps) {
- newNotificationStyle =
- newNotificationStyle ?? getMeta('ol-newNotificationStyle')
-
- const [show, setShow] = useState(true)
-
- const handleDismiss = () => {
- if (onDismiss) {
- onDismiss()
- }
-
- setShow(false)
- }
-
- if (!show) {
- return null
- }
-
- if (newNotificationStyle && body) {
- const newNotificationType = (
- bsStyle === 'danger' ? 'error' : bsStyle
- ) as NotificationType
- return (
-
-
-
- )
- }
-
- if (body) {
- return (
-
-
- {body}
- {action && {action}}
- {onDismiss ? (
-
-
-
- ) : null}
-
-
- )
- } else {
- return (
-
-
- {children}
- {onDismiss ? (
-
-
-
- ) : null}
-
-
- )
- }
-}
-
-Notification.Body = Body
-Notification.Action = Action
-
export default Notification
diff --git a/services/web/frontend/js/features/project-list/components/notifications/user-notifications.tsx b/services/web/frontend/js/features/project-list/components/notifications/user-notifications.tsx
index 83f5a43eca..f77a949264 100644
--- a/services/web/frontend/js/features/project-list/components/notifications/user-notifications.tsx
+++ b/services/web/frontend/js/features/project-list/components/notifications/user-notifications.tsx
@@ -10,7 +10,6 @@ import getMeta from '../../../../utils/meta'
import importOverleafModules from '../../../../../macros/import-overleaf-module.macro'
import customLocalStorage from '../../../../infrastructure/local-storage'
import { sendMB } from '../../../../infrastructure/event-tracking'
-import classNames from 'classnames'
import GeoBanners from './geo-banners'
import AccessibilitySurveyBanner from './accessibility-survey-banner'
@@ -23,7 +22,6 @@ const EnrollmentNotification: JSXElementConstructor<{
}> = enrollmentNotificationModule?.import.default
function UserNotifications() {
- const newNotificationStyle = getMeta('ol-newNotificationStyle')
const groupSubscriptionsPendingEnrollment =
getMeta('ol-groupSubscriptionsPendingEnrollment') || []
const user = getMeta('ol-user')
@@ -54,11 +52,7 @@ function UserNotifications() {
const [dismissedWritefull, setDismissedWritefull] = useState(false)
return (
-
+
{EnrollmentNotification &&
groupSubscriptionsPendingEnrollment.map(subscription => (
diff --git a/services/web/frontend/js/features/project-list/components/notifications/writefull-premium-promo-banner.tsx b/services/web/frontend/js/features/project-list/components/notifications/writefull-premium-promo-banner.tsx
index dbe075e77a..dd2a33368f 100644
--- a/services/web/frontend/js/features/project-list/components/notifications/writefull-premium-promo-banner.tsx
+++ b/services/web/frontend/js/features/project-list/components/notifications/writefull-premium-promo-banner.tsx
@@ -3,6 +3,7 @@ import Notification from './notification'
import { sendMB } from '@/infrastructure/event-tracking'
import customLocalStorage from '@/infrastructure/local-storage'
import WritefullLogo from '@/shared/svgs/writefull-logo'
+import OLButton from '@/features/ui/components/ol/ol-button'
const eventSegmentation = {
location: 'dashboard-banner',
@@ -33,10 +34,9 @@ function WritefullPremiumPromoBanner({
return (
Enjoying Writefull? Get 10% off Writefull Premium,
giving you access to TeXGPT—AI assistance to generate LaTeX code.
@@ -44,8 +44,8 @@ function WritefullPremiumPromoBanner({
>
}
action={
-
{' '}
Get Writefull Premium
-
+
}
/>
diff --git a/services/web/frontend/js/features/project-list/components/project-list-root.tsx b/services/web/frontend/js/features/project-list/components/project-list-root.tsx
index 98c7419ea1..6648413670 100644
--- a/services/web/frontend/js/features/project-list/components/project-list-root.tsx
+++ b/services/web/frontend/js/features/project-list/components/project-list-root.tsx
@@ -29,6 +29,7 @@ import { SplitTestProvider } from '@/shared/context/split-test-context'
import OLCol from '@/features/ui/components/ol/ol-col'
import { bsVersion } from '@/features/utils/bootstrap-5'
import classnames from 'classnames'
+import Notification from '@/shared/components/notification'
function ProjectListRoot() {
const { isReady } = useWaitForI18n()
@@ -127,7 +128,12 @@ function ProjectListPageContent() {
/>
-
+
@@ -199,10 +205,12 @@ function DashApiError() {
xs={{ span: 8, offset: 2 }}
bs3Props={{ xs: 8, xsOffset: 2 }}
aria-live="polite"
- className="text-center"
>
-
- {t('generic_something_went_wrong')}
+
+
diff --git a/services/web/frontend/js/features/project-list/components/survey-widget.tsx b/services/web/frontend/js/features/project-list/components/survey-widget.tsx
index c2874c0ef2..1695ec8d80 100644
--- a/services/web/frontend/js/features/project-list/components/survey-widget.tsx
+++ b/services/web/frontend/js/features/project-list/components/survey-widget.tsx
@@ -2,6 +2,7 @@ import usePersistedState from '../../../shared/hooks/use-persisted-state'
import getMeta from '../../../utils/meta'
import { useCallback } from 'react'
import Close from '@/shared/components/close'
+import { bsVersion } from '@/features/utils/bootstrap-5'
export default function SurveyWidget() {
const survey = getMeta('ol-survey')
@@ -21,7 +22,13 @@ export default function SurveyWidget() {
return (
-
+
{survey.preText}
size?: 'small' | 'default' | 'large'
diff --git a/services/web/frontend/js/shared/components/notification.tsx b/services/web/frontend/js/shared/components/notification.tsx
index 9e5096152f..0043168bd7 100644
--- a/services/web/frontend/js/shared/components/notification.tsx
+++ b/services/web/frontend/js/shared/components/notification.tsx
@@ -15,7 +15,7 @@ export type NotificationProps = {
ariaLive?: 'polite' | 'off' | 'assertive'
className?: string
content: React.ReactNode
- customIcon?: React.ReactElement
+ customIcon?: React.ReactElement | null
disclaimer?: React.ReactElement | string
isDismissible?: boolean
isActionBelowContent?: boolean
@@ -78,6 +78,8 @@ function Notification({
if (onDismiss) onDismiss()
}
+ // return null
+
if (!show) {
return null
}
@@ -89,7 +91,9 @@ function Notification({
role="alert"
id={id}
>
-
+ {customIcon !== null && (
+
+ )}
diff --git a/services/web/frontend/js/utils/meta.ts b/services/web/frontend/js/utils/meta.ts
index f83af4fc48..66697f8b95 100644
--- a/services/web/frontend/js/utils/meta.ts
+++ b/services/web/frontend/js/utils/meta.ts
@@ -133,7 +133,6 @@ export interface Meta {
'ol-memberGroupSubscriptions': MemberGroupSubscription[]
'ol-memberOfSSOEnabledGroups': GroupSSOLinkingStatus[]
'ol-members': MinimalUser[]
- 'ol-newNotificationStyle': boolean
'ol-no-single-dollar': boolean
'ol-notifications': NotificationType[]
'ol-notificationsInstitution': InstitutionType[]
diff --git a/services/web/frontend/stories/project-list/notifications-new.stories.tsx b/services/web/frontend/stories/project-list/notifications-new.stories.tsx
index e2330b0d5e..faf56393a3 100644
--- a/services/web/frontend/stories/project-list/notifications-new.stories.tsx
+++ b/services/web/frontend/stories/project-list/notifications-new.stories.tsx
@@ -25,7 +25,6 @@ export const ProjectInvite = (args: any) => {
token: 'abcdef',
},
})
- window.metaAttributesCache.set('ol-newNotificationStyle', true)
return (
@@ -44,7 +43,6 @@ export const ProjectInviteNetworkError = (args: any) => {
token: 'abcdef',
},
})
- window.metaAttributesCache.set('ol-newNotificationStyle', true)
return (
@@ -58,7 +56,6 @@ export const Wfh2020UpgradeOffer = (args: any) => {
_id: 1,
templateKey: 'wfh_2020_upgrade_offer',
})
- window.metaAttributesCache.set('ol-newNotificationStyle', true)
return (
@@ -77,7 +74,6 @@ export const IPMatchedAffiliationSsoEnabled = (args: any) => {
ssoEnabled: true,
},
})
- window.metaAttributesCache.set('ol-newNotificationStyle', true)
return (
@@ -96,7 +92,6 @@ export const IPMatchedAffiliationSsoDisabled = (args: any) => {
ssoEnabled: false,
},
})
- window.metaAttributesCache.set('ol-newNotificationStyle', true)
return (
@@ -113,7 +108,6 @@ export const TpdsFileLimit = (args: any) => {
projectName: 'Abc Project',
},
})
- window.metaAttributesCache.set('ol-newNotificationStyle', true)
return (
@@ -130,7 +124,6 @@ export const DropBoxDuplicateProjectNames = (args: any) => {
projectName: 'Abc Project',
},
})
- window.metaAttributesCache.set('ol-newNotificationStyle', true)
return (
@@ -144,7 +137,6 @@ export const DropBoxUnlinkedDueToLapsedReconfirmation = (args: any) => {
_id: 1,
templateKey: 'notification_dropbox_unlinked_due_to_lapsed_reconfirmation',
})
- window.metaAttributesCache.set('ol-newNotificationStyle', true)
return (
@@ -161,7 +153,6 @@ export const NotificationGroupInvitation = (args: any) => {
inviterName: 'John Doe',
},
})
- window.metaAttributesCache.set('ol-newNotificationStyle', true)
return (
@@ -178,7 +169,6 @@ export const NotificationGroupInvitationCancelSubscription = (args: any) => {
inviterName: 'John Doe',
},
})
- window.metaAttributesCache.set('ol-newNotificationStyle', true)
window.metaAttributesCache.set('ol-hasIndividualRecurlySubscription', true)
return (
@@ -190,7 +180,6 @@ export const NotificationGroupInvitationCancelSubscription = (args: any) => {
export const NonSpecificMessage = (args: any) => {
useFetchMock(commonSetupMocks)
setCommonMeta({ _id: 1, html: 'Non specific message' })
- window.metaAttributesCache.set('ol-newNotificationStyle', true)
return (
@@ -204,7 +193,6 @@ export const InstitutionSsoAvailable = (args: any) => {
_id: 1,
templateKey: 'notification_institution_sso_available',
})
- window.metaAttributesCache.set('ol-newNotificationStyle', true)
return (
@@ -218,7 +206,6 @@ export const InstitutionSsoLinked = (args: any) => {
_id: 1,
templateKey: 'notification_institution_sso_linked',
})
- window.metaAttributesCache.set('ol-newNotificationStyle', true)
return (
@@ -232,7 +219,6 @@ export const InstitutionSsoNonCanonical = (args: any) => {
_id: 1,
templateKey: 'notification_institution_sso_non_canonical',
})
- window.metaAttributesCache.set('ol-newNotificationStyle', true)
return (
@@ -246,7 +232,6 @@ export const InstitutionSsoAlreadyRegistered = (args: any) => {
_id: 1,
templateKey: 'notification_institution_sso_already_registered',
})
- window.metaAttributesCache.set('ol-newNotificationStyle', true)
return (
@@ -264,7 +249,6 @@ export const InstitutionSsoError = (args: any) => {
tryAgain: true,
},
})
- window.metaAttributesCache.set('ol-newNotificationStyle', true)
return (
@@ -275,7 +259,6 @@ export const InstitutionSsoError = (args: any) => {
export const ResendConfirmationEmail = (args: any) => {
useFetchMock(reconfirmationSetupMocks)
setReconfirmationMeta()
- window.metaAttributesCache.set('ol-newNotificationStyle', true)
return (
@@ -286,7 +269,6 @@ export const ResendConfirmationEmail = (args: any) => {
export const ResendConfirmationEmailNetworkError = (args: any) => {
useFetchMock(errorsMocks)
setReconfirmationMeta()
- window.metaAttributesCache.set('ol-newNotificationStyle', true)
return (
@@ -300,7 +282,6 @@ export const ReconfirmAffiliation = (args: any) => {
window.metaAttributesCache.set('ol-allInReconfirmNotificationPeriods', [
fakeReconfirmationUsersData,
])
- window.metaAttributesCache.set('ol-newNotificationStyle', true)
return (
@@ -314,7 +295,6 @@ export const ReconfirmAffiliationNetworkError = (args: any) => {
window.metaAttributesCache.set('ol-allInReconfirmNotificationPeriods', [
fakeReconfirmationUsersData,
])
- window.metaAttributesCache.set('ol-newNotificationStyle', true)
return (
@@ -326,7 +306,6 @@ export const ReconfirmedAffiliationSuccess = (args: any) => {
useFetchMock(reconfirmAffiliationSetupMocks)
setReconfirmAffiliationMeta()
window.metaAttributesCache.set('ol-userEmails', [fakeReconfirmationUsersData])
- window.metaAttributesCache.set('ol-newNotificationStyle', true)
return (
diff --git a/services/web/frontend/stylesheets/bootstrap-5/pages/all.scss b/services/web/frontend/stylesheets/bootstrap-5/pages/all.scss
index c30615f6c7..099ae7525c 100644
--- a/services/web/frontend/stylesheets/bootstrap-5/pages/all.scss
+++ b/services/web/frontend/stylesheets/bootstrap-5/pages/all.scss
@@ -1,2 +1,3 @@
@import 'account-settings';
@import 'project-list';
+@import 'sidebar-v2-dash-pane';
diff --git a/services/web/frontend/stylesheets/bootstrap-5/pages/project-list.scss b/services/web/frontend/stylesheets/bootstrap-5/pages/project-list.scss
index 25edd9630d..71ca853477 100644
--- a/services/web/frontend/stylesheets/bootstrap-5/pages/project-list.scss
+++ b/services/web/frontend/stylesheets/bootstrap-5/pages/project-list.scss
@@ -168,3 +168,54 @@
}
}
}
+
+.survey-notification {
+ display: flex;
+ flex-wrap: wrap;
+ padding: var(--spacing-06);
+ background-color: var(--bg-dark-tertiary);
+ border-color: transparent;
+ color: var(--neutral-20);
+ box-shadow: 2px 4px 6px rgba(0, 0, 0, 0.25);
+ border-radius: var(--border-radius-base);
+
+ @include media-breakpoint-up(md) {
+ flex-wrap: nowrap;
+ }
+
+ button.close {
+ @extend .text-white;
+ padding: 0;
+ -webkit-appearance: none;
+ }
+}
+
+.project-list-sidebar-survey-wrapper {
+ position: sticky;
+ bottom: 0;
+
+ .survey-notification {
+ font-size: var(--font-size-02);
+
+ a {
+ text-decoration: none;
+ }
+ }
+
+ @include media-breakpoint-down(md) {
+ position: static;
+ margin-top: var(--spacing-05);
+
+ .survey-notification {
+ font-size: unset;
+
+ .project-list-sidebar-survey-link {
+ display: block;
+ align-items: center;
+ min-width: 48px;
+ min-height: 48px;
+ padding-top: var(--spacing-07);
+ }
+ }
+ }
+}
diff --git a/services/web/frontend/stylesheets/bootstrap-5/pages/sidebar-v2-dash-pane.scss b/services/web/frontend/stylesheets/bootstrap-5/pages/sidebar-v2-dash-pane.scss
new file mode 100644
index 0000000000..d5236f586d
--- /dev/null
+++ b/services/web/frontend/stylesheets/bootstrap-5/pages/sidebar-v2-dash-pane.scss
@@ -0,0 +1,13 @@
+.project-list-sidebar-survey-link {
+ @extend .text-white;
+ font-weight: bold;
+}
+
+.notification-close-button-style button {
+ &:hover {
+ background-color: transparent !important;
+ }
+ &:focus {
+ background-color: transparent !important;
+ }
+}
diff --git a/services/web/test/frontend/features/project-list/components/table/projects-action-modal.test.tsx b/services/web/test/frontend/features/project-list/components/table/projects-action-modal.test.tsx
index 514d17d1fe..8476f64580 100644
--- a/services/web/test/frontend/features/project-list/components/table/projects-action-modal.test.tsx
+++ b/services/web/test/frontend/features/project-list/components/table/projects-action-modal.test.tsx
@@ -67,10 +67,10 @@ describe('', function () {
await waitFor(() => {
const alerts = screen.getAllByRole('alert')
expect(alerts.length).to.equal(2)
- expect(alerts[0].textContent).to.equal(
+ expect(alerts[0].textContent).to.contain(
`${projectsData[2].name}Something went wrong. Please try again.`
)
- expect(alerts[1].textContent).to.equal(
+ expect(alerts[1].textContent).to.contain(
`${projectsData[3].name}Something went wrong. Please try again.`
)
})