Skip to content

Commit 474667f

Browse files
authored
Merge pull request #414 from zhx828/add-user-banner
Include a global banner for personalized message
2 parents d94354e + b2b50e9 commit 474667f

File tree

9 files changed

+184
-46
lines changed

9 files changed

+184
-46
lines changed

k8s/oncokb-public-local.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ spec:
2222
spec:
2323
containers:
2424
- name: oncokb-public
25-
image: cbioportal/oncokb-public:2.3.3
25+
image: cbioportal/oncokb-public:2.3.4
2626
env:
2727
- name: SPRING_PROFILES_ACTIVE
2828
value: prod,no-liquibase

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
"availity-reactstrap-validation": "2.5.1",
2929
"axios": "0.19.0",
3030
"bootstrap": "4.4.1",
31-
"cbioportal-frontend-commons": "^0.0.23",
31+
"cbioportal-frontend-commons": "0.2.8",
3232
"classnames": "^2.2.6",
3333
"font-awesome": "^4.7.0",
3434
"history": "^4.10.1",

pom.xml

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
<groupId>org.mskcc.cbio.oncokb</groupId>
77
<artifactId>public-website</artifactId>
8-
<version>2.3.3</version>
8+
<version>2.3.4</version>
99
<packaging>jar</packaging>
1010
<name>OncoKB Public Website</name>
1111

@@ -621,7 +621,7 @@
621621
<image>adoptopenjdk:11-jre-hotspot</image>
622622
</from>
623623
<to>
624-
<image>cbioportal/oncokb-public:2.3.3</image>
624+
<image>cbioportal/oncokb-public:2.3.4</image>
625625
</to>
626626
<container>
627627
<entrypoint>

src/main/docker/app.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
version: '2'
22
services:
33
oncokb-app:
4-
image: cbioportal/oncokb-public:2.3.3
4+
image: cbioportal/oncokb-public:2.3.4
55
environment:
66
- _JAVA_OPTIONS=-Xmx512m -Xms256m
77
- SPRING_PROFILES_ACTIVE=prod,swagger

src/main/webapp/app/components/Header.tsx

+35-31
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import AccountMenu from 'app/pages/menus/account';
1010
import mskIcon from 'content/images/msk-icon-fff-sm.png';
1111
import { action, observable } from 'mobx';
1212
import { PAGE_TITLE } from 'app/config/constants';
13+
import UserMessager from 'app/components/userMessager/UserMessage';
1314

