Skip to content

Commit

Permalink
[Enhancement] set initial layer config when set layer type (#1898)
Browse files Browse the repository at this point in the history
* [Enhancement] set initial layer config when set layer type

Signed-off-by: Shan He <heshan0131@gmail.com>

[Bug] fix setting layer type override layer name

Signed-off-by: Shan He <heshan0131@gmail.com>
Signed-off-by: Jacob Wasilkowski <jwasilkowski@foursquare.com>

* lint

Signed-off-by: Jacob Wasilkowski <jwasilkowski@foursquare.com>

* review feedback

Signed-off-by: Jacob Wasilkowski <jwasilkowski@foursquare.com>

Co-authored-by: Shan He <heshan0131@gmail.com>
  • Loading branch information
jwasilgeo and heshan0131 committed Aug 4, 2022
1 parent 8d35d9b commit 9d171c6
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 7 deletions.
3 changes: 3 additions & 0 deletions src/layers/src/geojson-layer/geojson-layer.ts
Expand Up @@ -372,6 +372,9 @@ export default class GeoJsonLayer extends Layer {
}

setInitialLayerConfig({dataContainer}) {
if (!dataContainer.numRows()) {
return this;
}
this.updateLayerMeta(dataContainer);

const {featureTypes} = this.meta;
Expand Down
3 changes: 3 additions & 0 deletions src/layers/src/h3-hexagon-layer/h3-hexagon-layer.ts
Expand Up @@ -172,6 +172,9 @@ export default class HexagonIdLayer extends Layer {
}

setInitialLayerConfig(dataset) {
if (!dataset.dataContainer.numRows()) {
return this;
}
const defaultColorField = findDefaultColorField(dataset);

if (defaultColorField) {
Expand Down
3 changes: 3 additions & 0 deletions src/layers/src/point-layer/point-layer.ts
Expand Up @@ -207,6 +207,9 @@ export default class PointLayer extends Layer {
}

setInitialLayerConfig(dataset) {
if (!dataset.dataContainer.numRows()) {
return this;
}
const defaultColorField = findDefaultColorField(dataset);

if (defaultColorField) {
Expand Down
3 changes: 3 additions & 0 deletions src/layers/src/trip-layer/trip-layer.ts
Expand Up @@ -302,6 +302,9 @@ export default class TripLayer extends Layer {
}

setInitialLayerConfig({dataContainer}) {
if (!dataContainer.numRows()) {
return this;
}
this.updateLayerMeta(dataContainer);
return this;
}
Expand Down
59 changes: 52 additions & 7 deletions src/reducers/vis-state-updaters.ts
Expand Up @@ -711,6 +711,45 @@ export function layerDataIdChangeUpdater(
return updateStateWithLayerAndData(state, {layerData, layer, idx});
}

function setInitialLayerConfig(layer, datasets, layerClasses) {
let newLayer = layer;
if (!Object.keys(datasets).length) {
// no data is loaded
return layer;
}
if (!layer.config.dataId) {
// set layer dataId
newLayer = layer.updateLayerConfig({dataId: Object.keys(datasets)[0]});
}
const dataset = datasets[newLayer.config.dataId];
if (!dataset) {
return layer;
}

// find defaut layer props
const result =
typeof layerClasses[newLayer.type].findDefaultLayerProps === 'function'
? layerClasses[newLayer.type].findDefaultLayerProps(dataset, [])
: {props: []};

// an array of possible props, use 1st one
const props = Array.isArray(result) ? result : result.props || [];

if (props.length) {
newLayer = new layerClasses[layer.type]({
...props[0],
label: newLayer.config.label,
dataId: newLayer.config.dataId,
isVisible: true
});

return typeof newLayer.setInitialLayerConfig === 'function'
? newLayer.setInitialLayerConfig(dataset)
: newLayer;
}

return newLayer;
}
/**
* Update layer type. Previews layer config will be copied if applicable.
* @memberof visStateUpdaters
Expand All @@ -731,15 +770,21 @@ export function layerTypeChangeUpdater(
Console.error(`${newType} is not a valid layer type`);
return state;
}
let newLayer = new state.layerClasses[newType]({
label: oldLayer.config.label
});

// get a mint layer, with new id and type
// because deck.gl uses id to match between new and old layer.
// If type has changed but id is the same, it will break
const newLayer = new state.layerClasses[newType]();

newLayer.assignConfigToLayer(oldLayer.config, oldLayer.visConfigSettings);
if (!oldLayer.type) {
// if setting layer type on an empty layer
newLayer = setInitialLayerConfig(newLayer, state.datasets, state.layerClasses);
} else {
// get a mint layer, with new id and type
// because deck.gl uses id to match between new and old layer.
// If type has changed but id is the same, it will break
newLayer.assignConfigToLayer(oldLayer.config, oldLayer.visConfigSettings);
newLayer.updateLayerDomain(state.datasets);
}

newLayer.updateLayerDomain(state.datasets);
const {layerData, layer} = calculateLayerData(newLayer, state);
let newState = updateStateWithLayerAndData(state, {layerData, layer, idx});

Expand Down

0 comments on commit 9d171c6

Please sign in to comment.