@sqlrooms/kepler 0.29.0-rc.0 → 0.29.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/KeplerSlice.d.ts +22 -6
- package/dist/KeplerSlice.d.ts.map +1 -1
- package/dist/KeplerSlice.js +273 -45
- package/dist/KeplerSlice.js.map +1 -1
- package/dist/components/CustomFilterManager.d.ts.map +1 -1
- package/dist/components/CustomFilterManager.js +4 -1
- package/dist/components/CustomFilterManager.js.map +1 -1
- package/dist/components/CustomInteractionManager.d.ts.map +1 -1
- package/dist/components/CustomInteractionManager.js +4 -1
- package/dist/components/CustomInteractionManager.js.map +1 -1
- package/dist/components/CustomLayerManager.d.ts.map +1 -1
- package/dist/components/CustomLayerManager.js +138 -17
- package/dist/components/CustomLayerManager.js.map +1 -1
- package/dist/components/CustomMapDrawPanel.d.ts +8 -0
- package/dist/components/CustomMapDrawPanel.d.ts.map +1 -0
- package/dist/components/CustomMapDrawPanel.js +28 -0
- package/dist/components/CustomMapDrawPanel.js.map +1 -0
- package/dist/components/KeplerAddDataDialog.d.ts +2 -3
- package/dist/components/KeplerAddDataDialog.d.ts.map +1 -1
- package/dist/components/KeplerAddDataDialog.js +18 -8
- package/dist/components/KeplerAddDataDialog.js.map +1 -1
- package/dist/components/KeplerImageExport.d.ts.map +1 -1
- package/dist/components/KeplerImageExport.js +26 -8
- package/dist/components/KeplerImageExport.js.map +1 -1
- package/dist/components/KeplerInjector.d.ts.map +1 -1
- package/dist/components/KeplerInjector.js +3 -1
- package/dist/components/KeplerInjector.js.map +1 -1
- package/dist/hooks/useKeplerStateActions.d.ts +7 -6
- package/dist/hooks/useKeplerStateActions.d.ts.map +1 -1
- package/dist/hooks/useKeplerStateActions.js +1 -1
- package/dist/hooks/useKeplerStateActions.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +20 -20
package/dist/KeplerSlice.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KeplerSlice.js","sourceRoot":"","sources":["../src/KeplerSlice.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n addDataToMap,\n addLayer as addLayerAction,\n deleteEntry,\n ActionTypes as KeplerActionTypes,\n registerEntry,\n removeDataset,\n requestMapStyles,\n wrapTo,\n} from '@kepler.gl/actions';\nimport {ALL_FIELD_TYPES, VectorTileDatasetMetadata} from '@kepler.gl/constants';\nimport {\n castDuckDBTypesForKepler,\n getDuckDBColumnTypes,\n getDuckDBColumnTypesMap,\n restoreGeoarrowMetadata,\n setGeoArrowWKBExtension,\n} from '@kepler.gl/duckdb';\nimport {Layer} from '@kepler.gl/layers';\nimport {arrowSchemaToFields} from '@kepler.gl/processors';\nimport {\n INITIAL_UI_STATE,\n keplerGlReducer,\n KeplerGlState,\n MapStyle,\n} from '@kepler.gl/reducers';\nimport {KeplerGLSchemaClass} from '@kepler.gl/schemas';\nimport {KeplerTable} from '@kepler.gl/table';\nimport {AddDataToMapPayload} from '@kepler.gl/types';\nimport {\n DatabaseConnection,\n initApplicationConfig,\n KeplerApplicationConfig,\n} from '@kepler.gl/utils';\nimport {createId} from '@paralleldrive/cuid2';\nimport {KeplerMapSchema, KeplerSliceConfig} from '@sqlrooms/kepler-config';\nimport {\n BaseRoomStoreState,\n createSlice,\n DbSliceState,\n RoomShellSliceState,\n useBaseRoomShellStore,\n type StateCreator,\n} from '@sqlrooms/room-shell';\nimport * as arrow from 'apache-arrow';\nimport {produce, setAutoFreeze} from 'immer';\nimport {taskMiddleware} from 'react-palm/tasks';\nimport type {\n Action,\n AnyAction,\n MiddlewareAPI,\n Store as ReduxStore,\n} from 'redux';\nimport {compose, Dispatch, Middleware} from 'redux';\nimport {createLogger, ReduxLoggerOptions} from 'redux-logger';\nsetAutoFreeze(false); // Kepler attempts to mutate redux state, so we need to disable immer's auto freeze to avoid errors\n\nconst KeplerGLSchemaManager = new KeplerGLSchemaClass();\n\nclass DesktopKeplerTable extends KeplerTable {\n static getInputDataValidator = function () {\n // Default validator accepts only string timestamps\n return (d: any) => d;\n };\n}\n\nexport type KeplerGLBasicProps = {\n mapboxApiAccessToken?: string;\n};\n\nexport type CreateKeplerSliceOptions = {\n config?: Partial<KeplerSliceConfig>;\n initialKeplerState?: Partial<KeplerGlState>;\n basicKeplerProps?: Partial<KeplerGLBasicProps>;\n actionLogging?: boolean | ReduxLoggerOptions;\n middlewares?: Middleware[];\n applicationConfig?: KeplerApplicationConfig;\n /**\n * Called when a kepler action is dispatched\n * @param mapId - The map id\n * @param action - The action\n */\n onAction?: (mapId: string, action: KeplerAction) => void;\n};\n\nexport function createDefaultKeplerConfig(\n props?: Partial<KeplerSliceConfig>,\n): KeplerSliceConfig {\n const mapId = createId();\n return {\n maps: [\n {\n id: mapId,\n name: 'Untitled Map',\n config: undefined,\n lastOpenedAt: Date.now(),\n },\n ],\n currentMapId: mapId,\n openTabs: [mapId],\n ...props,\n };\n}\n\nexport type KeplerAction = {\n type: string;\n payload?: unknown;\n};\n\nexport function hasMapId(action: KeplerAction): action is KeplerAction & {\n payload: {meta: {_id_: string}};\n} {\n return (\n typeof action.payload === 'object' &&\n action.payload !== null &&\n 'meta' in action.payload &&\n typeof action.payload.meta === 'object' &&\n action.payload.meta !== null &&\n '_id_' in action.payload.meta\n );\n}\n\n// support multiple kepler maps\nexport type KeplerGlReduxState = {[id: string]: KeplerGlState};\nexport type KeplerSliceState = {\n kepler: {\n config: KeplerSliceConfig;\n map: KeplerGlReduxState;\n basicKeplerProps?: Partial<KeplerGLBasicProps>;\n forwardDispatch: {\n [mapId: string]: Dispatch;\n };\n initialize: () => Promise<void>;\n setConfig: (config: KeplerSliceConfig) => void;\n /**\n * Update the datasets in all the kepler map so that they correspond to\n * the latest table schemas in the database\n */\n syncKeplerDatasets: () => Promise<void>;\n addLayer: (mapId: string, layer: Layer, datasetId: string) => void;\n addTableToMap: (\n mapId: string,\n tableName: string,\n options?: AddDataToMapPayload['options'],\n ) => Promise<void>;\n addTileSetToMap: (\n mapId: string,\n tableName: string,\n tileset: {\n name: string;\n type: string;\n metadata: VectorTileDatasetMetadata;\n },\n tileMetadata: Record<string, any>,\n autoCreateLayers: boolean,\n ) => void;\n addConfigToMap: (mapId: string, config: KeplerMapSchema) => void;\n removeDatasetFromMaps: (datasetId: string) => void;\n dispatchAction: (mapId: string, action: KeplerAction) => void;\n setCurrentMapId: (mapId: string) => void;\n /**\n * Create a new map and return the map id\n * @param name - The name of the map\n * @returns The map id\n */\n createMap: (name?: string) => string;\n deleteMap: (mapId: string) => void;\n renameMap: (mapId: string, name: string) => void;\n closeMap: (mapId: string) => void;\n setOpenTabs: (tabIds: string[]) => void;\n getCurrentMap: () => KeplerMapSchema | undefined;\n registerKeplerMapIfNotExists: (mapId: string) => void;\n __reduxProviderStore: ReduxStore<KeplerGlReduxState, AnyAction> | undefined;\n };\n};\n\n// Auto save will be triggered in middleware on every kepler action\n// skip these actions to avoid unnecessary save\nconst SKIP_AUTO_SAVE_ACTIONS: string[] = [\n KeplerActionTypes.LAYER_HOVER,\n KeplerActionTypes.UPDATE_MAP,\n KeplerActionTypes.MOUSE_MOVE,\n];\n\nexport function createKeplerSlice({\n basicKeplerProps = {},\n config: initialConfigProps,\n initialKeplerState = {\n mapStyle: {styleType: 'positron'} as MapStyle,\n uiState: {\n ...INITIAL_UI_STATE,\n currentModal: null,\n mapControls: {\n visibleLayers: INITIAL_UI_STATE.mapControls.visibleLayers,\n mapLegend: {\n show: true,\n active: false,\n },\n toggle3d: {\n show: true,\n active: false,\n },\n },\n },\n },\n actionLogging = false,\n middlewares: additionalMiddlewares = [],\n applicationConfig,\n onAction,\n}: CreateKeplerSliceOptions = {}): StateCreator<KeplerSliceState> {\n const initialConfig = createDefaultKeplerConfig(initialConfigProps);\n initApplicationConfig({\n table: DesktopKeplerTable,\n ...applicationConfig,\n });\n const updateMapLastOpenedAt = (\n maps: KeplerSliceConfig['maps'],\n mapId: string,\n now: number = Date.now(),\n ) => {\n const map = maps.find((item) => item.id === mapId);\n if (map) {\n map.lastOpenedAt = now;\n }\n };\n return createSlice<\n KeplerSliceState,\n BaseRoomStoreState & KeplerSliceState & DbSliceState\n >((set, get) => {\n const keplerReducer = keplerGlReducer.initialState(initialKeplerState);\n const middlewares: Middleware[] = [\n taskMiddleware,\n saveKeplerConfigMiddleware,\n ...additionalMiddlewares,\n ];\n\n if (actionLogging) {\n const logger = createLogger(\n actionLogging === true ? {collapsed: true} : actionLogging,\n ) as Middleware;\n middlewares.push(logger);\n }\n\n const storeDispatch: Dispatch<KeplerAction> = (action) => {\n set((state: KeplerSliceState) => ({\n ...state,\n kepler: {\n ...state.kepler,\n map: keplerReducer(state.kepler.map, action),\n },\n }));\n\n // Call onAction if it's defined\n const mapId = hasMapId(action) ? action.payload.meta._id_ : undefined;\n if (!mapId) throw new Error('Map ID not found in action payload');\n onAction?.(mapId, action);\n return action;\n };\n // const forwardDispatch: {[id: string]: Dispatch} = {};\n return {\n kepler: {\n config: initialConfig,\n basicKeplerProps,\n map: {},\n dispatchAction: () => {},\n __reduxProviderStore: undefined,\n forwardDispatch: {},\n\n setConfig: (config: KeplerSliceConfig) => {\n set((state) =>\n produce(state, (draft) => {\n draft.kepler.config = config;\n }),\n );\n updateMapReduxStates();\n updateForwardDispatch();\n updateMapConfigs();\n get().kepler.syncKeplerDatasets();\n },\n\n async initialize() {\n const config = get().kepler.config;\n const currentMapId = config.currentMapId;\n const keplerInitialState: KeplerGlReduxState = keplerReducer(\n undefined,\n registerEntry({id: currentMapId}),\n );\n set({\n kepler: {\n ...get().kepler,\n map: keplerInitialState,\n dispatchAction: (mid, action) => {\n // wrapDispatch(wrapTo(mapId)(action));\n const dispatchToMap = get().kepler.forwardDispatch[mid];\n if (dispatchToMap) {\n dispatchToMap(wrapTo(mid, action));\n } else {\n console.error('dispatchAction: mapId not found', mid);\n }\n },\n __reduxProviderStore: {\n dispatch: storeDispatch,\n getState: () => get().kepler.map || {},\n subscribe: () => () => {},\n replaceReducer: () => {},\n // @ts-expect-error - Symbol.observable is not defined in the Redux type definitions\n [Symbol.observable]: () => {},\n },\n },\n });\n updateForwardDispatch();\n updateMapConfigs();\n await get().kepler.syncKeplerDatasets();\n requestMapStyle(config.currentMapId);\n },\n\n addLayer: (mapId, layer, datasetId) => {\n get().kepler.registerKeplerMapIfNotExists(mapId);\n get().kepler.dispatchAction(mapId, addLayerAction(layer, datasetId));\n },\n\n addTableToMap: async (mapId, tableName, options = {}) => {\n const connector = await get().db.getConnector();\n const duckDbColumns = await getDuckDBColumnTypes(\n {\n query: (query: string) => connector.query(query).result,\n } as DatabaseConnection,\n tableName,\n );\n const tableDuckDBTypes = getDuckDBColumnTypesMap(duckDbColumns);\n const adjustedQuery = castDuckDBTypesForKepler(\n tableName,\n duckDbColumns,\n );\n const arrowResult = await connector.query(adjustedQuery).result;\n setGeoArrowWKBExtension(arrowResult, duckDbColumns);\n // TODO remove once DuckDB doesn't drop geoarrow metadata\n restoreGeoarrowMetadata(arrowResult, {});\n const fields = arrowSchemaToFields(arrowResult, tableDuckDBTypes);\n const cols = Array.from({length: arrowResult.numCols}, (_, i) =>\n arrowResult.getChildAt(i),\n ).filter((col) => col) as arrow.Vector[];\n\n if (fields && cols) {\n const datasets: AddDataToMapPayload['datasets'] = {\n data: {fields, cols, rows: [], arrowTable: arrowResult},\n info: {label: tableName, id: tableName},\n metadata: {tableName},\n };\n get().kepler.dispatchAction(\n mapId,\n addDataToMap({datasets, options}),\n );\n }\n },\n\n getCurrentMap: () => {\n return get().kepler.config.maps.find(\n (map) => map.id === get().kepler.config.currentMapId,\n );\n },\n\n setCurrentMapId: (mapId) => {\n return set((state) =>\n produce(state, (draft) => {\n const now = Date.now();\n draft.kepler.config.currentMapId = mapId;\n updateMapLastOpenedAt(draft.kepler.config.maps, mapId, now);\n }),\n );\n },\n\n createMap: (name) => {\n const mapId = createId();\n const now = Date.now();\n set((state) =>\n produce(state, (draft) => {\n draft.kepler.config.maps.push({\n id: mapId,\n name: name ?? 'Untitled Map',\n lastOpenedAt: now,\n });\n draft.kepler.config.openTabs.push(mapId);\n draft.kepler.map = keplerReducer(\n draft.kepler.map,\n registerEntry({id: mapId}),\n );\n draft.kepler.forwardDispatch[mapId] = getForwardDispatch(mapId);\n }),\n );\n requestMapStyle(mapId);\n get().kepler.syncKeplerDatasets();\n return mapId;\n },\n\n async syncKeplerDatasets() {\n for (const mapId of Object.keys(get().kepler.map)) {\n const keplerDatasets = get().kepler.map[mapId]?.visState.datasets;\n for (const {table} of get().db.tables) {\n // TODO: remove this once getDuckDBColumnTypesMap can handle qualified table names\n // const qualifiedTable = table.toString();\n if (\n // !table.schema?.startsWith('__') && // skip internal schemas\n // !keplerDatasets?.[qualifiedTable]\n table.schema === 'main' &&\n !keplerDatasets?.[table.table]\n ) {\n await get().kepler.addTableToMap(mapId, table.table, {\n autoCreateLayers: false,\n centerMap: false,\n });\n }\n }\n }\n },\n\n deleteMap: (mapId) => {\n set((state) =>\n produce(state, (draft) => {\n const openTabs = draft.kepler.config.openTabs;\n const maps = draft.kepler.config.maps;\n const wasCurrentMap = draft.kepler.config.currentMapId === mapId;\n const deletingIndex = openTabs.indexOf(mapId);\n\n // Remove from maps and openTabs\n draft.kepler.config.maps = maps.filter((map) => map.id !== mapId);\n draft.kepler.config.openTabs = openTabs.filter(\n (id) => id !== mapId,\n );\n\n // If we deleted the current map, select another one\n if (wasCurrentMap) {\n const newOpenTabs = draft.kepler.config.openTabs;\n const remainingMaps = draft.kepler.config.maps;\n\n if (newOpenTabs.length > 0) {\n // Select from remaining open tabs\n const newIndex =\n deletingIndex === 0\n ? 0\n : Math.min(deletingIndex - 1, newOpenTabs.length - 1);\n const newSelectedId = newOpenTabs[newIndex];\n if (newSelectedId) {\n draft.kepler.config.currentMapId = newSelectedId;\n updateMapLastOpenedAt(\n draft.kepler.config.maps,\n newSelectedId,\n Date.now(),\n );\n }\n } else if (remainingMaps.length > 0) {\n // No open tabs left, open a closed map\n const mapToOpen = remainingMaps[0];\n if (mapToOpen) {\n draft.kepler.config.openTabs.push(mapToOpen.id);\n draft.kepler.config.currentMapId = mapToOpen.id;\n updateMapLastOpenedAt(\n draft.kepler.config.maps,\n mapToOpen.id,\n Date.now(),\n );\n }\n }\n }\n\n draft.kepler.map = keplerReducer(\n draft.kepler.map,\n deleteEntry(mapId),\n );\n\n delete draft.kepler.forwardDispatch[mapId];\n }),\n );\n },\n\n renameMap: (mapId, name) => {\n set((state) =>\n produce(state, (draft) => {\n const map = draft.kepler.config.maps.find(\n (map) => map.id === mapId,\n );\n if (map) {\n map.name = name;\n }\n }),\n );\n },\n\n closeMap: (mapId) => {\n set((state) =>\n produce(state, (draft) => {\n const openTabs = draft.kepler.config.openTabs;\n\n // Don't close if it's the last open tab (defensive check, TabStrip also prevents this)\n if (openTabs.length <= 1) return;\n\n // Just remove from openTabs - TabStrip handles selection via onSelect before calling onClose\n draft.kepler.config.openTabs = openTabs.filter(\n (id) => id !== mapId,\n );\n }),\n );\n },\n\n setOpenTabs: (tabIds) => {\n set((state) =>\n produce(state, (draft) => {\n draft.kepler.config.openTabs = tabIds;\n }),\n );\n },\n\n addDataToMap: (mapId: string, data: any) => {\n get().kepler.registerKeplerMapIfNotExists(mapId);\n get().kepler.dispatchAction(mapId, addDataToMap(data));\n },\n\n addTileSetToMap: (\n mapId,\n tableName,\n tileset,\n tileMetadata,\n autoCreateLayers = true,\n ) => {\n get().kepler.registerKeplerMapIfNotExists(mapId);\n const dataset = {\n info: {\n label: tileset.name,\n type: tileset.type,\n format: 'rows',\n // important for kepler to reload this tileset\n id: tableName,\n },\n data: {\n fields: tileMetadata?.fields || [],\n rows: [],\n },\n metadata: {\n // duckdb table name\n tableName,\n ...tileMetadata,\n ...tileset.metadata,\n },\n // vector tile layer only supports gpu filtering for now\n supportedFilterTypes: [\n ALL_FIELD_TYPES.real,\n ALL_FIELD_TYPES.integer,\n ],\n disableDataOperation: true,\n };\n get().kepler.dispatchAction(\n mapId,\n addDataToMap({\n datasets: dataset,\n options: {\n autoCreateLayers,\n centerMap: true,\n },\n }),\n );\n },\n\n addConfigToMap: (mapId: string, config: any) => {\n // if map not registered, register it\n get().kepler.registerKeplerMapIfNotExists(mapId);\n const parsedConfig = KeplerGLSchemaManager.parseSavedConfig(config);\n if (!parsedConfig) {\n throw new Error('Failed to parse config');\n }\n get().kepler.dispatchAction(\n mapId,\n addDataToMap({config: parsedConfig, datasets: []}),\n );\n },\n\n registerKeplerMapIfNotExists(mapId: string) {\n if (!get().kepler.map[mapId]) {\n set({\n kepler: {\n ...get().kepler,\n map: keplerReducer(\n get().kepler.map,\n registerEntry({id: mapId}),\n ),\n forwardDispatch: {\n ...get().kepler.forwardDispatch,\n [mapId]: getForwardDispatch(mapId),\n },\n },\n });\n requestMapStyle(mapId);\n }\n },\n\n removeDatasetFromMaps: (datasetId: string) => {\n for (const mapId of Object.keys(get().kepler.map)) {\n const map = get().kepler.map[mapId];\n if (map) {\n get().kepler.dispatchAction(mapId, removeDataset(datasetId));\n }\n }\n },\n },\n };\n\n function requestMapStyle(mapId: string) {\n const {mapStyle} = get().kepler.map[mapId] || {};\n const style = mapStyle?.mapStyles[mapStyle.styleType];\n if (style) {\n get().kepler.dispatchAction(\n mapId,\n requestMapStyles({[style.id]: style}),\n );\n }\n }\n\n function saveKeplerConfigMiddleware() {\n return (next: (action: KeplerAction) => void) =>\n (action: KeplerAction) => {\n // get id from kepler action payload meta\n const mapId = hasMapId(action) ? action.payload.meta._id_ : undefined;\n if (!mapId) throw new Error('Map ID not found in action payload');\n const result = next(action);\n if (!SKIP_AUTO_SAVE_ACTIONS.includes(action.type) && mapId) {\n // save kepler config to store\n set((state) =>\n produce(state, (draft) => {\n const mapToSave = draft.kepler.config.maps.find(\n (map) => map.id === mapId,\n );\n if (mapToSave && state.kepler.map?.[mapId]) {\n mapToSave.config = KeplerGLSchemaManager.getConfigToSave(\n state.kepler.map[mapId],\n ) as any;\n }\n }),\n );\n }\n // save kepler config to local storage\n return result;\n };\n }\n\n function updateMapConfigs() {\n const config = get().kepler.config;\n const keplerMaps = config.maps;\n for (const {id, config} of keplerMaps) {\n if (config) {\n get().kepler.addConfigToMap(id, config as unknown as KeplerMapSchema);\n }\n }\n }\n\n function updateMapReduxStates() {\n set((state) =>\n produce(state, (draft) => {\n // Delete redux state of maps that are not in the config\n for (const mapId of Object.keys(draft.kepler.map)) {\n if (!draft.kepler.config.maps.some((map) => map.id === mapId)) {\n draft.kepler.map = keplerReducer(\n draft.kepler.map,\n deleteEntry(mapId),\n );\n }\n }\n // Register redux state of maps that are not in the config\n for (const map of draft.kepler.config.maps) {\n if (!draft.kepler.map[map.id]) {\n draft.kepler.map = keplerReducer(\n draft.kepler.map,\n registerEntry({id: map.id}),\n );\n draft.kepler.forwardDispatch[map.id] = getForwardDispatch(map.id);\n }\n }\n }),\n );\n }\n\n function updateForwardDispatch() {\n const config = get().kepler.config;\n const currentMapId = config.currentMapId;\n const forwardDispatch = {\n [currentMapId]: getForwardDispatch(currentMapId),\n };\n if (config) {\n for (const {id} of config.maps) {\n forwardDispatch[id] = getForwardDispatch(id);\n }\n }\n set((state) =>\n produce(state, (draft) => {\n draft.kepler.forwardDispatch = forwardDispatch;\n }),\n );\n }\n\n function getForwardDispatch(mapId: string): Dispatch<KeplerAction> {\n /** Adapted from applyMiddleware in redux */\n let wrapDispatch: (\n action: KeplerAction,\n ...args: any\n ) => KeplerAction = () => {\n throw new Error(\n 'Dispatching while constructing your middleware is not allowed. ' +\n 'Other middleware would not be applied to this dispatch.',\n );\n };\n const wrapToMap = wrapTo(mapId);\n const middlewareAPI: MiddlewareAPI<any, any> = {\n getState: get,\n dispatch: (action: Action, ...args: any) => {\n // need to forward here as well\n return wrapDispatch(wrapToMap(action), ...args);\n },\n };\n\n const chain = middlewares.map((middleware) => middleware(middlewareAPI));\n wrapDispatch = compose<Dispatch>(...chain)(storeDispatch);\n return wrapDispatch as Dispatch<KeplerAction>;\n }\n });\n}\n\ntype RoomStateWithDiscuss = RoomShellSliceState & KeplerSliceState;\n\nexport function useStoreWithKepler<T>(\n selector: (state: RoomStateWithDiscuss) => T,\n): T {\n return useBaseRoomShellStore<RoomStateWithDiscuss, T>((state) =>\n selector(state as RoomStateWithDiscuss),\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"KeplerSlice.js","sourceRoot":"","sources":["../src/KeplerSlice.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n addDataToMap,\n addFilter as addFilterAction,\n addLayer as addLayerAction,\n deleteEntry,\n interactionConfigChange,\n ActionTypes as KeplerActionTypes,\n registerEntry,\n removeDataset,\n requestMapStyles,\n setFilter as setFilterAction,\n setFilterAnimationTime as setFilterAnimationTimeAction,\n setFilterAnimationWindow as setFilterAnimationWindowAction,\n wrapTo,\n} from '@kepler.gl/actions';\nimport {ALL_FIELD_TYPES, VectorTileDatasetMetadata} from '@kepler.gl/constants';\nimport {\n castDuckDBTypesForKepler,\n getDuckDBColumnTypes,\n getDuckDBColumnTypesMap,\n restoreGeoarrowMetadata,\n setGeoArrowWKBExtension,\n} from '@kepler.gl/duckdb';\nimport {arrowSchemaToFields} from '@kepler.gl/processors';\nimport {\n INITIAL_UI_STATE,\n keplerGlReducer,\n KeplerGlState,\n MapStyle,\n} from '@kepler.gl/reducers';\nimport {KeplerGLSchemaClass} from '@kepler.gl/schemas';\nimport {KeplerTable} from '@kepler.gl/table';\nimport {\n AddDataToMapPayload,\n MinSavedLayer,\n ParsedLayer,\n} from '@kepler.gl/types';\nimport {\n DatabaseConnection,\n initApplicationConfig,\n KeplerApplicationConfig,\n} from '@kepler.gl/utils';\nimport {createId} from '@paralleldrive/cuid2';\nimport {KeplerMapSchema, KeplerSliceConfig} from '@sqlrooms/kepler-config';\nimport {\n BaseRoomStoreState,\n createSlice,\n DbSliceState,\n registerCommandsForOwner,\n RoomCommand,\n RoomShellSliceState,\n unregisterCommandsForOwner,\n useBaseRoomShellStore,\n type StateCreator,\n} from '@sqlrooms/room-shell';\nimport {getTheme, type ResolvedTheme} from '@sqlrooms/ui';\nimport * as arrow from 'apache-arrow';\nimport {produce, setAutoFreeze} from 'immer';\nimport {taskMiddleware} from 'react-palm/tasks';\nimport type {\n Action,\n AnyAction,\n MiddlewareAPI,\n Store as ReduxStore,\n} from 'redux';\nimport {compose, Dispatch, Middleware} from 'redux';\nimport {createLogger, ReduxLoggerOptions} from 'redux-logger';\n\nsetAutoFreeze(false); // Kepler attempts to mutate redux state, so we need to disable immer's auto freeze to avoid errors\n\nconst KeplerGLSchemaManager = new KeplerGLSchemaClass();\nconst KEPLER_COMMAND_OWNER = '@sqlrooms/kepler';\n\nclass DesktopKeplerTable extends KeplerTable {\n static getInputDataValidator = function () {\n // Default validator accepts only string timestamps\n return (d: any) => d;\n };\n}\n\nexport type KeplerGLBasicProps = {\n mapboxApiAccessToken?: string;\n};\n\nexport type CreateInitialMapKeplerStateContext = {\n reason:\n | 'initialize'\n | 'create-map'\n | 'duplicate-map'\n | 'register-map'\n | 'sync-config';\n defaultInitialMapKeplerState: Partial<KeplerGlState>;\n mapId?: string;\n name?: string;\n};\n\nexport type CreateKeplerSliceOptions = {\n config?: Partial<KeplerSliceConfig>;\n createInitialMapKeplerState?: (\n context: CreateInitialMapKeplerStateContext,\n ) => Partial<KeplerGlState>;\n basicKeplerProps?: Partial<KeplerGLBasicProps>;\n actionLogging?: boolean | ReduxLoggerOptions;\n middlewares?: Middleware[];\n applicationConfig?: KeplerApplicationConfig;\n /**\n * Called when a kepler action is dispatched\n * @param mapId - The map id\n * @param action - The action\n */\n onAction?: (mapId: string, action: KeplerAction) => void;\n};\n\nfunction createDefaultMapKeplerState(\n resolvedTheme: ResolvedTheme,\n): Partial<KeplerGlState> {\n return {\n mapStyle: {\n styleType: resolvedTheme === 'dark' ? 'dark-matter' : 'positron',\n } as MapStyle,\n uiState: {\n ...INITIAL_UI_STATE,\n currentModal: null,\n mapControls: {\n visibleLayers: INITIAL_UI_STATE.mapControls.visibleLayers,\n mapLegend: {\n show: true,\n active: false,\n },\n toggle3d: {\n show: true,\n active: false,\n },\n mapDraw: {\n show: true,\n active: false,\n },\n },\n },\n };\n}\n\nexport function createDefaultKeplerConfig(\n props?: Partial<KeplerSliceConfig>,\n): KeplerSliceConfig {\n const mapId = createId();\n return {\n maps: [\n {\n id: mapId,\n name: 'Untitled Map',\n config: undefined,\n lastOpenedAt: Date.now(),\n },\n ],\n currentMapId: mapId,\n openTabs: [mapId],\n ...props,\n };\n}\n\nfunction createKeplerCommands(): RoomCommand<\n BaseRoomStoreState & KeplerSliceState & DbSliceState\n>[] {\n const DUPLICATE_MAP_COMMAND_ID = 'kepler.duplicate-tab';\n\n // Error codes for internal tracking/logging (kebab-case for consistency)\n const ERROR_CODES = {\n MAP_NOT_FOUND: 'map-not-found',\n MAP_STATE_NOT_INITIALIZED: 'map-state-not-initialized',\n };\n\n return [\n {\n id: DUPLICATE_MAP_COMMAND_ID,\n name: 'Duplicate Tab',\n description: 'Duplicate the current map tab',\n group: 'Kepler',\n keywords: ['kepler', 'map', 'duplicate', 'tab', 'copy'],\n metadata: {\n readOnly: false,\n idempotent: false,\n riskLevel: 'low',\n },\n execute: async ({getState}) => {\n const currentMapId = getState().kepler.config.currentMapId;\n const sourceMap = getState().kepler.config.maps.find(\n (m) => m.id === currentMapId,\n );\n\n if (!sourceMap) {\n return {\n success: false,\n commandId: DUPLICATE_MAP_COMMAND_ID,\n message: 'Unable to duplicate map: current map not found',\n code: ERROR_CODES.MAP_NOT_FOUND,\n };\n }\n\n // Ensure the map's redux state is registered before attempting to duplicate\n getState().kepler.registerKeplerMapIfNotExists(currentMapId);\n // Re-read state after registration to avoid stale state\n const sourceMapState = getState().kepler.map[currentMapId];\n\n if (!sourceMapState) {\n return {\n success: false,\n commandId: DUPLICATE_MAP_COMMAND_ID,\n message: 'Unable to duplicate map: map state not initialized',\n code: ERROR_CODES.MAP_STATE_NOT_INITIALIZED,\n };\n }\n\n const duplicateResult =\n await getState().kepler.duplicateMap(currentMapId);\n if (!duplicateResult.success) {\n return {\n success: false,\n commandId: DUPLICATE_MAP_COMMAND_ID,\n message: duplicateResult.message,\n code: duplicateResult.code,\n };\n }\n\n return {\n success: true,\n commandId: DUPLICATE_MAP_COMMAND_ID,\n message: 'Duplicated map tab',\n };\n },\n },\n ];\n}\n\nexport type KeplerAction = {\n type: string;\n payload?: unknown;\n};\n\nexport function hasMapId(action: KeplerAction): action is KeplerAction & {\n payload: {meta: {_id_: string}};\n} {\n return (\n typeof action.payload === 'object' &&\n action.payload !== null &&\n 'meta' in action.payload &&\n typeof action.payload.meta === 'object' &&\n action.payload.meta !== null &&\n '_id_' in action.payload.meta\n );\n}\n\n// support multiple kepler maps\nexport type KeplerGlReduxState = {[id: string]: KeplerGlState};\nexport type KeplerSliceState = {\n kepler: {\n config: KeplerSliceConfig;\n map: KeplerGlReduxState;\n basicKeplerProps?: Partial<KeplerGLBasicProps>;\n forwardDispatch: {\n [mapId: string]: Dispatch;\n };\n initialize: () => Promise<void>;\n destroy: () => Promise<void>;\n setConfig: (config: KeplerSliceConfig) => void;\n /**\n * Update the datasets in all the kepler map so that they correspond to\n * the latest table schemas in the database\n */\n syncKeplerDatasets: () => Promise<void>;\n addLayer: (\n mapId: string,\n layer: ParsedLayer | MinSavedLayer | undefined,\n datasetId: string,\n ) => void;\n addFilter: (mapId: string, datasetId: string) => void;\n setFilter: (\n mapId: string,\n filterIdx: number,\n prop: string | string[],\n value: any,\n valueIndex?: number,\n ) => void;\n setFilterAnimationTime: (\n mapId: string,\n filterIdx: number,\n prop: string,\n value: any,\n ) => void;\n setFilterAnimationWindow: (\n mapId: string,\n filterId: string,\n animationWindow: string,\n ) => void;\n updateTooltipFields: (\n mapId: string,\n datasetId: string,\n fieldNames: string[],\n ) => void;\n addTableToMap: (\n mapId: string,\n tableName: string,\n options?: AddDataToMapPayload['options'],\n config?: AddDataToMapPayload['config'],\n ) => Promise<void>;\n addTileSetToMap: (\n mapId: string,\n tableName: string,\n tileset: {\n name: string;\n type: string;\n metadata: VectorTileDatasetMetadata;\n },\n tileMetadata: Record<string, any>,\n autoCreateLayers: boolean,\n ) => void;\n addConfigToMap: (mapId: string, config: KeplerMapSchema) => void;\n removeDatasetFromMaps: (datasetId: string) => void;\n dispatchAction: (mapId: string, action: KeplerAction) => void;\n setCurrentMapId: (mapId: string) => void;\n /**\n * Create a new map and return the map id\n * @param name - The name of the map\n * @returns The map id\n */\n createMap: (name?: string) => string;\n deleteMap: (mapId: string) => void;\n duplicateMap: (\n mapId: string,\n ) => Promise<{success: boolean; message?: string; code?: string}>;\n renameMap: (mapId: string, name: string) => void;\n closeMap: (mapId: string) => void;\n setOpenTabs: (tabIds: string[]) => void;\n getCurrentMap: () => KeplerMapSchema | undefined;\n registerKeplerMapIfNotExists: (mapId: string) => void;\n __reduxProviderStore: ReduxStore<KeplerGlReduxState, AnyAction> | undefined;\n };\n};\n\n// Auto save will be triggered in middleware on every kepler action\n// skip these actions to avoid unnecessary save\nconst SKIP_AUTO_SAVE_ACTIONS: string[] = [\n KeplerActionTypes.LAYER_HOVER,\n KeplerActionTypes.UPDATE_MAP,\n KeplerActionTypes.MOUSE_MOVE,\n];\n\nexport function createKeplerSlice({\n basicKeplerProps = {},\n config: initialConfigProps,\n createInitialMapKeplerState,\n actionLogging = false,\n middlewares: additionalMiddlewares = [],\n applicationConfig,\n onAction,\n}: CreateKeplerSliceOptions = {}): StateCreator<KeplerSliceState> {\n const initialConfig = createDefaultKeplerConfig(initialConfigProps);\n initApplicationConfig({\n table: DesktopKeplerTable,\n ...applicationConfig,\n });\n let syncKeplerPromise: Promise<void> | null = null;\n // When a caller arrives while a sync is already in-flight, the in-flight run\n // may have captured a stale snapshot of db.tables/kepler.map (missing maps or\n // tables added by createMap, duplicateMap, etc.). Setting this flag tells the\n // active run to loop once more with a fresh snapshot after it finishes, so\n // late mutations are never silently dropped.\n let pendingKeplerSync = false;\n const updateMapLastOpenedAt = (\n maps: KeplerSliceConfig['maps'],\n mapId: string,\n now: number = Date.now(),\n ) => {\n const map = maps.find((item) => item.id === mapId);\n if (map) {\n map.lastOpenedAt = now;\n }\n };\n return createSlice<\n KeplerSliceState,\n BaseRoomStoreState & KeplerSliceState & DbSliceState\n >((set, get, store) => {\n function resolveInitialMapKeplerState(\n context: Omit<\n CreateInitialMapKeplerStateContext,\n 'defaultInitialMapKeplerState'\n >,\n ): Partial<KeplerGlState> {\n const resolvedTheme = getTheme();\n const defaultInitialMapKeplerState =\n createDefaultMapKeplerState(resolvedTheme);\n return (\n createInitialMapKeplerState?.({\n ...context,\n defaultInitialMapKeplerState,\n }) ?? defaultInitialMapKeplerState\n );\n }\n\n function createKeplerReducer(\n context: Omit<\n CreateInitialMapKeplerStateContext,\n 'defaultInitialMapKeplerState'\n >,\n ) {\n return keplerGlReducer.initialState(\n resolveInitialMapKeplerState(context),\n );\n }\n\n const keplerReducer = createKeplerReducer({reason: 'initialize'});\n const middlewares: Middleware[] = [\n taskMiddleware,\n saveKeplerConfigMiddleware,\n ...additionalMiddlewares,\n ];\n\n if (actionLogging) {\n const logger = createLogger(\n actionLogging === true ? {collapsed: true} : actionLogging,\n ) as Middleware;\n middlewares.push(logger);\n }\n\n const storeDispatch: Dispatch<KeplerAction> = (action) => {\n set((state: KeplerSliceState) => ({\n ...state,\n kepler: {\n ...state.kepler,\n map: keplerReducer(state.kepler.map, action),\n },\n }));\n\n // Call onAction if it's defined\n const mapId = hasMapId(action) ? action.payload.meta._id_ : undefined;\n if (!mapId) throw new Error('Map ID not found in action payload');\n onAction?.(mapId, action);\n return action;\n };\n // const forwardDispatch: {[id: string]: Dispatch} = {};\n return {\n kepler: {\n config: initialConfig,\n basicKeplerProps,\n map: {},\n dispatchAction: () => {},\n __reduxProviderStore: undefined,\n forwardDispatch: {},\n\n setConfig: (config: KeplerSliceConfig) => {\n set((state) =>\n produce(state, (draft) => {\n draft.kepler.config = config;\n }),\n );\n updateMapReduxStates();\n updateForwardDispatch();\n get().kepler.syncKeplerDatasets();\n updateMapConfigs();\n },\n\n async initialize() {\n const config = get().kepler.config;\n const currentMapId = config.currentMapId;\n const keplerInitialState: KeplerGlReduxState = createKeplerReducer({\n reason: 'initialize',\n mapId: currentMapId,\n })(undefined, registerEntry({id: currentMapId}));\n set({\n kepler: {\n ...get().kepler,\n map: keplerInitialState,\n dispatchAction: (mid, action) => {\n // wrapDispatch(wrapTo(mapId)(action));\n const dispatchToMap = get().kepler.forwardDispatch[mid];\n if (dispatchToMap) {\n dispatchToMap(wrapTo(mid, action));\n } else {\n console.error('dispatchAction: mapId not found', mid);\n }\n },\n __reduxProviderStore: {\n dispatch: storeDispatch,\n getState: () => get().kepler.map || {},\n subscribe: () => () => {},\n replaceReducer: () => {},\n // @ts-expect-error - Symbol.observable is not defined in the Redux type definitions\n [Symbol.observable]: () => {},\n },\n },\n });\n updateForwardDispatch();\n await get().kepler.syncKeplerDatasets();\n updateMapConfigs();\n requestMapStyle(config.currentMapId);\n\n // Register Kepler commands\n const keplerCommands = createKeplerCommands();\n registerCommandsForOwner(store, KEPLER_COMMAND_OWNER, keplerCommands);\n },\n\n async destroy() {\n unregisterCommandsForOwner(store, KEPLER_COMMAND_OWNER);\n },\n\n addLayer: (mapId, layer, datasetId) => {\n get().kepler.registerKeplerMapIfNotExists(mapId);\n get().kepler.dispatchAction(mapId, addLayerAction(layer, datasetId));\n },\n\n addFilter: (mapId, datasetId) => {\n get().kepler.registerKeplerMapIfNotExists(mapId);\n get().kepler.dispatchAction(mapId, addFilterAction(datasetId));\n },\n\n setFilter: (mapId, filterIdx, prop, value, valueIndex) => {\n get().kepler.registerKeplerMapIfNotExists(mapId);\n get().kepler.dispatchAction(\n mapId,\n setFilterAction(filterIdx, prop, value, valueIndex),\n );\n },\n\n setFilterAnimationTime: (mapId, filterIdx, prop, value) => {\n get().kepler.registerKeplerMapIfNotExists(mapId);\n get().kepler.dispatchAction(\n mapId,\n setFilterAnimationTimeAction(filterIdx, prop, value),\n );\n },\n\n setFilterAnimationWindow: (mapId, filterId, animationWindow) => {\n get().kepler.registerKeplerMapIfNotExists(mapId);\n get().kepler.dispatchAction(\n mapId,\n setFilterAnimationWindowAction({id: filterId, animationWindow}),\n );\n },\n\n updateTooltipFields: (mapId, datasetId, fieldNames) => {\n get().kepler.registerKeplerMapIfNotExists(mapId);\n const mapState = get().kepler.map[mapId];\n const tooltipConfig = mapState?.visState?.interactionConfig?.tooltip;\n if (!tooltipConfig) return;\n const currentFieldsToShow = tooltipConfig.config?.fieldsToShow || {};\n const existingFields = currentFieldsToShow[datasetId] || [];\n const existingByName = new Map(\n existingFields.map(\n (field: {name: string; format: string | null}) => [\n field.name,\n field,\n ],\n ),\n );\n const nextFields = Array.from(new Set(fieldNames)).map(\n (name) => existingByName.get(name) ?? {name, format: null},\n );\n if (\n nextFields.length === existingFields.length &&\n nextFields.every(\n (field, index) =>\n field.name === existingFields[index]?.name &&\n field.format === existingFields[index]?.format,\n )\n ) {\n return;\n }\n get().kepler.dispatchAction(\n mapId,\n interactionConfigChange({\n ...tooltipConfig,\n config: {\n ...tooltipConfig.config,\n fieldsToShow: {\n ...currentFieldsToShow,\n [datasetId]: nextFields,\n },\n },\n }),\n );\n },\n\n addTableToMap: async (mapId, tableName, options = {}, config = {}) => {\n const connector = await get().db.getConnector();\n const duckDbColumns = await getDuckDBColumnTypes(\n {\n query: (query: string) => connector.query(query).result,\n } as DatabaseConnection,\n tableName,\n );\n const tableDuckDBTypes = getDuckDBColumnTypesMap(duckDbColumns);\n const adjustedQuery = castDuckDBTypesForKepler(\n tableName,\n duckDbColumns,\n );\n const arrowResult = await connector.query(adjustedQuery).result;\n setGeoArrowWKBExtension(arrowResult, duckDbColumns);\n // TODO remove once DuckDB doesn't drop geoarrow metadata\n restoreGeoarrowMetadata(arrowResult, {});\n const fields = arrowSchemaToFields(arrowResult, tableDuckDBTypes);\n const cols = Array.from({length: arrowResult.numCols}, (_, i) =>\n arrowResult.getChildAt(i),\n ).filter((col) => col) as arrow.Vector[];\n\n if (fields && cols) {\n const datasets: AddDataToMapPayload['datasets'] = {\n data: {fields, cols, rows: [], arrowTable: arrowResult},\n info: {label: tableName, id: tableName},\n metadata: {tableName},\n };\n get().kepler.dispatchAction(\n mapId,\n addDataToMap({datasets, options, config}),\n );\n }\n },\n\n getCurrentMap: () => {\n return get().kepler.config.maps.find(\n (map) => map.id === get().kepler.config.currentMapId,\n );\n },\n\n setCurrentMapId: (mapId) => {\n return set((state) =>\n produce(state, (draft) => {\n const now = Date.now();\n draft.kepler.config.currentMapId = mapId;\n updateMapLastOpenedAt(draft.kepler.config.maps, mapId, now);\n }),\n );\n },\n\n createMap: (name) => {\n const mapId = createId();\n const now = Date.now();\n\n set((state) =>\n produce(state, (draft) => {\n draft.kepler.config.maps.push({\n id: mapId,\n name: name ?? 'Untitled Map',\n lastOpenedAt: now,\n });\n draft.kepler.config.openTabs.push(mapId);\n draft.kepler.map = createKeplerReducer({\n reason: 'create-map',\n mapId,\n name,\n })(draft.kepler.map, registerEntry({id: mapId}));\n draft.kepler.forwardDispatch[mapId] = getForwardDispatch(mapId);\n }),\n );\n requestMapStyle(mapId);\n get().kepler.syncKeplerDatasets();\n return mapId;\n },\n\n async syncKeplerDatasets() {\n if (syncKeplerPromise) {\n pendingKeplerSync = true;\n return syncKeplerPromise;\n }\n syncKeplerPromise = (async () => {\n // Loop until no new sync was requested during the current pass.\n // Each iteration reads a fresh snapshot of db.tables and kepler.map,\n // so tables/maps added concurrently are picked up on the next pass.\n do {\n pendingKeplerSync = false;\n for (const mapId of Object.keys(get().kepler.map)) {\n const mapState = get().kepler.map[mapId];\n if (!mapState) continue;\n const keplerDatasets = mapState.visState.datasets;\n\n // Only sync tables that are referenced by existing layers or filters\n const referencedDataIds = new Set<string>();\n for (const layer of mapState.visState.layers ?? []) {\n if (layer.config.dataId) {\n referencedDataIds.add(layer.config.dataId);\n }\n }\n for (const filter of mapState.visState.filters ?? []) {\n for (const dataId of filter.dataId ?? []) {\n referencedDataIds.add(dataId);\n }\n }\n\n const availableTables = new Set(\n get()\n .db.tables.filter((t) => t.table.schema === 'main')\n .map((t) => t.table.table),\n );\n\n for (const dataId of referencedDataIds) {\n if (\n !keplerDatasets?.[dataId] &&\n availableTables.has(dataId)\n ) {\n await get().kepler.addTableToMap(mapId, dataId, {\n autoCreateLayers: false,\n centerMap: false,\n });\n }\n }\n }\n } while (pendingKeplerSync);\n })();\n try {\n await syncKeplerPromise;\n } finally {\n syncKeplerPromise = null;\n }\n },\n\n deleteMap: (mapId) => {\n set((state) =>\n produce(state, (draft) => {\n const openTabs = draft.kepler.config.openTabs;\n const maps = draft.kepler.config.maps;\n const wasCurrentMap = draft.kepler.config.currentMapId === mapId;\n const deletingIndex = openTabs.indexOf(mapId);\n\n // Remove from maps and openTabs\n draft.kepler.config.maps = maps.filter((map) => map.id !== mapId);\n draft.kepler.config.openTabs = openTabs.filter(\n (id) => id !== mapId,\n );\n\n // If we deleted the current map, select another one\n if (wasCurrentMap) {\n const newOpenTabs = draft.kepler.config.openTabs;\n const remainingMaps = draft.kepler.config.maps;\n\n if (newOpenTabs.length > 0) {\n // Select from remaining open tabs\n const newIndex =\n deletingIndex === 0\n ? 0\n : Math.min(deletingIndex - 1, newOpenTabs.length - 1);\n const newSelectedId = newOpenTabs[newIndex];\n if (newSelectedId) {\n draft.kepler.config.currentMapId = newSelectedId;\n updateMapLastOpenedAt(\n draft.kepler.config.maps,\n newSelectedId,\n Date.now(),\n );\n }\n } else if (remainingMaps.length > 0) {\n // No open tabs left, open a closed map\n const mapToOpen = remainingMaps[0];\n if (mapToOpen) {\n draft.kepler.config.openTabs.push(mapToOpen.id);\n draft.kepler.config.currentMapId = mapToOpen.id;\n updateMapLastOpenedAt(\n draft.kepler.config.maps,\n mapToOpen.id,\n Date.now(),\n );\n }\n }\n }\n\n draft.kepler.map = keplerReducer(\n draft.kepler.map,\n deleteEntry(mapId),\n );\n\n delete draft.kepler.forwardDispatch[mapId];\n }),\n );\n },\n\n duplicateMap: async (mapId) => {\n // Ensure the map's redux state is registered, consistent with other kepler actions\n get().kepler.registerKeplerMapIfNotExists(mapId);\n\n const sourceMap = get().kepler.config.maps.find(\n (m) => m.id === mapId,\n );\n const sourceMapState = get().kepler.map[mapId];\n if (!sourceMap || !sourceMapState) {\n return {\n success: false,\n message: 'Unable to duplicate map: source map or state not found',\n code: 'source-map-not-found',\n };\n }\n\n const newMapId = createId();\n const now = Date.now();\n\n // Save the source map state using Kepler's schema manager\n const savedConfig =\n KeplerGLSchemaManager.getConfigToSave(sourceMapState);\n\n set((state) =>\n produce(state, (draft) => {\n draft.kepler.config.maps.push({\n id: newMapId,\n name: `Copy of ${sourceMap.name}`,\n config: savedConfig as any,\n lastOpenedAt: now,\n });\n draft.kepler.config.openTabs.push(newMapId);\n draft.kepler.config.currentMapId = newMapId;\n // Register the new map with empty state, then load the config\n draft.kepler.map = createKeplerReducer({\n reason: 'duplicate-map',\n mapId: newMapId,\n name: `Copy of ${sourceMap.name}`,\n })(draft.kepler.map, registerEntry({id: newMapId}));\n draft.kepler.forwardDispatch[newMapId] =\n getForwardDispatch(newMapId);\n }),\n );\n\n // Load the saved config into the new map\n get().kepler.addConfigToMap(newMapId, savedConfig as any);\n requestMapStyle(newMapId);\n get().kepler.syncKeplerDatasets();\n\n return {\n success: true,\n message: 'Map duplicated successfully',\n };\n },\n\n renameMap: (mapId, name) => {\n set((state) =>\n produce(state, (draft) => {\n const map = draft.kepler.config.maps.find(\n (map) => map.id === mapId,\n );\n if (map) {\n map.name = name;\n }\n }),\n );\n },\n\n closeMap: (mapId) => {\n set((state) =>\n produce(state, (draft) => {\n const openTabs = draft.kepler.config.openTabs;\n\n // Don't close if it's the last open tab (defensive check, TabStrip also prevents this)\n if (openTabs.length <= 1) return;\n\n // Just remove from openTabs - TabStrip handles selection via onSelect before calling onClose\n draft.kepler.config.openTabs = openTabs.filter(\n (id) => id !== mapId,\n );\n }),\n );\n },\n\n setOpenTabs: (tabIds) => {\n set((state) =>\n produce(state, (draft) => {\n draft.kepler.config.openTabs = tabIds;\n }),\n );\n },\n\n addDataToMap: (mapId: string, data: any) => {\n get().kepler.registerKeplerMapIfNotExists(mapId);\n get().kepler.dispatchAction(mapId, addDataToMap(data));\n },\n\n addTileSetToMap: (\n mapId,\n tableName,\n tileset,\n tileMetadata,\n autoCreateLayers = true,\n ) => {\n get().kepler.registerKeplerMapIfNotExists(mapId);\n const dataset = {\n info: {\n label: tileset.name,\n type: tileset.type,\n format: 'rows',\n // important for kepler to reload this tileset\n id: tableName,\n },\n data: {\n fields: tileMetadata?.fields || [],\n rows: [],\n },\n metadata: {\n // duckdb table name\n tableName,\n ...tileMetadata,\n ...tileset.metadata,\n },\n // vector tile layer only supports gpu filtering for now\n supportedFilterTypes: [\n ALL_FIELD_TYPES.real,\n ALL_FIELD_TYPES.integer,\n ],\n disableDataOperation: true,\n };\n get().kepler.dispatchAction(\n mapId,\n addDataToMap({\n datasets: dataset,\n options: {\n autoCreateLayers,\n centerMap: true,\n },\n }),\n );\n },\n\n addConfigToMap: (mapId: string, config: any) => {\n // if map not registered, register it\n get().kepler.registerKeplerMapIfNotExists(mapId);\n const parsedConfig = KeplerGLSchemaManager.parseSavedConfig(config);\n if (!parsedConfig) {\n throw new Error('Failed to parse config');\n }\n get().kepler.dispatchAction(\n mapId,\n addDataToMap({config: parsedConfig, datasets: []}),\n );\n },\n\n registerKeplerMapIfNotExists(mapId: string) {\n if (!get().kepler.map[mapId]) {\n set({\n kepler: {\n ...get().kepler,\n map: createKeplerReducer({\n reason: 'register-map',\n mapId,\n })(get().kepler.map, registerEntry({id: mapId})),\n forwardDispatch: {\n ...get().kepler.forwardDispatch,\n [mapId]: getForwardDispatch(mapId),\n },\n },\n });\n requestMapStyle(mapId);\n }\n },\n\n removeDatasetFromMaps: (datasetId: string) => {\n for (const mapId of Object.keys(get().kepler.map)) {\n const map = get().kepler.map[mapId];\n if (map) {\n get().kepler.dispatchAction(mapId, removeDataset(datasetId));\n }\n }\n },\n },\n };\n\n function requestMapStyle(mapId: string) {\n const {mapStyle} = get().kepler.map[mapId] || {};\n const style = mapStyle?.mapStyles[mapStyle.styleType];\n if (style) {\n get().kepler.dispatchAction(\n mapId,\n requestMapStyles({[style.id]: style}),\n );\n }\n }\n\n function saveKeplerConfigMiddleware() {\n return (next: (action: KeplerAction) => void) =>\n (action: KeplerAction) => {\n // get id from kepler action payload meta\n const mapId = hasMapId(action) ? action.payload.meta._id_ : undefined;\n if (!mapId) throw new Error('Map ID not found in action payload');\n const result = next(action);\n if (!SKIP_AUTO_SAVE_ACTIONS.includes(action.type) && mapId) {\n // save kepler config to store\n set((state) =>\n produce(state, (draft) => {\n const mapToSave = draft.kepler.config.maps.find(\n (map) => map.id === mapId,\n );\n if (mapToSave && state.kepler.map?.[mapId]) {\n mapToSave.config = KeplerGLSchemaManager.getConfigToSave(\n state.kepler.map[mapId],\n ) as any;\n }\n }),\n );\n }\n // save kepler config to local storage\n return result;\n };\n }\n\n function updateMapConfigs() {\n const config = get().kepler.config;\n const keplerMaps = config.maps;\n for (const {id, config} of keplerMaps) {\n if (config) {\n get().kepler.addConfigToMap(id, config as unknown as KeplerMapSchema);\n }\n }\n }\n\n function updateMapReduxStates() {\n set((state) =>\n produce(state, (draft) => {\n // Delete redux state of maps that are not in the config\n for (const mapId of Object.keys(draft.kepler.map)) {\n if (!draft.kepler.config.maps.some((map) => map.id === mapId)) {\n draft.kepler.map = keplerReducer(\n draft.kepler.map,\n deleteEntry(mapId),\n );\n }\n }\n // Register redux state of maps that are not in the config\n for (const map of draft.kepler.config.maps) {\n if (!draft.kepler.map[map.id]) {\n draft.kepler.map = createKeplerReducer({\n reason: 'sync-config',\n mapId: map.id,\n name: map.name,\n })(draft.kepler.map, registerEntry({id: map.id}));\n draft.kepler.forwardDispatch[map.id] = getForwardDispatch(map.id);\n }\n }\n }),\n );\n }\n\n function updateForwardDispatch() {\n const config = get().kepler.config;\n const currentMapId = config.currentMapId;\n const forwardDispatch = {\n [currentMapId]: getForwardDispatch(currentMapId),\n };\n if (config) {\n for (const {id} of config.maps) {\n forwardDispatch[id] = getForwardDispatch(id);\n }\n }\n set((state) =>\n produce(state, (draft) => {\n draft.kepler.forwardDispatch = forwardDispatch;\n }),\n );\n }\n\n function getForwardDispatch(mapId: string): Dispatch<KeplerAction> {\n /** Adapted from applyMiddleware in redux */\n let wrapDispatch: (\n action: KeplerAction,\n ...args: any\n ) => KeplerAction = () => {\n throw new Error(\n 'Dispatching while constructing your middleware is not allowed. ' +\n 'Other middleware would not be applied to this dispatch.',\n );\n };\n const wrapToMap = wrapTo(mapId);\n const middlewareAPI: MiddlewareAPI<any, any> = {\n getState: get,\n dispatch: (action: Action, ...args: any) => {\n // need to forward here as well\n return wrapDispatch(wrapToMap(action), ...args);\n },\n };\n\n const chain = middlewares.map((middleware) => middleware(middlewareAPI));\n wrapDispatch = compose<Dispatch>(...chain)(storeDispatch);\n return wrapDispatch as Dispatch<KeplerAction>;\n }\n });\n}\n\ntype RoomStateWithDiscuss = RoomShellSliceState & KeplerSliceState;\n\nexport function useStoreWithKepler<T>(\n selector: (state: RoomStateWithDiscuss) => T,\n): T {\n return useBaseRoomShellStore<RoomStateWithDiscuss, T>((state) =>\n selector(state as RoomStateWithDiscuss),\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomFilterManager.d.ts","sourceRoot":"","sources":["../../src/components/CustomFilterManager.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6B,MAAM,OAAO,CAAC;AA6ClD,KAAK,wBAAwB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;
|
|
1
|
+
{"version":3,"file":"CustomFilterManager.d.ts","sourceRoot":"","sources":["../../src/components/CustomFilterManager.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6B,MAAM,OAAO,CAAC;AA6ClD,KAAK,wBAAwB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AAiHF,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CA2DlE,CAAC"}
|
|
@@ -53,7 +53,10 @@ const FilterList = ({ filtersByIndex, filters, datasets, layers, isAnyFilterAnim
|
|
|
53
53
|
toggleFilterAnimation,
|
|
54
54
|
toggleFilterFeature,
|
|
55
55
|
]);
|
|
56
|
-
return (_jsx(_Fragment, { children: [...filtersByIndex].reverse().map(({ filter, idx }) =>
|
|
56
|
+
return (_jsx(_Fragment, { children: [...filtersByIndex].reverse().map(({ filter, idx }) => {
|
|
57
|
+
const callbacks = filterPanelProps[filter.id];
|
|
58
|
+
return (_jsx(FilterPanel, { idx: idx, filters: filters, filter: filter, datasets: datasets, layers: layers, isAnyFilterAnimating: isAnyFilterAnimating, ...keplerActions.visStateActions, removeFilter: () => callbacks?.removeFilter?.(), enlargeFilter: () => callbacks?.setFilterView?.(''), toggleAnimation: () => callbacks?.toggleAnimation?.(), toggleFilterFeature: () => callbacks?.toggleFilterFeature?.() }, `${filter.id}-${idx}`));
|
|
59
|
+
}) }));
|
|
57
60
|
};
|
|
58
61
|
// Custom hook for filter actions
|
|
59
62
|
function useCustomFilterActions(keplerActions) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomFilterManager.js","sourceRoot":"","sources":["../../src/components/CustomFilterManager.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, {useCallback, useMemo} from 'react';\nimport {useIntl} from 'react-intl';\nimport styled from 'styled-components';\n\nimport {\n FilterPanelFactory,\n PanelTitleFactory,\n AddFilterButtonFactory,\n SidePanelSection,\n} from '@kepler.gl/components';\nimport {FILTER_VIEW_TYPES, SIDEBAR_PANELS} from '@kepler.gl/constants';\nimport {Filter} from '@kepler.gl/types';\nimport {Layer} from '@kepler.gl/layers';\nimport {isSideFilter} from '@kepler.gl/utils';\nimport {Datasets} from '@kepler.gl/table';\n\nimport {getKeplerFactory} from './KeplerInjector';\nimport {\n KeplerActions,\n useKeplerStateActions,\n} from '../hooks/useKeplerStateActions';\n\nconst filterPanelMetadata = SIDEBAR_PANELS.find((p) => p.id === 'filter');\n\n// Custom styled components for your filter manager\nconst CustomFilterManagerContainer = styled.div`\n .filter-manager {\n /* Add your custom styles here */\n }\n\n .filter-manager-title {\n /* Custom title styling */\n }\n\n .add-filter-button {\n background-color: ${(props) =>\n props.theme.sidePanelBg || props.theme.panelBackground};\n color: #2563eb;\n border: 0px;\n height: 28px;\n font-weight: 500;\n font-size: 14px;\n }\n`;\n\ntype CustomFilterManagerProps = {\n mapId: string;\n showDeleteDataset?: boolean;\n};\n\ntype FilterListProps = {\n filters: Filter[];\n datasets: Datasets;\n layers: Layer[];\n filtersByIndex: {\n filter: Filter;\n idx: number;\n }[];\n isAnyFilterAnimating: boolean;\n keplerActions: KeplerActions;\n};\n\n// Based on Kepler.gl's filterPanelCallbacks pattern\ntype FilterPanelCallbacks = Record<\n string,\n {\n removeFilter: () => void;\n setFilterView: (_view: string) => void;\n toggleAnimation: () => void;\n toggleFilterFeature: () => void;\n }\n>;\n\n// Get the kepler.gl components through the injector\nconst FilterPanel = getKeplerFactory(FilterPanelFactory);\nconst PanelTitle = getKeplerFactory(PanelTitleFactory);\nconst AddFilterButton = getKeplerFactory(AddFilterButtonFactory);\n\n// Filter List Component\nconst FilterList: React.FC<FilterListProps> = ({\n filtersByIndex,\n filters,\n datasets,\n layers,\n isAnyFilterAnimating,\n keplerActions,\n}) => {\n const {\n removeFilter,\n setFilterView,\n toggleFilterAnimation,\n toggleFilterFeature,\n } = keplerActions.visStateActions;\n\n const filterPanelProps = useMemo(() => {\n return filtersByIndex.reduce(\n (accu, {filter, idx}) => ({\n ...accu,\n [filter.id]: {\n removeFilter: () => removeFilter(idx),\n setFilterView: (_view: string) =>\n setFilterView(\n idx,\n isSideFilter(filter)\n ? FILTER_VIEW_TYPES.enlarged\n : FILTER_VIEW_TYPES.side,\n ),\n toggleAnimation: () => toggleFilterAnimation(idx),\n toggleFilterFeature: () => toggleFilterFeature(idx),\n },\n }),\n {} as FilterPanelCallbacks,\n );\n }, [\n filtersByIndex,\n removeFilter,\n setFilterView,\n toggleFilterAnimation,\n toggleFilterFeature,\n ]);\n\n return (\n <>\n {[...filtersByIndex].reverse().map(({filter, idx}) => (\n <FilterPanel\n key={`${filter.id}-${idx}`}\n idx={idx}\n filters={filters}\n filter={filter}\n datasets={datasets}\n layers={layers}\n isAnyFilterAnimating={isAnyFilterAnimating}\n removeFilter={filterPanelProps[filter.id]?.removeFilter}\n setFilterView={filterPanelProps[filter.id]?.setFilterView}\n toggleAnimation={filterPanelProps[filter.id]?.toggleAnimation}\n toggleFilterFeature={filterPanelProps[filter.id]?.toggleFilterFeature}\n {...keplerActions.visStateActions}\n />\n ))}\n </>\n );\n};\n\n// Custom hook for filter actions\nfunction useCustomFilterActions(keplerActions: KeplerActions) {\n const {addFilter} = keplerActions.visStateActions;\n\n const onClickAddFilter = useCallback(\n (dataset: string) => addFilter(dataset),\n [addFilter],\n );\n\n return {\n onClickAddFilter,\n };\n}\n\n// Main Custom Filter Manager Component\nexport const CustomFilterManager: React.FC<CustomFilterManagerProps> = ({\n mapId,\n}) => {\n const {keplerActions, keplerState} = useKeplerStateActions({mapId});\n const intl = useIntl();\n\n const {onClickAddFilter} = useCustomFilterActions(keplerActions);\n\n const visState = keplerState?.visState;\n const filters = useMemo(() => visState?.filters ?? [], [visState?.filters]);\n const datasets = useMemo(\n () => (visState?.datasets ?? []) as Datasets,\n [visState?.datasets],\n );\n const layers = useMemo(() => visState?.layers ?? [], [visState?.layers]);\n const filtersByIndex = useMemo(\n () =>\n filters?.map((f, idx) => ({\n filter: f,\n idx,\n })) ?? [],\n [filters],\n );\n\n if (!keplerState || !keplerActions) {\n return null;\n }\n\n const isAnyFilterAnimating = Object.values(filters).some(\n (f) => f.isAnimating,\n );\n\n return (\n <CustomFilterManagerContainer>\n <div className=\"filter-manager\">\n <SidePanelSection>\n <PanelTitle\n className=\"filter-manager-title\"\n title={intl.formatMessage({\n id: filterPanelMetadata?.label || 'Filters',\n })}\n >\n <AddFilterButton datasets={datasets} onAdd={onClickAddFilter} />\n </PanelTitle>\n </SidePanelSection>\n\n <SidePanelSection>\n <FilterList\n filtersByIndex={filtersByIndex}\n filters={filters}\n datasets={datasets}\n layers={layers}\n isAnyFilterAnimating={isAnyFilterAnimating}\n keplerActions={keplerActions}\n />\n </SidePanelSection>\n </div>\n </CustomFilterManagerContainer>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"CustomFilterManager.js","sourceRoot":"","sources":["../../src/components/CustomFilterManager.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, {useCallback, useMemo} from 'react';\nimport {useIntl} from 'react-intl';\nimport styled from 'styled-components';\n\nimport {\n FilterPanelFactory,\n PanelTitleFactory,\n AddFilterButtonFactory,\n SidePanelSection,\n} from '@kepler.gl/components';\nimport {FILTER_VIEW_TYPES, SIDEBAR_PANELS} from '@kepler.gl/constants';\nimport {Filter} from '@kepler.gl/types';\nimport {Layer} from '@kepler.gl/layers';\nimport {isSideFilter} from '@kepler.gl/utils';\nimport {Datasets} from '@kepler.gl/table';\n\nimport {getKeplerFactory} from './KeplerInjector';\nimport {\n KeplerActions,\n useKeplerStateActions,\n} from '../hooks/useKeplerStateActions';\n\nconst filterPanelMetadata = SIDEBAR_PANELS.find((p) => p.id === 'filter');\n\n// Custom styled components for your filter manager\nconst CustomFilterManagerContainer = styled.div`\n .filter-manager {\n /* Add your custom styles here */\n }\n\n .filter-manager-title {\n /* Custom title styling */\n }\n\n .add-filter-button {\n background-color: ${(props) =>\n props.theme.sidePanelBg || props.theme.panelBackground};\n color: #2563eb;\n border: 0px;\n height: 28px;\n font-weight: 500;\n font-size: 14px;\n }\n`;\n\ntype CustomFilterManagerProps = {\n mapId: string;\n showDeleteDataset?: boolean;\n};\n\ntype FilterListProps = {\n filters: Filter[];\n datasets: Datasets;\n layers: Layer[];\n filtersByIndex: {\n filter: Filter;\n idx: number;\n }[];\n isAnyFilterAnimating: boolean;\n keplerActions: KeplerActions;\n};\n\n// Based on Kepler.gl's filterPanelCallbacks pattern\ntype FilterPanelCallbacks = Record<\n string,\n {\n removeFilter: () => void;\n setFilterView: (_view: string) => void;\n toggleAnimation: () => void;\n toggleFilterFeature: () => void;\n }\n>;\n\n// Get the kepler.gl components through the injector\nconst FilterPanel = getKeplerFactory(FilterPanelFactory);\nconst PanelTitle = getKeplerFactory(PanelTitleFactory);\nconst AddFilterButton = getKeplerFactory(AddFilterButtonFactory);\n\n// Filter List Component\nconst FilterList: React.FC<FilterListProps> = ({\n filtersByIndex,\n filters,\n datasets,\n layers,\n isAnyFilterAnimating,\n keplerActions,\n}) => {\n const {\n removeFilter,\n setFilterView,\n toggleFilterAnimation,\n toggleFilterFeature,\n } = keplerActions.visStateActions;\n\n const filterPanelProps = useMemo(() => {\n return filtersByIndex.reduce(\n (accu, {filter, idx}) => ({\n ...accu,\n [filter.id]: {\n removeFilter: () => removeFilter(idx),\n setFilterView: (_view: string) =>\n setFilterView(\n idx,\n isSideFilter(filter)\n ? FILTER_VIEW_TYPES.enlarged\n : FILTER_VIEW_TYPES.side,\n ),\n toggleAnimation: () => toggleFilterAnimation(idx),\n toggleFilterFeature: () => toggleFilterFeature(idx),\n },\n }),\n {} as FilterPanelCallbacks,\n );\n }, [\n filtersByIndex,\n removeFilter,\n setFilterView,\n toggleFilterAnimation,\n toggleFilterFeature,\n ]);\n\n return (\n <>\n {[...filtersByIndex].reverse().map(({filter, idx}) => {\n const callbacks = filterPanelProps[filter.id];\n return (\n <FilterPanel\n key={`${filter.id}-${idx}`}\n idx={idx}\n filters={filters}\n filter={filter}\n datasets={datasets}\n layers={layers}\n isAnyFilterAnimating={isAnyFilterAnimating}\n {...keplerActions.visStateActions}\n removeFilter={() => callbacks?.removeFilter?.()}\n enlargeFilter={() => callbacks?.setFilterView?.('')}\n toggleAnimation={() => callbacks?.toggleAnimation?.()}\n toggleFilterFeature={() => callbacks?.toggleFilterFeature?.()}\n />\n );\n })}\n </>\n );\n};\n\n// Custom hook for filter actions\nfunction useCustomFilterActions(keplerActions: KeplerActions) {\n const {addFilter} = keplerActions.visStateActions;\n\n const onClickAddFilter = useCallback(\n (dataset: string) => addFilter(dataset),\n [addFilter],\n );\n\n return {\n onClickAddFilter,\n };\n}\n\n// Main Custom Filter Manager Component\nexport const CustomFilterManager: React.FC<CustomFilterManagerProps> = ({\n mapId,\n}) => {\n const {keplerActions, keplerState} = useKeplerStateActions({mapId});\n const intl = useIntl();\n\n const {onClickAddFilter} = useCustomFilterActions(keplerActions);\n\n const visState = keplerState?.visState;\n const filters = useMemo(() => visState?.filters ?? [], [visState?.filters]);\n const datasets = useMemo(\n () => (visState?.datasets ?? []) as Datasets,\n [visState?.datasets],\n );\n const layers = useMemo(() => visState?.layers ?? [], [visState?.layers]);\n const filtersByIndex = useMemo(\n () =>\n filters?.map((f, idx) => ({\n filter: f,\n idx,\n })) ?? [],\n [filters],\n );\n\n if (!keplerState || !keplerActions) {\n return null;\n }\n\n const isAnyFilterAnimating = Object.values(filters).some(\n (f) => f.isAnimating,\n );\n\n return (\n <CustomFilterManagerContainer>\n <div className=\"filter-manager\">\n <SidePanelSection>\n <PanelTitle\n className=\"filter-manager-title\"\n title={intl.formatMessage({\n id: filterPanelMetadata?.label || 'Filters',\n })}\n >\n <AddFilterButton datasets={datasets} onAdd={onClickAddFilter} />\n </PanelTitle>\n </SidePanelSection>\n\n <SidePanelSection>\n <FilterList\n filtersByIndex={filtersByIndex}\n filters={filters}\n datasets={datasets}\n layers={layers}\n isAnyFilterAnimating={isAnyFilterAnimating}\n keplerActions={keplerActions}\n />\n </SidePanelSection>\n </div>\n </CustomFilterManagerContainer>\n );\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomInteractionManager.d.ts","sourceRoot":"","sources":["../../src/components/CustomInteractionManager.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6B,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"CustomInteractionManager.d.ts","sourceRoot":"","sources":["../../src/components/CustomInteractionManager.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6B,MAAM,OAAO,CAAC;AAqGlD,eAAO,MAAM,wBAAwB,EAAE,KAAK,CAAC,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CA6E9D,CAAC"}
|
|
@@ -16,9 +16,12 @@ const TooltipPanel = ({ tooltipConfig, coordinateConfig, datasets, isDark, handl
|
|
|
16
16
|
const handleTooltipConfigChange = useCallback((newConfig) => {
|
|
17
17
|
handleConfigChange('tooltip', { config: newConfig });
|
|
18
18
|
}, [handleConfigChange]);
|
|
19
|
+
const handleDisplayFormatChange = useCallback((dataId, column, displayFormat) => {
|
|
20
|
+
setColumnDisplayFormat(dataId, { [column]: displayFormat });
|
|
21
|
+
}, [setColumnDisplayFormat]);
|
|
19
22
|
if (!tooltipConfig)
|
|
20
23
|
return null;
|
|
21
|
-
return (_jsxs("div", { children: [_jsx(SimpleInteractionPanel, { configId: "tooltip", config: tooltipConfig, label: "Tooltip", onConfigChange: handleConfigChange }), tooltipConfig.enabled && (_jsxs("div", { className: "pr-2 pl-4", children: [_jsxs("div", { className: "flex items-center space-x-2 py-2", children: [_jsx(Checkbox, { checked: coordinateConfig?.enabled || false, onCheckedChange: handleCoordinateToggle, className: "shadow-none" }), _jsxs("span", { className: "text-muted-foreground text-xs", children: ["Show ", _jsx(FormattedMessage, { id: "interactions.coordinate" })] })] }), _jsx(CustomTooltipConfig, { datasets: datasets, config: tooltipConfig.config, onChange: handleTooltipConfigChange, onDisplayFormatChange:
|
|
24
|
+
return (_jsxs("div", { children: [_jsx(SimpleInteractionPanel, { configId: "tooltip", config: tooltipConfig, label: "Tooltip", onConfigChange: handleConfigChange }), tooltipConfig.enabled && (_jsxs("div", { className: "pr-2 pl-4", children: [_jsxs("div", { className: "flex items-center space-x-2 py-2", children: [_jsx(Checkbox, { checked: coordinateConfig?.enabled || false, onCheckedChange: handleCoordinateToggle, className: "shadow-none" }), _jsxs("span", { className: "text-muted-foreground text-xs", children: ["Show ", _jsx(FormattedMessage, { id: "interactions.coordinate" })] })] }), _jsx(CustomTooltipConfig, { datasets: datasets, config: tooltipConfig.config, onChange: handleTooltipConfigChange, onDisplayFormatChange: handleDisplayFormatChange, isDark: isDark })] }))] }));
|
|
22
25
|
};
|
|
23
26
|
export const CustomInteractionManager = ({ mapId, }) => {
|
|
24
27
|
const { keplerActions, keplerState } = useKeplerStateActions({ mapId });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomInteractionManager.js","sourceRoot":"","sources":["../../src/components/CustomInteractionManager.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAC,WAAW,EAAE,OAAO,EAAC,MAAM,OAAO,CAAC;AAClD,OAAO,EAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAC,MAAM,cAAc,CAAC;AAGxD,OAAO,EAAC,gBAAgB,EAAC,MAAM,yBAAyB,CAAC;AAEzD,OAAO,EAAC,qBAAqB,EAAC,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAC;AAE1D,MAAM,sBAAsB,GAKvB,CAAC,EAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAC,EAAE,EAAE;IACjD,MAAM,kBAAkB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC1C,cAAc,CAAC,QAAQ,EAAE;YACvB,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO;SACzB,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;IAE/C,OAAO,CACL,eAAK,SAAS,EAAC,uCAAuC,aACpD,cAAK,SAAS,EAAC,2CAA2C,YAAE,KAAK,GAAO,EACxE,KAAC,MAAM,IACL,OAAO,EAAE,MAAM,CAAC,OAAO,EACvB,eAAe,EAAE,kBAAkB,EACnC,SAAS,EAAC,qEAAqE,GAC/E,IACE,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"CustomInteractionManager.js","sourceRoot":"","sources":["../../src/components/CustomInteractionManager.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAC,WAAW,EAAE,OAAO,EAAC,MAAM,OAAO,CAAC;AAClD,OAAO,EAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAC,MAAM,cAAc,CAAC;AAGxD,OAAO,EAAC,gBAAgB,EAAC,MAAM,yBAAyB,CAAC;AAEzD,OAAO,EAAC,qBAAqB,EAAC,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAC;AAE1D,MAAM,sBAAsB,GAKvB,CAAC,EAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAC,EAAE,EAAE;IACjD,MAAM,kBAAkB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC1C,cAAc,CAAC,QAAQ,EAAE;YACvB,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO;SACzB,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;IAE/C,OAAO,CACL,eAAK,SAAS,EAAC,uCAAuC,aACpD,cAAK,SAAS,EAAC,2CAA2C,YAAE,KAAK,GAAO,EACxE,KAAC,MAAM,IACL,OAAO,EAAE,MAAM,CAAC,OAAO,EACvB,eAAe,EAAE,kBAAkB,EACnC,SAAS,EAAC,qEAAqE,GAC/E,IACE,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,YAAY,GAWb,CAAC,EACJ,aAAa,EACb,gBAAgB,EAChB,QAAQ,EACR,MAAM,EACN,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,GACvB,EAAE,EAAE;IACH,MAAM,yBAAyB,GAAG,WAAW,CAC3C,CAAC,SAAc,EAAE,EAAE;QACjB,kBAAkB,CAAC,SAAS,EAAE,EAAC,MAAM,EAAE,SAAS,EAAC,CAAC,CAAC;IACrD,CAAC,EACD,CAAC,kBAAkB,CAAC,CACrB,CAAC;IAEF,MAAM,yBAAyB,GAAG,WAAW,CAC3C,CAAC,MAAc,EAAE,MAAc,EAAE,aAAqB,EAAE,EAAE;QACxD,sBAAsB,CAAC,MAAM,EAAE,EAAC,CAAC,MAAM,CAAC,EAAE,aAAa,EAAC,CAAC,CAAC;IAC5D,CAAC,EACD,CAAC,sBAAsB,CAAC,CACzB,CAAC;IAEF,IAAI,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IAChC,OAAO,CACL,0BACE,KAAC,sBAAsB,IACrB,QAAQ,EAAC,SAAS,EAClB,MAAM,EAAE,aAAa,EACrB,KAAK,EAAC,SAAS,EACf,cAAc,EAAE,kBAAkB,GAClC,EACD,aAAa,CAAC,OAAO,IAAI,CACxB,eAAK,SAAS,EAAC,WAAW,aACxB,eAAK,SAAS,EAAC,kCAAkC,aAC/C,KAAC,QAAQ,IACP,OAAO,EAAE,gBAAgB,EAAE,OAAO,IAAI,KAAK,EAC3C,eAAe,EAAE,sBAAsB,EACvC,SAAS,EAAC,aAAa,GACvB,EACF,gBAAM,SAAS,EAAC,+BAA+B,sBACxC,KAAC,gBAAgB,IAAC,EAAE,EAAC,yBAAyB,GAAG,IACjD,IACH,EACN,KAAC,mBAAmB,IAClB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,aAAa,CAAC,MAAM,EAC5B,QAAQ,EAAE,yBAAyB,EACnC,qBAAqB,EAAE,yBAAyB,EAChD,MAAM,EAAE,MAAM,GACd,IACE,CACP,IACG,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAA8B,CAAC,EAClE,KAAK,GACN,EAAE,EAAE;IACH,MAAM,EAAC,aAAa,EAAE,WAAW,EAAC,GAAG,qBAAqB,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC;IACpE,MAAM,EAAC,KAAK,EAAC,GAAG,QAAQ,EAAE,CAAC;IAE3B,mCAAmC;IACnC,MAAM,MAAM,GACV,KAAK,KAAK,MAAM;QAChB,CAAC,KAAK,KAAK,QAAQ;YACjB,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC,OAAO,CAAC,CAAC;IAE/D,MAAM,oBAAoB,GAAG,WAAW,EAAE,QAAQ,CAAC,iBAAiB,CAAC;IACrE,MAAM,iBAAiB,GAAG,OAAO,CAC/B,GAAG,EAAE,CAAC,oBAAoB,IAAI,EAAE,EAChC,CAAC,oBAAoB,CAAC,CACvB,CAAC;IACF,MAAM,QAAQ,GAAG,WAAW,EAAE,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;IACtD,MAAM,EAAC,uBAAuB,EAAE,sBAAsB,EAAC,GACrD,aAAa,CAAC,eAAe,CAAC;IAEhC,MAAM,kBAAkB,GAAG,WAAW,CACpC,CAAC,QAAgB,EAAE,SAAc,EAAE,EAAE;QACnC,MAAM,aAAa,GACjB,iBAAiB,CAAC,QAAmC,CAAC,CAAC;QACzD,IAAI,aAAa,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;YACvD,uBAAuB,CAAC;gBACtB,GAAG,aAAa;gBAChB,GAAG,SAAS;aACb,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EACD,CAAC,iBAAiB,EAAE,uBAAuB,CAAC,CAC7C,CAAC;IAEF,mCAAmC;IACnC,MAAM,sBAAsB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC9C,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,UAAU,CAAC;QACtD,IAAI,gBAAgB,IAAI,OAAO,gBAAgB,KAAK,QAAQ,EAAE,CAAC;YAC7D,uBAAuB,CAAC;gBACtB,GAAG,gBAAgB;gBACnB,OAAO,EAAE,CAAC,gBAAgB,CAAC,OAAO;aACnC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EAAE,CAAC,iBAAiB,CAAC,UAAU,EAAE,uBAAuB,CAAC,CAAC,CAAC;IAE5D,OAAO,CACL,cAAK,SAAS,EAAC,qBAAqB,YAClC,eAAK,SAAS,EAAC,WAAW,aACxB,KAAC,YAAY,IACX,aAAa,EAAE,iBAAiB,CAAC,OAAO,EACxC,gBAAgB,EAAE,iBAAiB,CAAC,UAAU,EAC9C,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,kBAAkB,EACtC,sBAAsB,EAAE,sBAAsB,EAC9C,sBAAsB,EAAE,sBAAsB,GAC9C,EACD,iBAAiB,CAAC,QAAQ,IAAI,CAC7B,KAAC,sBAAsB,IACrB,QAAQ,EAAC,UAAU,EACnB,MAAM,EAAE,iBAAiB,CAAC,QAAQ,EAClC,KAAK,EAAC,iBAAiB,EACvB,cAAc,EAAE,kBAAkB,GAClC,CACH,EACA,iBAAiB,CAAC,KAAK,IAAI,CAC1B,KAAC,sBAAsB,IACrB,QAAQ,EAAC,OAAO,EAChB,MAAM,EAAE,iBAAiB,CAAC,KAAK,EAC/B,KAAK,EAAC,cAAc,EACpB,cAAc,EAAE,kBAAkB,GAClC,CACH,IACG,GACF,CACP,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import React, {useCallback, useMemo} from 'react';\nimport {Switch, Checkbox, useTheme} from '@sqlrooms/ui';\n\nimport {InteractionConfig} from '@kepler.gl/types';\nimport {FormattedMessage} from '@kepler.gl/localization';\n\nimport {useKeplerStateActions} from '../hooks/useKeplerStateActions';\nimport {CustomTooltipConfig} from './CustomTooltipConfig';\n\nconst SimpleInteractionPanel: React.FC<{\n configId: string;\n config: any;\n label: string;\n onConfigChange: (configId: string, newConfig: any) => void;\n}> = ({configId, config, label, onConfigChange}) => {\n const toggleEnableConfig = useCallback(() => {\n onConfigChange(configId, {\n enabled: !config.enabled,\n });\n }, [configId, config.enabled, onConfigChange]);\n\n return (\n <div className=\"flex items-center justify-between p-2\">\n <div className=\"text-muted-foreground text-sm font-medium\">{label}</div>\n <Switch\n checked={config.enabled}\n onCheckedChange={toggleEnableConfig}\n className=\"data-[state=checked]:bg-primary data-[state=unchecked]:bg-secondary\"\n />\n </div>\n );\n};\n\nconst TooltipPanel: React.FC<{\n tooltipConfig: any;\n coordinateConfig: any;\n datasets: any;\n isDark: boolean;\n handleConfigChange: (configId: string, newConfig: any) => void;\n handleCoordinateToggle: () => void;\n setColumnDisplayFormat: (\n dataId: string,\n formats: {[key: string]: string},\n ) => void;\n}> = ({\n tooltipConfig,\n coordinateConfig,\n datasets,\n isDark,\n handleConfigChange,\n handleCoordinateToggle,\n setColumnDisplayFormat,\n}) => {\n const handleTooltipConfigChange = useCallback(\n (newConfig: any) => {\n handleConfigChange('tooltip', {config: newConfig});\n },\n [handleConfigChange],\n );\n\n const handleDisplayFormatChange = useCallback(\n (dataId: string, column: string, displayFormat: string) => {\n setColumnDisplayFormat(dataId, {[column]: displayFormat});\n },\n [setColumnDisplayFormat],\n );\n\n if (!tooltipConfig) return null;\n return (\n <div>\n <SimpleInteractionPanel\n configId=\"tooltip\"\n config={tooltipConfig}\n label=\"Tooltip\"\n onConfigChange={handleConfigChange}\n />\n {tooltipConfig.enabled && (\n <div className=\"pr-2 pl-4\">\n <div className=\"flex items-center space-x-2 py-2\">\n <Checkbox\n checked={coordinateConfig?.enabled || false}\n onCheckedChange={handleCoordinateToggle}\n className=\"shadow-none\"\n />\n <span className=\"text-muted-foreground text-xs\">\n Show <FormattedMessage id=\"interactions.coordinate\" />\n </span>\n </div>\n <CustomTooltipConfig\n datasets={datasets}\n config={tooltipConfig.config}\n onChange={handleTooltipConfigChange}\n onDisplayFormatChange={handleDisplayFormatChange}\n isDark={isDark}\n />\n </div>\n )}\n </div>\n );\n};\n\nexport const CustomInteractionManager: React.FC<{mapId: string}> = ({\n mapId,\n}) => {\n const {keplerActions, keplerState} = useKeplerStateActions({mapId});\n const {theme} = useTheme();\n\n // Determine if dark mode is active\n const isDark =\n theme === 'dark' ||\n (theme === 'system' &&\n window.matchMedia('(prefers-color-scheme: dark)').matches);\n\n const rawInteractionConfig = keplerState?.visState.interactionConfig;\n const interactionConfig = useMemo<Partial<InteractionConfig>>(\n () => rawInteractionConfig ?? {},\n [rawInteractionConfig],\n );\n const datasets = keplerState?.visState.datasets || {};\n const {interactionConfigChange, setColumnDisplayFormat} =\n keplerActions.visStateActions;\n\n const handleConfigChange = useCallback(\n (configId: string, newConfig: any) => {\n const currentConfig =\n interactionConfig[configId as keyof InteractionConfig];\n if (currentConfig && typeof currentConfig === 'object') {\n interactionConfigChange({\n ...currentConfig,\n ...newConfig,\n });\n }\n },\n [interactionConfig, interactionConfigChange],\n );\n\n // Handle coordinate display toggle\n const handleCoordinateToggle = useCallback(() => {\n const coordinateConfig = interactionConfig.coordinate;\n if (coordinateConfig && typeof coordinateConfig === 'object') {\n interactionConfigChange({\n ...coordinateConfig,\n enabled: !coordinateConfig.enabled,\n });\n }\n }, [interactionConfig.coordinate, interactionConfigChange]);\n\n return (\n <div className=\"interaction-manager\">\n <div className=\"space-y-2\">\n <TooltipPanel\n tooltipConfig={interactionConfig.tooltip}\n coordinateConfig={interactionConfig.coordinate}\n datasets={datasets}\n isDark={isDark}\n handleConfigChange={handleConfigChange}\n handleCoordinateToggle={handleCoordinateToggle}\n setColumnDisplayFormat={setColumnDisplayFormat}\n />\n {interactionConfig.geocoder && (\n <SimpleInteractionPanel\n configId=\"geocoder\"\n config={interactionConfig.geocoder}\n label=\"Location search\"\n onConfigChange={handleConfigChange}\n />\n )}\n {interactionConfig.brush && (\n <SimpleInteractionPanel\n configId=\"brush\"\n config={interactionConfig.brush}\n label=\"Brush filter\"\n onConfigChange={handleConfigChange}\n />\n )}\n </div>\n </div>\n );\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomLayerManager.d.ts","sourceRoot":"","sources":["../../src/components/CustomLayerManager.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"CustomLayerManager.d.ts","sourceRoot":"","sources":["../../src/components/CustomLayerManager.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+C,MAAM,OAAO,CAAC;AAwPpE,KAAK,uBAAuB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AA6BF,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CA6GhE,CAAC"}
|
|
@@ -1,31 +1,24 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useCallback, useMemo } from 'react';
|
|
2
|
+
import React, { useCallback, useMemo, useRef, useState } from 'react';
|
|
3
3
|
import { useIntl } from 'react-intl';
|
|
4
4
|
import styled from 'styled-components';
|
|
5
|
-
import { LayerListFactory, DatasetLayerGroupFactory, PanelTitleFactory,
|
|
5
|
+
import { Accessor, Button, Icons, LayerListFactory, DatasetLayerGroupFactory, PanelTitleFactory, SidePanelSection, Typeahead, } from '@kepler.gl/components';
|
|
6
6
|
import { PANEL_VIEW_TOGGLES, SIDEBAR_PANELS } from '@kepler.gl/constants';
|
|
7
7
|
import { getApplicationConfig } from '@kepler.gl/utils';
|
|
8
8
|
import { getKeplerFactory } from './KeplerInjector';
|
|
9
9
|
import { useKeplerStateActions, } from '../hooks/useKeplerStateActions';
|
|
10
|
-
|
|
10
|
+
import { useStoreWithKepler } from '../KeplerSlice';
|
|
11
11
|
const LayerList = getKeplerFactory(LayerListFactory);
|
|
12
12
|
const DatasetLayerGroup = getKeplerFactory(DatasetLayerGroupFactory);
|
|
13
13
|
const PanelTitle = getKeplerFactory(PanelTitleFactory);
|
|
14
|
-
const AddLayerButton = getKeplerFactory(AddLayerButtonFactory);
|
|
15
14
|
const layerPanelMetadata = SIDEBAR_PANELS.find((p) => p.id === 'layer');
|
|
16
|
-
// Custom styled components for your layer manager
|
|
17
15
|
const CustomLayerManagerContainer = styled.div `
|
|
18
|
-
.layer-manager {
|
|
19
|
-
/* Add your custom styles here */
|
|
20
|
-
}
|
|
21
|
-
|
|
22
16
|
.layer-manager-title {
|
|
23
|
-
/* Custom title styling */
|
|
24
17
|
}
|
|
25
18
|
|
|
26
19
|
.add-layer-button {
|
|
27
20
|
background-color: ${(props) => props.theme.sidePanelBg || props.theme.panelBackground};
|
|
28
|
-
color: #2563EB;
|
|
21
|
+
color: #2563EB;
|
|
29
22
|
border: 0px;
|
|
30
23
|
height: 28px;
|
|
31
24
|
font-weight: 500;
|
|
@@ -58,7 +51,125 @@ const CustomLayerManagerContainer = styled.div `
|
|
|
58
51
|
}
|
|
59
52
|
}
|
|
60
53
|
`;
|
|
61
|
-
|
|
54
|
+
const DropdownWrapper = styled.div `
|
|
55
|
+
position: relative;
|
|
56
|
+
display: inline-block;
|
|
57
|
+
overflow: visible;
|
|
58
|
+
`;
|
|
59
|
+
const DropdownMenu = styled.div `
|
|
60
|
+
display: flex;
|
|
61
|
+
flex-direction: column;
|
|
62
|
+
min-width: 240px;
|
|
63
|
+
max-width: 240px;
|
|
64
|
+
position: fixed;
|
|
65
|
+
z-index: 100;
|
|
66
|
+
|
|
67
|
+
.list-selector {
|
|
68
|
+
border-top: 1px solid ${(props) => props.theme.secondaryInputBorderColor};
|
|
69
|
+
width: 100%;
|
|
70
|
+
max-height: unset;
|
|
71
|
+
}
|
|
72
|
+
.list__item > div {
|
|
73
|
+
display: flex;
|
|
74
|
+
flex-direction: row;
|
|
75
|
+
justify-content: flex-start;
|
|
76
|
+
line-height: 18px;
|
|
77
|
+
padding: 0;
|
|
78
|
+
}
|
|
79
|
+
`;
|
|
80
|
+
const ListItemWrapper = styled.div `
|
|
81
|
+
display: flex;
|
|
82
|
+
color: ${(props) => props.theme.textColor};
|
|
83
|
+
font-size: 11px;
|
|
84
|
+
letter-spacing: 0.2px;
|
|
85
|
+
overflow: auto;
|
|
86
|
+
.table-name {
|
|
87
|
+
white-space: nowrap;
|
|
88
|
+
overflow: hidden;
|
|
89
|
+
text-overflow: ellipsis;
|
|
90
|
+
}
|
|
91
|
+
`;
|
|
92
|
+
const TYPEAHEAD_CLASS = 'typeahead';
|
|
93
|
+
const TYPEAHEAD_INPUT_CLASS = 'typeahead__input';
|
|
94
|
+
const TableListItem = ({ value }) => (_jsx(ListItemWrapper, { children: _jsx("div", { className: "table-name", title: value.label, children: value.label }) }));
|
|
95
|
+
/**
|
|
96
|
+
* Dropdown button that lists available datasets and DuckDB tables.
|
|
97
|
+
* When a table is selected, it is synced to Kepler on demand and a new
|
|
98
|
+
* layer is created for it.
|
|
99
|
+
*/
|
|
100
|
+
const AddTableLayerButton = ({ onAdd, keplerDatasetIds, disabled }) => {
|
|
101
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
102
|
+
const [isAdding, setIsAdding] = useState(false);
|
|
103
|
+
const dropdownRef = useRef(null);
|
|
104
|
+
const buttonRef = useRef(null);
|
|
105
|
+
const [menuPos, setMenuPos] = useState({
|
|
106
|
+
top: 0,
|
|
107
|
+
right: 0,
|
|
108
|
+
});
|
|
109
|
+
const intl = useIntl();
|
|
110
|
+
const dbTables = useStoreWithKepler((state) => state.db.tables);
|
|
111
|
+
const options = useMemo(() => {
|
|
112
|
+
const tableNames = new Set(dbTables
|
|
113
|
+
.filter((t) => t.table.schema === 'main')
|
|
114
|
+
.map((t) => t.table.table));
|
|
115
|
+
for (const id of keplerDatasetIds) {
|
|
116
|
+
tableNames.add(id);
|
|
117
|
+
}
|
|
118
|
+
return Array.from(tableNames)
|
|
119
|
+
.sort()
|
|
120
|
+
.map((name) => ({ label: name, value: name }));
|
|
121
|
+
}, [dbTables, keplerDatasetIds]);
|
|
122
|
+
const handleClick = useCallback(async () => {
|
|
123
|
+
if (options.length === 1 && options[0]) {
|
|
124
|
+
setIsAdding(true);
|
|
125
|
+
try {
|
|
126
|
+
await onAdd(options[0].value);
|
|
127
|
+
}
|
|
128
|
+
catch (e) {
|
|
129
|
+
console.error('Failed to add layer:', e);
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
setIsAdding(false);
|
|
133
|
+
}
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
if (buttonRef.current) {
|
|
137
|
+
const rect = buttonRef.current.getBoundingClientRect();
|
|
138
|
+
setMenuPos({
|
|
139
|
+
top: rect.bottom,
|
|
140
|
+
right: window.innerWidth - rect.right,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
setIsOpen((prev) => !prev);
|
|
144
|
+
}, [options, onAdd]);
|
|
145
|
+
const handleSelect = useCallback((option) => {
|
|
146
|
+
if (!option)
|
|
147
|
+
return;
|
|
148
|
+
setIsAdding(true);
|
|
149
|
+
onAdd(option.value)
|
|
150
|
+
.then(() => setIsOpen(false))
|
|
151
|
+
.catch((e) => console.error('Failed to add layer:', e))
|
|
152
|
+
.finally(() => setIsAdding(false));
|
|
153
|
+
}, [onAdd]);
|
|
154
|
+
// Close dropdown on outside click
|
|
155
|
+
React.useEffect(() => {
|
|
156
|
+
if (!isOpen)
|
|
157
|
+
return;
|
|
158
|
+
const handleClickOutside = (e) => {
|
|
159
|
+
if (dropdownRef.current &&
|
|
160
|
+
!dropdownRef.current.contains(e.target)) {
|
|
161
|
+
setIsOpen(false);
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
document.addEventListener('mousedown', handleClickOutside);
|
|
165
|
+
return () => document.removeEventListener('mousedown', handleClickOutside);
|
|
166
|
+
}, [isOpen]);
|
|
167
|
+
return (_jsxs(DropdownWrapper, { ref: dropdownRef, children: [_jsxs(Button, { ref: buttonRef, className: "add-layer-button", onClick: handleClick, disabled: !options.length || disabled || isAdding, children: [_jsx(Icons.Add, { height: "12px" }), intl.formatMessage({ id: 'layerManager.addLayer' })] }), isOpen && options.length > 1 && (_jsx(DropdownMenu, { style: { top: menuPos.top, right: menuPos.right }, children: _jsx(Typeahead, { className: TYPEAHEAD_CLASS, customClasses: {
|
|
168
|
+
results: 'list-selector',
|
|
169
|
+
input: TYPEAHEAD_INPUT_CLASS,
|
|
170
|
+
listItem: 'list__item',
|
|
171
|
+
}, placeholder: intl ? intl.formatMessage({ id: 'placeholder.search' }) : 'Search', selectedItems: null, options: options, displayOption: Accessor.generateOptionToStringFor('label'), filterOption: 'label', searchable: true, onOptionSelected: handleSelect, customListItemComponent: TableListItem }) }))] }));
|
|
172
|
+
};
|
|
62
173
|
function useCustomSidePanelActions(keplerActions) {
|
|
63
174
|
const { openDeleteModal, toggleModal } = keplerActions.uiStateActions;
|
|
64
175
|
const { updateTableColor } = keplerActions.visStateActions;
|
|
@@ -75,13 +186,23 @@ function useCustomSidePanelActions(keplerActions) {
|
|
|
75
186
|
export const CustomLayerManager = ({ mapId, showDeleteDataset = true, }) => {
|
|
76
187
|
const { keplerActions, keplerState } = useKeplerStateActions({ mapId });
|
|
77
188
|
const intl = useIntl();
|
|
189
|
+
const addTableToMap = useStoreWithKepler((state) => state.kepler.addTableToMap);
|
|
78
190
|
const { onRemoveDataset, onUpdateTableColor } = useCustomSidePanelActions(keplerActions);
|
|
79
191
|
const { addLayer } = keplerActions.visStateActions;
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
192
|
+
const keplerDatasetIds = useMemo(() => Object.keys(keplerState?.visState.datasets ?? {}), [keplerState?.visState.datasets]);
|
|
193
|
+
const onAddTableLayer = useCallback(async (tableName) => {
|
|
194
|
+
const keplerDatasets = keplerState?.visState.datasets;
|
|
195
|
+
if (!keplerDatasets?.[tableName]) {
|
|
196
|
+
await addTableToMap(mapId, tableName, {
|
|
197
|
+
autoCreateLayers: true,
|
|
198
|
+
centerMap: true,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
addLayer(undefined, tableName);
|
|
203
|
+
}
|
|
204
|
+
}, [addLayer, addTableToMap, keplerState?.visState.datasets, mapId]);
|
|
83
205
|
const isSortByDatasetMode = keplerState?.uiState.layerPanelListView === PANEL_VIEW_TOGGLES.byDataset;
|
|
84
|
-
// Filter layer classes based on application config
|
|
85
206
|
const enableRasterTileLayer = getApplicationConfig().enableRasterTileLayer;
|
|
86
207
|
const enableWMSLayer = getApplicationConfig().enableWMSLayer;
|
|
87
208
|
const filteredLayerClasses = useMemo(() => {
|
|
@@ -105,6 +226,6 @@ export const CustomLayerManager = ({ mapId, showDeleteDataset = true, }) => {
|
|
|
105
226
|
}
|
|
106
227
|
return (_jsx(CustomLayerManagerContainer, { children: _jsxs("div", { className: "layer-manager", children: [_jsx(SidePanelSection, { children: _jsx(PanelTitle, { className: "layer-manager-title", title: intl.formatMessage({
|
|
107
228
|
id: layerPanelMetadata?.label || 'Layers',
|
|
108
|
-
}), children: _jsx(
|
|
229
|
+
}), children: _jsx(AddTableLayerButton, { onAdd: onAddTableLayer, keplerDatasetIds: keplerDatasetIds }) }) }), _jsx(SidePanelSection, { children: isSortByDatasetMode ? (_jsx(DatasetLayerGroup, { datasets: keplerState.visState.datasets, showDatasetTable: keplerActions.visStateActions.showDatasetTable, layers: keplerState.visState.layers, updateTableColor: onUpdateTableColor, removeDataset: onRemoveDataset, layerOrder: keplerState.visState.layerOrder, layerClasses: filteredLayerClasses, uiStateActions: keplerActions.uiStateActions, visStateActions: keplerActions.visStateActions, mapStateActions: keplerActions.mapStateActions, showDeleteDataset: showDeleteDataset })) : (_jsx(LayerList, { layers: keplerState.visState.layers, datasets: keplerState.visState.datasets, layerOrder: keplerState.visState.layerOrder, uiStateActions: keplerActions.uiStateActions, visStateActions: keplerActions.visStateActions, mapStateActions: keplerActions.mapStateActions, layerClasses: filteredLayerClasses })) })] }) }));
|
|
109
230
|
};
|
|
110
231
|
//# sourceMappingURL=CustomLayerManager.js.map
|