Skip to content

Commit

Permalink
[chore] Exported layer utils methods and added onDragStart onDragEnd …
Browse files Browse the repository at this point in the history
…props (#2210)
  • Loading branch information
igorDykhta committed May 6, 2023
1 parent 7d3c602 commit c06ceca
Show file tree
Hide file tree
Showing 19 changed files with 141 additions and 71 deletions.
1 change: 1 addition & 0 deletions src/components/src/index.ts
Expand Up @@ -267,6 +267,7 @@ export type {LayerTypeListItemType} from './side-panel/layer-panel/layer-type-li
export type {LayerGroupColorPickerProps} from './side-panel/map-style-panel/map-layer-group-color-picker';
export type {MapLegendPanelProps, MapLegendPanelFactoryDeps} from './map/map-legend-panel';
export type {FormatterDropdownProps} from './common/data-table/option-dropdown';
export type {LayerListProps, LayerListFactoryDeps} from './side-panel/layer-panel/layer-list';

export {
Icons,
Expand Down
25 changes: 20 additions & 5 deletions src/components/src/kepler-gl.tsx
Expand Up @@ -30,7 +30,7 @@ import {RootContext, FeatureFlagsContextProvider, FeatureFlags} from './context'
import {OnErrorCallBack, OnSuccessCallBack, Viewport} from '@kepler.gl/types';
import {Layer} from '@kepler.gl/layers';

import {DndContext, DragOverlay} from '@dnd-kit/core';
import {DndContext, DragOverlay, DragEndEvent, DragStartEvent} from '@dnd-kit/core';

import {
MapStateActions,
Expand Down Expand Up @@ -60,7 +60,6 @@ import {

import {
DragItem,
DND_MODIFIERS,
DND_EMPTY_MODIFIERS,
DRAGOVERLAY_MODIFIERS,
findDndContainerId,
Expand Down Expand Up @@ -345,6 +344,9 @@ type KeplerGLBasicProps = {

topMapContainerProps?: object;
bottomMapContainerProps?: object;

onDragStart?: (event: DragStartEvent) => void;
onDragEnd?: (event: DragEndEvent) => void;
};

type KeplerGLProps = KeplerGlState & KeplerGlActions & KeplerGLBasicProps;
Expand Down Expand Up @@ -508,7 +510,13 @@ function KeplerGlFactory(
this.props.visStateActions.toggleLayerForMap(containerId, layerId);
};

_handleDragStart = ({active}) => {
_handleDragStart = event => {
if (this.props.onDragStart) {
this.props.onDragStart(event);
return;
}

const {active} = event;
const {
visState: {layers},
visStateActions
Expand All @@ -521,7 +529,14 @@ function KeplerGlFactory(
}
};

_handleDragEnd = ({active, over}) => {
_handleDragEnd = event => {
if (this.props.onDragEnd) {
this.props.onDragEnd(event);
return;
}

const {active, over} = event;

const {
visState: {layerOrder, splitMaps},
visStateActions
Expand Down Expand Up @@ -634,7 +649,7 @@ function KeplerGlFactory(
<DndContext
onDragStart={this._handleDragStart}
onDragEnd={this._handleDragEnd}
modifiers={!isSplit ? DND_MODIFIERS : DND_EMPTY_MODIFIERS}
modifiers={DND_EMPTY_MODIFIERS}
>
{!uiState.readOnly && !readOnly && <SidePanel {...sideFields} />}
<MapsLayout className="maps">{mapContainers}</MapsLayout>
Expand Down
22 changes: 17 additions & 5 deletions src/components/src/map-container.tsx
Expand Up @@ -144,7 +144,7 @@ interface StyledDroppableProps {
}

const StyledDroppable = styled.div<StyledDroppableProps>`
background-color: ${({isOver}) => (isOver ? 'rgba(128,128,128,0.2)' : 'none')};
background-color: ${props => (props.isOver ? props.theme.dndOverBackgroundColor : 'none')};
width: 100%;
height: 100%;
position: absolute;
Expand All @@ -156,7 +156,10 @@ export const isSplitSelector = props =>
props.visState.splitMaps && props.visState.splitMaps.length > 1;

export const Droppable = ({containerId}) => {
const {isOver, setNodeRef} = useDroppable({id: containerId});
const {isOver, setNodeRef} = useDroppable({
id: containerId,
data: {type: 'map', index: containerId}
});

return <StyledDroppable ref={setNodeRef} isOver={isOver} />;
};
Expand Down Expand Up @@ -301,6 +304,9 @@ interface MapContainerProps {
transformRequest?: any;

datasetAttributions?: DatasetAttribution[];

generateMapboxLayers?: typeof generateMapboxLayers;
generateDeckGLLayers?: typeof computeDeckLayers;
}

export default function MapContainerFactory(
Expand Down Expand Up @@ -412,12 +418,16 @@ export default function MapContainerFactory(
}
);

generateMapboxLayerMethodSelector = props => props.generateMapboxLayers ?? generateMapboxLayers;

mapboxLayersSelector = createSelector(
this.layersSelector,
this.layerDataSelector,
this.layerOrderSelector,
this.layersToRenderSelector,
generateMapboxLayers
this.generateMapboxLayerMethodSelector,
(layer, layerData, layerOrder, layersToRender, generateMapboxLayerMethod) =>
generateMapboxLayerMethod(layer, layerData, layerOrder, layersToRender)
);

// merge in a background-color style if the basemap choice is NO_MAP_ID
Expand Down Expand Up @@ -658,7 +668,8 @@ export default function MapContainerFactory(
deckGlProps,
index,
mapControls,
theme
theme,
generateDeckGLLayers
} = this.props;

const {hoverInfo, editor} = visState;
Expand All @@ -675,7 +686,8 @@ export default function MapContainerFactory(

const {setFeatures, onLayerClick, setSelectedFeature} = visStateActions;

const deckGlLayers = computeDeckLayers(
const generateDeckGLLayersMethod = generateDeckGLLayers ?? computeDeckLayers;
const deckGlLayers = generateDeckGLLayersMethod(
{
visState,
mapState,
Expand Down
4 changes: 3 additions & 1 deletion src/components/src/side-panel/layer-panel/layer-list.tsx
Expand Up @@ -31,7 +31,7 @@ import {useSortable, SortableContext, verticalListSortingStrategy} from '@dnd-ki
import {CSS} from '@dnd-kit/utilities';
import {findById} from '@kepler.gl/utils';

type LayerListProps = {
export type LayerListProps = {
datasets: Datasets;
layers: Layer[];
layerOrder: string[];
Expand All @@ -41,6 +41,8 @@ type LayerListProps = {
visStateActions: typeof VisStateActions;
};

export type LayerListFactoryDeps = [typeof LayerPanelFactory];

// make sure the element is always visible while is being dragged
// item being dragged is appended in body, here to reset its global style

Expand Down
Expand Up @@ -194,7 +194,11 @@ const StyledDragHandle = styled.div`
}
`;

export const DragHandle = ({className, listeners, children}) => (
export const DragHandle: React.FC<{className?: string; listeners?: any}> = ({
className,
listeners,
children
}) => (
<StyledDragHandle className={className} {...(listeners ? listeners : {})}>
{children}
</StyledDragHandle>
Expand Down
2 changes: 1 addition & 1 deletion src/constants/src/default-settings.ts
Expand Up @@ -973,7 +973,7 @@ export const EXPORT_MAP_FORMAT_OPTIONS = Object.entries(EXPORT_MAP_FORMATS).map(
})
);

export function getHTMLMapModeTileUrl(mode) {
export function getHTMLMapModeTileUrl(mode: string): string {
return `https://d1a3f4spazzrp4.cloudfront.net/kepler.gl/documentation/map-${mode.toLowerCase()}-mode.png`;
}

Expand Down
3 changes: 2 additions & 1 deletion src/layers/src/editor-layer/editor-layer.ts
Expand Up @@ -19,6 +19,7 @@
// THE SOFTWARE.

import {EditableGeoJsonLayer} from '@nebula.gl/layers';
import {Layer as DeckLayer, LayerProps as DeckLayerProps} from '@deck.gl/core/typed';
import {
DrawPolygonMode,
TranslateMode,
Expand Down Expand Up @@ -70,7 +71,7 @@ export function getEditorLayer({
featureCollection,
selectedFeatureIndexes,
viewport
}: GetEditorLayerProps): EditableGeoJsonLayer {
}: GetEditorLayerProps): DeckLayer<DeckLayerProps<any>> {
const {mode: editorMode} = editor;

let mode = DEFAULT_COMPOSITE_MODE;
Expand Down
2 changes: 1 addition & 1 deletion src/layers/src/index.ts
Expand Up @@ -42,7 +42,7 @@ export {defaultElevation as h3DefaultElevation} from './h3-hexagon-layer/h3-hexa
import {default as ScenegraphLayer} from './scenegraph-layer/scenegraph-layer';
import {default as TripLayer} from './trip-layer/trip-layer';
export {defaultLineWidth as tripDefaultLineWidth} from './trip-layer/trip-layer';
export {containValidTime, parseTripGeoJsonTimestamp} from './trip-layer/trip-utils';
export {coordHasLength4, containValidTime, isTripGeoJsonField, parseTripGeoJsonTimestamp, getAnimationDomainFromTimestamps} from './trip-layer/trip-utils';
import {default as S2GeometryLayer} from './s2-geometry-layer/s2-geometry-layer';
export {defaultElevation as s2DefaultElevation} from './s2-geometry-layer/s2-geometry-layer';
export {getS2Center} from './s2-geometry-layer/s2-utils';
Expand Down
2 changes: 0 additions & 2 deletions src/reducers/src/index.ts
Expand Up @@ -71,8 +71,6 @@ export * from './composer-helpers';
// export types
export * from './vis-state-updaters';

export * from './layer-utils';

export {INITIAL_UI_STATE} from './ui-state-updaters';

export type {
Expand Down
30 changes: 20 additions & 10 deletions src/reducers/src/layer-utils.ts
Expand Up @@ -19,6 +19,7 @@
// THE SOFTWARE.

import {GEOCODER_LAYER_ID} from '@kepler.gl/constants';
import {Layer as DeckLayer, LayerProps as DeckLayerProps} from '@deck.gl/core/typed';
import {
Field,
TooltipField,
Expand Down Expand Up @@ -96,15 +97,20 @@ export function findDefaultLayer(dataset: KeplerTable, layerClasses: LayerClasse
});
}

type MinVisState = {
datasets: VisState['datasets'];
animationConfig: VisState['animationConfig'];
};

/**
* Calculate layer data based on layer type, col Config,
* return updated layer if colorDomain, dataMap has changed.
* Also, returns updated layer in case the input layer was in invalid state.
* Adds an error message to the layer in case of an exception.
*/
export function calculateLayerData(
export function calculateLayerData<S extends MinVisState>(
layer: Layer,
state: {datasets: Datasets},
state: S,
oldLayerData?: any
): {
layerData: any;
Expand Down Expand Up @@ -248,7 +254,7 @@ export function isLayerVisible(layer, mapLayers) {
// return {[id]: true \ false}
export function prepareLayersForDeck(
layers: Layer[],
layerData: any[]
layerData: VisState['layerData']
): {
[key: string]: boolean;
} {
Expand Down Expand Up @@ -279,7 +285,9 @@ export function prepareLayersToRender(
);
}

export function getCustomDeckLayers(deckGlProps) {
type CustomDeckLayer = DeckLayer<DeckLayerProps<any>>;

export function getCustomDeckLayers(deckGlProps?: any): [CustomDeckLayer[], CustomDeckLayer[]] {
const bottomDeckLayers = Array.isArray(deckGlProps?.layers)
? deckGlProps?.layers
: isFunction(deckGlProps?.layers)
Expand Down Expand Up @@ -317,24 +325,26 @@ export type ComputeDeckLayersProps = {
};
};

export function bindLayerCallbacks(layerCallbacks = {}, idx) {
export function bindLayerCallbacks(layerCallbacks: LayerCallbacks = {}, idx: number) {
return Object.keys(layerCallbacks).reduce(
(accu, key) => ({
...accu,
[key]: val => layerCallbacks[key](idx, val)
}),
{}
{} as Record<string, (_idx: number, val: any) => void>
);
}

export type LayerCallbacks = {
onLayerHover?: (idx: number, value: any) => void;
onSetLayerDomain?: (idx: number, value: any) => void;
};

// eslint-disable-next-line complexity
export function computeDeckLayers(
{visState, mapState, mapStyle}: any,
options?: ComputeDeckLayersProps,
layerCallbacks?: {
onLayerHover?: (idx: number, value: any) => void;
onSetLayerDomain?: (idx: number, value: any) => void;
},
layerCallbacks?: LayerCallbacks,
deckGlProps?: any
): Layer[] {
const {
Expand Down
17 changes: 11 additions & 6 deletions src/reducers/src/vis-state-updaters.ts
Expand Up @@ -816,30 +816,30 @@ export function setFilterUpdater(
// @ts-ignore
const layerIdDifference = xor(newFilter.layerId, oldFilter.layerId);

const layerDataIds = uniq(
const layerDataIds = uniq<string>(
layerIdDifference
.map(lid =>
get(
state.layers.find(l => l.id === lid),
['config', 'dataId']
)
)
.filter(d => d)
.filter(d => d) as string[]
);

// only filter datasetsIds
datasetIds = layerDataIds;

// Update newFilter dataIds
const newDataIds = uniq(
const newDataIds = uniq<string>(
newFilter.layerId
.map(lid =>
?.map(lid =>
get(
state.layers.find(l => l.id === lid),
['config', 'dataId']
)
)
.filter(d => d)
.filter(d => d) as string[]
);

newFilter = {
Expand Down Expand Up @@ -1631,6 +1631,7 @@ export const updateVisDataUpdater = (
const datasets = toArray(action.datasets);

const newDataEntries = datasets.reduce(
// @ts-expect-error Type '{}' is missing the following properties from type 'ProtoDataset': data, info
(accu, {info = {}, ...rest} = {}) => ({
...accu,
...(createNewDataEntry({info, ...rest}, state.datasets) || {})
Expand Down Expand Up @@ -2770,7 +2771,11 @@ export function replaceDatasetDepsInState<T extends VisState>(
? replacePropValueInState(replacedState, replacedItem, mergerOptions)
: replacedState;

if (replacedState[mergerOptions.toMergeProp]?.length && preserveOrder) {
if (
mergerOptions.toMergeProp !== undefined &&
replacedState[mergerOptions.toMergeProp]?.length &&
preserveOrder
) {
replacedState[preserveOrder] = propValue.map(item => item.id);
}
});
Expand Down
4 changes: 3 additions & 1 deletion src/schemas/src/index.ts
Expand Up @@ -42,7 +42,9 @@ export {
DimensionFieldSchema,
SplitMapsSchema,
filterPropsV1,
default as visStateSchema
default as visStateSchema,
layerPropsV1,
layerPropsV0
} from './vis-state-schema';
export type {
SavedField,
Expand Down
2 changes: 1 addition & 1 deletion src/schemas/src/schema.ts
Expand Up @@ -53,7 +53,7 @@ export default class Schema {

loadPropertiesOrApplySchema(
node: any,
parents: object[] = [],
parents: any[] = [],
accumulator?: any
): {[key: string]: any} {
return this._getPropertyValueFromSchema('load', node, parents, accumulator);
Expand Down

0 comments on commit c06ceca

Please sign in to comment.