Skip to content

Commit 6fa7dad

Browse files
committed
DBC22-6585: highlighted advisory for new updates
DBC22-6585: highlighted advisory for new updates 2 DBC22-6585: highlighted bulletin for new updates
1 parent 126ee87 commit 6fa7dad

6 files changed

Lines changed: 462 additions & 68 deletions

File tree

src/frontend/src/Components/advisories/AdvisoriesList.js

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// React
2-
import React, { useContext } from 'react';
2+
import React, { useContext, useRef } from 'react';
33

44
// Navigation
55
import { useNavigate } from 'react-router-dom';
@@ -30,7 +30,8 @@ export default function AdvisoriesList(props) {
3030
const navigate = useNavigate();
3131

3232
// Props
33-
const { advisories, showDescription, showTimestamp, showPublished, isAdvisoriesListPage, showLoader } = props;
33+
const { advisories, showDescription, showTimestamp, showPublished, isAdvisoriesListPage, showLoader, trackedAdvisories = {}, advisoryRefs } = props;
34+
const { dismissHighlight } = props;
3435

3536
function handleClick(advisory, keyEvent) {
3637
// Ignore key presses that aren't enter or space
@@ -39,6 +40,12 @@ export default function AdvisoriesList(props) {
3940
}
4041

4142
trackEvent('click', 'advisories-list', 'Advisory', advisory.title, advisory.teaser);
43+
// dismissedHighlightsRef.current.add(advisory.id);
44+
// sessionStorage.setItem(
45+
// 'dismissedHighlights',
46+
// JSON.stringify([...dismissedHighlightsRef.current])
47+
// );
48+
dismissHighlight(advisory.id); // use parent's function
4249
navigate(`/advisories/${advisory.slug}`);
4350
}
4451

@@ -50,7 +57,12 @@ export default function AdvisoriesList(props) {
5057
{!!sortedAdvisories && sortedAdvisories.map((advisory, index) => {
5158
if (isAdvisoriesListPage) {
5259
return (
53-
<div className="advisory-li" key={advisory.id}>
60+
<div
61+
className={`advisory-li${trackedAdvisories[advisory.id]?.highlight ? ' highlighted' : ''}`}
62+
key={advisory.id}
63+
data-key={advisory.id}
64+
ref={(el) => { if (advisoryRefs) advisoryRefs.current[advisory.id] = el; }}
65+
>
5466
<div className="advisory-li__content">
5567
<div className="advisory-li__content__partition advisory-li-title-container">
5668
<div className="advisory-li-title link-div"
@@ -67,6 +79,9 @@ export default function AdvisoriesList(props) {
6779
<div className="timestamp-container">
6880
<span className="advisory-li-state">{advisory.first_published_at != advisory.last_published_at ? "Updated" : "Published" }</span>
6981
<FriendlyTime date={advisory.latest_revision_created_at} />
82+
{trackedAdvisories[advisory.id]?.highlight &&
83+
<div className="updated-pill">Updated</div>
84+
}
7085
</div>
7186
}
7287
</div>
@@ -97,6 +112,9 @@ export default function AdvisoriesList(props) {
97112
<div className="advisory-li__content__partition timestamp-container timestamp-container--mobile">
98113
<span className="advisory-li-state">{advisory.first_published_at != advisory.last_published_at ? "Updated" : "Published"}</span>
99114
<FriendlyTime date={advisory.latest_revision_created_at}/>
115+
{trackedAdvisories[advisory.id]?.highlight &&
116+
<div className="updated-pill">Updated</div>
117+
}
100118
</div>
101119
}
102120

@@ -141,6 +159,9 @@ export default function AdvisoriesList(props) {
141159
{!cmsContext.readAdvisories.includes(advisory.id.toString() + '-' + advisory.live_revision.toString()) && <div className="unread-display"></div>}
142160
<span className="advisory-li-state">{advisory.first_published_at != advisory.last_published_at ? "Updated" : "Published" }</span>
143161
<FriendlyTime date={advisory.latest_revision_created_at} />
162+
{trackedAdvisories[advisory.id]?.highlight &&
163+
<div className="updated-pill">Updated</div>
164+
}
144165
</div>
145166
}
146167

@@ -166,6 +187,9 @@ export default function AdvisoriesList(props) {
166187
<div className="timestamp-container timestamp-container--mobile">
167188
<span className="advisory-li-state">{advisory.first_published_at != advisory.last_published_at ? "Updated" : "Published" }</span>
168189
<FriendlyTime date={advisory.latest_revision_created_at} />
190+
{trackedAdvisories[advisory.id]?.highlight &&
191+
<div className="updated-pill">Updated</div>
192+
}
169193
</div>
170194
}
171195
</div>

src/frontend/src/Components/bulletins/BulletinsList.js

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,16 @@ import Skeleton from 'react-loading-skeleton';
1616
// Static files
1717
import logo from '../../images/dbc-logo--white.svg';
1818

19-
export default function Bulletins(props) {
20-
// State, props and context
21-
const { bulletins, showLoader } = props;
19+
export default function BulletinsList(props) {
20+
// Props
21+
const { bulletins, showLoader, trackedBulletins = {}, bulletinRefs, dismissHighlight } = props;
2222

2323
// Navigation
2424
const navigate = useNavigate();
2525

2626
function handleClick(bulletin) {
2727
trackEvent('click', 'bulletins-list', 'Bulletin', bulletin.title, bulletin.teaser);
28+
if (dismissHighlight) dismissHighlight(bulletin.id);
2829
navigate(`/bulletins/${bulletin.slug}`);
2930
}
3031

@@ -33,9 +34,14 @@ export default function Bulletins(props) {
3334
// Rendering
3435
return (
3536
<ul className='bulletins-list'>
36-
{!!sortedBulletins && sortedBulletins.map((bulletin, index) => {
37+
{!!sortedBulletins && sortedBulletins.map((bulletin) => {
3738
return (
38-
<li className='bulletin-li' key={bulletin.id} onClick={() => handleClick(bulletin)}
39+
<li
40+
className={`bulletin-li${trackedBulletins[bulletin.id]?.highlight ? ' highlighted' : ''}`}
41+
key={bulletin.id}
42+
data-key={bulletin.id}
43+
ref={(el) => { if (bulletinRefs) bulletinRefs.current[bulletin.id] = el; }}
44+
onClick={() => handleClick(bulletin)}
3945
onKeyDown={(keyEvent) => {
4046
if (['Enter', 'NumpadEnter'].includes(keyEvent.key)) {
4147
handleClick(bulletin);
@@ -45,7 +51,6 @@ export default function Bulletins(props) {
4551
<div className='bulletin-li-title-container' tabIndex={0}>
4652
{showLoader ?
4753
<p><Skeleton height={30} /></p> :
48-
4954
<h2 className='bulletin-li-title'>{bulletin.title}</h2>
5055
}
5156

@@ -54,18 +59,21 @@ export default function Bulletins(props) {
5459
<Skeleton height={10} />
5560
<Skeleton height={10} />
5661
</p> :
57-
5862
(bulletin.teaser &&
5963
<div className="bulletin-li-body">{bulletin.teaser}</div>
6064
)
6165
}
6266

6367
{showLoader ?
6468
<p><Skeleton width={150} height={10} /></p> :
65-
6669
<div className='timestamp-container'>
67-
<span className='bulletin-li-state'>{bulletin.first_published_at != bulletin.last_published_at ? 'Updated' : 'Published' }</span>
70+
<span className='bulletin-li-state'>
71+
{bulletin.first_published_at != bulletin.last_published_at ? 'Updated' : 'Published'}
72+
</span>
6873
<FriendlyTime date={bulletin.latest_revision_created_at} />
74+
{trackedBulletins[bulletin.id]?.highlight &&
75+
<div className="updated-pill">Updated</div>
76+
}
6977
</div>
7078
}
7179
</div>
@@ -74,7 +82,6 @@ export default function Bulletins(props) {
7482
<div className={bulletin.image_url ? 'bulletin-li-thumbnail' : 'bulletin-li-thumbnail-default'}>
7583
{showLoader ?
7684
<Skeleton width={320} height={200} /> :
77-
7885
<img className='thumbnail-logo' src={bulletin.image_url ? bulletin.image_url : logo} alt={bulletin.image_alt_text} />
7986
}
8087
</div>

0 commit comments

Comments
 (0)