/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import { t } from '@apache-superset/core/translation'; import { ControlPanelConfig } from '@superset-ui/chart-controls'; /** * Get the layer configuration object from the control panel. * * @param controlPanel The control panel * @returns The layer configuration object or undefined if not found */ export const getLayerConfig = (controlPanel: ControlPanelConfig) => { let layerConfig: any; controlPanel.controlPanelSections.forEach(section => { if (!section) { return; } const { controlSetRows } = section; controlSetRows.forEach((row: any[]) => { const configObject = row[0] as any; if (configObject && configObject.name === 'layer_configs') { layerConfig = configObject; } }); }); return layerConfig; }; /** * Mutates response of chart request into select options. * * If a currently selected value is not included in the response, * it will be added explicitly, in order to prevent antd from creating * a non-user-friendly select option. * * @param response Response json from resolved http request. * @param value The currently selected value of the select input. * @returns The list of options for the select input. */ export const selectedChartMutator = ( response: Record, value: any, ) => { if (!response?.result) { if (value && typeof value === 'string') { return [ { label: JSON.parse(value).slice_name, value, }, ]; } return []; } const data: any[] = []; if (value && typeof value === 'string') { const parsedValue = JSON.parse(value); let itemFound = false; response.result.forEach((config: any) => { const configString = JSON.stringify(config); const sameId = config.id === parsedValue.id; const isUpdated = configString !== value; const label = config.slice_name; if (sameId) { itemFound = true; } if (!sameId || !isUpdated) { data.push({ value: configString, label, }); } else { data.push({ value: configString, label: ( ({t('updated')}) {label} ), }); data.push({ value, label, }); } }); if (!itemFound) { data.push({ value, label: parsedValue.slice_name, }); } } else { response.result.forEach((config: any) => { const configString = JSON.stringify(config); const label = config.slice_name; data.push({ value: configString, label, }); }); } return data; };