diff --git a/src/views/annual-report/annual-report.jsx b/src/views/annual-report/annual-report.jsx
index 40dbf6e5c..a26f2617b 100644
--- a/src/views/annual-report/annual-report.jsx
+++ b/src/views/annual-report/annual-report.jsx
@@ -1,27 +1,27 @@
const bindAll = require('lodash.bindall');
const classNames = require('classnames');
+const React = require('react');
+const MediaQuery = require('react-responsive').default;
const FormattedHTMLMessage = require('react-intl').FormattedHTMLMessage;
const FormattedMessage = require('react-intl').FormattedMessage;
const injectIntl = require('react-intl').injectIntl;
const intlShape = require('react-intl').intlShape;
-const React = require('react');
+const render = require('../../lib/render.jsx');
+const frameless = require('../../lib/frameless');
+
+const Page = require('../../components/page/www/page.jsx');
const Button = require('../../components/forms/button.jsx');
const FlexRow = require('../../components/flex-row/flex-row.jsx');
const Comment = require('../../components/comment/comment.jsx');
-const People = require('./people.json');
-const PeopleGrid = require('../../components/people-grid/people-grid.jsx');
const WorldMap = require('../../components/world-map/world-map.jsx');
const CountryUsage = require('./country-usage.json');
-
-const Page = require('../../components/page/www/page.jsx');
-const render = require('../../lib/render.jsx');
-
-const MediaQuery = require('react-responsive').default;
-const frameless = require('../../lib/frameless');
+const PeopleGrid = require('../../components/people-grid/people-grid.jsx');
+const People = require('./people.json');
require('./annual-report.scss');
+// Some constants used for the page subnav and section refs
const SECTIONS = {
message: 'message',
mission: 'mission',
@@ -46,6 +46,7 @@ const SECTION_NAMES = {
donate:
};
+// Constants used for world map data processing/formatting for use with Plotly
const countryKeys = Object.keys(CountryUsage);
const countryNames = countryKeys.map(key => CountryUsage[key].display);
const countryData = countryKeys.map(key => CountryUsage[key].count);
@@ -64,7 +65,7 @@ class AnnualReport extends React.Component {
this.subnavRef = null;
this.state = {
- currentlyVisible: SECTIONS.message,
+ currentlyVisible: SECTIONS.message, // The currently visible section
dropdownVisible: false
};
@@ -90,8 +91,8 @@ class AnnualReport extends React.Component {
// A generic handler for a subnav item that takes the name of the
// section to scroll to (all lowercase)
handleSubnavItemClick (sectionName) {
- // Return a button click handler that scrolls to the
- // correct section
+ // Return a button click handler that will close the dropdown if open
+ // and scrolls to the correct section
return () => {
this.setState({dropdownVisible: false});
this.scrollTo(this.sectionRefs[sectionName]);
@@ -107,6 +108,8 @@ class AnnualReport extends React.Component {
}
}
+ // Generically create a ref for the given section, stored in
+ // this.sectionRefs
setRef (sectionName) {
return ref => (this.sectionRefs[sectionName] = ref);
}
@@ -115,6 +118,8 @@ class AnnualReport extends React.Component {
this.subnavRef = ref;
}
+ // Calculate the dimensions of a given section for use in figuring out
+ // which section is currently visible
getDimensionsOfSection (sectionRef) {
const {height} = sectionRef.getBoundingClientRect();
const offsetTop = sectionRef.offsetTop;
@@ -127,6 +132,7 @@ class AnnualReport extends React.Component {
};
}
+ // While scrolling, update the subnav to reflect the currently visible section
handleScroll () {
const subnavHeight = this.getDimensionsOfSection(this.subnavRef).height;
// The additional 50 is to account for the main site nav height
@@ -146,86 +152,90 @@ class AnnualReport extends React.Component {
}
}
+ // Click handler for responsive subnav dropdown
handleDropDownClick () {
this.setState({dropdownVisible: !this.state.dropdownVisible});
}
render () {
- const subnav = (
-
- {SECTION_NAMES.message}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-
+ // Element containing buttons to scroll to each of the sections in the
+ // annual report. The layout of this component will be different on
+ // different screen sizes (see below)
+ const subnav =
+ (
+
+ {SECTION_NAMES.message}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
return (
@@ -364,7 +374,6 @@ class AnnualReport extends React.Component {
{/*
@@ -372,7 +381,6 @@ class AnnualReport extends React.Component {
@@ -584,7 +592,6 @@ class AnnualReport extends React.Component {
@@ -698,7 +705,7 @@ class AnnualReport extends React.Component {
-
+
@@ -725,7 +732,6 @@ class AnnualReport extends React.Component {
{/*
@@ -733,7 +739,6 @@ class AnnualReport extends React.Component {
@@ -871,7 +876,6 @@ class AnnualReport extends React.Component {
@@ -1149,7 +1153,6 @@ class AnnualReport extends React.Component {
@@ -1238,7 +1241,6 @@ class AnnualReport extends React.Component {