@sqlrooms/kepler 0.29.0-rc.7 → 0.29.0-rc.8
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/LICENSE.md +2 -1
- package/README.md +121 -4
- package/dist/KeplerSlice.d.ts +55 -2
- package/dist/KeplerSlice.d.ts.map +1 -1
- package/dist/KeplerSlice.js +92 -15
- package/dist/KeplerSlice.js.map +1 -1
- package/dist/components/CustomFilterManager.d.ts.map +1 -1
- package/dist/components/CustomFilterManager.js +16 -4
- package/dist/components/CustomFilterManager.js.map +1 -1
- package/dist/components/CustomLayerManager.d.ts.map +1 -1
- package/dist/components/CustomLayerManager.js +23 -110
- package/dist/components/CustomLayerManager.js.map +1 -1
- package/dist/components/CustomMapLegendPanel.d.ts +1 -1
- package/dist/components/CustomMapLegendPanel.d.ts.map +1 -1
- package/dist/components/CustomMapLegendPanel.js +14 -6
- package/dist/components/CustomMapLegendPanel.js.map +1 -1
- package/dist/components/CustomSourceDataSelector.d.ts +18 -0
- package/dist/components/CustomSourceDataSelector.d.ts.map +1 -0
- package/dist/components/CustomSourceDataSelector.js +130 -0
- package/dist/components/CustomSourceDataSelector.js.map +1 -0
- 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/components/KeplerMapContainer.d.ts.map +1 -1
- package/dist/components/KeplerMapContainer.js +9 -2
- package/dist/components/KeplerMapContainer.js.map +1 -1
- package/dist/components/KeplerProvider.d.ts.map +1 -1
- package/dist/components/KeplerProvider.js +3 -1
- package/dist/components/KeplerProvider.js.map +1 -1
- package/dist/components/KeplerTableSourceSelector.d.ts +20 -0
- package/dist/components/KeplerTableSourceSelector.d.ts.map +1 -0
- package/dist/components/KeplerTableSourceSelector.js +21 -0
- package/dist/components/KeplerTableSourceSelector.js.map +1 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/keplerTableSelection.d.ts +142 -0
- package/dist/keplerTableSelection.d.ts.map +1 -0
- package/dist/keplerTableSelection.js +231 -0
- package/dist/keplerTableSelection.js.map +1 -0
- package/dist/styles/theme.d.ts +12 -0
- package/dist/styles/theme.d.ts.map +1 -1
- package/dist/styles/theme.js +12 -0
- package/dist/styles/theme.js.map +1 -1
- package/package.json +13 -7
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 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 setFilterView as setFilterViewAction,\n toggleLayerForMap as toggleLayerForMapAction,\n toggleSplitMap as toggleSplitMapAction,\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 RoomShellSliceState,\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();\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 splitMap: {\n show: true,\n active: false,\n },\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 const config: KeplerSliceConfig = {\n maps: [\n {\n id: mapId,\n name: 'Untitled Map',\n config: undefined,\n lastOpenedAt: Date.now(),\n },\n ],\n ...props,\n };\n return KeplerSliceConfig.parse(config);\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 setFilterView: (\n mapId: string,\n filterIdx: number,\n view: 'side' | 'enlarged' | 'minified',\n ) => void;\n updateTooltipFields: (\n mapId: string,\n datasetId: string,\n fieldNames: string[],\n ) => void;\n toggleSplitMap: (mapId: string, index?: number) => void;\n toggleLayerForMap: (\n mapId: string,\n mapIndex: number,\n layerId: 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 isRestoringConfig: boolean;\n withConfigPersistencePaused: <TResult>(\n fn: () => TResult | Promise<TResult>,\n ) => Promise<TResult>;\n waitForConfigRestore: () => Promise<void>;\n removeDatasetFromMaps: (datasetId: string) => void;\n dispatchAction: (mapId: string, action: KeplerAction) => void;\n ensureMap: (mapId: string, name?: 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, options?: {id?: 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 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 let configRestoreDepth = 0;\n const configRestorePromises = new Set<Promise<unknown>>();\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 function registerMapEntry(id: string) {\n return registerEntry({id, ...basicKeplerProps});\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 isRestoringConfig: false,\n dispatchAction: () => {},\n __reduxProviderStore: undefined,\n forwardDispatch: {},\n\n setConfig: (config: KeplerSliceConfig) => {\n void get()\n .kepler.withConfigPersistencePaused(async () => {\n const nextConfig = KeplerSliceConfig.parse(config);\n set((state) =>\n produce(state, (draft) => {\n draft.kepler.config = nextConfig;\n }),\n );\n updateMapReduxStates();\n updateForwardDispatch();\n updateMapConfigs();\n await get().kepler.syncKeplerDatasets();\n })\n .catch((error) => {\n console.error('setConfig: failed to restore Kepler config', error);\n });\n },\n\n async initialize() {\n const config = get().kepler.config;\n const keplerInitialState = config.maps.reduce<KeplerGlReduxState>(\n (mapState, map) =>\n createKeplerReducer({\n reason: 'initialize',\n mapId: map.id,\n name: map.name,\n })(mapState, registerMapEntry(map.id)),\n {},\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 isRestoringConfig: get().kepler.isRestoringConfig,\n },\n });\n updateForwardDispatch();\n await get().kepler.syncKeplerDatasets();\n updateMapConfigs();\n for (const mapId of Object.keys(get().kepler.map)) {\n requestMapStyle(mapId);\n }\n },\n\n async destroy() {\n // no-op\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 setFilterView: (mapId, filterIdx, view) => {\n get().kepler.registerKeplerMapIfNotExists(mapId);\n get().kepler.dispatchAction(\n mapId,\n setFilterViewAction(filterIdx, view),\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 toggleSplitMap: (mapId, index) => {\n get().kepler.registerKeplerMapIfNotExists(mapId);\n get().kepler.dispatchAction(\n mapId,\n toggleSplitMapAction(index as number),\n );\n },\n\n toggleLayerForMap: (mapId, mapIndex, layerId) => {\n get().kepler.registerKeplerMapIfNotExists(mapId);\n get().kepler.dispatchAction(\n mapId,\n toggleLayerForMapAction(mapIndex, layerId),\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 ensureMap: (mapId, name) => {\n const now = Date.now();\n set((state) =>\n produce(state, (draft) => {\n const existing = draft.kepler.config.maps.find(\n (map) => map.id === mapId,\n );\n if (existing) {\n if (name && existing.name !== name) {\n existing.name = name;\n }\n return;\n }\n draft.kepler.config.maps.push({\n id: mapId,\n name: name ?? 'Untitled Map',\n lastOpenedAt: now,\n });\n draft.kepler.map = createKeplerReducer({\n reason: 'create-map',\n mapId,\n name,\n })(draft.kepler.map, registerMapEntry(mapId));\n draft.kepler.forwardDispatch[mapId] = getForwardDispatch(mapId);\n }),\n );\n if (!get().kepler.map[mapId]) {\n get().kepler.registerKeplerMapIfNotExists(mapId);\n }\n requestMapStyle(mapId);\n get().kepler.syncKeplerDatasets();\n },\n\n createMap: (name, options) => {\n const mapId = options?.id ?? createId();\n get().kepler.ensureMap(mapId, name);\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 maps = draft.kepler.config.maps;\n\n draft.kepler.config.maps = maps.filter((map) => map.id !== mapId);\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 // 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, registerMapEntry(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 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 withConfigPersistencePaused: async (fn) => {\n configRestoreDepth += 1;\n if (configRestoreDepth === 1) {\n set((state) =>\n produce(state, (draft) => {\n draft.kepler.isRestoringConfig = true;\n }),\n );\n }\n\n const restorePromise = (async () => {\n try {\n return await fn();\n } finally {\n // Kepler restore actions can enqueue follow-up work through\n // react-palm; let those actions settle before persisted config\n // writes are allowed again.\n await new Promise((resolve) => setTimeout(resolve, 0));\n await new Promise((resolve) => setTimeout(resolve, 0));\n configRestoreDepth -= 1;\n if (configRestoreDepth === 0) {\n set((state) =>\n produce(state, (draft) => {\n draft.kepler.isRestoringConfig = false;\n }),\n );\n }\n }\n })();\n\n configRestorePromises.add(restorePromise);\n try {\n return await restorePromise;\n } finally {\n configRestorePromises.delete(restorePromise);\n }\n },\n\n waitForConfigRestore: async () => {\n while (configRestorePromises.size > 0) {\n await Promise.allSettled(Array.from(configRestorePromises));\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, registerMapEntry(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 (\n configRestoreDepth === 0 &&\n !get().kepler.isRestoringConfig &&\n !SKIP_AUTO_SAVE_ACTIONS.includes(action.type) &&\n mapId\n ) {\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, registerMapEntry(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 forwardDispatch: Record<string, Dispatch<KeplerAction>> = {};\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 setFilterView as setFilterViewAction,\n toggleLayerForMap as toggleLayerForMapAction,\n toggleSplitMap as toggleSplitMapAction,\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 RoomShellSliceState,\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';\nimport type {DefaultTheme} from 'styled-components';\nimport {getUnqualifiedSqlIdentifier} from '@sqlrooms/duckdb-core';\nimport {\n findKeplerTableForDatasetId,\n getKeplerDatasetIdForTable,\n getKeplerTableLabel,\n type KeplerDbSchemaReference,\n type KeplerTableSelectionOptions,\n} from './keplerTableSelection';\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();\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 KeplerModalPortalTarget = 'body' | 'container';\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 /**\n * Theme passed to Kepler's ThemeProvider.\n * Use createKeplerTheme() to merge app-level overrides into the default theme.\n */\n keplerTheme?: DefaultTheme;\n /**\n * Where the Kepler modal (Add Map Style, Export, etc.) should be portaled.\n * - 'body': portals to document.body (escapes stacking contexts)\n * - 'container': portals inside the kepler map container element\n * @default 'container'\n */\n modalPortalTarget?: KeplerModalPortalTarget;\n actionLogging?: boolean | ReduxLoggerOptions;\n middlewares?: Middleware[];\n applicationConfig?: KeplerApplicationConfig;\n /**\n * Controls which DuckDB tables appear in Kepler's Add Layer menu and how\n * those tables are represented in saved Kepler dataset ids.\n */\n tableSelection?: KeplerTableSelectionOptions;\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 activeSidePanel: null,\n currentModal: null,\n mapControls: {\n visibleLayers: INITIAL_UI_STATE.mapControls.visibleLayers,\n splitMap: {\n show: true,\n active: false,\n },\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 const config: KeplerSliceConfig = {\n maps: [\n {\n id: mapId,\n name: 'Untitled Map',\n config: undefined,\n lastOpenedAt: Date.now(),\n },\n ],\n ...props,\n };\n return KeplerSliceConfig.parse(config);\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 AddTableToMapLoadOptions = {\n /**\n * Load the table under an explicit Kepler dataset id.\n *\n * Normal callers should omit this so the table-selection policy decides the\n * id. Restore uses it to satisfy already-saved layer/filter dataIds.\n */\n datasetId?: string;\n};\nexport type AddTableToMapParams = {\n mapId: string;\n /**\n * Table reference to load. This can also be an existing/saved Kepler dataset\n * id when the table-selection policy can resolve it back to a table.\n */\n tableName: string;\n options?: AddDataToMapPayload['options'];\n config?: AddDataToMapPayload['config'];\n /**\n * Explicit Kepler dataset id to write into `datasets.info.id`.\n *\n * Most callers should omit this so `tableSelection.getDatasetIdForTable`\n * controls new ids. Restore passes it to preserve saved layer/filter dataIds.\n */\n datasetId?: string;\n};\nexport type AddTableToMapFn = {\n (params: AddTableToMapParams): Promise<void>;\n (\n mapId: string,\n tableName: string,\n options?: AddDataToMapPayload['options'],\n config?: AddDataToMapPayload['config'],\n loadOptions?: AddTableToMapLoadOptions,\n ): Promise<void>;\n};\n\nfunction normalizeAddTableToMapParams(\n paramsOrMapId: AddTableToMapParams | string,\n tableName?: string,\n options: AddDataToMapPayload['options'] = {},\n config: AddDataToMapPayload['config'] = {},\n loadOptions: AddTableToMapLoadOptions = {},\n): AddTableToMapParams {\n if (typeof paramsOrMapId === 'object') {\n return {\n options: {},\n config: {},\n ...paramsOrMapId,\n };\n }\n\n if (!tableName) {\n throw new Error('addTableToMap requires a tableName.');\n }\n\n return {\n mapId: paramsOrMapId,\n tableName,\n options,\n config,\n datasetId: loadOptions.datasetId,\n };\n}\n\nexport type KeplerSliceState = {\n kepler: {\n config: KeplerSliceConfig;\n map: KeplerGlReduxState;\n basicKeplerProps?: Partial<KeplerGLBasicProps>;\n keplerTheme?: DefaultTheme;\n modalPortalTarget: KeplerModalPortalTarget;\n tableSelection: KeplerTableSelectionOptions;\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 setFilterView: (\n mapId: string,\n filterIdx: number,\n view: 'side' | 'enlarged' | 'minified',\n ) => void;\n updateTooltipFields: (\n mapId: string,\n datasetId: string,\n fieldNames: string[],\n ) => void;\n toggleSplitMap: (mapId: string, index?: number) => void;\n toggleLayerForMap: (\n mapId: string,\n mapIndex: number,\n layerId: string,\n ) => void;\n addTableToMap: AddTableToMapFn;\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 isRestoringConfig: boolean;\n withConfigPersistencePaused: <TResult>(\n fn: () => TResult | Promise<TResult>,\n ) => Promise<TResult>;\n waitForConfigRestore: () => Promise<void>;\n removeDatasetFromMaps: (datasetId: string) => void;\n dispatchAction: (mapId: string, action: KeplerAction) => void;\n ensureMap: (mapId: string, name?: 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, options?: {id?: 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 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 keplerTheme,\n modalPortalTarget = 'container',\n config: initialConfigProps,\n createInitialMapKeplerState,\n actionLogging = false,\n middlewares: additionalMiddlewares = [],\n applicationConfig,\n tableSelection = {},\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 let configRestoreDepth = 0;\n const configRestorePromises = new Set<Promise<unknown>>();\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 getDefaultDbSchema(): KeplerDbSchemaReference | undefined {\n const currentDatabase = get().db.currentDatabase;\n const currentSchema = get().db.currentSchema;\n\n if (!currentDatabase || !currentSchema) {\n return undefined;\n }\n\n return {\n database: currentDatabase,\n schema: currentSchema,\n };\n }\n\n const resolvedTableSelection: KeplerTableSelectionOptions = {\n ...tableSelection,\n };\n\n if (!resolvedTableSelection.defaultDbSchema) {\n resolvedTableSelection.defaultDbSchema = getDefaultDbSchema;\n }\n\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 function registerMapEntry(id: string) {\n return registerEntry({id, ...basicKeplerProps});\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 keplerTheme,\n modalPortalTarget,\n tableSelection: resolvedTableSelection,\n map: {},\n isRestoringConfig: false,\n dispatchAction: () => {},\n __reduxProviderStore: undefined,\n forwardDispatch: {},\n\n setConfig: (config: KeplerSliceConfig) => {\n void get()\n .kepler.withConfigPersistencePaused(async () => {\n const nextConfig = KeplerSliceConfig.parse(config);\n set((state) =>\n produce(state, (draft) => {\n draft.kepler.config = nextConfig;\n }),\n );\n updateMapReduxStates();\n updateForwardDispatch();\n updateMapConfigs();\n await get().kepler.syncKeplerDatasets();\n })\n .catch((error) => {\n console.error(\n 'setConfig: failed to restore Kepler config',\n error,\n );\n });\n },\n\n async initialize() {\n const config = get().kepler.config;\n const keplerInitialState = config.maps.reduce<KeplerGlReduxState>(\n (mapState, map) =>\n createKeplerReducer({\n reason: 'initialize',\n mapId: map.id,\n name: map.name,\n })(mapState, registerMapEntry(map.id)),\n {},\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 isRestoringConfig: get().kepler.isRestoringConfig,\n },\n });\n updateForwardDispatch();\n await get().kepler.syncKeplerDatasets();\n updateMapConfigs();\n for (const mapId of Object.keys(get().kepler.map)) {\n requestMapStyle(mapId);\n }\n },\n\n async destroy() {\n // no-op\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 setFilterView: (mapId, filterIdx, view) => {\n get().kepler.registerKeplerMapIfNotExists(mapId);\n get().kepler.dispatchAction(\n mapId,\n setFilterViewAction(filterIdx, view),\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 toggleSplitMap: (mapId, index) => {\n get().kepler.registerKeplerMapIfNotExists(mapId);\n get().kepler.dispatchAction(\n mapId,\n toggleSplitMapAction(index as number),\n );\n },\n\n toggleLayerForMap: (mapId, mapIndex, layerId) => {\n get().kepler.registerKeplerMapIfNotExists(mapId);\n get().kepler.dispatchAction(\n mapId,\n toggleLayerForMapAction(mapIndex, layerId),\n );\n },\n\n addTableToMap: (async (\n paramsOrMapId: AddTableToMapParams | string,\n legacyTableName?: string,\n legacyOptions?: AddDataToMapPayload['options'],\n legacyConfig?: AddDataToMapPayload['config'],\n legacyLoadOptions?: AddTableToMapLoadOptions,\n ) => {\n const {\n mapId,\n tableName,\n options,\n config,\n datasetId: explicitDatasetId,\n } = normalizeAddTableToMapParams(\n paramsOrMapId,\n legacyTableName,\n legacyOptions,\n legacyConfig,\n legacyLoadOptions,\n );\n const tableSelection = get().kepler.tableSelection;\n const table = findKeplerTableForDatasetId(\n get().db.tables,\n tableName,\n tableSelection,\n );\n const sqlTableName = table ? table.table.toString() : tableName;\n let datasetId = explicitDatasetId;\n if (!datasetId && table) {\n datasetId = getKeplerDatasetIdForTable(table, tableSelection);\n }\n if (!datasetId) {\n datasetId =\n getUnqualifiedSqlIdentifier(String(sqlTableName)) ?? tableName;\n }\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 sqlTableName,\n );\n const tableDuckDBTypes = getDuckDBColumnTypesMap(duckDbColumns);\n const adjustedQuery = castDuckDBTypesForKepler(\n sqlTableName,\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 let label = tableName;\n if (table) {\n label = getKeplerTableLabel(table, tableSelection);\n } else {\n label =\n getUnqualifiedSqlIdentifier(String(sqlTableName)) ?? tableName;\n }\n const datasets: AddDataToMapPayload['datasets'] = {\n data: {fields, cols, rows: [], arrowTable: arrowResult},\n info: {label, id: datasetId},\n metadata: {tableName: sqlTableName},\n };\n get().kepler.dispatchAction(\n mapId,\n addDataToMap({datasets, options, config}),\n );\n }\n }) as AddTableToMapFn,\n\n ensureMap: (mapId, name) => {\n const now = Date.now();\n set((state) =>\n produce(state, (draft) => {\n const existing = draft.kepler.config.maps.find(\n (map) => map.id === mapId,\n );\n if (existing) {\n if (name && existing.name !== name) {\n existing.name = name;\n }\n return;\n }\n draft.kepler.config.maps.push({\n id: mapId,\n name: name ?? 'Untitled Map',\n lastOpenedAt: now,\n });\n draft.kepler.map = createKeplerReducer({\n reason: 'create-map',\n mapId,\n name,\n })(draft.kepler.map, registerMapEntry(mapId));\n draft.kepler.forwardDispatch[mapId] = getForwardDispatch(mapId);\n }),\n );\n if (!get().kepler.map[mapId]) {\n get().kepler.registerKeplerMapIfNotExists(mapId);\n }\n requestMapStyle(mapId);\n get().kepler.syncKeplerDatasets();\n },\n\n createMap: (name, options) => {\n const mapId = options?.id ?? createId();\n get().kepler.ensureMap(mapId, name);\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 = get().db.tables;\n\n for (const dataId of referencedDataIds) {\n if (keplerDatasets?.[dataId]) {\n continue;\n }\n const table = findKeplerTableForDatasetId(\n availableTables,\n dataId,\n get().kepler.tableSelection,\n );\n if (!table) {\n continue;\n }\n try {\n await get().kepler.addTableToMap({\n mapId,\n tableName: dataId,\n options: {\n autoCreateLayers: false,\n centerMap: false,\n },\n datasetId: dataId,\n });\n } catch (e) {\n console.error('syncKeplerDatasets: addTableToMap failed', {\n dataId,\n e,\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 maps = draft.kepler.config.maps;\n\n draft.kepler.config.maps = maps.filter((map) => map.id !== mapId);\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 // 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, registerMapEntry(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 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 withConfigPersistencePaused: async (fn) => {\n configRestoreDepth += 1;\n if (configRestoreDepth === 1) {\n set((state) =>\n produce(state, (draft) => {\n draft.kepler.isRestoringConfig = true;\n }),\n );\n }\n\n const restorePromise = (async () => {\n try {\n return await fn();\n } finally {\n // Kepler restore actions can enqueue follow-up work through\n // react-palm; let those actions settle before persisted config\n // writes are allowed again.\n await new Promise((resolve) => setTimeout(resolve, 0));\n await new Promise((resolve) => setTimeout(resolve, 0));\n configRestoreDepth -= 1;\n if (configRestoreDepth === 0) {\n set((state) =>\n produce(state, (draft) => {\n draft.kepler.isRestoringConfig = false;\n }),\n );\n }\n }\n })();\n\n configRestorePromises.add(restorePromise);\n try {\n return await restorePromise;\n } finally {\n configRestorePromises.delete(restorePromise);\n }\n },\n\n waitForConfigRestore: async () => {\n while (configRestorePromises.size > 0) {\n await Promise.allSettled(Array.from(configRestorePromises));\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, registerMapEntry(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 (\n configRestoreDepth === 0 &&\n !get().kepler.isRestoringConfig &&\n !SKIP_AUTO_SAVE_ACTIONS.includes(action.type) &&\n mapId\n ) {\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, registerMapEntry(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 forwardDispatch: Record<string, Dispatch<KeplerAction>> = {};\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;
|
|
1
|
+
{"version":3,"file":"CustomFilterManager.d.ts","sourceRoot":"","sources":["../../src/components/CustomFilterManager.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6B,MAAM,OAAO,CAAC;AAoDlD,KAAK,wBAAwB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AAgHF,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CA6FlE,CAAC"}
|
|
@@ -2,11 +2,16 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
|
|
|
2
2
|
import { useCallback, useMemo } from 'react';
|
|
3
3
|
import { useIntl } from 'react-intl';
|
|
4
4
|
import styled from 'styled-components';
|
|
5
|
-
import { FilterPanelFactory, PanelTitleFactory,
|
|
5
|
+
import { FilterPanelFactory, PanelTitleFactory, SidePanelSection, } from '@kepler.gl/components';
|
|
6
6
|
import { FILTER_VIEW_TYPES, SIDEBAR_PANELS } from '@kepler.gl/constants';
|
|
7
7
|
import { isSideFilter } from '@kepler.gl/utils';
|
|
8
8
|
import { getKeplerFactory } from './KeplerInjector';
|
|
9
9
|
import { useKeplerStateActions, } from '../hooks/useKeplerStateActions';
|
|
10
|
+
import { buildKeplerTableSourceOptions, } from '../keplerTableSelection';
|
|
11
|
+
import { KeplerTableSourceSelector } from './KeplerTableSourceSelector';
|
|
12
|
+
import { useStoreWithKepler } from '../KeplerSlice';
|
|
13
|
+
import { Button } from '@sqlrooms/ui';
|
|
14
|
+
import { Plus } from 'lucide-react';
|
|
10
15
|
const filterPanelMetadata = SIDEBAR_PANELS.find((p) => p.id === 'filter');
|
|
11
16
|
// Custom styled components for your filter manager
|
|
12
17
|
const CustomFilterManagerContainer = styled.div `
|
|
@@ -30,7 +35,6 @@ const CustomFilterManagerContainer = styled.div `
|
|
|
30
35
|
// Get the kepler.gl components through the injector
|
|
31
36
|
const FilterPanel = getKeplerFactory(FilterPanelFactory);
|
|
32
37
|
const PanelTitle = getKeplerFactory(PanelTitleFactory);
|
|
33
|
-
const AddFilterButton = getKeplerFactory(AddFilterButtonFactory);
|
|
34
38
|
// Filter List Component
|
|
35
39
|
const FilterList = ({ filtersByIndex, filters, datasets, layers, isAnyFilterAnimating, keplerActions, }) => {
|
|
36
40
|
const { removeFilter, setFilterView, toggleFilterAnimation, toggleFilterFeature, } = keplerActions.visStateActions;
|
|
@@ -61,7 +65,7 @@ const FilterList = ({ filtersByIndex, filters, datasets, layers, isAnyFilterAnim
|
|
|
61
65
|
// Custom hook for filter actions
|
|
62
66
|
function useCustomFilterActions(keplerActions) {
|
|
63
67
|
const { addFilter } = keplerActions.visStateActions;
|
|
64
|
-
const onClickAddFilter = useCallback((
|
|
68
|
+
const onClickAddFilter = useCallback((option) => addFilter(option.value), [addFilter]);
|
|
65
69
|
return {
|
|
66
70
|
onClickAddFilter,
|
|
67
71
|
};
|
|
@@ -70,6 +74,8 @@ function useCustomFilterActions(keplerActions) {
|
|
|
70
74
|
export const CustomFilterManager = ({ mapId, }) => {
|
|
71
75
|
const { keplerActions, keplerState } = useKeplerStateActions({ mapId });
|
|
72
76
|
const intl = useIntl();
|
|
77
|
+
const dbTables = useStoreWithKepler((state) => state.db.tables);
|
|
78
|
+
const tableSelection = useStoreWithKepler((state) => state.kepler.tableSelection);
|
|
73
79
|
const { onClickAddFilter } = useCustomFilterActions(keplerActions);
|
|
74
80
|
const visState = keplerState?.visState;
|
|
75
81
|
const filters = useMemo(() => visState?.filters ?? [], [visState?.filters]);
|
|
@@ -79,12 +85,18 @@ export const CustomFilterManager = ({ mapId, }) => {
|
|
|
79
85
|
filter: f,
|
|
80
86
|
idx,
|
|
81
87
|
})) ?? [], [filters]);
|
|
88
|
+
const addFilterOptions = useMemo(() => buildKeplerTableSourceOptions({
|
|
89
|
+
dbTables,
|
|
90
|
+
datasets,
|
|
91
|
+
includeUnloadedTables: false,
|
|
92
|
+
tableSelection,
|
|
93
|
+
}), [datasets, dbTables, tableSelection]);
|
|
82
94
|
if (!keplerState || !keplerActions) {
|
|
83
95
|
return null;
|
|
84
96
|
}
|
|
85
97
|
const isAnyFilterAnimating = Object.values(filters).some((f) => f.isAnimating);
|
|
86
98
|
return (_jsx(CustomFilterManagerContainer, { children: _jsxs("div", { className: "filter-manager", children: [_jsx(SidePanelSection, { children: _jsx(PanelTitle, { className: "filter-manager-title", title: intl.formatMessage({
|
|
87
99
|
id: filterPanelMetadata?.label || 'Filters',
|
|
88
|
-
}), children: _jsx(
|
|
100
|
+
}), children: _jsx(KeplerTableSourceSelector, { disabled: !addFilterOptions.length, options: addFilterOptions, popoverAlign: "end", searchPlaceholder: intl ? intl.formatMessage({ id: 'placeholder.search' }) : 'Search', onSelect: onClickAddFilter, renderTrigger: ({ disabled }) => (_jsxs(Button, { type: "button", variant: "ghost", size: "xs", className: "add-filter-button", disabled: disabled, children: [_jsx(Plus, { className: "h-3.5 w-3.5" }), intl.formatMessage({ id: 'filterManager.addFilter' })] })) }) }) }), _jsx(SidePanelSection, { children: _jsx(FilterList, { filtersByIndex: filtersByIndex, filters: filters, datasets: datasets, layers: layers, isAnyFilterAnimating: isAnyFilterAnimating, keplerActions: keplerActions }) })] }) }));
|
|
89
101
|
};
|
|
90
102
|
//# sourceMappingURL=CustomFilterManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomFilterManager.js","sourceRoot":"","sources":["../../src/components/CustomFilterManager.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAC,WAAW,EAAE,OAAO,EAAC,MAAM,OAAO,CAAC;AAClD,OAAO,EAAC,OAAO,EAAC,MAAM,YAAY,CAAC;AACnC,OAAO,MAAM,MAAM,mBAAmB,CAAC;AAEvC,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAC,iBAAiB,EAAE,cAAc,EAAC,MAAM,sBAAsB,CAAC;AAGvE,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAC,gBAAgB,EAAC,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAEL,qBAAqB,GACtB,MAAM,gCAAgC,CAAC;AAExC,MAAM,mBAAmB,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;AAE1E,mDAAmD;AACnD,MAAM,4BAA4B,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;wBAUvB,CAAC,KAAK,EAAE,EAAE,CAC5B,KAAK,CAAC,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,CAAC,eAAe;;;;;;;CAO3D,CAAC;AA8BF,oDAAoD;AACpD,MAAM,WAAW,GAAG,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;AACzD,MAAM,UAAU,GAAG,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;AACvD,MAAM,eAAe,GAAG,gBAAgB,CAAC,sBAAsB,CAAC,CAAC;AAEjE,wBAAwB;AACxB,MAAM,UAAU,GAA8B,CAAC,EAC7C,cAAc,EACd,OAAO,EACP,QAAQ,EACR,MAAM,EACN,oBAAoB,EACpB,aAAa,GACd,EAAE,EAAE;IACH,MAAM,EACJ,YAAY,EACZ,aAAa,EACb,qBAAqB,EACrB,mBAAmB,GACpB,GAAG,aAAa,CAAC,eAAe,CAAC;IAElC,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,EAAE;QACpC,OAAO,cAAc,CAAC,MAAM,CAC1B,CAAC,IAAI,EAAE,EAAC,MAAM,EAAE,GAAG,EAAC,EAAE,EAAE,CAAC,CAAC;YACxB,GAAG,IAAI;YACP,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;gBACX,YAAY,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC;gBACrC,aAAa,EAAE,CAAC,KAAa,EAAE,EAAE,CAC/B,aAAa,CACX,GAAG,EACH,YAAY,CAAC,MAAM,CAAC;oBAClB,CAAC,CAAC,iBAAiB,CAAC,QAAQ;oBAC5B,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAC3B;gBACH,eAAe,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAC,GAAG,CAAC;gBACjD,mBAAmB,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC;aACpD;SACF,CAAC,EACF,EAA0B,CAC3B,CAAC;IACJ,CAAC,EAAE;QACD,cAAc;QACd,YAAY;QACZ,aAAa;QACb,qBAAqB;QACrB,mBAAmB;KACpB,CAAC,CAAC;IAEH,OAAO,CACL,4BACG,CAAC,GAAG,cAAc,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,EAAC,MAAM,EAAE,GAAG,EAAC,EAAE,EAAE;YACnD,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC9C,OAAO,CACL,KAAC,WAAW,IAEV,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,oBAAoB,EAAE,oBAAoB,KACtC,aAAa,CAAC,eAAe,EACjC,YAAY,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,EAAE,EAC/C,aAAa,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,EACnD,eAAe,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,eAAe,EAAE,EAAE,EACrD,mBAAmB,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,mBAAmB,EAAE,EAAE,IAXxD,GAAG,MAAM,CAAC,EAAE,IAAI,GAAG,EAAE,CAY1B,CACH,CAAC;QACJ,CAAC,CAAC,GACD,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,iCAAiC;AACjC,SAAS,sBAAsB,CAAC,aAA4B;IAC1D,MAAM,EAAC,SAAS,EAAC,GAAG,aAAa,CAAC,eAAe,CAAC;IAElD,MAAM,gBAAgB,GAAG,WAAW,CAClC,CAAC,OAAe,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,EACvC,CAAC,SAAS,CAAC,CACZ,CAAC;IAEF,OAAO;QACL,gBAAgB;KACjB,CAAC;AACJ,CAAC;AAED,uCAAuC;AACvC,MAAM,CAAC,MAAM,mBAAmB,GAAuC,CAAC,EACtE,KAAK,GACN,EAAE,EAAE;IACH,MAAM,EAAC,aAAa,EAAE,WAAW,EAAC,GAAG,qBAAqB,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IAEvB,MAAM,EAAC,gBAAgB,EAAC,GAAG,sBAAsB,CAAC,aAAa,CAAC,CAAC;IAEjE,MAAM,QAAQ,GAAG,WAAW,EAAE,QAAQ,CAAC;IACvC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5E,MAAM,QAAQ,GAAG,OAAO,CACtB,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ,IAAI,EAAE,CAAa,EAC5C,CAAC,QAAQ,EAAE,QAAQ,CAAC,CACrB,CAAC;IACF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACzE,MAAM,cAAc,GAAG,OAAO,CAC5B,GAAG,EAAE,CACH,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QACxB,MAAM,EAAE,CAAC;QACT,GAAG;KACJ,CAAC,CAAC,IAAI,EAAE,EACX,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,IAAI,CAAC,WAAW,IAAI,CAAC,aAAa,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CACtD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CACrB,CAAC;IAEF,OAAO,CACL,KAAC,4BAA4B,cAC3B,eAAK,SAAS,EAAC,gBAAgB,aAC7B,KAAC,gBAAgB,cACf,KAAC,UAAU,IACT,SAAS,EAAC,sBAAsB,EAChC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC;4BACxB,EAAE,EAAE,mBAAmB,EAAE,KAAK,IAAI,SAAS;yBAC5C,CAAC,YAEF,KAAC,eAAe,IAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,GAAI,GACrD,GACI,EAEnB,KAAC,gBAAgB,cACf,KAAC,UAAU,IACT,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,oBAAoB,EAAE,oBAAoB,EAC1C,aAAa,EAAE,aAAa,GAC5B,GACe,IACf,GACuB,CAChC,CAAC;AACJ,CAAC,CAAC","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
|
+
{"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 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';\nimport {\n buildKeplerTableSourceOptions,\n type KeplerTableSourceOption,\n} from '../keplerTableSelection';\nimport {KeplerTableSourceSelector} from './KeplerTableSourceSelector';\nimport {useStoreWithKepler} from '../KeplerSlice';\nimport {Button} from '@sqlrooms/ui';\nimport {Plus} from 'lucide-react';\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);\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 (option: KeplerTableSourceOption) => addFilter(option.value),\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 const dbTables = useStoreWithKepler((state) => state.db.tables);\n const tableSelection = useStoreWithKepler(\n (state) => state.kepler.tableSelection,\n );\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 const addFilterOptions = useMemo(\n () =>\n buildKeplerTableSourceOptions({\n dbTables,\n datasets,\n includeUnloadedTables: false,\n tableSelection,\n }),\n [datasets, dbTables, tableSelection],\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 <KeplerTableSourceSelector\n disabled={!addFilterOptions.length}\n options={addFilterOptions}\n popoverAlign=\"end\"\n searchPlaceholder={\n intl ? intl.formatMessage({id: 'placeholder.search'}) : 'Search'\n }\n onSelect={onClickAddFilter}\n renderTrigger={({disabled}) => (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"xs\"\n className=\"add-filter-button\"\n disabled={disabled}\n >\n <Plus className=\"h-3.5 w-3.5\" />\n {intl.formatMessage({id: 'filterManager.addFilter'})}\n </Button>\n )}\n />\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":"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,KAAuC,MAAM,OAAO,CAAC;AAyI5D,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,CA4GhE,CAAC"}
|