1415
export interface IHeaderProps {
1516
isUserAuthenticated: boolean;
@@ -70,37 +71,40 @@ class Header extends React.Component<IHeaderProps> {
7071

7172
public render() {
7273
return (
73-
<header className="sticky-top header">
74-
<Navbar
75-
bg="primary"
76-
expand="lg"
77-
className="navbar-dark main-navbar"
78-
expanded={this.isNavExpanded}
79-
>
80-
<Container fluid={!this.props.windowStore.isXLscreen}>
81-
<Navbar.Brand>
82-
<NavLink to="/">
83-
<img height={38} src={oncokbImg} alt={'OncoKB'} />
84-
</NavLink>
85-
</Navbar.Brand>
86-
<Navbar.Toggle onClick={this.toggleNav} />
87-
<Navbar.Collapse onClick={(event: any) => this.closeNav(event)}>
88-
<Nav className="mr-auto">
89-
{this.subPages.map(page => this.getLink(page))}
90-
</Nav>
91-
<Nav>
92-
<AccountMenu
93-
isAuthenticated={this.props.isUserAuthenticated}
94-
isAdmin={this.props.isAdmin}
95-
/>
96-
<Nav.Item>
97-
<img alt="mskcc-logo" src={mskIcon} height={'37px'} />
98-
</Nav.Item>
99-
</Nav>
100-
</Navbar.Collapse>
101-
</Container>
102-
</Navbar>
103-
</header>
74+
<>
75+
<UserMessager windowStore={this.props.windowStore} />
76+
<header className="sticky-top header">
77+
<Navbar
78+
bg="primary"
79+
expand="lg"
80+
className="navbar-dark main-navbar"
81+
expanded={this.isNavExpanded}
82+
>
83+
<Container fluid={!this.props.windowStore.isXLscreen}>
84+
<Navbar.Brand>
85+
<NavLink to="/">
86+
<img height={38} src={oncokbImg} alt={'OncoKB'} />
87+
</NavLink>
88+
</Navbar.Brand>
89+
<Navbar.Toggle onClick={this.toggleNav} />
90+
<Navbar.Collapse onClick={(event: any) => this.closeNav(event)}>
91+
<Nav className="mr-auto">
92+
{this.subPages.map(page => this.getLink(page))}
93+
</Nav>
94+
<Nav>
95+
<AccountMenu
96+
isAuthenticated={this.props.isUserAuthenticated}
97+
isAdmin={this.props.isAdmin}
98+
/>
99+
<Nav.Item style={{ paddingRight: 0 }}>
100+
<img alt="mskcc-logo" src={mskIcon} height={'37px'} />
101+
</Nav.Item>
102+
</Nav>
103+
</Navbar.Collapse>
104+
</Container>
105+
</Navbar>
106+
</header>
107+
</>
104108
);
105109
}
106110
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
import * as React from 'react';
2+
import { observer } from 'mobx-react';
3+
import { remoteData, isWebdriver } from 'cbioportal-frontend-commons';
4+
import { action, computed, observable } from 'mobx';
5+
import autobind from 'autobind-decorator';
6+
import * as _ from 'lodash';
7+
import styles from './styles.module.scss';
8+
import classNames from 'classnames';
9+
import { getBrowserWindow } from 'cbioportal-frontend-commons';
10+
import { Container } from 'react-bootstrap';
11+
import WindowStore from 'app/store/WindowStore';
12+
13+
export interface IUserMessage {
14+
dateStart?: number;
15+
dateEnd: number;
16+
content: string;
17+
id: string;
18+
}
19+
20+
function makeMessageKey(id: string) {
21+
return `portalMessageKey-${id}`;
22+
}
23+
24+
// ADD MESSAGE IN FOLLOWING FORMAT
25+
// UNIQUE ID IS IMPORTANT B/C WE REMEMBER A MESSAGE HAS BEEN SHOWN
26+
// BASED ON USERS LOCALSTORAGE
27+
let MESSAGE_DATA: IUserMessage[];
28+
29+
if (
30+
['beta.oncokb.org', 'www.oncokb.org'].includes(
31+
getBrowserWindow().location.hostname
32+
)
33+
) {
34+
MESSAGE_DATA = [
35+
// ADD MESSAGE IN FOLLOWING FORMAT
36+
// UNIQUE ID IS IMPORTANT B/C WE REMEMBER A MESSAGE HAS BEEN SHOWN
37+
// BASED ON USERS LOCALSTORAGE
38+
{
39+
dateEnd: 100000000000000,
40+
content: `Join our webinar to learn how to use OncoKB effectively. First webinar <strong>May 7th 3pm-4pm EDT</strong>. <a class="btn btn-secondary btn-sm ml-2" target="_blank" href="https://meetmsk.zoom.us/meeting/register/vJcvf-CvrzsshBK8VEiD5J9DSRDf7C--qg">Click here to register!</a>`,
41+
id: '2020_spring_webinar'
42+
}
43+
];
44+
}
45+
46+
@observer
47+
export default class UserMessager extends React.Component<
48+
{
49+
dataUrl?: string;
50+
windowStore: WindowStore;
51+
},
52+
{}
53+
> {
54+
messageData = remoteData<IUserMessage[]>(async () => {
55+
return Promise.resolve(MESSAGE_DATA);
56+
});
57+
58+
@observable dismissed = false;
59+
60+
get shownMessage() {
61+
const messageToShow = _.find(this.messageData.result, message => {
62+
const notYetShown = !localStorage.getItem(makeMessageKey(message.id));
63+
const expired = Date.now() > message.dateEnd;
64+
return notYetShown && !expired;
65+
});
66+
67+
return messageToShow;
68+
}
69+
70+
@autobind
71+
close() {
72+
this.markMessageDismissed(this.shownMessage!);
73+
}
74+
75+
@action
76+
markMessageDismissed(message: IUserMessage) {
77+
localStorage.setItem(makeMessageKey(message.id), 'shown');
78+
this.dismissed = true;
79+
}
80+
81+
render() {
82+
if (!this.dismissed && this.messageData.isComplete && this.shownMessage) {
83+
return (
84+
<div className={styles.messager}>
85+
<Container
86+
fluid={!this.props.windowStore.isXLscreen}
87+
className={styles.messagerContainer}
88+
>
89+
<div
90+
className={styles.message}
91+
dangerouslySetInnerHTML={{
92+
__html: this.shownMessage.content
93+
}}
94+
></div>
95+
<i
96+
className={classNames(styles.close, 'fa', 'fa-close')}
97+
onClick={this.close}
98+
/>
99+
</Container>
100+
</div>
101+
);
102+
} else {
103+
return null;
104+
}
105+
}
106+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
.messager {
2+
padding: 10px 0;
3+
background: green;
4+
color: #fff;
5+
font-size: 14px;
6+
position: relative;
7+
8+
.messagerContainer {
9+
display: flex;
10+
justify-content: space-between;
11+
align-items: center;
12+
}
13+
14+
i.close {
15+
cursor: pointer;
16+
}
17+
}

src/main/webapp/app/layout.scss

+2-2
Original file line numberDiff line numberDiff line change
@@ -79,15 +79,15 @@
7979

8080
.navbar-nav > .nav-item,
8181
#account-menu > a {
82-
padding: 1rem 0.5rem !important;
82+
padding: 1rem 0.5rem;
8383
margin: 0;
8484
}
8585
}
8686

8787
@include media-breakpoint-up(xl) {
8888
.navbar-nav > .nav-item,
8989
#account-menu > a {
90-
padding: 1rem 0.875rem !important;
90+
padding: 1rem 0.875rem;
9191
margin: 0;
9292
}
9393
}

