From 60c28695561b4a14e8d2d91bca50306f5176f93e Mon Sep 17 00:00:00 2001 From: Kevin Li Date: Tue, 21 Nov 2017 16:07:10 -0500 Subject: [PATCH 01/28] Adding beta config flags --- sampleGlobalConstants_dev.js | 1 + sampleGlobalConstants_prod.js | 1 + src/_scss/layouts/default/header/_logo.scss | 41 ++++++++++--------- src/js/components/homepage/Homepage.jsx | 11 ++++- .../sharedComponents/header/Header.jsx | 8 +++- .../sharedComponents/header/NavBar.jsx | 9 +++- 6 files changed, 48 insertions(+), 23 deletions(-) diff --git a/sampleGlobalConstants_dev.js b/sampleGlobalConstants_dev.js index d2db6d76f4..8c8dd79439 100644 --- a/sampleGlobalConstants_dev.js +++ b/sampleGlobalConstants_dev.js @@ -7,6 +7,7 @@ const kGlobalConstants = { LOCAL: false, DEV: true, PERF_LOG: false, + IN_BETA: true, MAPBOX_TOKEN: '' }; diff --git a/sampleGlobalConstants_prod.js b/sampleGlobalConstants_prod.js index 9b9d7050a3..c5b03528b0 100644 --- a/sampleGlobalConstants_prod.js +++ b/sampleGlobalConstants_prod.js @@ -7,6 +7,7 @@ const kGlobalConstants = { LOCAL: false, DEV: false, PERF_LOG: false, + IN_BETA: true, MAPBOX_TOKEN: '' }; diff --git a/src/_scss/layouts/default/header/_logo.scss b/src/_scss/layouts/default/header/_logo.scss index 23418f4612..4527d22720 100644 --- a/src/_scss/layouts/default/header/_logo.scss +++ b/src/_scss/layouts/default/header/_logo.scss @@ -36,26 +36,29 @@ @include sr-only(); } } - &:after { - content: "BETA"; - background: $color-green-light; - color: $color-white; - font-size: rem(8); - font-weight: $font-semibold; - left: rem(195); - letter-spacing: 0.14rem; - padding: rem(2) rem(4); - position: absolute; - text-align: center; - top: rem(-2); - @include border-radius(2px); - @include media(360px) { - left: rem(228); - } - @include media($large-screen) { - font-size: rem(10); - left: rem(280); + + &.beta { + &:after { + content: "BETA"; + background: $color-green-light; + color: $color-white; + font-size: rem(8); + font-weight: $font-semibold; + left: rem(195); + letter-spacing: 0.14rem; + padding: rem(2) rem(4); + position: absolute; + text-align: center; top: rem(-2); + @include border-radius(2px); + @include media(360px) { + left: rem(228); + } + @include media($large-screen) { + font-size: rem(10); + left: rem(280); + top: rem(-2); + } } } } diff --git a/src/js/components/homepage/Homepage.jsx b/src/js/components/homepage/Homepage.jsx index 0704b44caa..ab4431ac85 100644 --- a/src/js/components/homepage/Homepage.jsx +++ b/src/js/components/homepage/Homepage.jsx @@ -11,6 +11,8 @@ import * as MetaTagHelper from 'helpers/metaTagHelper'; import GlossaryContainer from 'containers/glossary/GlossaryContainer'; +import kGlobalConstants from 'GlobalConstants'; + import HomepageStateModel from 'models/homepage/HomepageStateModel'; import MetaTags from '../sharedComponents/metaTags/MetaTags'; @@ -23,7 +25,7 @@ import CategoryMap from './visualizations/categoryMap/CategoryMap'; import SearchSection from './SearchSection'; import Footer from '../sharedComponents/Footer'; import WarningBanner from '../sharedComponents/header/WarningBanner'; -// import InfoBanner from '../sharedComponents/header/InfoBanner'; +import InfoBanner from '../sharedComponents/header/InfoBanner'; require('pages/homepage/homePage.scss'); @@ -171,6 +173,11 @@ export default class Homepage extends React.Component { } render() { + let banner = (); + if (kGlobalConstants.IN_BETA) { + banner = (); + } + return (
@@ -183,7 +190,7 @@ export default class Homepage extends React.Component {
- + {banner} diff --git a/src/js/components/sharedComponents/header/Header.jsx b/src/js/components/sharedComponents/header/Header.jsx index d3d3a70942..1c2d5f843f 100644 --- a/src/js/components/sharedComponents/header/Header.jsx +++ b/src/js/components/sharedComponents/header/Header.jsx @@ -1,8 +1,10 @@ import React from 'react'; import GlossaryContainer from 'containers/glossary/GlossaryContainer'; +import kGlobalConstants from 'GlobalConstants'; import WarningBanner from './WarningBanner'; +import InfoBanner from './InfoBanner'; import NavBar from './NavBar'; export default class Header extends React.Component { @@ -19,6 +21,10 @@ export default class Header extends React.Component { window.scrollTo(0, yPos); } render() { + let banner = () + if (kGlobalConstants.IN_BETA) { + banner = (); + } return (
- + {banner}
diff --git a/src/js/components/sharedComponents/header/NavBar.jsx b/src/js/components/sharedComponents/header/NavBar.jsx index 400377825c..97321f10de 100644 --- a/src/js/components/sharedComponents/header/NavBar.jsx +++ b/src/js/components/sharedComponents/header/NavBar.jsx @@ -4,6 +4,8 @@ import CSSTransitionGroup from 'react-transition-group/CSSTransitionGroup'; import GlossaryButtonWrapperContainer from 'containers/glossary/GlossaryButtonWrapperContainer'; +import kGlobalConstants from 'GlobalConstants'; + import NavBarGlossaryLink from './NavBarGlossaryLink'; import ProfileButton from './ProfileButton'; import MobileNav from './mobile/MobileNav'; @@ -61,6 +63,11 @@ export default class NavBar extends React.Component { homepageClass = 'homepage'; } + let betaClass = ''; + if (kGlobalConstants.IN_BETA) { + betaClass = 'beta'; + } + let mobileNav = null; if (this.state.showMobileNav) { mobileNav = ( @@ -74,7 +81,7 @@ export default class NavBar extends React.Component { className="nav-container" role="navigation">
- ); } } + +InfoBanner.propTypes = propTypes; + From e5310b3101568d818828d27d9a877bfa3150f4e8 Mon Sep 17 00:00:00 2001 From: Kevin Li Date: Mon, 27 Nov 2017 12:16:40 -0500 Subject: [PATCH 06/28] Restore county and congressional district layers --- .../search/visualizations/geo/GeoVisualizationSection.jsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/js/components/search/visualizations/geo/GeoVisualizationSection.jsx b/src/js/components/search/visualizations/geo/GeoVisualizationSection.jsx index b78ef9d910..b194ae2bf7 100644 --- a/src/js/components/search/visualizations/geo/GeoVisualizationSection.jsx +++ b/src/js/components/search/visualizations/geo/GeoVisualizationSection.jsx @@ -23,8 +23,7 @@ const propTypes = { total: PropTypes.number }; -// const availableLayers = ['state', 'county', 'congressionalDistrict']; -const availableLayers = ['state']; +const availableLayers = ['state', 'county', 'congressionalDistrict']; export default class GeoVisualizationSection extends React.Component { constructor(props) { From 153e8e89e9d4899d2b678d0f81a84de8e8b1ffe5 Mon Sep 17 00:00:00 2001 From: Marco Mendoza Date: Tue, 28 Nov 2017 15:56:42 -0500 Subject: [PATCH 07/28] Update kerning of logo --- src/img/logo-small.png | Bin 23667 -> 17386 bytes src/img/logo-small@2x.png | Bin 34903 -> 19015 bytes src/img/logo.png | Bin 26432 -> 17805 bytes src/img/logo@2x.png | Bin 40467 -> 19993 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/img/logo-small.png b/src/img/logo-small.png index 72fa0617af581deee4c273a77d566637154e35f4..8609b0aa2c2c66066d786f0bcac38a7cb1b1e6f4 100644 GIT binary patch delta 2312 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 NU_)}Ss5JAs^&ihG6kq@V delta 8941 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 Hu0mjfS%FH( diff --git a/src/img/logo-small@2x.png b/src/img/logo-small@2x.png index 46293e40fd96dcdfde7afd4cf88cf22fa7cf7d86..c7b437fa1d121118895cc61ca8719c0056e31252 100644 GIT binary patch delta 3958 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 Y)ZMJdNn?#q$Uz!lsB5ZIt>qN`KMQwQvj6}9 delta 20268 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 delta 11729 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 diff --git a/src/img/logo@2x.png b/src/img/logo@2x.png index f2793485ff385c9c97f4ed4d3f6c2b3ce7c6db38..8d1f2aed81a0133c9f3059bd9526c40726c50523 100644 GIT binary patch delta 4943 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 XiECxVzo?@+WB>%*)SyQHcJ%)M&MGlE delta 25875 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 Date: Tue, 28 Nov 2017 16:27:54 -0500 Subject: [PATCH 08/28] Position "beta" label --- src/_scss/layouts/default/header/_logo.scss | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/_scss/layouts/default/header/_logo.scss b/src/_scss/layouts/default/header/_logo.scss index 23418f4612..8acd68b961 100644 --- a/src/_scss/layouts/default/header/_logo.scss +++ b/src/_scss/layouts/default/header/_logo.scss @@ -42,19 +42,19 @@ color: $color-white; font-size: rem(8); font-weight: $font-semibold; - left: rem(195); + left: rem(189); letter-spacing: 0.14rem; padding: rem(2) rem(4); position: absolute; text-align: center; top: rem(-2); @include border-radius(2px); - @include media(360px) { - left: rem(228); + @include media(359px) { + left: rem(223); } @include media($large-screen) { font-size: rem(10); - left: rem(280); + left: rem(274); top: rem(-2); } } From 25c936cf9dbac54774e10042addc5397789a46df Mon Sep 17 00:00:00 2001 From: Kevin Li Date: Wed, 29 Nov 2017 11:13:41 -0500 Subject: [PATCH 09/28] Rebuilding award search column positioning --- .../layouts/tabbedSearch/tabbedSearch.scss | 17 +++++++++++++ src/_scss/pages/search/_pagePositioning.scss | 25 +++++++++++++++++++ src/_scss/pages/search/searchPage.scss | 17 +++++++------ src/js/components/search/SearchPage.jsx | 22 +++++++++------- .../components/search/header/SearchHeader.jsx | 20 +++++++-------- 5 files changed, 74 insertions(+), 27 deletions(-) create mode 100644 src/_scss/layouts/tabbedSearch/tabbedSearch.scss create mode 100644 src/_scss/pages/search/_pagePositioning.scss diff --git a/src/_scss/layouts/tabbedSearch/tabbedSearch.scss b/src/_scss/layouts/tabbedSearch/tabbedSearch.scss new file mode 100644 index 0000000000..10c2692acb --- /dev/null +++ b/src/_scss/layouts/tabbedSearch/tabbedSearch.scss @@ -0,0 +1,17 @@ +@import "layouts/default/default"; + +#main-content { + @import "layouts/search/header/header"; + + .search-contents { + @include outer-container(100%); + margin: 0 $outer-gutter/2; + @include media($large-screen) { + margin: 0 $outer-gutter; + } + @include media($x-large-screen) { + max-width: $site-max-width; + margin: 0 auto; + } + } +} \ No newline at end of file diff --git a/src/_scss/pages/search/_pagePositioning.scss b/src/_scss/pages/search/_pagePositioning.scss new file mode 100644 index 0000000000..466b613af5 --- /dev/null +++ b/src/_scss/pages/search/_pagePositioning.scss @@ -0,0 +1,25 @@ +.search-contents { + @include flex(1 1 auto); + @include display(flex); + @include flex-direction(row); + @include justify-content(flex-start); + @include align-items(stretch); + + + .full-search-sidebar { + @include flex(0 0 auto); + display: none; + @include media($medium-screen) { + display: block; + padding-right: rem(30); + width: rem(350); + } + + background-color: red; + } + + .search-results-wrapper { + @include flex(1 1 auto); + background-color: blue; + } +} \ No newline at end of file diff --git a/src/_scss/pages/search/searchPage.scss b/src/_scss/pages/search/searchPage.scss index 525fed8a1c..6b650e31be 100644 --- a/src/_scss/pages/search/searchPage.scss +++ b/src/_scss/pages/search/searchPage.scss @@ -1,13 +1,14 @@ .usa-da-search-page { @import "all"; - @import "layouts/search/search"; + @import "layouts/tabbedSearch/tabbedSearch"; - @import './searchSidebar'; - @include span-columns(16); + @import "./searchSidebar"; + @import "./_pagePositioning"; + // @include span-columns(16); .full-search-sidebar { display: none; @include media($medium-screen) { - @include span-columns(4); + // @include span-columns(4); } } @@ -16,12 +17,12 @@ @import "./mobile/mobileResults"; .search-results-wrapper { - @include span-columns(16); + // @include span-columns(16); @include media($medium-screen) { - @include span-columns(12); + // @include span-columns(12); } - margin-top: rem(32); - margin-bottom: rem(60); + // margin-top: rem(32); + // margin-bottom: rem(60); @import "./results/searchResults"; @import "./topFilterBar/topFilterBar"; diff --git a/src/js/components/search/SearchPage.jsx b/src/js/components/search/SearchPage.jsx index 49f7cb0419..3e42a85ab4 100644 --- a/src/js/components/search/SearchPage.jsx +++ b/src/js/components/search/SearchPage.jsx @@ -116,6 +116,16 @@ export default class SearchPage extends React.Component { }); } + // + render() { let fullSidebar = (); if (this.state.isMobile) { @@ -138,15 +148,9 @@ export default class SearchPage extends React.Component {
{ fullSidebar }
- +
+ Hello +
Date: Wed, 29 Nov 2017 11:38:54 -0500 Subject: [PATCH 10/28] Show loading, no results, and error messages in the map. --- .../results/visualizations/geo/_message.scss | 18 ++++++++++++++++ .../visualizations/geo/geoVisualization.scss | 1 + .../geo/GeoVisualizationSection.jsx | 10 ++++++++- .../search/visualizations/geo/MapMessage.jsx | 21 +++++++++++++++++++ .../geo/GeoVisualizationSectionContainer.jsx | 17 +++++++++++++-- 5 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 src/_scss/pages/search/results/visualizations/geo/_message.scss create mode 100644 src/js/components/search/visualizations/geo/MapMessage.jsx diff --git a/src/_scss/pages/search/results/visualizations/geo/_message.scss b/src/_scss/pages/search/results/visualizations/geo/_message.scss new file mode 100644 index 0000000000..3750ab531b --- /dev/null +++ b/src/_scss/pages/search/results/visualizations/geo/_message.scss @@ -0,0 +1,18 @@ +.map-message { + z-index: 2; + background-color: $color-white; + display: block; + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.3); + line-height: rem(18); + + position: absolute; + top: rem(75); + left: rem(15); + padding: rem(10) rem(15); + + color: $color-base; + text-align: center; + font-size: $small-font-size; + font-weight: $font-normal; + line-height: rem(18); +} \ No newline at end of file diff --git a/src/_scss/pages/search/results/visualizations/geo/geoVisualization.scss b/src/_scss/pages/search/results/visualizations/geo/geoVisualization.scss index 4cd72cd9ad..5b1f7a222e 100644 --- a/src/_scss/pages/search/results/visualizations/geo/geoVisualization.scss +++ b/src/_scss/pages/search/results/visualizations/geo/geoVisualization.scss @@ -16,4 +16,5 @@ } @import "./_disclaimer"; + @import "./_message"; } \ No newline at end of file diff --git a/src/js/components/search/visualizations/geo/GeoVisualizationSection.jsx b/src/js/components/search/visualizations/geo/GeoVisualizationSection.jsx index b194ae2bf7..9f68b4fbf9 100644 --- a/src/js/components/search/visualizations/geo/GeoVisualizationSection.jsx +++ b/src/js/components/search/visualizations/geo/GeoVisualizationSection.jsx @@ -11,6 +11,7 @@ import GeoVisualizationScopeButton from './GeoVisualizationScopeButton'; import MapWrapper from './MapWrapper'; import GeoVisualizationTooltip from './GeoVisualizationTooltip'; import MapDisclaimer from './MapDisclaimer'; +import MapMessage from './MapMessage'; const propTypes = { scope: PropTypes.string, @@ -20,7 +21,8 @@ const propTypes = { mapMoved: PropTypes.func, renderHash: PropTypes.string, data: PropTypes.object, - total: PropTypes.number + total: PropTypes.number, + message: PropTypes.string }; const availableLayers = ['state', 'county', 'congressionalDistrict']; @@ -87,6 +89,11 @@ export default class GeoVisualizationSection extends React.Component { closeDisclaimer={this.closeDisclaimer} />); } + let loadingMessage = null; + if (this.props.message !== '') { + loadingMessage = (); + } + return (
{disclaimer} + {loadingMessage}
diff --git a/src/js/components/search/visualizations/geo/MapMessage.jsx b/src/js/components/search/visualizations/geo/MapMessage.jsx new file mode 100644 index 0000000000..4a87782127 --- /dev/null +++ b/src/js/components/search/visualizations/geo/MapMessage.jsx @@ -0,0 +1,21 @@ +/** + * MapMessage.jsx + * Created by Kevin Li 11/29/17 + */ + +import React from 'react'; +import PropTypes from 'prop-types'; + +const propTypes = { + message: PropTypes.string +}; + +const MapMessage = (props) => ( +
+ {props.message} +
+); + +MapMessage.propTypes = propTypes; + +export default MapMessage; diff --git a/src/js/containers/search/visualizations/geo/GeoVisualizationSectionContainer.jsx b/src/js/containers/search/visualizations/geo/GeoVisualizationSectionContainer.jsx index 198ce1818e..f93670ecbd 100644 --- a/src/js/containers/search/visualizations/geo/GeoVisualizationSectionContainer.jsx +++ b/src/js/containers/search/visualizations/geo/GeoVisualizationSectionContainer.jsx @@ -45,7 +45,8 @@ export class GeoVisualizationSectionContainer extends React.Component { visibleEntities: [], renderHash: `geo-${uniqueId()}`, loading: true, - loadingTiles: true + loadingTiles: true, + message: '' }; this.apiRequest = null; @@ -146,7 +147,8 @@ export class GeoVisualizationSectionContainer extends React.Component { } this.setState({ - loading: true + loading: true, + message: 'Loading data...' }); this.apiRequest = SearchHelper.performSpendingByGeographySearch(apiParams); @@ -159,6 +161,11 @@ export class GeoVisualizationSectionContainer extends React.Component { if (!isCancel(err)) { console.log(err); this.apiRequest = null; + + this.setState({ + loading: false, + message: 'An error occurred while loading map data.' + }); } }); } @@ -180,7 +187,13 @@ export class GeoVisualizationSectionContainer extends React.Component { } }); + let message = ''; + if (data.results.length === 0) { + message = 'No results in the current map area.'; + } + this.setState({ + message, data: { values: spendingValues, locations: spendingShapes, From d3b263355fd888ee8673accc4d244c16de8ae478 Mon Sep 17 00:00:00 2001 From: Kevin Li Date: Wed, 29 Nov 2017 13:37:57 -0500 Subject: [PATCH 11/28] Rounded tabs --- src/_scss/pages/search/_pagePositioning.scss | 4 +- src/_scss/pages/search/results/_tabs.scss | 113 ++++++++++++++++++ .../pages/search/results/searchResults.scss | 2 + src/js/components/search/SearchPage.jsx | 22 ++-- src/js/components/search/SearchResults.jsx | 9 +- .../components/search/header/SearchHeader.jsx | 25 ---- .../visualizations/VisualizationTabItem.jsx | 34 ++++++ .../visualizations/VisualizationWrapper.jsx | 59 +++++++++ 8 files changed, 225 insertions(+), 43 deletions(-) create mode 100644 src/_scss/pages/search/results/_tabs.scss create mode 100644 src/js/components/search/visualizations/VisualizationTabItem.jsx create mode 100644 src/js/components/search/visualizations/VisualizationWrapper.jsx diff --git a/src/_scss/pages/search/_pagePositioning.scss b/src/_scss/pages/search/_pagePositioning.scss index 466b613af5..7f4a02eee7 100644 --- a/src/_scss/pages/search/_pagePositioning.scss +++ b/src/_scss/pages/search/_pagePositioning.scss @@ -12,7 +12,7 @@ @include media($medium-screen) { display: block; padding-right: rem(30); - width: rem(350); + width: 25%; } background-color: red; @@ -20,6 +20,6 @@ .search-results-wrapper { @include flex(1 1 auto); - background-color: blue; + // background-color: blue; } } \ No newline at end of file diff --git a/src/_scss/pages/search/results/_tabs.scss b/src/_scss/pages/search/results/_tabs.scss new file mode 100644 index 0000000000..5df2fed153 --- /dev/null +++ b/src/_scss/pages/search/results/_tabs.scss @@ -0,0 +1,113 @@ +.visualization-tabs { + @include unstyled-list; + + @include display(flex); + @include justify-content(flex-start); + @include align-items(center); + position: relative; + + background-color: $color-gray-lightest; + + &:after { + z-index: 1; + content: ""; + width: 100%; + position: absolute; + bottom: 0; + left: 0; + border-bottom: 1px solid $color-gray-lighter; + + } + + .visualization-type-tab { + @include button-unstyled; + @include display(flex); + @include justify-content(center); + @include align-items(center); + position: relative; + z-index: 2; + + padding: rem(20); + + opacity: 0.5; + background-color: $color-gray-lightest; + transition: opacity 0.15s; + + border: none; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + + margin-left: rem(5); + + &.active { + opacity: 1; + background-color: $color-white; + border: 1px solid $color-gray-lighter; + border-bottom: 1px solid $color-white; + + &:before, &:after { + position: absolute; + bottom: rem(-1); + width: rem(5); + height: rem(5); + content: " "; + } + + &:before { + left: rem(-5); + border-bottom-right-radius: rem(5); + border-right: 1px solid $color-gray-lighter; + border-bottom: 1px solid $color-gray-lighter; + box-shadow: 2px 2px 0 $color-white; + } + + &:after { + right: rem(-5); + border-bottom-left-radius: rem(5); + border-left: 1px solid $color-gray-lighter; + border-bottom: 1px solid $color-gray-lighter; + box-shadow: -2px 2px 0 $color-white; + } + + &:first-child { + &:before { + width: rem(0); + height: rem(0); + border: none; + box-shadow: none; + } + } + } + + &:active, &:hover { + opacity: 1; + } + + &:first-child { + margin-left: 0; + } + + .icon { + @include flex(0 0 auto) + width: rem(25); + height: rem(25); + + margin-right: rem(15); + + svg { + fill: $color-gray; + width: rem(25); + height: rem(25); + } + } + + .label { + @include flex(1 1 auto); + color: $color-gray; + font-weight: $font-semibold; + text-transform: uppercase; + line-height: rem(18); + letter-spacing: rem(2); + } + } +} \ No newline at end of file diff --git a/src/_scss/pages/search/results/searchResults.scss b/src/_scss/pages/search/results/searchResults.scss index f30c24976e..d8b6174665 100644 --- a/src/_scss/pages/search/results/searchResults.scss +++ b/src/_scss/pages/search/results/searchResults.scss @@ -2,6 +2,8 @@ background-color: $color-white; box-shadow: $container-shadow; + @import "./_tabs"; + @import "./_typography"; @import "../../../elements/_divider"; diff --git a/src/js/components/search/SearchPage.jsx b/src/js/components/search/SearchPage.jsx index 3e42a85ab4..49f7cb0419 100644 --- a/src/js/components/search/SearchPage.jsx +++ b/src/js/components/search/SearchPage.jsx @@ -116,16 +116,6 @@ export default class SearchPage extends React.Component { }); } - // - render() { let fullSidebar = (); if (this.state.isMobile) { @@ -148,9 +138,15 @@ export default class SearchPage extends React.Component {
{ fullSidebar }
-
- Hello -
+
+ // + // + return (
@@ -101,9 +106,7 @@ export default class SearchResults extends React.Component {
{lastUpdate}
- - - +
); diff --git a/src/js/components/search/header/SearchHeader.jsx b/src/js/components/search/header/SearchHeader.jsx index e42cf69705..d4e6f291bb 100644 --- a/src/js/components/search/header/SearchHeader.jsx +++ b/src/js/components/search/header/SearchHeader.jsx @@ -5,7 +5,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import * as Icons from 'components/sharedComponents/icons/Icons'; import FormatItem from './FormatItem'; import DownloadButton from './DownloadButton'; @@ -169,30 +168,6 @@ export default class SearchHeader extends React.Component {
    -
  • - } /> -
  • -
  • - } /> -
  • -
  • - } /> -
  • { + const Icon = Icons[props.icon]; + let active = ''; + if (props.active) { + active = 'active'; + } + + return ( +
  • + +
  • + ); +}; + +export default VisualizationTabItem; diff --git a/src/js/components/search/visualizations/VisualizationWrapper.jsx b/src/js/components/search/visualizations/VisualizationWrapper.jsx new file mode 100644 index 0000000000..37d25cdfc6 --- /dev/null +++ b/src/js/components/search/visualizations/VisualizationWrapper.jsx @@ -0,0 +1,59 @@ +/** + * VisualizationWrapper.jsx + * Created by Kevin Li 11/29/17 + */ + +import React from 'react'; + +import VisualizationTabItem from './VisualizationTabItem'; + +const tabOptions = [ + { + code: 'table', + label: 'Table', + icon: 'Table' + }, + { + code: 'time', + label: 'Time', + icon: 'Calendar' + }, + { + code: 'map', + label: 'Map', + icon: 'MapMarker' + }, + { + code: 'rank', + label: 'Categories', + icon: 'Bar' + } +]; + +export default class VisualizationWrapper extends React.Component { + constructor(props) { + super(props); + + this.state = { + active: 'map' + }; + } + + render() { + const tabs = tabOptions.map((tab) => ( + + )); + + return ( +
    +
      + {tabs} +
    + Data +
    + ); + } +} \ No newline at end of file From f83c928e10bfe9245ae3e7c038ecca799f157841 Mon Sep 17 00:00:00 2001 From: Kevin Li Date: Wed, 29 Nov 2017 13:40:27 -0500 Subject: [PATCH 12/28] Change CFDA placeholder text --- src/js/containers/search/filters/cfda/CFDAListContainer.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/containers/search/filters/cfda/CFDAListContainer.jsx b/src/js/containers/search/filters/cfda/CFDAListContainer.jsx index 91043fe0ce..b14974edf9 100644 --- a/src/js/containers/search/filters/cfda/CFDAListContainer.jsx +++ b/src/js/containers/search/filters/cfda/CFDAListContainer.jsx @@ -159,7 +159,7 @@ export class CFDAListContainer extends React.Component { values={this.state.autocompleteCFDA} handleTextInput={this.handleTextInput} onSelect={this.props.selectCFDA} - placeholder="e.g., 10.553 - School Breakfast Program" + placeholder="e.g., 93.778 - Medical Assistance Program" errorHeader="Unknown CFDA" errorMessage="We were unable to find that CFDA." ref={(input) => { From ee12207a954f8688b046b4892964c8e9f507e4db Mon Sep 17 00:00:00 2001 From: Kevin Li Date: Thu, 30 Nov 2017 12:53:05 -0500 Subject: [PATCH 13/28] Fixing table border --- src/_scss/pages/search/_pagePositioning.scss | 3 - src/_scss/pages/search/results/_tabs.scss | 83 ++++++++++++------- .../pages/search/results/searchResults.scss | 22 +++-- .../search/results/table/_tableStyle.scss | 6 +- .../search/results/table/resultsTable.scss | 3 +- .../visualizations/geo/geoVisualization.scss | 1 - .../rank/rankVisualization.scss | 1 - .../time/timeVisualization.scss | 1 - .../components/search/table/ResultsTable.jsx | 2 +- .../search/table/ResultsTableSection.jsx | 2 +- .../visualizations/VisualizationTabItem.jsx | 17 +++- .../visualizations/VisualizationWrapper.jsx | 55 ++++++++++-- 12 files changed, 136 insertions(+), 60 deletions(-) diff --git a/src/_scss/pages/search/_pagePositioning.scss b/src/_scss/pages/search/_pagePositioning.scss index 7f4a02eee7..39f297b3ec 100644 --- a/src/_scss/pages/search/_pagePositioning.scss +++ b/src/_scss/pages/search/_pagePositioning.scss @@ -14,12 +14,9 @@ padding-right: rem(30); width: 25%; } - - background-color: red; } .search-results-wrapper { @include flex(1 1 auto); - // background-color: blue; } } \ No newline at end of file diff --git a/src/_scss/pages/search/results/_tabs.scss b/src/_scss/pages/search/results/_tabs.scss index 5df2fed153..6e68be1e42 100644 --- a/src/_scss/pages/search/results/_tabs.scss +++ b/src/_scss/pages/search/results/_tabs.scss @@ -1,3 +1,18 @@ +.search-visualizations { + position: relative; + + .visualization-tab-wrapper { + position: absolute; + top: 1px; + height: rem(68); + } + + .visualization-content-wrapper { + position: absolute; + top: rem(68); + width: 100%; + } +} .visualization-tabs { @include unstyled-list; @@ -5,20 +20,8 @@ @include justify-content(flex-start); @include align-items(center); position: relative; - background-color: $color-gray-lightest; - &:after { - z-index: 1; - content: ""; - width: 100%; - position: absolute; - bottom: 0; - left: 0; - border-bottom: 1px solid $color-gray-lighter; - - } - .visualization-type-tab { @include button-unstyled; @include display(flex); @@ -27,11 +30,12 @@ position: relative; z-index: 2; - padding: rem(20); + height: rem(68); - opacity: 0.5; - background-color: $color-gray-lightest; - transition: opacity 0.15s; + padding: rem(20) rem(30); + + + background-color: transparent; border: none; border-top-left-radius: 5px; @@ -39,12 +43,19 @@ margin-left: rem(5); + transition: opacity 0.15s; + opacity: 0.5; + &.active { opacity: 1; background-color: $color-white; border: 1px solid $color-gray-lighter; border-bottom: 1px solid $color-white; + // special boxshadow to not cast shadow below (since the tab is supposed to be + // visually the same object as the rest of the visualization box) + box-shadow: -2px 0 2px -2px $color-shadow, 2px 0 2px -3px $color-shadow; + &:before, &:after { position: absolute; bottom: rem(-1); @@ -58,7 +69,7 @@ border-bottom-right-radius: rem(5); border-right: 1px solid $color-gray-lighter; border-bottom: 1px solid $color-gray-lighter; - box-shadow: 2px 2px 0 $color-white; + box-shadow: 1px 1px 0 1px $color-white; } &:after { @@ -66,16 +77,7 @@ border-bottom-left-radius: rem(5); border-left: 1px solid $color-gray-lighter; border-bottom: 1px solid $color-gray-lighter; - box-shadow: -2px 2px 0 $color-white; - } - - &:first-child { - &:before { - width: rem(0); - height: rem(0); - border: none; - box-shadow: none; - } + box-shadow: -1px 1px 0 1px $color-white; } } @@ -83,10 +85,6 @@ opacity: 1; } - &:first-child { - margin-left: 0; - } - .icon { @include flex(0 0 auto) width: rem(25); @@ -110,4 +108,27 @@ letter-spacing: rem(2); } } + + li { + &:first-child { + .visualization-type-tab { + margin-left: 0; + &.active { + &:before { + // create a special box to cover the artifacts that result from where the + // content border and the tab border meet + width: rem(5); + height: rem(5); + border-radius: 0; + left: rem(-1); + bottom: rem(-5); + background-color: $color-white; + border: none; + box-shadow: none; + border-left: 1px solid $color-gray-lighter; + } + } + } + } + } } \ No newline at end of file diff --git a/src/_scss/pages/search/results/searchResults.scss b/src/_scss/pages/search/results/searchResults.scss index d8b6174665..4f9fb2d988 100644 --- a/src/_scss/pages/search/results/searchResults.scss +++ b/src/_scss/pages/search/results/searchResults.scss @@ -1,12 +1,20 @@ .search-results { - background-color: $color-white; - box-shadow: $container-shadow; - @import "./_tabs"; - @import "./_typography"; - @import "../../../elements/_divider"; + .visualization-content { + box-shadow: $container-shadow; + border: 1px solid $color-gray-lighter; + border-radius: rem(5); + z-index: 1; + + background-color: $color-white; + + padding: rem(30); + + @import "./_typography"; + @import "../../../elements/_divider"; - @import "./table/resultsTable"; - @import "./visualizations/visualizations"; + @import "./table/resultsTable"; + @import "./visualizations/visualizations"; + } } diff --git a/src/_scss/pages/search/results/table/_tableStyle.scss b/src/_scss/pages/search/results/table/_tableStyle.scss index 10bba89391..3112a1b8fb 100644 --- a/src/_scss/pages/search/results/table/_tableStyle.scss +++ b/src/_scss/pages/search/results/table/_tableStyle.scss @@ -1,9 +1,8 @@ .award-results-table { // implement the library style @import 'lib/ibTable/ibTable'; - margin-top: rem(15); + // margin-top: rem(15); display: block; - border: 1px solid $color-gray-light; // placeholder background for when the user scrolls really fast background: repeating-linear-gradient( $color-white, $color-white 40px, $color-gray-lightest 40px, $color-gray-lightest 80px); &.no-results { @@ -28,7 +27,4 @@ .ibt-header { border-bottom: 1px solid #ADAFB4; } - .ibt-table-body { - //border: 1px solid red; - } } diff --git a/src/_scss/pages/search/results/table/resultsTable.scss b/src/_scss/pages/search/results/table/resultsTable.scss index 02c57fa4cf..1ce0f2b812 100644 --- a/src/_scss/pages/search/results/table/resultsTable.scss +++ b/src/_scss/pages/search/results/table/resultsTable.scss @@ -1,5 +1,4 @@ .search-results-table-section { - padding: rem(30) rem(35); transition: opacity 0.25s ease; position: relative; @import "_tableTypes"; @@ -12,6 +11,8 @@ .loaded-table { opacity: 1; @include transition(opacity 0.25s ease-in); + margin-top: rem(15); + border: 1px solid $color-gray-light; } .results-table-width-master { width: 100%; diff --git a/src/_scss/pages/search/results/visualizations/geo/geoVisualization.scss b/src/_scss/pages/search/results/visualizations/geo/geoVisualization.scss index 4cd72cd9ad..2951291476 100644 --- a/src/_scss/pages/search/results/visualizations/geo/geoVisualization.scss +++ b/src/_scss/pages/search/results/visualizations/geo/geoVisualization.scss @@ -1,5 +1,4 @@ .results-visualization-geo-section { - padding: ($global-pad * 2) rem(35); position: relative; @import "./_topSection"; .map-container { diff --git a/src/_scss/pages/search/results/visualizations/rank/rankVisualization.scss b/src/_scss/pages/search/results/visualizations/rank/rankVisualization.scss index 757388c42c..8fd97de324 100644 --- a/src/_scss/pages/search/results/visualizations/rank/rankVisualization.scss +++ b/src/_scss/pages/search/results/visualizations/rank/rankVisualization.scss @@ -1,5 +1,4 @@ .results-visualization-rank-section { - padding: ($global-pad * 2) rem(35); @import "./_title"; @import "./_topSection"; .results-visualization-rank-container { diff --git a/src/_scss/pages/search/results/visualizations/time/timeVisualization.scss b/src/_scss/pages/search/results/visualizations/time/timeVisualization.scss index e82b6b560d..a267b3cc21 100644 --- a/src/_scss/pages/search/results/visualizations/time/timeVisualization.scss +++ b/src/_scss/pages/search/results/visualizations/time/timeVisualization.scss @@ -1,5 +1,4 @@ .results-visualization-time-section { - padding: ($global-pad * 2) rem(35); @import "./chart/barChart"; @import "./_topSection"; .visualization-tooltip { diff --git a/src/js/components/search/table/ResultsTable.jsx b/src/js/components/search/table/ResultsTable.jsx index 27cab55564..ec5d12fc9f 100644 --- a/src/js/components/search/table/ResultsTable.jsx +++ b/src/js/components/search/table/ResultsTable.jsx @@ -27,7 +27,7 @@ const rowHeight = 40; // indicates when there's more data const tableHeight = 12.5 * rowHeight; -export default class ResultsTable extends React.PureComponent { +export default class ResultsTable extends React.Component { constructor(props) { super(props); diff --git a/src/js/components/search/table/ResultsTableSection.jsx b/src/js/components/search/table/ResultsTableSection.jsx index 0dbc386ea0..4e12bceee7 100644 --- a/src/js/components/search/table/ResultsTableSection.jsx +++ b/src/js/components/search/table/ResultsTableSection.jsx @@ -54,7 +54,7 @@ export default class ResultsTableSection extends React.Component { } setTableWidth() { - const tableWidth = this.tableWidthController.clientWidth - 2; + const tableWidth = this.tableWidthController.clientWidth - 1; this.setState({ tableWidth }); } diff --git a/src/js/components/search/visualizations/VisualizationTabItem.jsx b/src/js/components/search/visualizations/VisualizationTabItem.jsx index c962530fbc..308490ce81 100644 --- a/src/js/components/search/visualizations/VisualizationTabItem.jsx +++ b/src/js/components/search/visualizations/VisualizationTabItem.jsx @@ -4,10 +4,23 @@ */ import React from 'react'; +import PropTypes from 'prop-types'; + import * as Icons from 'components/sharedComponents/icons/Icons'; +const propTypes = { + clickedTab: PropTypes.func, + code: PropTypes.string, + label: PropTypes.string, + icon: PropTypes.string, + active: PropTypes.bool +}; const VisualizationTabItem = (props) => { + const clickedTab = () => { + props.clickedTab(props.code); + }; + const Icon = Icons[props.icon]; let active = ''; if (props.active) { @@ -19,7 +32,7 @@ const VisualizationTabItem = (props) => {
); } - - // - // - // - return (
diff --git a/src/js/components/search/visualizations/VisualizationTabItem.jsx b/src/js/components/search/visualizations/VisualizationTabItem.jsx index 308490ce81..b99755ea69 100644 --- a/src/js/components/search/visualizations/VisualizationTabItem.jsx +++ b/src/js/components/search/visualizations/VisualizationTabItem.jsx @@ -31,7 +31,8 @@ const VisualizationTabItem = (props) => {
  • - {lastUpdate} -
    - +
    + +
    + +
    ); diff --git a/src/js/components/sharedComponents/icons/BaseIcon.jsx b/src/js/components/sharedComponents/icons/BaseIcon.jsx index 1c64f84570..8b443fab09 100644 --- a/src/js/components/sharedComponents/icons/BaseIcon.jsx +++ b/src/js/components/sharedComponents/icons/BaseIcon.jsx @@ -5,7 +5,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import svg4everybody from 'svg4everybody'; import IconSingleton from './iconSingleton'; @@ -37,12 +36,8 @@ export default class BaseIcon extends React.Component { componentDidMount() { // download icons if necessary, otherwise populate the correct state this.prepareIcons(); - - // necessary for IE support - svg4everybody({ - polyfill: true - }); } + componentWillUnmount() { // unsubscribe to reduce memory overhead, if we have a subscription active if (this.subscription) { From 80dcc5507f06b2701629cc724edce2206132c285 Mon Sep 17 00:00:00 2001 From: Kevin Li Date: Fri, 1 Dec 2017 09:48:15 -0500 Subject: [PATCH 17/28] Center map message --- .../results/visualizations/geo/_message.scss | 40 ++++++++++++------- .../search/visualizations/geo/MapMessage.jsx | 6 ++- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/_scss/pages/search/results/visualizations/geo/_message.scss b/src/_scss/pages/search/results/visualizations/geo/_message.scss index 3750ab531b..191ce1f7e4 100644 --- a/src/_scss/pages/search/results/visualizations/geo/_message.scss +++ b/src/_scss/pages/search/results/visualizations/geo/_message.scss @@ -1,18 +1,30 @@ -.map-message { - z-index: 2; - background-color: $color-white; - display: block; - box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.3); - line-height: rem(18); +.map-message-container { + @include display(flex); + @include justify-content(center); + @include align-items(center); position: absolute; - top: rem(75); - left: rem(15); - padding: rem(10) rem(15); + top: 0; + bottom: 0; + left: 0; + right: 0; - color: $color-base; - text-align: center; - font-size: $small-font-size; - font-weight: $font-normal; - line-height: rem(18); + pointer-events: none; + + .map-message { + @include flex(0 0 auto); + z-index: 2; + background-color: $color-white; + display: block; + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.3); + line-height: rem(18); + + padding: rem(10) rem(15); + + color: $color-base; + text-align: center; + font-size: $small-font-size; + font-weight: $font-normal; + line-height: rem(18); + } } \ No newline at end of file diff --git a/src/js/components/search/visualizations/geo/MapMessage.jsx b/src/js/components/search/visualizations/geo/MapMessage.jsx index 4a87782127..cd2f0b70b0 100644 --- a/src/js/components/search/visualizations/geo/MapMessage.jsx +++ b/src/js/components/search/visualizations/geo/MapMessage.jsx @@ -11,8 +11,10 @@ const propTypes = { }; const MapMessage = (props) => ( -
    - {props.message} +
    +
    + {props.message} +
    ); From 4c44137e5d0f339476bfd3fd905a7abf77d7047f Mon Sep 17 00:00:00 2001 From: Kevin Li Date: Mon, 4 Dec 2017 09:56:43 -0500 Subject: [PATCH 18/28] Experimenting with floating content --- .../tabbedSearch/header/_downloadButton.scss | 51 ++++++ .../tabbedSearch/header/_downloadTooltip.scss | 79 +++++++++ .../layouts/tabbedSearch/header/header.scss | 51 ++++++ .../layouts/tabbedSearch/tabbedSearch.scss | 2 +- src/_scss/pages/search/_pagePositioning.scss | 2 +- src/_scss/pages/search/results/_tabs.scss | 1 + .../search/results/table/resultsTable.scss | 4 +- .../visualizations/geo/geoVisualization.scss | 6 + .../results/visualizations/rank/_title.scss | 2 + .../time/timeVisualization.scss | 5 + src/js/components/search/SearchResults.jsx | 31 +--- .../components/search/header/SearchHeader.jsx | 159 ++++-------------- .../search/table/ResultsTableSection.jsx | 4 +- .../visualizations/VisualizationWrapper.jsx | 69 +++++++- .../geo/GeoVisualizationSection.jsx | 4 +- .../search/visualizations/geo/MapWrapper.jsx | 20 ++- .../rank/RankVisualizationTitle.jsx | 4 +- .../time/TimeVisualizationSection.jsx | 4 +- 18 files changed, 329 insertions(+), 169 deletions(-) create mode 100644 src/_scss/layouts/tabbedSearch/header/_downloadButton.scss create mode 100644 src/_scss/layouts/tabbedSearch/header/_downloadTooltip.scss create mode 100644 src/_scss/layouts/tabbedSearch/header/header.scss diff --git a/src/_scss/layouts/tabbedSearch/header/_downloadButton.scss b/src/_scss/layouts/tabbedSearch/header/_downloadButton.scss new file mode 100644 index 0000000000..5fb71417b8 --- /dev/null +++ b/src/_scss/layouts/tabbedSearch/header/_downloadButton.scss @@ -0,0 +1,51 @@ +.download-wrap { + position: relative; + @import "./_downloadTooltip"; + + .download-button { + @include button-unstyled; + padding: rem(8) rem(20); + border: 1px solid $color-white; + cursor: pointer; + + @include display(flex); + @include justify-content(center); + @include align-items(center); + position: relative; + width: rem(155); + height: rem(36); + + @include transition(opacity 0.2s ease-in-out); + + .icon { + @include flex(0 0 auto); + width: rem(18); + height: rem(18); + margin-right: rem(5); + svg { + fill: $color-white; + width: rem(18); + height: rem(18); + } + } + + .label { + @include flex(1 1 auto); + text-align: center; + color: $color-white; + text-transform: uppercase; + font-size: rem(14); + line-height: rem(18); + font-weight: $font-semibold; + } + + &:hover, &:active { + opacity: 1; + } + + &[disabled], &.disabled { + cursor: default; + opacity: 0.4; + } + } +} \ No newline at end of file diff --git a/src/_scss/layouts/tabbedSearch/header/_downloadTooltip.scss b/src/_scss/layouts/tabbedSearch/header/_downloadTooltip.scss new file mode 100644 index 0000000000..45dc7782d6 --- /dev/null +++ b/src/_scss/layouts/tabbedSearch/header/_downloadTooltip.scss @@ -0,0 +1,79 @@ +.download-hover-spacer { + // BODGE: add a wrapper that goes from the button to the edges of the hover in order to make it clickable + position: absolute; + top: rem(-18); + left: rem(-290); + width: rem(290); + height: rem(90); + z-index: $z-modal - 2; +} +.download-hover { + margin-right: rem(20); + z-index: $z-modal - 1; + + width: rem(270); + height: rem(90); + + .download-hover-interior { + position: relative; + } + + .hover-content { + @include display(flex); + @include flex-direction(row); + @include justify-content(center); + @include align-items(center); + position: relative; + + background-color: $color-gold-lightest; + border: 1px solid $color-gold-light; + box-shadow: $box-shadow; + + padding: rem(10); + + .icon { + @include flex(0 0 auto); + @include align-self(flex-start); + width: rem(25); + height: rem(25); + margin-right: rem(10); + svg { + fill: $color-gold; + width: rem(25); + height: rem(25); + } + } + + .message { + @include flex(1 1 auto); + text-align: left; + color: $color-base; + font-size: $smallest-font-size; + + a { + text-decoration: underline; + color: $color-primary; + font-weight: $font-semibold; + + &:hover, &:active { + text-decoration: none; + } + } + } + } + + // inherit from the standard tooltip arrow style + $color-tooltip-border: $color-gold-light; + @import "components/visualizations/tooltip/_arrow"; + .tooltip-pointer { + // override the coloring + &:after { + background: $color-gold-lightest; + } + + &.right { + top: rem(32); + right: rem(9); + } + } +} \ No newline at end of file diff --git a/src/_scss/layouts/tabbedSearch/header/header.scss b/src/_scss/layouts/tabbedSearch/header/header.scss new file mode 100644 index 0000000000..65e138a7de --- /dev/null +++ b/src/_scss/layouts/tabbedSearch/header/header.scss @@ -0,0 +1,51 @@ +$search-header-height: rem(66); + +.search-header-wrapper { + position: relative; + height: $search-header-height; +} + +.search-header-container { + width: 100%; + background-color: $color-primary; + color: $color-white; + // bottom shadow cast on the content + box-shadow: 0 2px 2px rgba(0,0,0,.3); + + &.sticky { + @include media($medium-screen) { + position: fixed; + top: 0; + z-index: $z-header; + } + } + + .search-header { + @import "mixins/fullSectionWrap"; + @include fullSectionWrap(0, 0); + @include display(flex); + @include justify-content(space-between); + @include flex-direction(row); + @include align-items(center); + @include align-self(stretch); + @include flex-flow(row wrap); + position: relative; + + height: $search-header-height; + + .search-title { + @include flex(1 1 auto); + h1 { + font-size: rem(24); + line-height: rem(31); + font-weight: $font-semibold; + margin: 0; + } + } + + .search-options { + @include flex(0 0 auto); + @import "./_downloadButton"; + } + } +} \ No newline at end of file diff --git a/src/_scss/layouts/tabbedSearch/tabbedSearch.scss b/src/_scss/layouts/tabbedSearch/tabbedSearch.scss index 10c2692acb..c4139c24b2 100644 --- a/src/_scss/layouts/tabbedSearch/tabbedSearch.scss +++ b/src/_scss/layouts/tabbedSearch/tabbedSearch.scss @@ -1,7 +1,7 @@ @import "layouts/default/default"; #main-content { - @import "layouts/search/header/header"; + @import "./header/header"; .search-contents { @include outer-container(100%); diff --git a/src/_scss/pages/search/_pagePositioning.scss b/src/_scss/pages/search/_pagePositioning.scss index a391545b96..9ece767a78 100644 --- a/src/_scss/pages/search/_pagePositioning.scss +++ b/src/_scss/pages/search/_pagePositioning.scss @@ -19,7 +19,7 @@ .search-results-wrapper { @include flex(1 1 auto); - overflow-x: hidden; + overflow: hidden; @include media($medium-screen) { margin-top: rem(32); diff --git a/src/_scss/pages/search/results/_tabs.scss b/src/_scss/pages/search/results/_tabs.scss index 63896bcdbd..609f0fd888 100644 --- a/src/_scss/pages/search/results/_tabs.scss +++ b/src/_scss/pages/search/results/_tabs.scss @@ -16,6 +16,7 @@ // merge the tabs' bottom curves to the top of the visualization area top: rem(-5); } + } .visualization-tabs { @include unstyled-list; diff --git a/src/_scss/pages/search/results/table/resultsTable.scss b/src/_scss/pages/search/results/table/resultsTable.scss index 1ce0f2b812..34a06ecbe1 100644 --- a/src/_scss/pages/search/results/table/resultsTable.scss +++ b/src/_scss/pages/search/results/table/resultsTable.scss @@ -28,7 +28,9 @@ @include flex-direction(row); @include align-items(center); @include justify-content(center); - h3 { + h2 { + @include h3; + margin: 0; @include flex(1 1 auto); } button.action-modal { diff --git a/src/_scss/pages/search/results/visualizations/geo/geoVisualization.scss b/src/_scss/pages/search/results/visualizations/geo/geoVisualization.scss index 2951291476..e858a34379 100644 --- a/src/_scss/pages/search/results/visualizations/geo/geoVisualization.scss +++ b/src/_scss/pages/search/results/visualizations/geo/geoVisualization.scss @@ -1,6 +1,12 @@ .results-visualization-geo-section { position: relative; @import "./_topSection"; + + h2.visualization-title { + @include h3; + margin: 0; + } + .map-container { height: rem(475); width: 100%; diff --git a/src/_scss/pages/search/results/visualizations/rank/_title.scss b/src/_scss/pages/search/results/visualizations/rank/_title.scss index c2b71594eb..6e67b06e32 100644 --- a/src/_scss/pages/search/results/visualizations/rank/_title.scss +++ b/src/_scss/pages/search/results/visualizations/rank/_title.scss @@ -2,6 +2,8 @@ @include clearfix; position: relative; .static-title { + @include h3; + margin: 0; float: left; } @import 'elements/_titleSelector'; diff --git a/src/_scss/pages/search/results/visualizations/time/timeVisualization.scss b/src/_scss/pages/search/results/visualizations/time/timeVisualization.scss index a267b3cc21..d25059bf02 100644 --- a/src/_scss/pages/search/results/visualizations/time/timeVisualization.scss +++ b/src/_scss/pages/search/results/visualizations/time/timeVisualization.scss @@ -1,6 +1,11 @@ .results-visualization-time-section { @import "./chart/barChart"; @import "./_topSection"; + + h2.visualization-title { + @include h3; + margin: 0; + } .visualization-tooltip { @import "components/visualizations/tooltip/_tooltip"; } diff --git a/src/js/components/search/SearchResults.jsx b/src/js/components/search/SearchResults.jsx index d332868f34..4456974712 100644 --- a/src/js/components/search/SearchResults.jsx +++ b/src/js/components/search/SearchResults.jsx @@ -24,23 +24,6 @@ const propTypes = { }; export default class SearchResults extends React.Component { - constructor(props) { - super(props); - - this.scrollPos = 0; - - this.handleScrollUpdate = this.handleScrollUpdate.bind(this); - } - - componentDidMount() { - window.addEventListener('scroll', this.handleScrollUpdate); - } - - componentWillUnmount() { - // this.stopMonitoringScroll(false); - window.removeEventListener('scroll', this.handleScrollUpdate); - } - pluralizeFilterLabel(count) { if (count === 1) { return 'Filter'; @@ -48,16 +31,6 @@ export default class SearchResults extends React.Component { return 'Filters'; } - handleScrollUpdate() { - if (this.props.isMobile) { - // scroll events only apply for desktop view - return; - } - - const scrollY = window.scrollY; - this.scrollPos = scrollY; - } - render() { let mobileFilters = ''; if (this.props.showMobileFilters && this.props.isMobile) { @@ -74,8 +47,6 @@ export default class SearchResults extends React.Component { showCountBadge = 'hide'; } - console.log('RENDER'); - return (
    @@ -117,7 +88,7 @@ export default class SearchResults extends React.Component {
    - +
    diff --git a/src/js/components/search/header/SearchHeader.jsx b/src/js/components/search/header/SearchHeader.jsx index d4e6f291bb..0b536da50f 100644 --- a/src/js/components/search/header/SearchHeader.jsx +++ b/src/js/components/search/header/SearchHeader.jsx @@ -6,174 +6,87 @@ import React from 'react'; import PropTypes from 'prop-types'; -import FormatItem from './FormatItem'; import DownloadButton from './DownloadButton'; const propTypes = { - isSticky: PropTypes.bool, - currentSection: PropTypes.string, showDownloadModal: PropTypes.func, downloadAvailable: PropTypes.bool }; -const sectionList = ['time', 'geo', 'table']; - export default class SearchHeader extends React.Component { constructor(props) { super(props); this.state = { - activeSection: sectionList[0] - }; - - // the DOM state holds renderable DOM changes but exists outside of the React data lifecycle - // to improve rendering speeds. it is instead tied to the browser's animation frames - this.domState = { - windowWidth: 0, - windowHeight: 0, - headerHeight: 0, - headerViewTop: 0, - stickyHeader: false, - sections: [] + floatY: 0, + isSticky: false }; - this.measurePage = this.measurePage.bind(this); this.handleScroll = this.handleScroll.bind(this); + this.measureScreen = this.measureScreen.bind(this); } componentDidMount() { - // window.addEventListener('scroll', this.handleScroll, { - // passive: true - // }); - // window.addEventListener('resize', this.measurePage, { - // passive: true - // }); - - // this.measurePage(); + this.measureScreen(); + window.addEventListener('scroll', this.handleScroll); + window.addEventListener('resize', this.measureScreen); } componentWillUnmount() { - // window.removeEventListener('scroll', this.handleScroll); - // window.removeEventListener('resize', this.measurePage); + window.removeEventListener('scroll', this.handleScroll); + window.removeEventListener('resize', this.measureScreen); } - measurePage() { - const measurements = {}; - measurements.windowHeight = window.innerHeight || document.documentElement.clientHeight - || document.body.clientHeight; - measurements.windowWidth = window.innerWidth || document.documentElement.clientWidth - || document.body.clientWidth; - - // page and header height - measurements.pageHeight = document.getElementById('main-content').offsetHeight; - measurements.headerHeight = this.headerDiv.offsetHeight; - - // measure the header position on the page - const scrollY = window.pageYOffset || document.documentElement.scrollTop; - // the document location is the current view position + the current scroll position - measurements.headerTop = this.searchHeaderPlaceholder.getBoundingClientRect().top + scrollY; + measureScreen() { + // measure the default position of the header bar + const wrapperY = this.wrapper.offsetTop; - // now measure the positions of each section - const sections = []; - sectionList.forEach((sectionId) => { - const section = document.getElementById(`results-section-${sectionId}`); - const sectionTop = section.getBoundingClientRect().top + scrollY; - sections.push(sectionTop); + this.setState({ + floatY: wrapperY + }, () => { + this.handleScroll(); }); - measurements.sections = sections; - - // save the measurements - this.domState = Object.assign({}, this.domState, measurements); - - // since the page has reshuffled, also treat it as a scroll event - this.handleScroll(); } handleScroll() { - // measure the current page scroll location - const scrollY = window.pageYOffset || document.documentElement.scrollTop; - let isSticky = false; - - // check if the header should be sticky or not - if (scrollY >= this.domState.headerTop) { - // the header should be sticky - isSticky = true; - } - - // determine which section we are in - const activeSection = this.determineActiveSection(scrollY); - - if (isSticky !== this.domState.stickyHeader) { - // the sticky style has changed, let's modify the DOM to add or remove the sticky style - if (isSticky) { - this.headerDiv.classList.add('sticky'); - // the placeholder div needs to take up the header's former height - this.searchHeaderPlaceholder.style.height = `${this.domState.headerHeight}px`; - } - else { - this.headerDiv.classList.remove('sticky'); - // remove the placeholder div's height - this.searchHeaderPlaceholder.style.height = '0px'; - } - - // update the dom state - this.domState.stickyHeader = isSticky; + const scrollY = window.scrollY; + if (scrollY >= this.state.floatY && !this.state.isSticky) { + this.setState({ + isSticky: true + }); } - - // check if the active section has changed - if (activeSection !== this.state.activeSection) { + else if (scrollY < this.state.floatY && this.state.isSticky) { this.setState({ - activeSection + isSticky: false }); } } - determineActiveSection(scrollY) { - let lastY = -1; - let index = 0; - let activeSection = sectionList[0]; - for (const top of this.domState.sections) { - if (scrollY === top) { - activeSection = sectionList[index]; - break; - } - else if (scrollY > lastY && scrollY >= top) { - activeSection = sectionList[index]; - } - - lastY = top; - index += 1; + render() { + let stickyClass = ''; + if (this.state.isSticky) { + stickyClass = 'sticky'; } - return activeSection; - } - - render() { return ( -
    -
    { - this.searchHeaderPlaceholder = div; - }} /> +
    { + this.wrapper = div; + }}>
    { - this.headerDiv = div; + this.content = div; }}>

    Award Search

    -
      -
    • - -
    • -
    +
    diff --git a/src/js/components/search/table/ResultsTableSection.jsx b/src/js/components/search/table/ResultsTableSection.jsx index 4e12bceee7..8358248f62 100644 --- a/src/js/components/search/table/ResultsTableSection.jsx +++ b/src/js/components/search/table/ResultsTableSection.jsx @@ -85,7 +85,9 @@ export default class ResultsTableSection extends React.Component { return (
    -

    Spending by Award

    +

    + Spending by Award +


    = this.state.visualization.top && this.state.windowHeight >= this.state.visualization.height) { + console.log(scrollY); + this.visualizationWrapper.style.transform = `translate(0px, ${((scrollY - this.state.visualization.height) + this.state.visualization.top) + 66 + 32}px)`; + } + // else if (isSticky) { + // this.visualizationWrapper.classList.toggle('sticky'); + // delete this.visualizationWrapper.style.top; + // delete this.visualizationWrapper.style.width; + // } + } + render() { const tabs = tabOptions.map((tab) => ( +
    { + this.visualizationWrapper = div; + }}>
    ); } } + +WarningBanner.propTypes = propTypes; From a1bcfa994f435d78d31cc91b8f112ea0ea95b5d9 Mon Sep 17 00:00:00 2001 From: Lizzie Salita Date: Wed, 13 Dec 2017 11:32:00 -0500 Subject: [PATCH 26/28] Prevent icons from overlapping with text on small screens --- src/_scss/layouts/default/header/_warning.scss | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/_scss/layouts/default/header/_warning.scss b/src/_scss/layouts/default/header/_warning.scss index ca80a9f8cc..e1c62f62c9 100644 --- a/src/_scss/layouts/default/header/_warning.scss +++ b/src/_scss/layouts/default/header/_warning.scss @@ -13,9 +13,10 @@ p { flex: 1; display: block; + margin-right: rem(32); } .top-alert-icon { - margin: rem(15) rem(10) 0 0; + margin: rem(15) rem(10); .usa-da-icon { flex: 1; & svg { @@ -36,7 +37,10 @@ top: 0; right: 0; @include button-unstyled; - margin: rem(25) rem(30) rem(15) rem(30); + margin: rem(25) rem(15) rem(15) rem(15); + @include media($large-screen) { + margin: rem(25) rem(30) rem(15) rem(30); + } svg { fill: $color-gray; From cde82ce30866dc1a9b27eed40cd5dc0b5cab02c3 Mon Sep 17 00:00:00 2001 From: Lizzie Salita Date: Wed, 13 Dec 2017 12:18:48 -0500 Subject: [PATCH 27/28] Reduced vertical padding --- src/_scss/layouts/default/header/_warning.scss | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/_scss/layouts/default/header/_warning.scss b/src/_scss/layouts/default/header/_warning.scss index e1c62f62c9..5942f53dbb 100644 --- a/src/_scss/layouts/default/header/_warning.scss +++ b/src/_scss/layouts/default/header/_warning.scss @@ -1,9 +1,7 @@ .warning-banner-wrap { @import "mixins/fullSectionWrap"; background: $color-primary-alt-lightest; - min-height: rem(60); overflow: hidden; - padding: rem(5) 0; width: 100%; border: 3px solid #BCE8EB; .warning-banner { @@ -13,10 +11,11 @@ p { flex: 1; display: block; - margin-right: rem(32); + margin: rem(8) rem(30) rem(8) 0; } .top-alert-icon { - margin: rem(15) rem(10); + margin: rem(5) rem(10) 0 rem(10); + height: 21px; .usa-da-icon { flex: 1; & svg { @@ -37,15 +36,15 @@ top: 0; right: 0; @include button-unstyled; - margin: rem(25) rem(15) rem(15) rem(15); + margin: rem(15); @include media($large-screen) { - margin: rem(25) rem(30) rem(15) rem(30); + margin: rem(15) rem(30); } svg { fill: $color-gray; - width: rem(20); - height: rem(20); + width: rem(16); + height: rem(16); } } } \ No newline at end of file From 90c8f8f5c84d0f59729dd3121cdba8035a2b7419 Mon Sep 17 00:00:00 2001 From: Lizzie Salita Date: Wed, 13 Dec 2017 14:02:24 -0500 Subject: [PATCH 28/28] pass close banner function --- src/js/components/sharedComponents/header/Header.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/js/components/sharedComponents/header/Header.jsx b/src/js/components/sharedComponents/header/Header.jsx index ad0880209b..87ad62ceb3 100644 --- a/src/js/components/sharedComponents/header/Header.jsx +++ b/src/js/components/sharedComponents/header/Header.jsx @@ -52,7 +52,8 @@ export default class Header extends React.Component { } else if (kGlobalConstants.IN_BETA) { banner = ( - + ); } return (