Skip to content

Commit

Permalink
feat: make all deckgl charts handle their own tooltips (apache-supers…
Browse files Browse the repository at this point in the history
…et#13)

* feat: make all deckgl charts handle their own tooltips

* fix: use destructuring
  • Loading branch information
kristw authored and zhaoyongjie committed Sep 23, 2021
1 parent 0d4c6dd commit de91dc4
Show file tree
Hide file tree
Showing 8 changed files with 79 additions and 46 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,9 @@ export default class AnimatableDeckGLContainer extends React.PureComponent {
containerRef = React.createRef();

setTooltip = tooltip => {
if (this.containerRef.current) {
this.containerRef.current.setTooltip(tooltip);
const { current } = this.containerRef;
if (current) {
current.setTooltip(tooltip);
}
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,6 @@ const propTypes = {
getPoints: PropTypes.func.isRequired,
payload: PropTypes.object.isRequired,
onAddFilter: PropTypes.func,
setTooltip: PropTypes.func,
width: PropTypes.number.isRequired,
height: PropTypes.number.isRequired,
};
Expand Down Expand Up @@ -147,7 +146,7 @@ export default class CategoricalDeckGLContainer extends React.PureComponent {
}

getLayers(values) {
const { getLayer, payload, formData: fd, onAddFilter, setTooltip } = this.props;
const { getLayer, payload, formData: fd, onAddFilter } = this.props;
let features = payload.data.features ? [...payload.data.features] : [];

// Add colors from categories or fixed color
Expand Down Expand Up @@ -177,7 +176,7 @@ export default class CategoricalDeckGLContainer extends React.PureComponent {
data: { ...payload.data, features },
};

return [getLayer(fd, filteredPayload, onAddFilter, setTooltip)];
return [getLayer(fd, filteredPayload, onAddFilter, this.setTooltip)];
}

// eslint-disable-next-line class-methods-use-this
Expand Down Expand Up @@ -228,8 +227,9 @@ export default class CategoricalDeckGLContainer extends React.PureComponent {
}

setTooltip = tooltip => {
if (this.containerRef.current) {
this.containerRef.current.setTooltip(tooltip);
const { current } = this.containerRef;
if (current) {
current.setTooltip(tooltip);
}
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,16 @@ const propTypes = {
setControlValue: PropTypes.func.isRequired,
viewport: PropTypes.object.isRequired,
onAddFilter: PropTypes.func,
setTooltip: PropTypes.func,
onSelect: PropTypes.func,
};
const defaultProps = {
onAddFilter() {},
setTooltip() {},
onSelect() {},
};

class DeckMulti extends React.PureComponent {
containerRef = React.createRef();

constructor(props) {
super(props);
this.state = { subSlicesLayers: {} };
Expand Down Expand Up @@ -96,7 +96,7 @@ class DeckMulti extends React.PureComponent {
subsliceCopy.form_data,
json,
this.props.onAddFilter,
this.props.setTooltip,
this.setTooltip,
[],
this.props.onSelect,
);
Expand All @@ -111,6 +111,13 @@ class DeckMulti extends React.PureComponent {
});
}

setTooltip = tooltip => {
const { current } = this.containerRef;
if (current) {
current.setTooltip(tooltip);
}
};

render() {
const { payload, formData, setControlValue } = this.props;
const { subSlicesLayers } = this.state;
Expand All @@ -119,6 +126,7 @@ class DeckMulti extends React.PureComponent {

return (
<DeckGLContainer
ref={this.containerRef}
mapboxApiAccessToken={payload.data.mapboxApiKey}
viewport={this.state.viewport || this.props.viewport}
layers={layers}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,18 +35,18 @@ const propTypes = {
setControlValue: PropTypes.func.isRequired,
viewport: PropTypes.object.isRequired,
onAddFilter: PropTypes.func,
setTooltip: PropTypes.func,
width: PropTypes.number.isRequired,
height: PropTypes.number.isRequired,
};
const defaultProps = {
onAddFilter() {},
setTooltip() {},
};

export function createDeckGLComponent(getLayer, getPoints) {
// Higher order component
class Component extends React.PureComponent {
containerRef = React.createRef();

constructor(props) {
super(props);

Expand Down Expand Up @@ -80,19 +80,26 @@ export function createDeckGLComponent(getLayer, getPoints) {
this.setState({ viewport });
}

// eslint-disable-next-line class-methods-use-this
computeLayer(props) {
const { formData, payload, onAddFilter, setTooltip } = props;
const { formData, payload, onAddFilter } = props;

return getLayer(formData, payload, onAddFilter, setTooltip);
return getLayer(formData, payload, onAddFilter, this.setTooltip);
}

setTooltip = tooltip => {
const { current } = this.containerRef;
if (current) {
current.setTooltip(tooltip);
}
};

render() {
const { formData, payload, setControlValue, height, width } = this.props;
const { layer, viewport } = this.state;

return (
<DeckGLContainer
ref={this.containerRef}
mapboxApiAccessToken={payload.data.mapboxApiKey}
viewport={viewport}
layers={[layer]}
Expand All @@ -113,7 +120,7 @@ export function createDeckGLComponent(getLayer, getPoints) {

export function createCategoricalDeckGLComponent(getLayer, getPoints) {
function Component(props) {
const { formData, payload, setControlValue, setTooltip, viewport, width, height } = props;
const { formData, payload, setControlValue, viewport, width, height } = props;

return (
<CategoricalDeckGLContainer
Expand All @@ -123,7 +130,6 @@ export function createCategoricalDeckGLComponent(getLayer, getPoints) {
viewport={viewport}
getLayer={getLayer}
payload={payload}
setTooltip={setTooltip}
getPoints={getPoints}
width={width}
height={height}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,35 +136,45 @@ const propTypes = {
setControlValue: PropTypes.func.isRequired,
viewport: PropTypes.object.isRequired,
onAddFilter: PropTypes.func,
setTooltip: PropTypes.func,
};
const defaultProps = {
onAddFilter() {},
setTooltip() {},
};

function deckGeoJson(props) {
const { formData, payload, setControlValue, onAddFilter, setTooltip, viewport } = props;
class DeckGLGeoJson extends React.Component {
containerRef = React.createRef();

// TODO get this to work
// if (formData.autozoom) {
// viewport = common.fitViewport(viewport, geojsonExtent(payload.data.features));
// }

const layer = getLayer(formData, payload, onAddFilter, setTooltip);
setTooltip = tooltip => {
const { current } = this.containerRef;
if (current) {
current.setTooltip(tooltip);
}
};

return (
<DeckGLContainer
mapboxApiAccessToken={payload.data.mapboxApiKey}
viewport={viewport}
layers={[layer]}
mapStyle={formData.mapbox_style}
setControlValue={setControlValue}
/>
);
render() {
const { formData, payload, setControlValue, onAddFilter, viewport } = this.props;

// TODO get this to work
// if (formData.autozoom) {
// viewport = common.fitViewport(viewport, geojsonExtent(payload.data.features));
// }

const layer = getLayer(formData, payload, onAddFilter, this.setTooltip);

return (
<DeckGLContainer
ref={this.containerRef}
mapboxApiAccessToken={payload.data.mapboxApiKey}
viewport={viewport}
layers={[layer]}
mapStyle={formData.mapbox_style}
setControlValue={setControlValue}
/>
);
}
}

deckGeoJson.propTypes = propTypes;
deckGeoJson.defaultProps = defaultProps;
DeckGLGeoJson.propTypes = propTypes;
DeckGLGeoJson.defaultProps = defaultProps;

export default deckGeoJson;
export default DeckGLGeoJson;
Original file line number Diff line number Diff line change
Expand Up @@ -259,8 +259,9 @@ class DeckGLPolygon extends React.Component {
}

setTooltip = tooltip => {
if (this.containerRef.current) {
this.containerRef.current.setTooltip(tooltip);
const { current } = this.containerRef;
if (current) {
current.setTooltip(tooltip);
}
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,16 +89,16 @@ const propTypes = {
setControlValue: PropTypes.func.isRequired,
viewport: PropTypes.object.isRequired,
onAddFilter: PropTypes.func,
setTooltip: PropTypes.func,
width: PropTypes.number.isRequired,
height: PropTypes.number.isRequired,
};
const defaultProps = {
onAddFilter() {},
setTooltip() {},
};

class DeckGLScreenGrid extends React.PureComponent {
containerRef = React.createRef();

constructor(props) {
super(props);

Expand Down Expand Up @@ -170,19 +170,27 @@ class DeckGLScreenGrid extends React.PureComponent {
this.props.formData,
this.props.payload,
this.props.onAddFilter,
this.props.setTooltip,
this.setTooltip,
filters,
);

return [layer];
}

setTooltip = tooltip => {
const { current } = this.containerRef;
if (current) {
current.setTooltip(tooltip);
}
};

render() {
const { formData, payload, setControlValue } = this.props;

return (
<div>
<AnimatableDeckGLContainer
ref={this.containerRef}
aggregation
getLayers={this.getLayers}
start={this.state.start}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,14 @@ const NOOP = () => {};

export default function transformProps(chartProps) {
const { width, height, rawFormData, queryData, hooks } = chartProps;
const { onAddFilter = NOOP, setControlValue = NOOP, setTooltip = NOOP } = hooks;
const { onAddFilter = NOOP, setControlValue = NOOP } = hooks;

return {
formData: rawFormData,
height,
onAddFilter,
payload: queryData,
setControlValue,
setTooltip,
viewport: {
...rawFormData.viewport,
height,
Expand Down

0 comments on commit de91dc4

Please sign in to comment.