yarn.lock

+19-8
Original file line numberDiff line numberDiff line change
@@ -3831,29 +3831,27 @@ caseless@^0.12.0, caseless@~0.12.0:
38313831
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
38323832
integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
38333833

3834-
cbioportal-frontend-commons@^0.0.23:
3835-
version "0.0.23"
3836-
resolved "https://registry.yarnpkg.com/cbioportal-frontend-commons/-/cbioportal-frontend-commons-0.0.23.tgz#1bd3f2d2a59f5b9b718eb66e862e9ca374a22cf8"
3837-
integrity sha512-6jdSgduNDCiJuXW05Of/eC6V3JVrEUcOWtao/tex0PdG6nAV0F5H+QeVIkiQ6GVF21LSrB9Loc+vrVklXOmWXQ==
3834+
cbioportal-frontend-commons@0.2.8:
3835+
version "0.2.8"
3836+
resolved "https://registry.yarnpkg.com/cbioportal-frontend-commons/-/cbioportal-frontend-commons-0.2.8.tgz#9de6a232c845dfdaa5ec739a7d31b328aa281e20"
3837+
integrity sha512-a1gacvm9Pz2lW4lllYT3fY5ymoPgTVjVKb2oKb7zBHuxzr92oXVYV0kn25eXDqtjkY0VV7vDZXhX5JhW0HFEaw==
38383838
dependencies:
38393839
autobind-decorator "^2.1.0"
3840-
babel-polyfill "^6.22.0"
38413840
classnames "^2.2.5"
38423841
jquery "^3.2.1"
38433842
lodash "^4.17.11"
38443843
measure-text "0.0.4"
3845-
mobx "^3.1.7"
3846-
mobx-react "^4.1.3"
38473844
mobxpromise "github:cbioportal/mobxpromise#v1.0.2"
38483845
object-sizeof "^1.2.0"
3846+
oncokb-ts-api-client "^1.0.1"
38493847
rc-tooltip "3.7.3"
3850-
react "^16.8.4"
38513848
react-file-download "^0.3.2"
38523849
react-select "^3.0.4"
38533850
save-svg-as-png "^1.4.6"
38543851
seamless-immutable "^7.0.1"
38553852
superagent "^3.8.3"
38563853
svg2pdf.js "^1.3.3"
3854+
typescript "3.8.3"
38573855
url "^0.11.0"
38583856

38593857
cbioportal-frontend-commons@^0.0.27:
@@ -10818,6 +10816,14 @@ oncokb-styles@^0.1.1, oncokb-styles@~0.1.2:
1081810816
resolved "https://registry.yarnpkg.com/oncokb-styles/-/oncokb-styles-0.1.2.tgz#8b26c0a0829787cdc1b595d3a021b3266607102b"
1081910817
integrity sha512-tuy5s3qFxgf1ogMATQSRPNgLlAMrvOOTCAN1dm/wJ+VZoStbJ7g36/qHwc99UPfh3vrB05broLodF+k58p5tUw==
1082010818

10819+
oncokb-ts-api-client@^1.0.1:
10820+
version "1.0.1"
10821+
resolved "https://registry.yarnpkg.com/oncokb-ts-api-client/-/oncokb-ts-api-client-1.0.1.tgz#6683017d5a4bc3d8816af54dfbd712c228fb1a99"
10822+
integrity sha512-T/QK23ZEu6BhWVA+P4oMPF+AlJ2ZRRueIGlhinE1F1zXoFTel7LNkasEk7oqNdI2a9WbHPRwc/dy8CIaQKkhIA==
10823+
dependencies:
10824+
superagent "^3.8.3"
10825+
typescript "3.8.3"
10826+
1082110827
1082210828
version "0.0.4"
1082310829
resolved "https://registry.yarnpkg.com/one-time/-/one-time-0.0.4.tgz#f8cdf77884826fe4dff93e3a9cc37b1e4480742e"
@@ -15201,6 +15207,11 @@ [email protected]:
1520115207
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.3.tgz#b36840668a16458a7025b9eabfad11b66ab85c69"
1520215208
integrity sha512-Mcr/Qk7hXqFBXMN7p7Lusj1ktCBydylfQM/FZCk5glCNQJrCUKPkMHdo9R0MTFWsC/4kPFvDS0fDPvukfCkFsw==
1520315209

15210+
15211+
version "3.8.3"
15212+
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061"
15213+
integrity sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==
15214+
1520415215
1520515216
version "0.7.17"
1520615217
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac"

0 commit comments

Comments
 (0)