From f53c8e02258236c85b2f0375b076429213214925 Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Fri, 14 Dec 2018 12:01:09 +0000 Subject: [PATCH 01/31] render sources collectively in card --- src/components/Card.jsx | 27 ++++++++++++------- src/components/presentational/CardSource.js | 30 ++++++++++----------- src/js/data/copy.json | 4 +-- 3 files changed, 34 insertions(+), 27 deletions(-) diff --git a/src/components/Card.jsx b/src/components/Card.jsx index 35def13..3f4340f 100644 --- a/src/components/Card.jsx +++ b/src/components/Card.jsx @@ -87,16 +87,23 @@ class Card extends React.Component { } renderSources() { - return this.props.event.sources.map(source => ( - - )) + if (this.props.sourceError) { + return
ERROR: something went wrong loading sources, TODO:
+ } + + const source_lang = copy[this.props.language].cardstack.sources + return ( +
+

{source_lang}:

+ {this.props.event.sources.map(source => ( + + ))} +
+ ) } // NB: should be internaionalized. diff --git a/src/components/presentational/CardSource.js b/src/components/presentational/CardSource.js index fe67652..43f9329 100644 --- a/src/components/presentational/CardSource.js +++ b/src/components/presentational/CardSource.js @@ -3,28 +3,28 @@ import Spinner from './Spinner' import copy from '../../js/data/copy.json' -function renderSource(source) { - return source.error ? ( -
{source.error}
- ) : ( -
-

{source.id}

-
- ) -} - const CardSource = ({ source, language, isLoading, error }) => { - const source_lang = copy[language].cardstack.source function renderContent() { - return isLoading - ? - : renderSource(source) + if (isLoading) { + return + } else if (source.error) { + return ( +
{source.error}
+ ) + } else { + /* source with no errors */ + return ( +
+

{source.id}

+ photo +
+ ) + } } return (
-

{source_lang}:

{renderContent()}
) diff --git a/src/js/data/copy.json b/src/js/data/copy.json index 21702e0..039a50d 100644 --- a/src/js/data/copy.json +++ b/src/js/data/copy.json @@ -63,7 +63,7 @@ "incident_type": "Tipo de acción", "description": "Hechos", "people": "Personas en el evento", - "source": "Fuente", + "sources": "Fuentes", "category": "Según el testimonio de", "communication": "Comunicación", "transmitter": "Transmisor", @@ -138,7 +138,7 @@ "description": "Summary", "tags": "Tags", "notags": "No known tags for this event.", - "source": "Source", + "sources": "Sources", "unknown_source": "The information for this source could not be retrieved.", "category": "Category", "communication": "Communication", From 51bff419164eff78ec1d3996dcc38d3465f79b67 Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Fri, 14 Dec 2018 12:57:50 +0000 Subject: [PATCH 02/31] animated hover for sources --- src/components/Card.jsx | 2 +- src/components/presentational/CardSource.js | 29 +++++---------- src/scss/card.scss | 39 ++++++++++++++++++++- 3 files changed, 48 insertions(+), 22 deletions(-) diff --git a/src/components/Card.jsx b/src/components/Card.jsx index 3f4340f..94d66db 100644 --- a/src/components/Card.jsx +++ b/src/components/Card.jsx @@ -93,7 +93,7 @@ class Card extends React.Component { const source_lang = copy[this.props.language].cardstack.sources return ( -
+

{source_lang}:

{this.props.event.sources.map(source => ( { - function renderContent() { - if (isLoading) { - return - } else if (source.error) { - return ( -
{source.error}
- ) - } else { - /* source with no errors */ - return ( -
-

{source.id}

- photo -
- ) - } - } - return ( -
- {renderContent()} +
+ {isLoading + ? + : ( +
+ photo +

{source.id}

+
+ )}
) } diff --git a/src/scss/card.scss b/src/scss/card.scss index e95213b..8979937 100644 --- a/src/scss/card.scss +++ b/src/scss/card.scss @@ -45,7 +45,7 @@ .card-cell { flex: 1; - } + } h4 { min-width: 80px; @@ -57,6 +57,43 @@ flex-direction: column; } + .card-source { + margin: 0; + padding: 2px 0; + border-radius: 3px; + + .source-row { + display: flex; + flex-direction: row; + align-items: flex-start; + padding: 8px 15px; + border-left: 5px solid $darkgrey; + background: linear-gradient(to right, $darkgrey 50%, transparent 50%); + background-size: 200% 100%; + background-position: right bottom; + margin-left: -16px; + margin-right: -16px; + + &:hover { + background-color: $darkgrey; + color: white; + cursor: pointer; + .material-icons { + color: white; + } + background-position: left bottom; + transition: all 2s ease; + } + } + + .source-icon { + display: flex; + align-items: center; + font-size: 24px; + margin-right: 15px; + } + } + .card-cell { a { transition: color 0.2s; From de88334386b21188f9b7d53a5d9ca478a0877770 Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Fri, 14 Dec 2018 13:15:27 +0000 Subject: [PATCH 03/31] material icons for core types note that this switch logic should probably be moved outside into some sort of config file --- src/components/presentational/CardSource.js | 23 ++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/components/presentational/CardSource.js b/src/components/presentational/CardSource.js index 0bb3d2c..d4e6dce 100644 --- a/src/components/presentational/CardSource.js +++ b/src/components/presentational/CardSource.js @@ -5,13 +5,34 @@ import copy from '../../js/data/copy.json' const CardSource = ({ source, language, isLoading, error }) => { + function renderIconText(type) { + switch(type) { + case 'Eyewitness Testimony': + return 'visibility' + case 'Government Data': + return 'public' + case 'Satellite Imagery': + return 'satellite' + case 'Second-Hand Testimony': + return 'visibility_off' + case 'Video': + return 'videocam' + case 'Photo': + return 'photo' + default: + return 'help' + } + } + return (
{isLoading ? : (
- photo + + {renderIconText(source.type)} +

{source.id}

)} From 45c41dc3525eb38554a9e74bd3f72aacca514d48 Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Mon, 17 Dec 2018 14:47:53 +0000 Subject: [PATCH 04/31] rm tags in Card if none --- src/components/Card.jsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/Card.jsx b/src/components/Card.jsx index 94d66db..3e6594f 100644 --- a/src/components/Card.jsx +++ b/src/components/Card.jsx @@ -69,6 +69,9 @@ class Card extends React.Component { } renderTags() { + if (!this.props.tags || (this.props.tags && this.props.tags.length === 0)) { + return null + } return ( Date: Mon, 17 Dec 2018 15:56:46 +0000 Subject: [PATCH 05/31] redux action infrastructure --- src/actions/index.js | 8 ++++++++ src/components/Card.jsx | 8 ++++---- src/components/CardStack.jsx | 5 +++-- src/components/Dashboard.jsx | 7 +++++++ src/components/presentational/CardSource.js | 14 ++++++++++++-- 5 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/actions/index.js b/src/actions/index.js index 24d2a6d..3a5e890 100644 --- a/src/actions/index.js +++ b/src/actions/index.js @@ -220,6 +220,14 @@ export function resetAllFilters() { } } +export const UPDATE_SOURCE = "UPDATE_SOURCE" +export function updateSource(source) { + return { + type: UPDATE_SOURCE, + source + } +} + // UI export const TOGGLE_FETCHING_DOMAIN = 'TOGGLE_FETCHING_DOMAIN' diff --git a/src/components/Card.jsx b/src/components/Card.jsx index 3e6594f..ee269d5 100644 --- a/src/components/Card.jsx +++ b/src/components/Card.jsx @@ -30,9 +30,9 @@ class Card extends React.Component { isHighlighted: !this.state.isHighlighted }, () => { if (!this.state.isHighlighted) { - this.props.highlight(this.props.event); + this.props.onHighlight(this.props.event); } else { - this.props.highlight(null); + this.props.onHighlight(null); } }); } @@ -101,8 +101,8 @@ class Card extends React.Component { {this.props.event.sources.map(source => ( this.props.onViewSource(source)} /> ))}
@@ -127,7 +127,7 @@ class Card extends React.Component { return ( this.props.select([event])} + select={(event) => this.props.onSelect([event])} makeTimelabel={(timestamp) => this.makeTimelabel(timestamp)} next={links.next} prev={links.prev} diff --git a/src/components/CardStack.jsx b/src/components/CardStack.jsx index 4e7f8b0..86d4b0e 100644 --- a/src/components/CardStack.jsx +++ b/src/components/CardStack.jsx @@ -27,8 +27,9 @@ class CardStack extends React.Component { getCategoryGroup={this.props.getCategoryGroup} getCategoryColor={this.props.getCategoryColor} getCategoryLabel={this.props.getCategoryLabel} - highlight={this.props.onHighlight} - select={this.props.onSelect} + onViewSource={this.props.onViewSource} + onHighlight={this.props.onHighlight} + onSelect={this.props.onSelect} /> ); }); diff --git a/src/components/Dashboard.jsx b/src/components/Dashboard.jsx index 34c4687..6386c3f 100644 --- a/src/components/Dashboard.jsx +++ b/src/components/Dashboard.jsx @@ -19,6 +19,7 @@ class Dashboard extends React.Component { constructor(props) { super(props); + this.handleViewSource = this.handleViewSource.bind(this) this.handleHighlight = this.handleHighlight.bind(this); this.handleSelect = this.handleSelect.bind(this); this.handleSelectNarrative = this.handleSelectNarrative.bind(this); @@ -46,6 +47,11 @@ class Dashboard extends React.Component { return this.eventsById[eventId]; } + handleViewSource(source) { + console.log('handleViewSource: to implement in Dashboard.jsx') + this.props.actions.updateSource(source) + } + handleSelect(selected) { if (selected) { let eventsToSelect = selected.map(event => this.getEventById(event.id)); @@ -108,6 +114,7 @@ class Dashboard extends React.Component { : '' } this.props.actions.updateSelected([])} diff --git a/src/components/presentational/CardSource.js b/src/components/presentational/CardSource.js index d4e6dce..cde4ca9 100644 --- a/src/components/presentational/CardSource.js +++ b/src/components/presentational/CardSource.js @@ -1,9 +1,10 @@ import React from 'react' +import PropTypes from 'prop-types' import Spinner from './Spinner' import copy from '../../js/data/copy.json' -const CardSource = ({ source, language, isLoading, error }) => { +const CardSource = ({ source, isLoading, onClickHandler }) => { function renderIconText(type) { switch(type) { @@ -29,7 +30,7 @@ const CardSource = ({ source, language, isLoading, error }) => { {isLoading ? : ( -
+
onClickHandler(source)}> {renderIconText(source.type)} @@ -40,4 +41,13 @@ const CardSource = ({ source, language, isLoading, error }) => { ) } +CardSource.propTypes = { + source: PropTypes.shape({ + id: PropTypes.string.isRequired, + type: PropTypes.string + }), + isLoading: PropTypes.bool, + onClickHandler: PropTypes.func.isRequired, +} + export default CardSource From c10b741325b5f42e358f6d005b011f77df070185 Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Mon, 17 Dec 2018 17:05:07 +0000 Subject: [PATCH 06/31] synchronous updateSource logic --- src/components/:w | 148 ++++++++++++++++++++++++++++++++ src/components/Dashboard.jsx | 9 +- src/components/MediaOverlay.jsx | 27 ++++++ src/reducers/app.js | 10 +++ src/scss/main.scss | 1 + src/scss/mediaoverlay.scss | 51 +++++++++++ src/store/initial.js | 99 ++++++++++----------- 7 files changed, 295 insertions(+), 50 deletions(-) create mode 100644 src/components/:w create mode 100644 src/components/MediaOverlay.jsx create mode 100644 src/scss/mediaoverlay.scss diff --git a/src/components/:w b/src/components/:w new file mode 100644 index 0000000..acd0476 --- /dev/null +++ b/src/components/:w @@ -0,0 +1,148 @@ +import React from 'react'; + +import { bindActionCreators } from 'redux'; +import { connect } from 'react-redux'; +import * as actions from '../actions'; +import * as selectors from '../selectors'; + +import MediaOverlay from './presentational/MediaOverlay'; +import LoadingOverlay from './presentational/LoadingOverlay'; +import Viewport from './Viewport.jsx'; +import Toolbar from './Toolbar.jsx'; +import CardStack from './CardStack.jsx'; +import NarrativeCard from './NarrativeCard.js'; +import InfoPopUp from './InfoPopup.jsx'; +import Timeline from './Timeline.jsx'; +import Notification from './Notification.jsx'; + +import { parseDate } from '../js/utilities'; + +class Dashboard extends React.Component { + constructor(props) { + super(props); + + this.handleViewSource = this.handleViewSource.bind(this) + this.handleHighlight = this.handleHighlight.bind(this) + this.handleSelect = this.handleSelect.bind(this) + this.handleTagFilter = this.handleTagFilter.bind(this) + this.updateTimerange = this.updateTimerange.bind(this) + + this.eventsById = {} + } + + componentDidMount() { + if (!this.props.app.isMobile) { + this.props.actions.fetchDomain() + .then(domain => this.props.actions.updateDomain(domain)); + } + } + + handleHighlight(highlighted) { + this.props.actions.updateHighlighted((highlighted) ? highlighted : null); + } + + getEventById(eventId) { + if (this.eventsById[eventId]) return this.eventsById[eventId]; + this.eventsById[eventId] = this.props.domain.events.find(ev => ev.id === eventId); + return this.eventsById[eventId]; + } + + handleViewSource(source) { + console.log('handleViewSource: to implement in Dashboard.jsx') + this.props.actions.updateSource(source) + } + + handleSelect(selected) { + if (selected) { + let eventsToSelect = selected.map(event => this.getEventById(event.id)); + eventsToSelect = eventsToSelect.sort((a, b) => parseDate(a.timestamp) - parseDate(b.timestamp)) + + this.props.actions.updateSelected(eventsToSelect) + } + } + + handleTagFilter(tag) { + this.props.actions.updateTagFilters(tag); + } + + updateTimerange(timeRange) { + this.props.actions.updateTimeRange(timeRange); + } + + getCategoryColor(category='other') { + return this.props.ui.style.categories[category] || this.props.ui.style.categories['other'] + } + + getNarrativeLinks(event) { + const narrative = this.props.domain.narratives.find(nv => nv.id === event.narrative); + if (narrative) return narrative.byId[event.id]; + return null; + } + + render() { + return ( +
+ this.getCategoryColor(category) + }} + /> + + this.props.actions.updateSelected([])} + getNarrativeLinks={event => this.getNarrativeLinks(event)} + getCategoryColor={category => this.getCategoryColor(category)} + /> + this.getCategoryColor(category) + }} + /> + this.props.actions.toggleInfoPopup()} + /> + + + + + +
+ ); + } +} + +function mapDispatchToProps(dispatch) { + return { + actions: bindActionCreators(actions, dispatch) + }; +} + +export default connect( + state => state, + mapDispatchToProps, +)(Dashboard); diff --git a/src/components/Dashboard.jsx b/src/components/Dashboard.jsx index 6386c3f..43a1257 100644 --- a/src/components/Dashboard.jsx +++ b/src/components/Dashboard.jsx @@ -4,6 +4,7 @@ import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; import * as actions from '../actions'; +import MediaOverlay from './MediaOverlay.jsx'; import LoadingOverlay from './presentational/LoadingOverlay'; import Map from './Map.jsx'; import Toolbar from './Toolbar.jsx'; @@ -48,7 +49,6 @@ class Dashboard extends React.Component { } handleViewSource(source) { - console.log('handleViewSource: to implement in Dashboard.jsx') this.props.actions.updateSource(source) } @@ -131,6 +131,13 @@ class Dashboard extends React.Component { notifications={this.props.domain.notifications} onToggle={this.props.actions.markNotificationsRead} /> + {this.props.app.source ? ( + { + this.props.actions.updateSource(null)} + } + /> + ) : null} +
+
+ +
+ {/*
*/} + {/* ciao ciao */} + {/*
*/} +
+
+ ) + } +} + +export default MediaOverlay diff --git a/src/reducers/app.js b/src/reducers/app.js index 7fe01be..c8a8ea6 100644 --- a/src/reducers/app.js +++ b/src/reducers/app.js @@ -8,6 +8,7 @@ import { UPDATE_TAGFILTERS, UPDATE_TIMERANGE, UPDATE_NARRATIVE, + UPDATE_SOURCE, RESET_ALLFILTERS, TOGGLE_LANGUAGE, TOGGLE_MAPVIEW, @@ -117,6 +118,13 @@ function toggleMapView(appState, action) { }); } +function updateSource(appState, action) { + return { + ...appState, + source: action.source + } +} + function fetchError(state, action) { return { ...state, @@ -181,6 +189,8 @@ function app(appState = initial.app, action) { return updateTimeRange(appState, action); case UPDATE_NARRATIVE: return updateNarrative(appState, action); + case UPDATE_SOURCE: + return updateSource(appState, action); case RESET_ALLFILTERS: return resetAllFilters(appState, action); case TOGGLE_LANGUAGE: diff --git a/src/scss/main.scss b/src/scss/main.scss index 866e93e..e7ad5e1 100644 --- a/src/scss/main.scss +++ b/src/scss/main.scss @@ -7,6 +7,7 @@ @import 'header'; @import 'cardstack'; @import 'narrativecard'; +@import 'mediaoverlay'; @import 'map'; @import 'timeline'; @import 'tag-filters'; diff --git a/src/scss/mediaoverlay.scss b/src/scss/mediaoverlay.scss new file mode 100644 index 0000000..710eecd --- /dev/null +++ b/src/scss/mediaoverlay.scss @@ -0,0 +1,51 @@ +$vimeo-height: 800px; +$vimeo-width: 1000px; + +.mo-overlay { + display: flex; + justify-content: center; + align-items: center; + position: absolute; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background-color: rgba(230, 230, 230, 0.5); + z-index: 20; +} + +.mo-container { + background-color: transparent; + max-width: 80vw; + min-width: 80vw; + max-height: 90vh; + min-height: 90vh; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + + .mo-controls, .mo-media-container { + flex: 1; + display: flex; + justify-content: center; + } +} + +.mo-media-container { + max-height: $vimeo-height; +} + +.mo-controls { + color: white; + width: $vimeo-width; + background-color: black; +} + +.vimeo-iframe { + min-height: $vimeo-height; + max-height: $vimeo-height; + min-width: $vimeo-width; + max-width: $vimeo-width; + border: none; +} diff --git a/src/store/initial.js b/src/store/initial.js index 3121edc..f7a4058 100644 --- a/src/store/initial.js +++ b/src/store/initial.js @@ -1,11 +1,11 @@ const initial = { /* - * The Domain or 'domain' of this state refers to the tree of data - * available for render and display. - * Selections and filters in the 'app' subtree will operate the domain - * in mapStateToProps of the Dashboard, and deterimne which items - * in the domain will get rendered by React - */ + * The Domain or 'domain' of this state refers to the tree of data + * available for render and display. + * Selections and filters in the 'app' subtree will operate the domain + * in mapStateToProps of the Dashboard, and deterimne which items + * in the domain will get rendered by React + */ domain: { events: [], narratives: [], @@ -17,24 +17,25 @@ const initial = { }, /* - * The 'app' subtree of this state determines the data and information to be - * displayed. - * It may refer to those the user interacts with, by selecting, - * fitlering and so on, which ultimately operate on the data to be displayed. - * Additionally, some of the 'app' flags are determined by the config file - * or by the characteristics of the client, browser, etc. - */ + * The 'app' subtree of this state determines the data and information to be + * displayed. + * It may refer to those the user interacts with, by selecting, + * fitlering and so on, which ultimately operate on the data to be displayed. + * Additionally, some of the 'app' flags are determined by the config file + * or by the characteristics of the client, browser, etc. + */ app: { errors: { source: null, }, highlighted: null, selected: [], + source: null, narrative: null, filters: { timerange: [ - d3.timeParse("%Y-%m-%dT%H:%M:%S")("2013-02-23T12:00:00"), - d3.timeParse("%Y-%m-%dT%H:%M:%S")("2016-02-23T12:00:00") + d3.timeParse("%Y-%m-%dT%H:%M:%S")("2013-02-23T12:00:00"), + d3.timeParse("%Y-%m-%dT%H:%M:%S")("2016-02-23T12:00:00") ], tags: [], categories: [], @@ -54,36 +55,36 @@ const initial = { duration: 1576800, active: false }, - { - label: '3 meses', - duration: 129600, - active: false - }, - { - label: '3 días', - duration: 4320, - active: false - }, - { - label: '12 horas', - duration: 720, - active: false - }, - { - label: '2 horas', - duration: 120, - active: false - }, - { - label: '30 min', - duration: 30, - active: false - }, - { - label: '10 min', - duration: 10, - active: false - }], + { + label: '3 meses', + duration: 129600, + active: false + }, + { + label: '3 días', + duration: 4320, + active: false + }, + { + label: '12 horas', + duration: 720, + active: false + }, + { + label: '2 horas', + duration: 120, + active: false + }, + { + label: '30 min', + duration: 30, + active: false + }, + { + label: '10 min', + duration: 10, + active: false + }], features: { USE_TAGS: process.env.features.USE_TAGS, USE_SEARCH: process.env.features.USE_SEARCH @@ -99,10 +100,10 @@ const initial = { }, /* - * The 'ui' subtree of this state refers the state of the cosmetic - * elements of the application, such as color palettes of categories - * as well as dom elements to attach SVG - */ + * The 'ui' subtree of this state refers the state of the cosmetic + * elements of the application, such as color palettes of categories + * as well as dom elements to attach SVG + */ ui: { style: { categories: { From b325b53f7b63033fa09e38ce1e946b26ac71c0fa Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Mon, 17 Dec 2018 18:01:31 +0000 Subject: [PATCH 07/31] MediaOverlay -> SourceOverlay --- src/assets/placeholder-image.jpg | Bin 0 -> 30449 bytes src/components/Dashboard.jsx | 5 +-- src/components/MediaOverlay.jsx | 27 ---------------- src/components/SourceOverlay.jsx | 54 +++++++++++++++++++++++++++++++ 4 files changed, 57 insertions(+), 29 deletions(-) create mode 100644 src/assets/placeholder-image.jpg delete mode 100644 src/components/MediaOverlay.jsx create mode 100644 src/components/SourceOverlay.jsx diff --git a/src/assets/placeholder-image.jpg b/src/assets/placeholder-image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e08c84013c7d70c8533f21f7a18344c69384d2bd GIT binary patch literal 30449 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 literal 0 HcmV?d00001 diff --git a/src/components/Dashboard.jsx b/src/components/Dashboard.jsx index 43a1257..d734de0 100644 --- a/src/components/Dashboard.jsx +++ b/src/components/Dashboard.jsx @@ -4,7 +4,7 @@ import { bindActionCreators } from 'redux'; import { connect } from 'react-redux'; import * as actions from '../actions'; -import MediaOverlay from './MediaOverlay.jsx'; +import SourceOverlay from './SourceOverlay.jsx'; import LoadingOverlay from './presentational/LoadingOverlay'; import Map from './Map.jsx'; import Toolbar from './Toolbar.jsx'; @@ -132,7 +132,8 @@ class Dashboard extends React.Component { onToggle={this.props.actions.markNotificationsRead} /> {this.props.app.source ? ( - { this.props.actions.updateSource(null)} } diff --git a/src/components/MediaOverlay.jsx b/src/components/MediaOverlay.jsx deleted file mode 100644 index d73717f..0000000 --- a/src/components/MediaOverlay.jsx +++ /dev/null @@ -1,27 +0,0 @@ -import React from 'react' - -class MediaOverlay extends React.Component { - render() { - return ( -
-
-
- -
- {/*
*/} - {/* ciao ciao */} - {/*
*/} -
-
- ) - } -} - -export default MediaOverlay diff --git a/src/components/SourceOverlay.jsx b/src/components/SourceOverlay.jsx new file mode 100644 index 0000000..3cd75c9 --- /dev/null +++ b/src/components/SourceOverlay.jsx @@ -0,0 +1,54 @@ +import React from 'react' + +class SourceOverlay extends React.Component { + + + renderVideo() { + + } + + renderImage() { + console.log(this.props.source) + return ( +
This is the image
+ ) + } + + renderError() { + return ( +
ERROR: no support for this sourcee
+ ) + } + + _renderSwitch() { + switch(this.props.source.type) { + case 'Video': + return this.renderVideo() + case 'Photo': + return this.renderImage() + default: + return this.renderError() + } + } + + render() { + return ( +
+
+
+ {this._renderSwitch()} +
+
+
+ ) + } +} + +export default SourceOverlay From 8aba901ee730e927aeaaca199837d15c5a20ac23 Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Thu, 20 Dec 2018 17:55:27 +0000 Subject: [PATCH 08/31] WIP: more defined modal for sources --- package.json | 1 + src/components/Dashboard.jsx | 7 ++ src/components/SourceOverlay.jsx | 55 ++++++--- src/scss/mediaoverlay.scss | 38 ++++-- src/store/initial.js | 1 + yarn.lock | 195 ++++--------------------------- 6 files changed, 103 insertions(+), 194 deletions(-) diff --git a/package.json b/package.json index 2d10611..c36d369 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "react": "^16.6.3", "react-dom": "^16.6.3", "react-portal": "^4.2.0", + "react-image": "^1.5.1", "react-redux": "^5.0.4", "react-tabs": "^1.0.0", "redux": "^3.6.0", diff --git a/src/components/Dashboard.jsx b/src/components/Dashboard.jsx index d734de0..6b3db5b 100644 --- a/src/components/Dashboard.jsx +++ b/src/components/Dashboard.jsx @@ -155,6 +155,13 @@ function mapDispatchToProps(dispatch) { } export default connect( + // state => ({ + // ...state, + // app: { + // ...state.app, + // source: state.domain.sources["24Kanal - Chervonosilske Damaged Tank Photo"] + // } + // }), state => state, mapDispatchToProps, )(Dashboard); diff --git a/src/components/SourceOverlay.jsx b/src/components/SourceOverlay.jsx index 3cd75c9..c5fc864 100644 --- a/src/components/SourceOverlay.jsx +++ b/src/components/SourceOverlay.jsx @@ -1,29 +1,44 @@ import React from 'react' +import Img from 'react-image' class SourceOverlay extends React.Component { - - - renderVideo() { - + constructor(props) { + super(props) + this.renderPhoto = this.renderPhoto.bind(this) } - renderImage() { - console.log(this.props.source) + renderVideo() { return ( -
This is the image
+ + ) + } + + renderPhoto() { + const imageExts = ['.jpg', '.png'] + const possibleUrls = imageExts.map(ext => `${this.props.source.path}${ext}`) + return ( +
+ +
) } renderError() { return ( -
ERROR: no support for this sourcee
+
ERROR: no support for this source
+ ) + } + + renderTestimony() { + return ( +
Eyewitness
) } @@ -32,7 +47,9 @@ class SourceOverlay extends React.Component { case 'Video': return this.renderVideo() case 'Photo': - return this.renderImage() + return this.renderPhoto() + case 'Eyewitness Testimony': + return this.renderTestimony() default: return this.renderError() } @@ -42,6 +59,12 @@ class SourceOverlay extends React.Component { return (
+
+
+ +
+
{this.props.source.id}
+
{this._renderSwitch()}
diff --git a/src/scss/mediaoverlay.scss b/src/scss/mediaoverlay.scss index 710eecd..8ebd864 100644 --- a/src/scss/mediaoverlay.scss +++ b/src/scss/mediaoverlay.scss @@ -3,6 +3,7 @@ $vimeo-width: 1000px; .mo-overlay { display: flex; + flex-direction: column; justify-content: center; align-items: center; position: absolute; @@ -14,18 +15,41 @@ $vimeo-width: 1000px; z-index: 20; } +.mo-header { + min-height: 4em; + width: 100%; + display: flex; + flex-direction: row; + justify-content: flex-start; + + .mo-header-close { + display: flex; + justify-content: center; + align-items: center; + min-width: 4em; + } + + .mo-header-text { + flex: 1; + margin-left: -4em; + display: flex; + align-items: center; + justify-content: center; + } +} + .mo-container { - background-color: transparent; - max-width: 80vw; - min-width: 80vw; - max-height: 90vh; - min-height: 90vh; + background-color: rgba(230,230,230,0.98); + max-width: 800px; + min-width: 800px; + max-height: 600px; + min-height: 600px; display: flex; flex-direction: column; - justify-content: center; + justify-content: flex-start; align-items: center; - .mo-controls, .mo-media-container { + .mo-media-container { flex: 1; display: flex; justify-content: center; diff --git a/src/store/initial.js b/src/store/initial.js index f7a4058..1c0a624 100644 --- a/src/store/initial.js +++ b/src/store/initial.js @@ -11,6 +11,7 @@ const initial = { narratives: [], locations: [], categories: [], + sources: {}, sites: [], tags: {}, notifications: [], diff --git a/yarn.lock b/yarn.lock index 0f75a41..fc7cad3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,12 +5,10 @@ "@ava/babel-plugin-throws-helper@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@ava/babel-plugin-throws-helper/-/babel-plugin-throws-helper-3.0.0.tgz#2c933ec22da0c4ce1fc5369f2b95452c70420586" - integrity sha512-mN9UolOs4WX09QkheU1ELkVy2WPnwonlO3XMdN8JF8fQqRVgVTR21xDbvEOUsbwz6Zwjq7ji9yzyjuXqDPalxg== "@ava/babel-preset-stage-4@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@ava/babel-preset-stage-4/-/babel-preset-stage-4-2.0.0.tgz#2cd072ff818e4432b87fd4c5fd5c5d1a405a4343" - integrity sha512-OWqMYeTSZ16AfLx0Vn0Uj7tcu+uMRlbKmks+DVCFlln7vomVsOtst+Oz+HCussDSFGpE+30VtHAUHLy6pLDpHQ== dependencies: "@babel/plugin-proposal-async-generator-functions" "^7.0.0" "@babel/plugin-proposal-object-rest-spread" "^7.0.0" @@ -23,7 +21,6 @@ "@ava/babel-preset-transform-test-files@4.0.0-beta.9": version "4.0.0-beta.9" resolved "https://registry.yarnpkg.com/@ava/babel-preset-transform-test-files/-/babel-preset-transform-test-files-4.0.0-beta.9.tgz#dc06a02d62a17b3afad9610168b8e3dba826edbe" - integrity sha512-22KVcr0Xr5q5TXlb5WVuEB5krG69XKOUHSrWkkq26O400ZYAlnh7FKB1Xf5hAiCQHX228gRp6yyYKG+OqeNgaw== dependencies: "@ava/babel-plugin-throws-helper" "^3.0.0" babel-plugin-espower "3.0.0-beta.2" @@ -31,7 +28,6 @@ "@ava/write-file-atomic@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@ava/write-file-atomic/-/write-file-atomic-2.2.0.tgz#d625046f3495f1f5e372135f473909684b429247" - integrity sha512-BTNB3nGbEfJT+69wuqXFr/bQH7Vr7ihx2xGOMNqPgDGhwspoZhiWumDDZNjBy7AScmqS5CELIOGtPVXESyrnDA== dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" @@ -46,7 +42,6 @@ "@babel/core@^7.0.0": version "7.1.5" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.1.5.tgz#abb32d7aa247a91756469e788998db6a72b93090" - integrity sha512-vOyH020C56tQvte++i+rX2yokZcRfbv/kKcw+/BCRw/cK6dvsr47aCzm8oC1XHwMSEWbqrZKzZRLzLnq6SFMsg== dependencies: "@babel/code-frame" "^7.0.0" "@babel/generator" "^7.1.5" @@ -85,7 +80,6 @@ "@babel/generator@^7.0.0", "@babel/generator@^7.0.0-beta.54", "@babel/generator@^7.1.5": version "7.1.5" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.1.5.tgz#615f064d13d95f8f9157c7261f68eddf32ec15b3" - integrity sha512-IO31r62xfMI+wBJVmgx0JR9ZOHty8HkoYpQAjRWUGG9vykBTlGHdArZ8zoFtpUu2gs17K7qTl/TtPpiSi6t+MA== dependencies: "@babel/types" "^7.1.5" jsesc "^2.5.1" @@ -257,7 +251,6 @@ "@babel/helpers@^7.1.5": version "7.1.5" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.1.5.tgz#68bfc1895d685f2b8f1995e788dbfe1f6ccb1996" - integrity sha512-2jkcdL02ywNBry1YNFAH/fViq4fXG0vdckHqeJk+75fpQ2OH+Az6076tX/M0835zA45E0Cqa6pV5Kiv9YOqjEg== dependencies: "@babel/template" "^7.1.2" "@babel/traverse" "^7.1.5" @@ -274,7 +267,6 @@ "@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.5": version "7.1.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.5.tgz#20b7d5e7e1811ba996f8a868962ea7dd2bfcd2fc" - integrity sha512-WXKf5K5HT6X0kKiCOezJZFljsfxKV1FpU8Tf1A7ZpGvyd/Q4hlrJm2EwoH2onaUq3O4tLDp+4gk0hHPsMyxmOg== "@babel/parser@^7.1.2", "@babel/parser@^7.1.3": version "7.1.3" @@ -619,6 +611,12 @@ "@babel/plugin-transform-react-jsx-self" "^7.0.0" "@babel/plugin-transform-react-jsx-source" "^7.0.0" +"@babel/runtime@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.2.0.tgz#b03e42eeddf5898e00646e4c840fa07ba8dcad7f" + dependencies: + regenerator-runtime "^0.12.0" + "@babel/template@^7.1.0", "@babel/template@^7.1.2": version "7.1.2" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.2.tgz#090484a574fef5a2d2d7726a674eceda5c5b5644" @@ -644,7 +642,6 @@ "@babel/traverse@^7.1.5": version "7.1.5" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.5.tgz#5aafca2039aa058c104cf2bfeb9fc4a857ccbca9" - integrity sha512-eU6XokWypl0MVJo+MTSPUtlfPePkrqsF26O+l1qFGlCKWwmiYAYy2Sy44Qw8m2u/LbPCsxYt90rghmqhYMGpPA== dependencies: "@babel/code-frame" "^7.0.0" "@babel/generator" "^7.1.5" @@ -667,7 +664,6 @@ "@babel/types@^7.1.5": version "7.1.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.1.5.tgz#12fe64e91a431234b7017b4227a78cc0eec4e081" - integrity sha512-sJeqa/d9eM/bax8Ivg+fXF7FpN3E/ZmTrWbkk6r+g7biVYfALMnLin4dKijsaqEhpd2xvOGfQTkQkD31YCVV4A== dependencies: esutils "^2.0.2" lodash "^4.17.10" @@ -676,7 +672,6 @@ "@concordance/react@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@concordance/react/-/react-1.0.0.tgz#fcf3cad020e5121bfd1c61d05bc3516aac25f734" - integrity sha512-htrsRaQX8Iixlsek8zQU7tE8wcsTQJ5UhZkSPEA8slCDAisKpC/2VgU/ucPn32M5/LjGGXRaUEKvEw1Wiuu4zQ== dependencies: arrify "^1.0.1" @@ -867,7 +862,6 @@ amdefine@>=0.0.4: ansi-align@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" - integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= dependencies: string-width "^2.0.0" @@ -878,7 +872,6 @@ ansi-colors@^3.0.0: ansi-escapes@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" - integrity sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw== ansi-html@0.0.7: version "0.0.7" @@ -923,7 +916,6 @@ are-we-there-yet@~1.1.2: argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" @@ -942,7 +934,6 @@ arr-union@^3.1.0: array-differ@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" - integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE= array-find-index@^1.0.1: version "1.0.2" @@ -969,7 +960,6 @@ array-uniq@^1.0.1: array-uniq@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-2.0.0.tgz#0009e30306e37a6dd2e2e2480db5316fdade1583" - integrity sha512-O3QZEr+3wDj7otzF7PjNGs6CA3qmYMLvt5xGkjY/V0VxS+ovvqVo/5wKM/OVOAyuX4DTh9H31zE/yKtO66hTkg== array-unique@^0.3.2: version "0.3.2" @@ -978,7 +968,6 @@ array-unique@^0.3.2: arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= asn1.js@^4.0.0: version "4.10.1" @@ -1031,7 +1020,6 @@ atob@^2.1.1: ava@1.0.0-beta.8: version "1.0.0-beta.8" resolved "https://registry.yarnpkg.com/ava/-/ava-1.0.0-beta.8.tgz#e6e225405be478476610161138db220f91dca460" - integrity sha512-aEG/JoBOP/iMC+0vGbfFnvQzTUKgpYm5i17j+VRLEy/qnGmynQJfPW4Hot/Cv1VaiRbpZ/S52O4BAI4N2HHpbA== dependencies: "@ava/babel-preset-stage-4" "^2.0.0" "@ava/babel-preset-transform-test-files" "4.0.0-beta.9" @@ -1141,7 +1129,6 @@ babel-loader@^8.0.4: babel-plugin-espower@3.0.0-beta.2: version "3.0.0-beta.2" resolved "https://registry.yarnpkg.com/babel-plugin-espower/-/babel-plugin-espower-3.0.0-beta.2.tgz#424f1260beab9ecd90eec2a833ccdee30a4a0f4d" - integrity sha512-oK85tacH/SRebgt+f3NCu/CSGhutlgSXiJ87UMDN4pBTW1rgHrlYoqcKCdQZv23SztVkUy7o7bBEAtH/NyRpJQ== dependencies: "@babel/generator" "^7.0.0-beta.54" "@babel/parser" "^7.0.0-beta.54" @@ -1251,7 +1238,6 @@ boolbase@~1.0.0: boxen@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" - integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== dependencies: ansi-align "^2.0.0" camelcase "^4.0.0" @@ -1290,7 +1276,6 @@ brorand@^1.0.1: browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" @@ -1420,7 +1405,6 @@ cache-base@^1.0.1: call-matcher@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/call-matcher/-/call-matcher-1.1.0.tgz#23b2c1bc7a8394c8be28609d77ddbd5786680432" - integrity sha512-IoQLeNwwf9KTNbtSA7aEBb1yfDbdnzwjCetjkC8io5oGeOmK2CBNdg0xr+tadRYKO0p7uQyZzvon0kXlZbvGrw== dependencies: core-js "^2.0.0" deep-equal "^1.0.0" @@ -1430,7 +1414,6 @@ call-matcher@^1.0.0: call-signature@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/call-signature/-/call-signature-0.0.2.tgz#a84abc825a55ef4cb2b028bd74e205a65b9a4996" - integrity sha1-qEq8glpV70yysCi9dOIFpluaSZY= camel-case@3.0.x: version "3.0.0" @@ -1449,7 +1432,6 @@ camelcase-keys@^2.0.0: camelcase-keys@^4.0.0: version "4.2.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" - integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= dependencies: camelcase "^4.1.0" map-obj "^2.0.0" @@ -1474,7 +1456,6 @@ caniuse-lite@^1.0.30000890: capture-stack-trace@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" - integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== caseless@~0.12.0: version "0.12.0" @@ -1501,7 +1482,6 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.1, chalk@^2.4.1: chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" - integrity sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ== dependencies: anymatch "^2.0.0" async-each "^1.0.0" @@ -1531,12 +1511,10 @@ chrome-trace-event@^1.0.0: ci-info@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" - integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== ci-parallel-vars@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ci-parallel-vars/-/ci-parallel-vars-1.0.0.tgz#af97729ed1c7381911ca37bcea263d62638701b3" - integrity sha512-u6dx20FBXm+apMi+5x7UVm6EH7BL1gc4XrcnQewjcB7HWRcor/V5qWc3RG2HwpgDJ26gIi2DSEu3B7sXynAw/g== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" @@ -1567,34 +1545,28 @@ clean-css@4.2.x: clean-stack@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-1.3.0.tgz#9e821501ae979986c46b1d66d2d432db2fd4ae31" - integrity sha1-noIVAa6XmYbEax1m0tQy2y/UrjE= clean-yaml-object@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz#63fb110dc2ce1a84dc21f6d9334876d010ae8b68" - integrity sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g= cli-boxes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" - integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= dependencies: restore-cursor "^2.0.0" cli-spinners@^1.1.0: version "1.3.1" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" - integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg== cli-truncate@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-1.1.0.tgz#2b2dfd83c53cfd3572b87fc4d430a808afb04086" - integrity sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA== dependencies: slice-ansi "^1.0.0" string-width "^2.0.0" @@ -1627,7 +1599,6 @@ clone-deep@^2.0.1: clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= co@^4.6.0: version "4.6.0" @@ -1636,7 +1607,6 @@ co@^4.6.0: code-excerpt@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/code-excerpt/-/code-excerpt-2.1.1.tgz#5fe3057bfbb71a5f300f659ef2cc0a47651ba77c" - integrity sha512-tJLhH3EpFm/1x7heIW0hemXJTUU5EWl2V0EIX558jp05Mt1U6DVryCgkp3l37cxqs+DNbNgxG43SkwJXpQ14Jw== dependencies: convert-to-spaces "^1.0.1" @@ -1674,7 +1644,6 @@ commander@2: commander@2.15.1: version "2.15.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" - integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== commander@2.17.x, commander@~2.17.1: version "2.17.1" @@ -1687,7 +1656,6 @@ commander@~2.13.0: common-path-prefix@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-1.0.0.tgz#cd52f6f0712e0baab97d6f9732874f22f47752c0" - integrity sha1-zVL28HEuC6q5fW+XModPIvR3UsA= commondir@^1.0.1: version "1.0.1" @@ -1731,7 +1699,6 @@ concat-stream@^1.5.0: concordance@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/concordance/-/concordance-3.0.0.tgz#b2286af54405fc995fc7345b0b106d8dd073cb29" - integrity sha512-CZBzJ3/l5QJjlZM20WY7+5GP5pMTw+1UEbThcpMw8/rojsi5sBCiD8ZbBLtD+jYpRGAkwuKuqk108c154V9eyQ== dependencies: date-time "^2.1.0" esutils "^2.0.2" @@ -1748,7 +1715,6 @@ concordance@^3.0.0: configstore@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" - integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== dependencies: dot-prop "^4.1.0" graceful-fs "^4.1.2" @@ -1792,7 +1758,6 @@ convert-source-map@^1.1.0, convert-source-map@^1.5.1: convert-to-spaces@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz#7e3e48bbe6d997b1417ddca2868204b4d3d85715" - integrity sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU= cookie-signature@1.0.6: version "1.0.6" @@ -1835,7 +1800,6 @@ create-ecdh@^4.0.0: create-error-class@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" - integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= dependencies: capture-stack-trace "^1.0.0" @@ -1870,7 +1834,6 @@ cross-spawn@^3.0.0: cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= dependencies: lru-cache "^4.0.1" shebang-command "^1.2.0" @@ -1905,7 +1868,6 @@ crypto-browserify@^3.11.0: crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" - integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= css-loader@^1.0.0: version "1.0.0" @@ -2264,7 +2226,6 @@ date-now@^0.1.4: date-time@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/date-time/-/date-time-2.1.0.tgz#0286d1b4c769633b3ca13e1e62558d2dbdc2eba2" - integrity sha512-/9+C44X7lot0IeiyfgJmETtRMhBidBYM2QFFIkGa0U1k+hSyY87Nw7PY3eDqpvCBm7I3WCSfPeZskW/YYq6m4g== dependencies: time-zone "^1.0.0" @@ -2277,7 +2238,6 @@ debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, debug@^2.6. debug@3.1.0, debug@=3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: ms "2.0.0" @@ -2290,7 +2250,6 @@ debug@^3.1.0: decamelize-keys@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= dependencies: decamelize "^1.1.0" map-obj "^1.0.0" @@ -2298,7 +2257,6 @@ decamelize-keys@^1.0.0: decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= decamelize@^2.0.0: version "2.0.0" @@ -2313,7 +2271,6 @@ decode-uri-component@^0.2.0: deep-equal@^1.0.0, deep-equal@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" - integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= deep-extend@^0.6.0: version "0.6.0" @@ -2329,7 +2286,6 @@ default-gateway@^2.6.0: defaults@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= dependencies: clone "^1.0.2" @@ -2403,7 +2359,6 @@ detect-node@^2.0.3: diff@3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== diffie-hellman@^5.0.0: version "5.0.3" @@ -2416,7 +2371,6 @@ diffie-hellman@^5.0.0: dir-glob@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" - integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== dependencies: arrify "^1.0.1" path-type "^3.0.0" @@ -2489,14 +2443,12 @@ domutils@1.5.1: dot-prop@^4.1.0, dot-prop@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" - integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== dependencies: is-obj "^1.0.0" duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= duplexify@^3.4.2, duplexify@^3.6.0: version "3.6.1" @@ -2537,7 +2489,6 @@ elliptic@^6.0.0: emittery@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.4.1.tgz#abe9d3297389ba424ac87e53d1c701962ce7433d" - integrity sha512-r4eRSeStEGf6M5SKdrQhhLK5bOwOBxQhIE3YSTnZE3GpKiLfnnhE+tPtrJE79+eDJgm39BM6LSoI8SCx4HbwlQ== emojis-list@^2.0.0: version "2.1.0" @@ -2546,7 +2497,6 @@ emojis-list@^2.0.0: empower-core@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/empower-core/-/empower-core-1.2.0.tgz#ce3fb2484d5187fa29c23fba8344b0b2fdf5601c" - integrity sha512-g6+K6Geyc1o6FdXs9HwrXleCFan7d66G5xSCfSF7x1mJDCes6t0om9lFQG3zOrzh3Bkb/45N0cZ5Gqsf7YrzGQ== dependencies: call-signature "0.0.2" core-js "^2.0.0" @@ -2576,7 +2526,6 @@ entities@~1.1.1: equal-length@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/equal-length/-/equal-length-1.0.1.tgz#21ca112d48ab24b4e1e7ffc0e5339d31fdfc274c" - integrity sha1-IcoRLUirJLTh5//A5TOdMf38J0w= errno@^0.1.3, errno@~0.1.7: version "0.1.7" @@ -2587,7 +2536,6 @@ errno@^0.1.3, errno@~0.1.7: error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" @@ -2616,7 +2564,6 @@ es5-shim@^4.5.1: es6-error@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" - integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== es6-promise@^4.1.1: version "4.2.5" @@ -2640,12 +2587,10 @@ eslint-scope@^4.0.0: esm@^3.0.80: version "3.0.84" resolved "https://registry.yarnpkg.com/esm/-/esm-3.0.84.tgz#bb108989f4673b32d4f62406869c28eed3815a63" - integrity sha512-SzSGoZc17S7P+12R9cg21Bdb7eybX25RnIeRZ80xZs+VZ3kdQKzqTp2k4hZJjR7p9l0186TTXSgrxzlMDBktlw== espower-location-detector@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/espower-location-detector/-/espower-location-detector-1.0.0.tgz#a17b7ecc59d30e179e2bef73fb4137704cb331b5" - integrity sha1-oXt+zFnTDheeK+9z+0E3cEyzMbU= dependencies: is-url "^1.2.1" path-is-absolute "^1.0.0" @@ -2655,12 +2600,10 @@ espower-location-detector@^1.0.0: esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== espurify@^1.6.0: version "1.8.1" resolved "https://registry.yarnpkg.com/espurify/-/espurify-1.8.1.tgz#5746c6c1ab42d302de10bd1d5bf7f0e8c0515056" - integrity sha512-ZDko6eY/o+D/gHCWyHTU85mKDgYcS4FJj7S+YD6WIInm7GQ6AnOjmcL4+buFV/JOztVLELi/7MmuGU5NHta0Mg== dependencies: core-js "^2.0.0" @@ -2718,7 +2661,6 @@ execa@^0.10.0: execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= dependencies: cross-spawn "^5.0.1" get-stream "^3.0.0" @@ -2824,7 +2766,6 @@ fast-deep-equal@^2.0.1: fast-diff@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== fast-json-stable-stringify@^2.0.0: version "2.0.0" @@ -2849,7 +2790,6 @@ faye-websocket@~0.11.0: figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= dependencies: escape-string-regexp "^1.0.5" @@ -3016,7 +2956,6 @@ function-bind@^1.1.1: function-name-support@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/function-name-support/-/function-name-support-0.2.0.tgz#55d3bfaa6eafd505a50f9bc81fdf57564a0bb071" - integrity sha1-VdO/qm6v1QWlD5vIH99XVkoLsHE= gauge@~2.7.3: version "2.7.4" @@ -3044,7 +2983,6 @@ get-caller-file@^1.0.1: get-port@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/get-port/-/get-port-4.0.0.tgz#373c85960138ee20027c070e3cb08019fea29816" - integrity sha512-Yy3yNI2oShgbaWg4cmPhWjkZfktEvpKI09aDX4PZzNtlU9obuYrX7x2mumQsrNxlF+Ls7OtMQW/u+X4s896bOQ== get-stdin@^4.0.1: version "4.0.1" @@ -3074,7 +3012,6 @@ glob-parent@^3.1.0: glob@7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -3097,7 +3034,6 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@~7.1.1: global-dirs@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" - integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= dependencies: ini "^1.3.4" @@ -3136,7 +3072,6 @@ globby@^6.1.0: globby@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" - integrity sha1-+yzP+UAfhgCUXfral0QMypcrhoA= dependencies: array-union "^1.0.1" dir-glob "^2.0.0" @@ -3156,7 +3091,6 @@ globule@^1.0.0: got@^6.7.1: version "6.7.1" resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" - integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= dependencies: create-error-class "^3.0.0" duplexer3 "^0.1.4" @@ -3177,7 +3111,6 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2: growl@1.10.5: version "1.10.5" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== handle-thing@^1.2.5: version "1.2.5" @@ -3408,7 +3341,6 @@ iferr@^0.1.5: ignore-by-default@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" - integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= ignore-walk@^3.0.1: version "3.0.1" @@ -3419,17 +3351,14 @@ ignore-walk@^3.0.1: ignore@^3.3.5: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" - integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== import-lazy@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= import-local@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" - integrity sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ== dependencies: pkg-dir "^2.0.0" resolve-cwd "^2.0.0" @@ -3458,7 +3387,6 @@ indent-string@^2.1.0: indent-string@^3.0.0, indent-string@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" - integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= indexof@0.0.1: version "0.0.1" @@ -3531,7 +3459,6 @@ ipaddr.js@^1.5.2: irregular-plurals@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-2.0.0.tgz#39d40f05b00f656d0b7fa471230dd3b714af2872" - integrity sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw== is-accessor-descriptor@^0.1.6: version "0.1.6" @@ -3572,7 +3499,6 @@ is-callable@^1.1.3, is-callable@^1.1.4: is-ci@^1.0.10, is-ci@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" - integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== dependencies: ci-info "^1.5.0" @@ -3611,7 +3537,6 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-error@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/is-error/-/is-error-2.2.1.tgz#684a96d84076577c98f4cdb40c6d26a5123bf19c" - integrity sha1-aEqW2EB2V3yY9M20DG0mpRI78Zw= is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" @@ -3662,7 +3587,6 @@ is-glob@^4.0.0: is-installed-globally@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" - integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= dependencies: global-dirs "^0.1.0" is-path-inside "^1.0.0" @@ -3670,7 +3594,6 @@ is-installed-globally@^0.1.0: is-npm@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" - integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= is-number@^3.0.0: version "3.0.0" @@ -3681,19 +3604,16 @@ is-number@^3.0.0: is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= is-observable@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-0.2.0.tgz#b361311d83c6e5d726cabf5e250b0237106f5ae2" - integrity sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI= dependencies: symbol-observable "^0.2.2" is-observable@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" - integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== dependencies: symbol-observable "^1.1.0" @@ -3716,7 +3636,6 @@ is-path-inside@^1.0.0: is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" @@ -3727,12 +3646,10 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= is-redirect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" - integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= is-regex@^1.0.4: version "1.0.4" @@ -3743,7 +3660,6 @@ is-regex@^1.0.4: is-retry-allowed@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" - integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= is-stream@^1.0.0, is-stream@^1.1.0: version "1.1.0" @@ -3762,12 +3678,10 @@ is-typedarray@~1.0.0: is-url@^1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" - integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== is-utf8@^0.2.0, is-utf8@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= is-windows@^1.0.2: version "1.0.2" @@ -3828,7 +3742,6 @@ js-levenshtein@^1.1.3: js-string-escape@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" - integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8= "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" @@ -3842,7 +3755,6 @@ js-tokens@^3.0.2: js-yaml@^3.10.0: version "3.12.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" - integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -3862,7 +3774,6 @@ jsesc@~0.5.0: json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== json-schema-traverse@^0.3.0: version "0.3.1" @@ -3924,7 +3835,6 @@ kind-of@^6.0.0, kind-of@^6.0.2: latest-version@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" - integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= dependencies: package-json "^4.0.0" @@ -3957,7 +3867,6 @@ load-json-file@^1.0.0: load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= dependencies: graceful-fs "^4.1.2" parse-json "^4.0.0" @@ -4014,17 +3923,14 @@ lodash.camelcase@^4.3.0: lodash.clone@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" - integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y= lodash.clonedeep@^4.3.2, lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= lodash.clonedeepwith@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz#6ee30573a03a1a60d670a62ef33c10cf1afdbdd4" - integrity sha1-buMFc6A6GmDWcKYu8zwQzxr9vdQ= lodash.debounce@^4.0.3, lodash.debounce@^4.0.8: version "4.0.8" @@ -4033,22 +3939,18 @@ lodash.debounce@^4.0.3, lodash.debounce@^4.0.8: lodash.difference@^4.3.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" - integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw= lodash.flatten@^4.2.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= lodash.flattendeep@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" - integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= lodash.merge@^4.6.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" - integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== lodash.mergewith@^4.6.0: version "4.6.1" @@ -4065,7 +3967,6 @@ lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.3, lodash@^4.17.5, lodash@^4.2.0, l log-symbols@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" - integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== dependencies: chalk "^2.0.1" @@ -4083,7 +3984,6 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: loud-rejection@^1.0.0, loud-rejection@^1.2.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= dependencies: currently-unhandled "^0.4.1" signal-exit "^3.0.0" @@ -4095,7 +3995,6 @@ lower-case@^1.1.1: lowercase-keys@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== lru-cache@^4.0.1, lru-cache@^4.1.1: version "4.1.3" @@ -4107,7 +4006,6 @@ lru-cache@^4.0.1, lru-cache@^4.1.1: make-dir@^1.0.0, make-dir@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== dependencies: pify "^3.0.0" @@ -4128,7 +4026,6 @@ map-obj@^1.0.0, map-obj@^1.0.1: map-obj@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" - integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= map-visit@^1.0.0: version "1.0.0" @@ -4139,21 +4036,18 @@ map-visit@^1.0.0: matcher@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/matcher/-/matcher-1.1.1.tgz#51d8301e138f840982b338b116bb0c09af62c1c2" - integrity sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg== dependencies: escape-string-regexp "^1.0.4" md5-hex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-2.0.0.tgz#d0588e9f1c74954492ecd24ac0ac6ce997d92e33" - integrity sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM= dependencies: md5-o-matic "^0.1.1" md5-o-matic@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" - integrity sha1-givM1l4RfFFPqxdrJZRdVBAKA8M= md5.js@^1.3.4: version "1.3.5" @@ -4200,7 +4094,6 @@ meow@^3.7.0: meow@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" - integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig== dependencies: camelcase-keys "^4.0.0" decamelize-keys "^1.0.0" @@ -4298,7 +4191,6 @@ minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.4, minimatch@~3.0.2: minimist-options@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" - integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== dependencies: arrify "^1.0.1" is-plain-obj "^1.1.0" @@ -4362,7 +4254,6 @@ mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdi mocha@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" - integrity sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ== dependencies: browser-stdout "1.3.1" commander "2.15.1" @@ -4409,7 +4300,6 @@ multicast-dns@^6.0.1: multimatch@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" - integrity sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis= dependencies: array-differ "^1.0.0" array-union "^1.0.1" @@ -4671,7 +4561,6 @@ object.pick@^1.3.0: observable-to-promise@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/observable-to-promise/-/observable-to-promise-0.5.0.tgz#c828f0f0dc47e9f86af8a4977c5d55076ce7a91f" - integrity sha1-yCjw8NxH6fhq+KSXfF1VB2znqR8= dependencies: is-observable "^0.2.0" symbol-observable "^1.0.4" @@ -4699,7 +4588,6 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= dependencies: mimic-fn "^1.0.0" @@ -4712,7 +4600,6 @@ opn@^5.1.0: ora@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ora/-/ora-3.0.0.tgz#8179e3525b9aafd99242d63cc206fd64732741d0" - integrity sha512-LBS97LFe2RV6GJmXBi6OKcETKyklHNMV0xw7BtsVn2MlsgsydyZetSCbCANr+PFLmDyv4KV88nn0eCKza665Mg== dependencies: chalk "^2.3.1" cli-cursor "^2.1.0" @@ -4811,7 +4698,6 @@ p-try@^2.0.0: package-hash@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-2.0.0.tgz#78ae326c89e05a4d813b68601977af05c00d2a0d" - integrity sha1-eK4ybIngWk2BO2hgGXevBcANKg0= dependencies: graceful-fs "^4.1.11" lodash.flattendeep "^4.4.0" @@ -4821,7 +4707,6 @@ package-hash@^2.0.0: package-json@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" - integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= dependencies: got "^6.7.1" registry-auth-token "^3.0.1" @@ -4872,7 +4757,6 @@ parse-json@^2.2.0: parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= dependencies: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" @@ -4880,7 +4764,6 @@ parse-json@^4.0.0: parse-ms@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" - integrity sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0= parseurl@~1.3.2: version "1.3.2" @@ -4939,7 +4822,6 @@ path-type@^1.0.0: path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== dependencies: pify "^3.0.0" @@ -4978,7 +4860,6 @@ pinkie@^2.0.0: pkg-conf@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-2.1.0.tgz#2126514ca6f2abfebd168596df18ba57867f0058" - integrity sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg= dependencies: find-up "^2.0.0" load-json-file "^4.0.0" @@ -4998,7 +4879,6 @@ pkg-dir@^3.0.0: plur@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/plur/-/plur-3.0.1.tgz#268652d605f816699b42b86248de73c9acd06a7c" - integrity sha512-lJl0ojUynAM1BZn58Pas2WT/TXeC1+bS+UqShl0x9+49AtOn7DixRXVzaC8qrDOIxNDmepKnLuMTH7NQmkX0PA== dependencies: irregular-plurals "^2.0.0" @@ -5056,7 +4936,6 @@ postcss@^6.0.1, postcss@^6.0.23: prepend-http@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= pretty-error@^2.0.2: version "2.1.1" @@ -5068,7 +4947,6 @@ pretty-error@^2.0.2: pretty-ms@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-3.2.0.tgz#87a8feaf27fc18414d75441467d411d6e6098a25" - integrity sha512-ZypexbfVUGTFxb0v+m1bUyy92DHe5SyYlnyY0msyms5zd3RwyvNgyxZZsXXgoyzlxjx5MiqtXUdhUfvQbe0A2Q== dependencies: parse-ms "^1.0.0" @@ -5092,7 +4970,13 @@ promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" -prop-types@^15.5.0, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2: +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + dependencies: + asap "~2.0.3" + +prop-types@15.6.2, prop-types@^15.5.0, prop-types@^15.5.10, prop-types@^15.5.7, prop-types@^15.6.0: version "15.6.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" dependencies: @@ -5175,7 +5059,6 @@ querystringify@^2.0.0: quick-lru@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" - integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: version "2.0.6" @@ -5229,6 +5112,13 @@ react-portal@^4.2.0: dependencies: prop-types "^15.5.8" +react-image@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/react-image/-/react-image-1.5.1.tgz#e900baa3f48b15ca94500542a2aff762c94431b8" + dependencies: + "@babel/runtime" "^7.0.0" + prop-types "15.6.2" + react-redux@^5.0.4: version "5.0.7" resolved "http://registry.npmjs.org/react-redux/-/react-redux-5.0.7.tgz#0dc1076d9afb4670f993ffaef44b8f8c1155a4c8" @@ -5267,7 +5157,6 @@ read-pkg-up@^1.0.1: read-pkg-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= dependencies: find-up "^2.0.0" read-pkg "^3.0.0" @@ -5283,7 +5172,6 @@ read-pkg@^1.0.0: read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= dependencies: load-json-file "^4.0.0" normalize-package-data "^2.3.2" @@ -5328,7 +5216,6 @@ redent@^1.0.0: redent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" - integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= dependencies: indent-string "^3.0.0" strip-indent "^2.0.0" @@ -5379,6 +5266,10 @@ regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" +regenerator-runtime@^0.12.0: + version "0.12.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" + regenerator-transform@^0.13.3: version "0.13.3" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb" @@ -5414,7 +5305,6 @@ regexpu-core@^4.1.3, regexpu-core@^4.2.0: registry-auth-token@^3.0.1: version "3.3.2" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" - integrity sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ== dependencies: rc "^1.1.6" safe-buffer "^5.0.1" @@ -5422,7 +5312,6 @@ registry-auth-token@^3.0.1: registry-url@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" - integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= dependencies: rc "^1.0.1" @@ -5453,7 +5342,6 @@ relateurl@0.2.x: release-zalgo@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" - integrity sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA= dependencies: es6-error "^4.0.1" @@ -5521,7 +5409,6 @@ require-main-filename@^1.0.1: require-precompiled@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/require-precompiled/-/require-precompiled-0.1.0.tgz#5a1b52eb70ebed43eb982e974c85ab59571e56fa" - integrity sha1-WhtS63Dr7UPrmC6XTIWrWVceVvo= requires-port@^1.0.0: version "1.0.0" @@ -5554,7 +5441,6 @@ resolve@^1.3.2: restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= dependencies: onetime "^2.0.0" signal-exit "^3.0.2" @@ -5680,7 +5566,6 @@ selfsigned@^1.9.1: semver-diff@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" - integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= dependencies: semver "^5.0.3" @@ -5713,7 +5598,6 @@ send@0.16.2: serialize-error@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" - integrity sha1-ULZ51WNc34Rme9yOWa9OW4HV9go= serialize-javascript@^1.4.0: version "1.5.0" @@ -5802,24 +5686,20 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= slash@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== slice-ansi@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" - integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== dependencies: is-fullwidth-code-point "^2.0.0" slide@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= snapdragon-node@^2.0.1: version "2.1.1" @@ -5883,7 +5763,6 @@ source-map-resolve@^0.5.0: source-map-support@^0.5.9: version "0.5.9" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" - integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -5905,7 +5784,6 @@ source-map@^0.5.0, source-map@^0.5.6: source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== spdx-correct@^3.0.0: version "3.0.2" @@ -5961,7 +5839,6 @@ split-string@^3.0.1, split-string@^3.0.2: sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sshpk@^1.7.0: version "1.15.1" @@ -5986,7 +5863,6 @@ ssri@^5.2.4: stack-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620" - integrity sha1-1PM6tU6OOHeLDKXP07OvsS22hiA= static-extend@^0.1.1: version "0.1.2" @@ -6077,7 +5953,6 @@ strip-ansi@^4.0.0: strip-bom-buf@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz#1cb45aaf57530f4caf86c7f75179d2c9a51dd572" - integrity sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI= dependencies: is-utf8 "^0.2.1" @@ -6090,7 +5965,6 @@ strip-bom@^2.0.0: strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= strip-eof@^1.0.0: version "1.0.0" @@ -6105,7 +5979,6 @@ strip-indent@^1.0.1: strip-indent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= strip-json-comments@~2.0.1: version "2.0.1" @@ -6121,7 +5994,6 @@ style-loader@^0.23.1: supertap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supertap/-/supertap-1.0.0.tgz#bd9751c7fafd68c68cf8222a29892206a119fa9e" - integrity sha512-HZJ3geIMPgVwKk2VsmO5YHqnnJYl6bV5A9JW2uzqV43WmpgliNEYbuvukfor7URpaqpxuw3CfZ3ONdVbZjCgIA== dependencies: arrify "^1.0.1" indent-string "^3.2.0" @@ -6132,7 +6004,6 @@ supertap@^1.0.0: supports-color@5.4.0: version "5.4.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" - integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w== dependencies: has-flag "^3.0.0" @@ -6149,7 +6020,6 @@ supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.4.0, supports-co symbol-observable@^0.2.2: version "0.2.4" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-0.2.4.tgz#95a83db26186d6af7e7a18dbd9760a2f86d08f40" - integrity sha1-lag9smGG1q9+ehjb2XYKL4bQj0A= symbol-observable@^1.0.2, symbol-observable@^1.0.3, symbol-observable@^1.0.4, symbol-observable@^1.1.0: version "1.2.0" @@ -6182,7 +6052,6 @@ tar@^4: term-size@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" - integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= dependencies: execa "^0.7.0" @@ -6200,12 +6069,10 @@ thunky@^1.0.2: time-zone@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/time-zone/-/time-zone-1.0.0.tgz#99c5bf55958966af6d06d83bdf3800dc82faec5d" - integrity sha1-mcW/VZWJZq9tBtg73zgA3IL67F0= timed-out@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= timers-browserify@^2.0.4: version "2.0.10" @@ -6267,12 +6134,10 @@ trim-newlines@^1.0.0: trim-newlines@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" - integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= trim-off-newlines@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" - integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= trim-right@^1.0.1: version "1.0.1" @@ -6351,7 +6216,6 @@ uglifyjs-webpack-plugin@^1.2.4: uid2@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/uid2/-/uid2-0.0.3.tgz#483126e11774df2f71b8b639dcd799c376162b82" - integrity sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I= unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" @@ -6396,14 +6260,12 @@ unique-slug@^2.0.0: unique-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" - integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= dependencies: crypto-random-string "^1.0.0" unique-temp-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-temp-dir/-/unique-temp-dir-1.0.0.tgz#6dce95b2681ca003eebfb304a415f9cbabcc5385" - integrity sha1-bc6VsmgcoAPuv7MEpBX5y6vMU4U= dependencies: mkdirp "^0.5.1" os-tmpdir "^1.0.1" @@ -6423,7 +6285,6 @@ unset-value@^1.0.0: unzip-response@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" - integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= upath@^1.0.5: version "1.1.0" @@ -6432,7 +6293,6 @@ upath@^1.0.5: update-notifier@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" - integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== dependencies: boxen "^1.2.1" chalk "^2.0.1" @@ -6462,7 +6322,6 @@ urix@^0.1.0: url-parse-lax@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= dependencies: prepend-http "^1.0.1" @@ -6599,7 +6458,6 @@ wbuf@^1.1.0, wbuf@^1.7.2: wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= dependencies: defaults "^1.0.3" @@ -6717,7 +6575,6 @@ websocket-extensions@>=0.1.1: well-known-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/well-known-symbols/-/well-known-symbols-1.0.0.tgz#73c78ae81a7726a8fa598e2880801c8b16225518" - integrity sha1-c8eK6Bp3Jqj6WY4ogIAcixYiVRg= whatwg-fetch@^2.0.3: version "2.0.4" @@ -6746,7 +6603,6 @@ wide-align@^1.1.0: widest-line@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" - integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== dependencies: string-width "^2.1.1" @@ -6770,7 +6626,6 @@ wrappy@1: write-file-atomic@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" - integrity sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA== dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" @@ -6779,7 +6634,6 @@ write-file-atomic@^2.0.0: xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" - integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= xhr@2.2.2: version "2.2.2" @@ -6821,7 +6675,6 @@ yallist@^3.0.0, yallist@^3.0.2: yargs-parser@^10.0.0, yargs-parser@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" - integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== dependencies: camelcase "^4.1.0" From ff7ef5ccb1e4c69849e0b225ff0f56d09a7d9e22 Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Fri, 21 Dec 2018 11:34:36 +0000 Subject: [PATCH 09/31] fmt source display: photo --- src/components/Dashboard.jsx | 16 ++--- src/components/SourceOverlay.jsx | 22 ++++++- src/components/presentational/NoSource.js | 22 +++++++ src/scss/mediaoverlay.scss | 77 +++++++++++++++++++---- yarn.lock | 28 +++------ 5 files changed, 121 insertions(+), 44 deletions(-) create mode 100644 src/components/presentational/NoSource.js diff --git a/src/components/Dashboard.jsx b/src/components/Dashboard.jsx index 6b3db5b..e5e6050 100644 --- a/src/components/Dashboard.jsx +++ b/src/components/Dashboard.jsx @@ -155,13 +155,13 @@ function mapDispatchToProps(dispatch) { } export default connect( - // state => ({ - // ...state, - // app: { - // ...state.app, - // source: state.domain.sources["24Kanal - Chervonosilske Damaged Tank Photo"] - // } - // }), - state => state, + state => ({ + ...state, + app: { + ...state.app, + source: state.domain.sources["24Kanal - Chervonosilske Damaged Tank Photo"] + } + }), + // state => state, mapDispatchToProps, )(Dashboard); diff --git a/src/components/SourceOverlay.jsx b/src/components/SourceOverlay.jsx index c5fc864..2855038 100644 --- a/src/components/SourceOverlay.jsx +++ b/src/components/SourceOverlay.jsx @@ -1,5 +1,7 @@ import React from 'react' import Img from 'react-image' +import Spinner from './presentational/Spinner' +import NoSource from './presentational/NoSource' class SourceOverlay extends React.Component { constructor(props) { @@ -24,9 +26,11 @@ class SourceOverlay extends React.Component { const imageExts = ['.jpg', '.png'] const possibleUrls = imageExts.map(ext => `${this.props.source.path}${ext}`) return ( -
- -
+ } + unloader={} + /> ) } @@ -56,6 +60,7 @@ class SourceOverlay extends React.Component { } render() { + const {id, url, title, date, type, affil_1, affil_2} = this.props.source return (
@@ -68,6 +73,17 @@ class SourceOverlay extends React.Component {
{this._renderSwitch()}
+
+
+ {id ?
{id}
: null} + {title?
{title}
: null} +
+ {type ?
Type: {type}
: null} + {date ?
Date:{date}
: null} +
+ {url ? : null} +
+
) diff --git a/src/components/presentational/NoSource.js b/src/components/presentational/NoSource.js new file mode 100644 index 0000000..85cb542 --- /dev/null +++ b/src/components/presentational/NoSource.js @@ -0,0 +1,22 @@ +import React from 'react'; + +const NoSource = ({ failedUrls }) => { + return ( +
+
+ + error + +
No media found.
+
+
+ The following URLs were tried: +
+
    + {failedUrls.map((url, idx) =>
  • {url}
  • )} +
+
+ ) +} + +export default NoSource; diff --git a/src/scss/mediaoverlay.scss b/src/scss/mediaoverlay.scss index 8ebd864..77b48f2 100644 --- a/src/scss/mediaoverlay.scss +++ b/src/scss/mediaoverlay.scss @@ -1,5 +1,9 @@ -$vimeo-height: 800px; -$vimeo-width: 1000px; +$panel-width: 800px; +$panel-height: 800px; +$vimeo-width: $panel-width; +$vimeo-height: $panel-height; + +$header-inset: 10px; .mo-overlay { display: flex; @@ -11,39 +15,43 @@ $vimeo-width: 1000px; left: 0; width: 100vw; height: 100vh; - background-color: rgba(230, 230, 230, 0.5); + background-color: rgba(239, 239, 239, 0.5); z-index: 20; } .mo-header { - min-height: 4em; + min-height: 38px; + max-height: 38px; width: 100%; display: flex; flex-direction: row; - justify-content: flex-start; + justify-content: flex-end; + background-color: black; + color: white; .mo-header-close { display: flex; justify-content: center; align-items: center; - min-width: 4em; + margin-left: $header-inset + 8px; } .mo-header-text { flex: 1; margin-left: -4em; + margin-right: $header-inset; display: flex; align-items: center; - justify-content: center; + justify-content: right; } } .mo-container { - background-color: rgba(230,230,230,0.98); - max-width: 800px; - min-width: 800px; - max-height: 600px; - min-height: 600px; + background-color: rgba(239, 239, 239, 0.8); + max-width: $panel-width; + min-width: $panel-width; + max-height: $panel-height; + min-height: $panel-height; display: flex; flex-direction: column; justify-content: flex-start; @@ -57,7 +65,32 @@ $vimeo-width: 1000px; } .mo-media-container { + padding-top: 3*$header-inset; + font-family: "Lato", Helvetica, sans-serif; max-height: $vimeo-height; + min-width: 100%; +} + +.mo-meta-container { + padding: 3*$header-inset; + min-height: 100px; + min-width: $panel-width; + max-width: $panel-height; + display: flex; + justify-content: center; + + .mo-box { + display: flex; + flex-direction: column; + max-width: $panel-width - (6*$header-inset); + min-width: $panel-width - (6*$header-inset); + border: 1px solid rgb(189,189,189); + padding: $header-inset; + } + + .indent { + margin-left: 2*$header-inset; + } } .mo-controls { @@ -73,3 +106,23 @@ $vimeo-width: 1000px; max-width: $vimeo-width; border: none; } + + +/* source overlay specific styles */ +.no-source-container { + border: 1px solid black; + padding: 2em; + min-height: 200px; +} + +.no-source-row { + display: flex; + justify-content: flex-start; + margin-bottom: 0.7em; + // min-width: 150px; + // max-width: 150px; + + .no-source-icon { + margin-right: 1em; + } +} diff --git a/yarn.lock b/yarn.lock index fc7cad3..19f5926 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3746,7 +3746,6 @@ js-string-escape@^1.0.1: "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-tokens@^3.0.2: version "3.0.2" @@ -3977,7 +3976,6 @@ loglevel@^1.4.1: loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" @@ -4521,7 +4519,6 @@ oauth-sign@~0.9.0: object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= object-copy@^0.1.0: version "0.1.0" @@ -4970,13 +4967,7 @@ promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - dependencies: - asap "~2.0.3" - -prop-types@15.6.2, prop-types@^15.5.0, prop-types@^15.5.10, prop-types@^15.5.7, prop-types@^15.6.0: +prop-types@15.6.2, prop-types@^15.5.0, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2: version "15.6.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" dependencies: @@ -5098,20 +5089,12 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: react-dom@^16.6.3: version "16.6.3" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.6.3.tgz#8fa7ba6883c85211b8da2d0efeffc9d3825cccc0" - integrity sha512-8ugJWRCWLGXy+7PmNh8WJz3g1TaTUt1XyoIcFN+x0Zbkoz+KKdUyx1AQLYJdbFXjuF41Nmjn5+j//rxvhFjgSQ== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" prop-types "^15.6.2" scheduler "^0.11.2" -react-portal@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/react-portal/-/react-portal-4.2.0.tgz#5400831cdb0ae64dccb8128121cf076089ab1afd" - integrity sha512-Zf+vGQ/VEAb5XAy+muKEn48yhdCNYPZaB1BWg1xc8sAZWD8pXTgPtQT4ihBdmWzsfCq8p8/kqf0GWydSBqc+Eg== - dependencies: - prop-types "^15.5.8" - react-image@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/react-image/-/react-image-1.5.1.tgz#e900baa3f48b15ca94500542a2aff762c94431b8" @@ -5119,6 +5102,12 @@ react-image@^1.5.1: "@babel/runtime" "^7.0.0" prop-types "15.6.2" +react-portal@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/react-portal/-/react-portal-4.2.0.tgz#5400831cdb0ae64dccb8128121cf076089ab1afd" + dependencies: + prop-types "^15.5.8" + react-redux@^5.0.4: version "5.0.7" resolved "http://registry.npmjs.org/react-redux/-/react-redux-5.0.7.tgz#0dc1076d9afb4670f993ffaef44b8f8c1155a4c8" @@ -5140,7 +5129,6 @@ react-tabs@^1.0.0: react@^16.6.3: version "16.6.3" resolved "https://registry.yarnpkg.com/react/-/react-16.6.3.tgz#25d77c91911d6bbdd23db41e70fb094cc1e0871c" - integrity sha512-zCvmH2vbEolgKxtqXL2wmGCUxUyNheYn/C+PD1YAjfxHC54+MhdruyhO7QieQrYsYeTxrn93PM2y0jRH1zEExw== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -5497,7 +5485,6 @@ safe-regex@^1.1.0: "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sass-graph@^2.2.4: version "2.2.4" @@ -5526,7 +5513,6 @@ sax@^1.2.4: scheduler@^0.11.2: version "0.11.3" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.11.3.tgz#b5769b90cf8b1464f3f3cfcafe8e3cd7555a2d6b" - integrity sha512-i9X9VRRVZDd3xZw10NY5Z2cVMbdYg6gqFecfj79USv1CFN+YrJ3gIPRKf1qlY+Sxly4djoKdfx1T+m9dnRB8kQ== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" From 670ec6dbb2d847606d3e604e7769fbb5f9e2bacd Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Fri, 21 Dec 2018 12:47:18 +0000 Subject: [PATCH 10/31] WIP: video sources --- package.json | 3 ++- src/components/Dashboard.jsx | 2 +- src/components/SourceOverlay.jsx | 31 +++++++++++++++++++++++-------- src/scss/mediaoverlay.scss | 15 ++++++++++----- yarn.lock | 8 +++++++- 5 files changed, 43 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index c36d369..5f5b977 100644 --- a/package.json +++ b/package.json @@ -20,8 +20,9 @@ "object-hash": "^1.3.0", "react": "^16.6.3", "react-dom": "^16.6.3", - "react-portal": "^4.2.0", "react-image": "^1.5.1", + "react-media-player": "^0.7.5", + "react-portal": "^4.2.0", "react-redux": "^5.0.4", "react-tabs": "^1.0.0", "redux": "^3.6.0", diff --git a/src/components/Dashboard.jsx b/src/components/Dashboard.jsx index e5e6050..092706b 100644 --- a/src/components/Dashboard.jsx +++ b/src/components/Dashboard.jsx @@ -159,7 +159,7 @@ export default connect( ...state, app: { ...state.app, - source: state.domain.sources["24Kanal - Chervonosilske Damaged Tank Photo"] + source: state.domain.sources["Anna News - Horbatenko Tanks Video"] } }), // state => state, diff --git a/src/components/SourceOverlay.jsx b/src/components/SourceOverlay.jsx index 2855038..92ebf66 100644 --- a/src/components/SourceOverlay.jsx +++ b/src/components/SourceOverlay.jsx @@ -1,5 +1,6 @@ import React from 'react' import Img from 'react-image' +import { Media, Player, controls } from 'react-media-player' import Spinner from './presentational/Spinner' import NoSource from './presentational/NoSource' @@ -10,15 +11,28 @@ class SourceOverlay extends React.Component { } renderVideo() { + // return ( + // + // ) return ( - + +
+
+ +
+
+ + +
+
+
) } @@ -47,6 +61,7 @@ class SourceOverlay extends React.Component { } _renderSwitch() { + console.table(this.props.source) switch(this.props.source.type) { case 'Video': return this.renderVideo() diff --git a/src/scss/mediaoverlay.scss b/src/scss/mediaoverlay.scss index 77b48f2..3ce66aa 100644 --- a/src/scss/mediaoverlay.scss +++ b/src/scss/mediaoverlay.scss @@ -1,7 +1,7 @@ $panel-width: 800px; $panel-height: 800px; -$vimeo-width: $panel-width; -$vimeo-height: $panel-height; +$vimeo-width: $panel-width - 100; +// $vimeo-height: $panel-height - 100; $header-inset: 10px; @@ -67,8 +67,13 @@ $header-inset: 10px; .mo-media-container { padding-top: 3*$header-inset; font-family: "Lato", Helvetica, sans-serif; - max-height: $vimeo-height; + // max-height: $vimeo-height; min-width: 100%; + + .media-player { + width: 100%; + max-width: $vimeo-width; + } } .mo-meta-container { @@ -100,8 +105,8 @@ $header-inset: 10px; } .vimeo-iframe { - min-height: $vimeo-height; - max-height: $vimeo-height; + // min-height: $vimeo-height; + // max-height: $vimeo-height; min-width: $vimeo-width; max-width: $vimeo-width; border: none; diff --git a/yarn.lock b/yarn.lock index 19f5926..917087e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4967,7 +4967,7 @@ promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" -prop-types@15.6.2, prop-types@^15.5.0, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2: +prop-types@15.6.2, prop-types@^15.5.0, prop-types@^15.5.10, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2: version "15.6.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" dependencies: @@ -5102,6 +5102,12 @@ react-image@^1.5.1: "@babel/runtime" "^7.0.0" prop-types "15.6.2" +react-media-player@^0.7.5: + version "0.7.5" + resolved "https://registry.yarnpkg.com/react-media-player/-/react-media-player-0.7.5.tgz#4ada5cba5814d1121a8690ba89e520e5d5210975" + dependencies: + prop-types "^15.5.10" + react-portal@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/react-portal/-/react-portal-4.2.0.tgz#5400831cdb0ae64dccb8128121cf076089ab1afd" From 16d9207aa0a605b03d4807311b0ec26671434af0 Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Fri, 21 Dec 2018 16:58:40 +0000 Subject: [PATCH 11/31] WIP: source error for all types --- src/components/Dashboard.jsx | 16 +++++------ src/components/SourceOverlay.jsx | 35 +++++++++-------------- src/components/presentational/NoSource.js | 14 ++++----- src/scss/mediaoverlay.scss | 18 +++++++++--- 4 files changed, 43 insertions(+), 40 deletions(-) diff --git a/src/components/Dashboard.jsx b/src/components/Dashboard.jsx index 092706b..c812d65 100644 --- a/src/components/Dashboard.jsx +++ b/src/components/Dashboard.jsx @@ -155,13 +155,13 @@ function mapDispatchToProps(dispatch) { } export default connect( - state => ({ - ...state, - app: { - ...state.app, - source: state.domain.sources["Anna News - Horbatenko Tanks Video"] - } - }), - // state => state, + // state => ({ + // ...state, + // app: { + // ...state.app, + // source: state.domain.sources["Anna News - Horbatenko Tanks Video"] + // } + // }), + state => state, mapDispatchToProps, )(Dashboard); diff --git a/src/components/SourceOverlay.jsx b/src/components/SourceOverlay.jsx index 92ebf66..5dcf13e 100644 --- a/src/components/SourceOverlay.jsx +++ b/src/components/SourceOverlay.jsx @@ -12,27 +12,20 @@ class SourceOverlay extends React.Component { renderVideo() { // return ( - // + // + //
+ //
+ // + //
+ //
+ // + // + //
+ //
+ //
// ) return ( - -
-
- -
-
- - -
-
-
+ ) } @@ -50,7 +43,7 @@ class SourceOverlay extends React.Component { renderError() { return ( -
ERROR: no support for this source
+ ) } @@ -96,7 +89,7 @@ class SourceOverlay extends React.Component { {type ?
Type: {type}
: null} {date ?
Date:{date}
: null}
- {url ? : null} + {url ? : null}
diff --git a/src/components/presentational/NoSource.js b/src/components/presentational/NoSource.js index 85cb542..e38975c 100644 --- a/src/components/presentational/NoSource.js +++ b/src/components/presentational/NoSource.js @@ -7,14 +7,14 @@ const NoSource = ({ failedUrls }) => { error -
No media found.
+
No media found, as the original media has not yet been uploaded to the platform.
-
- The following URLs were tried: -
-
    - {failedUrls.map((url, idx) =>
  • {url}
  • )} -
+ {/*
*/} + {/* The following URLs were tried: */} + {/*
*/} + {/*
    */} + {/* {failedUrls.map((url, idx) =>
  • {url}
  • )} */} + {/*
*/}
) } diff --git a/src/scss/mediaoverlay.scss b/src/scss/mediaoverlay.scss index 3ce66aa..17fbb18 100644 --- a/src/scss/mediaoverlay.scss +++ b/src/scss/mediaoverlay.scss @@ -1,7 +1,7 @@ $panel-width: 800px; $panel-height: 800px; $vimeo-width: $panel-width - 100; -// $vimeo-height: $panel-height - 100; +$vimeo-height: $panel-height / 2; $header-inset: 10px; @@ -104,12 +104,22 @@ $header-inset: 10px; background-color: black; } -.vimeo-iframe { - // min-height: $vimeo-height; - // max-height: $vimeo-height; +.media-player { min-width: $vimeo-width; max-width: $vimeo-width; + min-height: $vimeo-height; + max-height: $vimeo-height; border: none; + + iframe, video { + width: $vimeo-width; + height: $vimeo-height - 50; + border: none; + } +} + +.media-controls { + padding: 0 50px; } From 65c7cb396274b552a75539dab39aaa008e9a7dbf Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Fri, 21 Dec 2018 17:03:33 +0000 Subject: [PATCH 12/31] WIP: fade narrative lines --- src/components/MapNarratives.jsx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/components/MapNarratives.jsx b/src/components/MapNarratives.jsx index 666df0e..8835fec 100644 --- a/src/components/MapNarratives.jsx +++ b/src/components/MapNarratives.jsx @@ -35,7 +35,7 @@ class MapNarratives extends React.Component { getStrokeOpacity(narrative, step) { if (this.props.narrative === null) return 0; - if (!step || narrative.id !== this.props.narrative.id) return 0.2; + if (!step || narrative.id !== this.props.narrative.id) return 0.1; return 1; } @@ -53,8 +53,6 @@ class MapNarratives extends React.Component { y1={y} y2={p2.y} markerStart="none" - markerEnd="url(#arrow)" - midMarker="url(#arrow)" onClick={() => this.props.onSelectNarrative(n)} style={{ strokeWidth: this.getStrokeWidth(n, step), @@ -88,4 +86,4 @@ class MapNarratives extends React.Component { } } -export default MapNarratives; \ No newline at end of file +export default MapNarratives; From 53cd11e80fd695477badb1fe9dd00435d0416217 Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Fri, 21 Dec 2018 17:30:45 +0000 Subject: [PATCH 13/31] WIP: add null for inscrutable error in build --- src/components/presentational/CardSource.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/presentational/CardSource.js b/src/components/presentational/CardSource.js index cde4ca9..6e3abdb 100644 --- a/src/components/presentational/CardSource.js +++ b/src/components/presentational/CardSource.js @@ -25,6 +25,9 @@ const CardSource = ({ source, isLoading, onClickHandler }) => { } } + if (!source.type) { + return null; + } return (
{isLoading From 8a402df38db2faf8d2adb1053087f47e1e80f372 Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Fri, 21 Dec 2018 17:32:55 +0000 Subject: [PATCH 14/31] :lipstick: --- src/components/presentational/CardSource.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/presentational/CardSource.js b/src/components/presentational/CardSource.js index 6e3abdb..88672c0 100644 --- a/src/components/presentational/CardSource.js +++ b/src/components/presentational/CardSource.js @@ -25,7 +25,7 @@ const CardSource = ({ source, isLoading, onClickHandler }) => { } } - if (!source.type) { + if (!source) { return null; } return ( From f9555c4c2f4ba12b49fa6f5c9e331e665f0cffc6 Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Tue, 25 Dec 2018 16:45:24 +0100 Subject: [PATCH 15/31] example.config.js with narrative and sources --- example.config.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/example.config.js b/example.config.js index 2fb9346..8b5f008 100644 --- a/example.config.js +++ b/example.config.js @@ -1,12 +1,12 @@ module.exports = { - title: 'Example', + title: 'example', SERVER_ROOT: 'http://localhost:4040', - EVENT_EXT: '/api/example/export_events/rows', + EVENT_EXT: '/api/example/export_events/deeprows', CATEGORY_EXT: '/api/example/export_categories/rows', + NARRATIVE_EXT: '/api/example/export_narratives/rows', SOURCES_EXT: '/api/example/export_events/ids', - NARRATIVE_EXT: '/api/example/export_narratives/ids', - TAGS_EXT: '/api/example/export_tags/tree', SITES_EXT: '/api/example/export_sites/rows', + TAGS_EXT: '/api/example/export_tags/tree', MAP_ANCHOR: [31.356397, 34.784818], INCOMING_DATETIME_FORMAT: '%m/%d/%YT%H:%M', MAPBOX_TOKEN: 'SOME_MAPBOX_TOKEN', From ad69b1914b90fa75c7f5ac2da8eea62c4aa4a5f2 Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Tue, 25 Dec 2018 17:05:11 +0100 Subject: [PATCH 16/31] default USE_SOURCES = true --- example.config.js | 3 +- src/components/:w | 148 -------------------- src/components/presentational/CardSource.js | 3 - 3 files changed, 2 insertions(+), 152 deletions(-) delete mode 100644 src/components/:w diff --git a/example.config.js b/example.config.js index 8b5f008..7bad0a3 100644 --- a/example.config.js +++ b/example.config.js @@ -13,6 +13,7 @@ module.exports = { features: { USE_TAGS: false, USE_SEARCH: false, - USE_SITES: false + USE_SITES: false, + USE_SOURCES: true } } diff --git a/src/components/:w b/src/components/:w deleted file mode 100644 index acd0476..0000000 --- a/src/components/:w +++ /dev/null @@ -1,148 +0,0 @@ -import React from 'react'; - -import { bindActionCreators } from 'redux'; -import { connect } from 'react-redux'; -import * as actions from '../actions'; -import * as selectors from '../selectors'; - -import MediaOverlay from './presentational/MediaOverlay'; -import LoadingOverlay from './presentational/LoadingOverlay'; -import Viewport from './Viewport.jsx'; -import Toolbar from './Toolbar.jsx'; -import CardStack from './CardStack.jsx'; -import NarrativeCard from './NarrativeCard.js'; -import InfoPopUp from './InfoPopup.jsx'; -import Timeline from './Timeline.jsx'; -import Notification from './Notification.jsx'; - -import { parseDate } from '../js/utilities'; - -class Dashboard extends React.Component { - constructor(props) { - super(props); - - this.handleViewSource = this.handleViewSource.bind(this) - this.handleHighlight = this.handleHighlight.bind(this) - this.handleSelect = this.handleSelect.bind(this) - this.handleTagFilter = this.handleTagFilter.bind(this) - this.updateTimerange = this.updateTimerange.bind(this) - - this.eventsById = {} - } - - componentDidMount() { - if (!this.props.app.isMobile) { - this.props.actions.fetchDomain() - .then(domain => this.props.actions.updateDomain(domain)); - } - } - - handleHighlight(highlighted) { - this.props.actions.updateHighlighted((highlighted) ? highlighted : null); - } - - getEventById(eventId) { - if (this.eventsById[eventId]) return this.eventsById[eventId]; - this.eventsById[eventId] = this.props.domain.events.find(ev => ev.id === eventId); - return this.eventsById[eventId]; - } - - handleViewSource(source) { - console.log('handleViewSource: to implement in Dashboard.jsx') - this.props.actions.updateSource(source) - } - - handleSelect(selected) { - if (selected) { - let eventsToSelect = selected.map(event => this.getEventById(event.id)); - eventsToSelect = eventsToSelect.sort((a, b) => parseDate(a.timestamp) - parseDate(b.timestamp)) - - this.props.actions.updateSelected(eventsToSelect) - } - } - - handleTagFilter(tag) { - this.props.actions.updateTagFilters(tag); - } - - updateTimerange(timeRange) { - this.props.actions.updateTimeRange(timeRange); - } - - getCategoryColor(category='other') { - return this.props.ui.style.categories[category] || this.props.ui.style.categories['other'] - } - - getNarrativeLinks(event) { - const narrative = this.props.domain.narratives.find(nv => nv.id === event.narrative); - if (narrative) return narrative.byId[event.id]; - return null; - } - - render() { - return ( -
- this.getCategoryColor(category) - }} - /> - - this.props.actions.updateSelected([])} - getNarrativeLinks={event => this.getNarrativeLinks(event)} - getCategoryColor={category => this.getCategoryColor(category)} - /> - this.getCategoryColor(category) - }} - /> - this.props.actions.toggleInfoPopup()} - /> - - - - - -
- ); - } -} - -function mapDispatchToProps(dispatch) { - return { - actions: bindActionCreators(actions, dispatch) - }; -} - -export default connect( - state => state, - mapDispatchToProps, -)(Dashboard); diff --git a/src/components/presentational/CardSource.js b/src/components/presentational/CardSource.js index 88672c0..cde4ca9 100644 --- a/src/components/presentational/CardSource.js +++ b/src/components/presentational/CardSource.js @@ -25,9 +25,6 @@ const CardSource = ({ source, isLoading, onClickHandler }) => { } } - if (!source) { - return null; - } return (
{isLoading From 1bf022944a8aa1c29aa2ec3b2516183ee09ba3c9 Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Wed, 26 Dec 2018 10:05:11 +0100 Subject: [PATCH 17/31] fix crash when null source path --- src/components/SourceOverlay.jsx | 37 +++++++++++++++++++------------- src/scss/mediaoverlay.scss | 2 +- src/selectors/index.js | 4 +++- 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/components/SourceOverlay.jsx b/src/components/SourceOverlay.jsx index 5dcf13e..f3b8487 100644 --- a/src/components/SourceOverlay.jsx +++ b/src/components/SourceOverlay.jsx @@ -7,28 +7,32 @@ import NoSource from './presentational/NoSource' class SourceOverlay extends React.Component { constructor(props) { super(props) + this.renderVideo = this.renderVideo.bind(this) this.renderPhoto = this.renderPhoto.bind(this) } - renderVideo() { - // return ( - // - //
- //
- // - //
- //
- // - // - //
- //
- //
- // ) + renderPlaceholder() { return ( ) } + renderVideo() { + return ( + +
+
+ +
+
+ + +
+
+
+ ) + } + renderPhoto() { const imageExts = ['.jpg', '.png'] const possibleUrls = imageExts.map(ext => `${this.props.source.path}${ext}`) @@ -54,7 +58,7 @@ class SourceOverlay extends React.Component { } _renderSwitch() { - console.table(this.props.source) + // console.table(this.props.source) switch(this.props.source.type) { case 'Video': return this.renderVideo() @@ -68,6 +72,9 @@ class SourceOverlay extends React.Component { } render() { + if (typeof(this.props.source) !== 'object') { + return this.renderPlaceholder(); + } const {id, url, title, date, type, affil_1, affil_2} = this.props.source return (
diff --git a/src/scss/mediaoverlay.scss b/src/scss/mediaoverlay.scss index 17fbb18..ba07555 100644 --- a/src/scss/mediaoverlay.scss +++ b/src/scss/mediaoverlay.scss @@ -47,7 +47,7 @@ $header-inset: 10px; } .mo-container { - background-color: rgba(239, 239, 239, 0.8); + background-color: rgba(239, 239, 239, 0.9); max-width: $panel-width; min-width: $panel-width; max-height: $panel-height; diff --git a/src/selectors/index.js b/src/selectors/index.js index 0a96eee..e9535a5 100644 --- a/src/selectors/index.js +++ b/src/selectors/index.js @@ -166,10 +166,12 @@ export const selectSelected = createSelector( if (selected.length === 0) { return [] } + + // NB: return source object if exists, otherwise null const srcs = selected .map(e => e.sources) .map(_sources => - _sources.map(id => sources[id]) + _sources.map(id => (sources.hasOwnProperty(id) ? sources[id] : null)) ) return selected.map((s, idx) => ({ From 1d6988edce288f607efd924c3619ea1c512f94d9 Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Wed, 26 Dec 2018 10:21:57 +0100 Subject: [PATCH 18/31] use video-react --- package.json | 2 +- src/components/SourceOverlay.jsx | 19 ++++++---------- src/scss/main.scss | 1 + src/scss/mediaoverlay.scss | 5 +++-- src/scss/mediaplayer.scss | 1 + yarn.lock | 37 +++++++++++++++++++++++--------- 6 files changed, 40 insertions(+), 25 deletions(-) create mode 100644 src/scss/mediaplayer.scss diff --git a/package.json b/package.json index 5f5b977..b4a1c53 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,6 @@ "react": "^16.6.3", "react-dom": "^16.6.3", "react-image": "^1.5.1", - "react-media-player": "^0.7.5", "react-portal": "^4.2.0", "react-redux": "^5.0.4", "react-tabs": "^1.0.0", @@ -29,6 +28,7 @@ "redux-thunk": "^2.2.0", "reselect": "^3.0.1", "uuid": "^3.1.0", + "video-react": "^0.13.1", "video.js": "^5.19.2", "whatwg-fetch": "^2.0.3" }, diff --git a/src/components/SourceOverlay.jsx b/src/components/SourceOverlay.jsx index f3b8487..3a2c3aa 100644 --- a/src/components/SourceOverlay.jsx +++ b/src/components/SourceOverlay.jsx @@ -1,6 +1,6 @@ import React from 'react' import Img from 'react-image' -import { Media, Player, controls } from 'react-media-player' +import { Player } from 'video-react' import Spinner from './presentational/Spinner' import NoSource from './presentational/NoSource' @@ -19,17 +19,12 @@ class SourceOverlay extends React.Component { renderVideo() { return ( - -
-
- -
-
- - -
-
-
+
+ +
) } diff --git a/src/scss/main.scss b/src/scss/main.scss index e7ad5e1..4d9ded2 100644 --- a/src/scss/main.scss +++ b/src/scss/main.scss @@ -15,3 +15,4 @@ @import 'infopopup'; @import 'notification'; @import 'scene'; +@import 'mediaplayer'; diff --git a/src/scss/mediaoverlay.scss b/src/scss/mediaoverlay.scss index ba07555..68dd676 100644 --- a/src/scss/mediaoverlay.scss +++ b/src/scss/mediaoverlay.scss @@ -1,5 +1,5 @@ $panel-width: 800px; -$panel-height: 800px; +$panel-height: 700px; $vimeo-width: $panel-width - 100; $vimeo-height: $panel-height / 2; @@ -61,11 +61,12 @@ $header-inset: 10px; flex: 1; display: flex; justify-content: center; + align-items: center; } } .mo-media-container { - padding-top: 3*$header-inset; + // padding-top: 3*$header-inset; font-family: "Lato", Helvetica, sans-serif; // max-height: $vimeo-height; min-width: 100%; diff --git a/src/scss/mediaplayer.scss b/src/scss/mediaplayer.scss new file mode 100644 index 0000000..1d29d6c --- /dev/null +++ b/src/scss/mediaplayer.scss @@ -0,0 +1 @@ +@import '~video-react/styles/scss/video-react'; diff --git a/yarn.lock b/yarn.lock index 917087e..a455221 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1532,7 +1532,7 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -classnames@^2.2.0: +classnames@^2.2.0, classnames@^2.2.3: version "2.2.6" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" @@ -3959,6 +3959,11 @@ lodash.tail@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664" +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= + lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.3, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@~4.17.10: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" @@ -3973,7 +3978,7 @@ loglevel@^1.4.1: version "1.6.1" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" dependencies: @@ -4967,7 +4972,7 @@ promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" -prop-types@15.6.2, prop-types@^15.5.0, prop-types@^15.5.10, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2: +prop-types@15.6.2, prop-types@^15.5.0, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2: version "15.6.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" dependencies: @@ -5102,12 +5107,6 @@ react-image@^1.5.1: "@babel/runtime" "^7.0.0" prop-types "15.6.2" -react-media-player@^0.7.5: - version "0.7.5" - resolved "https://registry.yarnpkg.com/react-media-player/-/react-media-player-0.7.5.tgz#4ada5cba5814d1121a8690ba89e520e5d5210975" - dependencies: - prop-types "^15.5.10" - react-portal@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/react-portal/-/react-portal-4.2.0.tgz#5400831cdb0ae64dccb8128121cf076089ab1afd" @@ -5242,6 +5241,14 @@ redux@^3.6.0: loose-envify "^1.1.0" symbol-observable "^1.0.3" +redux@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.1.tgz#436cae6cc40fbe4727689d7c8fae44808f1bfef5" + integrity sha512-R7bAtSkk7nY6O/OYMVR9RiBI+XghjF9rlbl5806HJbQph0LJVHZrU5oaO4q70eUKiqMRqm4y07KLTlMZ2BlVmg== + dependencies: + loose-envify "^1.4.0" + symbol-observable "^1.2.0" + regenerate-unicode-properties@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" @@ -6013,7 +6020,7 @@ symbol-observable@^0.2.2: version "0.2.4" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-0.2.4.tgz#95a83db26186d6af7e7a18dbd9760a2f86d08f40" -symbol-observable@^1.0.2, symbol-observable@^1.0.3, symbol-observable@^1.0.4, symbol-observable@^1.1.0: +symbol-observable@^1.0.2, symbol-observable@^1.0.3, symbol-observable@^1.0.4, symbol-observable@^1.1.0, symbol-observable@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" @@ -6393,6 +6400,16 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +video-react@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/video-react/-/video-react-0.13.1.tgz#5d0dc68748f9b12e118beea1998d6ae5f6cbd6ba" + integrity sha512-AeGSpddfHv0UxeJztWUALYEjCdzXM1QdtQ5GD1VUd3vxcgwgIfB7EzFKcewRevSHHK8TDmjNksbvbWRobF/QeA== + dependencies: + classnames "^2.2.3" + lodash.throttle "^4.1.1" + prop-types "^15.5.8" + redux "^4.0.0" + video.js@^5.19.2: version "5.20.5" resolved "http://registry.npmjs.org/video.js/-/video.js-5.20.5.tgz#445cdae204bce459782d86a31b25a32afd6d8eff" From fb925aecdd646b094ff84c404d05d7272b9872e4 Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Wed, 26 Dec 2018 10:31:06 +0100 Subject: [PATCH 19/31] fix premature source close --- src/components/Dashboard.jsx | 2 +- src/components/SourceOverlay.jsx | 2 +- src/components/presentational/CardSource.js | 7 +++++++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/components/Dashboard.jsx b/src/components/Dashboard.jsx index c812d65..3f3c3cb 100644 --- a/src/components/Dashboard.jsx +++ b/src/components/Dashboard.jsx @@ -159,7 +159,7 @@ export default connect( // ...state, // app: { // ...state.app, - // source: state.domain.sources["Anna News - Horbatenko Tanks Video"] + // source: state.domain.sources["Ilovaisk The Terrible Truth - 1551603_1553607 Chumaky Approach 29 Aug Video"] // } // }), state => state, diff --git a/src/components/SourceOverlay.jsx b/src/components/SourceOverlay.jsx index 3a2c3aa..70713c3 100644 --- a/src/components/SourceOverlay.jsx +++ b/src/components/SourceOverlay.jsx @@ -73,7 +73,7 @@ class SourceOverlay extends React.Component { const {id, url, title, date, type, affil_1, affil_2} = this.props.source return (
-
+
diff --git a/src/components/presentational/CardSource.js b/src/components/presentational/CardSource.js index cde4ca9..8570612 100644 --- a/src/components/presentational/CardSource.js +++ b/src/components/presentational/CardSource.js @@ -25,6 +25,13 @@ const CardSource = ({ source, isLoading, onClickHandler }) => { } } + if (typeof source !== 'object') { + return ( +
+
Error: this source was not found
+
+ ) + } return (
{isLoading From eb3a377763b508c142b7645d0851dc9274a8f469 Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Wed, 26 Dec 2018 10:47:38 +0100 Subject: [PATCH 20/31] basic support for sources complete --- src/components/SourceOverlay.jsx | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/components/SourceOverlay.jsx b/src/components/SourceOverlay.jsx index 70713c3..fbf55d4 100644 --- a/src/components/SourceOverlay.jsx +++ b/src/components/SourceOverlay.jsx @@ -9,12 +9,8 @@ class SourceOverlay extends React.Component { super(props) this.renderVideo = this.renderVideo.bind(this) this.renderPhoto = this.renderPhoto.bind(this) - } - - renderPlaceholder() { - return ( - - ) + this.renderPhotobook = this.renderPhotobook.bind(this) + this.renderTestimony = this.renderTestimony.bind(this) } renderVideo() { @@ -40,6 +36,10 @@ class SourceOverlay extends React.Component { ) } + renderPhotobook() { + return this.renderError() + } + renderError() { return ( @@ -48,7 +48,9 @@ class SourceOverlay extends React.Component { renderTestimony() { return ( -
Eyewitness
+ ) } @@ -59,6 +61,8 @@ class SourceOverlay extends React.Component { return this.renderVideo() case 'Photo': return this.renderPhoto() + case 'Photobook': + return this.renderPhotobook() case 'Eyewitness Testimony': return this.renderTestimony() default: @@ -68,7 +72,7 @@ class SourceOverlay extends React.Component { render() { if (typeof(this.props.source) !== 'object') { - return this.renderPlaceholder(); + return this.renderError() } const {id, url, title, date, type, affil_1, affil_2} = this.props.source return ( From ef947a5a2064b430cab2f6a3aee4eac5d94838f4 Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Wed, 26 Dec 2018 10:48:32 +0100 Subject: [PATCH 21/31] :lipstick: --- src/components/Dashboard.jsx | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/components/Dashboard.jsx b/src/components/Dashboard.jsx index 3f3c3cb..d734de0 100644 --- a/src/components/Dashboard.jsx +++ b/src/components/Dashboard.jsx @@ -155,13 +155,6 @@ function mapDispatchToProps(dispatch) { } export default connect( - // state => ({ - // ...state, - // app: { - // ...state.app, - // source: state.domain.sources["Ilovaisk The Terrible Truth - 1551603_1553607 Chumaky Approach 29 Aug Video"] - // } - // }), state => state, mapDispatchToProps, )(Dashboard); From f5628e7a7957194d68e937713764a39ae1ff1452 Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Wed, 26 Dec 2018 11:08:23 +0100 Subject: [PATCH 22/31] :lipstick: --- src/components/presentational/CardSource.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/presentational/CardSource.js b/src/components/presentational/CardSource.js index 8570612..ea80243 100644 --- a/src/components/presentational/CardSource.js +++ b/src/components/presentational/CardSource.js @@ -25,7 +25,7 @@ const CardSource = ({ source, isLoading, onClickHandler }) => { } } - if (typeof source !== 'object') { + if (!source) { return (
Error: this source was not found
From e989e7b6a226003a9242f88488de6c33a966239f Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Wed, 26 Dec 2018 12:05:30 +0100 Subject: [PATCH 23/31] add null check for sources --- src/reducers/schema/sourceSchema.js | 2 +- src/selectors/index.js | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/reducers/schema/sourceSchema.js b/src/reducers/schema/sourceSchema.js index 3dc17dd..5f12be9 100644 --- a/src/reducers/schema/sourceSchema.js +++ b/src/reducers/schema/sourceSchema.js @@ -7,7 +7,7 @@ const sourceSchema = Joi.object().keys({ affil_1: Joi.string().allow(''), affil_2: Joi.string().allow(''), url: Joi.string().allow(''), - title: Joi.string().allow(''), + desc: Joi.string().allow(''), parent: Joi.string().allow(''), author: Joi.string().allow(''), date: Joi.string().allow(''), diff --git a/src/selectors/index.js b/src/selectors/index.js index e9535a5..0ef170d 100644 --- a/src/selectors/index.js +++ b/src/selectors/index.js @@ -170,8 +170,12 @@ export const selectSelected = createSelector( // NB: return source object if exists, otherwise null const srcs = selected .map(e => e.sources) - .map(_sources => - _sources.map(id => (sources.hasOwnProperty(id) ? sources[id] : null)) + .map(_sources => { + if (!_sources) return []; + return _sources.map(id => ( + sources.hasOwnProperty(id) ? sources[id] : null + )) + } ) return selected.map((s, idx) => ({ From ef098bc7438386054bda16899942310d0532e923 Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Wed, 26 Dec 2018 12:13:16 +0100 Subject: [PATCH 24/31] update example --- example.config.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/example.config.js b/example.config.js index 7bad0a3..b65421d 100644 --- a/example.config.js +++ b/example.config.js @@ -4,16 +4,17 @@ module.exports = { EVENT_EXT: '/api/example/export_events/deeprows', CATEGORY_EXT: '/api/example/export_categories/rows', NARRATIVE_EXT: '/api/example/export_narratives/rows', - SOURCES_EXT: '/api/example/export_events/ids', - SITES_EXT: '/api/example/export_sites/rows', + SOURCES_EXT: '/api/example/export_sources/ids', TAGS_EXT: '/api/example/export_tags/tree', + SITES_EXT: '/api/example/export_sites/rows', MAP_ANCHOR: [31.356397, 34.784818], INCOMING_DATETIME_FORMAT: '%m/%d/%YT%H:%M', - MAPBOX_TOKEN: 'SOME_MAPBOX_TOKEN', + MAPBOX_TOKEN: 'pk.EXAMPLE_MAPBOX_TOKEN', features: { USE_TAGS: false, USE_SEARCH: false, - USE_SITES: false, + USE_SITES: true, USE_SOURCES: true } } + From 99e9219e0268b070128b1e04df17cf5f949d3869 Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Sat, 29 Dec 2018 12:48:45 +0100 Subject: [PATCH 25/31] definitive img support --- src/components/SourceOverlay.jsx | 17 ++++++++++------- src/scss/mediaoverlay.scss | 9 +++++++++ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/components/SourceOverlay.jsx b/src/components/SourceOverlay.jsx index fbf55d4..e29be26 100644 --- a/src/components/SourceOverlay.jsx +++ b/src/components/SourceOverlay.jsx @@ -26,13 +26,17 @@ class SourceOverlay extends React.Component { renderPhoto() { const imageExts = ['.jpg', '.png'] - const possibleUrls = imageExts.map(ext => `${this.props.source.path}${ext}`) + const extraUrls = imageExts.map(ext => `${this.props.source.path}${ext}`) + const possibleUrls = [ this.props.source.path, ...extraUrls ] return ( - } - unloader={} - /> +
+ } + unloader={} + /> +
) } @@ -55,7 +59,6 @@ class SourceOverlay extends React.Component { } _renderSwitch() { - // console.table(this.props.source) switch(this.props.source.type) { case 'Video': return this.renderVideo() diff --git a/src/scss/mediaoverlay.scss b/src/scss/mediaoverlay.scss index 68dd676..a9bf0f7 100644 --- a/src/scss/mediaoverlay.scss +++ b/src/scss/mediaoverlay.scss @@ -142,3 +142,12 @@ $header-inset: 10px; margin-right: 1em; } } + +.source-image-container { + padding: 0 25px; + .source-image { + max-width: 100%; + max-height: 100%; + } +} + From 64e7218b716a4f6484f78adca3994856d43e76dd Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Sat, 29 Dec 2018 13:39:56 +0100 Subject: [PATCH 26/31] basic photobook support --- src/components/Photobook.jsx | 51 +++++++++++++++++++++ src/components/SourceOverlay.jsx | 23 +++++++--- src/components/presentational/CardSource.js | 2 + src/reducers/schema/sourceSchema.js | 2 +- src/scss/mediaoverlay.scss | 6 ++- 5 files changed, 76 insertions(+), 8 deletions(-) create mode 100644 src/components/Photobook.jsx diff --git a/src/components/Photobook.jsx b/src/components/Photobook.jsx new file mode 100644 index 0000000..5c65261 --- /dev/null +++ b/src/components/Photobook.jsx @@ -0,0 +1,51 @@ +import React from 'react' + +class Photobook extends React.Component { + + + constructor(props) { + super(props) + this.state ={ + isLoading: true, + isLoaded: false + } + this.loadImgs = this.loadImgs.bind(this) + } + + loadImgs() { + console.log(this.props.src) + Promise.resolve() + .then(fetch(this.props.src)) + .then(res => { + console.log(res) + }) + .then(() => { + this.setState({ isLoading: false, isLoaded: true }) + }) + } + + componentDidMount() { + if (this.state.isLoading) this.loadImgs() + } + + // componentWillReceiveProps(nextProps) { + // + // if (!src.length) return this.setState({ isLoading: false, isLoaded: false }) + // this.setState({ isLoading: true, isLoaded: false }) + // } + + render() { + if (this.state.isLoading) { + return
Loading
+ } + return
Ciao
+ } +} + +Photobook.propTypes = { + loader: false, + unloader: false, + src: [] +} + +export default Photobook diff --git a/src/components/SourceOverlay.jsx b/src/components/SourceOverlay.jsx index e29be26..9e75798 100644 --- a/src/components/SourceOverlay.jsx +++ b/src/components/SourceOverlay.jsx @@ -1,5 +1,6 @@ import React from 'react' import Img from 'react-image' +import Photobook from './Photobook.jsx' import { Player } from 'video-react' import Spinner from './presentational/Spinner' import NoSource from './presentational/NoSource' @@ -25,23 +26,33 @@ class SourceOverlay extends React.Component { } renderPhoto() { - const imageExts = ['.jpg', '.png'] - const extraUrls = imageExts.map(ext => `${this.props.source.path}${ext}`) - const possibleUrls = [ this.props.source.path, ...extraUrls ] return (
} - unloader={} + unloader={} />
) } renderPhotobook() { - return this.renderError() + return ( +
+ {this.props.source.paths.map((url, idx) => ( + } + unloader={} + /> + + ))} +
+ ) } renderError() { diff --git a/src/components/presentational/CardSource.js b/src/components/presentational/CardSource.js index ea80243..b81661e 100644 --- a/src/components/presentational/CardSource.js +++ b/src/components/presentational/CardSource.js @@ -20,6 +20,8 @@ const CardSource = ({ source, isLoading, onClickHandler }) => { return 'videocam' case 'Photo': return 'photo' + case 'Photobook': + return 'photo_album' default: return 'help' } diff --git a/src/reducers/schema/sourceSchema.js b/src/reducers/schema/sourceSchema.js index 5f12be9..1e8730e 100644 --- a/src/reducers/schema/sourceSchema.js +++ b/src/reducers/schema/sourceSchema.js @@ -2,7 +2,7 @@ import Joi from 'joi'; const sourceSchema = Joi.object().keys({ id: Joi.string().required(), - path: Joi.string().required(), + paths: Joi.array().required(), type: Joi.string().allow(''), affil_1: Joi.string().allow(''), affil_2: Joi.string().allow(''), diff --git a/src/scss/mediaoverlay.scss b/src/scss/mediaoverlay.scss index a9bf0f7..3a6619b 100644 --- a/src/scss/mediaoverlay.scss +++ b/src/scss/mediaoverlay.scss @@ -70,6 +70,7 @@ $header-inset: 10px; font-family: "Lato", Helvetica, sans-serif; // max-height: $vimeo-height; min-width: 100%; + max-height: 500px; .media-player { width: 100%; @@ -145,9 +146,12 @@ $header-inset: 10px; .source-image-container { padding: 0 25px; + overflow-y: scroll; + max-height: 100%; .source-image { - max-width: 100%; + max-width: calc(100% - 20px); max-height: 100%; + padding: 10px; } } From b25f6956e03358bd91c781f5a54b1536bc0cafdb Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Sat, 29 Dec 2018 13:51:13 +0100 Subject: [PATCH 27/31] fix video support --- src/components/Photobook.jsx | 51 -------------------------------- src/components/SourceOverlay.jsx | 4 ++- src/scss/mediaoverlay.scss | 17 +++++++---- 3 files changed, 14 insertions(+), 58 deletions(-) delete mode 100644 src/components/Photobook.jsx diff --git a/src/components/Photobook.jsx b/src/components/Photobook.jsx deleted file mode 100644 index 5c65261..0000000 --- a/src/components/Photobook.jsx +++ /dev/null @@ -1,51 +0,0 @@ -import React from 'react' - -class Photobook extends React.Component { - - - constructor(props) { - super(props) - this.state ={ - isLoading: true, - isLoaded: false - } - this.loadImgs = this.loadImgs.bind(this) - } - - loadImgs() { - console.log(this.props.src) - Promise.resolve() - .then(fetch(this.props.src)) - .then(res => { - console.log(res) - }) - .then(() => { - this.setState({ isLoading: false, isLoaded: true }) - }) - } - - componentDidMount() { - if (this.state.isLoading) this.loadImgs() - } - - // componentWillReceiveProps(nextProps) { - // - // if (!src.length) return this.setState({ isLoading: false, isLoaded: false }) - // this.setState({ isLoading: true, isLoaded: false }) - // } - - render() { - if (this.state.isLoading) { - return
Loading
- } - return
Ciao
- } -} - -Photobook.propTypes = { - loader: false, - unloader: false, - src: [] -} - -export default Photobook diff --git a/src/components/SourceOverlay.jsx b/src/components/SourceOverlay.jsx index 9e75798..724de27 100644 --- a/src/components/SourceOverlay.jsx +++ b/src/components/SourceOverlay.jsx @@ -15,11 +15,13 @@ class SourceOverlay extends React.Component { } renderVideo() { + // NB: assume only one video return (
) diff --git a/src/scss/mediaoverlay.scss b/src/scss/mediaoverlay.scss index 3a6619b..9046ba7 100644 --- a/src/scss/mediaoverlay.scss +++ b/src/scss/mediaoverlay.scss @@ -147,11 +147,16 @@ $header-inset: 10px; .source-image-container { padding: 0 25px; overflow-y: scroll; - max-height: 100%; - .source-image { - max-width: calc(100% - 20px); - max-height: 100%; - padding: 10px; - } + height: 100%; } +.source-image, .source-video { + max-width: calc(100% - 20px); + max-height: 350px !important; + height: 100%; + padding: 10px; +} + +.media-player { + overflow-y: hidden; +} From 83d125a3f7a66759674c7e119149efa6e7f445eb Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Sat, 29 Dec 2018 14:05:59 +0100 Subject: [PATCH 28/31] :lipstick: --- src/components/SourceOverlay.jsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/SourceOverlay.jsx b/src/components/SourceOverlay.jsx index 724de27..8f6da4e 100644 --- a/src/components/SourceOverlay.jsx +++ b/src/components/SourceOverlay.jsx @@ -1,6 +1,5 @@ import React from 'react' import Img from 'react-image' -import Photobook from './Photobook.jsx' import { Player } from 'video-react' import Spinner from './presentational/Spinner' import NoSource from './presentational/NoSource' From 491f345ef0f21356cf2a2b9e4b49d8fc501d8cb2 Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Wed, 2 Jan 2019 15:42:28 +0000 Subject: [PATCH 29/31] add optional thumbnail to source --- src/components/presentational/CardSource.js | 25 ++++++++++++++++----- src/reducers/schema/sourceSchema.js | 1 + 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/components/presentational/CardSource.js b/src/components/presentational/CardSource.js index b81661e..9eab0af 100644 --- a/src/components/presentational/CardSource.js +++ b/src/components/presentational/CardSource.js @@ -1,11 +1,11 @@ import React from 'react' import PropTypes from 'prop-types' import Spinner from './Spinner' +import Img from 'react-image' import copy from '../../js/data/copy.json' const CardSource = ({ source, isLoading, onClickHandler }) => { - function renderIconText(type) { switch(type) { case 'Eyewitness Testimony': @@ -34,16 +34,31 @@ const CardSource = ({ source, isLoading, onClickHandler }) => {
) } + + let thumbnail = source.thumbnail + if (!thumbnail || thumbnail === '') { + // default to first image in paths, null if no images + const imgs = source.paths.filter(p => p.match(/\.(jpg|png)$/)) + thumbnail = imgs.length > 0 ? imgs[0] : null + } + + console.log(!!thumbnail) + console.log(thumbnail) + return (
{isLoading ? : (
onClickHandler(source)}> - - {renderIconText(source.type)} - -

{source.id}

+ {!!thumbnail ? ( + + ) : ( + + {renderIconText(source.type)} + + )} +

{source.id}

)}
diff --git a/src/reducers/schema/sourceSchema.js b/src/reducers/schema/sourceSchema.js index 1e8730e..c465ba5 100644 --- a/src/reducers/schema/sourceSchema.js +++ b/src/reducers/schema/sourceSchema.js @@ -2,6 +2,7 @@ import Joi from 'joi'; const sourceSchema = Joi.object().keys({ id: Joi.string().required(), + thumbnail: Joi.string().allow(''), paths: Joi.array().required(), type: Joi.string().allow(''), affil_1: Joi.string().allow(''), From 2dff5db402887bbb184b8a0bfd6aaf812c754137 Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Wed, 2 Jan 2019 15:44:31 +0000 Subject: [PATCH 30/31] correct sources URL --- example.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example.config.js b/example.config.js index b65421d..9a83349 100644 --- a/example.config.js +++ b/example.config.js @@ -4,7 +4,7 @@ module.exports = { EVENT_EXT: '/api/example/export_events/deeprows', CATEGORY_EXT: '/api/example/export_categories/rows', NARRATIVE_EXT: '/api/example/export_narratives/rows', - SOURCES_EXT: '/api/example/export_sources/ids', + SOURCES_EXT: '/api/example/export_sources/deepids', TAGS_EXT: '/api/example/export_tags/tree', SITES_EXT: '/api/example/export_sites/rows', MAP_ANCHOR: [31.356397, 34.784818], From 7c1bf4ca9d34da25b4913d8d6a553bc87f770a03 Mon Sep 17 00:00:00 2001 From: Lachlan Kermode Date: Wed, 2 Jan 2019 15:45:01 +0000 Subject: [PATCH 31/31] remove comments in NoSource --- src/components/presentational/NoSource.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/components/presentational/NoSource.js b/src/components/presentational/NoSource.js index e38975c..ebd6751 100644 --- a/src/components/presentational/NoSource.js +++ b/src/components/presentational/NoSource.js @@ -9,12 +9,6 @@ const NoSource = ({ failedUrls }) => {
No media found, as the original media has not yet been uploaded to the platform.
- {/*
*/} - {/* The following URLs were tried: */} - {/*
*/} - {/*
    */} - {/* {failedUrls.map((url, idx) =>
  • {url}
  • )} */} - {/*
*/}
) }