{"version":3,"file":"7130.905c11b7a6989e73d64c.entry.js","mappings":"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AIk4B,KAAM65B,KAAc/pC,GAAS,MAG5EloB,QAAO,CAACua,EAAGxJ,KAAM,IAAMwJ,KAAMxJ,MCyI1BqhD,EAA8C,CAAC,EA/I/B,CACpB,QACA,cACA,oBACA,kBACA,iBACA,wBACA,aACA,OACA,aACA,iBACA,WACA,SACA,eACA,WACA,YACA,QACA,eACA,aACA,aACA,cACA,WACA,YACA,QACA,gBACA,eACA,cACA,eACA,qBACA,SACA,QACA,QACA,OACA,MACA,WACA,gBACA,wBACA,aACA,OACA,gBACA,WACA,mBACA,4BACA,kBACA,WACA,OACA,WACA,OACA,QACA,QACA,cACA,oBACA,cACA,SACA,MACA,YACA,oBACA,0BACA,sBACA,YACA,gBACA,aACA,gBACA,YACA,eACA,OACA,SACA,eACA,SACA,OACA,aACA,OACA,OACA,QACA,SACA,OACA,aACA,mBACA,OACA,WACA,SACA,YACA,kBACA,OACA,OACA,YACA,WACA,cACA,gBACA,MACA,UACA,QACA,cACA,aACA,YACA,OACA,aACA,gBACA,WACA,cACA,WACA,UACA,OACA,UACA,YACA,iBACA,cACA,OACA,aACA,aACA,aACA,SACA,UACA,UACA,OACA,MACA,SACA,SACA,QACA,QACA,WACA,YACA,OACA,QACA,mBACA,MACA,QACA,kBACA,gBACA,cACA,WACA,OACA,UACA,gBACA,UACA,UACA,OACA,SACA,WACA,OACA,QAIY7lE,SAAQolE,IACpB,MAAMU,EAAUC,IAAUX,GAAUrvE,QAAQ,KAAM,IAClD8vE,EAAcC,GAAYnqC,IACxBlC,EAAAA,EAAAA,IAACusC,EAAI,CAACZ,SAAUA,KAAczpC,GAC/B,IAKH,YACKsqC,KACAJ,E,8GClJL,MAAMK,EAAY//B,EAAAA,GAAOouB,GAAG;;;;;;;;;;;;;;;;;;;;;;;EAwBd,SAAUtgC,GAAQ,SAC9B9pB,EAAW,WAAU,MACrBg8D,EAAK,UACLv9B,IAEA,OACEnP,EAAAA,EAAAA,IAACysC,EAAS,CACRt9B,UAAWw9B,IAAI,UAAWj8D,EAAUy+B,GACpCy9B,IAA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B,CACrB,OACA,MAED,oBAAqB,CACpB,OACA,MAED,eAAgB,CACf,OACA,MAED,qBAAsB,CACrB,MACA,MAED,2BAA4B,CAC3B,OACA,MAED,cAAe,CACd,OACA,MAED,cAAe,CACd,OACA,MAED,aAAc,CACb,OACA,MAED,YAAa,CACZ,OACA,MAED,iBAAkB,CACjB,OACA,MAED,sBAAuB,CACtB,OACA,MAED,mBAAoB,CACnB,OACA,MAED,aAAc,CACb,KACA,MAED,2BAA4B,CAC3B,OACA,KAED,8BAA+B,CAC9B,OACA,MAED,sBAAuB,CACtB,OACA,MAED,iBAAkB,CACjB,OACA,MAED,yBAA0B,CACzB,OACA,MAED,wBAAyB,CACxB,OACA,MAED,kCAAmC,CAClC,OACA,KAED,yBAA0B,CACzB,OACA,MAED,iBAAkB,CACjB,OACA,MAED,aAAc,CACb,OACA,MAED,aAAc,CACb,OACA,KAED,iBAAkB,CACjB,OACA,MAED,cAAe,CACd,KACA,MAED,cAAe,CACd,OACA,MAED,oBAAqB,CACpB,OACA,MAED,0BAA2B,CAC1B,OACA,MAED,8BAA+B,CAC9B,OACA,MAED,oBAAqB,CACpB,OACA,MAED,eAAgB,CACf,OACA,MAED,YAAa,CACZ,OACA,MAED,kBAAmB,CAClB,OACA,MAED,0BAA2B,CAC1B,OACA,MAED,4BAA6B,CAC5B,OACA,MAED,gCAAiC,CAChC,OACA,MAED,kBAAmB,CAClB,OACA,MAED,sBAAuB,CACtB,OACA,MAED,mBAAoB,CACnB,OACA,MAED,sBAAuB,CACtB,MACA,MAED,kBAAmB,CAClB,OACA,MAED,qBAAsB,CACrB,OACA,MAED,aAAc,CACb,MACA,MAED,eAAgB,CACf,OACA,MAED,qBAAsB,CACrB,OACA,MAED,eAAgB,CACf,OACA,MAED,aAAc,CACb,OACA,MAED,mBAAoB,CACnB,OACA,MAED,aAAc,CACb,OACA,MAED,aAAc,CACb,OACA,MAED,cAAe,CACd,KACA,MAED,eAAgB,CACf,OACA,MAED,mBAAoB,CACnB,OACA,MAED,aAAc,CACb,OACA,MAED,yBAA0B,CACzB,OACA,MAED,aAAc,CACb,OACA,MAED,iBAAkB,CACjB,OACA,MAED,eAAgB,CACf,OACA,MAED,kBAAmB,CAClB,OACA,MAED,wBAAyB,CACxB,OACA,MAED,aAAc,CACb,OACA,MAED,aAAc,CACb,OACA,MAED,kBAAmB,CAClB,OACA,MAED,iBAAkB,CACjB,OACA,MAED,oBAAqB,CACpB,KACA,MAED,sBAAuB,CACtB,OACA,MAED,YAAa,CACZ,OACA,MAED,gBAAiB,CAChB,OACA,MAED,cAAe,CACd,OACA,MAED,oBAAqB,CACpB,MACA,MAED,mBAAoB,CACnB,OACA,MAED,kBAAmB,CAClB,OACA,MAED,aAAc,CACb,OACA,MAED,mBAAoB,CACnB,OACA,MAED,sBAAuB,CACtB,MACA,MAED,iBAAkB,CACjB,OACA,MAED,oBAAqB,CACpB,OACA,MAED,iBAAkB,CACjB,OACA,MAED,gBAAiB,CAChB,OACA,MAED,aAAc,CACb,OACA,KAED,gBAAiB,CAChB,OACA,KAED,kBAAmB,CAClB,OACA,MAED,uBAAwB,CACvB,OACA,MAED,oBAAqB,CACpB,OACA,MAED,aAAc,CACb,OACA,MAED,mBAAoB,CACnB,OACA,MAED,mBAAoB,CACnB,OACA,MAED,mBAAoB,CACnB,OACA,MAED,eAAgB,CACf,OACA,MAED,aAAc,CACb,OACA,MAED,gBAAiB,CAChB,OACA,IAED,gBAAiB,CAChB,OACA,MAED,aAAc,CACb,OACA,KAED,eAAgB,CACf,OACA,MAED,eAAgB,CACf,OACA,MAED,cAAe,CACd,OACA,MAED,cAAe,CACd,OACA,MAED,aAAc,CACb,OACA,MAED,iBAAkB,CACjB,OACA,MAED,kBAAmB,CAClB,OACA,MAED,YAAa,CACZ,OACA,MAED,yBAA0B,CACzB,MACA,MAED,cAAe,CACd,OACA,MAED,YAAa,CACZ,OACA,MAED,aAAc,CACb,OACA,MAED,oBAAqB,CACpB,OACA,MAED,cAAe,CACd,OACA,MAED,wBAAyB,CACxB,OACA,MAED,sBAAuB,CACtB,OACA,MAED,oBAAqB,CACpB,OACA,MAED,aAAc,CACb,OACA,MAED,iBAAkB,CACjB,OACA,MAED,aAAc,CACb,OACA,MAED,gBAAiB,CAChB,OACA,MAED,sBAAuB,CACtB,OACA,MAED,gBAAiB,CAChB,OACA,MAED,gBAAiB,CAChB,OACA,KAGF,SAASw6G,EAAoBC,GAC5B,IAAIC,EAAoBlsF,EAAExuB,EAAKy6G,GAC9B,OAAOzyG,QAAQkL,UAAUhM,MAAK,KAC7B,IAAI+M,EAAI,IAAI0E,MAAM,uBAAyB8hG,EAAM,KAEjD,MADAxmG,EAAE4gD,KAAO,mBACH5gD,CAAC,IAIT,IAAI47E,EAAM7vF,EAAIy6G,GAAMh2G,EAAKorF,EAAI,GAC7B,OAAO6qB,EAAoBzmG,EAAE47E,EAAI,IAAI3oF,MAAK,IAClCwzG,EAAoBj2G,IAE7B,CACA+1G,EAAoB7iG,KAAO,IAAO9O,OAAO8O,KAAK3X,GAC9Cw6G,EAAoB/1G,GAAK,OACzBk2G,EAAOC,QAAUJ,C","sources":["webpack://superset/./src/SqlLab/utils/newQueryTabName.ts","webpack://superset/./src/SqlLab/actions/sqlLab.js","webpack://superset/./src/components/Chart/chartAction.js","webpack://superset/./src/dashboard/actions/dashboardFilters.js","webpack://superset/./src/dashboard/actions/dashboardLayout.js","webpack://superset/./src/dashboard/util/dropOverflowsParent.js","webpack://superset/./src/dashboard/util/isInDifferentFilterScopes.js","webpack://superset/./src/dashboard/util/getOverwriteItems.ts","webpack://superset/./src/dashboard/actions/dashboardState.js","webpack://superset/./src/dashboard/util/serializeFilterScopes.js","webpack://superset/./src/dashboard/actions/hydrate.js","webpack://superset/./src/dashboard/util/getEmptyLayout.js","webpack://superset/./src/dashboard/util/findFirstParentContainer.js","webpack://superset/./src/dashboard/reducers/dashboardFilters.js","webpack://superset/./src/dashboard/reducers/sliceEntities.js","webpack://superset/./src/dashboard/util/activeDashboardFilters.js","webpack://superset/./src/dashboard/util/getComponentWidthFromDrop.js","webpack://superset/./src/dashboard/util/getDetailedComponentWidth.js","webpack://superset/./src/dashboard/util/newComponentFactory.js","webpack://superset/./src/dashboard/util/serializeActiveFilterValues.js","webpack://superset/./src/dashboard/util/updateComponentParentsList.js","webpack://superset/./src/explore/controls.jsx","webpack://superset/./src/explore/exploreUtils/index.js","webpack://superset/./src/explore/store.js","webpack://superset/./src/features/reports/ReportModal/actions.js","webpack://superset/./src/utils/common.js","webpack://superset/./src/utils/dates.js","webpack://superset/./src/utils/hostNamesConfig.js","webpack://superset/./packages/superset-ui-chart-controls/src/components/CertifiedIconWithTooltip.tsx","webpack://superset/./packages/superset-ui-chart-controls/src/components/ColumnOption.tsx","webpack://superset/./packages/superset-ui-chart-controls/src/components/ColumnTypeLabel/type-icons/field_derived.svg","webpack://superset/./packages/superset-ui-chart-controls/src/components/ColumnTypeLabel/type-icons/field_boolean.svg","webpack://superset/./packages/superset-ui-chart-controls/src/components/ColumnTypeLabel/type-icons/field_abc.svg","webpack://superset/./packages/superset-ui-chart-controls/src/components/ColumnTypeLabel/type-icons/field_num.svg","webpack://superset/./packages/superset-ui-chart-controls/src/components/ColumnTypeLabel/ColumnTypeLabel.tsx","webpack://superset/./packages/superset-ui-chart-controls/src/components/ControlSubSectionHeader.tsx","webpack://superset/./packages/superset-ui-chart-controls/src/components/InfoTooltipWithTrigger.tsx","webpack://superset/./packages/superset-ui-chart-controls/src/components/MetricOption.tsx","webpack://superset/./packages/superset-ui-chart-controls/src/components/SQLPopover.tsx","webpack://superset/./packages/superset-ui-chart-controls/src/components/Tooltip.tsx","webpack://superset/./packages/superset-ui-chart-controls/src/components/labelUtils.tsx","webpack://superset/./packages/superset-ui-chart-controls/src/constants.ts","webpack://superset/./packages/superset-ui-chart-controls/src/components/ControlHeader.tsx","webpack://superset/./packages/superset-ui-chart-controls/src/shared-controls/components/index.tsx","webpack://superset/./packages/superset-ui-chart-controls/src/shared-controls/components/RadioButtonControl.tsx","webpack://superset/./packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx","webpack://superset/./packages/superset-ui-chart-controls/src/shared-controls/mixins.tsx","webpack://superset/./packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx","webpack://superset/./packages/superset-ui-chart-controls/src/types.ts","webpack://superset/./packages/superset-ui-chart-controls/src/utils/D3Formatting.ts","webpack://superset/./packages/superset-ui-chart-controls/src/utils/colorControls.ts","webpack://superset/./packages/superset-ui-chart-controls/src/utils/defineSavedMetrics.ts","webpack://superset/./packages/superset-ui-chart-controls/src/utils/displayTimeRelatedControls.ts","webpack://superset/./packages/superset-ui-chart-controls/src/utils/expandControlConfig.tsx","webpack://superset/./packages/superset-ui-chart-controls/src/utils/getStandardizedControls.ts","webpack://superset/./packages/superset-ui-chart-controls/src/utils/getTemporalColumns.ts","webpack://superset/./packages/superset-ui-chart-controls/src/utils/selectOptions.ts","webpack://superset/./packages/superset-ui-core/src/chart/registries/ChartBuildQueryRegistrySingleton.ts","webpack://superset/./packages/superset-ui-core/src/chart/registries/ChartControlPanelRegistrySingleton.ts","webpack://superset/./packages/superset-ui-core/src/chart/registries/ChartMetadataRegistrySingleton.ts","webpack://superset/./packages/superset-ui-core/src/chart/types/Base.ts","webpack://superset/./packages/superset-ui-core/src/color/CategoricalColorNamespace.ts","webpack://superset/./packages/superset-ui-core/src/color/CategoricalColorScale.ts","webpack://superset/./packages/superset-ui-core/src/color/LabelsColorMapSingleton.ts","webpack://superset/./packages/superset-ui-core/src/color/stringifyAndTrim.ts","webpack://superset/./packages/superset-ui-core/src/color/utils.ts","webpack://superset/./packages/superset-ui-core/src/components/SafeMarkdown.tsx","webpack://superset/./packages/superset-ui-core/src/hooks/usePrevious/usePrevious.ts","webpack://superset/./packages/superset-ui-core/src/hooks/useTruncation/useCSSTextTruncation.ts","webpack://superset/./packages/superset-ui-core/src/models/TypedRegistry.ts","webpack://superset/./packages/superset-ui-core/src/query/DatasourceKey.ts","webpack://superset/./packages/superset-ui-core/src/query/buildQueryContext.ts","webpack://superset/./packages/superset-ui-core/src/query/processFilters.ts","webpack://superset/./packages/superset-ui-core/src/query/buildQueryObject.ts","webpack://superset/./packages/superset-ui-core/src/query/extractExtras.ts","webpack://superset/./packages/superset-ui-core/src/query/processExtraFormData.ts","webpack://superset/./packages/superset-ui-core/src/query/constants.ts","webpack://superset/./packages/superset-ui-core/src/query/convertFilter.ts","webpack://superset/./packages/superset-ui-core/src/query/extractQueryFields.ts","webpack://superset/./packages/superset-ui-core/src/query/getClientErrorObject.ts","webpack://superset/./packages/superset-ui-core/src/query/getColumnLabel.ts","webpack://superset/./packages/superset-ui-core/src/query/getMetricLabel.ts","webpack://superset/./packages/superset-ui-core/src/query/getXAxis.ts","webpack://superset/./packages/superset-ui-core/src/query/normalizeTimeColumn.ts","webpack://superset/./packages/superset-ui-core/src/query/types/AdvancedAnalytics.ts","webpack://superset/./packages/superset-ui-core/src/query/types/Column.ts","webpack://superset/./packages/superset-ui-core/src/query/types/Dashboard.ts","webpack://superset/./packages/superset-ui-core/src/query/types/Datasource.ts","webpack://superset/./packages/superset-ui-core/src/query/types/Filter.ts","webpack://superset/./packages/superset-ui-core/src/query/types/Metric.ts","webpack://superset/./packages/superset-ui-core/src/query/types/Operator.ts","webpack://superset/./packages/superset-ui-core/src/query/types/Query.ts","webpack://superset/./packages/superset-ui-core/src/query/types/QueryFormData.ts","webpack://superset/./packages/superset-ui-core/src/query/types/QueryResponse.ts","webpack://superset/./packages/superset-ui-core/src/time-format/utils/normalizeTimestamp.ts","webpack://superset/./packages/superset-ui-core/src/ui-overrides/ExtensionsRegistry.ts","webpack://superset/./packages/superset-ui-core/src/utils/ensureIsArray.ts","webpack://superset/./packages/superset-ui-core/src/utils/html.tsx","webpack://superset/./packages/superset-ui-core/src/utils/isDefined.ts","webpack://superset/./packages/superset-ui-core/src/utils/promiseTimeout.ts","webpack://superset/./packages/superset-ui-core/src/utils/removeDuplicates.ts","webpack://superset/./packages/superset-ui-core/src/validator/legacyValidateInteger.ts","webpack://superset/./packages/superset-ui-core/src/validator/validateMaxValue.ts","webpack://superset/./packages/superset-ui-core/src/validator/validateNonEmpty.ts","webpack://superset/./src/hooks/apiResources/sqlEditorTabs.ts","webpack://superset/./src/SqlLab/components/EditorAutoSync/index.tsx","webpack://superset/./src/SqlLab/constants.ts","webpack://superset/./src/SqlLab/reducers/getInitialState.ts","webpack://superset/./src/SqlLab/types.ts","webpack://superset/./src/SqlLab/utils/reduxStateToLocalStorageHelper.ts","webpack://superset/./src/components/Button/index.tsx","webpack://superset/./src/components/Chart/chartReducer.ts","webpack://superset/./src/components/CopyToClipboard/index.tsx","webpack://superset/./src/components/ErrorMessage/ErrorAlert.tsx","webpack://superset/./src/components/ErrorMessage/ErrorMessageWithStackTrace.tsx","webpack://superset/./src/components/ErrorMessage/getErrorMessageComponentRegistry.ts","webpack://superset/./src/assets/images/icons/transparent.svg?a961","webpack://superset/./src/components/Icons/Icon.tsx","webpack://superset/./src/components/Icons/AntdEnhanced.tsx","webpack://superset/./src/components/Icons/index.tsx","webpack://superset/./src/components/Loading/index.tsx","webpack://superset/./src/components/MessageToasts/actions.ts","webpack://superset/./src/components/MessageToasts/types.ts","webpack://superset/./src/components/MessageToasts/withToasts.tsx","webpack://superset/./src/components/Modal/Modal.tsx","webpack://superset/./src/components/Select/AsyncSelect.tsx","webpack://superset/./src/components/Select/CustomTag.tsx","webpack://superset/./src/components/Select/Select.tsx","webpack://superset/./src/components/Select/constants.ts","webpack://superset/./src/utils/rankedSearchCompare.ts","webpack://superset/./src/components/Select/styles.tsx","webpack://superset/./src/components/Select/utils.tsx","webpack://superset/./src/components/Tags/Tag.tsx","webpack://superset/./src/components/Tooltip/index.tsx","webpack://superset/./src/components/UiConfigContext/index.tsx","webpack://superset/./src/dashboard/actions/dashboardInfo.ts","webpack://superset/./src/dashboard/actions/datasources.ts","webpack://superset/./src/dashboard/actions/nativeFilters.ts","webpack://superset/./src/dashboard/actions/sliceEntities.ts","webpack://superset/./src/dashboard/components/nativeFilters/FiltersConfigModal/utils.ts","webpack://superset/./src/dashboard/constants.ts","webpack://superset/./src/dashboard/reducers/nativeFilters.ts","webpack://superset/./src/dashboard/types.ts","webpack://superset/./src/dashboard/util/componentTypes.ts","webpack://superset/./src/dashboard/util/constants.ts","webpack://superset/./src/dashboard/util/crossFilters.ts","webpack://superset/./src/dashboard/util/extractUrlParams.ts","webpack://superset/./src/dashboard/util/findParentId.ts","webpack://superset/./src/dashboard/util/getChartIdsInFilterScope.ts","webpack://superset/./src/dashboard/util/getDashboardFilterKey.ts","webpack://superset/./src/dashboard/util/getLocationHash.ts","webpack://superset/./src/types/bootstrapTypes.ts","webpack://superset/./src/dashboard/util/permissionUtils.ts","webpack://superset/./src/dataMask/actions.ts","webpack://superset/./src/dataMask/reducer.ts","webpack://superset/./src/explore/actions/datasourcesActions.ts","webpack://superset/./src/explore/actions/exploreActions.ts","webpack://superset/./src/explore/actions/hydrateExplore.ts","webpack://superset/./src/explore/actions/saveModalActions.ts","webpack://superset/./src/explore/components/optionRenderers.tsx","webpack://superset/./src/explore/constants.ts","webpack://superset/./src/explore/controlPanels/sections.tsx","webpack://superset/./src/explore/controlUtils/getSectionsToRender.ts","webpack://superset/./src/explore/controlUtils/getControlConfig.ts","webpack://superset/./src/explore/controlUtils/getControlState.ts","webpack://superset/./src/explore/controlUtils/getFormDataFromControls.ts","webpack://superset/./src/explore/controlUtils/getControlValuesCompatibleWithDatasource.ts","webpack://superset/./src/explore/controlUtils/standardizedFormData.ts","webpack://superset/./src/hooks/apiResources/apiResources.ts","webpack://superset/./src/hooks/apiResources/queryApi.ts","webpack://superset/./src/hooks/apiResources/schemas.ts","webpack://superset/./src/hooks/apiResources/tables.ts","webpack://superset/./src/hooks/useDebounceValue.ts","webpack://superset/./src/hooks/useEffectEvent.ts","webpack://superset/./src/logger/LogUtils.ts","webpack://superset/./src/logger/actions/index.ts","webpack://superset/./src/middleware/asyncEvent.ts","webpack://superset/./src/reduxUtils.ts","webpack://superset/./src/utils/colorScheme.ts","webpack://superset/./src/utils/copy.ts","webpack://superset/./src/utils/findPermission.ts","webpack://superset/./src/utils/getDatasourceUid.ts","webpack://superset/./src/utils/isBot.ts","webpack://superset/./src/utils/safeStringify.ts","webpack://superset/./src/utils/urlUtils.ts","webpack://superset/./src/dashboard/util/componentIsResizable.ts","webpack://superset/./src/dashboard/util/shouldWrapChildInRow.js","webpack://superset/./src/dashboard/util/newEntitiesFromDrop.js","webpack://superset/./src/dashboard/reducers/dashboardLayout.js","webpack://superset/./src/dashboard/util/dnd-reorder.js","webpack://superset/./src/dashboard/reducers/undoableDashboardLayout.js","webpack://superset/./src/utils/DebouncedMessageQueue.js","webpack://superset/./src/middleware/loggerMiddleware.js","webpack://superset/./src/SqlLab/middlewares/persistSqlLabStateEnhancer.js","webpack://superset/./src/SqlLab/reducers/sqlLab.js","webpack://superset/./src/views/store.ts","webpack://superset/./src/components/MessageToasts/reducers.js","webpack://superset/./src/dashboard/reducers/datasources.ts","webpack://superset/./src/explore/reducers/datasourcesReducer.ts","webpack://superset/./src/dashboard/reducers/dashboardInfo.js","webpack://superset/./src/dashboard/reducers/dashboardState.js","webpack://superset/./src/features/reports/ReportModal/reducer.js","webpack://superset/./src/explore/reducers/saveModalReducer.js","webpack://superset/./src/explore/reducers/exploreReducer.js","webpack://superset/ ^\\.\\/.*\\.svg$ namespace object"],"sourcesContent":["/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { t } from '@superset-ui/core';\nimport { QueryEditor } from '../types';\n\nconst untitledQueryRegex = /^Untitled Query (\\d+)$/; // Literal notation isn't recompiled\nconst untitledQuery = 'Untitled Query ';\n\nexport const newQueryTabName = (\n queryEditors: QueryEditor[],\n initialTitle = `${untitledQuery}1`,\n): string => {\n const resultTitle = t(initialTitle);\n\n if (queryEditors.length > 0) {\n const mappedUntitled = queryEditors.filter(\n qe => qe.name?.match(untitledQueryRegex),\n );\n const untitledQueryNumbers = mappedUntitled.map(\n qe => +qe.name.replace(untitledQuery, ''),\n );\n if (untitledQueryNumbers.length > 0) {\n // When there are query tabs open, and at least one is called \"Untitled Query #\"\n // Where # is a valid number\n const largestNumber: number = Math.max(...untitledQueryNumbers);\n return t('%s%s', untitledQuery, largestNumber + 1);\n }\n return resultTitle;\n }\n\n return resultTitle;\n};\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { nanoid } from 'nanoid';\nimport rison from 'rison';\nimport {\n FeatureFlag,\n SupersetClient,\n t,\n isFeatureEnabled,\n COMMON_ERR_MESSAGES,\n getClientErrorObject,\n} from '@superset-ui/core';\nimport { invert, mapKeys } from 'lodash';\n\nimport { now } from 'src/utils/dates';\nimport {\n addDangerToast as addDangerToastAction,\n addInfoToast as addInfoToastAction,\n addSuccessToast as addSuccessToastAction,\n addWarningToast as addWarningToastAction,\n} from 'src/components/MessageToasts/actions';\nimport { LOG_ACTIONS_SQLLAB_FETCH_FAILED_QUERY } from 'src/logger/LogUtils';\nimport getBootstrapData from 'src/utils/getBootstrapData';\nimport { logEvent } from 'src/logger/actions';\nimport { newQueryTabName } from '../utils/newQueryTabName';\nimport getInitialState from '../reducers/getInitialState';\nimport { rehydratePersistedState } from '../utils/reduxStateToLocalStorageHelper';\n\nexport const RESET_STATE = 'RESET_STATE';\nexport const ADD_QUERY_EDITOR = 'ADD_QUERY_EDITOR';\nexport const UPDATE_QUERY_EDITOR = 'UPDATE_QUERY_EDITOR';\nexport const QUERY_EDITOR_SAVED = 'QUERY_EDITOR_SAVED';\nexport const CLONE_QUERY_TO_NEW_TAB = 'CLONE_QUERY_TO_NEW_TAB';\nexport const REMOVE_QUERY_EDITOR = 'REMOVE_QUERY_EDITOR';\nexport const MERGE_TABLE = 'MERGE_TABLE';\nexport const REMOVE_TABLES = 'REMOVE_TABLES';\nexport const END_QUERY = 'END_QUERY';\nexport const REMOVE_QUERY = 'REMOVE_QUERY';\nexport const EXPAND_TABLE = 'EXPAND_TABLE';\nexport const COLLAPSE_TABLE = 'COLLAPSE_TABLE';\nexport const QUERY_EDITOR_SETDB = 'QUERY_EDITOR_SETDB';\nexport const QUERY_EDITOR_SET_CATALOG = 'QUERY_EDITOR_SET_CATALOG';\nexport const QUERY_EDITOR_SET_SCHEMA = 'QUERY_EDITOR_SET_SCHEMA';\nexport const QUERY_EDITOR_SET_TITLE = 'QUERY_EDITOR_SET_TITLE';\nexport const QUERY_EDITOR_SET_AUTORUN = 'QUERY_EDITOR_SET_AUTORUN';\nexport const QUERY_EDITOR_SET_SQL = 'QUERY_EDITOR_SET_SQL';\nexport const QUERY_EDITOR_SET_CURSOR_POSITION =\n 'QUERY_EDITOR_SET_CURSOR_POSITION';\nexport const QUERY_EDITOR_SET_QUERY_LIMIT = 'QUERY_EDITOR_SET_QUERY_LIMIT';\nexport const QUERY_EDITOR_SET_TEMPLATE_PARAMS =\n 'QUERY_EDITOR_SET_TEMPLATE_PARAMS';\nexport const QUERY_EDITOR_SET_SELECTED_TEXT = 'QUERY_EDITOR_SET_SELECTED_TEXT';\nexport const QUERY_EDITOR_SET_FUNCTION_NAMES =\n 'QUERY_EDITOR_SET_FUNCTION_NAMES';\nexport const QUERY_EDITOR_PERSIST_HEIGHT = 'QUERY_EDITOR_PERSIST_HEIGHT';\nexport const QUERY_EDITOR_TOGGLE_LEFT_BAR = 'QUERY_EDITOR_TOGGLE_LEFT_BAR';\nexport const MIGRATE_QUERY_EDITOR = 'MIGRATE_QUERY_EDITOR';\nexport const MIGRATE_TAB_HISTORY = 'MIGRATE_TAB_HISTORY';\nexport const MIGRATE_TABLE = 'MIGRATE_TABLE';\nexport const MIGRATE_QUERY = 'MIGRATE_QUERY';\n\nexport const SET_DATABASES = 'SET_DATABASES';\nexport const SET_ACTIVE_QUERY_EDITOR = 'SET_ACTIVE_QUERY_EDITOR';\nexport const LOAD_QUERY_EDITOR = 'LOAD_QUERY_EDITOR';\nexport const SET_TABLES = 'SET_TABLES';\nexport const SET_ACTIVE_SOUTHPANE_TAB = 'SET_ACTIVE_SOUTHPANE_TAB';\nexport const REFRESH_QUERIES = 'REFRESH_QUERIES';\nexport const SET_USER_OFFLINE = 'SET_USER_OFFLINE';\nexport const RUN_QUERY = 'RUN_QUERY';\nexport const START_QUERY = 'START_QUERY';\nexport const STOP_QUERY = 'STOP_QUERY';\nexport const REQUEST_QUERY_RESULTS = 'REQUEST_QUERY_RESULTS';\nexport const QUERY_SUCCESS = 'QUERY_SUCCESS';\nexport const QUERY_FAILED = 'QUERY_FAILED';\nexport const CLEAR_INACTIVE_QUERIES = 'CLEAR_INACTIVE_QUERIES';\nexport const CLEAR_QUERY_RESULTS = 'CLEAR_QUERY_RESULTS';\nexport const REMOVE_DATA_PREVIEW = 'REMOVE_DATA_PREVIEW';\nexport const CHANGE_DATA_PREVIEW_ID = 'CHANGE_DATA_PREVIEW_ID';\n\nexport const COST_ESTIMATE_STARTED = 'COST_ESTIMATE_STARTED';\nexport const COST_ESTIMATE_RETURNED = 'COST_ESTIMATE_RETURNED';\nexport const COST_ESTIMATE_FAILED = 'COST_ESTIMATE_FAILED';\n\nexport const CREATE_DATASOURCE_STARTED = 'CREATE_DATASOURCE_STARTED';\nexport const CREATE_DATASOURCE_SUCCESS = 'CREATE_DATASOURCE_SUCCESS';\nexport const CREATE_DATASOURCE_FAILED = 'CREATE_DATASOURCE_FAILED';\n\nexport const SET_EDITOR_TAB_LAST_UPDATE = 'SET_EDITOR_TAB_LAST_UPDATE';\nexport const SET_LAST_UPDATED_ACTIVE_TAB = 'SET_LAST_UPDATED_ACTIVE_TAB';\nexport const CLEAR_DESTROYED_QUERY_EDITOR = 'CLEAR_DESTROYED_QUERY_EDITOR';\n\nexport const addInfoToast = addInfoToastAction;\nexport const addSuccessToast = addSuccessToastAction;\nexport const addDangerToast = addDangerToastAction;\nexport const addWarningToast = addWarningToastAction;\n\nexport const CtasEnum = {\n Table: 'TABLE',\n View: 'VIEW',\n};\nconst ERR_MSG_CANT_LOAD_QUERY = t(\"The query couldn't be loaded\");\n\n// a map of SavedQuery field names to the different names used client-side,\n// because for now making the names consistent is too complicated\n// so it might as well only happen in one place\nconst queryClientMapping = {\n id: 'remoteId',\n db_id: 'dbId',\n label: 'name',\n template_parameters: 'templateParams',\n};\nconst queryServerMapping = invert(queryClientMapping);\n\n// uses a mapping like those above to convert object key names to another style\nconst fieldConverter = mapping => obj =>\n mapKeys(obj, (value, key) => (key in mapping ? mapping[key] : key));\n\nexport const convertQueryToServer = fieldConverter(queryServerMapping);\nexport const convertQueryToClient = fieldConverter(queryClientMapping);\n\nexport function getUpToDateQuery(rootState, queryEditor, key) {\n const {\n sqlLab: { unsavedQueryEditor, queryEditors },\n } = rootState;\n const id = key ?? queryEditor.id;\n return {\n id,\n ...queryEditors.find(qe => qe.id === id),\n ...(id === unsavedQueryEditor.id && unsavedQueryEditor),\n };\n}\n\nexport function resetState(data) {\n return (dispatch, getState) => {\n const { common } = getState();\n const initialState = getInitialState({\n ...getBootstrapData(),\n common,\n ...data,\n });\n\n dispatch({\n type: RESET_STATE,\n sqlLabInitialState: initialState.sqlLab,\n });\n rehydratePersistedState(dispatch, initialState);\n };\n}\n\nexport function updateQueryEditor(alterations) {\n return { type: UPDATE_QUERY_EDITOR, alterations };\n}\n\nexport function setEditorTabLastUpdate(timestamp) {\n return { type: SET_EDITOR_TAB_LAST_UPDATE, timestamp };\n}\n\nexport function scheduleQuery(query) {\n return dispatch =>\n SupersetClient.post({\n endpoint: '/api/v1/saved_query/',\n jsonPayload: query,\n stringify: false,\n })\n .then(() =>\n dispatch(\n addSuccessToast(\n t(\n 'Your query has been scheduled. To see details of your query, navigate to Saved queries',\n ),\n ),\n ),\n )\n .catch(() =>\n dispatch(addDangerToast(t('Your query could not be scheduled'))),\n );\n}\n\nexport function estimateQueryCost(queryEditor) {\n return (dispatch, getState) => {\n const { dbId, catalog, schema, sql, selectedText, templateParams } =\n getUpToDateQuery(getState(), queryEditor);\n const requestSql = selectedText || sql;\n\n const postPayload = {\n database_id: dbId,\n catalog,\n schema,\n sql: requestSql,\n template_params: JSON.parse(templateParams || '{}'),\n };\n\n return Promise.all([\n dispatch({ type: COST_ESTIMATE_STARTED, query: queryEditor }),\n SupersetClient.post({\n endpoint: '/api/v1/sqllab/estimate/',\n body: JSON.stringify(postPayload),\n headers: { 'Content-Type': 'application/json' },\n })\n .then(({ json }) =>\n dispatch({ type: COST_ESTIMATE_RETURNED, query: queryEditor, json }),\n )\n .catch(response =>\n getClientErrorObject(response).then(error => {\n const message =\n error.error ||\n error.statusText ||\n t('Failed at retrieving results');\n return dispatch({\n type: COST_ESTIMATE_FAILED,\n query: queryEditor,\n error: message,\n });\n }),\n ),\n ]);\n };\n}\n\nexport function clearInactiveQueries(interval) {\n return { type: CLEAR_INACTIVE_QUERIES, interval };\n}\n\nexport function startQuery(query) {\n Object.assign(query, {\n id: query.id ? query.id : nanoid(11),\n progress: 0,\n startDttm: now(),\n state: query.runAsync ? 'pending' : 'running',\n cached: false,\n });\n return { type: START_QUERY, query };\n}\n\nexport function querySuccess(query, results) {\n return { type: QUERY_SUCCESS, query, results };\n}\n\nexport function queryFailed(query, msg, link, errors) {\n return function (dispatch) {\n const eventData = {\n has_err: true,\n start_offset: query.startDttm,\n ts: new Date().getTime(),\n };\n errors?.forEach(({ error_type: errorType, extra }) => {\n const messages = extra?.issue_codes?.map(({ message }) => message) || [\n errorType,\n ];\n messages.forEach(message => {\n dispatch(\n logEvent(LOG_ACTIONS_SQLLAB_FETCH_FAILED_QUERY, {\n ...eventData,\n error_type: errorType,\n error_details: message,\n }),\n );\n });\n });\n\n dispatch({ type: QUERY_FAILED, query, msg, link, errors });\n };\n}\n\nexport function stopQuery(query) {\n return { type: STOP_QUERY, query };\n}\n\nexport function clearQueryResults(query) {\n return { type: CLEAR_QUERY_RESULTS, query };\n}\n\nexport function removeDataPreview(table) {\n return { type: REMOVE_DATA_PREVIEW, table };\n}\n\nexport function requestQueryResults(query) {\n return { type: REQUEST_QUERY_RESULTS, query };\n}\n\nexport function fetchQueryResults(query, displayLimit, timeoutInMs) {\n return function (dispatch, getState) {\n const { SQLLAB_QUERY_RESULT_TIMEOUT } = getState().common?.conf ?? {};\n dispatch(requestQueryResults(query));\n\n const queryParams = rison.encode({\n key: query.resultsKey,\n rows: displayLimit || null,\n });\n const timeout = timeoutInMs ?? SQLLAB_QUERY_RESULT_TIMEOUT;\n const controller = new AbortController();\n return SupersetClient.get({\n endpoint: `/api/v1/sqllab/results/?q=${queryParams}`,\n parseMethod: 'json-bigint',\n ...(timeout && { timeout, signal: controller.signal }),\n })\n .then(({ json }) => dispatch(querySuccess(query, json)))\n .catch(response => {\n controller.abort();\n getClientErrorObject(response).then(error => {\n const message =\n error.error ||\n error.statusText ||\n t('Failed at retrieving results');\n\n return dispatch(\n queryFailed(query, message, error.link, error.errors),\n );\n });\n });\n };\n}\n\nexport function runQuery(query) {\n return function (dispatch) {\n dispatch(startQuery(query));\n const postPayload = {\n client_id: query.id,\n database_id: query.dbId,\n json: true,\n runAsync: query.runAsync,\n catalog: query.catalog,\n schema: query.schema,\n sql: query.sql,\n sql_editor_id: query.sqlEditorId,\n tab: query.tab,\n tmp_table_name: query.tempTable,\n select_as_cta: query.ctas,\n ctas_method: query.ctas_method,\n templateParams: query.templateParams,\n queryLimit: query.queryLimit,\n expand_data: true,\n };\n\n const search = window.location.search || '';\n return SupersetClient.post({\n endpoint: `/api/v1/sqllab/execute/${search}`,\n body: JSON.stringify(postPayload),\n headers: { 'Content-Type': 'application/json' },\n parseMethod: 'json-bigint',\n })\n .then(({ json }) => {\n if (!query.runAsync) {\n dispatch(querySuccess(query, json));\n }\n })\n .catch(response =>\n getClientErrorObject(response).then(error => {\n let message =\n error.error ||\n error.message ||\n error.statusText ||\n t('Unknown error');\n if (message.includes('CSRF token')) {\n message = t(COMMON_ERR_MESSAGES.SESSION_TIMED_OUT);\n }\n dispatch(queryFailed(query, message, error.link, error.errors));\n }),\n );\n };\n}\n\nexport function runQueryFromSqlEditor(\n database,\n queryEditor,\n defaultQueryLimit,\n tempTable,\n ctas,\n ctasMethod,\n) {\n return function (dispatch, getState) {\n const qe = getUpToDateQuery(getState(), queryEditor, queryEditor.id);\n const query = {\n dbId: qe.dbId,\n sql: qe.selectedText || qe.sql,\n sqlEditorId: qe.id,\n tab: qe.name,\n catalog: qe.catalog,\n schema: qe.schema,\n tempTable,\n templateParams: qe.templateParams,\n queryLimit: qe.queryLimit || defaultQueryLimit,\n runAsync: database ? database.allow_run_async : false,\n ctas,\n ctas_method: ctasMethod,\n updateTabState: !qe.selectedText,\n };\n dispatch(runQuery(query));\n };\n}\n\nexport function reRunQuery(query) {\n // run Query with a new id\n return function (dispatch) {\n dispatch(runQuery({ ...query, id: nanoid(11) }));\n };\n}\n\nexport function postStopQuery(query) {\n return function (dispatch) {\n return SupersetClient.post({\n endpoint: '/api/v1/query/stop',\n body: JSON.stringify({ client_id: query.id }),\n headers: { 'Content-Type': 'application/json' },\n })\n .then(() => dispatch(stopQuery(query)))\n .then(() => dispatch(addSuccessToast(t('Query was stopped.'))))\n .catch(() =>\n dispatch(addDangerToast(t('Failed at stopping query. %s', query.id))),\n );\n };\n}\n\nexport function setDatabases(databases) {\n return { type: SET_DATABASES, databases };\n}\n\nfunction migrateTable(table, queryEditorId, dispatch) {\n return SupersetClient.post({\n endpoint: encodeURI('/tableschemaview/'),\n postPayload: { table: { ...table, queryEditorId } },\n })\n .then(({ json }) => {\n const newTable = {\n ...table,\n id: json.id,\n queryEditorId,\n };\n return dispatch({ type: MIGRATE_TABLE, oldTable: table, newTable });\n })\n .catch(() =>\n dispatch(\n addWarningToast(\n t(\n 'Unable to migrate table schema state to backend. Superset will retry ' +\n 'later. Please contact your administrator if this problem persists.',\n ),\n ),\n ),\n );\n}\n\nfunction migrateQuery(queryId, queryEditorId, dispatch) {\n return SupersetClient.post({\n endpoint: encodeURI(`/tabstateview/${queryEditorId}/migrate_query`),\n postPayload: { queryId },\n })\n .then(() => dispatch({ type: MIGRATE_QUERY, queryId, queryEditorId }))\n .catch(() =>\n dispatch(\n addWarningToast(\n t(\n 'Unable to migrate query state to backend. Superset will retry later. ' +\n 'Please contact your administrator if this problem persists.',\n ),\n ),\n ),\n );\n}\n\n/**\n * Persist QueryEditor from local storage to backend tab state.\n * This ensures that when new tabs are created, query editors are\n * asynchronously stored in local storage and periodically synchronized\n * with the backend.\n * When switching to persistence mode, the QueryEditors previously\n * stored in local storage will also be synchronized to the backend\n * through syncQueryEditor.\n */\nexport function syncQueryEditor(queryEditor) {\n return function (dispatch, getState) {\n const { tables, queries } = getState().sqlLab;\n const localStorageTables = tables.filter(\n table => table.inLocalStorage && table.queryEditorId === queryEditor.id,\n );\n const localStorageQueries = Object.values(queries).filter(\n query => query.inLocalStorage && query.sqlEditorId === queryEditor.id,\n );\n return SupersetClient.post({\n endpoint: '/tabstateview/',\n postPayload: { queryEditor },\n })\n .then(({ json }) => {\n const newQueryEditor = {\n ...queryEditor,\n id: json.id.toString(),\n inLocalStorage: false,\n loaded: true,\n };\n dispatch({\n type: MIGRATE_QUERY_EDITOR,\n oldQueryEditor: queryEditor,\n newQueryEditor,\n });\n dispatch({\n type: MIGRATE_TAB_HISTORY,\n oldId: queryEditor.id,\n newId: newQueryEditor.id,\n });\n return Promise.all([\n ...localStorageTables.map(table =>\n migrateTable(table, newQueryEditor.id, dispatch),\n ),\n ...localStorageQueries.map(query =>\n migrateQuery(query.id, newQueryEditor.id, dispatch),\n ),\n ]);\n })\n .catch(() =>\n dispatch(\n addWarningToast(\n t(\n 'Unable to migrate query editor state to backend. Superset will retry ' +\n 'later. Please contact your administrator if this problem persists.',\n ),\n ),\n ),\n );\n };\n}\n\nexport function addQueryEditor(queryEditor) {\n const newQueryEditor = {\n ...queryEditor,\n id: nanoid(11),\n loaded: true,\n inLocalStorage: true,\n };\n return {\n type: ADD_QUERY_EDITOR,\n queryEditor: newQueryEditor,\n };\n}\n\nexport function addNewQueryEditor() {\n return function (dispatch, getState) {\n const {\n sqlLab: { queryEditors, tabHistory, unsavedQueryEditor, databases },\n common,\n } = getState();\n const defaultDbId = common.conf.SQLLAB_DEFAULT_DBID;\n const activeQueryEditor = queryEditors.find(\n qe => qe.id === tabHistory[tabHistory.length - 1],\n );\n const dbIds = Object.values(databases).map(database => database.id);\n const firstDbId = dbIds.length > 0 ? Math.min(...dbIds) : undefined;\n const { dbId, catalog, schema, queryLimit, autorun } = {\n ...queryEditors[0],\n ...activeQueryEditor,\n ...(unsavedQueryEditor.id === activeQueryEditor?.id &&\n unsavedQueryEditor),\n };\n const warning = isFeatureEnabled(FeatureFlag.SqllabBackendPersistence)\n ? ''\n : t(\n '-- Note: Unless you save your query, these tabs will NOT persist if you clear your cookies or change browsers.\\n\\n',\n );\n\n const name = newQueryTabName(\n queryEditors?.map(qe => ({\n ...qe,\n ...(qe.id === unsavedQueryEditor.id && unsavedQueryEditor),\n })) || [],\n );\n\n return dispatch(\n addQueryEditor({\n dbId: dbId || defaultDbId || firstDbId,\n catalog: catalog ?? null,\n schema: schema ?? null,\n autorun: autorun ?? false,\n sql: `${warning}SELECT ...`,\n queryLimit: queryLimit || common.conf.DEFAULT_SQLLAB_LIMIT,\n name,\n }),\n );\n };\n}\n\nexport function cloneQueryToNewTab(query, autorun) {\n return function (dispatch, getState) {\n const state = getState();\n const { queryEditors, unsavedQueryEditor, tabHistory } = state.sqlLab;\n const sourceQueryEditor = {\n ...queryEditors.find(qe => qe.id === tabHistory[tabHistory.length - 1]),\n ...(tabHistory[tabHistory.length - 1] === unsavedQueryEditor.id &&\n unsavedQueryEditor),\n };\n const queryEditor = {\n name: t('Copy of %s', sourceQueryEditor.name),\n dbId: query.dbId ? query.dbId : null,\n catalog: query.catalog ? query.catalog : null,\n schema: query.schema ? query.schema : null,\n autorun,\n sql: query.sql,\n queryLimit: sourceQueryEditor.queryLimit,\n maxRow: sourceQueryEditor.maxRow,\n templateParams: sourceQueryEditor.templateParams,\n };\n return dispatch(addQueryEditor(queryEditor));\n };\n}\n\nexport function setLastUpdatedActiveTab(queryEditorId) {\n return {\n type: SET_LAST_UPDATED_ACTIVE_TAB,\n queryEditorId,\n };\n}\n\nexport function setActiveQueryEditor(queryEditor) {\n return {\n type: SET_ACTIVE_QUERY_EDITOR,\n queryEditor,\n };\n}\n\nexport function switchQueryEditor(goBackward = false) {\n return function (dispatch, getState) {\n const { sqlLab } = getState();\n const { queryEditors, tabHistory } = sqlLab;\n const qeid = tabHistory[tabHistory.length - 1];\n const currentIndex = queryEditors.findIndex(qe => qe.id === qeid);\n const nextIndex = goBackward\n ? currentIndex - 1 + queryEditors.length\n : currentIndex + 1;\n const newQueryEditor = queryEditors[nextIndex % queryEditors.length];\n\n dispatch(setActiveQueryEditor(newQueryEditor));\n };\n}\n\nexport function loadQueryEditor(queryEditor) {\n return { type: LOAD_QUERY_EDITOR, queryEditor };\n}\n\nexport function setTables(tableSchemas) {\n const tables = tableSchemas\n .filter(tableSchema => tableSchema.description !== null)\n .map(tableSchema => {\n const {\n columns,\n selectStar,\n primaryKey,\n foreignKeys,\n indexes,\n dataPreviewQueryId,\n } = tableSchema.description;\n return {\n dbId: tableSchema.database_id,\n queryEditorId: tableSchema.tab_state_id.toString(),\n catalog: tableSchema.catalog,\n schema: tableSchema.schema,\n name: tableSchema.table,\n expanded: tableSchema.expanded,\n id: tableSchema.id,\n dataPreviewQueryId,\n columns,\n selectStar,\n primaryKey,\n foreignKeys,\n indexes,\n isMetadataLoading: false,\n isExtraMetadataLoading: false,\n };\n });\n return { type: SET_TABLES, tables };\n}\n\nexport function fetchQueryEditor(queryEditor, displayLimit) {\n return function (dispatch) {\n SupersetClient.get({\n endpoint: encodeURI(`/tabstateview/${queryEditor.id}`),\n })\n .then(({ json }) => {\n const loadedQueryEditor = {\n id: json.id.toString(),\n loaded: true,\n name: json.label,\n sql: json.sql,\n selectedText: null,\n latestQueryId: json.latest_query?.id,\n autorun: json.autorun,\n dbId: json.database_id,\n templateParams: json.template_params,\n catalog: json.catalog,\n schema: json.schema,\n queryLimit: json.query_limit,\n remoteId: json.saved_query?.id,\n hideLeftBar: json.hide_left_bar,\n };\n dispatch(loadQueryEditor(loadedQueryEditor));\n dispatch(setTables(json.table_schemas || []));\n if (json.latest_query && json.latest_query.resultsKey) {\n dispatch(fetchQueryResults(json.latest_query, displayLimit));\n }\n })\n .catch(response => {\n if (response.status !== 404) {\n return dispatch(\n addDangerToast(t('An error occurred while fetching tab state')),\n );\n }\n return dispatch({ type: REMOVE_QUERY_EDITOR, queryEditor });\n });\n };\n}\n\nexport function setActiveSouthPaneTab(tabId) {\n return { type: SET_ACTIVE_SOUTHPANE_TAB, tabId };\n}\n\nexport function toggleLeftBar(queryEditor) {\n const hideLeftBar = !queryEditor.hideLeftBar;\n return {\n type: QUERY_EDITOR_TOGGLE_LEFT_BAR,\n queryEditor,\n hideLeftBar,\n };\n}\n\nexport function clearDestoryedQueryEditor(queryEditorId) {\n return { type: CLEAR_DESTROYED_QUERY_EDITOR, queryEditorId };\n}\n\nexport function removeQueryEditor(queryEditor) {\n return { type: REMOVE_QUERY_EDITOR, queryEditor };\n}\n\nexport function removeAllOtherQueryEditors(queryEditor) {\n return function (dispatch, getState) {\n const { sqlLab } = getState();\n sqlLab.queryEditors?.forEach(otherQueryEditor => {\n if (otherQueryEditor.id !== queryEditor.id) {\n dispatch(removeQueryEditor(otherQueryEditor));\n }\n });\n };\n}\n\nexport function removeQuery(query) {\n return function (dispatch) {\n const sync = isFeatureEnabled(FeatureFlag.SqllabBackendPersistence)\n ? SupersetClient.delete({\n endpoint: encodeURI(\n `/tabstateview/${query.sqlEditorId}/query/${query.id}`,\n ),\n })\n : Promise.resolve();\n\n return sync\n .then(() => dispatch({ type: REMOVE_QUERY, query }))\n .catch(() =>\n dispatch(\n addDangerToast(\n t(\n 'An error occurred while removing query. Please contact your administrator.',\n ),\n ),\n ),\n );\n };\n}\n\nexport function queryEditorSetDb(queryEditor, dbId) {\n return { type: QUERY_EDITOR_SETDB, queryEditor, dbId };\n}\n\nexport function queryEditorSetCatalog(queryEditor, catalog) {\n return {\n type: QUERY_EDITOR_SET_CATALOG,\n queryEditor: queryEditor || {},\n catalog,\n };\n}\n\nexport function queryEditorSetSchema(queryEditor, schema) {\n return {\n type: QUERY_EDITOR_SET_SCHEMA,\n queryEditor: queryEditor || {},\n schema,\n };\n}\n\nexport function queryEditorSetAutorun(queryEditor, autorun) {\n return { type: QUERY_EDITOR_SET_AUTORUN, queryEditor, autorun };\n}\n\nexport function queryEditorSetTitle(queryEditor, name, id) {\n return {\n type: QUERY_EDITOR_SET_TITLE,\n queryEditor: { ...queryEditor, id },\n name,\n };\n}\n\nexport function saveQuery(query, clientId) {\n const { id, ...payload } = convertQueryToServer(query);\n\n return dispatch =>\n SupersetClient.post({\n endpoint: '/api/v1/saved_query/',\n jsonPayload: convertQueryToServer(payload),\n })\n .then(result => {\n const savedQuery = convertQueryToClient({\n id: result.json.id,\n ...result.json.result,\n });\n dispatch({\n type: QUERY_EDITOR_SAVED,\n query,\n clientId,\n result: savedQuery,\n });\n dispatch(queryEditorSetTitle(query, query.name, clientId));\n return savedQuery;\n })\n .catch(() =>\n dispatch(addDangerToast(t('Your query could not be saved'))),\n );\n}\n\nexport const addSavedQueryToTabState =\n (queryEditor, savedQuery) => dispatch => {\n const sync = isFeatureEnabled(FeatureFlag.SqllabBackendPersistence)\n ? SupersetClient.put({\n endpoint: `/tabstateview/${queryEditor.id}`,\n postPayload: { saved_query_id: savedQuery.remoteId },\n })\n : Promise.resolve();\n\n return sync\n .catch(() => {\n dispatch(addDangerToast(t('Your query was not properly saved')));\n })\n .then(() => {\n dispatch(addSuccessToast(t('Your query was saved')));\n });\n };\n\nexport function updateSavedQuery(query, clientId) {\n const { id, ...payload } = convertQueryToServer(query);\n\n return dispatch =>\n SupersetClient.put({\n endpoint: `/api/v1/saved_query/${query.remoteId}`,\n jsonPayload: convertQueryToServer(payload),\n })\n .then(() => {\n dispatch(addSuccessToast(t('Your query was updated')));\n dispatch(queryEditorSetTitle(query, query.name, clientId));\n })\n .catch(e => {\n const message = t('Your query could not be updated');\n // eslint-disable-next-line no-console\n console.error(message, e);\n dispatch(addDangerToast(message));\n })\n .then(() => dispatch(updateQueryEditor(query)));\n}\n\nexport function queryEditorSetSql(queryEditor, sql, queryId) {\n return { type: QUERY_EDITOR_SET_SQL, queryEditor, sql, queryId };\n}\n\nexport function queryEditorSetCursorPosition(queryEditor, position) {\n return { type: QUERY_EDITOR_SET_CURSOR_POSITION, queryEditor, position };\n}\n\nexport function queryEditorSetAndSaveSql(targetQueryEditor, sql, queryId) {\n return function (dispatch, getState) {\n const queryEditor = getUpToDateQuery(getState(), targetQueryEditor);\n // saved query and set tab state use this action\n dispatch(queryEditorSetSql(queryEditor, sql, queryId));\n if (isFeatureEnabled(FeatureFlag.SqllabBackendPersistence)) {\n return SupersetClient.put({\n endpoint: encodeURI(`/tabstateview/${queryEditor.id}`),\n postPayload: { sql, latest_query_id: queryId },\n }).catch(() =>\n dispatch(\n addDangerToast(\n t(\n 'An error occurred while storing your query in the backend. To ' +\n 'avoid losing your changes, please save your query using the ' +\n '\"Save Query\" button.',\n ),\n ),\n ),\n );\n }\n return Promise.resolve();\n };\n}\n\nexport function formatQuery(queryEditor) {\n return function (dispatch, getState) {\n const { sql } = getUpToDateQuery(getState(), queryEditor);\n return SupersetClient.post({\n endpoint: `/api/v1/sqllab/format_sql/`,\n // TODO (betodealmeida): pass engine as a parameter for better formatting\n body: JSON.stringify({ sql }),\n headers: { 'Content-Type': 'application/json' },\n }).then(({ json }) => {\n dispatch(queryEditorSetSql(queryEditor, json.result));\n });\n };\n}\n\nexport function queryEditorSetQueryLimit(queryEditor, queryLimit) {\n return {\n type: QUERY_EDITOR_SET_QUERY_LIMIT,\n queryEditor,\n queryLimit,\n };\n}\n\nexport function queryEditorSetTemplateParams(queryEditor, templateParams) {\n return {\n type: QUERY_EDITOR_SET_TEMPLATE_PARAMS,\n queryEditor,\n templateParams,\n };\n}\n\nexport function queryEditorSetSelectedText(queryEditor, sql) {\n return { type: QUERY_EDITOR_SET_SELECTED_TEXT, queryEditor, sql };\n}\n\nexport function mergeTable(table, query, prepend) {\n return { type: MERGE_TABLE, table, query, prepend };\n}\n\nexport function addTable(queryEditor, tableName, catalogName, schemaName) {\n return function (dispatch, getState) {\n const query = getUpToDateQuery(getState(), queryEditor, queryEditor.id);\n const table = {\n dbId: query.dbId,\n queryEditorId: query.id,\n catalog: catalogName,\n schema: schemaName,\n name: tableName,\n };\n dispatch(\n mergeTable(\n {\n ...table,\n id: nanoid(11),\n expanded: true,\n },\n null,\n true,\n ),\n );\n };\n}\n\nexport function runTablePreviewQuery(newTable) {\n return function (dispatch, getState) {\n const {\n sqlLab: { databases },\n } = getState();\n const database = databases[newTable.dbId];\n const { dbId, catalog, schema } = newTable;\n\n if (database && !database.disable_data_preview) {\n const dataPreviewQuery = {\n id: nanoid(11),\n dbId,\n catalog,\n schema,\n sql: newTable.selectStar,\n tableName: newTable.name,\n sqlEditorId: null,\n tab: '',\n runAsync: database.allow_run_async,\n ctas: false,\n isDataPreview: true,\n };\n return Promise.all([\n dispatch(\n mergeTable(\n {\n id: newTable.id,\n dbId: newTable.dbId,\n catalog: newTable.catalog,\n schema: newTable.schema,\n name: newTable.name,\n queryEditorId: newTable.queryEditorId,\n dataPreviewQueryId: dataPreviewQuery.id,\n },\n dataPreviewQuery,\n ),\n ),\n dispatch(runQuery(dataPreviewQuery)),\n ]);\n }\n return Promise.resolve();\n };\n}\n\nexport function syncTable(table, tableMetadata) {\n return function (dispatch) {\n const sync = isFeatureEnabled(FeatureFlag.SqllabBackendPersistence)\n ? SupersetClient.post({\n endpoint: encodeURI('/tableschemaview/'),\n postPayload: { table: { ...tableMetadata, ...table } },\n })\n : Promise.resolve({ json: { id: table.id } });\n\n return sync\n .then(({ json: resultJson }) => {\n const newTable = { ...table, id: resultJson.id };\n dispatch(\n mergeTable({\n ...newTable,\n expanded: true,\n initialized: true,\n }),\n );\n if (!table.dataPreviewQueryId) {\n dispatch(runTablePreviewQuery({ ...tableMetadata, ...newTable }));\n }\n })\n .catch(() =>\n dispatch(\n addDangerToast(\n t(\n 'An error occurred while fetching table metadata. ' +\n 'Please contact your administrator.',\n ),\n ),\n ),\n );\n };\n}\n\nexport function changeDataPreviewId(oldQueryId, newQuery) {\n return { type: CHANGE_DATA_PREVIEW_ID, oldQueryId, newQuery };\n}\n\nexport function reFetchQueryResults(query) {\n return function (dispatch) {\n const newQuery = {\n id: nanoid(),\n dbId: query.dbId,\n sql: query.sql,\n tableName: query.tableName,\n sqlEditorId: null,\n tab: '',\n runAsync: false,\n ctas: false,\n queryLimit: query.queryLimit,\n isDataPreview: query.isDataPreview,\n };\n dispatch(runQuery(newQuery));\n dispatch(changeDataPreviewId(query.id, newQuery));\n };\n}\n\nexport function expandTable(table) {\n return function (dispatch) {\n const sync = isFeatureEnabled(FeatureFlag.SqllabBackendPersistence)\n ? SupersetClient.post({\n endpoint: encodeURI(`/tableschemaview/${table.id}/expanded`),\n postPayload: { expanded: true },\n })\n : Promise.resolve();\n\n return sync\n .then(() => dispatch({ type: EXPAND_TABLE, table }))\n .catch(() =>\n dispatch(\n addDangerToast(\n t(\n 'An error occurred while expanding the table schema. ' +\n 'Please contact your administrator.',\n ),\n ),\n ),\n );\n };\n}\n\nexport function collapseTable(table) {\n return function (dispatch) {\n const sync = isFeatureEnabled(FeatureFlag.SqllabBackendPersistence)\n ? SupersetClient.post({\n endpoint: encodeURI(`/tableschemaview/${table.id}/expanded`),\n postPayload: { expanded: false },\n })\n : Promise.resolve();\n\n return sync\n .then(() => dispatch({ type: COLLAPSE_TABLE, table }))\n .catch(() =>\n dispatch(\n addDangerToast(\n t(\n 'An error occurred while collapsing the table schema. ' +\n 'Please contact your administrator.',\n ),\n ),\n ),\n );\n };\n}\n\nexport function removeTables(tables) {\n return function (dispatch) {\n const tablesToRemove = tables?.filter(Boolean) ?? [];\n const sync = isFeatureEnabled(FeatureFlag.SqllabBackendPersistence)\n ? Promise.all(\n tablesToRemove.map(table =>\n table.initialized\n ? SupersetClient.delete({\n endpoint: encodeURI(`/tableschemaview/${table.id}`),\n })\n : Promise.resolve(),\n ),\n )\n : Promise.resolve();\n\n return sync\n .then(() => dispatch({ type: REMOVE_TABLES, tables: tablesToRemove }))\n .catch(() =>\n dispatch(\n addDangerToast(\n t(\n 'An error occurred while removing the table schema. ' +\n 'Please contact your administrator.',\n ),\n ),\n ),\n );\n };\n}\n\nexport function refreshQueries(alteredQueries) {\n return { type: REFRESH_QUERIES, alteredQueries };\n}\n\nexport function setUserOffline(offline) {\n return { type: SET_USER_OFFLINE, offline };\n}\n\nexport function persistEditorHeight(queryEditor, northPercent, southPercent) {\n return {\n type: QUERY_EDITOR_PERSIST_HEIGHT,\n queryEditor,\n northPercent,\n southPercent,\n };\n}\n\nexport function popStoredQuery(urlId) {\n return function (dispatch) {\n return SupersetClient.get({ endpoint: `/kv/${urlId}` })\n .then(({ json }) =>\n dispatch(\n addQueryEditor({\n name: json.name ? json.name : t('Shared query'),\n dbId: json.dbId ? parseInt(json.dbId, 10) : null,\n catalog: json.catalog ? json.catalog : null,\n schema: json.schema ? json.schema : null,\n autorun: json.autorun ? json.autorun : false,\n sql: json.sql ? json.sql : 'SELECT ...',\n templateParams: json.templateParams,\n }),\n ),\n )\n .catch(() => dispatch(addDangerToast(ERR_MSG_CANT_LOAD_QUERY)));\n };\n}\nexport function popSavedQuery(saveQueryId) {\n return function (dispatch) {\n return SupersetClient.get({\n endpoint: `/api/v1/saved_query/${saveQueryId}`,\n })\n .then(({ json }) => {\n const queryEditorProps = {\n ...convertQueryToClient(json.result),\n loaded: true,\n autorun: false,\n };\n const tmpAdaptedProps = {\n name: queryEditorProps.name,\n dbId: queryEditorProps.database.id,\n catalog: queryEditorProps.catalog,\n schema: queryEditorProps.schema,\n sql: queryEditorProps.sql,\n templateParams: queryEditorProps.templateParams,\n remoteId: queryEditorProps.remoteId,\n };\n return dispatch(addQueryEditor(tmpAdaptedProps));\n })\n .catch(() => dispatch(addDangerToast(ERR_MSG_CANT_LOAD_QUERY)));\n };\n}\nexport function popQuery(queryId) {\n return function (dispatch) {\n return SupersetClient.get({\n endpoint: `/api/v1/query/${queryId}`,\n })\n .then(({ json }) => {\n const queryData = json.result;\n const queryEditorProps = {\n dbId: queryData.database.id,\n catalog: queryData.catalog,\n schema: queryData.schema,\n sql: queryData.sql,\n name: t('Copy of %s', queryData.tab_name),\n autorun: false,\n };\n return dispatch(addQueryEditor(queryEditorProps));\n })\n .catch(() => dispatch(addDangerToast(ERR_MSG_CANT_LOAD_QUERY)));\n };\n}\nexport function popDatasourceQuery(datasourceKey, sql) {\n return function (dispatch) {\n const QUERY_TEXT = t('Query');\n const datasetId = datasourceKey.split('__')[0];\n\n const queryParams = rison.encode({\n keys: ['none'],\n columns: ['name', 'schema', 'database.id', 'select_star'],\n });\n\n return SupersetClient.get({\n endpoint: `/api/v1/dataset/${datasetId}?q=${queryParams}`,\n })\n .then(({ json }) =>\n dispatch(\n addQueryEditor({\n name: `${QUERY_TEXT} ${json.result.name}`,\n dbId: json.result.database.id,\n schema: json.result.schema,\n autorun: sql !== undefined,\n sql: sql || json.result.select_star,\n }),\n ),\n )\n .catch(() =>\n dispatch(addDangerToast(t(\"The datasource couldn't be loaded\"))),\n );\n };\n}\nexport function createDatasourceStarted() {\n return { type: CREATE_DATASOURCE_STARTED };\n}\nexport function createDatasourceSuccess(data) {\n const datasource = `${data.id}__table`;\n return { type: CREATE_DATASOURCE_SUCCESS, datasource };\n}\nexport function createDatasourceFailed(err) {\n return { type: CREATE_DATASOURCE_FAILED, err };\n}\n\nexport function createDatasource(vizOptions) {\n return dispatch => {\n dispatch(createDatasourceStarted());\n const { dbId, catalog, schema, datasourceName, sql } = vizOptions;\n return SupersetClient.post({\n endpoint: '/api/v1/dataset/',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n database: dbId,\n catalog,\n schema,\n sql,\n table_name: datasourceName,\n is_managed_externally: false,\n external_url: null,\n }),\n })\n .then(({ json }) => {\n dispatch(createDatasourceSuccess(json));\n\n return Promise.resolve(json);\n })\n .catch(error => {\n getClientErrorObject(error).then(e => {\n dispatch(addDangerToast(e.error));\n });\n dispatch(\n createDatasourceFailed(\n t('An error occurred while creating the data source'),\n ),\n );\n\n return Promise.reject();\n });\n };\n}\n\nexport function createCtasDatasource(vizOptions) {\n return dispatch => {\n dispatch(createDatasourceStarted());\n return SupersetClient.post({\n endpoint: '/api/v1/dataset/get_or_create/',\n jsonPayload: vizOptions,\n })\n .then(({ json }) => {\n dispatch(createDatasourceSuccess(json.result));\n\n return json.result;\n })\n .catch(() => {\n const errorMsg = t('An error occurred while creating the data source');\n dispatch(createDatasourceFailed(errorMsg));\n return Promise.reject(new Error(errorMsg));\n });\n };\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n/* eslint no-undef: 'error' */\n/* eslint no-param-reassign: [\"error\", { \"props\": false }] */\nimport moment from 'moment';\nimport {\n FeatureFlag,\n isDefined,\n SupersetClient,\n t,\n isFeatureEnabled,\n getClientErrorObject,\n} from '@superset-ui/core';\nimport { getControlsState } from 'src/explore/store';\nimport {\n getAnnotationJsonUrl,\n getExploreUrl,\n getLegacyEndpointType,\n buildV1ChartDataPayload,\n getQuerySettings,\n getChartDataUri,\n} from 'src/explore/exploreUtils';\nimport { addDangerToast } from 'src/components/MessageToasts/actions';\nimport { logEvent } from 'src/logger/actions';\nimport { Logger, LOG_ACTIONS_LOAD_CHART } from 'src/logger/LogUtils';\nimport { allowCrossDomain as domainShardingEnabled } from 'src/utils/hostNamesConfig';\nimport { updateDataMask } from 'src/dataMask/actions';\nimport { waitForAsyncData } from 'src/middleware/asyncEvent';\nimport { safeStringify } from 'src/utils/safeStringify';\n\nexport const CHART_UPDATE_STARTED = 'CHART_UPDATE_STARTED';\nexport function chartUpdateStarted(queryController, latestQueryFormData, key) {\n return {\n type: CHART_UPDATE_STARTED,\n queryController,\n latestQueryFormData,\n key,\n };\n}\n\nexport const CHART_UPDATE_SUCCEEDED = 'CHART_UPDATE_SUCCEEDED';\nexport function chartUpdateSucceeded(queriesResponse, key) {\n return { type: CHART_UPDATE_SUCCEEDED, queriesResponse, key };\n}\n\nexport const CHART_UPDATE_STOPPED = 'CHART_UPDATE_STOPPED';\nexport function chartUpdateStopped(key) {\n return { type: CHART_UPDATE_STOPPED, key };\n}\n\nexport const CHART_UPDATE_FAILED = 'CHART_UPDATE_FAILED';\nexport function chartUpdateFailed(queriesResponse, key) {\n return { type: CHART_UPDATE_FAILED, queriesResponse, key };\n}\n\nexport const CHART_RENDERING_FAILED = 'CHART_RENDERING_FAILED';\nexport function chartRenderingFailed(error, key, stackTrace) {\n return { type: CHART_RENDERING_FAILED, error, key, stackTrace };\n}\n\nexport const CHART_RENDERING_SUCCEEDED = 'CHART_RENDERING_SUCCEEDED';\nexport function chartRenderingSucceeded(key) {\n return { type: CHART_RENDERING_SUCCEEDED, key };\n}\n\nexport const REMOVE_CHART = 'REMOVE_CHART';\nexport function removeChart(key) {\n return { type: REMOVE_CHART, key };\n}\n\nexport const ANNOTATION_QUERY_SUCCESS = 'ANNOTATION_QUERY_SUCCESS';\nexport function annotationQuerySuccess(annotation, queryResponse, key) {\n return { type: ANNOTATION_QUERY_SUCCESS, annotation, queryResponse, key };\n}\n\nexport const ANNOTATION_QUERY_STARTED = 'ANNOTATION_QUERY_STARTED';\nexport function annotationQueryStarted(annotation, queryController, key) {\n return { type: ANNOTATION_QUERY_STARTED, annotation, queryController, key };\n}\n\nexport const ANNOTATION_QUERY_FAILED = 'ANNOTATION_QUERY_FAILED';\nexport function annotationQueryFailed(annotation, queryResponse, key) {\n return { type: ANNOTATION_QUERY_FAILED, annotation, queryResponse, key };\n}\n\nexport const DYNAMIC_PLUGIN_CONTROLS_READY = 'DYNAMIC_PLUGIN_CONTROLS_READY';\nexport const dynamicPluginControlsReady = () => (dispatch, getState) => {\n const state = getState();\n const controlsState = getControlsState(\n state.explore,\n state.explore.form_data,\n );\n dispatch({\n type: DYNAMIC_PLUGIN_CONTROLS_READY,\n key: controlsState.slice_id.value,\n controlsState,\n });\n};\n\nconst legacyChartDataRequest = async (\n formData,\n resultFormat,\n resultType,\n force,\n method = 'POST',\n requestParams = {},\n parseMethod,\n) => {\n const endpointType = getLegacyEndpointType({ resultFormat, resultType });\n const allowDomainSharding =\n // eslint-disable-next-line camelcase\n domainShardingEnabled && requestParams?.dashboard_id;\n const url = getExploreUrl({\n formData,\n endpointType,\n force,\n allowDomainSharding,\n method,\n requestParams: requestParams.dashboard_id\n ? { dashboard_id: requestParams.dashboard_id }\n : {},\n });\n const querySettings = {\n ...requestParams,\n url,\n postPayload: { form_data: formData },\n parseMethod,\n };\n\n return SupersetClient.post(querySettings).then(({ json, response }) =>\n // Make the legacy endpoint return a payload that corresponds to the\n // V1 chart data endpoint response signature.\n ({\n response,\n json: { result: [json] },\n }),\n );\n};\n\nconst v1ChartDataRequest = async (\n formData,\n resultFormat,\n resultType,\n force,\n requestParams,\n setDataMask,\n ownState,\n parseMethod,\n) => {\n const payload = buildV1ChartDataPayload({\n formData,\n resultType,\n resultFormat,\n force,\n setDataMask,\n ownState,\n });\n\n // The dashboard id is added to query params for tracking purposes\n const { slice_id: sliceId } = formData;\n const { dashboard_id: dashboardId } = requestParams;\n\n const qs = {};\n if (sliceId !== undefined) qs.form_data = `{\"slice_id\":${sliceId}}`;\n if (dashboardId !== undefined) qs.dashboard_id = dashboardId;\n if (force) qs.force = force;\n\n const allowDomainSharding =\n // eslint-disable-next-line camelcase\n domainShardingEnabled && requestParams?.dashboard_id;\n const url = getChartDataUri({\n path: '/api/v1/chart/data',\n qs,\n allowDomainSharding,\n }).toString();\n\n const querySettings = {\n ...requestParams,\n url,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n parseMethod,\n };\n\n return SupersetClient.post(querySettings);\n};\n\nexport async function getChartDataRequest({\n formData,\n setDataMask = () => {},\n resultFormat = 'json',\n resultType = 'full',\n force = false,\n method = 'POST',\n requestParams = {},\n ownState = {},\n}) {\n let querySettings = {\n ...requestParams,\n };\n\n if (domainShardingEnabled) {\n querySettings = {\n ...querySettings,\n mode: 'cors',\n credentials: 'include',\n };\n }\n const [useLegacyApi, parseMethod] = getQuerySettings(formData);\n if (useLegacyApi) {\n return legacyChartDataRequest(\n formData,\n resultFormat,\n resultType,\n force,\n method,\n querySettings,\n parseMethod,\n );\n }\n return v1ChartDataRequest(\n formData,\n resultFormat,\n resultType,\n force,\n querySettings,\n setDataMask,\n ownState,\n parseMethod,\n );\n}\n\nexport function runAnnotationQuery({\n annotation,\n timeout,\n formData = null,\n key,\n isDashboardRequest = false,\n force = false,\n}) {\n return function (dispatch, getState) {\n const { charts, common } = getState();\n const sliceKey = key || Object.keys(charts)[0];\n const queryTimeout = timeout || common.conf.SUPERSET_WEBSERVER_TIMEOUT;\n\n // make a copy of formData, not modifying original formData\n const fd = {\n ...(formData || charts[sliceKey].latestQueryFormData),\n };\n\n if (!annotation.sourceType) {\n return Promise.resolve();\n }\n\n // In the original formData the `granularity` attribute represents the time grain (eg\n // `P1D`), but in the request payload it corresponds to the name of the column where\n // the time grain should be applied (eg, `Date`), so we need to move things around.\n fd.time_grain_sqla = fd.time_grain_sqla || fd.granularity;\n fd.granularity = fd.granularity_sqla;\n\n const overridesKeys = Object.keys(annotation.overrides);\n if (overridesKeys.includes('since') || overridesKeys.includes('until')) {\n annotation.overrides = {\n ...annotation.overrides,\n time_range: null,\n };\n }\n const sliceFormData = Object.keys(annotation.overrides).reduce(\n (d, k) => ({\n ...d,\n [k]: annotation.overrides[k] || fd[k],\n }),\n {},\n );\n\n if (!isDashboardRequest && fd) {\n const hasExtraFilters = fd.extra_filters && fd.extra_filters.length > 0;\n sliceFormData.extra_filters = hasExtraFilters\n ? fd.extra_filters\n : undefined;\n }\n\n const url = getAnnotationJsonUrl(annotation.value, force);\n const controller = new AbortController();\n const { signal } = controller;\n\n dispatch(annotationQueryStarted(annotation, controller, sliceKey));\n\n const annotationIndex = fd?.annotation_layers?.findIndex(\n it => it.name === annotation.name,\n );\n if (annotationIndex >= 0) {\n fd.annotation_layers[annotationIndex].overrides = sliceFormData;\n }\n\n return SupersetClient.post({\n url,\n signal,\n timeout: queryTimeout * 1000,\n headers: { 'Content-Type': 'application/json' },\n jsonPayload: buildV1ChartDataPayload({\n formData: fd,\n force,\n resultFormat: 'json',\n resultType: 'full',\n }),\n })\n .then(({ json }) => {\n const data = json?.result?.[0]?.annotation_data?.[annotation.name];\n return dispatch(annotationQuerySuccess(annotation, { data }, sliceKey));\n })\n .catch(response =>\n getClientErrorObject(response).then(err => {\n if (err.statusText === 'timeout') {\n dispatch(\n annotationQueryFailed(\n annotation,\n { error: 'Query timeout' },\n sliceKey,\n ),\n );\n } else if ((err.error || '').toLowerCase().includes('no data')) {\n dispatch(annotationQuerySuccess(annotation, err, sliceKey));\n } else if (err.statusText !== 'abort') {\n dispatch(annotationQueryFailed(annotation, err, sliceKey));\n }\n }),\n );\n };\n}\n\nexport const TRIGGER_QUERY = 'TRIGGER_QUERY';\nexport function triggerQuery(value = true, key) {\n return { type: TRIGGER_QUERY, value, key };\n}\n\n// this action is used for forced re-render without fetch data\nexport const RENDER_TRIGGERED = 'RENDER_TRIGGERED';\nexport function renderTriggered(value, key) {\n return { type: RENDER_TRIGGERED, value, key };\n}\n\nexport const UPDATE_QUERY_FORM_DATA = 'UPDATE_QUERY_FORM_DATA';\nexport function updateQueryFormData(value, key) {\n return { type: UPDATE_QUERY_FORM_DATA, value, key };\n}\n\n// in the sql lab -> explore flow, user can inline edit chart title,\n// then the chart will be assigned a new slice_id\nexport const UPDATE_CHART_ID = 'UPDATE_CHART_ID';\nexport function updateChartId(newId, key = 0) {\n return { type: UPDATE_CHART_ID, newId, key };\n}\n\nexport const ADD_CHART = 'ADD_CHART';\nexport function addChart(chart, key) {\n return { type: ADD_CHART, chart, key };\n}\n\nexport function handleChartDataResponse(response, json, useLegacyApi) {\n if (isFeatureEnabled(FeatureFlag.GlobalAsyncQueries)) {\n // deal with getChartDataRequest transforming the response data\n const result = 'result' in json ? json.result : json;\n switch (response.status) {\n case 200:\n // Query results returned synchronously, meaning query was already cached.\n return Promise.resolve(result);\n case 202:\n // Query is running asynchronously and we must await the results\n if (useLegacyApi) {\n return waitForAsyncData(result[0]);\n }\n return waitForAsyncData(result);\n default:\n throw new Error(\n `Received unexpected response status (${response.status}) while fetching chart data`,\n );\n }\n }\n return json.result;\n}\n\nexport function exploreJSON(\n formData,\n force = false,\n timeout,\n key,\n dashboardId,\n ownState,\n) {\n return async (dispatch, getState) => {\n const logStart = Logger.getTimestamp();\n const controller = new AbortController();\n const queryTimeout =\n timeout || getState().common.conf.SUPERSET_WEBSERVER_TIMEOUT;\n\n const requestParams = {\n signal: controller.signal,\n timeout: queryTimeout * 1000,\n };\n if (dashboardId) requestParams.dashboard_id = dashboardId;\n\n const setDataMask = dataMask => {\n dispatch(updateDataMask(formData.slice_id, dataMask));\n };\n const chartDataRequest = getChartDataRequest({\n setDataMask,\n formData,\n resultFormat: 'json',\n resultType: 'full',\n force,\n method: 'POST',\n requestParams,\n ownState,\n });\n\n dispatch(chartUpdateStarted(controller, formData, key));\n\n const [useLegacyApi] = getQuerySettings(formData);\n const chartDataRequestCaught = chartDataRequest\n .then(({ response, json }) =>\n handleChartDataResponse(response, json, useLegacyApi),\n )\n .then(queriesResponse => {\n queriesResponse.forEach(resultItem =>\n dispatch(\n logEvent(LOG_ACTIONS_LOAD_CHART, {\n slice_id: key,\n applied_filters: resultItem.applied_filters,\n is_cached: resultItem.is_cached,\n force_refresh: force,\n row_count: resultItem.rowcount,\n datasource: formData.datasource,\n start_offset: logStart,\n ts: new Date().getTime(),\n duration: Logger.getTimestamp() - logStart,\n has_extra_filters:\n formData.extra_filters && formData.extra_filters.length > 0,\n viz_type: formData.viz_type,\n data_age: resultItem.is_cached\n ? moment(new Date()).diff(moment.utc(resultItem.cached_dttm))\n : null,\n }),\n ),\n );\n return dispatch(chartUpdateSucceeded(queriesResponse, key));\n })\n .catch(response => {\n if (isFeatureEnabled(FeatureFlag.GlobalAsyncQueries)) {\n return dispatch(chartUpdateFailed([response], key));\n }\n\n const appendErrorLog = (errorDetails, isCached) => {\n dispatch(\n logEvent(LOG_ACTIONS_LOAD_CHART, {\n slice_id: key,\n has_err: true,\n is_cached: isCached,\n error_details: errorDetails,\n datasource: formData.datasource,\n start_offset: logStart,\n ts: new Date().getTime(),\n duration: Logger.getTimestamp() - logStart,\n }),\n );\n };\n if (response.name === 'AbortError') {\n appendErrorLog('abort');\n return dispatch(chartUpdateStopped(key));\n }\n return getClientErrorObject(response).then(parsedResponse => {\n if (response.statusText === 'timeout') {\n appendErrorLog('timeout');\n } else {\n appendErrorLog(parsedResponse.error, parsedResponse.is_cached);\n }\n return dispatch(chartUpdateFailed([parsedResponse], key));\n });\n });\n\n // only retrieve annotations when calling the legacy API\n const annotationLayers = useLegacyApi\n ? formData.annotation_layers || []\n : [];\n const isDashboardRequest = dashboardId > 0;\n\n return Promise.all([\n chartDataRequestCaught,\n dispatch(triggerQuery(false, key)),\n dispatch(updateQueryFormData(formData, key)),\n ...annotationLayers.map(annotation =>\n dispatch(\n runAnnotationQuery({\n annotation,\n timeout,\n formData,\n key,\n isDashboardRequest,\n force,\n }),\n ),\n ),\n ]);\n };\n}\n\nexport const POST_CHART_FORM_DATA = 'POST_CHART_FORM_DATA';\nexport function postChartFormData(\n formData,\n force = false,\n timeout,\n key,\n dashboardId,\n ownState,\n) {\n return exploreJSON(formData, force, timeout, key, dashboardId, ownState);\n}\n\nexport function redirectSQLLab(formData, history) {\n return dispatch => {\n getChartDataRequest({ formData, resultFormat: 'json', resultType: 'query' })\n .then(({ json }) => {\n const redirectUrl = '/sqllab/';\n const payload = {\n datasourceKey: formData.datasource,\n sql: json.result[0].query,\n };\n if (history) {\n history.push({\n pathname: redirectUrl,\n state: {\n requestedQuery: payload,\n },\n });\n } else {\n SupersetClient.postForm(redirectUrl, {\n form_data: safeStringify(payload),\n });\n }\n })\n .catch(() =>\n dispatch(addDangerToast(t('An error occurred while loading the SQL'))),\n );\n };\n}\n\nexport function refreshChart(chartKey, force, dashboardId) {\n return (dispatch, getState) => {\n const chart = (getState().charts || {})[chartKey];\n const timeout =\n getState().dashboardInfo.common.conf.SUPERSET_WEBSERVER_TIMEOUT;\n\n if (\n !chart.latestQueryFormData ||\n Object.keys(chart.latestQueryFormData).length === 0\n ) {\n return;\n }\n dispatch(\n postChartFormData(\n chart.latestQueryFormData,\n force,\n timeout,\n chart.id,\n dashboardId,\n getState().dataMask[chart.id]?.ownState,\n ),\n );\n };\n}\n\nexport const getDatasourceSamples = async (\n datasourceType,\n datasourceId,\n force,\n jsonPayload,\n perPage,\n page,\n) => {\n try {\n const searchParams = {\n force,\n datasource_type: datasourceType,\n datasource_id: datasourceId,\n };\n\n if (isDefined(perPage) && isDefined(page)) {\n searchParams.per_page = perPage;\n searchParams.page = page;\n }\n\n const response = await SupersetClient.post({\n endpoint: '/datasource/samples',\n jsonPayload,\n searchParams,\n parseMethod: 'json-bigint',\n });\n\n return response.json.result;\n } catch (err) {\n const clientError = await getClientErrorObject(err);\n throw new Error(\n clientError.message || clientError.error || t('Sorry, an error occurred'),\n { cause: err },\n );\n }\n};\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n/* eslint-disable camelcase */\n// util function to make sure filter is a valid slice in current dashboard\nfunction isValidFilter(getState, chartId) {\n return getState().dashboardState.sliceIds.includes(chartId);\n}\n\nexport const CHANGE_FILTER = 'CHANGE_FILTER';\nexport function changeFilter(chartId, newSelectedValues, merge) {\n return (dispatch, getState) => {\n if (isValidFilter(getState, chartId)) {\n const components = getState().dashboardLayout.present;\n return dispatch({\n type: CHANGE_FILTER,\n chartId,\n newSelectedValues,\n merge,\n components,\n });\n }\n return getState().dashboardFilters;\n };\n}\n\nexport const UPDATE_DIRECT_PATH_TO_FILTER = 'UPDATE_DIRECT_PATH_TO_FILTER';\nexport function updateDirectPathToFilter(chartId, path) {\n return (dispatch, getState) => {\n if (isValidFilter(getState, chartId)) {\n return dispatch({ type: UPDATE_DIRECT_PATH_TO_FILTER, chartId, path });\n }\n return getState().dashboardFilters;\n };\n}\n\nexport const UPDATE_LAYOUT_COMPONENTS = 'UPDATE_LAYOUT_COMPONENTS';\nexport function updateLayoutComponents(components) {\n return dispatch => {\n dispatch({ type: UPDATE_LAYOUT_COMPONENTS, components });\n };\n}\n\nexport const UPDATE_DASHBOARD_FILTERS_SCOPE = 'UPDATE_DASHBOARD_FILTERS_SCOPE';\nexport function updateDashboardFiltersScope(scopes) {\n return dispatch => {\n dispatch({ type: UPDATE_DASHBOARD_FILTERS_SCOPE, scopes });\n };\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { ActionCreators as UndoActionCreators } from 'redux-undo';\nimport { t } from '@superset-ui/core';\nimport { addWarningToast } from 'src/components/MessageToasts/actions';\nimport { TABS_TYPE, ROW_TYPE } from 'src/dashboard/util/componentTypes';\nimport {\n DASHBOARD_ROOT_ID,\n NEW_COMPONENTS_SOURCE_ID,\n DASHBOARD_HEADER_ID,\n} from 'src/dashboard/util/constants';\nimport dropOverflowsParent from 'src/dashboard/util/dropOverflowsParent';\nimport findParentId from 'src/dashboard/util/findParentId';\nimport isInDifferentFilterScopes from 'src/dashboard/util/isInDifferentFilterScopes';\nimport { updateLayoutComponents } from './dashboardFilters';\nimport { setUnsavedChanges } from './dashboardState';\n\n// Component CRUD -------------------------------------------------------------\nexport const UPDATE_COMPONENTS = 'UPDATE_COMPONENTS';\n\n// this is a helper that takes an action as input and dispatches\n// an additional setUnsavedChanges(true) action after the dispatch in the case\n// that dashboardState.hasUnsavedChanges is false.\nfunction setUnsavedChangesAfterAction(action) {\n return (...args) =>\n (dispatch, getState) => {\n const result = action(...args);\n if (typeof result === 'function') {\n dispatch(result(dispatch, getState));\n } else {\n dispatch(result);\n }\n\n const { dashboardLayout, dashboardState } = getState();\n\n const isComponentLevelEvent =\n result.type === UPDATE_COMPONENTS &&\n result.payload &&\n result.payload.nextComponents;\n // trigger dashboardFilters state update if dashboard layout is changed.\n if (!isComponentLevelEvent) {\n const components = dashboardLayout.present;\n dispatch(updateLayoutComponents(components));\n }\n\n if (!dashboardState.hasUnsavedChanges) {\n dispatch(setUnsavedChanges(true));\n }\n };\n}\n\nexport const updateComponents = setUnsavedChangesAfterAction(\n nextComponents => ({\n type: UPDATE_COMPONENTS,\n payload: {\n nextComponents,\n },\n }),\n);\n\nexport function updateDashboardTitle(text) {\n return (dispatch, getState) => {\n const { dashboardLayout } = getState();\n dispatch(\n updateComponents({\n [DASHBOARD_HEADER_ID]: {\n ...dashboardLayout.present[DASHBOARD_HEADER_ID],\n meta: {\n text,\n },\n },\n }),\n );\n };\n}\n\nexport const DASHBOARD_TITLE_CHANGED = 'DASHBOARD_TITLE_CHANGED';\n\n// call this one when it's not an undo-able action\nexport function dashboardTitleChanged(text) {\n return {\n type: DASHBOARD_TITLE_CHANGED,\n text,\n };\n}\n\nexport const DELETE_COMPONENT = 'DELETE_COMPONENT';\nexport const deleteComponent = setUnsavedChangesAfterAction((id, parentId) => ({\n type: DELETE_COMPONENT,\n payload: {\n id,\n parentId,\n },\n}));\n\nexport const CREATE_COMPONENT = 'CREATE_COMPONENT';\nexport const createComponent = setUnsavedChangesAfterAction(dropResult => ({\n type: CREATE_COMPONENT,\n payload: {\n dropResult,\n },\n}));\n\n// Tabs -----------------------------------------------------------------------\nexport const CREATE_TOP_LEVEL_TABS = 'CREATE_TOP_LEVEL_TABS';\nexport const createTopLevelTabs = setUnsavedChangesAfterAction(dropResult => ({\n type: CREATE_TOP_LEVEL_TABS,\n payload: {\n dropResult,\n },\n}));\n\nexport const DELETE_TOP_LEVEL_TABS = 'DELETE_TOP_LEVEL_TABS';\nexport const deleteTopLevelTabs = setUnsavedChangesAfterAction(() => ({\n type: DELETE_TOP_LEVEL_TABS,\n payload: {},\n}));\n\n// Resize ---------------------------------------------------------------------\nexport const RESIZE_COMPONENT = 'RESIZE_COMPONENT';\nexport function resizeComponent({ id, width, height }) {\n return (dispatch, getState) => {\n const { dashboardLayout: undoableLayout } = getState();\n const { present: dashboard } = undoableLayout;\n const component = dashboard[id];\n const widthChanged = width && component.meta.width !== width;\n const heightChanged = height && component.meta.height !== height;\n if (component && (widthChanged || heightChanged)) {\n // update the size of this component\n const updatedComponents = {\n [id]: {\n ...component,\n meta: {\n ...component.meta,\n width: width || component.meta.width,\n height: height || component.meta.height,\n },\n },\n };\n\n dispatch(updateComponents(updatedComponents));\n }\n };\n}\n\n// Drag and drop --------------------------------------------------------------\nexport const MOVE_COMPONENT = 'MOVE_COMPONENT';\nconst moveComponent = setUnsavedChangesAfterAction(dropResult => ({\n type: MOVE_COMPONENT,\n payload: {\n dropResult,\n },\n}));\n\nexport const HANDLE_COMPONENT_DROP = 'HANDLE_COMPONENT_DROP';\nexport function handleComponentDrop(dropResult) {\n return (dispatch, getState) => {\n const overflowsParent = dropOverflowsParent(\n dropResult,\n getState().dashboardLayout.present,\n );\n\n if (overflowsParent) {\n return dispatch(\n addWarningToast(\n t(\n `There is not enough space for this component. Try decreasing its width, or increasing the destination width.`,\n ),\n ),\n );\n }\n\n const { source, destination } = dropResult;\n const droppedOnRoot = destination && destination.id === DASHBOARD_ROOT_ID;\n const isNewComponent = source.id === NEW_COMPONENTS_SOURCE_ID;\n const dashboardRoot = getState().dashboardLayout.present[DASHBOARD_ROOT_ID];\n const rootChildId =\n dashboardRoot && dashboardRoot.children ? dashboardRoot.children[0] : '';\n\n if (droppedOnRoot) {\n dispatch(createTopLevelTabs(dropResult));\n } else if (destination && isNewComponent) {\n dispatch(createComponent(dropResult));\n } else if (\n // Add additional allow-to-drop logic for tag/tags source.\n // We only allow\n // - top-level tab => top-level tab: rearrange top-level tab order\n // - nested tab => top-level tab: allow row tab become top-level tab\n // Dashboard does not allow top-level tab become nested tab, to avoid\n // nested tab inside nested tab.\n source.type === TABS_TYPE &&\n destination.type === TABS_TYPE &&\n source.id === rootChildId &&\n destination.id !== rootChildId\n ) {\n return dispatch(\n addWarningToast(t('Can not move top level tab into nested tabs')),\n );\n } else if (\n destination &&\n source &&\n !(\n // ensure it has moved\n (destination.id === source.id && destination.index === source.index)\n )\n ) {\n dispatch(moveComponent(dropResult));\n }\n\n // call getState() again down here in case redux state is stale after\n // previous dispatch(es)\n const { dashboardFilters, dashboardLayout: undoableLayout } = getState();\n\n // if we moved a child from a Tab or Row parent and it was the only child, delete the parent.\n if (!isNewComponent) {\n const { present: layout } = undoableLayout;\n const sourceComponent = layout[source.id] || {};\n const destinationComponent = layout[destination.id] || {};\n if (\n (sourceComponent.type === TABS_TYPE ||\n sourceComponent.type === ROW_TYPE) &&\n sourceComponent.children &&\n sourceComponent.children.length === 0\n ) {\n const parentId = findParentId({\n childId: source.id,\n layout,\n });\n dispatch(deleteComponent(source.id, parentId));\n }\n\n // show warning if item has been moved between different scope\n if (\n isInDifferentFilterScopes({\n dashboardFilters,\n source: (sourceComponent.parents || []).concat(source.id),\n destination: (destinationComponent.parents || []).concat(\n destination.id,\n ),\n })\n ) {\n dispatch(\n addWarningToast(\n t('This chart has been moved to a different filter scope.'),\n ),\n );\n }\n }\n\n return null;\n };\n}\n\n// Undo redo ------------------------------------------------------------------\nexport function undoLayoutAction() {\n return (dispatch, getState) => {\n dispatch(UndoActionCreators.undo());\n\n const { dashboardLayout, dashboardState } = getState();\n\n if (\n dashboardLayout.past.length === 0 &&\n !dashboardState.maxUndoHistoryExceeded &&\n !dashboardState.updatedColorScheme\n ) {\n dispatch(setUnsavedChanges(false));\n }\n };\n}\n\nexport const redoLayoutAction = setUnsavedChangesAfterAction(\n UndoActionCreators.redo,\n);\n\n// Update component parents list ----------------------------------------------\nexport const UPDATE_COMPONENTS_PARENTS_LIST = 'UPDATE_COMPONENTS_PARENTS_LIST';\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport getComponentWidthFromDrop from './getComponentWidthFromDrop';\n\nexport default function doesChildOverflowParent(dropResult, layout) {\n const childWidth = getComponentWidthFromDrop({ dropResult, layout });\n return typeof childWidth === 'number' && childWidth < 0;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nexport default function isInDifferentFilterScopes({\n dashboardFilters = {},\n source = [],\n destination = [],\n}) {\n const sourceSet = new Set(source);\n const destinationSet = new Set(destination);\n\n const allScopes = [].concat(\n ...Object.values(dashboardFilters).map(({ scopes }) =>\n [].concat(...Object.values(scopes).map(({ scope }) => scope)),\n ),\n );\n return allScopes.some(tab => destinationSet.has(tab) !== sourceSet.has(tab));\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { JsonObject } from '@superset-ui/core';\nimport { OVERWRITE_INSPECT_FIELDS } from 'src/dashboard/constants';\n\nconst JSON_KEYS = new Set(['json_metadata', 'position_json']);\n\nfunction extractValue(object: JsonObject, keyPath: string) {\n return keyPath.split('.').reduce((obj: JsonObject, key: string) => {\n const value = obj?.[key];\n return JSON_KEYS.has(key) && value ? JSON.parse(value) : value;\n }, object);\n}\n\nexport default function getOverwriteItems(prev: JsonObject, next: JsonObject) {\n return OVERWRITE_INSPECT_FIELDS.map(keyPath => ({\n keyPath,\n ...(keyPath.split('.').find(key => JSON_KEYS.has(key))\n ? {\n oldValue:\n JSON.stringify(extractValue(prev, keyPath), null, 2) || '{}',\n newValue:\n JSON.stringify(extractValue(next, keyPath), null, 2) || '{}',\n }\n : {\n oldValue: extractValue(prev, keyPath) || '',\n newValue: extractValue(next, keyPath) || '',\n }),\n })).filter(({ oldValue, newValue }) => oldValue !== newValue);\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n/* eslint camelcase: 0 */\nimport { ActionCreators as UndoActionCreators } from 'redux-undo';\nimport rison from 'rison';\nimport {\n ensureIsArray,\n isFeatureEnabled,\n FeatureFlag,\n getLabelsColorMap,\n SupersetClient,\n t,\n getClientErrorObject,\n getCategoricalSchemeRegistry,\n promiseTimeout,\n} from '@superset-ui/core';\nimport {\n addChart,\n removeChart,\n refreshChart,\n} from 'src/components/Chart/chartAction';\nimport { chart as initChart } from 'src/components/Chart/chartReducer';\nimport { applyDefaultFormData } from 'src/explore/store';\nimport {\n SAVE_TYPE_OVERWRITE,\n SAVE_TYPE_OVERWRITE_CONFIRMED,\n} from 'src/dashboard/util/constants';\nimport {\n getCrossFiltersConfiguration,\n isCrossFiltersEnabled,\n} from 'src/dashboard/util/crossFilters';\nimport {\n addSuccessToast,\n addWarningToast,\n addDangerToast,\n} from 'src/components/MessageToasts/actions';\nimport serializeActiveFilterValues from 'src/dashboard/util/serializeActiveFilterValues';\nimport serializeFilterScopes from 'src/dashboard/util/serializeFilterScopes';\nimport { getActiveFilters } from 'src/dashboard/util/activeDashboardFilters';\nimport { safeStringify } from 'src/utils/safeStringify';\nimport { logEvent } from 'src/logger/actions';\nimport { LOG_ACTIONS_CONFIRM_OVERWRITE_DASHBOARD_METADATA } from 'src/logger/LogUtils';\nimport { isEqual } from 'lodash';\nimport { UPDATE_COMPONENTS_PARENTS_LIST } from './dashboardLayout';\nimport {\n saveChartConfiguration,\n dashboardInfoChanged,\n SAVE_CHART_CONFIG_COMPLETE,\n} from './dashboardInfo';\nimport { fetchDatasourceMetadata, setDatasources } from './datasources';\nimport { updateDirectPathToFilter } from './dashboardFilters';\nimport { SET_FILTER_CONFIG_COMPLETE } from './nativeFilters';\nimport getOverwriteItems from '../util/getOverwriteItems';\nimport {\n applyColors,\n enforceSharedLabelsColorsArray,\n isLabelsColorMapSynced,\n getColorSchemeDomain,\n getColorNamespace,\n getLabelsColorMapEntries,\n getFreshSharedLabels,\n} from '../../utils/colorScheme';\n\nexport const SET_UNSAVED_CHANGES = 'SET_UNSAVED_CHANGES';\nexport function setUnsavedChanges(hasUnsavedChanges) {\n return { type: SET_UNSAVED_CHANGES, payload: { hasUnsavedChanges } };\n}\n\nexport const ADD_SLICE = 'ADD_SLICE';\nexport function addSlice(slice) {\n return { type: ADD_SLICE, slice };\n}\n\nexport const REMOVE_SLICE = 'REMOVE_SLICE';\nexport function removeSlice(sliceId) {\n return { type: REMOVE_SLICE, sliceId };\n}\n\nexport const TOGGLE_FAVE_STAR = 'TOGGLE_FAVE_STAR';\nexport function toggleFaveStar(isStarred) {\n return { type: TOGGLE_FAVE_STAR, isStarred };\n}\n\nexport function fetchFaveStar(id) {\n return function fetchFaveStarThunk(dispatch) {\n return SupersetClient.get({\n endpoint: `/api/v1/dashboard/favorite_status/?q=${rison.encode([id])}`,\n })\n .then(({ json }) => {\n dispatch(toggleFaveStar(!!json?.result?.[0]?.value));\n })\n .catch(() =>\n dispatch(\n addDangerToast(\n t(\n 'There was an issue fetching the favorite status of this dashboard.',\n ),\n ),\n ),\n );\n };\n}\n\nexport function saveFaveStar(id, isStarred) {\n return function saveFaveStarThunk(dispatch) {\n const endpoint = `/api/v1/dashboard/${id}/favorites/`;\n const apiCall = isStarred\n ? SupersetClient.delete({\n endpoint,\n })\n : SupersetClient.post({ endpoint });\n\n return apiCall\n .then(() => {\n dispatch(toggleFaveStar(!isStarred));\n })\n .catch(() =>\n dispatch(\n addDangerToast(t('There was an issue favoriting this dashboard.')),\n ),\n );\n };\n}\n\nexport const TOGGLE_PUBLISHED = 'TOGGLE_PUBLISHED';\nexport function togglePublished(isPublished) {\n return { type: TOGGLE_PUBLISHED, isPublished };\n}\n\nexport function savePublished(id, isPublished) {\n return function savePublishedThunk(dispatch) {\n return SupersetClient.put({\n endpoint: `/api/v1/dashboard/${id}`,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n published: isPublished,\n }),\n })\n .then(() => {\n dispatch(\n addSuccessToast(\n isPublished\n ? t('This dashboard is now published')\n : t('This dashboard is now hidden'),\n ),\n );\n dispatch(togglePublished(isPublished));\n })\n .catch(() => {\n dispatch(\n addDangerToast(\n t('You do not have permissions to edit this dashboard.'),\n ),\n );\n });\n };\n}\n\nexport const TOGGLE_EXPAND_SLICE = 'TOGGLE_EXPAND_SLICE';\nexport function toggleExpandSlice(sliceId) {\n return { type: TOGGLE_EXPAND_SLICE, sliceId };\n}\n\nexport const UPDATE_CSS = 'UPDATE_CSS';\nexport function updateCss(css) {\n return { type: UPDATE_CSS, css };\n}\n\nexport const SET_EDIT_MODE = 'SET_EDIT_MODE';\nexport function setEditMode(editMode) {\n return { type: SET_EDIT_MODE, editMode };\n}\n\nexport const ON_CHANGE = 'ON_CHANGE';\nexport function onChange() {\n return { type: ON_CHANGE };\n}\n\nexport const ON_SAVE = 'ON_SAVE';\nexport function onSave(lastModifiedTime) {\n return { type: ON_SAVE, lastModifiedTime };\n}\n\nexport const SET_REFRESH_FREQUENCY = 'SET_REFRESH_FREQUENCY';\nexport function setRefreshFrequency(refreshFrequency, isPersistent = false) {\n return { type: SET_REFRESH_FREQUENCY, refreshFrequency, isPersistent };\n}\n\nexport function saveDashboardRequestSuccess(lastModifiedTime) {\n return dispatch => {\n dispatch(onSave(lastModifiedTime));\n // clear layout undo history\n dispatch(UndoActionCreators.clearHistory());\n };\n}\n\nexport const SET_OVERRIDE_CONFIRM = 'SET_OVERRIDE_CONFIRM';\nexport function setOverrideConfirm(overwriteConfirmMetadata) {\n return {\n type: SET_OVERRIDE_CONFIRM,\n overwriteConfirmMetadata,\n };\n}\n\nexport const SAVE_DASHBOARD_STARTED = 'SAVE_DASHBOARD_STARTED';\nexport function saveDashboardStarted() {\n return { type: SAVE_DASHBOARD_STARTED };\n}\n\nexport const SAVE_DASHBOARD_FINISHED = 'SAVE_DASHBOARD_FINISHED';\nexport function saveDashboardFinished() {\n return { type: SAVE_DASHBOARD_FINISHED };\n}\n\nexport const SET_DASHBOARD_LABELS_COLORMAP_SYNCABLE =\n 'SET_DASHBOARD_LABELS_COLORMAP_SYNCABLE';\nexport const SET_DASHBOARD_LABELS_COLORMAP_SYNCED =\n 'SET_DASHBOARD_LABELS_COLORMAP_SYNCED';\nexport const SET_DASHBOARD_SHARED_LABELS_COLORS_SYNCABLE =\n 'SET_DASHBOARD_SHARED_LABELS_COLORS_SYNCABLE';\nexport const SET_DASHBOARD_SHARED_LABELS_COLORS_SYNCED =\n 'SET_DASHBOARD_SHARED_LABELS_COLORS_SYNCED';\n\nexport function setDashboardLabelsColorMapSync() {\n return { type: SET_DASHBOARD_LABELS_COLORMAP_SYNCABLE };\n}\n\nexport function setDashboardLabelsColorMapSynced() {\n return { type: SET_DASHBOARD_LABELS_COLORMAP_SYNCED };\n}\n\nexport function setDashboardSharedLabelsColorsSync() {\n return { type: SET_DASHBOARD_SHARED_LABELS_COLORS_SYNCABLE };\n}\n\nexport function setDashboardSharedLabelsColorsSynced() {\n return { type: SET_DASHBOARD_SHARED_LABELS_COLORS_SYNCED };\n}\n\nexport const setDashboardMetadata = updatedMetadata => async dispatch => {\n dispatch(\n dashboardInfoChanged({\n metadata: {\n ...updatedMetadata,\n },\n }),\n );\n};\n\nexport function saveDashboardRequest(data, id, saveType) {\n return (dispatch, getState) => {\n dispatch({ type: UPDATE_COMPONENTS_PARENTS_LIST });\n dispatch(saveDashboardStarted());\n\n const { dashboardFilters, dashboardLayout } = getState();\n const layout = dashboardLayout.present;\n Object.values(dashboardFilters).forEach(filter => {\n const { chartId } = filter;\n const componentId = filter.directPathToFilter.slice().pop();\n const directPathToFilter = (layout[componentId]?.parents || []).slice();\n directPathToFilter.push(componentId);\n dispatch(updateDirectPathToFilter(chartId, directPathToFilter));\n });\n // serialize selected values for each filter field, grouped by filter id\n const serializedFilters = serializeActiveFilterValues(getActiveFilters());\n // serialize filter scope for each filter field, grouped by filter id\n const serializedFilterScopes = serializeFilterScopes(dashboardFilters);\n const {\n certified_by,\n certification_details,\n css,\n dashboard_title,\n owners,\n roles,\n slug,\n } = data;\n\n const hasId = item => item.id !== undefined;\n const metadataCrossFiltersEnabled = data.metadata?.cross_filters_enabled;\n const colorScheme = data.metadata?.color_scheme;\n const customLabelsColor = data.metadata?.label_colors || {};\n const sharedLabelsColor = enforceSharedLabelsColorsArray(\n data.metadata?.shared_label_colors,\n );\n const cleanedData = {\n ...data,\n certified_by: certified_by || '',\n certification_details:\n certified_by && certification_details ? certification_details : '',\n css: css || '',\n dashboard_title: dashboard_title || t('[ untitled dashboard ]'),\n owners: ensureIsArray(owners).map(o => (hasId(o) ? o.id : o)),\n roles: !isFeatureEnabled(FeatureFlag.DashboardRbac)\n ? undefined\n : ensureIsArray(roles).map(r => (hasId(r) ? r.id : r)),\n slug: slug || null,\n metadata: {\n ...data.metadata,\n color_namespace: getColorNamespace(data.metadata?.color_namespace),\n color_scheme: colorScheme || '',\n color_scheme_domain: colorScheme\n ? getColorSchemeDomain(colorScheme)\n : [],\n expanded_slices: data.metadata?.expanded_slices || {},\n label_colors: customLabelsColor,\n shared_label_colors: getFreshSharedLabels(sharedLabelsColor),\n map_label_colors: getLabelsColorMapEntries(customLabelsColor),\n refresh_frequency: data.metadata?.refresh_frequency || 0,\n timed_refresh_immune_slices:\n data.metadata?.timed_refresh_immune_slices || [],\n // cross-filters should be enabled by default\n cross_filters_enabled: isCrossFiltersEnabled(\n metadataCrossFiltersEnabled,\n ),\n },\n };\n\n const handleChartConfiguration = () => {\n const {\n dashboardLayout,\n charts,\n dashboardInfo: { metadata },\n } = getState();\n return getCrossFiltersConfiguration(\n dashboardLayout.present,\n metadata,\n charts,\n );\n };\n\n const onCopySuccess = response => {\n const lastModifiedTime = response.json.result.last_modified_time;\n if (lastModifiedTime) {\n dispatch(saveDashboardRequestSuccess(lastModifiedTime));\n }\n if (isFeatureEnabled(FeatureFlag.DashboardCrossFilters)) {\n const { chartConfiguration, globalChartConfiguration } =\n handleChartConfiguration();\n dispatch(\n saveChartConfiguration({\n chartConfiguration,\n globalChartConfiguration,\n }),\n );\n }\n dispatch(saveDashboardFinished());\n dispatch(addSuccessToast(t('This dashboard was saved successfully.')));\n return response;\n };\n\n const onUpdateSuccess = response => {\n const updatedDashboard = response.json.result;\n const lastModifiedTime = response.json.last_modified_time;\n // syncing with the backend transformations of the metadata\n if (updatedDashboard.json_metadata) {\n const metadata = JSON.parse(updatedDashboard.json_metadata);\n dispatch(setDashboardMetadata(metadata));\n if (metadata.chart_configuration) {\n dispatch({\n type: SAVE_CHART_CONFIG_COMPLETE,\n chartConfiguration: metadata.chart_configuration,\n });\n }\n if (metadata.native_filter_configuration) {\n dispatch({\n type: SET_FILTER_CONFIG_COMPLETE,\n filterConfig: metadata.native_filter_configuration,\n });\n }\n\n // fetch datasets to make sure they are up to date\n SupersetClient.get({\n endpoint: `/api/v1/dashboard/${id}/datasets`,\n headers: { 'Content-Type': 'application/json' },\n }).then(({ json }) => {\n const datasources = json?.result ?? [];\n if (datasources.length) {\n dispatch(setDatasources(datasources));\n }\n });\n }\n if (lastModifiedTime) {\n dispatch(saveDashboardRequestSuccess(lastModifiedTime));\n }\n dispatch(saveDashboardFinished());\n // redirect to the new slug or id\n window.history.pushState(\n { event: 'dashboard_properties_changed' },\n '',\n `/superset/dashboard/${slug || id}/`,\n );\n\n dispatch(addSuccessToast(t('This dashboard was saved successfully.')));\n dispatch(setOverrideConfirm(undefined));\n return response;\n };\n\n const onError = async response => {\n const { error, message } = await getClientErrorObject(response);\n let errorText = t('Sorry, an unknown error occurred');\n\n if (error) {\n errorText = t(\n 'Sorry, there was an error saving this dashboard: %s',\n error,\n );\n }\n if (typeof message === 'string' && message === 'Forbidden') {\n errorText = t('You do not have permission to edit this dashboard');\n }\n dispatch(saveDashboardFinished());\n dispatch(addDangerToast(errorText));\n };\n\n if (\n [SAVE_TYPE_OVERWRITE, SAVE_TYPE_OVERWRITE_CONFIRMED].includes(saveType)\n ) {\n let chartConfiguration = {};\n let globalChartConfiguration = {};\n if (isFeatureEnabled(FeatureFlag.DashboardCrossFilters)) {\n ({ chartConfiguration, globalChartConfiguration } =\n handleChartConfiguration());\n }\n const updatedDashboard =\n saveType === SAVE_TYPE_OVERWRITE_CONFIRMED\n ? data\n : {\n certified_by: cleanedData.certified_by,\n certification_details: cleanedData.certification_details,\n css: cleanedData.css,\n dashboard_title: cleanedData.dashboard_title,\n slug: cleanedData.slug,\n owners: cleanedData.owners,\n roles: cleanedData.roles,\n json_metadata: safeStringify({\n ...(cleanedData?.metadata || {}),\n default_filters: safeStringify(serializedFilters),\n filter_scopes: serializedFilterScopes,\n chart_configuration: chartConfiguration,\n global_chart_configuration: globalChartConfiguration,\n }),\n };\n\n const updateDashboard = () =>\n SupersetClient.put({\n endpoint: `/api/v1/dashboard/${id}`,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(updatedDashboard),\n })\n .then(response => onUpdateSuccess(response))\n .catch(response => onError(response));\n return new Promise((resolve, reject) => {\n if (\n !isFeatureEnabled(FeatureFlag.ConfirmDashboardDiff) ||\n saveType === SAVE_TYPE_OVERWRITE_CONFIRMED\n ) {\n // skip overwrite precheck\n resolve();\n return;\n }\n\n // precheck for overwrite items\n SupersetClient.get({\n endpoint: `/api/v1/dashboard/${id}`,\n }).then(response => {\n const dashboard = response.json.result;\n const overwriteConfirmItems = getOverwriteItems(\n dashboard,\n updatedDashboard,\n );\n if (overwriteConfirmItems.length > 0) {\n dispatch(\n setOverrideConfirm({\n updatedAt: dashboard.changed_on,\n updatedBy: dashboard.changed_by_name,\n overwriteConfirmItems,\n dashboardId: id,\n data: updatedDashboard,\n }),\n );\n return reject(overwriteConfirmItems);\n }\n return resolve();\n });\n })\n .then(updateDashboard)\n .catch(overwriteConfirmItems => {\n const errorText = t('Please confirm the overwrite values.');\n dispatch(\n logEvent(LOG_ACTIONS_CONFIRM_OVERWRITE_DASHBOARD_METADATA, {\n dashboard_id: id,\n items: overwriteConfirmItems,\n }),\n );\n dispatch(addDangerToast(errorText));\n });\n }\n // changing the data as the endpoint requires\n if ('positions' in cleanedData && !('positions' in cleanedData.metadata)) {\n cleanedData.metadata.positions = cleanedData.positions;\n }\n cleanedData.metadata.default_filters = safeStringify(serializedFilters);\n cleanedData.metadata.filter_scopes = serializedFilterScopes;\n const copyPayload = {\n dashboard_title: cleanedData.dashboard_title,\n css: cleanedData.css,\n duplicate_slices: cleanedData.duplicate_slices,\n json_metadata: JSON.stringify(cleanedData.metadata),\n };\n\n return SupersetClient.post({\n endpoint: `/api/v1/dashboard/${id}/copy/`,\n jsonPayload: copyPayload,\n })\n .then(response => onCopySuccess(response))\n .catch(response => onError(response));\n };\n}\n\nexport function fetchCharts(\n chartList = [],\n force = false,\n interval = 0,\n dashboardId,\n) {\n return (dispatch, getState) => {\n if (!interval) {\n chartList.forEach(chartKey =>\n dispatch(refreshChart(chartKey, force, dashboardId)),\n );\n return;\n }\n\n const { metadata: meta } = getState().dashboardInfo;\n const refreshTime = Math.max(interval, meta.stagger_time || 5000); // default 5 seconds\n if (typeof meta.stagger_refresh !== 'boolean') {\n meta.stagger_refresh =\n meta.stagger_refresh === undefined\n ? true\n : meta.stagger_refresh === 'true';\n }\n const delay = meta.stagger_refresh\n ? refreshTime / (chartList.length - 1)\n : 0;\n chartList.forEach((chartKey, i) => {\n setTimeout(\n () => dispatch(refreshChart(chartKey, force, dashboardId)),\n delay * i,\n );\n });\n };\n}\n\nconst refreshCharts = (chartList, force, interval, dashboardId, dispatch) =>\n new Promise(resolve => {\n dispatch(fetchCharts(chartList, force, interval, dashboardId));\n resolve();\n });\n\nexport const ON_FILTERS_REFRESH = 'ON_FILTERS_REFRESH';\nexport function onFiltersRefresh() {\n return { type: ON_FILTERS_REFRESH };\n}\n\nexport const ON_FILTERS_REFRESH_SUCCESS = 'ON_FILTERS_REFRESH_SUCCESS';\nexport function onFiltersRefreshSuccess() {\n return { type: ON_FILTERS_REFRESH_SUCCESS };\n}\n\nexport const ON_REFRESH_SUCCESS = 'ON_REFRESH_SUCCESS';\nexport function onRefreshSuccess() {\n return { type: ON_REFRESH_SUCCESS };\n}\n\nexport const ON_REFRESH = 'ON_REFRESH';\nexport function onRefresh(\n chartList = [],\n force = false,\n interval = 0,\n dashboardId,\n) {\n return dispatch => {\n dispatch({ type: ON_REFRESH });\n refreshCharts(chartList, force, interval, dashboardId, dispatch).then(\n () => {\n dispatch(onRefreshSuccess());\n dispatch(onFiltersRefresh());\n },\n );\n };\n}\n\nexport const SHOW_BUILDER_PANE = 'SHOW_BUILDER_PANE';\nexport function showBuilderPane() {\n return { type: SHOW_BUILDER_PANE };\n}\n\nexport function addSliceToDashboard(id) {\n return (dispatch, getState) => {\n const { sliceEntities } = getState();\n const selectedSlice = sliceEntities.slices[id];\n if (!selectedSlice) {\n return dispatch(\n addWarningToast(\n 'Sorry, there is no chart definition associated with the chart trying to be added.',\n ),\n );\n }\n const form_data = {\n ...selectedSlice.form_data,\n slice_id: selectedSlice.slice_id,\n };\n const newChart = {\n ...initChart,\n id,\n form_data: applyDefaultFormData(form_data),\n };\n\n return Promise.all([\n dispatch(addChart(newChart, id)),\n dispatch(fetchDatasourceMetadata(form_data.datasource)),\n ]).then(() => {\n dispatch(addSlice(selectedSlice));\n });\n };\n}\n\nexport function removeSliceFromDashboard(id) {\n return dispatch => {\n dispatch(removeSlice(id));\n dispatch(removeChart(id));\n getLabelsColorMap().removeSlice(id);\n };\n}\n\nexport const SET_COLOR_SCHEME = 'SET_COLOR_SCHEME';\nexport function setColorScheme(colorScheme) {\n return { type: SET_COLOR_SCHEME, colorScheme };\n}\n\nexport const SET_DIRECT_PATH = 'SET_DIRECT_PATH';\nexport function setDirectPathToChild(path) {\n return { type: SET_DIRECT_PATH, path };\n}\n\nexport const SET_ACTIVE_TAB = 'SET_ACTIVE_TAB';\nexport function setActiveTab(tabId, prevTabId) {\n return { type: SET_ACTIVE_TAB, tabId, prevTabId };\n}\n\n// Even though SET_ACTIVE_TABS is not being called from Superset's codebase,\n// it is being used by Preset extensions.\nexport const SET_ACTIVE_TABS = 'SET_ACTIVE_TABS';\nexport function setActiveTabs(activeTabs) {\n return { type: SET_ACTIVE_TABS, activeTabs };\n}\n\nexport const SET_FOCUSED_FILTER_FIELD = 'SET_FOCUSED_FILTER_FIELD';\nexport function setFocusedFilterField(chartId, column) {\n return { type: SET_FOCUSED_FILTER_FIELD, chartId, column };\n}\n\nexport const UNSET_FOCUSED_FILTER_FIELD = 'UNSET_FOCUSED_FILTER_FIELD';\nexport function unsetFocusedFilterField(chartId, column) {\n return { type: UNSET_FOCUSED_FILTER_FIELD, chartId, column };\n}\n\nexport const SET_FULL_SIZE_CHART_ID = 'SET_FULL_SIZE_CHART_ID';\nexport function setFullSizeChartId(chartId) {\n return { type: SET_FULL_SIZE_CHART_ID, chartId };\n}\n\n// Undo history ---------------------------------------------------------------\nexport const SET_MAX_UNDO_HISTORY_EXCEEDED = 'SET_MAX_UNDO_HISTORY_EXCEEDED';\nexport function setMaxUndoHistoryExceeded(maxUndoHistoryExceeded = true) {\n return {\n type: SET_MAX_UNDO_HISTORY_EXCEEDED,\n payload: { maxUndoHistoryExceeded },\n };\n}\n\nexport function maxUndoHistoryToast() {\n return (dispatch, getState) => {\n const { dashboardLayout } = getState();\n const historyLength = dashboardLayout.past.length;\n\n return dispatch(\n addWarningToast(\n t(\n 'You have used all %(historyLength)s undo slots and will not be able to fully undo subsequent actions. You may save your current state to reset the history.',\n { historyLength },\n ),\n ),\n );\n };\n}\n\nexport const SET_DATASETS_STATUS = 'SET_DATASETS_STATUS';\nexport function setDatasetsStatus(status) {\n return {\n type: SET_DATASETS_STATUS,\n status,\n };\n}\n\nconst storeDashboardMetadata = async (id, metadata) =>\n SupersetClient.put({\n endpoint: `/api/v1/dashboard/${id}`,\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ json_metadata: JSON.stringify(metadata) }),\n });\n\n/**\n *\n * Persists the label colors maps in the dashboard metadata.\n * It runs when outdated color info are detected in stored metadata.\n *\n * @returns void\n */\nexport const persistDashboardLabelsColor = () => async (dispatch, getState) => {\n const {\n dashboardInfo: { id, metadata },\n dashboardState: { labelsColorMapMustSync, sharedLabelsColorsMustSync },\n } = getState();\n\n if (labelsColorMapMustSync || sharedLabelsColorsMustSync) {\n dispatch(setDashboardLabelsColorMapSynced());\n dispatch(setDashboardSharedLabelsColorsSynced());\n storeDashboardMetadata(id, metadata);\n }\n};\n\n/**\n * Checks the stored dashboard metadata for inconsistencies.\n * Update the current metadata with validated color information.\n * It runs only on Dashboard page load.\n *\n * @param {*} metadata - the stored dashboard metadata\n * @returns void\n */\nexport const applyDashboardLabelsColorOnLoad = metadata => async dispatch => {\n try {\n const updatedMetadata = { ...metadata };\n const customLabelsColor = metadata.label_colors || {};\n let hasChanged = false;\n\n // backward compatibility of shared_label_colors\n const sharedLabels = metadata.shared_label_colors || [];\n if (!Array.isArray(sharedLabels) && Object.keys(sharedLabels).length > 0) {\n hasChanged = true;\n updatedMetadata.shared_label_colors = [];\n }\n // backward compatibility of map_label_colors\n const hasMapLabelColors =\n Object.keys(metadata.map_label_colors || {}).length > 0;\n\n let updatedScheme = metadata.color_scheme;\n const categoricalSchemes = getCategoricalSchemeRegistry();\n const colorSchemeRegistry = categoricalSchemes.get(updatedScheme, true);\n const hasInvalidColorScheme = !!updatedScheme && !colorSchemeRegistry;\n\n // color scheme might not exist any longer\n if (hasInvalidColorScheme) {\n const defaultScheme = categoricalSchemes.defaultKey;\n const fallbackScheme = defaultScheme?.toString() || 'supersetColors';\n hasChanged = true;\n\n updatedScheme = fallbackScheme;\n updatedMetadata.color_scheme = updatedScheme;\n\n dispatch(setColorScheme(updatedScheme));\n }\n\n // the stored color domain registry and fresh might differ at this point\n const freshColorSchemeDomain = updatedScheme\n ? getColorSchemeDomain(updatedScheme)\n : [];\n const currentColorSchemeDomain = metadata.color_scheme_domain || [];\n\n if (!isEqual(freshColorSchemeDomain, currentColorSchemeDomain)) {\n hasChanged = true;\n updatedMetadata.color_scheme_domain = freshColorSchemeDomain;\n }\n\n // if color scheme is invalid or map is missing, apply a fresh color map\n // if valid, apply the stored map to keep consistency across refreshes\n const shouldGoFresh = !hasMapLabelColors || hasInvalidColorScheme;\n applyColors(updatedMetadata, shouldGoFresh);\n\n if (shouldGoFresh) {\n // a fresh color map has been applied\n // needs to be stored for consistency\n hasChanged = true;\n updatedMetadata.map_label_colors =\n getLabelsColorMapEntries(customLabelsColor);\n }\n\n if (hasChanged) {\n dispatch(setDashboardMetadata(updatedMetadata));\n dispatch(setDashboardLabelsColorMapSync());\n }\n } catch (e) {\n console.error('Failed to update dashboard color on load:', e);\n }\n};\n\n/**\n *\n * Ensure that the stored color map matches fresh map.\n *\n * @param {*} metadata - the dashboard metadata\n * @returns void\n */\nexport const ensureSyncedLabelsColorMap = metadata => (dispatch, getState) => {\n const syncLabelsColorMap = () => {\n const {\n dashboardState: { labelsColorMapMustSync },\n } = getState();\n const updatedMetadata = { ...metadata };\n const customLabelsColor = metadata.label_colors || {};\n const isMapSynced = isLabelsColorMapSynced(metadata);\n const mustSync = !isMapSynced;\n\n if (mustSync) {\n const freshestColorMapEntries =\n getLabelsColorMapEntries(customLabelsColor);\n updatedMetadata.map_label_colors = freshestColorMapEntries;\n dispatch(setDashboardMetadata(updatedMetadata));\n }\n\n if (mustSync && !labelsColorMapMustSync) {\n // prepare to persist the just applied labels color map\n dispatch(setDashboardLabelsColorMapSync());\n }\n };\n promiseTimeout(syncLabelsColorMap, 500);\n};\n\n/**\n *\n * Ensure that the stored shared labels colors match current.\n *\n * @param {*} metadata - the dashboard metadata\n * @param {*} forceFresh - when true it will use the fresh shared labels ignoring stored ones\n * @returns void\n */\nexport const ensureSyncedSharedLabelsColors =\n (metadata, forceFresh = false) =>\n (dispatch, getState) => {\n const syncSharedLabelsColors = () => {\n const {\n dashboardState: { sharedLabelsColorsMustSync },\n } = getState();\n const updatedMetadata = { ...metadata };\n const sharedLabelsColors = enforceSharedLabelsColorsArray(\n metadata.shared_label_colors,\n );\n const freshLabelsColors = getFreshSharedLabels(\n forceFresh ? [] : sharedLabelsColors,\n );\n const isSharedLabelsColorsSynced = isEqual(\n sharedLabelsColors,\n freshLabelsColors,\n );\n\n const mustSync = !isSharedLabelsColorsSynced;\n\n if (mustSync) {\n updatedMetadata.shared_label_colors = freshLabelsColors;\n dispatch(setDashboardMetadata(updatedMetadata));\n }\n\n if (mustSync && !sharedLabelsColorsMustSync) {\n // prepare to persist the shared labels colors\n dispatch(setDashboardSharedLabelsColorsSync());\n }\n };\n promiseTimeout(syncSharedLabelsColors, 500);\n };\n\n/**\n *\n * Updates the color map with new labels and colors as they appear.\n *\n * @param {*} renderedChartIds - the charts that have finished rendering\n * @returns void\n */\nexport const updateDashboardLabelsColor =\n renderedChartIds => (dispatch, getState) => {\n try {\n const {\n dashboardInfo: { metadata },\n charts,\n } = getState();\n const colorScheme = metadata.color_scheme;\n const labelsColorMapInstance = getLabelsColorMap();\n const fullLabelsColors = metadata.map_label_colors || {};\n const sharedLabelsColors = enforceSharedLabelsColorsArray(\n metadata.shared_label_colors,\n );\n const customLabelsColors = metadata.label_colors || {};\n\n // for dashboards with no color scheme, the charts should always use their individual schemes\n // this logic looks for unique labels (not shared across multiple charts) of each rendered chart\n // it applies a new color to those unique labels when the applied scheme is not up to date\n // while leaving shared label colors and custom label colors intact for color consistency\n const shouldReset = [];\n if (renderedChartIds.length > 0) {\n const sharedLabelsSet = new Set(sharedLabelsColors);\n renderedChartIds.forEach(id => {\n const chart = charts[id];\n const formData = chart.form_data || chart.latestQueryFormData;\n // ensure charts have their original color scheme always available\n labelsColorMapInstance.setOwnColorScheme(\n formData.slice_id,\n formData.color_scheme,\n );\n\n // if dashboard has a scheme, charts should ignore individual schemes\n // thus following logic is inapplicable if a dashboard color scheme exists\n if (colorScheme) return;\n\n const chartColorScheme = formData.color_scheme;\n const currentChartConfig = labelsColorMapInstance.chartsLabelsMap.get(\n formData.slice_id,\n );\n const currentChartLabels = currentChartConfig?.labels || [];\n const uniqueChartLabels = currentChartLabels.filter(\n l =>\n !sharedLabelsSet.has(l) && !customLabelsColors.hasOwnProperty(l),\n );\n\n // Map unique labels to colors\n const uniqueChartLabelsColor = new Set(\n uniqueChartLabels.map(l => fullLabelsColors[l]).filter(Boolean),\n );\n\n const expectedColorsForChartScheme = new Set(\n getColorSchemeDomain(chartColorScheme),\n );\n\n // Check if any unique label color is not in the expected colors set\n const shouldResetColors = [...uniqueChartLabelsColor].some(\n color => !expectedColorsForChartScheme.has(color),\n );\n\n // Only push uniqueChartLabels if they require resetting\n if (shouldResetColors) shouldReset.push(...uniqueChartLabels);\n });\n }\n\n // an existing map is available, use mrge option\n // to only apply colors to newly found labels\n const shouldGoFresh = shouldReset.length > 0 ? shouldReset : false;\n const shouldMerge = !shouldGoFresh;\n // re-apply the color map first to get fresh maps accordingly\n applyColors(metadata, shouldGoFresh, shouldMerge);\n } catch (e) {\n console.error('Failed to update colors for new charts and labels:', e);\n }\n };\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nexport default function serializeFilterScopes(dashboardFilters) {\n return Object.values(dashboardFilters).reduce((map, { chartId, scopes }) => {\n const scopesById = Object.keys(scopes).reduce(\n (scopesByColumn, column) => ({\n ...scopesByColumn,\n [column]: scopes[column],\n }),\n {},\n );\n\n return {\n ...map,\n [chartId]: scopesById,\n };\n }, {});\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n/* eslint-disable camelcase */\nimport { FeatureFlag, isFeatureEnabled } from '@superset-ui/core';\nimport { chart } from 'src/components/Chart/chartReducer';\nimport { initSliceEntities } from 'src/dashboard/reducers/sliceEntities';\nimport { getInitialState as getInitialNativeFilterState } from 'src/dashboard/reducers/nativeFilters';\nimport { applyDefaultFormData } from 'src/explore/store';\nimport { buildActiveFilters } from 'src/dashboard/util/activeDashboardFilters';\nimport { findPermission } from 'src/utils/findPermission';\nimport {\n canUserEditDashboard,\n canUserSaveAsDashboard,\n} from 'src/dashboard/util/permissionUtils';\nimport {\n getCrossFiltersConfiguration,\n isCrossFiltersEnabled,\n} from 'src/dashboard/util/crossFilters';\nimport {\n DASHBOARD_HEADER_ID,\n GRID_DEFAULT_CHART_WIDTH,\n GRID_COLUMN_COUNT,\n DASHBOARD_ROOT_ID,\n} from 'src/dashboard/util/constants';\nimport {\n DASHBOARD_HEADER_TYPE,\n CHART_TYPE,\n ROW_TYPE,\n} from 'src/dashboard/util/componentTypes';\nimport findFirstParentContainerId from 'src/dashboard/util/findFirstParentContainer';\nimport getEmptyLayout from 'src/dashboard/util/getEmptyLayout';\nimport getLocationHash from 'src/dashboard/util/getLocationHash';\nimport newComponentFactory from 'src/dashboard/util/newComponentFactory';\nimport { URL_PARAMS } from 'src/constants';\nimport { getUrlParam } from 'src/utils/urlUtils';\nimport { ResourceStatus } from 'src/hooks/apiResources/apiResources';\nimport extractUrlParams from '../util/extractUrlParams';\nimport updateComponentParentsList from '../util/updateComponentParentsList';\nimport { FilterBarOrientation } from '../types';\n\nexport const HYDRATE_DASHBOARD = 'HYDRATE_DASHBOARD';\n\nexport const hydrateDashboard =\n ({ history, dashboard, charts, dataMask, activeTabs }) =>\n (dispatch, getState) => {\n const { user, common, dashboardState } = getState();\n const { metadata, position_data: positionData } = dashboard;\n const regularUrlParams = extractUrlParams('regular');\n const reservedUrlParams = extractUrlParams('reserved');\n const editMode = reservedUrlParams.edit === 'true';\n\n charts.forEach(chart => {\n // eslint-disable-next-line no-param-reassign\n chart.slice_id = chart.form_data.slice_id;\n });\n\n // new dash: position_json could be {} or null\n const layout =\n positionData && Object.keys(positionData).length > 0\n ? positionData\n : getEmptyLayout();\n\n // create a lookup to sync layout names with slice names\n const chartIdToLayoutId = {};\n Object.values(layout).forEach(layoutComponent => {\n if (layoutComponent.type === CHART_TYPE) {\n chartIdToLayoutId[layoutComponent.meta.chartId] = layoutComponent.id;\n }\n });\n\n // find root level chart container node for newly-added slices\n const parentId = findFirstParentContainerId(layout);\n const parent = layout[parentId];\n let newSlicesContainer;\n let newSlicesContainerWidth = 0;\n\n const chartQueries = {};\n const dashboardFilters = {};\n const slices = {};\n const sliceIds = new Set();\n const slicesFromExploreCount = new Map();\n\n charts.forEach(slice => {\n const key = slice.slice_id;\n const formData = {\n ...slice.form_data,\n url_params: {\n ...slice.form_data.url_params,\n ...regularUrlParams,\n },\n };\n chartQueries[key] = {\n ...chart,\n id: key,\n form_data: applyDefaultFormData(formData),\n };\n\n slices[key] = {\n slice_id: key,\n slice_url: slice.slice_url,\n slice_name: slice.slice_name,\n form_data: slice.form_data,\n viz_type: slice.form_data.viz_type,\n datasource: slice.form_data.datasource,\n description: slice.description,\n description_markeddown: slice.description_markeddown,\n owners: slice.owners,\n modified: slice.modified,\n changed_on: new Date(slice.changed_on).getTime(),\n };\n\n sliceIds.add(key);\n\n // if there are newly added slices from explore view, fill slices into 1 or more rows\n if (!chartIdToLayoutId[key] && layout[parentId]) {\n if (\n newSlicesContainerWidth === 0 ||\n newSlicesContainerWidth + GRID_DEFAULT_CHART_WIDTH > GRID_COLUMN_COUNT\n ) {\n newSlicesContainer = newComponentFactory(\n ROW_TYPE,\n (parent.parents || []).slice(),\n );\n layout[newSlicesContainer.id] = newSlicesContainer;\n parent.children.push(newSlicesContainer.id);\n newSlicesContainerWidth = 0;\n }\n\n const chartHolder = newComponentFactory(\n CHART_TYPE,\n {\n chartId: slice.slice_id,\n },\n (newSlicesContainer.parents || []).slice(),\n );\n\n const count = (slicesFromExploreCount.get(slice.slice_id) ?? 0) + 1;\n chartHolder.id = `${CHART_TYPE}-explore-${slice.slice_id}-${count}`;\n slicesFromExploreCount.set(slice.slice_id, count);\n\n layout[chartHolder.id] = chartHolder;\n newSlicesContainer.children.push(chartHolder.id);\n chartIdToLayoutId[chartHolder.meta.chartId] = chartHolder.id;\n newSlicesContainerWidth += GRID_DEFAULT_CHART_WIDTH;\n }\n\n // sync layout names with current slice names in case a slice was edited\n // in explore since the layout was updated. name updates go through layout for undo/redo\n // functionality and python updates slice names based on layout upon dashboard save\n const layoutId = chartIdToLayoutId[key];\n if (layoutId && layout[layoutId]) {\n layout[layoutId].meta.sliceName = slice.slice_name;\n }\n });\n\n // make sure that parents tree is built\n if (\n Object.values(layout).some(\n element => element.id !== DASHBOARD_ROOT_ID && !element.parents,\n )\n ) {\n updateComponentParentsList({\n currentComponent: layout[DASHBOARD_ROOT_ID],\n layout,\n });\n }\n\n buildActiveFilters({\n dashboardFilters,\n components: layout,\n });\n\n // store the header as a layout component so we can undo/redo changes\n layout[DASHBOARD_HEADER_ID] = {\n id: DASHBOARD_HEADER_ID,\n type: DASHBOARD_HEADER_TYPE,\n meta: {\n text: dashboard.dashboard_title,\n },\n };\n\n const dashboardLayout = {\n past: [],\n present: layout,\n future: [],\n };\n\n // Searches for a focused_chart parameter in the URL to automatically focus a chart\n const focusedChartId = getUrlParam(URL_PARAMS.dashboardFocusedChart);\n let focusedChartLayoutId;\n if (focusedChartId) {\n // Converts focused_chart to dashboard layout id\n const found = Object.values(dashboardLayout.present).find(\n element => element.meta?.chartId === focusedChartId,\n );\n focusedChartLayoutId = found?.id;\n // Removes the focused_chart parameter from the URL\n const params = new URLSearchParams(window.location.search);\n params.delete(URL_PARAMS.dashboardFocusedChart.name);\n history.replace({\n search: params.toString(),\n });\n }\n\n // find direct link component and path from root\n const directLinkComponentId = focusedChartLayoutId || getLocationHash();\n let directPathToChild = dashboardState.directPathToChild || [];\n if (layout[directLinkComponentId]) {\n directPathToChild = (layout[directLinkComponentId].parents || []).slice();\n directPathToChild.push(directLinkComponentId);\n }\n\n const nativeFilters = getInitialNativeFilterState({\n filterConfig: metadata?.native_filter_configuration || [],\n });\n\n if (isFeatureEnabled(FeatureFlag.DashboardCrossFilters)) {\n const { chartConfiguration, globalChartConfiguration } =\n getCrossFiltersConfiguration(\n dashboardLayout.present,\n metadata,\n chartQueries,\n );\n metadata.chart_configuration = chartConfiguration;\n metadata.global_chart_configuration = globalChartConfiguration;\n }\n\n const { roles } = user;\n const canEdit = canUserEditDashboard(dashboard, user);\n const crossFiltersEnabled = isCrossFiltersEnabled(\n metadata.cross_filters_enabled,\n );\n\n return dispatch({\n type: HYDRATE_DASHBOARD,\n data: {\n sliceEntities: { ...initSliceEntities, slices, isLoading: false },\n charts: chartQueries,\n // read-only data\n dashboardInfo: {\n ...dashboard,\n metadata,\n userId: user.userId ? String(user.userId) : null, // legacy, please use state.user instead\n dash_edit_perm: canEdit,\n dash_save_perm: canUserSaveAsDashboard(dashboard, user),\n dash_share_perm: findPermission(\n 'can_share_dashboard',\n 'Superset',\n roles,\n ),\n superset_can_explore: findPermission(\n 'can_explore',\n 'Superset',\n roles,\n ),\n superset_can_share: findPermission(\n 'can_share_chart',\n 'Superset',\n roles,\n ),\n superset_can_csv: findPermission('can_csv', 'Superset', roles),\n common: {\n // legacy, please use state.common instead\n flash_messages: common?.flash_messages,\n conf: common?.conf,\n },\n filterBarOrientation:\n (isFeatureEnabled(FeatureFlag.HorizontalFilterBar) &&\n metadata.filter_bar_orientation) ||\n FilterBarOrientation.Vertical,\n crossFiltersEnabled,\n },\n dataMask,\n dashboardFilters,\n nativeFilters,\n dashboardState: {\n preselectNativeFilters: getUrlParam(URL_PARAMS.nativeFilters),\n sliceIds: Array.from(sliceIds),\n directPathToChild,\n directPathLastUpdated: Date.now(),\n focusedFilterField: null,\n expandedSlices: metadata?.expanded_slices || {},\n refreshFrequency: metadata?.refresh_frequency || 0,\n // dashboard viewers can set refresh frequency for the current visit,\n // only persistent refreshFrequency will be saved to backend\n shouldPersistRefreshFrequency: false,\n css: dashboard.css || '',\n colorNamespace: metadata?.color_namespace || null,\n colorScheme: metadata?.color_scheme || null,\n editMode: canEdit && editMode,\n isPublished: dashboard.published,\n hasUnsavedChanges: false,\n dashboardIsSaving: false,\n maxUndoHistoryExceeded: false,\n lastModifiedTime: dashboard.changed_on,\n isRefreshing: false,\n isFiltersRefreshing: false,\n activeTabs: activeTabs || dashboardState?.activeTabs || [],\n datasetsStatus: ResourceStatus.Loading,\n },\n dashboardLayout,\n },\n });\n };\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { DASHBOARD_ROOT_TYPE, DASHBOARD_GRID_TYPE } from './componentTypes';\n\nimport {\n DASHBOARD_GRID_ID,\n DASHBOARD_ROOT_ID,\n DASHBOARD_VERSION_KEY,\n} from './constants';\n\nexport default function getEmptyLayout() {\n return {\n [DASHBOARD_VERSION_KEY]: 'v2',\n [DASHBOARD_ROOT_ID]: {\n type: DASHBOARD_ROOT_TYPE,\n id: DASHBOARD_ROOT_ID,\n children: [DASHBOARD_GRID_ID],\n },\n [DASHBOARD_GRID_ID]: {\n type: DASHBOARD_GRID_TYPE,\n id: DASHBOARD_GRID_ID,\n children: [],\n parents: [DASHBOARD_ROOT_ID],\n },\n };\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { TABS_TYPE } from './componentTypes';\nimport { DASHBOARD_ROOT_ID } from './constants';\n\nexport default function findFirstParentContainerId(layout = {}) {\n // DASHBOARD_GRID_TYPE or TABS_TYPE?\n let parent = layout[DASHBOARD_ROOT_ID];\n if (\n parent &&\n parent.children.length &&\n layout[parent.children[0]].type === TABS_TYPE\n ) {\n const tabs = layout[parent.children[0]];\n parent = layout[tabs.children[0]];\n } else {\n parent = layout[parent.children[0]];\n }\n\n return parent.id;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n/* eslint-disable camelcase */\nimport {\n CHANGE_FILTER,\n UPDATE_DIRECT_PATH_TO_FILTER,\n UPDATE_LAYOUT_COMPONENTS,\n UPDATE_DASHBOARD_FILTERS_SCOPE,\n} from '../actions/dashboardFilters';\nimport { HYDRATE_DASHBOARD } from '../actions/hydrate';\nimport { DASHBOARD_ROOT_ID } from '../util/constants';\nimport { buildActiveFilters } from '../util/activeDashboardFilters';\nimport { getChartIdAndColumnFromFilterKey } from '../util/getDashboardFilterKey';\n\nexport const DASHBOARD_FILTER_SCOPE_GLOBAL = {\n scope: [DASHBOARD_ROOT_ID],\n immune: [],\n};\n\nexport const dashboardFilter = {\n chartId: null,\n componentId: null,\n filterName: null,\n datasourceId: null,\n directPathToFilter: [],\n isDateFilter: false,\n isInstantFilter: true,\n columns: {},\n labels: {},\n scopes: {},\n};\n\nconst CHANGE_FILTER_VALUE_ACTIONS = [CHANGE_FILTER];\n\nexport default function dashboardFiltersReducer(dashboardFilters = {}, action) {\n const actionHandlers = {\n [CHANGE_FILTER](state) {\n const { newSelectedValues, merge } = action;\n const updatedColumns = Object.keys(newSelectedValues).reduce(\n (columns, name) => {\n // override existed column value, or add new column name\n if (!merge || !(name in columns)) {\n return {\n ...columns,\n [name]: newSelectedValues[name],\n };\n }\n\n return {\n ...columns,\n [name]: [...columns[name], ...newSelectedValues[name]],\n };\n },\n { ...state.columns },\n );\n\n return {\n ...state,\n columns: updatedColumns,\n };\n },\n\n [UPDATE_DIRECT_PATH_TO_FILTER](state) {\n const { path } = action;\n return {\n ...state,\n directPathToFilter: path,\n };\n },\n };\n\n if (action.type === UPDATE_LAYOUT_COMPONENTS) {\n buildActiveFilters({\n dashboardFilters,\n components: action.components,\n });\n return dashboardFilters;\n }\n if (action.type === UPDATE_DASHBOARD_FILTERS_SCOPE) {\n const allDashboardFiltersScope = action.scopes;\n // update filter scope for each filter field\n const updatedFilters = Object.entries(allDashboardFiltersScope).reduce(\n (map, entry) => {\n const [filterKey, { scope, immune }] = entry;\n const { chartId, column } = getChartIdAndColumnFromFilterKey(filterKey);\n const scopes = {\n ...map[chartId].scopes,\n [column]: {\n scope,\n immune,\n },\n };\n return {\n ...map,\n [chartId]: {\n ...map[chartId],\n scopes,\n },\n };\n },\n dashboardFilters,\n );\n\n buildActiveFilters({ dashboardFilters: updatedFilters });\n return updatedFilters;\n }\n if (action.type === HYDRATE_DASHBOARD) {\n return action.data.dashboardFilters;\n }\n\n if (action.type in actionHandlers) {\n const updatedFilters = {\n ...dashboardFilters,\n [action.chartId]: actionHandlers[action.type](\n dashboardFilters[action.chartId],\n ),\n };\n if (CHANGE_FILTER_VALUE_ACTIONS.includes(action.type)) {\n buildActiveFilters({ dashboardFilters: updatedFilters });\n }\n\n return updatedFilters;\n }\n\n return dashboardFilters;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { t } from '@superset-ui/core';\n\nimport {\n FETCH_ALL_SLICES_FAILED,\n FETCH_ALL_SLICES_STARTED,\n ADD_SLICES,\n SET_SLICES,\n} from '../actions/sliceEntities';\nimport { HYDRATE_DASHBOARD } from '../actions/hydrate';\n\nexport const initSliceEntities = {\n slices: {},\n isLoading: true,\n errorMessage: null,\n lastUpdated: 0,\n};\n\nexport default function sliceEntitiesReducer(\n state = initSliceEntities,\n action,\n) {\n const actionHandlers = {\n [HYDRATE_DASHBOARD]() {\n return {\n ...action.data.sliceEntities,\n };\n },\n [FETCH_ALL_SLICES_STARTED]() {\n return {\n ...state,\n isLoading: true,\n };\n },\n [ADD_SLICES]() {\n return {\n ...state,\n isLoading: false,\n slices: { ...state.slices, ...action.payload.slices },\n lastUpdated: new Date().getTime(),\n };\n },\n [SET_SLICES]() {\n return {\n isLoading: false,\n slices: { ...action.payload.slices },\n lastUpdated: new Date().getTime(),\n };\n },\n [FETCH_ALL_SLICES_FAILED]() {\n return {\n ...state,\n isLoading: false,\n lastUpdated: new Date().getTime(),\n errorMessage:\n action.payload.error || t('Could not fetch all saved charts'),\n };\n },\n };\n\n if (action.type in actionHandlers) {\n return actionHandlers[action.type]();\n }\n return state;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { isEmpty } from 'lodash';\nimport { mapValues, flow, keyBy } from 'lodash/fp';\nimport {\n getChartIdAndColumnFromFilterKey,\n getDashboardFilterKey,\n} from './getDashboardFilterKey';\nimport { CHART_TYPE } from './componentTypes';\nimport { DASHBOARD_FILTER_SCOPE_GLOBAL } from '../reducers/dashboardFilters';\n\nlet activeFilters = {};\nlet appliedFilterValuesByChart = {};\nlet allComponents = {};\n\n// output: { [id_column]: { values, scope } }\nexport function getActiveFilters() {\n return activeFilters;\n}\n\n// this function is to find all filter values applied to a chart,\n// it goes through all active filters and their scopes.\n// return: { [column]: array of selected values }\nexport function getAppliedFilterValues(chartId, filters) {\n // use cached data if possible\n if (!(chartId in appliedFilterValuesByChart)) {\n const applicableFilters = Object.entries(filters || activeFilters).filter(\n ([, { scope: chartIds }]) => chartIds.includes(chartId),\n );\n appliedFilterValuesByChart[chartId] = flow(\n keyBy(\n ([filterKey]) => getChartIdAndColumnFromFilterKey(filterKey).column,\n ),\n mapValues(([, { values }]) => values),\n )(applicableFilters);\n }\n return appliedFilterValuesByChart[chartId];\n}\n\n/**\n * @deprecated Please use src/dashboard/util/getChartIdsInFilterScope instead\n */\nexport function getChartIdsInFilterScope({ filterScope }) {\n function traverse(chartIds = [], component = {}, immuneChartIds = []) {\n if (!component) {\n return;\n }\n\n if (\n component.type === CHART_TYPE &&\n component.meta &&\n component.meta.chartId &&\n !immuneChartIds.includes(component.meta.chartId)\n ) {\n chartIds.push(component.meta.chartId);\n } else if (component.children) {\n component.children.forEach(child =>\n traverse(chartIds, allComponents[child], immuneChartIds),\n );\n }\n }\n\n const chartIds = [];\n const { scope: scopeComponentIds, immune: immuneChartIds } =\n filterScope || DASHBOARD_FILTER_SCOPE_GLOBAL;\n scopeComponentIds.forEach(componentId =>\n traverse(chartIds, allComponents[componentId], immuneChartIds),\n );\n\n return chartIds;\n}\n\n// non-empty filter fields in dashboardFilters,\n// activeFilters map contains selected values and filter scope.\n// values: array of selected values\n// scope: array of chartIds that applicable to the filter field.\nexport function buildActiveFilters({ dashboardFilters = {}, components = {} }) {\n // clear cache\n if (!isEmpty(components)) {\n allComponents = components;\n }\n appliedFilterValuesByChart = {};\n activeFilters = Object.values(dashboardFilters).reduce((result, filter) => {\n const { chartId, columns, scopes } = filter;\n const nonEmptyFilters = {};\n\n Object.keys(columns).forEach(column => {\n if (\n Array.isArray(columns[column])\n ? columns[column].length\n : columns[column] !== undefined\n ) {\n // remove filter itself\n const scope = getChartIdsInFilterScope({\n filterScope: scopes[column],\n }).filter(id => chartId !== id);\n\n nonEmptyFilters[getDashboardFilterKey({ chartId, column })] = {\n values: columns[column],\n scope,\n };\n }\n });\n\n return {\n ...result,\n ...nonEmptyFilters,\n };\n }, {});\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { NEW_COMPONENTS_SOURCE_ID } from './constants';\nimport findParentId from './findParentId';\nimport getDetailedComponentWidth from './getDetailedComponentWidth';\nimport newComponentFactory from './newComponentFactory';\n\nexport default function getComponentWidthFromDrop({\n dropResult,\n layout: components,\n}) {\n const { source, destination, dragging } = dropResult;\n\n const isNewComponent = source.id === NEW_COMPONENTS_SOURCE_ID;\n const component = isNewComponent\n ? newComponentFactory(dragging.type)\n : components[dragging.id] || {};\n\n // moving a component within the same container shouldn't change its width\n if (source.id === destination.id) {\n return component.meta.width;\n }\n\n const { width: draggingWidth, minimumWidth: minDraggingWidth } =\n getDetailedComponentWidth({\n component,\n components,\n });\n\n const { width: destinationWidth, occupiedWidth: draggingOccupiedWidth } =\n getDetailedComponentWidth({\n id: destination.id,\n components,\n });\n\n let destinationCapacity = Number(destinationWidth - draggingOccupiedWidth);\n\n if (Number.isNaN(destinationCapacity)) {\n const { width: grandparentWidth, occupiedWidth: grandparentOccupiedWidth } =\n getDetailedComponentWidth({\n id: findParentId({\n childId: destination.id,\n layout: components,\n }),\n components,\n });\n\n destinationCapacity = Number(grandparentWidth - grandparentOccupiedWidth);\n }\n\n if (\n Number.isNaN(destinationCapacity) ||\n Number.isNaN(Number(draggingWidth))\n ) {\n return draggingWidth;\n }\n if (destinationCapacity >= draggingWidth) {\n return draggingWidth;\n }\n if (destinationCapacity >= minDraggingWidth) {\n return destinationCapacity;\n }\n\n return -1;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport findParentId from './findParentId';\nimport { GRID_MIN_COLUMN_COUNT, GRID_COLUMN_COUNT } from './constants';\nimport {\n ROW_TYPE,\n COLUMN_TYPE,\n MARKDOWN_TYPE,\n CHART_TYPE,\n DYNAMIC_TYPE,\n} from './componentTypes';\n\nfunction getTotalChildWidth({ id, components }) {\n const component = components[id];\n if (!component) return 0;\n\n let width = 0;\n\n (component.children || []).forEach(childId => {\n const child = components[childId] || {};\n width += (child.meta || {}).width || 0;\n });\n\n return width;\n}\n\nexport default function getDetailedComponentWidth({\n // pass either an id, or a component\n id,\n component: passedComponent,\n components = {},\n}) {\n const result = {\n width: undefined,\n occupiedWidth: undefined,\n minimumWidth: undefined,\n };\n\n const component = passedComponent || components[id];\n if (!component) return result;\n\n // note these remain as undefined if the component has no defined width\n result.width = (component.meta || {}).width;\n result.occupiedWidth = result.width;\n\n if (component.type === ROW_TYPE) {\n // not all rows have width 12, e\n result.width =\n getDetailedComponentWidth({\n id: findParentId({\n childId: component.id,\n layout: components,\n }),\n components,\n }).width || GRID_COLUMN_COUNT;\n result.occupiedWidth = getTotalChildWidth({ id: component.id, components });\n result.minimumWidth = result.occupiedWidth || GRID_MIN_COLUMN_COUNT;\n } else if (component.type === COLUMN_TYPE) {\n // find the width of the largest child, only rows count\n result.minimumWidth = GRID_MIN_COLUMN_COUNT;\n result.occupiedWidth = 0;\n (component.children || []).forEach(childId => {\n // rows don't have widths, so find the width of its children\n if (components[childId].type === ROW_TYPE) {\n result.minimumWidth = Math.max(\n result.minimumWidth,\n getTotalChildWidth({ id: childId, components }),\n );\n }\n });\n } else if (\n component.type === DYNAMIC_TYPE ||\n component.type === MARKDOWN_TYPE ||\n component.type === CHART_TYPE\n ) {\n result.minimumWidth = GRID_MIN_COLUMN_COUNT;\n }\n\n return result;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { nanoid } from 'nanoid';\nimport { t } from '@superset-ui/core';\n\nimport {\n CHART_TYPE,\n COLUMN_TYPE,\n DIVIDER_TYPE,\n HEADER_TYPE,\n MARKDOWN_TYPE,\n ROW_TYPE,\n TABS_TYPE,\n TAB_TYPE,\n DYNAMIC_TYPE,\n} from './componentTypes';\n\nimport {\n MEDIUM_HEADER,\n BACKGROUND_TRANSPARENT,\n GRID_DEFAULT_CHART_WIDTH,\n GRID_COLUMN_COUNT,\n} from './constants';\n\nconst typeToDefaultMetaData = {\n [CHART_TYPE]: { width: GRID_DEFAULT_CHART_WIDTH, height: 50 },\n [COLUMN_TYPE]: {\n width: GRID_DEFAULT_CHART_WIDTH,\n background: BACKGROUND_TRANSPARENT,\n },\n [DIVIDER_TYPE]: null,\n [HEADER_TYPE]: {\n text: t('New header'),\n headerSize: MEDIUM_HEADER,\n background: BACKGROUND_TRANSPARENT,\n },\n [MARKDOWN_TYPE]: { width: GRID_DEFAULT_CHART_WIDTH, height: 50 },\n [ROW_TYPE]: { background: BACKGROUND_TRANSPARENT },\n [TABS_TYPE]: null,\n [TAB_TYPE]: {\n text: '',\n defaultText: t('Tab title'),\n placeholder: t('Tab title'),\n },\n [DYNAMIC_TYPE]: {\n width: GRID_COLUMN_COUNT,\n background: BACKGROUND_TRANSPARENT,\n },\n};\n\nfunction uuid(type) {\n return `${type}-${nanoid()}`;\n}\n\nexport default function entityFactory(type, meta, parents = []) {\n return {\n type,\n id: uuid(type),\n children: [],\n parents,\n meta: {\n ...typeToDefaultMetaData[type],\n ...meta,\n },\n };\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { getChartIdAndColumnFromFilterKey } from './getDashboardFilterKey';\n\n// input: { [id_column1]: values, [id_column2]: values }\n// output: { id: { column1: values, column2: values } }\nexport default function serializeActiveFilterValues(activeFilters) {\n return Object.entries(activeFilters).reduce((map, entry) => {\n const [filterKey, { values }] = entry;\n const { chartId, column } = getChartIdAndColumnFromFilterKey(filterKey);\n const entryByChartId = {\n ...map[chartId],\n [column]: values,\n };\n return {\n ...map,\n [chartId]: entryByChartId,\n };\n }, {});\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { logging } from '@superset-ui/core';\n\nexport default function updateComponentParentsList({\n currentComponent,\n layout = {},\n}) {\n if (currentComponent && layout) {\n if (layout[currentComponent.id]) {\n const parentsList = Array.isArray(currentComponent.parents)\n ? currentComponent.parents.slice()\n : [];\n\n parentsList.push(currentComponent.id);\n\n if (Array.isArray(currentComponent.children)) {\n currentComponent.children.forEach(childId => {\n if (layout[childId]) {\n // eslint-disable-next-line no-param-reassign\n layout[childId] = {\n ...layout[childId],\n parents: parentsList,\n };\n updateComponentParentsList({\n currentComponent: layout[childId],\n layout,\n });\n } else {\n logging.warn(\n `The current layout does not contain a component with the id: ${childId}. Skipping this component`,\n );\n }\n });\n }\n } else {\n logging.warn(\n `The current layout does not contain a component with the id: ${currentComponent?.id}. Skipping this component`,\n );\n }\n }\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n/**\n * This file exports all controls available for use in the different visualization types\n *\n * While the React components located in `controls/components` represent different\n * types of controls (CheckboxControl, SelectControl, TextControl, ...), the controls here\n * represent instances of control types, that can be reused across visualization types.\n *\n * When controls are reused across viz types, their values are carried over as a user\n * changes the chart types.\n *\n * While the keys defined in the control itself get passed to the controlType as props,\n * here's a list of the keys that are common to all controls, and as a result define the\n * control interface:\n *\n * - type: the control type, referencing a React component of the same name\n * - label: the label as shown in the control's header\n * - description: shown in the info tooltip of the control's header\n * - default: the default value when opening a new chart, or changing visualization type\n * - renderTrigger: a bool that defines whether the visualization should be re-rendered\n when changed. This should `true` for controls that only affect the rendering (client side)\n and don't affect the query or backend data processing as those require to re run a query\n and fetch the data\n * - validators: an array of functions that will receive the value of the component and\n should return error messages when the value is not valid. The error message gets\n bubbled up to the control header, section header and query panel header.\n * - warning: text shown as a tooltip on a warning icon in the control's header\n * - error: text shown as a tooltip on a error icon in the control's header\n * - mapStateToProps: a function that receives the App's state and return an object of k/v\n to overwrite configuration at runtime. This is useful to alter a component based on\n anything external to it, like another control's value. For instance it's possible to\n show a warning based on the value of another component. It's also possible to bind\n arbitrary data from the redux store to the component this way.\n * - tabOverride: set to 'data' if you want to force a renderTrigger to show up on the `Data`\n tab, otherwise `renderTrigger: true` components will show up on the `Style` tab.\n *\n * Note that the keys defined in controls in this file that are not listed above represent\n * props specific for the React component defined as `type`. Also note that this module work\n * in tandem with `controlPanels/index.js` that defines how controls are composed into sections for\n * each and every visualization type.\n */\nimport {\n t,\n getCategoricalSchemeRegistry,\n getSequentialSchemeRegistry,\n legacyValidateInteger,\n validateNonEmpty,\n} from '@superset-ui/core';\nimport { formatSelectOptions } from 'src/explore/exploreUtils';\nimport { TIME_FILTER_LABELS } from './constants';\nimport { StyledColumnOption } from './components/optionRenderers';\n\nconst categoricalSchemeRegistry = getCategoricalSchemeRegistry();\nconst sequentialSchemeRegistry = getSequentialSchemeRegistry();\n\nexport const PRIMARY_COLOR = { r: 0, g: 122, b: 135, a: 1 };\n\n// input choices & options\nexport const D3_FORMAT_OPTIONS = [\n ['SMART_NUMBER', t('Adaptive formatting')],\n ['~g', t('Original value')],\n [',d', ',d (12345.432 => 12,345)'],\n ['.1s', '.1s (12345.432 => 10k)'],\n ['.3s', '.3s (12345.432 => 12.3k)'],\n [',.1%', ',.1% (12345.432 => 1,234,543.2%)'],\n ['.3%', '.3% (12345.432 => 1234543.200%)'],\n ['.4r', '.4r (12345.432 => 12350)'],\n [',.3f', ',.3f (12345.432 => 12,345.432)'],\n ['+,', '+, (12345.432 => +12,345.432)'],\n ['$,.2f', '$,.2f (12345.432 => $12,345.43)'],\n ['DURATION', t('Duration in ms (66000 => 1m 6s)')],\n ['DURATION_SUB', t('Duration in ms (100.40008 => 100ms 400µs 80ns)')],\n];\n\nconst ROW_LIMIT_OPTIONS = [10, 50, 100, 250, 500, 1000, 5000, 10000, 50000];\n\nconst SERIES_LIMITS = [5, 10, 25, 50, 100, 500];\n\nexport const D3_FORMAT_DOCS =\n 'D3 format syntax: https://github.com/d3/d3-format';\n\nexport const D3_TIME_FORMAT_OPTIONS = [\n ['smart_date', t('Adaptive formatting')],\n ['%d/%m/%Y', '%d/%m/%Y | 14/01/2019'],\n ['%m/%d/%Y', '%m/%d/%Y | 01/14/2019'],\n ['%Y-%m-%d', '%Y-%m-%d | 2019-01-14'],\n ['%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M:%S | 2019-01-14 01:32:10'],\n ['%d-%m-%Y %H:%M:%S', '%Y-%m-%d %H:%M:%S | 14-01-2019 01:32:10'],\n ['%H:%M:%S', '%H:%M:%S | 01:32:10'],\n];\n\nconst timeColumnOption = {\n verbose_name: 'Time',\n column_name: '__timestamp',\n description: t(\n 'A reference to the [Time] configuration, taking granularity into ' +\n 'account',\n ),\n};\n\nconst groupByControl = {\n type: 'SelectControl',\n multi: true,\n freeForm: true,\n label: t('Dimensions'),\n default: [],\n includeTime: false,\n description: t(\n 'One or many columns to group by. High cardinality groupings should include a series limit ' +\n 'to limit the number of fetched and rendered series.',\n ),\n optionRenderer: c => ,\n valueKey: 'column_name',\n filterOption: ({ data: opt }, text) =>\n (opt.column_name &&\n opt.column_name.toLowerCase().indexOf(text.toLowerCase()) >= 0) ||\n (opt.verbose_name &&\n opt.verbose_name.toLowerCase().indexOf(text.toLowerCase()) >= 0),\n mapStateToProps: (state, control) => {\n const newState = {};\n if (state.datasource) {\n newState.options = state.datasource.columns.filter(c => c.groupby);\n if (control && control.includeTime) {\n newState.options.push(timeColumnOption);\n }\n }\n return newState;\n },\n};\n\nconst metrics = {\n type: 'MetricsControl',\n multi: true,\n label: t('Metrics'),\n validators: [validateNonEmpty],\n mapStateToProps: state => {\n const { datasource } = state;\n return {\n columns: datasource ? datasource.columns : [],\n savedMetrics: datasource ? datasource.metrics : [],\n datasource,\n };\n },\n description: t('One or many metrics to display'),\n};\nconst metric = {\n ...metrics,\n multi: false,\n label: t('Metric'),\n description: t('Metric'),\n};\n\nexport function columnChoices(datasource) {\n if (datasource && datasource.columns) {\n return datasource.columns\n .map(col => [col.column_name, col.verbose_name || col.column_name])\n .sort((opt1, opt2) =>\n opt1[1].toLowerCase() > opt2[1].toLowerCase() ? 1 : -1,\n );\n }\n return [];\n}\n\nexport const controls = {\n metrics,\n\n metric,\n\n datasource: {\n type: 'DatasourceControl',\n label: t('Dataset'),\n default: null,\n description: null,\n mapStateToProps: ({ datasource }) => ({\n datasource,\n isEditable: !!datasource,\n }),\n },\n\n viz_type: {\n type: 'VizTypeControl',\n default: 'table',\n description: t('The type of visualization to display'),\n },\n\n color_picker: {\n label: t('Fixed color'),\n description: t('Use this to define a static color for all circles'),\n type: 'ColorPickerControl',\n default: PRIMARY_COLOR,\n renderTrigger: true,\n },\n\n metric_2: {\n ...metric,\n label: t('Right axis metric'),\n clearable: true,\n description: t('Choose a metric for right axis'),\n },\n\n linear_color_scheme: {\n type: 'ColorSchemeControl',\n label: t('Linear color scheme'),\n choices: () =>\n sequentialSchemeRegistry.values().map(value => [value.id, value.label]),\n default: sequentialSchemeRegistry.getDefaultKey(),\n clearable: false,\n description: '',\n renderTrigger: true,\n schemes: () => sequentialSchemeRegistry.getMap(),\n isLinear: true,\n },\n\n secondary_metric: {\n ...metric,\n label: t('Color metric'),\n default: null,\n validators: [],\n description: t('A metric to use for color'),\n },\n\n groupby: groupByControl,\n\n columns: {\n ...groupByControl,\n label: t('Columns'),\n description: t('One or many controls to pivot as columns'),\n },\n\n granularity: {\n type: 'SelectControl',\n freeForm: true,\n label: TIME_FILTER_LABELS.granularity,\n default: 'P1D',\n choices: [\n [null, t('all')],\n ['PT5S', t('5 seconds')],\n ['PT30S', t('30 seconds')],\n ['PT1M', t('1 minute')],\n ['PT5M', t('5 minutes')],\n ['PT30M', t('30 minutes')],\n ['PT1H', t('1 hour')],\n ['PT6H', t('6 hour')],\n ['P1D', t('1 day')],\n ['P7D', t('7 days')],\n ['P1W', t('week')],\n ['week_starting_sunday', t('week starting Sunday')],\n ['week_ending_saturday', t('week ending Saturday')],\n ['P1M', t('month')],\n ['P3M', t('quarter')],\n ['P1Y', t('year')],\n ],\n description: t(\n 'The time granularity for the visualization. Note that you ' +\n 'can type and use simple natural language as in `10 seconds`,' +\n '`1 day` or `56 weeks`',\n ),\n },\n\n granularity_sqla: {\n type: 'SelectControl',\n label: TIME_FILTER_LABELS.granularity_sqla,\n description: t(\n 'The time column for the visualization. Note that you ' +\n 'can define arbitrary expression that return a DATETIME ' +\n 'column in the table. Also note that the ' +\n 'filter below is applied against this column or ' +\n 'expression',\n ),\n clearable: false,\n optionRenderer: c => ,\n valueKey: 'column_name',\n mapStateToProps: state => {\n const props = {};\n if (state.datasource) {\n props.choices = state.datasource.granularity_sqla;\n props.default = null;\n if (state.datasource.main_dttm_col) {\n props.default = state.datasource.main_dttm_col;\n } else if (props.choices && props.choices.length > 0) {\n props.default = props.choices[0].column_name;\n }\n }\n return props;\n },\n },\n\n time_grain_sqla: {\n type: 'SelectControl',\n label: TIME_FILTER_LABELS.time_grain_sqla,\n default: 'P1D',\n description: t(\n 'The time granularity for the visualization. This ' +\n 'applies a date transformation to alter ' +\n 'your time column and defines a new time granularity. ' +\n 'The options here are defined on a per database ' +\n 'engine basis in the Superset source code.',\n ),\n mapStateToProps: state => ({\n choices: state.datasource ? state.datasource.time_grain_sqla : null,\n }),\n },\n\n time_range: {\n type: 'DateFilterControl',\n freeForm: true,\n label: TIME_FILTER_LABELS.time_range,\n default: t('No filter'), // this value is translated, but the backend wouldn't understand a translated value?\n description: t(\n 'The time range for the visualization. All relative times, e.g. \"Last month\", ' +\n '\"Last 7 days\", \"now\", etc. are evaluated on the server using the server\\'s ' +\n 'local time (sans timezone). All tooltips and placeholder times are expressed ' +\n 'in UTC (sans timezone). The timestamps are then evaluated by the database ' +\n \"using the engine's local timezone. Note one can explicitly set the timezone \" +\n 'per the ISO 8601 format if specifying either the start and/or end time.',\n ),\n },\n\n row_limit: {\n type: 'SelectControl',\n freeForm: true,\n label: t('Row limit'),\n validators: [legacyValidateInteger],\n default: 10000,\n choices: formatSelectOptions(ROW_LIMIT_OPTIONS),\n description: t('Limits the number of rows that get displayed.'),\n },\n\n limit: {\n type: 'SelectControl',\n freeForm: true,\n label: t('Series limit'),\n validators: [legacyValidateInteger],\n choices: formatSelectOptions(SERIES_LIMITS),\n clearable: true,\n description: t(\n 'Limits the number of series that get displayed. A joined subquery (or an extra phase ' +\n 'where subqueries are not supported) is applied to limit the number of series that get ' +\n 'fetched and rendered. This feature is useful when grouping by high cardinality ' +\n 'column(s) though does increase the query complexity and cost.',\n ),\n },\n\n timeseries_limit_metric: {\n type: 'MetricsControl',\n label: t('Sort by'),\n default: null,\n clearable: true,\n description: t(\n 'Metric used to define how the top series are sorted if a series or row limit is present. ' +\n 'If undefined reverts to the first metric (where appropriate).',\n ),\n mapStateToProps: state => ({\n columns: state.datasource ? state.datasource.columns : [],\n savedMetrics: state.datasource ? state.datasource.metrics : [],\n datasource: state.datasource,\n }),\n },\n\n series: {\n ...groupByControl,\n label: t('Dimensions'),\n multi: false,\n default: null,\n description: t(\n 'Defines the grouping of entities. ' +\n 'Each series is shown as a specific color on the chart and ' +\n 'has a legend toggle',\n ),\n },\n\n entity: {\n ...groupByControl,\n label: t('Entity'),\n default: null,\n multi: false,\n validators: [validateNonEmpty],\n description: t('This defines the element to be plotted on the chart'),\n },\n\n x: {\n ...metric,\n label: t('X Axis'),\n description: t('Metric assigned to the [X] axis'),\n default: null,\n },\n\n y: {\n ...metric,\n label: t('Y Axis'),\n default: null,\n description: t('Metric assigned to the [Y] axis'),\n },\n\n size: {\n ...metric,\n label: t('Bubble size'),\n default: null,\n },\n\n y_axis_format: {\n type: 'SelectControl',\n freeForm: true,\n label: t('Y Axis Format'),\n renderTrigger: true,\n default: 'SMART_NUMBER',\n choices: D3_FORMAT_OPTIONS,\n description: D3_FORMAT_DOCS,\n mapStateToProps: state => {\n const showWarning =\n state.controls &&\n state.controls.comparison_type &&\n state.controls.comparison_type.value === 'percentage';\n return {\n warning: showWarning\n ? t(\n 'When `Calculation type` is set to \"Percentage change\", the Y ' +\n 'Axis Format is forced to `.1%`',\n )\n : null,\n disabled: showWarning,\n };\n },\n },\n\n adhoc_filters: {\n type: 'AdhocFilterControl',\n label: t('Filters'),\n default: null,\n description: '',\n mapStateToProps: state => ({\n columns: state.datasource\n ? state.datasource.columns.filter(c => c.filterable)\n : [],\n savedMetrics: state.datasource ? state.datasource.metrics : [],\n datasource: state.datasource,\n }),\n },\n\n color_scheme: {\n type: 'ColorSchemeControl',\n label: t('Color scheme'),\n default: categoricalSchemeRegistry.getDefaultKey(),\n renderTrigger: true,\n choices: () => categoricalSchemeRegistry.keys().map(s => [s, s]),\n description: t('The color scheme for rendering chart'),\n schemes: () => categoricalSchemeRegistry.getMap(),\n },\n};\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { useCallback, useEffect } from 'react';\n/* eslint camelcase: 0 */\nimport URI from 'urijs';\nimport {\n buildQueryContext,\n ensureIsArray,\n getChartBuildQueryRegistry,\n getChartMetadataRegistry,\n SupersetClient,\n} from '@superset-ui/core';\nimport { availableDomains } from 'src/utils/hostNamesConfig';\nimport { safeStringify } from 'src/utils/safeStringify';\nimport { optionLabel } from 'src/utils/common';\nimport { URL_PARAMS } from 'src/constants';\nimport {\n MULTI_OPERATORS,\n OPERATOR_ENUM_TO_OPERATOR_TYPE,\n UNSAVED_CHART_ID,\n} from 'src/explore/constants';\nimport { DashboardStandaloneMode } from 'src/dashboard/util/constants';\n\nexport function getChartKey(explore) {\n const { slice, form_data } = explore;\n return slice?.slice_id ?? form_data?.slice_id ?? UNSAVED_CHART_ID;\n}\n\nlet requestCounter = 0;\nexport function getHostName(allowDomainSharding = false) {\n let currentIndex = 0;\n if (allowDomainSharding) {\n currentIndex = requestCounter % availableDomains.length;\n requestCounter += 1;\n\n // if domain sharding is enabled, skip main domain for fetching chart API\n // leave main domain free for other calls like fav star, save change, etc.\n // to make dashboard be responsive when it's loading large number of charts\n if (currentIndex === 0) {\n currentIndex += 1;\n requestCounter += 1;\n }\n }\n return availableDomains[currentIndex];\n}\n\nexport function getAnnotationJsonUrl(slice_id, force) {\n if (slice_id === null || slice_id === undefined) {\n return null;\n }\n\n const uri = URI(window.location.search);\n return uri\n .pathname('/api/v1/chart/data')\n .search({\n form_data: safeStringify({ slice_id }),\n force,\n })\n .toString();\n}\n\nexport function getURIDirectory(endpointType = 'base') {\n // Building the directory part of the URI\n if (\n ['full', 'json', 'csv', 'query', 'results', 'samples'].includes(\n endpointType,\n )\n ) {\n return '/superset/explore_json/';\n }\n return '/explore/';\n}\n\nexport function mountExploreUrl(endpointType, extraSearch = {}, force = false) {\n const uri = new URI('/');\n const directory = getURIDirectory(endpointType);\n const search = uri.search(true);\n Object.keys(extraSearch).forEach(key => {\n search[key] = extraSearch[key];\n });\n if (endpointType === URL_PARAMS.standalone.name) {\n if (force) {\n search.force = '1';\n }\n search.standalone = DashboardStandaloneMode.HideNav;\n }\n return uri.directory(directory).search(search).toString();\n}\n\nexport function getChartDataUri({ path, qs, allowDomainSharding = false }) {\n // The search params from the window.location are carried through,\n // but can be specified with curUrl (used for unit tests to spoof\n // the window.location).\n let uri = new URI({\n protocol: window.location.protocol.slice(0, -1),\n hostname: getHostName(allowDomainSharding),\n port: window.location.port ? window.location.port : '',\n path,\n });\n if (qs) {\n uri = uri.search(qs);\n }\n return uri;\n}\n\n/**\n * This gets the minimal url for the given form data.\n * If there are dashboard overrides present in the form data,\n * they will not be included in the url.\n */\nexport function getExploreUrl({\n formData,\n endpointType = 'base',\n force = false,\n curUrl = null,\n requestParams = {},\n allowDomainSharding = false,\n method = 'POST',\n}) {\n if (!formData.datasource) {\n return null;\n }\n\n // label_colors should not pollute the URL\n // eslint-disable-next-line no-param-reassign\n delete formData.label_colors;\n\n let uri = getChartDataUri({ path: '/', allowDomainSharding });\n if (curUrl) {\n uri = URI(URI(curUrl).search());\n }\n\n const directory = getURIDirectory(endpointType);\n\n // Building the querystring (search) part of the URI\n const search = uri.search(true);\n const { slice_id, extra_filters, adhoc_filters, viz_type } = formData;\n if (slice_id) {\n const form_data = { slice_id };\n if (method === 'GET') {\n form_data.viz_type = viz_type;\n if (extra_filters && extra_filters.length) {\n form_data.extra_filters = extra_filters;\n }\n if (adhoc_filters && adhoc_filters.length) {\n form_data.adhoc_filters = adhoc_filters;\n }\n }\n search.form_data = safeStringify(form_data);\n }\n if (force) {\n search.force = 'true';\n }\n if (endpointType === 'csv') {\n search.csv = 'true';\n }\n if (endpointType === URL_PARAMS.standalone.name) {\n search.standalone = '1';\n }\n if (endpointType === 'query') {\n search.query = 'true';\n }\n if (endpointType === 'results') {\n search.results = 'true';\n }\n if (endpointType === 'samples') {\n search.samples = 'true';\n }\n const paramNames = Object.keys(requestParams);\n if (paramNames.length) {\n paramNames.forEach(name => {\n if (requestParams.hasOwnProperty(name)) {\n search[name] = requestParams[name];\n }\n });\n }\n return uri.search(search).directory(directory).toString();\n}\n\nexport const getQuerySettings = formData => {\n const vizMetadata = getChartMetadataRegistry().get(formData.viz_type);\n return [\n vizMetadata?.useLegacyApi ?? false,\n vizMetadata?.parseMethod ?? 'json-bigint',\n ];\n};\n\nexport const buildV1ChartDataPayload = ({\n formData,\n force,\n resultFormat,\n resultType,\n setDataMask,\n ownState,\n}) => {\n const buildQuery =\n getChartBuildQueryRegistry().get(formData.viz_type) ??\n (buildQueryformData =>\n buildQueryContext(buildQueryformData, baseQueryObject => [\n {\n ...baseQueryObject,\n },\n ]));\n return buildQuery(\n {\n ...formData,\n force,\n result_format: resultFormat,\n result_type: resultType,\n },\n {\n ownState,\n hooks: {\n setDataMask,\n },\n },\n );\n};\n\nexport const getLegacyEndpointType = ({ resultType, resultFormat }) =>\n resultFormat === 'csv' ? resultFormat : resultType;\n\nexport const exportChart = ({\n formData,\n resultFormat = 'json',\n resultType = 'full',\n force = false,\n ownState = {},\n}) => {\n let url;\n let payload;\n const [useLegacyApi, parseMethod] = getQuerySettings(formData);\n if (useLegacyApi) {\n const endpointType = getLegacyEndpointType({ resultFormat, resultType });\n url = getExploreUrl({\n formData,\n endpointType,\n allowDomainSharding: false,\n });\n payload = formData;\n } else {\n url = '/api/v1/chart/data';\n payload = buildV1ChartDataPayload({\n formData,\n force,\n resultFormat,\n resultType,\n ownState,\n parseMethod,\n });\n }\n\n SupersetClient.postForm(url, { form_data: safeStringify(payload) });\n};\n\nexport const exploreChart = (formData, requestParams) => {\n const url = getExploreUrl({\n formData,\n endpointType: 'base',\n allowDomainSharding: false,\n requestParams,\n });\n SupersetClient.postForm(url, { form_data: safeStringify(formData) });\n};\n\nexport const useDebouncedEffect = (effect, delay, deps) => {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const callback = useCallback(effect, deps);\n\n useEffect(() => {\n const handler = setTimeout(() => {\n callback();\n }, delay);\n\n return () => {\n clearTimeout(handler);\n };\n }, [callback, delay]);\n};\n\nexport const getSimpleSQLExpression = (subject, operator, comparator) => {\n const isMulti =\n [...MULTI_OPERATORS]\n .map(op => OPERATOR_ENUM_TO_OPERATOR_TYPE[op].operation)\n .indexOf(operator) >= 0;\n // If returned value is an object after changing dataset\n let expression =\n typeof subject === 'object' ? subject?.column_name ?? '' : subject ?? '';\n if (subject && operator) {\n expression += ` ${operator}`;\n const firstValue =\n isMulti && Array.isArray(comparator) ? comparator[0] : comparator;\n const comparatorArray = ensureIsArray(comparator);\n const isString =\n firstValue !== undefined && Number.isNaN(Number(firstValue));\n const quote = isString ? \"'\" : '';\n const [prefix, suffix] = isMulti ? ['(', ')'] : ['', ''];\n const formattedComparators = comparatorArray\n .map(val => optionLabel(val))\n .map(\n val =>\n `${quote}${isString ? String(val).replace(/'/g, \"''\") : val}${quote}`,\n );\n if (comparatorArray.length > 0) {\n expression += ` ${prefix}${formattedComparators.join(', ')}${suffix}`;\n }\n }\n return expression;\n};\n\nexport function formatSelectOptions(options) {\n return options.map(opt => [opt, opt.toString()]);\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n/* eslint camelcase: 0 */\nimport { getChartControlPanelRegistry } from '@superset-ui/core';\nimport { getAllControlsState, getFormDataFromControls } from './controlUtils';\nimport { controls } from './controls';\n\nfunction handleDeprecatedControls(formData) {\n // Reaffectation / handling of deprecated controls\n /* eslint-disable no-param-reassign */\n\n // y_axis_zero was a boolean forcing 0 to be part of the Y Axis\n if (formData.y_axis_zero) {\n formData.y_axis_bounds = [0, null];\n }\n}\n\nexport function getControlsState(state, inputFormData) {\n /*\n * Gets a new controls object to put in the state. The controls object\n * is similar to the configuration control with only the controls\n * related to the current viz_type, materializes mapStateToProps functions,\n * adds value keys coming from inputFormData passed here. This can't be an action creator\n * just yet because it's used in both the explore and dashboard views.\n * */\n // Getting a list of active control names for the current viz\n const formData = { ...inputFormData };\n const vizType =\n formData.viz_type || state.common?.conf.DEFAULT_VIZ_TYPE || 'table';\n\n handleDeprecatedControls(formData);\n const controlsState = getAllControlsState(\n vizType,\n state.datasource.type,\n state,\n formData,\n );\n\n const controlPanelConfig = getChartControlPanelRegistry().get(vizType) || {};\n if (controlPanelConfig.onInit) {\n return controlPanelConfig.onInit(controlsState);\n }\n\n return controlsState;\n}\n\nexport function applyDefaultFormData(inputFormData) {\n const datasourceType = inputFormData.datasource.split('__')[1];\n const vizType = inputFormData.viz_type;\n const controlsState = getAllControlsState(\n vizType,\n datasourceType,\n null,\n inputFormData,\n );\n const controlFormData = getFormDataFromControls(controlsState);\n\n const formData = {};\n Object.keys(controlsState)\n .concat(Object.keys(inputFormData))\n .forEach(controlName => {\n if (inputFormData[controlName] === undefined) {\n formData[controlName] = controlFormData[controlName];\n } else {\n formData[controlName] = inputFormData[controlName];\n }\n });\n\n return formData;\n}\n\nconst defaultControls = { ...controls };\nObject.keys(controls).forEach(f => {\n defaultControls[f].value = controls[f].default;\n});\n\nconst defaultState = {\n controls: defaultControls,\n form_data: getFormDataFromControls(defaultControls),\n};\n\nexport { defaultControls, defaultState };\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n/* eslint camelcase: 0 */\nimport { t, SupersetClient } from '@superset-ui/core';\nimport rison from 'rison';\nimport {\n addDangerToast,\n addSuccessToast,\n} from 'src/components/MessageToasts/actions';\nimport { isEmpty } from 'lodash';\n\nexport const SET_REPORT = 'SET_REPORT';\nexport function setReport(report, resourceId, creationMethod, filterField) {\n return { type: SET_REPORT, report, resourceId, creationMethod, filterField };\n}\n\nexport function fetchUISpecificReport({\n userId,\n filterField,\n creationMethod,\n resourceId,\n}) {\n const queryParams = rison.encode({\n filters: [\n {\n col: filterField,\n opr: 'eq',\n value: resourceId,\n },\n {\n col: 'creation_method',\n opr: 'eq',\n value: creationMethod,\n },\n {\n col: 'created_by',\n opr: 'rel_o_m',\n value: userId,\n },\n ],\n });\n return function fetchUISpecificReportThunk(dispatch) {\n return SupersetClient.get({\n endpoint: `/api/v1/report/?q=${queryParams}`,\n })\n .then(({ json }) => {\n dispatch(setReport(json, resourceId, creationMethod, filterField));\n })\n .catch(() =>\n dispatch(\n addDangerToast(\n t(\n 'There was an issue fetching reports attached to this dashboard.',\n ),\n ),\n ),\n );\n };\n}\n\nconst structureFetchAction = (dispatch, getState) => {\n const state = getState();\n const { user, dashboardInfo, charts, explore } = state;\n if (!isEmpty(dashboardInfo)) {\n dispatch(\n fetchUISpecificReport({\n userId: user.userId,\n filterField: 'dashboard_id',\n creationMethod: 'dashboards',\n resourceId: dashboardInfo.id,\n }),\n );\n } else {\n const [chartArr] = Object.keys(charts);\n dispatch(\n fetchUISpecificReport({\n userId: explore.user?.userId || user?.userId,\n filterField: 'chart_id',\n creationMethod: 'charts',\n resourceId: charts[chartArr].id,\n }),\n );\n }\n};\n\nexport const ADD_REPORT = 'ADD_REPORT';\n\nexport const addReport = report => dispatch =>\n SupersetClient.post({\n endpoint: `/api/v1/report/`,\n jsonPayload: report,\n }).then(({ json }) => {\n dispatch({ type: ADD_REPORT, json });\n dispatch(addSuccessToast(t('The report has been created')));\n });\n\nexport const EDIT_REPORT = 'EDIT_REPORT';\n\nexport const editReport = (id, report) => dispatch =>\n SupersetClient.put({\n endpoint: `/api/v1/report/${id}`,\n jsonPayload: report,\n }).then(({ json }) => {\n dispatch({ type: EDIT_REPORT, json });\n dispatch(addSuccessToast(t('Report updated')));\n });\n\nexport function toggleActive(report, isActive) {\n return function toggleActiveThunk(dispatch) {\n return SupersetClient.put({\n endpoint: encodeURI(`/api/v1/report/${report.id}`),\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n active: isActive,\n }),\n })\n .catch(() => {\n dispatch(\n addDangerToast(\n t('We were unable to active or deactivate this report.'),\n ),\n );\n })\n .finally(() => {\n dispatch(structureFetchAction);\n });\n };\n}\n\nexport const DELETE_REPORT = 'DELETE_REPORT';\n\nexport function deleteActiveReport(report) {\n return function deleteActiveReportThunk(dispatch) {\n return SupersetClient.delete({\n endpoint: encodeURI(`/api/v1/report/${report.id}`),\n })\n .catch(() => {\n dispatch(addDangerToast(t('Your report could not be deleted')));\n })\n .finally(() => {\n dispatch({ type: DELETE_REPORT, report });\n dispatch(addSuccessToast(t('Deleted: %s', report.name)));\n });\n };\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport {\n SupersetClient,\n getTimeFormatter,\n TimeFormats,\n ensureIsArray,\n} from '@superset-ui/core';\n\n// ATTENTION: If you change any constants, make sure to also change constants.py\n\nexport const EMPTY_STRING = '';\nexport const NULL_STRING = '';\nexport const TRUE_STRING = 'TRUE';\nexport const FALSE_STRING = 'FALSE';\n\n// moment time format strings\nexport const SHORT_DATE = 'MMM D, YYYY';\nexport const SHORT_TIME = 'h:m a';\n\nconst DATETIME_FORMATTER = getTimeFormatter(TimeFormats.DATABASE_DATETIME);\n\nexport function storeQuery(query) {\n return SupersetClient.post({\n endpoint: '/kv/store/',\n postPayload: { data: query },\n }).then(response => {\n const baseUrl = window.location.origin + window.location.pathname;\n const url = `${baseUrl}?id=${response.json.id}`;\n return url;\n });\n}\n\nexport function optionLabel(opt) {\n if (opt === null) {\n return NULL_STRING;\n }\n if (opt === '') {\n return EMPTY_STRING;\n }\n if (opt === true) {\n return TRUE_STRING;\n }\n if (opt === false) {\n return FALSE_STRING;\n }\n if (typeof opt !== 'string' && opt.toString) {\n return opt.toString();\n }\n return opt;\n}\n\nexport function optionValue(opt) {\n if (opt === null) {\n return NULL_STRING;\n }\n return opt;\n}\n\nexport function optionFromValue(opt) {\n // From a list of options, handles special values & labels\n return { value: optionValue(opt), label: optionLabel(opt) };\n}\n\nfunction getColumnName(column) {\n return column.name || column;\n}\n\nexport function prepareCopyToClipboardTabularData(data, columns) {\n let result = columns.length\n ? `${columns.map(getColumnName).join('\\t')}\\n`\n : '';\n for (let i = 0; i < data.length; i += 1) {\n const row = {};\n for (let j = 0; j < columns.length; j += 1) {\n // JavaScript does not maintain the order of a mixed set of keys (i.e integers and strings)\n // the below function orders the keys based on the column names.\n const key = getColumnName(columns[j]);\n if (key in data[i]) {\n row[j] = data[i][key];\n } else {\n row[j] = data[i][parseFloat(key)];\n }\n }\n result += `${Object.values(row).join('\\t')}\\n`;\n }\n return result;\n}\n\nexport function applyFormattingToTabularData(data, timeFormattedColumns) {\n if (\n !data ||\n data.length === 0 ||\n ensureIsArray(timeFormattedColumns).length === 0\n ) {\n return data;\n }\n\n return data.map(row => ({\n ...row,\n /* eslint-disable no-underscore-dangle */\n ...timeFormattedColumns.reduce((acc, colName) => {\n if (row[colName] !== null && row[colName] !== undefined) {\n acc[colName] = DATETIME_FORMATTER(row[colName]);\n }\n return acc;\n }, {}),\n }));\n}\n\nexport const noOp = () => undefined;\n\n// Detects the user's OS through the browser\nexport const detectOS = () => {\n const { appVersion } = navigator;\n\n // Leveraging this condition because of stackOverflow\n // https://stackoverflow.com/questions/11219582/how-to-detect-my-browser-version-and-operating-system-using-javascript\n if (appVersion.includes('Win')) return 'Windows';\n if (appVersion.includes('Mac')) return 'MacOS';\n if (appVersion.includes('X11')) return 'UNIX';\n if (appVersion.includes('Linux')) return 'Linux';\n\n return 'Unknown OS';\n};\n\nexport const isSafari = () => {\n const { userAgent } = navigator;\n\n return userAgent && /^((?!chrome|android).)*safari/i.test(userAgent);\n};\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport moment from 'moment';\n\nexport const fDuration = function (t1, t2, format = 'HH:mm:ss.SS') {\n const diffSec = t2 - t1;\n const duration = moment(new Date(diffSec));\n return duration.utc().format(format);\n};\n\nexport const now = function () {\n // seconds from EPOCH as a float\n return moment().utc().valueOf();\n};\n\nexport const epochTimeXHoursAgo = function (h) {\n return moment().subtract(h, 'hours').utc().valueOf();\n};\n\nexport const epochTimeXDaysAgo = function (d) {\n return moment().subtract(d, 'days').utc().valueOf();\n};\n\nexport const epochTimeXYearsAgo = function (y) {\n return moment().subtract(y, 'years').utc().valueOf();\n};\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { initFeatureFlags } from '@superset-ui/core';\nimport getBootstrapData from './getBootstrapData';\n\nfunction getDomainsConfig() {\n const appContainer = document.getElementById('app');\n if (!appContainer) {\n return [];\n }\n\n const availableDomains = new Set([window.location.hostname]);\n\n // don't do domain sharding if a certain query param is set\n const disableDomainSharding =\n new URLSearchParams(window.location.search).get('disableDomainSharding') ===\n '1';\n if (disableDomainSharding) {\n return Array.from(availableDomains);\n }\n\n const bootstrapData = getBootstrapData();\n // this module is a little special, it may be loaded before index.jsx,\n // where window.featureFlags get initialized\n // eslint-disable-next-line camelcase\n initFeatureFlags(bootstrapData.common.feature_flags);\n\n if (bootstrapData?.common?.conf?.SUPERSET_WEBSERVER_DOMAINS) {\n bootstrapData.common.conf.SUPERSET_WEBSERVER_DOMAINS.forEach(hostName => {\n availableDomains.add(hostName);\n });\n }\n return Array.from(availableDomains);\n}\n\nexport const availableDomains = getDomainsConfig();\n\nexport const allowCrossDomain = availableDomains.length > 1;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { kebabCase } from 'lodash';\nimport { t, useTheme, styled } from '@superset-ui/core';\nimport Tooltip from './Tooltip';\n\ninterface CertifiedIconWithTooltipProps {\n certifiedBy?: string | null;\n details?: string | null;\n metricName: string;\n}\n\nconst StyledDiv = styled.div`\n margin-bottom: ${({ theme }) => theme.gridUnit * 2}px;\n`;\n\nfunction CertifiedIconWithTooltip({\n certifiedBy,\n details,\n metricName,\n}: CertifiedIconWithTooltipProps) {\n const theme = useTheme();\n return (\n \n {certifiedBy && (\n {t('Certified by %s', certifiedBy)}\n )}\n
{details}
\n \n }\n >\n {/* TODO: move Icons to superset-ui to remove duplicated icon code here */}\n \n \n \n \n \n \n );\n}\n\nexport default CertifiedIconWithTooltip;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { useState, ReactNode, useLayoutEffect, RefObject } from 'react';\nimport { css, SafeMarkdown, styled, SupersetTheme } from '@superset-ui/core';\nimport { Tooltip } from './Tooltip';\nimport { ColumnTypeLabel } from './ColumnTypeLabel/ColumnTypeLabel';\nimport CertifiedIconWithTooltip from './CertifiedIconWithTooltip';\nimport { ColumnMeta } from '../types';\nimport {\n getColumnLabelText,\n getColumnTooltipNode,\n getColumnTypeTooltipNode,\n} from './labelUtils';\nimport { SQLPopover } from './SQLPopover';\nimport InfoTooltipWithTrigger from './InfoTooltipWithTrigger';\n\nexport type ColumnOptionProps = {\n column: ColumnMeta;\n showType?: boolean;\n labelRef?: RefObject;\n};\n\nconst StyleOverrides = styled.span`\n display: flex;\n align-items: center;\n svg {\n margin-right: ${({ theme }) => theme.gridUnit}px;\n }\n`;\n\nexport function ColumnOption({\n column,\n labelRef,\n showType = false,\n}: ColumnOptionProps) {\n const { expression, column_name, type_generic } = column;\n const hasExpression = expression && expression !== column_name;\n const warningMarkdown =\n column.warning_markdown || column.warning_text || column.error_text;\n const type = hasExpression ? 'expression' : type_generic;\n const [tooltipText, setTooltipText] = useState(column.column_name);\n const [columnTypeTooltipText, setcolumnTypeTooltipText] = useState(\n column.type,\n );\n\n useLayoutEffect(() => {\n setTooltipText(getColumnTooltipNode(column, labelRef));\n setcolumnTypeTooltipText(getColumnTypeTooltipNode(column));\n }, [labelRef, column]);\n\n return (\n \n {showType && type !== undefined && (\n \n \n \n \n \n )}\n \n css`\n margin-right: ${theme.gridUnit}px;\n `}\n ref={labelRef}\n >\n {getColumnLabelText(column)}\n \n \n {hasExpression && }\n {column.is_certified && (\n \n )}\n {warningMarkdown && (\n }\n label={`warn-${column.column_name}`}\n iconsStyle={{ marginLeft: 0 }}\n {...(column.error_text && {\n className: 'text-danger',\n icon: 'exclamation-circle',\n })}\n />\n )}\n \n );\n}\n\nexport default ColumnOption;\n","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nimport { forwardRef } from \"react\";\nconst SvgFieldDerived = ({\n title,\n titleId,\n ...props\n}, ref) => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n fill: \"none\",\n ref: ref,\n \"aria-labelledby\": titleId\n}, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n}, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"currentColor\",\n fillRule: \"evenodd\",\n d: \"m6.988 10.809-1.031 4.84q-.276 1.3-1.16 2.126-.885.827-1.822.827-.516 0-.76-.197a.61.61 0 0 1-.242-.495.7.7 0 0 1 .152-.445q.152-.194.44-.194.18 0 .319.082a1 1 0 0 1 .243.206q.082.099.185.27l.178.292q.452-.034.77-.61.32-.573.554-1.64l1.079-5.062H4.75l.123-.534h1.13l.083-.398q.14-.68.445-1.225t.692-.925q.381-.375.864-.59.483-.213.929-.213.515 0 .758.196a.61.61 0 0 1 .244.495.73.73 0 0 1-.144.446q-.144.193-.448.193a.6.6 0 0 1-.317-.08.9.9 0 0 1-.24-.207 2 2 0 0 1-.187-.276 4 4 0 0 0-.176-.287q-.405.018-.715.534-.311.515-.562 1.716l-.13.621H8.57l-.123.534zm2.225 2.261c0-1.758.45-3.183 1.387-4.424h.713c-.694.89-1.236 2.774-1.236 4.424 0 1.66.537 3.54 1.236 4.429H10.6c-.938-1.24-1.387-2.666-1.387-4.429m5.288.957h-.078l-1.25 1.988h-.952l1.802-2.632L12.2 10.75h1.001l1.25 1.958h.078l1.236-1.958h.952l-1.787 2.598 1.811 2.666h-.996zm5.23-.952c0 1.758-.45 3.184-1.387 4.424h-.713c.693-.889 1.235-2.773 1.235-4.424 0-1.66-.537-3.54-1.235-4.429h.713c.937 1.24 1.386 2.666 1.386 4.43\",\n clipRule: \"evenodd\"\n})));\nconst ForwardRef = /*#__PURE__*/forwardRef(SvgFieldDerived);\nexport default ForwardRef;","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nimport { forwardRef } from \"react\";\nconst SvgFieldBoolean = ({\n title,\n titleId,\n ...props\n}, ref) => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n fill: \"none\",\n ref: ref,\n \"aria-labelledby\": titleId\n}, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n}, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"currentColor\",\n fillRule: \"evenodd\",\n d: \"M12 4h-1v16h1zm3.248 8.475c0 2.343.913 3.691 2.5 3.691 1.582 0 2.49-1.338 2.49-3.677 0-2.334-.923-3.7-2.49-3.7-1.577 0-2.5 1.361-2.5 3.686M5.579 9.93V16h.879V8.954h-.874l-1.875 1.348v.928l1.792-1.3zm12.169 5.468c1.04 0 1.607-1.035 1.607-2.924 0-1.87-.577-2.915-1.607-2.915s-1.616 1.054-1.616 2.915c0 1.884.576 2.924 1.616 2.924\",\n clipRule: \"evenodd\"\n})));\nconst ForwardRef = /*#__PURE__*/forwardRef(SvgFieldBoolean);\nexport default ForwardRef;","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nimport { forwardRef } from \"react\";\nconst SvgFieldAbc = ({\n title,\n titleId,\n ...props\n}, ref) => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n fill: \"none\",\n ref: ref,\n \"aria-labelledby\": titleId\n}, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n}, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"currentColor\",\n fillRule: \"evenodd\",\n d: \"M5.91 16.14c-1.14 0-2.047-.671-2.047-1.843 0-1.375 1.215-1.621 2.328-1.766 1.094-.14 1.547-.117 1.547-.562 0-.778-.41-1.235-1.265-1.235-.88 0-1.36.47-1.563.907l-.875-.313c.469-1.094 1.5-1.406 2.406-1.406.766 0 2.22.219 2.22 2.125V16h-.923v-.812h-.047c-.187.39-.734.953-1.78.953m.14-.828c1.095 0 1.688-.734 1.688-1.484v-.844c-.156.188-1.203.297-1.593.344-.72.094-1.36.313-1.36 1.016 0 .64.531.969 1.266.969M9.799 16V8h.922v2.953h.078c.203-.312.562-1.031 1.734-1.031 1.516 0 2.563 1.203 2.563 3.094 0 1.906-1.047 3.109-2.547 3.109-1.157 0-1.547-.719-1.75-1.047h-.11V16zm.906-3c0 1.36.61 2.297 1.719 2.297 1.156 0 1.75-1.016 1.75-2.297 0-1.266-.578-2.25-1.75-2.25-1.125 0-1.72.906-1.72 2.25m7.684 3.125c-1.687 0-2.719-1.297-2.719-3.094 0-1.828 1.079-3.11 2.704-3.11 1.265 0 2.218.75 2.375 1.876h-.922c-.14-.547-.625-1.047-1.438-1.047-1.078 0-1.797.89-1.797 2.25 0 1.39.703 2.297 1.797 2.297.719 0 1.266-.39 1.438-1.047h.922c-.157 1.063-1.032 1.875-2.36 1.875\",\n clipRule: \"evenodd\"\n})));\nconst ForwardRef = /*#__PURE__*/forwardRef(SvgFieldAbc);\nexport default ForwardRef;","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nimport { forwardRef } from \"react\";\nconst SvgFieldNum = ({\n title,\n titleId,\n ...props\n}, ref) => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n fill: \"none\",\n ref: ref,\n \"aria-labelledby\": titleId\n}, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n}, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"currentColor\",\n fillRule: \"evenodd\",\n d: \"M10 8h1v2h2V8h1v2h2v1h-2v2h2v1h-2v2h-1v-2h-2v2h-1v-2H8v-1h2v-2H8v-1h2zm3 5v-2h-2v2z\",\n clipRule: \"evenodd\"\n})));\nconst ForwardRef = /*#__PURE__*/forwardRef(SvgFieldNum);\nexport default ForwardRef;","/* eslint-disable no-nested-ternary */\n/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { ReactNode } from 'react';\nimport { css, GenericDataType, styled, t } from '@superset-ui/core';\nimport { ClockCircleOutlined, QuestionOutlined } from '@ant-design/icons';\n// TODO: move all icons to superset-ui/core\nimport FunctionSvg from './type-icons/field_derived.svg';\nimport BooleanSvg from './type-icons/field_boolean.svg';\nimport StringSvg from './type-icons/field_abc.svg';\nimport NumSvg from './type-icons/field_num.svg';\n\nexport type ColumnLabelExtendedType = 'expression' | '';\n\nexport type ColumnTypeLabelProps = {\n type?: ColumnLabelExtendedType | GenericDataType;\n};\n\nconst TypeIconWrapper = styled.div`\n ${({ theme }) => css`\n display: flex;\n justify-content: center;\n align-items: center;\n width: ${theme.gridUnit * 6}px;\n height: ${theme.gridUnit * 6}px;\n margin-right: ${theme.gridUnit}px;\n\n && svg {\n margin-right: 0;\n margin-left: 0;\n width: 100%;\n height: 100%;\n }\n `};\n`;\n\nexport function ColumnTypeLabel({ type }: ColumnTypeLabelProps) {\n let typeIcon: ReactNode = (\n \n );\n\n if (type === '' || type === 'expression') {\n typeIcon = ;\n } else if (type === GenericDataType.String) {\n typeIcon = ;\n } else if (type === GenericDataType.Numeric) {\n typeIcon = ;\n } else if (type === GenericDataType.Boolean) {\n typeIcon = ;\n } else if (type === GenericDataType.Temporal) {\n typeIcon = ;\n }\n\n return {typeIcon};\n}\n\nexport default ColumnTypeLabel;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { styled } from '@superset-ui/core';\n\nexport const ControlSubSectionHeader = styled.div`\n font-weight: ${({ theme }) => theme.typography.weights.bold};\n font-size: ${({ theme }) => theme.typography.sizes.s};\n margin-bottom: ${({ theme }) => theme.gridUnit}px;\n`;\nexport default ControlSubSectionHeader;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { CSSProperties } from 'react';\nimport { kebabCase } from 'lodash';\nimport { TooltipPlacement } from 'antd/lib/tooltip';\nimport { t } from '@superset-ui/core';\nimport { Tooltip, TooltipProps } from './Tooltip';\n\nexport interface InfoTooltipWithTriggerProps {\n label?: string;\n tooltip?: TooltipProps['title'];\n icon?: string;\n onClick?: () => void;\n placement?: TooltipPlacement;\n bsStyle?: string;\n className?: string;\n iconsStyle?: CSSProperties;\n}\n\nexport function InfoTooltipWithTrigger({\n label,\n tooltip,\n bsStyle,\n onClick,\n icon = 'info-circle',\n className = 'text-muted',\n placement = 'right',\n iconsStyle = {},\n}: InfoTooltipWithTriggerProps) {\n const iconClass = `fa fa-${icon} ${className} ${\n bsStyle ? `text-${bsStyle}` : ''\n }`;\n const iconEl = (\n {\n if (event.key === 'Enter' || event.key === ' ') {\n onClick();\n }\n })\n }\n />\n );\n if (!tooltip) {\n return iconEl;\n }\n return (\n \n {iconEl}\n \n );\n}\n\nexport default InfoTooltipWithTrigger;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { useState, ReactNode, useLayoutEffect, RefObject } from 'react';\n\nimport {\n css,\n styled,\n Metric,\n SafeMarkdown,\n SupersetTheme,\n} from '@superset-ui/core';\nimport InfoTooltipWithTrigger from './InfoTooltipWithTrigger';\nimport { ColumnTypeLabel } from './ColumnTypeLabel/ColumnTypeLabel';\nimport CertifiedIconWithTooltip from './CertifiedIconWithTooltip';\nimport Tooltip from './Tooltip';\nimport { getMetricTooltipNode } from './labelUtils';\nimport { SQLPopover } from './SQLPopover';\n\nconst FlexRowContainer = styled.div`\n align-items: center;\n display: flex;\n\n > svg {\n margin-right: ${({ theme }) => theme.gridUnit}px;\n }\n`;\n\nexport interface MetricOptionProps {\n metric: Omit & { label?: string };\n openInNewWindow?: boolean;\n showFormula?: boolean;\n showType?: boolean;\n url?: string;\n labelRef?: RefObject;\n shouldShowTooltip?: boolean;\n}\n\nexport function MetricOption({\n metric,\n labelRef,\n openInNewWindow = false,\n showFormula = true,\n showType = false,\n shouldShowTooltip = true,\n url = '',\n}: MetricOptionProps) {\n const verbose = metric.verbose_name || metric.metric_name || metric.label;\n const link = url ? (\n \n {verbose}\n \n ) : (\n verbose\n );\n\n const label = (\n css`\n margin-right: ${theme.gridUnit}px;\n `}\n ref={labelRef}\n >\n {link}\n \n );\n\n const warningMarkdown =\n metric.warning_markdown || metric.warning_text || metric.error_text;\n\n const [tooltipText, setTooltipText] = useState(metric.metric_name);\n\n useLayoutEffect(() => {\n setTooltipText(getMetricTooltipNode(metric, labelRef));\n }, [labelRef, metric]);\n\n return (\n \n {showType && }\n {shouldShowTooltip ? (\n \n {label}\n \n ) : (\n label\n )}\n {showFormula && metric.expression && (\n \n )}\n {metric.is_certified && (\n \n )}\n {warningMarkdown && (\n }\n label={`warn-${metric.metric_name}`}\n iconsStyle={{ marginLeft: 0 }}\n {...(metric.error_text && {\n className: 'text-danger',\n icon: 'exclamation-circle',\n })}\n />\n )}\n \n );\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { Popover } from 'antd';\nimport type { PopoverProps } from 'antd/lib/popover';\nimport AceEditor from 'react-ace';\nimport { CalculatorOutlined } from '@ant-design/icons';\nimport { css, styled, useTheme, t } from '@superset-ui/core';\nimport 'ace-builds/src-noconflict/mode-sql';\n\nconst StyledCalculatorIcon = styled(CalculatorOutlined)`\n ${({ theme }) => css`\n color: ${theme.colors.grayscale.base};\n font-size: ${theme.typography.sizes.s}px;\n & svg {\n margin-left: ${theme.gridUnit}px;\n margin-right: ${theme.gridUnit}px;\n }\n `}\n`;\n\nexport const SQLPopover = (props: PopoverProps & { sqlExpression: string }) => {\n const theme = useTheme();\n return (\n \n }\n placement=\"bottomLeft\"\n arrowPointAtCenter\n title={t('SQL expression')}\n {...props}\n >\n \n \n );\n};\n","/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { useTheme, css } from '@superset-ui/core';\nimport { Tooltip as BaseTooltip } from 'antd';\nimport type { TooltipProps } from 'antd/lib/tooltip';\nimport { Global } from '@emotion/react';\n\nexport type { TooltipProps } from 'antd/lib/tooltip';\n\nexport const Tooltip = ({ overlayStyle, color, ...props }: TooltipProps) => {\n const theme = useTheme();\n const defaultColor = `${theme.colors.grayscale.dark2}e6`;\n return (\n <>\n {/* Safari hack to hide browser default tooltips */}\n \n \n \n );\n};\n\nexport default Tooltip;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { ReactNode, RefObject } from 'react';\n\nimport { css, styled, t } from '@superset-ui/core';\nimport { ColumnMeta, Metric } from '@superset-ui/chart-controls';\n\nconst TooltipSectionWrapper = styled.div`\n ${({ theme }) => css`\n display: flex;\n flex-direction: column;\n font-size: ${theme.typography.sizes.s}px;\n line-height: 1.2;\n\n &:not(:last-of-type) {\n margin-bottom: ${theme.gridUnit * 2}px;\n }\n &:last-of-type {\n display: -webkit-box;\n -webkit-line-clamp: 40;\n -webkit-box-orient: vertical;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n `}\n`;\n\nconst TooltipSectionLabel = styled.span`\n ${({ theme }) => css`\n font-weight: ${theme.typography.weights.bold};\n `}\n`;\n\nconst TooltipSection = ({\n label,\n text,\n}: {\n label: ReactNode;\n text: ReactNode;\n}) => (\n \n {label}: {text}\n \n);\n\nexport const isLabelTruncated = (labelRef?: RefObject): boolean =>\n !!(labelRef?.current?.scrollWidth > labelRef?.current?.clientWidth);\n\nexport const getColumnLabelText = (column: ColumnMeta): string =>\n column.verbose_name || column.column_name;\n\nexport const getColumnTypeTooltipNode = (column: ColumnMeta): ReactNode => {\n if (!column.type) {\n return null;\n }\n\n return ;\n};\n\nexport const getColumnTooltipNode = (\n column: ColumnMeta,\n labelRef?: RefObject,\n): ReactNode => {\n if (\n (!column.column_name || !column.verbose_name) &&\n !column.description &&\n !isLabelTruncated(labelRef)\n ) {\n return null;\n }\n\n return (\n <>\n {column.column_name && (\n \n )}\n {column.verbose_name && (\n \n )}\n {column.description && (\n \n )}\n \n );\n};\n\ntype MetricType = Omit & { label?: string };\n\nexport const getMetricTooltipNode = (\n metric: MetricType,\n labelRef?: RefObject,\n): ReactNode => {\n if (\n !metric.verbose_name &&\n !metric.description &&\n !metric.label &&\n !isLabelTruncated(labelRef)\n ) {\n return null;\n }\n\n return (\n <>\n \n {(metric.label || metric.verbose_name) && (\n \n )}\n {metric.description && (\n \n )}\n \n );\n};\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport {\n DTTM_ALIAS,\n GenericDataType,\n QueryColumn,\n QueryMode,\n t,\n} from '@superset-ui/core';\nimport { ColumnMeta, SortSeriesData, SortSeriesType } from './types';\n\nexport const DEFAULT_MAX_ROW = 100000;\n\n// eslint-disable-next-line import/prefer-default-export\nexport const TIME_FILTER_LABELS = {\n time_range: t('Time Range'),\n granularity_sqla: t('Time Column'),\n time_grain_sqla: t('Time Grain'),\n granularity: t('Time Granularity'),\n};\n\nexport const COLUMN_NAME_ALIASES: Record = {\n [DTTM_ALIAS]: t('Time'),\n};\n\nexport const DATASET_TIME_COLUMN_OPTION: ColumnMeta = {\n verbose_name: COLUMN_NAME_ALIASES[DTTM_ALIAS],\n column_name: DTTM_ALIAS,\n type: 'TIMESTAMP',\n type_generic: GenericDataType.Temporal,\n description: t(\n 'A reference to the [Time] configuration, taking granularity into account',\n ),\n};\n\nexport const QUERY_TIME_COLUMN_OPTION: QueryColumn = {\n column_name: DTTM_ALIAS,\n is_dttm: true,\n type: 'TIMESTAMP',\n type_generic: GenericDataType.Temporal,\n};\n\nexport const QueryModeLabel = {\n [QueryMode.Aggregate]: t('Aggregate'),\n [QueryMode.Raw]: t('Raw records'),\n};\n\nexport const DEFAULT_SORT_SERIES_DATA: SortSeriesData = {\n sort_series_type: SortSeriesType.Sum,\n sort_series_ascending: false,\n};\n\nexport const SORT_SERIES_CHOICES = [\n [SortSeriesType.Name, t('Category name')],\n [SortSeriesType.Sum, t('Total value')],\n [SortSeriesType.Min, t('Minimum value')],\n [SortSeriesType.Max, t('Maximum value')],\n [SortSeriesType.Avg, t('Average value')],\n];\n\nexport const DEFAULT_XAXIS_SORT_SERIES_DATA: SortSeriesData = {\n sort_series_type: SortSeriesType.Name,\n sort_series_ascending: true,\n};\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { ReactNode } from 'react';\nimport { t } from '@superset-ui/core';\nimport { InfoTooltipWithTrigger } from './InfoTooltipWithTrigger';\nimport { Tooltip } from './Tooltip';\n\ntype ValidationError = string;\n\nexport type ControlHeaderProps = {\n name?: string;\n label?: ReactNode;\n description?: ReactNode;\n validationErrors?: ValidationError[];\n renderTrigger?: boolean;\n rightNode?: ReactNode;\n leftNode?: ReactNode;\n hovered?: boolean;\n required?: boolean;\n warning?: string;\n danger?: string;\n onClick?: () => void;\n tooltipOnClick?: () => void;\n};\n\nexport default function ControlHeader({\n name,\n description,\n label,\n tooltipOnClick,\n onClick,\n warning,\n danger,\n leftNode,\n rightNode,\n validationErrors = [],\n renderTrigger = false,\n hovered = false,\n required = false,\n}: ControlHeaderProps) {\n const renderOptionalIcons = () => {\n if (hovered) {\n return (\n \n {description && (\n \n {' '}\n \n )}\n {renderTrigger && (\n \n {' '}\n \n )}\n \n );\n }\n return null;\n };\n\n if (!label) {\n return null;\n }\n const labelClass = validationErrors.length > 0 ? 'text-danger' : '';\n return (\n
\n
\n \n
\n {rightNode &&
{rightNode}
}\n
\n
\n );\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport RadioButtonControl from './RadioButtonControl';\n\nexport * from './RadioButtonControl';\n\n/**\n * Shared chart controls. Can be referred via string shortcuts in chart control\n * configs.\n */\nexport default {\n RadioButtonControl,\n};\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { ReactNode } from 'react';\nimport { JsonValue, useTheme } from '@superset-ui/core';\nimport ControlHeader from '../../components/ControlHeader';\n\n// [value, label]\nexport type RadioButtonOption = [\n JsonValue,\n Exclude,\n];\n\nexport interface RadioButtonControlProps {\n label?: ReactNode;\n description?: string;\n options: RadioButtonOption[];\n hovered?: boolean;\n value?: JsonValue;\n onChange: (opt: RadioButtonOption[0]) => void;\n}\n\nexport default function RadioButtonControl({\n value: initialValue,\n options,\n onChange,\n ...props\n}: RadioButtonControlProps) {\n const currentValue = initialValue || options[0][0];\n const theme = useTheme();\n return (\n \n \n
\n {options.map(([val, label]) => (\n {\n onChange(val);\n }}\n >\n {label}\n \n ))}\n
\n
\n );\n}\n","/* eslint-disable camelcase */\n/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { QueryColumn, t, validateNonEmpty } from '@superset-ui/core';\nimport {\n ExtraControlProps,\n SharedControlConfig,\n Dataset,\n Metric,\n isDataset,\n} from '../types';\nimport { DATASET_TIME_COLUMN_OPTION, TIME_FILTER_LABELS } from '../constants';\nimport {\n QUERY_TIME_COLUMN_OPTION,\n defineSavedMetrics,\n ColumnOption,\n ColumnMeta,\n FilterOption,\n temporalColumnMixin,\n datePickerInAdhocFilterMixin,\n xAxisMixin,\n} from '..';\n\ntype Control = {\n savedMetrics?: Metric[] | null;\n default?: unknown;\n};\n\n/*\n * Note: Previous to the commit that introduced this comment, the shared controls module\n * would check feature flags at module execution time and expose a different control\n * configuration (component + props) depending on the status of drag-and-drop feature\n * flags. This commit combines those configs, merging the required props for both the\n * drag-and-drop and non-drag-and-drop components, and renders a wrapper component that\n * checks feature flags at component render time to avoid race conditions between when\n * feature flags are set and when they're checked.\n */\n\nexport const dndGroupByControl: SharedControlConfig<\n 'DndColumnSelect' | 'SelectControl',\n ColumnMeta\n> = {\n type: 'DndColumnSelect',\n label: t('Dimensions'),\n multi: true,\n freeForm: true,\n clearable: true,\n default: [],\n includeTime: false,\n description: t(\n 'Dimensions contain qualitative values such as names, dates, or geographical data. ' +\n 'Use dimensions to categorize, segment, and reveal the details in your data. ' +\n 'Dimensions affect the level of detail in the view.',\n ),\n optionRenderer: (c: ColumnMeta) => ,\n valueRenderer: (c: ColumnMeta) => ,\n valueKey: 'column_name',\n allowAll: true,\n filterOption: ({ data: opt }: FilterOption, text: string) =>\n opt.column_name?.toLowerCase().includes(text.toLowerCase()) ||\n opt.verbose_name?.toLowerCase().includes(text.toLowerCase()) ||\n false,\n promptTextCreator: (label: unknown) => label,\n mapStateToProps(state, controlState) {\n const newState: ExtraControlProps = {};\n const { datasource } = state;\n if (datasource?.columns[0]?.hasOwnProperty('groupby')) {\n const options = (datasource as Dataset).columns.filter(c => c.groupby);\n if (controlState?.includeTime) {\n options.unshift(DATASET_TIME_COLUMN_OPTION);\n }\n newState.options = options;\n newState.savedMetrics = (datasource as Dataset).metrics || [];\n } else {\n const options = (datasource?.columns as QueryColumn[]) || [];\n if (controlState?.includeTime) {\n options.unshift(QUERY_TIME_COLUMN_OPTION);\n }\n newState.options = options;\n }\n return newState;\n },\n commaChoosesOption: false,\n};\n\nexport const dndColumnsControl: typeof dndGroupByControl = {\n ...dndGroupByControl,\n label: t('Columns'),\n description: t('Add dataset columns here to group the pivot table columns.'),\n};\n\nexport const dndSeriesControl: typeof dndGroupByControl = {\n ...dndGroupByControl,\n label: t('Dimension'),\n multi: false,\n default: null,\n description: t(\n 'Defines the grouping of entities. ' +\n 'Each series is represented by a specific color in the chart.',\n ),\n};\n\nexport const dndEntityControl: typeof dndGroupByControl = {\n ...dndGroupByControl,\n label: t('Entity'),\n default: null,\n multi: false,\n validators: [validateNonEmpty],\n description: t('This defines the element to be plotted on the chart'),\n};\n\nexport const dndAdhocFilterControl: SharedControlConfig<\n 'DndFilterSelect' | 'AdhocFilterControl'\n> = {\n type: 'DndFilterSelect',\n label: t('Filters'),\n default: [],\n description: '',\n mapStateToProps: ({ datasource, form_data }) => ({\n columns: isDataset(datasource)\n ? datasource.columns.filter(c => c.filterable)\n : datasource?.columns || [],\n savedMetrics: defineSavedMetrics(datasource),\n // current active adhoc metrics\n selectedMetrics:\n form_data.metrics || (form_data.metric ? [form_data.metric] : []),\n datasource,\n }),\n provideFormDataToProps: true,\n ...datePickerInAdhocFilterMixin,\n};\n\nexport const dndAdhocMetricsControl: SharedControlConfig<\n 'DndMetricSelect' | 'MetricsControl'\n> = {\n type: 'DndMetricSelect',\n multi: true,\n label: t('Metrics'),\n validators: [validateNonEmpty],\n mapStateToProps: ({ datasource }) => ({\n columns: datasource?.columns || [],\n savedMetrics: defineSavedMetrics(datasource),\n datasource,\n datasourceType: datasource?.type,\n }),\n description: t(\n 'Select one or many metrics to display. ' +\n 'You can use an aggregation function on a column ' +\n 'or write custom SQL to create a metric.',\n ),\n};\n\nexport const dndAdhocMetricControl: typeof dndAdhocMetricsControl = {\n ...dndAdhocMetricsControl,\n multi: false,\n label: t('Metric'),\n description: t(\n 'Select a metric to display. ' +\n 'You can use an aggregation function on a column ' +\n 'or write custom SQL to create a metric.',\n ),\n};\n\nexport const dndAdhocMetricControl2: typeof dndAdhocMetricControl = {\n ...dndAdhocMetricControl,\n label: t('Right Axis Metric'),\n clearable: true,\n description: t('Select a metric to display on the right axis'),\n};\n\nexport const dndSortByControl: SharedControlConfig<\n 'DndMetricSelect' | 'MetricsControl'\n> = {\n type: 'DndMetricSelect',\n label: t('Sort by'),\n default: null,\n description: t(\n 'This metric is used to define row selection criteria (how the rows are sorted) if a series or row limit is present. ' +\n 'If not defined, it reverts to the first metric (where appropriate).',\n ),\n mapStateToProps: ({ datasource }) => ({\n columns: datasource?.columns || [],\n savedMetrics: defineSavedMetrics(datasource),\n datasource,\n datasourceType: datasource?.type,\n }),\n};\n\nexport const dndSizeControl: typeof dndAdhocMetricControl = {\n ...dndAdhocMetricControl,\n label: t('Bubble Size'),\n description: t('Metric used to calculate bubble size'),\n default: null,\n};\n\nexport const dndXControl: typeof dndAdhocMetricControl = {\n ...dndAdhocMetricControl,\n label: t('X Axis'),\n description: t(\n \"The dataset column/metric that returns the values on your chart's x-axis.\",\n ),\n default: null,\n};\n\nexport const dndYControl: typeof dndAdhocMetricControl = {\n ...dndAdhocMetricControl,\n label: t('Y Axis'),\n description: t(\n \"The dataset column/metric that returns the values on your chart's y-axis.\",\n ),\n default: null,\n};\n\nexport const dndSecondaryMetricControl: typeof dndAdhocMetricControl = {\n ...dndAdhocMetricControl,\n label: t('Color Metric'),\n default: null,\n validators: [],\n description: t('A metric to use for color'),\n};\n\nexport const dndGranularitySqlaControl: typeof dndSeriesControl = {\n ...dndSeriesControl,\n ...temporalColumnMixin,\n label: TIME_FILTER_LABELS.granularity_sqla,\n description: t(\n 'The time column for the visualization. Note that you ' +\n 'can define arbitrary expression that return a DATETIME ' +\n 'column in the table. Also note that the ' +\n 'filter below is applied against this column or ' +\n 'expression',\n ),\n default: (c: Control) => c.default,\n clearable: false,\n canDelete: false,\n ghostButtonText: t('Drop a temporal column here or click'),\n optionRenderer: (c: ColumnMeta) => ,\n valueRenderer: (c: ColumnMeta) => ,\n valueKey: 'column_name',\n};\n\nexport const dndXAxisControl: typeof dndGroupByControl = {\n ...dndGroupByControl,\n ...xAxisMixin,\n};\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport {\n ensureIsArray,\n NO_TIME_RANGE,\n QueryFormData,\n t,\n validateNonEmpty,\n} from '@superset-ui/core';\nimport {\n BaseControlConfig,\n ControlPanelState,\n ControlState,\n ExtraControlProps,\n} from '../types';\nimport { getTemporalColumns } from '../utils';\n\nconst getAxisLabel = (\n formData: QueryFormData,\n): Record<'label' | 'description', string> =>\n formData?.orientation === 'horizontal'\n ? { label: t('Y-axis'), description: t('Dimension to use on y-axis.') }\n : { label: t('X-axis'), description: t('Dimension to use on x-axis.') };\n\nexport const xAxisMixin = {\n label: (state: ControlPanelState) => getAxisLabel(state?.form_data).label,\n multi: false,\n description: (state: ControlPanelState) =>\n getAxisLabel(state?.form_data).description,\n validators: [validateNonEmpty],\n initialValue: (control: ControlState, state: ControlPanelState | null) => {\n if (\n state?.form_data?.granularity_sqla &&\n !state.form_data?.x_axis &&\n !control?.value\n ) {\n return state.form_data.granularity_sqla;\n }\n return undefined;\n },\n default: undefined,\n};\n\nexport const temporalColumnMixin: Pick &\n Partial = {\n isTemporal: true,\n mapStateToProps: ({ datasource }) => {\n const payload = getTemporalColumns(datasource);\n\n return {\n options: payload.temporalColumns,\n default: payload.defaultTemporalColumn,\n };\n },\n};\n\nexport const datePickerInAdhocFilterMixin: Pick<\n BaseControlConfig,\n 'initialValue'\n> = {\n initialValue: (control: ControlState, state: ControlPanelState | null) => {\n // skip initialValue if\n // 1) the time_range control is present (this is the case for legacy charts)\n // 2) there was a time filter in adhoc filters\n if (\n state?.controls?.time_range?.value ||\n ensureIsArray(control.value).findIndex(\n (flt: any) => flt?.operator === 'TEMPORAL_RANGE',\n ) > -1\n ) {\n return undefined;\n }\n\n // should migrate original granularity_sqla and time_range into adhoc filter\n // 1) granularity_sqla and time_range are existed\n if (state?.form_data?.granularity_sqla && state?.form_data?.time_range) {\n return [\n ...ensureIsArray(control.value),\n {\n clause: 'WHERE',\n subject: state.form_data.granularity_sqla,\n operator: 'TEMPORAL_RANGE',\n comparator: state.form_data.time_range,\n expressionType: 'SIMPLE',\n },\n ];\n }\n\n // should apply the default time filter into adhoc filter\n // 1) temporal column is existed in current datasource\n const temporalColumn =\n state?.datasource &&\n getTemporalColumns(state.datasource).defaultTemporalColumn;\n if (temporalColumn) {\n return [\n ...ensureIsArray(control.value),\n {\n clause: 'WHERE',\n subject: temporalColumn,\n operator: 'TEMPORAL_RANGE',\n comparator: state?.common?.conf?.DEFAULT_TIME_FILTER || NO_TIME_RANGE,\n expressionType: 'SIMPLE',\n },\n ];\n }\n\n return undefined;\n },\n};\n","/* eslint-disable camelcase */\n/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n/**\n * This file exports all controls available for use in chart plugins internal to Superset.\n * It is not recommended to use the controls here for any third-party plugins.\n *\n * While the React components located in `controls/components` represent different\n * types of controls (CheckboxControl, SelectControl, TextControl, ...), the controls here\n * represent instances of control types, that can be reused across visualization types.\n *\n * When controls are reused across viz types, their values are carried over as a user\n * changes the chart types.\n *\n * While the keys defined in the control itself get passed to the controlType as props,\n * here's a list of the keys that are common to all controls, and as a result define the\n * control interface.\n */\nimport { isEmpty } from 'lodash';\nimport {\n t,\n getCategoricalSchemeRegistry,\n getSequentialSchemeRegistry,\n SequentialScheme,\n legacyValidateInteger,\n ComparisonType,\n ensureIsArray,\n isDefined,\n NO_TIME_RANGE,\n validateMaxValue,\n} from '@superset-ui/core';\n\nimport {\n formatSelectOptions,\n displayTimeRelatedControls,\n getColorControlsProps,\n D3_FORMAT_OPTIONS,\n D3_FORMAT_DOCS,\n D3_TIME_FORMAT_OPTIONS,\n D3_TIME_FORMAT_DOCS,\n DEFAULT_TIME_FORMAT,\n DEFAULT_NUMBER_FORMAT,\n} from '../utils';\nimport { DEFAULT_MAX_ROW, TIME_FILTER_LABELS } from '../constants';\nimport {\n SharedControlConfig,\n Dataset,\n ControlState,\n ControlPanelState,\n} from '../types';\n\nimport {\n dndAdhocFilterControl,\n dndAdhocMetricControl,\n dndAdhocMetricsControl,\n dndGranularitySqlaControl,\n dndSortByControl,\n dndSecondaryMetricControl,\n dndSizeControl,\n dndXControl,\n dndYControl,\n dndColumnsControl,\n dndEntityControl,\n dndGroupByControl,\n dndSeriesControl,\n dndAdhocMetricControl2,\n dndXAxisControl,\n} from './dndControls';\n\nconst categoricalSchemeRegistry = getCategoricalSchemeRegistry();\nconst sequentialSchemeRegistry = getSequentialSchemeRegistry();\n\nexport const PRIMARY_COLOR = { r: 0, g: 122, b: 135, a: 1 };\n\nconst ROW_LIMIT_OPTIONS = [10, 50, 100, 250, 500, 1000, 5000, 10000, 50000];\nconst SERIES_LIMITS = [5, 10, 25, 50, 100, 500];\n\nconst appContainer = document.getElementById('app');\nconst { user } = JSON.parse(\n appContainer?.getAttribute('data-bootstrap') || '{}',\n);\n\ntype SelectDefaultOption = {\n label: string;\n value: string;\n};\n\nconst datasourceControl: SharedControlConfig<'DatasourceControl'> = {\n type: 'DatasourceControl',\n label: t('Datasource'),\n default: null,\n description: null,\n mapStateToProps: ({ datasource, form_data }) => ({\n datasource,\n form_data,\n user,\n }),\n};\n\nconst viz_type: SharedControlConfig<'VizTypeControl'> = {\n type: 'VizTypeControl',\n label: t('Visualization Type'),\n default: 'table',\n description: t('The type of visualization to display'),\n};\n\nconst color_picker: SharedControlConfig<'ColorPickerControl'> = {\n type: 'ColorPickerControl',\n label: t('Fixed Color'),\n description: t('Use this to define a static color for all circles'),\n default: PRIMARY_COLOR,\n renderTrigger: true,\n};\n\nconst linear_color_scheme: SharedControlConfig<'ColorSchemeControl'> = {\n type: 'ColorSchemeControl',\n label: t('Linear Color Scheme'),\n choices: () =>\n (sequentialSchemeRegistry.values() as SequentialScheme[]).map(value => [\n value.id,\n value.label,\n ]),\n default: sequentialSchemeRegistry.getDefaultKey(),\n clearable: false,\n description: '',\n renderTrigger: true,\n schemes: () => sequentialSchemeRegistry.getMap(),\n isLinear: true,\n mapStateToProps: state => getColorControlsProps(state),\n};\n\nconst granularity: SharedControlConfig<'SelectControl'> = {\n type: 'SelectControl',\n freeForm: true,\n label: TIME_FILTER_LABELS.granularity,\n default: 'one day',\n choices: [\n [null, t('all')],\n ['PT5S', t('5 seconds')],\n ['PT30S', t('30 seconds')],\n ['PT1M', t('1 minute')],\n ['PT5M', t('5 minutes')],\n ['PT30M', t('30 minutes')],\n ['PT1H', t('1 hour')],\n ['PT6H', t('6 hour')],\n ['P1D', t('1 day')],\n ['P7D', t('7 days')],\n ['P1W', t('week')],\n ['week_starting_sunday', t('week starting Sunday')],\n ['week_ending_saturday', t('week ending Saturday')],\n ['P1M', t('month')],\n ['P3M', t('quarter')],\n ['P1Y', t('year')],\n ],\n description: t(\n 'The time granularity for the visualization. Note that you ' +\n 'can type and use simple natural language as in `10 seconds`, ' +\n '`1 day` or `56 weeks`',\n ),\n};\n\nconst time_grain_sqla: SharedControlConfig<'SelectControl'> = {\n type: 'SelectControl',\n label: TIME_FILTER_LABELS.time_grain_sqla,\n placeholder: t('None'),\n initialValue: (control: ControlState, state: ControlPanelState) => {\n if (!isDefined(state)) {\n // If a chart is in a Dashboard, the ControlPanelState is empty.\n return control.value;\n }\n // If a chart is a new one that isn't saved, metadata is null. In this\n // case we want to default P1D. If the chart has been saved, we want\n // to use whichever value was chosen, either nothing or valid a time grain.\n return state?.metadata || 'time_grain_sqla' in (state?.form_data ?? {})\n ? state?.form_data?.time_grain_sqla\n : 'P1D';\n },\n description: t(\n 'Select a time grain for the visualization. The ' +\n 'grain is the time interval represented by a ' +\n 'single point on the chart.',\n ),\n mapStateToProps: ({ datasource }) => ({\n choices: (datasource as Dataset)?.time_grain_sqla || [],\n }),\n visibility: displayTimeRelatedControls,\n};\n\nconst time_range: SharedControlConfig<'DateFilterControl'> = {\n type: 'DateFilterControl',\n freeForm: true,\n label: TIME_FILTER_LABELS.time_range,\n default: NO_TIME_RANGE, // this value is an empty filter constant so shouldn't translate it.\n description: t(\n 'This control filters the whole chart based on the selected time range. All relative times, e.g. \"Last month\", ' +\n '\"Last 7 days\", \"now\", etc. are evaluated on the server using the server\\'s ' +\n 'local time (sans timezone). All tooltips and placeholder times are expressed ' +\n 'in UTC (sans timezone). The timestamps are then evaluated by the database ' +\n \"using the engine's local timezone. Note one can explicitly set the timezone \" +\n 'per the ISO 8601 format if specifying either the start and/or end time.',\n ),\n};\n\nconst row_limit: SharedControlConfig<'SelectControl'> = {\n type: 'SelectControl',\n freeForm: true,\n label: t('Row limit'),\n clearable: false,\n mapStateToProps: state => ({ maxValue: state?.common?.conf?.SQL_MAX_ROW }),\n validators: [\n legacyValidateInteger,\n (v, state) => validateMaxValue(v, state?.maxValue || DEFAULT_MAX_ROW),\n ],\n default: 10000,\n choices: formatSelectOptions(ROW_LIMIT_OPTIONS),\n description: t(\n 'Limits the number of the rows that are computed in the query that is the source of the data used for this chart.',\n ),\n};\n\nconst order_desc: SharedControlConfig<'CheckboxControl'> = {\n type: 'CheckboxControl',\n label: t('Sort Descending'),\n default: true,\n description: t(\n 'If enabled, this control sorts the results/values descending, otherwise it sorts the results ascending.',\n ),\n visibility: ({ controls }) =>\n Boolean(\n controls?.timeseries_limit_metric.value &&\n !isEmpty(controls?.timeseries_limit_metric.value),\n ),\n};\n\nconst limit: SharedControlConfig<'SelectControl'> = {\n type: 'SelectControl',\n freeForm: true,\n label: t('Series limit'),\n placeholder: t('None'),\n validators: [legacyValidateInteger],\n choices: formatSelectOptions(SERIES_LIMITS),\n clearable: true,\n description: t(\n 'Limits the number of series that get displayed. A joined subquery (or an extra phase ' +\n 'where subqueries are not supported) is applied to limit the number of series that get ' +\n 'fetched and rendered. This feature is useful when grouping by high cardinality ' +\n 'column(s) though does increase the query complexity and cost.',\n ),\n};\n\nconst series_limit: SharedControlConfig<'SelectControl'> = {\n type: 'SelectControl',\n freeForm: true,\n label: t('Series limit'),\n placeholder: t('None'),\n validators: [legacyValidateInteger],\n choices: formatSelectOptions(SERIES_LIMITS),\n description: t(\n 'Limits the number of series that get displayed. A joined subquery (or an extra phase ' +\n 'where subqueries are not supported) is applied to limit the number of series that get ' +\n 'fetched and rendered. This feature is useful when grouping by high cardinality ' +\n 'column(s) though does increase the query complexity and cost.',\n ),\n};\n\nconst y_axis_format: SharedControlConfig<'SelectControl', SelectDefaultOption> =\n {\n type: 'SelectControl',\n freeForm: true,\n label: t('Y Axis Format'),\n renderTrigger: true,\n default: DEFAULT_NUMBER_FORMAT,\n choices: D3_FORMAT_OPTIONS,\n description: D3_FORMAT_DOCS,\n tokenSeparators: ['\\n', '\\t', ';'],\n filterOption: ({ data: option }, search) =>\n option.label.includes(search) || option.value.includes(search),\n mapStateToProps: state => {\n const isPercentage =\n state.controls?.comparison_type?.value === ComparisonType.Percentage;\n return {\n choices: isPercentage\n ? D3_FORMAT_OPTIONS.filter(option => option[0].includes('%'))\n : D3_FORMAT_OPTIONS,\n };\n },\n };\n\nconst currency_format: SharedControlConfig<'CurrencyControl'> = {\n type: 'CurrencyControl',\n label: t('Currency format'),\n renderTrigger: true,\n};\n\nconst x_axis_time_format: SharedControlConfig<\n 'SelectControl',\n SelectDefaultOption\n> = {\n type: 'SelectControl',\n freeForm: true,\n label: t('Time format'),\n renderTrigger: true,\n default: DEFAULT_TIME_FORMAT,\n choices: D3_TIME_FORMAT_OPTIONS,\n description: D3_TIME_FORMAT_DOCS,\n filterOption: ({ data: option }, search) =>\n option.label.includes(search) || option.value.includes(search),\n};\n\nconst color_scheme: SharedControlConfig<'ColorSchemeControl'> = {\n type: 'ColorSchemeControl',\n label: t('Color Scheme'),\n default: categoricalSchemeRegistry.getDefaultKey(),\n renderTrigger: true,\n choices: () => categoricalSchemeRegistry.keys().map(s => [s, s]),\n description: t('The color scheme for rendering chart'),\n schemes: () => categoricalSchemeRegistry.getMap(),\n mapStateToProps: state => getColorControlsProps(state),\n};\n\nconst truncate_metric: SharedControlConfig<'CheckboxControl'> = {\n type: 'CheckboxControl',\n label: t('Truncate Metric'),\n default: true,\n description: t('Whether to truncate metrics'),\n};\n\nconst show_empty_columns: SharedControlConfig<'CheckboxControl'> = {\n type: 'CheckboxControl',\n label: t('Show empty columns'),\n default: true,\n description: t('Show empty columns'),\n};\n\nconst temporal_columns_lookup: SharedControlConfig<'HiddenControl'> = {\n type: 'HiddenControl',\n initialValue: (control: ControlState, state: ControlPanelState | null) =>\n Object.fromEntries(\n ensureIsArray>(state?.datasource?.columns)\n .filter(option => option.is_dttm)\n .map(option => [option.column_name ?? option.name, option.is_dttm]),\n ),\n};\n\nconst sort_by_metric: SharedControlConfig<'CheckboxControl'> = {\n type: 'CheckboxControl',\n label: t('Sort by metric'),\n description: t(\n 'Whether to sort results by the selected metric in descending order.',\n ),\n};\n\nexport default {\n metrics: dndAdhocMetricsControl,\n metric: dndAdhocMetricControl,\n datasource: datasourceControl,\n viz_type,\n color_picker,\n metric_2: dndAdhocMetricControl2,\n linear_color_scheme,\n secondary_metric: dndSecondaryMetricControl,\n groupby: dndGroupByControl,\n columns: dndColumnsControl,\n granularity,\n granularity_sqla: dndGranularitySqlaControl,\n time_grain_sqla,\n time_range,\n row_limit,\n limit,\n timeseries_limit_metric: dndSortByControl,\n orderby: dndSortByControl,\n order_desc,\n series: dndSeriesControl,\n entity: dndEntityControl,\n x: dndXControl,\n y: dndYControl,\n size: dndSizeControl,\n y_axis_format,\n x_axis_time_format,\n adhoc_filters: dndAdhocFilterControl,\n color_scheme,\n series_columns: dndColumnsControl,\n series_limit,\n series_limit_metric: dndSortByControl,\n legacy_order_by: dndSortByControl,\n truncate_metric,\n x_axis: dndXAxisControl,\n show_empty_columns,\n temporal_columns_lookup,\n currency_format,\n sort_by_metric,\n};\n","/* eslint-disable camelcase */\n/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { ReactElement, ReactNode, ReactText, ComponentType } from 'react';\n\nimport type {\n AdhocColumn,\n Column,\n Currency,\n DatasourceType,\n JsonObject,\n JsonValue,\n Metric,\n QueryFormColumn,\n QueryFormData,\n QueryFormMetric,\n QueryResponse,\n} from '@superset-ui/core';\nimport { sharedControls, sharedControlComponents } from './shared-controls';\n\nexport type { Metric } from '@superset-ui/core';\nexport type { ControlComponentProps } from './shared-controls/components/types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyDict = Record;\ninterface Action {\n type: string;\n}\ninterface AnyAction extends Action, AnyDict {}\n\nexport type SharedControls = typeof sharedControls;\nexport type SharedControlAlias = keyof typeof sharedControls;\nexport type SharedControlComponents = typeof sharedControlComponents;\n\n/** ----------------------------------------------\n * Input data/props while rendering\n * ---------------------------------------------*/\nexport interface Owner {\n first_name: string;\n id: number;\n last_name: string;\n username: string;\n email?: string;\n}\n\nexport type ColumnMeta = Omit & {\n id?: number;\n} & AnyDict;\n\nexport interface Dataset {\n id: number;\n type: DatasourceType;\n columns: ColumnMeta[];\n metrics: Metric[];\n column_formats: Record;\n currency_formats: Record;\n verbose_map: Record;\n main_dttm_col: string;\n // eg. ['[\"ds\", true]', 'ds [asc]']\n order_by_choices?: [string, string][] | null;\n time_grain_sqla?: [string, string][];\n granularity_sqla?: string;\n datasource_name: string | null;\n name?: string;\n description: string | null;\n uid?: string;\n owners?: Owner[];\n filter_select?: boolean;\n filter_select_enabled?: boolean;\n column_names?: string[];\n}\n\nexport interface ControlPanelState {\n slice: {\n slice_id: number;\n };\n form_data: QueryFormData;\n datasource: Dataset | QueryResponse | null;\n controls: ControlStateMapping;\n common: JsonObject;\n metadata?: JsonObject | null;\n}\n\n/**\n * The action dispatcher will call Redux `dispatch` internally and return what's\n * returned from `dispatch`, which by default is the original or another action.\n */\nexport interface ActionDispatcher<\n ARGS extends unknown[],\n A extends Action = AnyAction,\n> {\n (...args: ARGS): A;\n}\n\n/**\n * Mapping of action dispatchers\n */\nexport interface ControlPanelActionDispatchers {\n setDatasource: ActionDispatcher<[Dataset]>;\n}\n\n/**\n * Additional control props obtained from `mapStateToProps`.\n */\nexport type ExtraControlProps = {\n value?: JsonValue;\n} & AnyDict;\n\n// Ref:superset-frontend/src/explore/store.js\nexport type ControlState<\n T = ControlType,\n O extends SelectOption = SelectOption,\n> = ControlConfig & ExtraControlProps;\n\nexport interface ControlStateMapping {\n [key: string]: ControlState;\n}\n\n// Ref: superset-frontend/src/explore/components/ControlPanelsContainer.jsx\nexport interface ControlPanelsContainerProps extends AnyDict {\n actions: ControlPanelActionDispatchers;\n controls: ControlStateMapping;\n exportState: AnyDict;\n form_data: QueryFormData;\n}\n\n/** ----------------------------------------------\n * Config for a chart Control\n * ---------------------------------------------*/\n\n// Ref: superset-frontend/src/explore/components/controls/index.js\nexport type InternalControlType =\n | 'AnnotationLayerControl'\n | 'BoundsControl'\n | 'CheckboxControl'\n | 'CollectionControl'\n | 'ColorPickerControl'\n | 'ColorSchemeControl'\n | 'DatasourceControl'\n | 'DateFilterControl'\n | 'FixedOrMetricControl'\n | 'HiddenControl'\n | 'SelectAsyncControl'\n | 'SelectControl'\n | 'SliderControl'\n | 'SpatialControl'\n | 'TextAreaControl'\n | 'TextControl'\n | 'TimeSeriesColumnControl'\n | 'ViewportControl'\n | 'VizTypeControl'\n | 'MetricsControl'\n | 'AdhocFilterControl'\n | 'FilterBoxItemControl'\n | 'DndColumnSelect'\n | 'DndFilterSelect'\n | 'DndMetricSelect'\n | 'CurrencyControl'\n | 'InputNumber'\n | 'Checkbox'\n | 'Select'\n | 'Slider'\n | 'Input'\n | keyof SharedControlComponents; // expanded in `expandControlConfig`\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ControlType = InternalControlType | ComponentType;\n\nexport type TabOverride = 'data' | 'customize' | boolean;\n\n/**\n * Control config specifying how chart controls appear in the control panel, all\n * these configs will be passed to the UI component for control as props.\n *\n * - type: the control type, referencing a React component of the same name\n * - label: the label as shown in the control's header\n * - description: shown in the info tooltip of the control's header\n * - default: the default value when opening a new chart, or changing visualization type\n * - renderTrigger: a bool that defines whether the visualization should be re-rendered\n * when changed. This should `true` for controls that only affect the rendering (client side)\n * and don't affect the query or backend data processing as those require to re run a query\n * and fetch the data\n * - validators: an array of functions that will receive the value of the component and\n * should return error messages when the value is not valid. The error message gets\n * bubbled up to the control header, section header and query panel header.\n * - warning: text shown as a tooltip on a warning icon in the control's header\n * - error: text shown as a tooltip on a error icon in the control's header\n * - shouldMapStateToProps: a function that receives the previous and current app state\n * and determines if the control needs to recalculate it's props based on the new state.\n * - mapStateToProps: a function that receives the App's state and return an object of k/v\n * to overwrite configuration at runtime. This is useful to alter a component based on\n * anything external to it, like another control's value. For instance it's possible to\n * show a warning based on the value of another component. It's also possible to bind\n * arbitrary data from the redux store to the component this way.\n * - tabOverride: set to 'data' if you want to force a renderTrigger to show up on the `Data`\n tab, or 'customize' if you want it to show up on that tam. Otherwise sections with ALL\n `renderTrigger: true` components will show up on the `Customize` tab.\n * - visibility: a function that uses control panel props to check whether a control should\n * be visible.\n */\nexport interface BaseControlConfig<\n T extends ControlType = ControlType,\n O extends SelectOption = SelectOption,\n V = JsonValue,\n> extends AnyDict {\n type: T;\n label?:\n | ReactNode\n | ((\n state: ControlPanelState,\n controlState: ControlState,\n // TODO: add strict `chartState` typing (see superset-frontend/src/explore/types)\n chartState?: AnyDict,\n ) => ReactNode);\n description?:\n | ReactNode\n | ((\n state: ControlPanelState,\n controlState: ControlState,\n // TODO: add strict `chartState` typing (see superset-frontend/src/explore/types)\n chartState?: AnyDict,\n ) => ReactNode);\n default?: V;\n initialValue?: V;\n renderTrigger?: boolean;\n validators?: ControlValueValidator[];\n warning?: ReactNode;\n error?: ReactNode;\n /**\n * Add additional props to chart control.\n */\n shouldMapStateToProps?: (\n prevState: ControlPanelState,\n state: ControlPanelState,\n controlState: ControlState,\n // TODO: add strict `chartState` typing (see superset-frontend/src/explore/types)\n chartState?: AnyDict,\n ) => boolean;\n mapStateToProps?: (\n state: ControlPanelState,\n controlState: ControlState,\n // TODO: add strict `chartState` typing (see superset-frontend/src/explore/types)\n chartState?: AnyDict,\n ) => ExtraControlProps;\n visibility?: (\n props: ControlPanelsContainerProps,\n controlData: AnyDict,\n ) => boolean;\n disableStash?: boolean;\n hidden?:\n | boolean\n | ((props: ControlPanelsContainerProps, controlData: AnyDict) => boolean);\n}\n\nexport interface ControlValueValidator<\n T = ControlType,\n O extends SelectOption = SelectOption,\n V = unknown,\n> {\n (value: V, state?: ControlState): boolean | string;\n}\n\n/** --------------------------------------------\n * Additional Config for specific control Types\n * --------------------------------------------- */\nexport type SelectOption = AnyDict | string | [ReactText, ReactNode];\n\nexport type SelectControlType =\n | 'SelectControl'\n | 'SelectAsyncControl'\n | 'MetricsControl'\n | 'FixedOrMetricControl'\n | 'AdhocFilterControl'\n | 'FilterBoxItemControl';\n\nexport interface FilterOption {\n label: string;\n value: string;\n data: T;\n}\n\n// Ref: superset-frontend/src/components/Select/SupersetStyledSelect.tsx\nexport interface SelectControlConfig<\n O extends SelectOption = SelectOption,\n T extends SelectControlType = SelectControlType,\n> extends BaseControlConfig {\n clearable?: boolean;\n freeForm?: boolean;\n multi?: boolean;\n valueKey?: string;\n labelKey?: string;\n options?: O[];\n optionRenderer?: (option: O) => ReactNode;\n valueRenderer?: (option: O) => ReactNode;\n filterOption?:\n | ((option: FilterOption, rawInput: string) => Boolean)\n | null;\n}\n\nexport type SharedControlConfig<\n T extends InternalControlType = InternalControlType,\n O extends SelectOption = SelectOption,\n> = T extends SelectControlType\n ? SelectControlConfig\n : BaseControlConfig;\n\n/** --------------------------------------------\n * Custom controls\n * --------------------------------------------- */\nexport type CustomControlConfig

= BaseControlConfig> &\n // two run-time properties from superset-frontend/src/explore/components/Control.jsx\n Omit;\n\n// Catch-all ControlConfig\n// - if T is known control types, return SharedControlConfig,\n// - if T is object, assume a CustomComponent\n// - otherwise assume it's a custom component control\nexport type ControlConfig<\n T = AnyDict,\n O extends SelectOption = SelectOption,\n> = T extends InternalControlType\n ? SharedControlConfig\n : T extends object\n ? CustomControlConfig // eslint-disable-next-line @typescript-eslint/no-explicit-any\n : CustomControlConfig;\n\n/** ===========================================================\n * Chart plugin control panel config\n * ========================================================= */\nexport type SharedSectionAlias =\n | 'annotations'\n | 'colorScheme'\n | 'datasourceAndVizType'\n | 'sqlaTimeSeries'\n | 'NVD3TimeSeries';\n\nexport interface OverrideSharedControlItem<\n A extends SharedControlAlias = SharedControlAlias,\n> {\n name: A;\n override: Partial;\n}\n\nexport type CustomControlItem = {\n name: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n config: BaseControlConfig;\n};\n\n// use ReactElement instead of ReactNode because `string`, `number`, etc. may\n// interfere with other ControlSetItem types\nexport type ExpandedControlItem = CustomControlItem | ReactElement | null;\n\nexport type ControlSetItem =\n | SharedControlAlias\n | OverrideSharedControlItem\n | ExpandedControlItem;\n\nexport type ControlSetRow = ControlSetItem[];\n\n// Ref:\n// - superset-frontend/src/explore/components/ControlPanelsContainer.jsx\n// - superset-frontend/src/explore/components/ControlPanelSection.jsx\nexport interface ControlPanelSectionConfig {\n label?: ReactNode;\n description?: ReactNode;\n expanded?: boolean;\n tabOverride?: TabOverride;\n controlSetRows: ControlSetRow[];\n visibility?: (\n props: ControlPanelsContainerProps,\n controlData: AnyDict,\n ) => boolean;\n}\n\nexport interface StandardizedControls {\n metrics: QueryFormMetric[];\n columns: QueryFormColumn[];\n}\n\nexport interface StandardizedFormDataInterface {\n // Controls not used in the current viz\n controls: StandardizedControls;\n // Transformation history\n memorizedFormData: Map;\n}\n\nexport type QueryStandardizedFormData = QueryFormData & {\n standardizedFormData: StandardizedFormDataInterface;\n};\n\nexport const isStandardizedFormData = (\n formData: QueryFormData,\n): formData is QueryStandardizedFormData =>\n formData?.standardizedFormData?.controls &&\n formData?.standardizedFormData?.memorizedFormData &&\n Array.isArray(formData.standardizedFormData.controls.metrics) &&\n Array.isArray(formData.standardizedFormData.controls.columns);\n\nexport interface ControlPanelConfig {\n controlPanelSections: (ControlPanelSectionConfig | null)[];\n controlOverrides?: ControlOverrides;\n sectionOverrides?: SectionOverrides;\n onInit?: (state: ControlStateMapping) => void;\n formDataOverrides?: (formData: QueryFormData) => QueryFormData;\n}\n\nexport type ControlOverrides = {\n [P in SharedControlAlias]?: Partial;\n};\n\nexport type SectionOverrides = {\n [P in SharedSectionAlias]?: Partial;\n};\n\n// Ref:\n// - superset-frontend/src/explore/components/ConditionalFormattingControl.tsx\nexport enum Comparator {\n None = 'None',\n GreaterThan = '>',\n LessThan = '<',\n GreaterOrEqual = '≥',\n LessOrEqual = '≤',\n Equal = '=',\n NotEqual = '≠',\n Between = '< x <',\n BetweenOrEqual = '≤ x ≤',\n BetweenOrLeftEqual = '≤ x <',\n BetweenOrRightEqual = '< x ≤',\n}\n\nexport const MultipleValueComparators = [\n Comparator.Between,\n Comparator.BetweenOrEqual,\n Comparator.BetweenOrLeftEqual,\n Comparator.BetweenOrRightEqual,\n];\n\nexport type ConditionalFormattingConfig = {\n operator?: Comparator;\n targetValue?: number;\n targetValueLeft?: number;\n targetValueRight?: number;\n column?: string;\n colorScheme?: string;\n};\n\nexport type ColorFormatters = {\n column: string;\n getColorFromValue: (value: number) => string | undefined;\n}[];\n\nexport default {};\n\nexport function isColumnMeta(column: AnyDict): column is ColumnMeta {\n return !!column && 'column_name' in column;\n}\n\nexport function isSavedExpression(\n column: AdhocColumn | ColumnMeta,\n): column is ColumnMeta {\n return (\n 'column_name' in column && 'expression' in column && !!column.expression\n );\n}\n\nexport function isControlPanelSectionConfig(\n section: ControlPanelSectionConfig | null,\n): section is ControlPanelSectionConfig {\n return section !== null;\n}\n\nexport function isDataset(\n datasource: Dataset | QueryResponse | null | undefined,\n): datasource is Dataset {\n return (\n !!datasource && 'columns' in datasource && !('sqlEditorId' in datasource)\n );\n}\n\nexport function isQueryResponse(\n datasource: Dataset | QueryResponse | null | undefined,\n): datasource is QueryResponse {\n return !!datasource && 'results' in datasource && 'sqlEditorId' in datasource;\n}\n\nexport enum SortSeriesType {\n Name = 'name',\n Max = 'max',\n Min = 'min',\n Sum = 'sum',\n Avg = 'avg',\n}\n\nexport type SortSeriesData = {\n sort_series_type: SortSeriesType;\n sort_series_ascending: boolean;\n};\n\nexport type ControlFormValueValidator = (value: V) => string | false;\n\nexport type ControlFormItemSpec = {\n controlType: T;\n label: ReactNode;\n description: ReactNode;\n placeholder?: string;\n validators?: ControlFormValueValidator[];\n width?: number | string;\n /**\n * Time to delay change propagation.\n */\n debounceDelay?: number;\n} & (T extends 'Select'\n ? {\n allowNewOptions?: boolean;\n options: any;\n value?: string;\n defaultValue?: string;\n creatable?: boolean;\n minWidth?: number | string;\n validators?: ControlFormValueValidator[];\n }\n : T extends 'RadioButtonControl'\n ? {\n options: [string, ReactNode][];\n value?: string;\n defaultValue?: string;\n }\n : T extends 'Checkbox'\n ? {\n value?: boolean;\n defaultValue?: boolean;\n }\n : T extends 'InputNumber' | 'Slider'\n ? {\n min?: number;\n max?: number;\n step?: number;\n value?: number;\n defaultValue?: number;\n validators?: ControlFormValueValidator[];\n }\n : T extends 'Input'\n ? {\n controlType: 'Input';\n value?: string;\n defaultValue?: string;\n validators?: ControlFormValueValidator[];\n }\n : T extends 'CurrencyControl'\n ? {\n controlType: 'CurrencyControl';\n value?: Currency;\n defaultValue?: Currency;\n }\n : {});\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport {\n t,\n SMART_DATE_ID,\n NumberFormats,\n getNumberFormatter,\n} from '@superset-ui/core';\n\n// D3 specific formatting config\nexport const D3_FORMAT_DOCS = t(\n 'D3 format syntax: https://github.com/d3/d3-format',\n);\n\nexport const D3_NUMBER_FORMAT_DESCRIPTION_VALUES_TEXT = t(\n 'Only applies when \"Label Type\" is set to show values.',\n);\nexport const D3_NUMBER_FORMAT_DESCRIPTION_PERCENTAGE_TEXT = t(\n 'Only applies when \"Label Type\" is not set to a percentage.',\n);\n\nconst d3Formatted: [string, string][] = [\n ',d',\n '.1s',\n '.3s',\n ',.1%',\n '.2%',\n '.3%',\n '.4r',\n ',.1f',\n ',.2f',\n ',.3f',\n '+,',\n '$,.2f',\n].map(fmt => [fmt, `${fmt} (${getNumberFormatter(fmt).preview()})`]);\n\n// input choices & options\nexport const D3_FORMAT_OPTIONS: [string, string][] = [\n [NumberFormats.SMART_NUMBER, t('Adaptive formatting')],\n ['~g', t('Original value')],\n ...d3Formatted,\n ['DURATION', t('Duration in ms (66000 => 1m 6s)')],\n ['DURATION_SUB', t('Duration in ms (1.40008 => 1ms 400µs 80ns)')],\n];\n\nexport const D3_TIME_FORMAT_DOCS = t(\n 'D3 time format syntax: https://github.com/d3/d3-time-format',\n);\n\nexport const D3_TIME_FORMAT_OPTIONS: [string, string][] = [\n [SMART_DATE_ID, t('Adaptive formatting')],\n ['%d/%m/%Y', '%d/%m/%Y | 14/01/2019'],\n ['%m/%d/%Y', '%m/%d/%Y | 01/14/2019'],\n ['%Y-%m-%d', '%Y-%m-%d | 2019-01-14'],\n ['%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M:%S | 2019-01-14 01:32:10'],\n ['%d-%m-%Y %H:%M:%S', '%d-%m-%Y %H:%M:%S | 14-01-2019 01:32:10'],\n ['%H:%M:%S', '%H:%M:%S | 01:32:10'],\n];\n\nexport const DEFAULT_NUMBER_FORMAT = D3_FORMAT_OPTIONS[0][0];\nexport const DEFAULT_TIME_FORMAT = D3_TIME_FORMAT_OPTIONS[0][0];\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nexport const getColorControlsProps = (state: Record) => {\n const dashboardId = state?.form_data?.dashboardId;\n return {\n chartId: state?.slice?.slice_id,\n dashboardId,\n hasDashboardColorScheme:\n !!dashboardId && !!state?.form_data?.dashboard_color_scheme,\n hasCustomLabelsColor:\n Object.keys(state?.form_data?.label_colors || {}).length > 0,\n colorNamespace: state?.form_data?.color_namespace,\n mapLabelsColors: state?.form_data?.map_label_colors || {},\n sharedLabelsColors: state?.form_data?.shared_label_colors || [],\n };\n};\n","/* eslint-disable camelcase */\n/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { QueryResponse, DEFAULT_METRICS } from '@superset-ui/core';\nimport { Dataset } from '../types';\n\nexport const defineSavedMetrics = (\n datasource: Dataset | QueryResponse | null,\n) =>\n datasource?.hasOwnProperty('metrics')\n ? (datasource as Dataset)?.metrics || []\n : DEFAULT_METRICS;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { isAdhocColumn, isPhysicalColumn } from '@superset-ui/core';\nimport type { ColumnMeta, ControlPanelsContainerProps } from '../types';\n\nexport default function displayTimeRelatedControls({\n controls,\n}: ControlPanelsContainerProps) {\n if (!controls?.x_axis) {\n return true;\n }\n\n const xAxis = controls?.x_axis;\n const xAxisValue = xAxis?.value;\n if (isAdhocColumn(xAxisValue)) {\n return true;\n }\n if (isPhysicalColumn(xAxisValue)) {\n return !!(xAxis?.options ?? []).find(\n (col: ColumnMeta) => col?.column_name === xAxisValue,\n )?.is_dttm;\n }\n return false;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { isValidElement, ReactElement } from 'react';\nimport { sharedControls, sharedControlComponents } from '../shared-controls';\nimport {\n ControlType,\n ControlSetItem,\n ExpandedControlItem,\n ControlOverrides,\n} from '../types';\n\nexport function expandControlType(controlType: ControlType) {\n if (\n typeof controlType === 'string' &&\n controlType in sharedControlComponents\n ) {\n return sharedControlComponents[\n controlType as keyof typeof sharedControlComponents\n ];\n }\n return controlType;\n}\n\n/**\n * Expand a shorthand control config item to full config in the format of\n * {\n * name: ...,\n * config: {\n * type: ...,\n * ...\n * }\n * }\n */\nexport function expandControlConfig(\n control: ControlSetItem,\n controlOverrides: ControlOverrides = {},\n): ExpandedControlItem {\n // one of the named shared controls\n if (typeof control === 'string' && control in sharedControls) {\n const name = control;\n return {\n name,\n config: {\n ...sharedControls[name],\n ...controlOverrides[name],\n },\n };\n }\n // JSX/React element or NULL\n if (!control || typeof control === 'string' || isValidElement(control)) {\n return control as ReactElement;\n }\n // already fully expanded control config, e.g.\n // {\n // name: 'metric',\n // config: {\n // type: 'SelectControl' | SelectComponent\n // }\n // }\n if ('name' in control && 'config' in control) {\n return {\n ...control,\n config: {\n ...control.config,\n type: expandControlType(control.config.type as ControlType),\n },\n };\n }\n // apply overrides with shared controls\n if ('override' in control && control.name in sharedControls) {\n const { name, override } = control;\n return {\n name,\n config: {\n ...sharedControls[name],\n ...override,\n },\n };\n }\n return null;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { makeSingleton, QueryFormData } from '@superset-ui/core';\nimport { isStandardizedFormData, StandardizedControls } from '../types';\n\nclass StandardizedControlsManager {\n controls: StandardizedControls;\n\n constructor() {\n this.controls = {\n metrics: [],\n columns: [],\n };\n }\n\n setStandardizedControls(formData: QueryFormData) {\n if (isStandardizedFormData(formData)) {\n const { controls } = formData.standardizedFormData;\n this.controls = {\n metrics: controls.metrics,\n columns: controls.columns,\n };\n }\n }\n\n shiftMetric() {\n return this.controls.metrics.shift();\n }\n\n shiftColumn() {\n return this.controls.columns.shift();\n }\n\n popAllMetrics() {\n return this.controls.metrics.splice(0, this.controls.metrics.length);\n }\n\n popAllColumns() {\n return this.controls.columns.splice(0, this.controls.columns.length);\n }\n\n clear() {\n this.controls = {\n metrics: [],\n columns: [],\n };\n }\n}\n\nexport const getStandardizedControls = makeSingleton(\n StandardizedControlsManager,\n);\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport {\n ensureIsArray,\n isDefined,\n QueryColumn,\n ValueOf,\n} from '@superset-ui/core';\nimport {\n ColumnMeta,\n ControlPanelState,\n isDataset,\n isQueryResponse,\n} from '@superset-ui/chart-controls';\n\nexport function getTemporalColumns(\n datasource: ValueOf>,\n) {\n const rv: {\n temporalColumns: ColumnMeta[] | QueryColumn[];\n defaultTemporalColumn: string | null | undefined;\n } = {\n temporalColumns: [],\n defaultTemporalColumn: undefined,\n };\n\n if (isDataset(datasource)) {\n rv.temporalColumns = ensureIsArray(datasource.columns).filter(\n c => c.is_dttm,\n );\n }\n if (isQueryResponse(datasource)) {\n rv.temporalColumns = ensureIsArray(datasource.columns).filter(\n c => c.is_dttm,\n );\n }\n\n if (isDataset(datasource)) {\n rv.defaultTemporalColumn = datasource.main_dttm_col;\n }\n if (!isDefined(rv.defaultTemporalColumn)) {\n rv.defaultTemporalColumn =\n (rv.temporalColumns[0] as ColumnMeta)?.column_name ??\n (rv.temporalColumns[0] as QueryColumn)?.name;\n }\n\n return rv;\n}\n\nexport function isTemporalColumn(\n columnName: string,\n datasource: ValueOf>,\n): boolean {\n const columns = getTemporalColumns(datasource).temporalColumns;\n for (let i = 0; i < columns.length; i += 1) {\n if (columns[i].column_name === columnName) {\n return true;\n }\n }\n return false;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n// helper functions for select controls\n\nexport type Formattable = string | number;\n\nexport type Formatted = [Formattable, string];\n\n/** Turns an array of string/number options into options for a select input */\nexport function formatSelectOptions(\n options: (T | [T, string])[],\n): [T, string][] {\n return options.map(opt => (Array.isArray(opt) ? opt : [opt, opt.toString()]));\n}\n\n/**\n * Outputs array of arrays\n * >> formatSelectOptionsForRange(1, 5)\n * >> [[1,'1'], [2,'2'], [3,'3'], [4,'4'], [5,'5']]\n */\nexport function formatSelectOptionsForRange(\n start: number,\n end: number,\n step = 1,\n): Formatted[] {\n const options: Formatted[] = [];\n for (let i = start; i <= end; i += step) {\n options.push([i, i.toString()]);\n }\n return options;\n}\n","/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {\n Registry,\n makeSingleton,\n OverwritePolicy,\n QueryContext,\n SetDataMaskHook,\n JsonObject,\n} from '../..';\n\n// Ideally this would be \nexport type BuildQuery = (\n formData: T,\n options?: {\n extras?: {\n cachedChanges?: any;\n };\n ownState?: JsonObject;\n hooks?: {\n setDataMask: SetDataMaskHook;\n setCachedChanges: (newChanges: any) => void;\n };\n },\n) => QueryContext;\n\nclass ChartBuildQueryRegistry extends Registry {\n constructor() {\n super({ name: 'ChartBuildQuery', overwritePolicy: OverwritePolicy.Warn });\n }\n}\n\nconst getInstance = makeSingleton(ChartBuildQueryRegistry);\n\nexport default getInstance;\n","/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { Registry, makeSingleton } from '../..';\nimport { ChartControlPanel } from '../models/ChartControlPanel';\n\nclass ChartControlPanelRegistry extends Registry<\n ChartControlPanel,\n ChartControlPanel\n> {\n constructor() {\n super({ name: 'ChartControlPanel' });\n }\n}\n\nconst getInstance = makeSingleton(ChartControlPanelRegistry);\n\nexport default getInstance;\n","/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { Registry, makeSingleton, OverwritePolicy } from '../..';\nimport ChartMetadata from '../models/ChartMetadata';\n\nclass ChartMetadataRegistry extends Registry {\n constructor() {\n super({ name: 'ChartMetadata', overwritePolicy: OverwritePolicy.Warn });\n }\n}\n\nconst getInstance = makeSingleton(ChartMetadataRegistry);\n\nexport default getInstance;\n","/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { BinaryQueryObjectFilterClause, ExtraFormData } from '../../query';\nimport { JsonObject } from '../..';\n\nexport type HandlerFunction = (...args: unknown[]) => void;\n\nexport enum Behavior {\n InteractiveChart = 'INTERACTIVE_CHART',\n NativeFilter = 'NATIVE_FILTER',\n\n /**\n * Include `DRILL_TO_DETAIL` behavior if plugin handles `contextmenu` event\n * when dimensions are right-clicked on.\n */\n DrillToDetail = 'DRILL_TO_DETAIL',\n DrillBy = 'DRILL_BY',\n}\n\nexport interface ContextMenuFilters {\n crossFilter?: {\n dataMask: DataMask;\n isCurrentValueSelected?: boolean;\n };\n drillToDetail?: BinaryQueryObjectFilterClause[];\n drillBy?: {\n filters: BinaryQueryObjectFilterClause[];\n groupbyFieldName: string;\n adhocFilterFieldName?: string;\n };\n}\n\nexport enum AppSection {\n Explore = 'EXPLORE',\n Dashboard = 'DASHBOARD',\n FilterBar = 'FILTER_BAR',\n FilterConfigModal = 'FILTER_CONFIG_MODAL',\n Embedded = 'EMBEDDED',\n}\n\nexport type FilterState = { value?: any; [key: string]: any };\n\nexport type DataMask = {\n extraFormData?: ExtraFormData;\n filterState?: FilterState;\n ownState?: JsonObject;\n};\n\nexport type SetDataMaskHook = {\n ({ filterState, extraFormData, ownState }: DataMask): void;\n};\n\nexport interface PlainObject {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n}\n\nexport enum ChartLabel {\n Deprecated = 'DEPRECATED',\n Featured = 'FEATURED',\n}\n\nexport const chartLabelExplanations: Record = {\n [ChartLabel.Deprecated]:\n 'This chart uses features or modules which are no longer actively maintained. It will eventually be replaced or removed.',\n [ChartLabel.Featured]:\n 'This chart was tested and verified, so the overall experience should be stable.',\n};\n\nexport const chartLabelWeight: Record = {\n [ChartLabel.Deprecated]: {\n weight: -0.1,\n },\n [ChartLabel.Featured]: {\n weight: 0.1,\n },\n};\n\nexport enum AxisType {\n Category = 'category',\n Value = 'value',\n Time = 'time',\n Log = 'log',\n}\n\nexport interface LegendState {\n [key: string]: boolean;\n}\n\nexport default {};\n","/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { cloneDeep } from 'lodash';\nimport CategoricalColorScale from './CategoricalColorScale';\nimport { ColorsLookup } from './types';\nimport getCategoricalSchemeRegistry from './CategoricalSchemeRegistrySingleton';\nimport stringifyAndTrim from './stringifyAndTrim';\n\nexport default class CategoricalColorNamespace {\n name: string;\n\n forcedItems: ColorsLookup;\n\n scales: {\n [key: string]: CategoricalColorScale;\n };\n\n constructor(name: string) {\n this.name = name;\n this.scales = {};\n this.forcedItems = {};\n }\n\n /**\n * A new CategoricalColorScale instance is created for each chart.\n *\n * @param colorScheme - the color scheme to use\n * @returns a new instance of a color scale\n */\n getScale(colorScheme?: string) {\n const id =\n colorScheme ?? getCategoricalSchemeRegistry().getDefaultKey() ?? '';\n const scheme = getCategoricalSchemeRegistry().get(id);\n return new CategoricalColorScale(\n scheme?.colors ?? [],\n this.forcedItems,\n colorScheme,\n );\n }\n\n /**\n * Enforce specific color for given value\n * This will apply across all color scales\n * in this namespace.\n * @param {*} value value\n * @param {*} forcedColor color\n */\n setColor(value: string, forcedColor: string) {\n this.forcedItems[stringifyAndTrim(value)] = forcedColor;\n\n return this;\n }\n\n resetColors() {\n this.forcedItems = {};\n }\n\n resetColorsForLabels(labels: string[] = []) {\n const updatedForcedItems = cloneDeep(this.forcedItems);\n labels.forEach(label => {\n if (updatedForcedItems.hasOwnProperty(label)) {\n delete updatedForcedItems[label];\n }\n });\n\n this.forcedItems = { ...updatedForcedItems };\n }\n}\n\nconst namespaces: {\n [key: string]: CategoricalColorNamespace;\n} = {};\n\nexport const DEFAULT_NAMESPACE = 'GLOBAL';\n\nexport function getNamespace(name: string = DEFAULT_NAMESPACE) {\n const instance = namespaces[name];\n if (instance) {\n return instance;\n }\n const newInstance = new CategoricalColorNamespace(name);\n namespaces[name] = newInstance;\n\n return newInstance;\n}\n\nexport function getColor(\n value?: string,\n colorScheme?: string,\n namespace?: string,\n) {\n return getNamespace(namespace).getScale(colorScheme).getColor(value);\n}\n\n/*\n Returns a new scale instance within the same namespace.\n Especially useful when a chart is booting for the first time\n\n @param scheme - the applied color scheme\n @param namespace - the namespace\n*/\nexport function getScale(colorScheme?: string, namespace?: string) {\n return getNamespace(namespace).getScale(colorScheme);\n}\n","/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { scaleOrdinal, ScaleOrdinal } from 'd3-scale';\nimport { ExtensibleFunction } from '../models';\nimport { ColorsInitLookup, ColorsLookup } from './types';\nimport stringifyAndTrim from './stringifyAndTrim';\nimport getLabelsColorMap, {\n LabelsColorMapSource,\n} from './LabelsColorMapSingleton';\nimport { getAnalogousColors } from './utils';\nimport { FeatureFlag, isFeatureEnabled } from '../utils';\n\n// Use type augmentation to correct the fact that\n// an instance of CategoricalScale is also a function\ninterface CategoricalColorScale {\n (x: { toString(): string }, y?: number): string;\n}\n\nclass CategoricalColorScale extends ExtensibleFunction {\n originColors: string[];\n\n colors: string[];\n\n scale: ScaleOrdinal<{ toString(): string }, string>;\n\n forcedColors: ColorsLookup;\n\n labelsColorMapInstance: ReturnType;\n\n chartLabelsColorMap: Map;\n\n multiple: number;\n\n /**\n * Constructor\n * @param {*} colors an array of colors\n * @param {*} forcedColors optional parameter that comes from parent\n * @param {*} appliedColorScheme the color scheme applied to the chart\n *\n */\n constructor(\n colors: string[],\n forcedColors: ColorsInitLookup = {},\n appliedColorScheme?: string,\n ) {\n super((value: string, sliceId?: number) =>\n this.getColor(value, sliceId, appliedColorScheme),\n );\n // holds original color scheme colors\n this.originColors = colors;\n // holds the extended color range (includes analagous colors)\n this.colors = colors;\n // holds the values of this specific slice (label+color)\n this.chartLabelsColorMap = new Map();\n // shared color map instance (when context is shared, i.e. dashboard)\n this.labelsColorMapInstance = getLabelsColorMap();\n // holds the multiple value for analogous colors range\n this.multiple = 0;\n\n this.scale = scaleOrdinal<{ toString(): string }, string>();\n this.scale.range(colors);\n\n // reserve fixed colors in parent map based on their index in the scale\n Object.entries(forcedColors).forEach(([key, value]) => {\n if (typeof value === 'number') {\n // eslint-disable-next-line no-param-reassign\n forcedColors[key] = colors[value % colors.length];\n }\n });\n\n // forced colors from parent (usually CategoricalColorNamespace)\n // currently used in dashboards to set custom label colors\n this.forcedColors = forcedColors as ColorsLookup;\n }\n\n /**\n * Increment the color range with analogous colors\n */\n incrementColorRange() {\n const multiple = Math.floor(\n this.domain().length / this.originColors.length,\n );\n // the domain has grown larger than the original range\n // increments the range with analogous colors\n if (multiple > this.multiple) {\n this.multiple = multiple;\n const newRange = getAnalogousColors(this.originColors, multiple);\n const extendedColors = this.originColors.concat(newRange);\n\n this.range(extendedColors);\n this.colors = extendedColors;\n }\n }\n\n /**\n * Get the color for a given value\n *\n * @param value the value of a label to get the color for\n * @param sliceId the ID of the current chart\n * @param appliedColorScheme the color scheme applied to the chart\n * @returns the color or the next available color\n */\n getColor(\n value?: string,\n sliceId?: number,\n appliedColorScheme?: string,\n ): string {\n const cleanedValue = stringifyAndTrim(value);\n // priority: forced color (aka custom label colors) > shared color > scale color\n const forcedColor = this.forcedColors?.[cleanedValue];\n const { source } = this.labelsColorMapInstance;\n const currentColorMap =\n source === LabelsColorMapSource.Dashboard\n ? this.labelsColorMapInstance.getColorMap()\n : this.chartLabelsColorMap;\n const isExistingLabel = currentColorMap.has(cleanedValue);\n let color =\n forcedColor ||\n (isExistingLabel\n ? (currentColorMap.get(cleanedValue) as string)\n : this.scale(cleanedValue));\n\n // a forced color will always be used independently of the usage count\n if (!forcedColor && !isExistingLabel) {\n if (isFeatureEnabled(FeatureFlag.UseAnalagousColors)) {\n this.incrementColorRange();\n }\n if (\n // feature flag to be deprecated (will become standard behaviour)\n isFeatureEnabled(FeatureFlag.AvoidColorsCollision) &&\n this.isColorUsed(color)\n ) {\n // fallback to least used color\n color = this.getNextAvailableColor(cleanedValue, color);\n }\n }\n\n // keep track of values in this slice\n this.chartLabelsColorMap.set(cleanedValue, color);\n\n // store the value+color in the LabelsColorMapSingleton\n if (sliceId) {\n this.labelsColorMapInstance.addSlice(\n cleanedValue,\n color,\n sliceId,\n appliedColorScheme,\n );\n }\n return color;\n }\n\n /**\n * Verify if a color is used in this slice\n *\n * @param color\n * @returns true if the color is used in this slice\n */\n isColorUsed(color: string): boolean {\n return this.getColorUsageCount(color) > 0;\n }\n\n /**\n * Get the count of the color usage in this slice\n *\n * @param sliceId the ID of the current slice\n * @param color the color to check\n * @returns the count of the color usage in this slice\n */\n getColorUsageCount(color: string): number {\n return Array.from(this.chartLabelsColorMap.values()).filter(\n value => value === color,\n ).length;\n }\n\n /**\n * Lower chances of color collision by returning the least used color.\n * Checks across colors of current slice within chartLabelsColorMap.\n *\n * @param currentLabel the current label\n * @param currentColor the current color\n * @returns the least used color that is not the current color\n */\n getNextAvailableColor(currentLabel: string, currentColor: string): string {\n // Precompute color usage counts for all colors\n const colorUsageCounts = new Map(\n this.colors.map(color => [color, this.getColorUsageCount(color)]),\n );\n\n // Get an ordered array of labels from the map\n const orderedLabels = Array.from(this.chartLabelsColorMap.keys());\n const currentLabelIndex = orderedLabels.indexOf(currentLabel);\n\n // Helper to infer \"previous\" and \"next\" labels based on index\n const getAdjacentLabelsColors = (): string[] => {\n const previousLabel =\n currentLabelIndex > 0 ? orderedLabels[currentLabelIndex - 1] : null;\n const nextLabel =\n currentLabelIndex < orderedLabels.length - 1\n ? orderedLabels[currentLabelIndex + 1]\n : null;\n\n const previousColor = previousLabel\n ? this.chartLabelsColorMap.get(previousLabel)\n : null;\n const nextColor = nextLabel\n ? this.chartLabelsColorMap.get(nextLabel)\n : null;\n\n return [previousColor, nextColor].filter(color => color) as string[];\n };\n\n const adjacentColors = getAdjacentLabelsColors();\n\n // Determine adjusted score (usage count + penalties)\n const calculateScore = (color: string): number => {\n /* istanbul ignore next */\n const usageCount = colorUsageCounts.get(color) || 0;\n const adjacencyPenalty = adjacentColors.includes(color) ? 100 : 0;\n return usageCount + adjacencyPenalty;\n };\n\n // If there is any color that has never been used, prioritize it\n const unusedColor = this.colors.find(\n color => (colorUsageCounts.get(color) || 0) === 0,\n );\n if (unusedColor) {\n return unusedColor;\n }\n\n // If all colors are used, calculate scores and choose the best one\n const otherColors = this.colors.filter(color => color !== currentColor);\n\n // Find the color with the minimum score, defaulting to currentColor\n return otherColors.reduce((bestColor, color) => {\n const bestScore = calculateScore(bestColor);\n const currentScore = calculateScore(color);\n return currentScore < bestScore ? color : bestColor;\n }, currentColor);\n }\n\n /**\n * Enforce specific color for a given value at the scale level\n * Overrides any existing color and forced color for the given value\n *\n * @param {*} value value\n * @param {*} forcedColor forcedColor\n * @returns {CategoricalColorScale}\n */\n setColor(value: string, forcedColor: string) {\n this.forcedColors[stringifyAndTrim(value)] = forcedColor;\n return this;\n }\n\n /**\n * Get a mapping of data values to colors\n *\n * @returns an object where the key is the data value and the value is the hex color code\n */\n getColorMap() {\n const colorMap: { [key: string]: string | undefined } = {};\n this.scale.domain().forEach(value => {\n colorMap[value.toString()] = this.scale(value);\n });\n\n return {\n ...colorMap,\n ...this.forcedColors,\n };\n }\n\n /**\n * Return an exact copy of this scale.\n * Changes to this scale will not affect the returned scale and vice versa.\n *\n * @returns {CategoricalColorScale} A copy of this scale.\n */\n copy() {\n const copy = new CategoricalColorScale(\n this.scale.range(),\n this.forcedColors,\n );\n copy.forcedColors = { ...this.forcedColors };\n copy.domain(this.domain());\n copy.unknown(this.unknown());\n return copy;\n }\n\n /**\n * Returns the scale's current domain.\n */\n domain(): { toString(): string }[];\n\n /**\n * Expands the domain to include the specified array of values.\n */\n domain(newDomain: { toString(): string }[]): this;\n\n domain(newDomain?: { toString(): string }[]): unknown {\n if (typeof newDomain === 'undefined') {\n return this.scale.domain();\n }\n\n this.scale.domain(newDomain);\n return this;\n }\n\n /**\n * Returns the scale's current range.\n */\n range(): string[];\n\n /**\n * Sets the range of the ordinal scale to the specified array of values.\n *\n * The first element in the domain will be mapped to the first element in range, the second domain value to the second range value, and so on.\n *\n * If there are fewer elements in the range than in the domain, the scale will reuse values from the start of the range.\n *\n * @param newRange Array of range values.\n */\n range(newRange: string[]): this;\n\n range(newRange?: string[]): unknown {\n if (typeof newRange === 'undefined') {\n return this.scale.range();\n }\n\n this.colors = newRange;\n this.scale.range(newRange);\n return this;\n }\n\n /**\n * Returns the current unknown value, which defaults to \"implicit\".\n */\n unknown(): string | { name: 'implicit' };\n\n /**\n * Sets the output value of the scale for unknown input values and returns this scale.\n * The implicit value enables implicit domain construction. scaleImplicit can be used as a convenience to set the implicit value.\n *\n * @param value Unknown value to be used or scaleImplicit to set implicit scale generation.\n */\n unknown(value: string | { name: 'implicit' }): this;\n\n unknown(value?: string | { name: 'implicit' }): unknown {\n if (typeof value === 'undefined') {\n return this.scale.unknown();\n }\n\n this.scale.unknown(value);\n return this;\n }\n}\n\nexport default CategoricalColorScale;\n","/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { makeSingleton } from '../utils';\nimport CategoricalColorNamespace from './CategoricalColorNamespace';\n\nexport enum LabelsColorMapSource {\n Dashboard,\n Explore,\n}\n\nexport class LabelsColorMap {\n chartsLabelsMap: Map<\n number,\n { labels: string[]; scheme?: string; ownScheme?: string }\n >;\n\n colorMap: Map;\n\n source: LabelsColorMapSource;\n\n constructor() {\n // holds labels and original color schemes for each chart in context\n this.chartsLabelsMap = new Map();\n this.colorMap = new Map();\n this.source = LabelsColorMapSource.Dashboard;\n }\n\n /**\n * Wipes out the color map and updates it with the new color scheme.\n *\n * @param categoricalNamespace - the namespace to use for color mapping\n * @param colorScheme - color scheme\n */\n updateColorMap(\n categoricalNamespace: CategoricalColorNamespace,\n colorScheme?: string,\n merge = false,\n ) {\n const newColorMap = this.colorMap;\n\n if (!merge) {\n newColorMap.clear();\n }\n\n this.chartsLabelsMap.forEach((chartConfig, sliceId) => {\n const { labels, ownScheme } = chartConfig;\n const appliedColorScheme = colorScheme || ownScheme;\n const colorScale = categoricalNamespace.getScale(appliedColorScheme);\n\n labels.forEach(label => {\n // if merge, apply the scheme only to new labels in the map\n if (!merge || !this.colorMap.has(label)) {\n const newColor = colorScale.getColor(\n label,\n sliceId,\n appliedColorScheme,\n );\n newColorMap.set(label, newColor);\n }\n });\n });\n this.colorMap = newColorMap;\n }\n\n getColorMap() {\n return this.colorMap;\n }\n\n /**\n *\n * Called individually by each plugin via getColor fn.\n *\n * @param label - the label name\n * @param color - the color\n * @param sliceId - the chart id\n * @param colorScheme - the color scheme\n *\n */\n addSlice(\n label: string,\n color: string,\n sliceId: number,\n colorScheme?: string,\n ) {\n const chartConfig = this.chartsLabelsMap.get(sliceId) || {\n labels: [],\n scheme: undefined,\n ownScheme: undefined,\n };\n\n const { labels } = chartConfig;\n if (!labels.includes(label)) {\n labels.push(label);\n this.chartsLabelsMap.set(sliceId, {\n labels,\n scheme: colorScheme,\n ownScheme: chartConfig.ownScheme,\n });\n }\n if (this.source === LabelsColorMapSource.Dashboard) {\n this.colorMap.set(label, color);\n }\n }\n\n /**\n * Used to make sure all slices respect their original scheme.\n *\n * @param sliceId - the chart id\n * @param ownScheme - the color scheme\n */\n setOwnColorScheme(sliceId: number, ownScheme: string) {\n const chartConfig = this.chartsLabelsMap.get(sliceId);\n if (chartConfig) {\n this.chartsLabelsMap.set(sliceId, {\n ...chartConfig,\n ownScheme,\n });\n }\n }\n\n /**\n * Remove a slice from the color map.\n *\n * @param sliceId - the chart\n */\n removeSlice(sliceId: number) {\n if (this.source !== LabelsColorMapSource.Dashboard) return;\n\n this.chartsLabelsMap.delete(sliceId);\n const newColorMap = new Map();\n\n this.chartsLabelsMap.forEach(chartConfig => {\n const { labels } = chartConfig;\n labels.forEach(label => {\n newColorMap.set(label, this.colorMap.get(label));\n });\n });\n this.colorMap = newColorMap;\n }\n\n /**\n * Clear the shared labels color map.\n */\n clear() {\n this.colorMap.clear();\n }\n\n /**\n * Clears all maps\n */\n reset() {\n this.clear();\n this.chartsLabelsMap.clear();\n }\n}\n\nconst getInstance = makeSingleton(LabelsColorMap);\n\nexport default getInstance;\n","/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n/**\n * Ensure value is a string\n * @param {any} value\n */\nexport default function stringifyAndTrim(value?: number | string) {\n return String(value).trim();\n}\n","/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport tinycolor from 'tinycolor2';\n\nconst rgbRegex = /^rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/;\nexport function getContrastingColor(color: string, thresholds = 186) {\n let r = 0;\n let g = 0;\n let b = 0;\n if (color.length > 7) {\n // rgb\n const matchColor = rgbRegex.exec(color);\n if (!matchColor) {\n throw new Error(`Invalid color: ${color}`);\n }\n r = parseInt(matchColor[1], 10);\n g = parseInt(matchColor[2], 10);\n b = parseInt(matchColor[3], 10);\n } else {\n // hex\n let hex = color;\n if (hex.startsWith('#')) {\n hex = hex.substring(1);\n }\n // #FFF\n if (hex.length === 3) {\n hex = [hex[0], hex[0], hex[1], hex[1], hex[2], hex[2]].join('');\n }\n if (hex.length !== 6) {\n throw new Error(`Invalid color: ${color}`);\n }\n r = parseInt(hex.slice(0, 2), 16);\n g = parseInt(hex.slice(2, 4), 16);\n b = parseInt(hex.slice(4, 6), 16);\n }\n\n return r * 0.299 + g * 0.587 + b * 0.114 > thresholds ? '#000' : '#FFF';\n}\n\nexport function getAnalogousColors(colors: string[], results: number) {\n const generatedColors: string[] = [];\n const ext = 3;\n\n const analogousColors = colors.map(color => {\n // returns an array of tinycolor instances\n const result = tinycolor(color).analogous(results + ext);\n // remove the first three colors to avoid the same or very close colors\n return result.slice(ext);\n });\n\n // [[A, AA, AAA], [B, BB, BBB]] => [A, B, AA, BB, AAA, BBB]\n while (analogousColors[analogousColors.length - 1]?.length) {\n analogousColors.forEach(colors => {\n const color = colors.shift() as tinycolor.Instance;\n generatedColors.push(color.toHexString());\n });\n }\n\n return generatedColors;\n}\n\nexport function addAlpha(color: string, opacity: number): string {\n // opacity value should be between 0 and 1.\n if (opacity > 1 || opacity < 0) {\n throw new Error(`The opacity should between 0 and 1, but got: ${opacity}`);\n }\n // the alpha value is between 00 - FF\n const alpha = `0${Math.round(opacity * 255)\n .toString(16)\n .toUpperCase()}`.slice(-2);\n\n return `${color}${alpha}`;\n}\n\nexport function hexToRgb(h: string) {\n let r = '0';\n let g = '0';\n let b = '0';\n\n // 3 digits\n if (h.length === 4) {\n r = `0x${h[1]}${h[1]}`;\n g = `0x${h[2]}${h[2]}`;\n b = `0x${h[3]}${h[3]}`;\n\n // 6 digits\n } else if (h.length === 7) {\n r = `0x${h[1]}${h[2]}`;\n g = `0x${h[3]}${h[4]}`;\n b = `0x${h[5]}${h[6]}`;\n }\n\n return `rgb(${+r}, ${+g}, ${+b})`;\n}\n\nexport function rgbToHex(red: number, green: number, blue: number) {\n let r = red.toString(16);\n let g = green.toString(16);\n let b = blue.toString(16);\n\n if (r.length === 1) r = `0${r}`;\n if (g.length === 1) g = `0${g}`;\n if (b.length === 1) b = `0${b}`;\n\n return `#${r}${g}${b}`;\n}\n","/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { useMemo } from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport rehypeSanitize, { defaultSchema } from 'rehype-sanitize';\nimport rehypeRaw from 'rehype-raw';\nimport remarkGfm from 'remark-gfm';\nimport { mergeWith, isArray } from 'lodash';\nimport { FeatureFlag, isFeatureEnabled } from '../utils';\n\ninterface SafeMarkdownProps {\n source: string;\n htmlSanitization?: boolean;\n htmlSchemaOverrides?: typeof defaultSchema;\n}\n\nexport function getOverrideHtmlSchema(\n originalSchema: typeof defaultSchema,\n htmlSchemaOverrides: SafeMarkdownProps['htmlSchemaOverrides'],\n) {\n return mergeWith(originalSchema, htmlSchemaOverrides, (objValue, srcValue) =>\n isArray(objValue) ? objValue.concat(srcValue) : undefined,\n );\n}\n\nfunction SafeMarkdown({\n source,\n htmlSanitization = true,\n htmlSchemaOverrides = {},\n}: SafeMarkdownProps) {\n const escapeHtml = isFeatureEnabled(FeatureFlag.EscapeMarkdownHtml);\n\n const rehypePlugins = useMemo(() => {\n const rehypePlugins: any = [];\n if (!escapeHtml) {\n rehypePlugins.push(rehypeRaw);\n if (htmlSanitization) {\n const schema = getOverrideHtmlSchema(\n defaultSchema,\n htmlSchemaOverrides,\n );\n rehypePlugins.push([rehypeSanitize, schema]);\n }\n }\n return rehypePlugins;\n }, [escapeHtml, htmlSanitization, htmlSchemaOverrides]);\n\n // React Markdown escapes HTML by default\n return (\n \n {source}\n \n );\n}\n\nexport default SafeMarkdown;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { useEffect, useRef } from 'react';\n\n/**\n * Pass in a piece of state.\n * This hook returns what the value of that state was in the previous render.\n * Returns undefined (or whatever value you specify) the first time.\n */\nexport function usePrevious(value: T): T | undefined;\nexport function usePrevious(value: T, initialValue: INIT): T | INIT;\nexport function usePrevious(value: T, initialValue?: any): T {\n const previous = useRef(initialValue);\n useEffect(() => {\n // useEffect runs after the render completes\n previous.current = value;\n }, [value]);\n return previous.current;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { css } from '@emotion/react';\nimport { useEffect, useRef, useState, RefObject } from 'react';\n\n/**\n * Importable CSS that enables text truncation on fixed-width block\n * elements.\n */\nexport const truncationCSS = css`\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n`;\n\n/**\n * This hook encapsulates logic supporting truncation of text via\n * the CSS \"text-overflow: ellipsis;\" feature. Given the text content\n * to be displayed, this hook returns a ref to attach to the text\n * element and a boolean for whether that element is currently truncated.\n */\nconst useCSSTextTruncation = (): [\n RefObject,\n boolean,\n] => {\n const [isTruncated, setIsTruncated] = useState(true);\n const ref = useRef(null);\n const [offsetWidth, setOffsetWidth] = useState(0);\n const [scrollWidth, setScrollWidth] = useState(0);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => {\n setOffsetWidth(ref.current?.offsetWidth ?? 0);\n setScrollWidth(ref.current?.scrollWidth ?? 0);\n });\n\n useEffect(() => {\n setIsTruncated(offsetWidth < scrollWidth);\n }, [offsetWidth, scrollWidth]);\n\n return [ref, isTruncated];\n};\n\nexport default useCSSTextTruncation;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n/**\n * A Registry which serves as a typed key:value store for Superset and for Plugins.\n *\n * Differences from the older Registry class:\n *\n * 1. The keys and values stored in this class are individually typed by TYPEMAP parameter.\n * In the old Registry, all values are of the same type and keys are not enumerated.\n * Though you can also use indexed or mapped types in a TYPEMAP.\n *\n * 2. This class does not have a separate async get and set methods or use loaders.\n * Instead, TYPEMAP should specify async values and loaders explicitly when needed.\n * The value can be anything! A string, a class, a function, an async function... anything!\n *\n * 3. This class does not implement Policies, that is a separate concern to be handled elsewhere.\n *\n *\n * Removing or altering types in a type map could be a potential breaking change, be careful!\n *\n * Listener methods have not been added because there isn't a use case yet.\n */\nclass TypedRegistry {\n name = 'TypedRegistry';\n\n private records: TYPEMAP;\n\n constructor(initialRecords: TYPEMAP) {\n this.records = initialRecords;\n }\n\n get(key: K): TYPEMAP[K] {\n // The type construction above means that when you call this function,\n // you get a really specific type back.\n return this.records[key];\n }\n\n set(key: K, value: TYPEMAP[K]) {\n this.records[key] = value;\n }\n}\n\nexport default TypedRegistry;\n","/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { DatasourceType } from './types/Datasource';\n\nexport default class DatasourceKey {\n readonly id: number;\n\n readonly type: DatasourceType;\n\n constructor(key: string) {\n const [idStr, typeStr] = key.split('__');\n this.id = parseInt(idStr, 10);\n this.type = DatasourceType.Table; // default to SqlaTable model\n this.type = typeStr === 'query' ? DatasourceType.Query : this.type;\n }\n\n public toString() {\n return `${this.id}__${this.type}`;\n }\n\n public toObject() {\n return {\n id: this.id,\n type: this.type,\n };\n }\n}\n","/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport buildQueryObject from './buildQueryObject';\nimport DatasourceKey from './DatasourceKey';\nimport { QueryFieldAliases, QueryFormData } from './types/QueryFormData';\nimport { QueryContext, QueryObject } from './types/Query';\nimport { SetDataMaskHook } from '../chart';\nimport { JsonObject } from '../connection';\nimport { normalizeTimeColumn } from './normalizeTimeColumn';\nimport { isXAxisSet } from './getXAxis';\n\nconst WRAP_IN_ARRAY = (baseQueryObject: QueryObject) => [baseQueryObject];\n\nexport type BuildFinalQueryObjects = (\n baseQueryObject: QueryObject,\n) => QueryObject[];\n\nexport default function buildQueryContext(\n formData: QueryFormData,\n options?:\n | {\n buildQuery?: BuildFinalQueryObjects;\n queryFields?: QueryFieldAliases;\n ownState?: JsonObject;\n hooks?: { setDataMask: SetDataMaskHook };\n }\n | BuildFinalQueryObjects,\n): QueryContext {\n const { queryFields, buildQuery = WRAP_IN_ARRAY } =\n typeof options === 'function'\n ? { buildQuery: options, queryFields: {} }\n : options || {};\n let queries = buildQuery(buildQueryObject(formData, queryFields));\n // --- query mutator begin ---\n // todo(Yongjie): move the query mutator into buildQueryObject instead of buildQueryContext\n queries.forEach(query => {\n if (Array.isArray(query.post_processing)) {\n // eslint-disable-next-line no-param-reassign\n query.post_processing = query.post_processing.filter(Boolean);\n }\n });\n if (isXAxisSet(formData)) {\n queries = queries.map(query => normalizeTimeColumn(formData, query));\n }\n // --- query mutator end ---\n return {\n datasource: new DatasourceKey(formData.datasource).toObject(),\n force: formData.force || false,\n queries,\n form_data: formData,\n result_format: formData.result_format || 'json',\n result_type: formData.result_type || 'full',\n };\n}\n","/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n/* eslint-disable camelcase */\nimport { QueryFormData } from './types/QueryFormData';\nimport { QueryObjectFilterClause } from './types/Query';\nimport { isSimpleAdhocFilter } from './types/Filter';\nimport convertFilter from './convertFilter';\n\nfunction sanitizeClause(clause: string): string {\n let sanitizedClause = clause;\n if (clause.includes('--')) {\n sanitizedClause = `${clause}\\n`;\n }\n return `(${sanitizedClause})`;\n}\n\n/** Logic formerly in viz.py's process_query_filters */\nexport default function processFilters(\n formData: Partial,\n): Partial {\n // Split adhoc_filters into four fields according to\n // (1) clause (WHERE or HAVING)\n // (2) expressionType\n // 2.1 SIMPLE (subject + operator + comparator)\n // 2.2 SQL (freeform SQL expression))\n const { adhoc_filters, extras = {}, filters = [], where } = formData;\n const simpleWhere: QueryObjectFilterClause[] = filters;\n\n const freeformWhere: string[] = [];\n if (where) freeformWhere.push(where);\n const freeformHaving: string[] = [];\n\n (adhoc_filters || []).forEach(filter => {\n const { clause } = filter;\n if (isSimpleAdhocFilter(filter)) {\n const filterClause = convertFilter(filter);\n if (clause === 'WHERE') {\n simpleWhere.push(filterClause);\n }\n } else {\n const { sqlExpression } = filter;\n if (clause === 'WHERE') {\n freeformWhere.push(sqlExpression);\n } else {\n freeformHaving.push(sqlExpression);\n }\n }\n });\n\n // some filter-related fields need to go in `extras`\n extras.having = freeformHaving.map(sanitizeClause).join(' AND ');\n extras.where = freeformWhere.map(sanitizeClause).join(' AND ');\n\n return {\n filters: simpleWhere,\n extras,\n };\n}\n","/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n/* eslint-disable camelcase */\nimport {\n AdhocFilter,\n QueryObject,\n QueryObjectFilterClause,\n isQueryFormMetric,\n} from './types';\nimport {\n QueryFieldAliases,\n QueryFormMetric,\n QueryFormData,\n} from './types/QueryFormData';\nimport processFilters from './processFilters';\nimport extractExtras from './extractExtras';\nimport extractQueryFields from './extractQueryFields';\nimport { overrideExtraFormData } from './processExtraFormData';\nimport { isDefined } from '../utils';\n\n/**\n * Build the common segments of all query objects (e.g. the granularity field derived from\n * SQLAlchemy). The segments specific to each viz type is constructed in the\n * buildQuery method for each viz type (see `wordcloud/buildQuery.ts` for an example).\n * Note the type of the formData argument passed in here is the type of the formData for a\n * specific viz, which is a subtype of the generic formData shared among all viz types.\n */\nexport default function buildQueryObject(\n formData: T,\n queryFields?: QueryFieldAliases,\n): QueryObject {\n const {\n annotation_layers = [],\n extra_form_data,\n time_range,\n since,\n until,\n row_limit,\n row_offset,\n order_desc,\n limit,\n timeseries_limit_metric,\n granularity,\n url_params = {},\n custom_params = {},\n series_columns,\n series_limit,\n series_limit_metric,\n ...residualFormData\n } = formData;\n const {\n adhoc_filters: appendAdhocFilters = [],\n filters: appendFilters = [],\n custom_form_data = {},\n ...overrides\n } = extra_form_data || {};\n\n const numericRowLimit = Number(row_limit);\n const numericRowOffset = Number(row_offset);\n const { metrics, columns, orderby } = extractQueryFields(\n residualFormData,\n queryFields,\n );\n\n // collect all filters for conversion to simple filters/freeform clauses\n const extras = extractExtras(formData);\n const { filters: extraFilters } = extras;\n const filterFormData: {\n filters: QueryObjectFilterClause[];\n adhoc_filters: AdhocFilter[];\n } = {\n filters: [...extraFilters, ...appendFilters],\n adhoc_filters: [...(formData.adhoc_filters || []), ...appendAdhocFilters],\n };\n const extrasAndfilters = processFilters({\n ...formData,\n ...extras,\n ...filterFormData,\n });\n const normalizeSeriesLimitMetric = (metric: QueryFormMetric | undefined) => {\n if (isQueryFormMetric(metric)) {\n return metric;\n }\n return undefined;\n };\n\n let queryObject: QueryObject = {\n // fallback `null` to `undefined` so they won't be sent to the backend\n // (JSON.stringify will ignore `undefined`.)\n time_range: time_range || undefined,\n since: since || undefined,\n until: until || undefined,\n granularity: granularity || undefined,\n ...extras,\n ...extrasAndfilters,\n columns,\n metrics,\n orderby,\n annotation_layers,\n row_limit:\n row_limit == null || Number.isNaN(numericRowLimit)\n ? undefined\n : numericRowLimit,\n row_offset:\n row_offset == null || Number.isNaN(numericRowOffset)\n ? undefined\n : numericRowOffset,\n series_columns,\n series_limit: series_limit ?? (isDefined(limit) ? Number(limit) : 0),\n series_limit_metric:\n normalizeSeriesLimitMetric(series_limit_metric) ??\n timeseries_limit_metric ??\n undefined,\n order_desc: typeof order_desc === 'undefined' ? true : order_desc,\n url_params: url_params || undefined,\n custom_params,\n };\n\n // override extra form data used by native and cross filters\n queryObject = overrideExtraFormData(queryObject, overrides);\n\n return { ...queryObject, custom_form_data };\n}\n","/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n/* eslint-disable camelcase */\nimport { TimeGranularity, QueryFormData } from '@superset-ui/core';\nimport {\n AppliedTimeExtras,\n QueryObjectExtras,\n QueryObjectFilterClause,\n TimeColumnConfigKey,\n} from './types';\n\ntype ExtraFilterQueryField = {\n time_range?: string;\n granularity_sqla?: string;\n time_grain_sqla?: TimeGranularity;\n granularity?: string;\n};\n\ntype ExtractedExtra = ExtraFilterQueryField & {\n filters: QueryObjectFilterClause[];\n extras: QueryObjectExtras;\n applied_time_extras: AppliedTimeExtras;\n};\n\nexport default function extractExtras(formData: QueryFormData): ExtractedExtra {\n const applied_time_extras: AppliedTimeExtras = {};\n const filters: QueryObjectFilterClause[] = [];\n const extras: QueryObjectExtras = {};\n const extract: ExtractedExtra = {\n filters,\n extras,\n applied_time_extras,\n };\n\n const reservedColumnsToQueryField: Record<\n TimeColumnConfigKey,\n keyof ExtraFilterQueryField\n > = {\n __time_range: 'time_range',\n __time_col: 'granularity_sqla',\n __time_grain: 'time_grain_sqla',\n __granularity: 'granularity',\n };\n\n (formData.extra_filters || []).forEach(filter => {\n if (filter.col in reservedColumnsToQueryField) {\n const key = filter.col as TimeColumnConfigKey;\n const queryField = reservedColumnsToQueryField[key];\n extract[queryField] = filter.val as TimeGranularity;\n applied_time_extras[key] = filter.val as string;\n } else {\n filters.push(filter);\n }\n });\n\n // SQL\n extras.time_grain_sqla = extract.time_grain_sqla || formData.time_grain_sqla;\n extract.granularity =\n extract.granularity_sqla ||\n formData.granularity ||\n formData.granularity_sqla;\n delete extract.granularity_sqla;\n delete extract.time_grain_sqla;\n\n return extract;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { ExtraFormDataOverride, QueryObject } from './types';\nimport {\n EXTRA_FORM_DATA_OVERRIDE_EXTRA_KEYS,\n EXTRA_FORM_DATA_OVERRIDE_REGULAR_MAPPINGS,\n} from './constants';\n\nexport function overrideExtraFormData(\n queryObject: QueryObject,\n overrideFormData: ExtraFormDataOverride,\n): QueryObject {\n const overriddenFormData: QueryObject = { ...queryObject };\n const { extras: overriddenExtras = {} } = overriddenFormData;\n Object.entries(EXTRA_FORM_DATA_OVERRIDE_REGULAR_MAPPINGS).forEach(\n ([key, target]) => {\n const value = overrideFormData[key as keyof ExtraFormDataOverride];\n if (value !== undefined) {\n overriddenFormData[target] = value;\n }\n },\n );\n EXTRA_FORM_DATA_OVERRIDE_EXTRA_KEYS.forEach(key => {\n if (key in overrideFormData) {\n // @ts-ignore\n overriddenExtras[key] = overrideFormData[key];\n }\n });\n if (Object.keys(overriddenExtras).length > 0) {\n overriddenFormData.extras = overriddenExtras;\n }\n return overriddenFormData;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport {\n ExtraFormDataAppend,\n ExtraFormDataOverrideExtras,\n ExtraFormDataOverrideRegular,\n ExtraFormDataOverride,\n QueryObject,\n} from './types';\n\nexport const DTTM_ALIAS = '__timestamp';\nexport const NO_TIME_RANGE = 'No filter';\n\nexport const EXTRA_FORM_DATA_OVERRIDE_EXTRA_KEYS: (keyof ExtraFormDataOverrideExtras)[] =\n ['relative_start', 'relative_end', 'time_grain_sqla'];\n\nexport const EXTRA_FORM_DATA_APPEND_KEYS: (keyof ExtraFormDataAppend)[] = [\n 'adhoc_filters',\n 'filters',\n 'interactive_groupby',\n 'interactive_highlight',\n 'interactive_drilldown',\n 'custom_form_data',\n];\n\nexport const EXTRA_FORM_DATA_OVERRIDE_REGULAR_MAPPINGS: Record<\n keyof ExtraFormDataOverrideRegular,\n keyof QueryObject\n> = {\n granularity: 'granularity',\n granularity_sqla: 'granularity',\n time_column: 'time_column',\n time_grain: 'time_grain',\n time_range: 'time_range',\n};\n\nexport const EXTRA_FORM_DATA_OVERRIDE_REGULAR_KEYS = Object.keys(\n EXTRA_FORM_DATA_OVERRIDE_REGULAR_MAPPINGS,\n) as (keyof ExtraFormDataOverrideRegular)[];\n\nexport const EXTRA_FORM_DATA_OVERRIDE_KEYS: (keyof ExtraFormDataOverride)[] = [\n ...EXTRA_FORM_DATA_OVERRIDE_REGULAR_KEYS,\n ...EXTRA_FORM_DATA_OVERRIDE_EXTRA_KEYS,\n];\n","/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {\n SimpleAdhocFilter,\n isBinaryAdhocFilter,\n isUnaryAdhocFilter,\n} from './types/Filter';\nimport { QueryObjectFilterClause } from './types/Query';\n\nexport default function convertFilter(\n filter: SimpleAdhocFilter,\n): QueryObjectFilterClause {\n const { subject } = filter;\n if (isUnaryAdhocFilter(filter)) {\n const { operator } = filter;\n\n return {\n col: subject,\n op: operator,\n };\n }\n if (isBinaryAdhocFilter(filter)) {\n const { operator } = filter;\n\n return {\n col: subject,\n op: operator,\n val: filter.comparator,\n };\n }\n\n const { operator } = filter;\n\n return {\n col: subject,\n op: operator,\n val: filter.comparator,\n };\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { t } from '../translation';\nimport { removeDuplicates } from '../utils';\nimport getColumnLabel from './getColumnLabel';\nimport getMetricLabel from './getMetricLabel';\nimport {\n QueryFields,\n QueryFormColumn,\n QueryFormMetric,\n QueryFormOrderBy,\n QueryFieldAliases,\n FormDataResidual,\n QueryMode,\n} from './types/QueryFormData';\n\n/**\n * Extra SQL query related fields from chart form data.\n * Consolidate field values into arrays.\n *\n * @param formData - the (partial) form data obtained from chart controls.\n * @param aliases - additional field aliases that maps arbitrary field names to\n * query field names.\n */\nexport default function extractQueryFields(\n formData: FormDataResidual,\n aliases?: QueryFieldAliases,\n): QueryFields {\n const queryFieldAliases: QueryFieldAliases = {\n /** These are predefined for backward compatibility */\n metric: 'metrics',\n metric_2: 'metrics',\n secondary_metric: 'metrics',\n x: 'metrics',\n y: 'metrics',\n size: 'metrics',\n all_columns: 'columns',\n series: 'groupby',\n order_by_cols: 'orderby',\n ...aliases,\n };\n const { query_mode: queryMode, ...restFormData } = formData;\n\n let columns: QueryFormColumn[] = [];\n let metrics: QueryFormMetric[] = [];\n let orderby: QueryFormOrderBy[] = [];\n\n Object.entries(restFormData).forEach(([key, value]) => {\n // ignore `null` or `undefined` value\n if (value == null) {\n return;\n }\n\n let normalizedKey: string = queryFieldAliases[key] || key;\n\n // ignore columns when (specifically) in aggregate mode.\n // For charts that support both aggregate and raw records mode,\n // we store both `groupby` and `columns` in `formData`, so users can\n // switch between modes while retaining the selected options for each.\n if (queryMode === QueryMode.Aggregate && normalizedKey === 'columns') {\n return;\n }\n\n // for the same reason, ignore groupby and metrics in raw records mode\n if (\n queryMode === QueryMode.Raw &&\n (normalizedKey === 'groupby' || normalizedKey === 'metrics')\n ) {\n return;\n }\n\n // groupby has been deprecated in QueryObject: https://github.com/apache/superset/pull/9366\n if (normalizedKey === 'groupby') {\n normalizedKey = 'columns';\n }\n\n if (normalizedKey === 'metrics') {\n metrics = metrics.concat(value);\n } else if (normalizedKey === 'columns') {\n // currently the columns field only accept pre-defined columns (string shortcut)\n columns = columns.concat(value);\n } else if (normalizedKey === 'orderby') {\n orderby = orderby.concat(value);\n }\n });\n\n return {\n columns: removeDuplicates(\n columns.filter(col => col !== ''),\n getColumnLabel,\n ),\n metrics:\n queryMode === QueryMode.Raw\n ? undefined\n : removeDuplicates(metrics, getMetricLabel),\n orderby:\n orderby.length > 0\n ? orderby.map(item => {\n // value can be in the format of `['[\"col1\", true]', '[\"col2\", false]'],\n // where the option strings come directly from `order_by_choices`.\n if (typeof item === 'string') {\n try {\n return JSON.parse(item);\n } catch (error) {\n throw new Error(t('Found invalid orderby options'));\n }\n }\n return item;\n })\n : undefined,\n };\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport {\n COMMON_ERR_MESSAGES,\n JsonObject,\n SupersetClientResponse,\n t,\n SupersetError,\n ErrorTypeEnum,\n isProbablyHTML,\n isJsonString,\n} from '@superset-ui/core';\n\n// The response always contains an error attribute, can contain anything from\n// the SupersetClientResponse object, and can contain a spread JSON blob\nexport type ClientErrorObject = {\n error: string;\n errors?: SupersetError[];\n link?: string;\n message?: string;\n severity?: string;\n stacktrace?: string;\n statusText?: string;\n} & Partial;\n\n// see rejectAfterTimeout.ts\ninterface TimeoutError {\n statusText: 'timeout';\n timeout: number;\n}\n\ntype ErrorType =\n | SupersetClientResponse\n | TimeoutError\n | { response: Response }\n | string;\n\ntype ErrorTextSource = 'dashboard' | 'chart' | 'query' | 'dataset' | 'database';\n\nconst ERROR_CODE_LOOKUP = {\n 400: 'Bad request',\n 401: 'Unauthorized',\n 402: 'Payment required',\n 403: 'Forbidden',\n 404: 'Not found',\n 405: 'Method not allowed',\n 406: 'Not acceptable',\n 407: 'Proxy authentication required',\n 408: 'Request timeout',\n 409: 'Conflict',\n 410: 'Gone',\n 411: 'Length required',\n 412: 'Precondition failed',\n 413: 'Payload too large',\n 414: 'URI too long',\n 415: 'Unsupported media type',\n 416: 'Range not satisfiable',\n 417: 'Expectation failed',\n 418: \"I'm a teapot\",\n 500: 'Server error',\n 501: 'Not implemented',\n 502: 'Bad gateway',\n 503: 'Service unavailable',\n 504: 'Gateway timeout',\n 505: 'HTTP version not supported',\n 506: 'Variant also negotiates',\n 507: 'Insufficient storage',\n 508: 'Loop detected',\n 510: 'Not extended',\n 511: 'Network authentication required',\n 599: 'Network error',\n};\n\nexport function checkForHtml(str: string): boolean {\n return !isJsonString(str) && isProbablyHTML(str);\n}\n\nexport function parseStringResponse(str: string): string {\n if (checkForHtml(str)) {\n for (const [code, message] of Object.entries(ERROR_CODE_LOOKUP)) {\n const regex = new RegExp(`${code}|${message}`, 'i');\n if (regex.test(str)) {\n return t(message);\n }\n }\n return t('Unknown error');\n }\n return str;\n}\n\nexport function getErrorFromStatusCode(status: number): string | null {\n return ERROR_CODE_LOOKUP[status] || null;\n}\n\nexport function retrieveErrorMessage(\n str: string,\n errorObject: JsonObject,\n): string {\n const statusError =\n 'status' in errorObject ? getErrorFromStatusCode(errorObject.status) : null;\n\n // Prefer status code message over the response or HTML text\n return statusError || parseStringResponse(str);\n}\n\nexport function parseErrorJson(responseJson: JsonObject): ClientErrorObject {\n let error = { ...responseJson };\n // Backwards compatibility for old error renderers with the new error object\n if (error.errors && error.errors.length > 0) {\n error.error = error.description = error.errors[0].message;\n error.link = error.errors[0]?.extra?.link;\n }\n // Marshmallow field validation returns the error message in the format\n // of { message: { field1: [msg1, msg2], field2: [msg], } }\n if (!error.error && error.message) {\n if (typeof error.message === 'object') {\n error.error =\n Object.values(error.message as Record)[0]?.[0] ||\n t('Invalid input');\n }\n if (typeof error.message === 'string') {\n if (checkForHtml(error.message)) {\n error.error = retrieveErrorMessage(error.message, error);\n } else {\n error.error = error.message;\n }\n }\n }\n if (error.stack) {\n error = {\n ...error,\n error:\n t('Unexpected error: ') +\n (error.description || t('(no description, click to see stack trace)')),\n stacktrace: error.stack,\n };\n } else if (error.responseText && error.responseText.indexOf('CSRF') >= 0) {\n error = {\n ...error,\n error: t(COMMON_ERR_MESSAGES.SESSION_TIMED_OUT),\n };\n }\n\n return { ...error, error: error.error }; // explicit ClientErrorObject\n}\n\nexport function getClientErrorObject(\n response:\n | SupersetClientResponse\n | TimeoutError\n | { response: Response }\n | string,\n): Promise {\n // takes a SupersetClientResponse as input, attempts to read response as Json\n // if possible, and returns a Promise that resolves to a plain object with\n // error key and text value.\n return new Promise(resolve => {\n if (typeof response === 'string') {\n resolve({ error: parseStringResponse(response) });\n return;\n }\n\n if (\n response instanceof TypeError &&\n response.message === 'Failed to fetch'\n ) {\n resolve({\n error: t('Network error'),\n });\n return;\n }\n\n if (\n 'timeout' in response &&\n 'statusText' in response &&\n response.statusText === 'timeout'\n ) {\n resolve({\n ...response,\n error: t('Request timed out'),\n errors: [\n {\n error_type: ErrorTypeEnum.FRONTEND_TIMEOUT_ERROR,\n extra: {\n timeout: response.timeout / 1000,\n issue_codes: [\n {\n code: 1000,\n message: t('Issue 1000 - The dataset is too large to query.'),\n },\n {\n code: 1001,\n message: t(\n 'Issue 1001 - The database is under an unusual load.',\n ),\n },\n ],\n },\n level: 'error',\n message: 'Request timed out',\n },\n ],\n });\n return;\n }\n\n const responseObject =\n response instanceof Response ? response : response.response;\n\n if (responseObject && !responseObject.bodyUsed) {\n // attempt to read the body as json, and fallback to text. we must clone\n // the response in order to fallback to .text() because Response is\n // single-read\n responseObject\n .clone()\n .json()\n .then(errorJson => {\n // Destructuring instead of spreading to avoid loss of sibling properties to the body\n const { url, status, statusText, redirected, type } = responseObject;\n const responseSummary = { url, status, statusText, redirected, type };\n const error = {\n ...errorJson,\n ...responseSummary,\n };\n resolve(parseErrorJson(error));\n })\n .catch(() => {\n // fall back to reading as text\n responseObject.text().then((errorText: any) => {\n resolve({\n // Destructuring not necessary here\n ...responseObject,\n error: retrieveErrorMessage(errorText, responseObject),\n });\n });\n });\n return;\n }\n\n // fall back to Response.statusText or generic error of we cannot read the response\n let error = (response as any).statusText || (response as any).message;\n if (!error) {\n // eslint-disable-next-line no-console\n console.error('non-standard error:', response);\n error = t('An error occurred');\n }\n resolve({\n ...responseObject,\n error: parseStringResponse(error),\n });\n });\n}\n\n/*\n * Utility to get standardized error text for generic update failures\n */\nexport async function getErrorText(\n errorObject: ErrorType,\n source: ErrorTextSource,\n) {\n const { error, message } = await getClientErrorObject(errorObject);\n let errorText = t('Sorry, an unknown error occurred.');\n\n if (error) {\n errorText = t(\n 'Sorry, there was an error saving this %s: %s',\n source,\n error,\n );\n }\n if (typeof message === 'string' && message === 'Forbidden') {\n errorText = t('You do not have permission to edit this %s', source);\n }\n return errorText;\n}\n\nexport function getClientErrorMessage(\n message: string,\n clientError?: ClientErrorObject,\n) {\n let finalMessage = message;\n const errorMessage = clientError?.message || clientError?.error;\n if (errorMessage) {\n finalMessage = `${finalMessage}:\\n${errorMessage}`;\n }\n return finalMessage;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { isPhysicalColumn, QueryFormColumn } from './types';\n\nexport default function getColumnLabel(column: QueryFormColumn): string {\n if (isPhysicalColumn(column)) {\n return column;\n }\n if (column?.label) {\n return column.label;\n }\n return column?.sqlExpression;\n}\n","/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { QueryFormMetric, isSavedMetric, isAdhocMetricSimple } from './types';\n\nexport default function getMetricLabel(metric: QueryFormMetric): string {\n if (isSavedMetric(metric)) {\n return metric;\n }\n if (metric.label) {\n return metric.label;\n }\n if (isAdhocMetricSimple(metric)) {\n return `${metric.aggregate}(${\n metric.column.columnName || metric.column.column_name\n })`;\n }\n return metric.sqlExpression;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport {\n DTTM_ALIAS,\n getColumnLabel,\n isQueryFormColumn,\n QueryFormData,\n QueryFormColumn,\n Optional,\n} from '@superset-ui/core';\n\nexport const isXAxisSet = (formData: QueryFormData) =>\n isQueryFormColumn(formData.x_axis);\n\nexport const getXAxisColumn = (\n formData: QueryFormData,\n): Optional => {\n // The formData should be \"raw form_data\" -- the snake_case version of formData rather than camelCase.\n if (!(formData.granularity_sqla || formData.x_axis)) {\n return undefined;\n }\n\n if (isXAxisSet(formData)) {\n return formData.x_axis;\n }\n return DTTM_ALIAS;\n};\n\nexport const getXAxisLabel = (formData: QueryFormData): Optional => {\n const col = getXAxisColumn(formData);\n if (col) {\n return getColumnLabel(col);\n }\n return undefined;\n};\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { omit } from 'lodash';\n\nimport {\n AdhocColumn,\n isAdhocColumn,\n isPhysicalColumn,\n QueryFormColumn,\n QueryFormData,\n QueryObject,\n} from './types';\nimport { isXAxisSet } from './getXAxis';\n\nexport function normalizeTimeColumn(\n formData: QueryFormData,\n queryObject: QueryObject,\n): QueryObject {\n // The formData should be \"raw form_data\" -- the snake_case version of formData rather than camelCase.\n if (!isXAxisSet(formData)) {\n return queryObject;\n }\n\n const { columns: _columns, extras: _extras } = queryObject;\n const mutatedColumns: QueryFormColumn[] = [...(_columns || [])];\n const axisIdx = _columns?.findIndex(\n col =>\n (isPhysicalColumn(col) &&\n isPhysicalColumn(formData.x_axis) &&\n col === formData.x_axis) ||\n (isAdhocColumn(col) &&\n isAdhocColumn(formData.x_axis) &&\n col.sqlExpression === formData.x_axis.sqlExpression),\n );\n if (\n axisIdx !== undefined &&\n axisIdx > -1 &&\n formData.x_axis &&\n Array.isArray(_columns)\n ) {\n if (isAdhocColumn(_columns[axisIdx])) {\n mutatedColumns[axisIdx] = {\n timeGrain: _extras?.time_grain_sqla,\n columnType: 'BASE_AXIS',\n ...(_columns[axisIdx] as AdhocColumn),\n };\n } else {\n mutatedColumns[axisIdx] = {\n timeGrain: _extras?.time_grain_sqla,\n columnType: 'BASE_AXIS',\n sqlExpression: formData.x_axis,\n label: formData.x_axis,\n expressionType: 'SQL',\n };\n }\n\n const newQueryObject = omit(queryObject, ['is_timeseries']);\n newQueryObject.columns = mutatedColumns;\n\n return newQueryObject;\n }\n\n // fallback, return original queryObject\n return queryObject;\n}\n","/* eslint-disable camelcase */\n/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nexport enum RollingType {\n Mean = 'mean',\n Sum = 'sum',\n Std = 'std',\n Cumsum = 'cumsum',\n}\nexport interface RollingWindow {\n rolling_type?: RollingType;\n rolling_periods?: number;\n min_periods?: number;\n}\n\nexport enum ComparisonType {\n Values = 'values',\n Difference = 'difference',\n Percentage = 'percentage',\n Ratio = 'ratio',\n}\nexport interface TimeCompare {\n time_compare?: string;\n comparison_type?: ComparisonType;\n}\n\nexport default {};\n","/* eslint-disable camelcase */\n/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { GenericDataType } from './QueryResponse';\nimport { QueryFormColumn } from './QueryFormData';\n\nexport interface AdhocColumn {\n hasCustomLabel?: boolean;\n label?: string;\n optionName?: string;\n sqlExpression: string;\n expressionType: 'SQL';\n columnType?: 'BASE_AXIS' | 'SERIES';\n timeGrain?: string;\n datasourceWarning?: boolean;\n}\n\n/**\n * A column that is physically defined in datasource.\n */\nexport type PhysicalColumn = string;\n\n/**\n * Column information defined in datasource.\n */\nexport interface Column {\n id?: number;\n type?: string;\n type_generic?: GenericDataType;\n column_name: string;\n groupby?: boolean;\n is_dttm?: boolean;\n filterable?: boolean;\n verbose_name?: string | null;\n description?: string | null;\n expression?: string | null;\n database_expression?: string | null;\n python_date_format?: string | null;\n\n // used for advanced_data_type\n optionName?: string;\n filterBy?: string;\n value?: string;\n advanced_data_type?: string;\n}\n\nexport function isPhysicalColumn(column?: any): column is PhysicalColumn {\n return typeof column === 'string';\n}\n\nexport function isAdhocColumn(column?: any): column is AdhocColumn {\n return (\n typeof column !== 'string' &&\n column?.sqlExpression !== undefined &&\n column?.label !== undefined &&\n (column?.expressionType === undefined || column?.expressionType === 'SQL')\n );\n}\n\nexport function isQueryFormColumn(column: any): column is QueryFormColumn {\n return isPhysicalColumn(column) || isAdhocColumn(column);\n}\n\nexport default {};\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { AdhocFilter, DataMask } from '@superset-ui/core';\n\nexport interface NativeFilterColumn {\n name: string;\n displayName?: string;\n}\n\nexport interface NativeFilterScope {\n rootPath: string[];\n excluded: number[];\n}\n\n/** The target of a filter is the datasource/column being filtered */\nexport interface NativeFilterTarget {\n datasetId: number;\n column: NativeFilterColumn;\n\n // maybe someday support this?\n // show values from these columns in the filter options selector\n // clarityColumns?: Column[];\n}\n\nexport enum NativeFilterType {\n NativeFilter = 'NATIVE_FILTER',\n Divider = 'DIVIDER',\n}\n\nexport enum DataMaskType {\n NativeFilters = 'nativeFilters',\n CrossFilters = 'crossFilters',\n}\n\nexport type DataMaskState = { [id: string]: DataMask };\n\nexport type DataMaskWithId = { id: string } & DataMask;\nexport type DataMaskStateWithId = { [filterId: string]: DataMaskWithId };\n\nexport type Filter = {\n cascadeParentIds: string[];\n defaultDataMask: DataMask;\n id: string; // randomly generated at filter creation\n name: string;\n scope: NativeFilterScope;\n filterType: string;\n // for now there will only ever be one target\n // when multiple targets are supported, change this to Target[]\n targets: [Partial];\n controlValues: {\n [key: string]: any;\n };\n sortMetric?: string | null;\n adhoc_filters?: AdhocFilter[];\n granularity_sqla?: string;\n granularity?: string;\n time_grain_sqla?: string;\n time_range?: string;\n requiredFirst?: boolean;\n tabsInScope?: string[];\n chartsInScope?: number[];\n type: typeof NativeFilterType.NativeFilter;\n description: string;\n};\n\nexport type AppliedFilter = {\n values: {\n filters: Record[];\n } | null;\n};\n\nexport type AppliedCrossFilterType = {\n filterType: undefined;\n targets: number[];\n scope: number[];\n} & AppliedFilter;\n\nexport type AppliedNativeFilterType = {\n filterType: 'filter_select';\n scope: number[];\n targets: Partial[];\n} & AppliedFilter;\n\nexport type FilterWithDataMask = Filter & { dataMask: DataMaskWithId };\n\nexport type Divider = Partial> & {\n id: string;\n title: string;\n description: string;\n type: typeof NativeFilterType.Divider;\n};\n\nexport function isAppliedCrossFilterType(\n filterElement: AppliedCrossFilterType | AppliedNativeFilterType | Filter,\n): filterElement is AppliedCrossFilterType {\n return (\n filterElement.filterType === undefined &&\n filterElement.hasOwnProperty('values')\n );\n}\n\nexport function isAppliedNativeFilterType(\n filterElement: AppliedCrossFilterType | AppliedNativeFilterType | Filter,\n): filterElement is AppliedNativeFilterType {\n return (\n filterElement.filterType === 'filter_select' &&\n filterElement.hasOwnProperty('values')\n );\n}\n\nexport function isNativeFilter(\n filterElement: Filter | Divider,\n): filterElement is Filter {\n return filterElement.type === NativeFilterType.NativeFilter;\n}\n\nexport function isNativeFilterWithDataMask(\n filterElement: Filter | Divider,\n): filterElement is FilterWithDataMask {\n return (\n isNativeFilter(filterElement) &&\n (filterElement as FilterWithDataMask).dataMask?.filterState?.value\n );\n}\n\nexport function isFilterDivider(\n filterElement: Filter | Divider,\n): filterElement is Divider {\n return filterElement.type === NativeFilterType.Divider;\n}\n\nexport type FilterConfiguration = Array;\n\nexport type Filters = {\n [filterId: string]: Filter | Divider;\n};\n\nexport type PartialFilters = {\n [filterId: string]: Partial;\n};\n\nexport type NativeFiltersState = {\n filters: Filters;\n focusedFilterId?: string;\n hoveredFilterId?: string;\n};\n\nexport type DashboardComponentMetadata = {\n nativeFilters: NativeFiltersState;\n dataMask: DataMaskStateWithId;\n};\n\nexport default {};\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { Column } from './Column';\nimport { Metric } from './Metric';\n\nexport enum DatasourceType {\n Table = 'table',\n Query = 'query',\n Dataset = 'dataset',\n SlTable = 'sl_table',\n SavedQuery = 'saved_query',\n}\n\nexport interface Currency {\n symbol: string;\n symbolPosition: string;\n}\n\n/**\n * Datasource metadata.\n */\nexport interface Datasource {\n id: number;\n name: string;\n type: DatasourceType;\n columns: Column[];\n metrics: Metric[];\n description?: string;\n // key is column names (labels)\n columnFormats?: {\n [key: string]: string;\n };\n currencyFormats?: {\n [key: string]: Currency;\n };\n verboseMap?: {\n [key: string]: string;\n };\n}\n\nexport const DEFAULT_METRICS: Metric[] = [\n {\n metric_name: 'COUNT(*)',\n expression: 'COUNT(*)',\n },\n];\n\nexport default {};\n","/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {\n UnaryOperator,\n BinaryOperator,\n SetOperator,\n isUnaryOperator,\n isBinaryOperator,\n isSetOperator,\n} from './Operator';\nimport { TimeGranularity } from '../../time-format';\n\ninterface BaseAdhocFilter {\n clause: 'WHERE' | 'HAVING';\n timeGrain?: TimeGranularity;\n isExtra?: boolean;\n}\n\ninterface BaseSimpleAdhocFilter extends BaseAdhocFilter {\n expressionType: 'SIMPLE';\n subject: string;\n}\n\nexport type UnaryAdhocFilter = BaseSimpleAdhocFilter & {\n operator: UnaryOperator;\n};\n\nexport type BinaryAdhocFilter = BaseSimpleAdhocFilter & {\n operator: BinaryOperator;\n comparator: string;\n};\n\nexport type SetAdhocFilter = BaseSimpleAdhocFilter & {\n operator: SetOperator;\n comparator: string[];\n};\n\nexport type SimpleAdhocFilter =\n | UnaryAdhocFilter\n | BinaryAdhocFilter\n | SetAdhocFilter;\n\nexport interface FreeFormAdhocFilter extends BaseAdhocFilter {\n expressionType: 'SQL';\n sqlExpression: string;\n}\n\nexport type AdhocFilter = SimpleAdhocFilter | FreeFormAdhocFilter;\n\n//---------------------------------------------------\n// Type guards\n//---------------------------------------------------\n\nexport function isSimpleAdhocFilter(\n filter: AdhocFilter,\n): filter is SimpleAdhocFilter {\n return filter.expressionType === 'SIMPLE';\n}\n\nexport function isFreeFormAdhocFilter(\n filter: AdhocFilter,\n): filter is FreeFormAdhocFilter {\n return filter.expressionType === 'SQL';\n}\n\nexport function isUnaryAdhocFilter(\n filter: SimpleAdhocFilter,\n): filter is UnaryAdhocFilter {\n return isUnaryOperator(filter.operator);\n}\n\nexport function isBinaryAdhocFilter(\n filter: SimpleAdhocFilter,\n): filter is BinaryAdhocFilter {\n return isBinaryOperator(filter.operator);\n}\n\nexport function isSetAdhocFilter(\n filter: SimpleAdhocFilter,\n): filter is SetAdhocFilter {\n return isSetOperator(filter.operator);\n}\n","/* eslint-disable camelcase */\n/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { Maybe, QueryFormMetric } from '../../types';\nimport { Column } from './Column';\n\nexport type Aggregate =\n | 'AVG'\n | 'COUNT'\n | 'COUNT_DISTINCT'\n | 'MAX'\n | 'MIN'\n | 'SUM';\n\nexport interface AdhocMetricBase {\n hasCustomLabel?: boolean;\n label?: string;\n optionName?: string;\n}\n\nexport interface AdhocMetricSimple extends AdhocMetricBase {\n expressionType: 'SIMPLE';\n column: Omit & {\n column_name?: string;\n columnName?: string;\n };\n aggregate: Aggregate;\n}\n\nexport interface AdhocMetricSQL extends AdhocMetricBase {\n expressionType: 'SQL';\n sqlExpression: string;\n}\n\nexport type AdhocMetric = AdhocMetricSimple | AdhocMetricSQL;\n\n/**\n * Select a predefined metric by its `metric_name`.\n */\nexport type SavedMetric = string;\n\n/**\n * Metric definition stored in datasource metadata.\n */\nexport interface Metric {\n id?: number;\n metric_name: string;\n expression?: Maybe;\n certification_details?: Maybe;\n certified_by?: Maybe;\n d3format?: Maybe;\n currency?: Maybe;\n description?: Maybe;\n is_certified?: boolean;\n verbose_name?: string;\n warning_markdown?: Maybe;\n warning_text?: Maybe;\n error_text?: string;\n}\n\nexport function isSavedMetric(metric: any): metric is SavedMetric {\n return typeof metric === 'string';\n}\n\nexport function isAdhocMetricSimple(metric: any): metric is AdhocMetricSimple {\n return typeof metric !== 'string' && metric?.expressionType === 'SIMPLE';\n}\n\nexport function isAdhocMetricSQL(metric: any): metric is AdhocMetricSQL {\n return typeof metric !== 'string' && metric?.expressionType === 'SQL';\n}\n\nexport function isQueryFormMetric(metric: any): metric is QueryFormMetric {\n return (\n isSavedMetric(metric) ||\n isAdhocMetricSimple(metric) ||\n isAdhocMetricSQL(metric)\n );\n}\n\nexport default {};\n","/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n/** List of operators that do not require another operand */\nconst UNARY_OPERATORS = ['IS NOT NULL', 'IS NULL'] as const;\n\n/** List of operators that require another operand that is a single value */\nconst BINARY_OPERATORS = [\n '==',\n '!=',\n '>',\n '<',\n '>=',\n '<=',\n 'ILIKE',\n 'LIKE',\n 'NOT LIKE',\n 'REGEX',\n 'TEMPORAL_RANGE',\n] as const;\n\n/** List of operators that require another operand that is a set */\nconst SET_OPERATORS = ['IN', 'NOT IN'] as const;\n\n//---------------------------------------------------\n// Derived types\n//---------------------------------------------------\n\n/** An operator that does not require another operand */\nexport type UnaryOperator = (typeof UNARY_OPERATORS)[number];\n\n/** An operator that requires another operand that is a single value */\nexport type BinaryOperator = (typeof BINARY_OPERATORS)[number];\n\n/** An operator that require another operand that is a set */\nexport type SetOperator = (typeof SET_OPERATORS)[number];\n\n//---------------------------------------------------\n// Type guards\n//---------------------------------------------------\n\nconst unaryOperatorSet = new Set(UNARY_OPERATORS);\n\nexport function isUnaryOperator(operator: string): operator is UnaryOperator {\n return unaryOperatorSet.has(operator);\n}\n\nconst binaryOperatorSet = new Set(BINARY_OPERATORS);\n\nexport function isBinaryOperator(operator: string): operator is BinaryOperator {\n return binaryOperatorSet.has(operator);\n}\n\nconst setOperatorSet = new Set(SET_OPERATORS);\n\nexport function isSetOperator(operator: string): operator is SetOperator {\n return setOperatorSet.has(operator);\n}\n","/* eslint camelcase: 0 */\n/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { DatasourceType } from './Datasource';\nimport { BinaryOperator, SetOperator, UnaryOperator } from './Operator';\nimport { AppliedTimeExtras, TimeRange } from './Time';\nimport { AnnotationLayer } from './AnnotationLayer';\nimport {\n QueryFields,\n QueryFormColumn,\n QueryFormData,\n QueryFormMetric,\n} from './QueryFormData';\nimport { Maybe } from '../../types';\nimport { PostProcessingRule } from './PostProcessing';\nimport { JsonObject } from '../../connection';\nimport { TimeGranularity } from '../../time-format';\nimport { GenericDataType } from './QueryResponse';\n\nexport type BaseQueryObjectFilterClause = {\n col: QueryFormColumn;\n grain?: TimeGranularity;\n isExtra?: boolean;\n};\n\nexport type BinaryQueryObjectFilterClause = BaseQueryObjectFilterClause & {\n op: BinaryOperator;\n val: string | number | boolean;\n formattedVal?: string;\n};\n\nexport type SetQueryObjectFilterClause = BaseQueryObjectFilterClause & {\n op: SetOperator;\n val: (string | number | boolean)[];\n formattedVal?: string[];\n};\n\nexport type UnaryQueryObjectFilterClause = BaseQueryObjectFilterClause & {\n op: UnaryOperator;\n formattedVal?: string;\n};\n\nexport type QueryObjectFilterClause =\n | BinaryQueryObjectFilterClause\n | SetQueryObjectFilterClause\n | UnaryQueryObjectFilterClause;\n\nexport type QueryObjectExtras = Partial<{\n /** HAVING condition for SQLAlchemy */\n having?: string;\n relative_start?: string;\n relative_end?: string;\n time_grain_sqla?: TimeGranularity;\n /** WHERE condition */\n where?: string;\n /** Instant Time Comparison */\n instant_time_comparison_range?: string;\n}>;\n\nexport type ResidualQueryObjectData = {\n [key: string]: unknown;\n};\n\n/**\n * Query object directly compatible with the new chart data API.\n * A stricter version of query form data.\n *\n * All information should be related to generating database queries. Config values\n * for client-side processing and chart rendering should happen in `buildQuery`\n * and `transformProps`.\n */\nexport interface QueryObject\n extends QueryFields,\n TimeRange,\n ResidualQueryObjectData {\n /**\n * Definition for annotation layers.\n */\n annotation_layers?: AnnotationLayer[];\n\n /** Time filters that have been applied to the query object */\n applied_time_extras?: AppliedTimeExtras;\n\n /** add fetch value predicate to query if defined in datasource */\n apply_fetch_values_predicate?: boolean;\n\n /**\n * Extra form data. Current stores information about time granularity, may be\n * cleaned up in the future.\n */\n extras?: QueryObjectExtras;\n\n /** SIMPLE where filters */\n filters?: QueryObjectFilterClause[];\n\n /** Time column for SQL */\n granularity?: string;\n\n /** If set, will group by timestamp */\n is_timeseries?: boolean;\n\n /** Should the rowcount of the query be fetched */\n is_rowcount?: boolean;\n\n /** Free-form HAVING SQL, multiple clauses are concatenated by AND */\n having?: string;\n\n post_processing?: (PostProcessingRule | undefined)[];\n\n /** Maximum numbers of rows to return */\n row_limit?: number;\n\n /** Number of rows to skip */\n row_offset?: number;\n\n /** The column to which direct temporal filters (forthcoming) */\n time_column?: string;\n\n /** The size of bucket by which to group timeseries data (forthcoming) */\n time_grain?: string;\n\n /** Direction to ordered by */\n order_desc?: boolean;\n\n url_params?: Record;\n\n custom_params?: JsonObject;\n\n /** Free-form WHERE SQL: multiple clauses are concatenated by AND */\n where?: string;\n\n /** Limit number of series */\n series_columns?: QueryFormColumn[];\n series_limit?: number;\n series_limit_metric?: Maybe;\n}\n\nexport interface QueryContext {\n datasource: {\n id: number;\n type: DatasourceType;\n };\n /** Force refresh of all queries */\n force: boolean;\n /** Type of result to return for queries */\n result_type: string;\n /** Response format */\n result_format: string;\n queries: QueryObject[];\n form_data?: QueryFormData;\n}\n\n// Keep in sync with superset/errors.py\nexport const ErrorTypeEnum = {\n // Frontend errors\n FRONTEND_CSRF_ERROR: 'FRONTEND_CSRF_ERROR',\n FRONTEND_NETWORK_ERROR: 'FRONTEND_NETWORK_ERROR',\n FRONTEND_TIMEOUT_ERROR: 'FRONTEND_TIMEOUT_ERROR',\n\n // DB Engine errors\n GENERIC_DB_ENGINE_ERROR: 'GENERIC_DB_ENGINE_ERROR',\n COLUMN_DOES_NOT_EXIST_ERROR: 'COLUMN_DOES_NOT_EXIST_ERROR',\n TABLE_DOES_NOT_EXIST_ERROR: 'TABLE_DOES_NOT_EXIST_ERROR',\n SCHEMA_DOES_NOT_EXIST_ERROR: 'SCHEMA_DOES_NOT_EXIST_ERROR',\n CONNECTION_INVALID_USERNAME_ERROR: 'CONNECTION_INVALID_USERNAME_ERROR',\n CONNECTION_INVALID_PASSWORD_ERROR: 'CONNECTION_INVALID_PASSWORD_ERROR',\n CONNECTION_INVALID_HOSTNAME_ERROR: 'CONNECTION_INVALID_HOSTNAME_ERROR',\n CONNECTION_PORT_CLOSED_ERROR: 'CONNECTION_PORT_CLOSED_ERROR',\n CONNECTION_INVALID_PORT_ERROR: 'CONNECTION_INVALID_PORT_ERROR',\n CONNECTION_HOST_DOWN_ERROR: 'CONNECTION_HOST_DOWN_ERROR',\n CONNECTION_ACCESS_DENIED_ERROR: 'CONNECTION_ACCESS_DENIED_ERROR',\n CONNECTION_UNKNOWN_DATABASE_ERROR: 'CONNECTION_UNKNOWN_DATABASE_ERROR',\n CONNECTION_DATABASE_PERMISSIONS_ERROR:\n 'CONNECTION_DATABASE_PERMISSIONS_ERROR',\n CONNECTION_MISSING_PARAMETERS_ERROR: 'CONNECTION_MISSING_PARAMETERS_ERROR',\n OBJECT_DOES_NOT_EXIST_ERROR: 'OBJECT_DOES_NOT_EXIST_ERROR',\n SYNTAX_ERROR: 'SYNTAX_ERROR',\n CONNECTION_DATABASE_TIMEOUT: 'CONNECTION_DATABASE_TIMEOUT',\n\n // Viz errors\n VIZ_GET_DF_ERROR: 'VIZ_GET_DF_ERROR',\n UNKNOWN_DATASOURCE_TYPE_ERROR: 'UNKNOWN_DATASOURCE_TYPE_ERROR',\n FAILED_FETCHING_DATASOURCE_INFO_ERROR:\n 'FAILED_FETCHING_DATASOURCE_INFO_ERROR',\n\n // Security access errors\n TABLE_SECURITY_ACCESS_ERROR: 'TABLE_SECURITY_ACCESS_ERROR',\n DATASOURCE_SECURITY_ACCESS_ERROR: 'DATASOURCE_SECURITY_ACCESS_ERROR',\n DATABASE_SECURITY_ACCESS_ERROR: 'DATABASE_SECURITY_ACCESS_ERROR',\n QUERY_SECURITY_ACCESS_ERROR: 'QUERY_SECURITY_ACCESS_ERROR',\n MISSING_OWNERSHIP_ERROR: 'MISSING_OWNERSHIP_ERROR',\n USER_ACTIVITY_SECURITY_ACCESS_ERROR: 'USER_ACTIVITY_SECURITY_ACCESS_ERROR',\n DASHBOARD_SECURITY_ACCESS_ERROR: 'DASHBOARD_SECURITY_ACCESS_ERROR',\n CHART_SECURITY_ACCESS_ERROR: 'CHART_SECURITY_ACCESS_ERROR',\n OAUTH2_REDIRECT: 'OAUTH2_REDIRECT',\n OAUTH2_REDIRECT_ERROR: 'OAUTH2_REDIRECT_ERROR',\n\n // Other errors\n BACKEND_TIMEOUT_ERROR: 'BACKEND_TIMEOUT_ERROR',\n DATABASE_NOT_FOUND_ERROR: 'DATABASE_NOT_FOUND_ERROR',\n\n // Sql Lab errors\n MISSING_TEMPLATE_PARAMS_ERROR: 'MISSING_TEMPLATE_PARAMS_ERROR',\n INVALID_TEMPLATE_PARAMS_ERROR: 'INVALID_TEMPLATE_PARAMS_ERROR',\n RESULTS_BACKEND_NOT_CONFIGURED_ERROR: 'RESULTS_BACKEND_NOT_CONFIGURED_ERROR',\n DML_NOT_ALLOWED_ERROR: 'DML_NOT_ALLOWED_ERROR',\n INVALID_CTAS_QUERY_ERROR: 'INVALID_CTAS_QUERY_ERROR',\n INVALID_CVAS_QUERY_ERROR: 'INVALID_CVAS_QUERY_ERROR',\n SQLLAB_TIMEOUT_ERROR: 'SQLLAB_TIMEOUT_ERROR',\n RESULTS_BACKEND_ERROR: 'RESULTS_BACKEND_ERROR',\n ASYNC_WORKERS_ERROR: 'ASYNC_WORKERS_ERROR',\n ADHOC_SUBQUERY_NOT_ALLOWED_ERROR: 'ADHOC_SUBQUERY_NOT_ALLOWED_ERROR',\n INVALID_SQL_ERROR: 'INVALID_SQL_ERROR',\n\n // Generic errors\n GENERIC_COMMAND_ERROR: 'GENERIC_COMMAND_ERROR',\n GENERIC_BACKEND_ERROR: 'GENERIC_BACKEND_ERROR',\n\n // API errors\n INVALID_PAYLOAD_FORMAT_ERROR: 'INVALID_PAYLOAD_FORMAT_ERROR',\n INVALID_PAYLOAD_SCHEMA_ERROR: 'INVALID_PAYLOAD_SCHEMA_ERROR',\n MARSHMALLOW_ERROR: 'MARSHMALLOW_ERROR',\n\n // Report errors\n REPORT_NOTIFICATION_ERROR: 'REPORT_NOTIFICATION_ERROR',\n} as const;\n\ntype ValueOf = T[keyof T];\n\nexport type ErrorType = ValueOf;\n\n// Keep in sync with superset/errors.py\nexport type ErrorLevel = 'info' | 'warning' | 'error';\n\nexport type ErrorSource = 'dashboard' | 'explore' | 'sqllab' | 'crud';\n\nexport type SupersetError | null> = {\n error_type: ErrorType;\n extra: ExtraType;\n level: ErrorLevel;\n message: string;\n};\n\nexport const CtasEnum = {\n TABLE: 'TABLE',\n VIEW: 'VIEW',\n};\n\nexport type QueryColumn = {\n name?: string;\n column_name: string;\n type: string | null;\n type_generic: GenericDataType;\n is_dttm: boolean;\n};\n\n// Possible states of a query object for processing on the server\nexport enum QueryState {\n Started = 'started',\n Stopped = 'stopped',\n Failed = 'failed',\n Pending = 'pending',\n Running = 'running',\n Scheduled = 'scheduled',\n Success = 'success',\n Fetching = 'fetching',\n TimedOut = 'timed_out',\n}\n\n// Inidcates a Query's state is still processing\nexport const runningQueryStateList: QueryState[] = [\n QueryState.Running,\n QueryState.Started,\n QueryState.Pending,\n QueryState.Fetching,\n QueryState.Scheduled,\n];\n\n// Indicates a Query's state has completed processing regardless of success / failure\nexport const concludedQueryStateList: QueryState[] = [\n QueryState.Stopped,\n QueryState.Failed,\n QueryState.Success,\n QueryState.TimedOut,\n];\n\nexport type Query = {\n cached: boolean;\n ctas: boolean;\n ctas_method?: keyof typeof CtasEnum;\n dbId: number;\n errors?: SupersetError[];\n errorMessage: string | null;\n extra: {\n progress: string | null;\n errors?: SupersetError[];\n };\n id: string;\n isDataPreview: boolean;\n link?: string;\n progress: number;\n resultsKey: string | null;\n catalog?: string | null;\n schema?: string;\n sql: string;\n sqlEditorId: string;\n state: QueryState;\n tab: string | null;\n tempSchema: string | null;\n tempTable: string;\n trackingUrl: string | null;\n templateParams: any;\n rows: number;\n queryLimit: number;\n limitingFactor: string;\n endDttm: number;\n duration: string;\n startDttm: number;\n time: Record;\n user: Record;\n userId: number;\n db: Record;\n started: string;\n querylink: Record;\n queryId: number;\n executedSql: string;\n output: string | Record;\n actions: Record;\n type: DatasourceType;\n columns: QueryColumn[];\n runAsync?: boolean;\n};\n\nexport type QueryResults = {\n results: {\n displayLimitReached: boolean;\n columns: QueryColumn[];\n data: Record[];\n expanded_columns: QueryColumn[];\n selected_columns: QueryColumn[];\n query: { limit: number };\n query_id?: number;\n };\n};\n\nexport type QueryResponse = Query & QueryResults;\n\n// todo: move out from typing\nexport const testQuery: Query = {\n id: 'clientId2353',\n dbId: 1,\n sql: 'SELECT * FROM something',\n sqlEditorId: 'dfsadfs',\n tab: 'unimportant',\n tempTable: '',\n ctas: false,\n cached: false,\n errorMessage: null,\n extra: { progress: null },\n isDataPreview: false,\n progress: 0,\n resultsKey: null,\n state: QueryState.Success,\n tempSchema: null,\n trackingUrl: null,\n templateParams: null,\n rows: 42,\n queryLimit: 100,\n limitingFactor: '',\n endDttm: 1476910579693,\n duration: '',\n startDttm: 1476910566092.96,\n time: {},\n user: {},\n userId: 1,\n db: {},\n started: '',\n querylink: {},\n queryId: 1,\n executedSql: '',\n output: '',\n actions: {},\n type: DatasourceType.Query,\n columns: [\n {\n column_name: 'Column 1',\n type: 'STRING',\n is_dttm: false,\n type_generic: GenericDataType.String,\n },\n {\n column_name: 'Column 3',\n type: 'STRING',\n is_dttm: false,\n type_generic: GenericDataType.String,\n },\n {\n column_name: 'Column 2',\n type: 'TIMESTAMP',\n is_dttm: true,\n type_generic: GenericDataType.Temporal,\n },\n ],\n};\n\nexport const testQueryResults = {\n results: {\n displayLimitReached: false,\n columns: [\n {\n column_name: 'Column 1',\n type: 'STRING',\n type_generic: GenericDataType.String,\n is_dttm: false,\n },\n {\n column_name: 'Column 3',\n type: 'STRING',\n type_generic: GenericDataType.String,\n is_dttm: false,\n },\n {\n column_name: 'Column 2',\n type: 'TIMESTAMP',\n type_generic: GenericDataType.Temporal,\n is_dttm: true,\n },\n ],\n data: [\n { 'Column 1': 'a', 'Column 2': 'b', 'Column 3': '2014-11-11T00:00:00' },\n ],\n expanded_columns: [],\n selected_columns: [\n {\n column_name: 'Column 1',\n type: 'STRING',\n type_generic: GenericDataType.String,\n is_dttm: false,\n },\n {\n column_name: 'Column 3',\n type: 'STRING',\n type_generic: GenericDataType.String,\n is_dttm: false,\n },\n {\n column_name: 'Column 2',\n type: 'TIMESTAMP',\n type_generic: GenericDataType.Temporal,\n is_dttm: true,\n },\n ],\n query: { limit: 6 },\n },\n};\n\nexport const testQueryResponse = { ...testQuery, ...testQueryResults };\n\nexport enum ContributionType {\n Row = 'row',\n Column = 'column',\n}\n\nexport type DatasourceSamplesQuery = {\n filters?: QueryObjectFilterClause[];\n};\n\nexport default {};\n","/* eslint-disable camelcase */\n/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n/**\n * Types for the final QueryContext sent to /api/v1/chart/data.\n */\nimport { AdhocMetric, SavedMetric } from './Metric';\nimport { AdhocFilter } from './Filter';\nimport { BinaryOperator, SetOperator } from './Operator';\nimport { AnnotationLayer } from './AnnotationLayer';\nimport {\n QueryObject,\n QueryObjectExtras,\n QueryObjectFilterClause,\n} from './Query';\nimport { TimeRange } from './Time';\nimport { TimeGranularity } from '../../time-format';\nimport { JsonObject } from '../../connection';\nimport { AdhocColumn, PhysicalColumn } from './Column';\n\n/**\n * Metric definition/reference in query object.\n */\nexport type QueryFormMetric = SavedMetric | AdhocMetric;\n\n/**\n * Column selects in query object (used as dimensions in both groupby or raw\n * query mode). Can be either reference to physical column or expression.\n */\nexport type QueryFormColumn = PhysicalColumn | AdhocColumn;\n\n/**\n * Order query results by columns.\n * Format: [metric/column, is_ascending].\n */\nexport type QueryFormOrderBy =\n | [QueryFormColumn | QueryFormMetric | {}, boolean]\n | [];\n\nexport interface FormDataResidual {\n [key: string]: any;\n}\n\nexport enum QueryMode {\n Aggregate = 'aggregate',\n Raw = 'raw',\n}\n\n/**\n * Query form fields related to SQL query and data outputs.\n */\nexport interface QueryFields {\n columns?: QueryFormColumn[];\n metrics?: QueryFormMetric[];\n orderby?: QueryFormOrderBy[];\n}\n\n/**\n * Name of query fields.\n */\nexport type QueryField = keyof QueryFields;\n\n/**\n * Map of arbitrary control field names to query field names\n * (one of 'metrics' | 'columns' | 'groupby').\n *\n * Note that `groupby` is only added here because it is will be handled when\n * processing aliases but will not be sent to final objects. See `extraQueryFields.ts`.\n */\nexport type QueryFieldAliases = {\n [key: string]: QueryField | 'groupby';\n};\n\n/**\n * Filter value for adhoc filters from dashboard FilterBox.\n * Currently only Binary and Set filters are supported.\n */\nexport type QueryFormExtraFilter = {\n col: string;\n} & (\n | {\n op: BinaryOperator;\n val: string;\n }\n | {\n op: SetOperator;\n val: string[];\n }\n);\n\n/** These properties will be appended to those pre-existing in the form data/query object */\nexport type ExtraFormDataAppend = {\n adhoc_filters?: AdhocFilter[];\n filters?: QueryObjectFilterClause[];\n /** These properties are for dynamic cross chart interaction */\n interactive_drilldown?: string[];\n interactive_groupby?: string[];\n interactive_highlight?: string[];\n /** This property can be used to pass non-standard form data between viz components */\n custom_form_data?: JsonObject;\n};\n\n/** These parameters override properties in the extras parameter in the form data/query object.\n * Not all keys of QueryObjectExtras are supported here to ensure that freeform where and having\n * filter clauses can't be overridden */\nexport type ExtraFormDataOverrideExtras = Pick<\n QueryObjectExtras,\n 'relative_start' | 'relative_end' | 'time_grain_sqla'\n>;\n\n/** These parameters override those already present in the form data/query object */\nexport type ExtraFormDataOverrideRegular = Partial<\n Pick\n> &\n Partial> &\n Partial> &\n Partial>;\n\n/** These parameters override those already present in the form data/query object */\nexport type ExtraFormDataOverride = ExtraFormDataOverrideRegular &\n ExtraFormDataOverrideExtras;\n\nexport type ExtraFormData = ExtraFormDataAppend & ExtraFormDataOverride;\n\n// Type signature for formData shared by all viz types\n// It will be gradually filled out as we build out the query object\n\nexport interface BaseFormData extends TimeRange, FormDataResidual {\n /** datasource identifier ${id}_${type} */\n datasource: string;\n /**\n * visualization type\n * - necessary if you use the plugin and want to use\n * buildQuery function from the plugin.\n * This must match the key used when registering the plugin.\n * - not necessary if you do not plan to use the\n * buildQuery function from the plugin.\n * Can put \"custom\" (or any string) in this field in that case.\n */\n viz_type: string;\n metrics?: QueryFormMetric[];\n where?: string;\n columns?: QueryFormColumn[];\n groupby?: QueryFormColumn[];\n all_columns?: QueryFormColumn[];\n /** list of filters */\n adhoc_filters?: AdhocFilter[] | null;\n extra_filters?: QueryFormExtraFilter[] | null;\n extra_form_data?: ExtraFormData;\n /** order descending */\n order_desc?: boolean;\n /** limit number of time series\n * deprecated - use series_limit instead */\n limit?: number;\n /** limit number of row in the results */\n row_limit?: string | number | null;\n /** row offset for server side pagination */\n row_offset?: string | number | null;\n /** The metric used to order timeseries for limiting\n * deprecated - use series_limit_metric instead */\n timeseries_limit_metric?: QueryFormMetric;\n /** Force refresh */\n force?: boolean;\n result_format?: string;\n result_type?: string;\n annotation_layers?: AnnotationLayer[];\n url_params?: Record;\n custom_params?: Record;\n /** limit number of series */\n series_columns?: QueryFormColumn[];\n series_limit?: number;\n series_limit_metric?: QueryFormMetric;\n}\n\n/**\n * Form data for SQLAlchemy based datasources.\n */\nexport interface SqlaFormData extends BaseFormData {\n /**\n * Name of the Time Column. Time column is optional.\n */\n granularity?: string;\n granularity_sqla?: string;\n time_grain_sqla?: TimeGranularity;\n having?: string;\n}\n\nexport type QueryFormData = SqlaFormData;\n\n//---------------------------------------------------\n// Type guards\n//---------------------------------------------------\n\nexport default {};\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { TimeseriesDataRecord } from '../../chart';\nimport { AnnotationData } from './AnnotationLayer';\n\n/**\n * Generic data types, see enum of the same name in superset/utils/core.py.\n */\nexport enum GenericDataType {\n Numeric = 0,\n String = 1,\n Temporal = 2,\n Boolean = 3,\n}\n\n/**\n * Primitive types for data field values.\n */\nexport type DataRecordValue = number | string | boolean | Date | null;\n\nexport interface DataRecord {\n [key: string]: DataRecordValue;\n}\n\n/**\n * Queried data for charts. The `queries` field from `POST /chart/data`.\n * See superset/charts/schemas.py for the class of the same name.\n */\nexport interface ChartDataResponseResult {\n /**\n * Data for the annotation layer.\n */\n annotation_data: AnnotationData | null;\n cache_key: string | null;\n cache_timeout: number | null;\n cached_dttm: string | null;\n /**\n * Array of data records as dictionary\n */\n data: DataRecord[];\n /**\n * Name of each column, for retaining the order of the output columns.\n */\n colnames: string[];\n /**\n * Generic data types, based on the final output pandas dataframe.\n */\n coltypes: GenericDataType[];\n error: string | null;\n is_cached: boolean;\n query: string;\n rowcount: number;\n sql_rowcount: number;\n stacktrace: string | null;\n status:\n | 'stopped'\n | 'failed'\n | 'pending'\n | 'running'\n | 'scheduled'\n | 'success'\n | 'timed_out';\n from_dttm: number | null;\n to_dttm: number | null;\n}\n\nexport interface TimeseriesChartDataResponseResult\n extends ChartDataResponseResult {\n data: TimeseriesDataRecord[];\n label_map: Record;\n}\n\n/**\n * Query response from /api/v1/chart/data\n */\nexport interface ChartDataResponse {\n queries: ChartDataResponseResult[];\n}\n\nexport default {};\n","/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nexport const TS_REGEX = /(\\d{4}-\\d{2}-\\d{2})[\\sT](\\d{2}:\\d{2}:\\d{2}\\.?\\d*).*/;\n\nexport default function normalizeTimestamp(value: string): string {\n const match = value.match(TS_REGEX);\n if (match) {\n return `${match[1]}T${match[2]}Z`;\n }\n return value;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { TypedRegistry } from '../models';\nimport { makeSingleton } from '../utils';\nimport { Extensions } from './types';\n\n/**\n * A registry containing extensions which can alter Superset's UI at specific points defined by Superset.\n * See SIP-87: https://github.com/apache/superset/issues/20615\n */\nclass ExtensionsRegistry extends TypedRegistry {\n name = 'ExtensionsRegistry';\n}\n\nexport const getExtensionsRegistry = makeSingleton(ExtensionsRegistry, {});\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n/**\n * Ensure a nullable value input is an array. Useful when consolidating\n * input format from a select control.\n */\nexport default function ensureIsArray(value?: T[] | T | null): T[] {\n if (value === undefined || value === null) {\n return [];\n }\n return Array.isArray(value) ? value : [value];\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { FilterXSS, getDefaultWhiteList } from 'xss';\n\nconst xssFilter = new FilterXSS({\n whiteList: {\n ...getDefaultWhiteList(),\n span: ['style', 'class', 'title'],\n div: ['style', 'class'],\n a: ['style', 'class', 'href', 'title', 'target'],\n img: ['style', 'class', 'src', 'alt', 'title', 'width', 'height'],\n video: [\n 'autoplay',\n 'controls',\n 'loop',\n 'preload',\n 'src',\n 'height',\n 'width',\n 'muted',\n ],\n },\n stripIgnoreTag: true,\n css: false,\n});\n\nexport function sanitizeHtml(htmlString: string) {\n return xssFilter.process(htmlString);\n}\n\nexport function hasHtmlTagPattern(str: string): boolean {\n const htmlTagPattern =\n /<(html|head|body|div|span|a|p|h[1-6]|title|meta|link|script|style)/i;\n\n return htmlTagPattern.test(str);\n}\n\nexport function isProbablyHTML(text: string) {\n const cleanedStr = text.trim().toLowerCase();\n\n if (\n cleanedStr.startsWith('') &&\n hasHtmlTagPattern(cleanedStr)\n ) {\n return true;\n }\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(cleanedStr, 'text/html');\n return Array.from(doc.body.childNodes).some(({ nodeType }) => nodeType === 1);\n}\n\nexport function sanitizeHtmlIfNeeded(htmlString: string) {\n return isProbablyHTML(htmlString) ? sanitizeHtml(htmlString) : htmlString;\n}\n\nexport function safeHtmlSpan(possiblyHtmlString: string) {\n const isHtml = isProbablyHTML(possiblyHtmlString);\n if (isHtml) {\n return (\n \n );\n }\n return possiblyHtmlString;\n}\n\nexport function removeHTMLTags(str: string): string {\n return str.replace(/<[^>]*>/g, '');\n}\n\nexport function isJsonString(str: string): boolean {\n try {\n JSON.parse(str);\n return true;\n } catch (e) {\n return false;\n }\n}\n\nexport function getParagraphContents(\n str: string,\n): { [key: string]: string } | null {\n if (!isProbablyHTML(str)) {\n return null;\n }\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(str, 'text/html');\n const pTags = doc.querySelectorAll('p');\n\n if (pTags.length === 0) {\n return null;\n }\n\n const paragraphContents: { [key: string]: string } = {};\n\n pTags.forEach((pTag, index) => {\n paragraphContents[`p${index + 1}`] = pTag.textContent || '';\n });\n\n return paragraphContents;\n}\n","/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nexport default function isDefined(x: T): x is NonNullable {\n return x !== null && x !== undefined;\n}\n","/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n/** setTimeout that returns a promise */\nexport default function promiseTimeout(\n /** A function to be executed after the timer expires. */\n func: (...args: unknown[]) => T,\n /** The time, in milliseconds (thousandths of a second), the timer should wait before the specified function or code is executed. If this parameter is omitted, a value of 0 is used, meaning execute \"immediately\", or more accurately, as soon as possible. */\n delay?: number,\n) {\n return new Promise(resolve => {\n setTimeout(() => {\n resolve(func());\n }, delay);\n });\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n/**\n * Remove duplicate items from a list.\n */\nexport function removeDuplicates(\n items: T[],\n hash?: (item: T) => unknown,\n): T[] {\n if (hash) {\n const seen = new Set();\n return items.filter(x => {\n const itemHash = hash(x);\n if (seen.has(itemHash)) return false;\n seen.add(itemHash);\n return true;\n });\n }\n return [...new Set(items)];\n}\n\nexport default removeDuplicates;\n","/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { t } from '../translation';\n\n/**\n * formerly called integer()\n * @param v\n */\nexport default function legacyValidateInteger(v: unknown) {\n if (\n v &&\n (Number.isNaN(Number(v)) || parseInt(v as string, 10) !== Number(v))\n ) {\n return t('is expected to be an integer');\n }\n return false;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { t } from '../translation';\n\nexport default function validateMaxValue(v: unknown, max: Number) {\n if (Number(v) > +max) {\n return t('Value cannot exceed %s', max);\n }\n return false;\n}\n","/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { t } from '../translation';\n\nexport default function validateNonEmpty(v: unknown) {\n if (\n v === null ||\n typeof v === 'undefined' ||\n v === '' ||\n (Array.isArray(v) && v.length === 0)\n ) {\n return t('cannot be empty');\n }\n return false;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { pickBy } from 'lodash';\nimport { QueryEditor, LatestQueryEditorVersion } from 'src/SqlLab/types';\nimport { api, JsonResponse } from './queryApi';\n\nexport type EditorMutationParams = {\n queryEditor: QueryEditor;\n extra?: Record;\n};\n\nconst sqlEditorApi = api.injectEndpoints({\n endpoints: builder => ({\n updateSqlEditorTab: builder.mutation({\n query: ({\n queryEditor: {\n version = LatestQueryEditorVersion,\n id,\n dbId,\n catalog,\n schema,\n queryLimit,\n sql,\n name,\n latestQueryId,\n hideLeftBar,\n templateParams,\n autorun,\n updatedAt,\n },\n extra,\n }) => ({\n method: 'PUT',\n endpoint: encodeURI(`/tabstateview/${id}`),\n postPayload: pickBy(\n {\n database_id: dbId,\n catalog,\n schema,\n sql,\n label: name,\n query_limit: queryLimit,\n latest_query_id: latestQueryId,\n template_params: templateParams,\n hide_left_bar: hideLeftBar,\n autorun,\n extra_json: JSON.stringify({ updatedAt, version, ...extra }),\n },\n value => value !== undefined,\n ),\n }),\n }),\n updateCurrentSqlEditorTab: builder.mutation({\n query: queryEditorId => ({\n method: 'POST',\n endpoint: encodeURI(`/tabstateview/${queryEditorId}/activate`),\n transformResponse: () => queryEditorId,\n }),\n }),\n deleteSqlEditorTab: builder.mutation({\n query: queryEditorId => ({\n method: 'DELETE',\n endpoint: encodeURI(`/tabstateview/${queryEditorId}`),\n transformResponse: () => queryEditorId,\n }),\n }),\n }),\n});\n\nexport const {\n useUpdateSqlEditorTabMutation,\n useUpdateCurrentSqlEditorTabMutation,\n useDeleteSqlEditorTabMutation,\n} = sqlEditorApi;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { useRef, useEffect, FC } from 'react';\n\nimport { useDispatch, useSelector } from 'react-redux';\nimport { logging } from '@superset-ui/core';\nimport {\n SqlLabRootState,\n QueryEditor,\n UnsavedQueryEditor,\n} from 'src/SqlLab/types';\nimport {\n useUpdateCurrentSqlEditorTabMutation,\n useUpdateSqlEditorTabMutation,\n useDeleteSqlEditorTabMutation,\n} from 'src/hooks/apiResources/sqlEditorTabs';\nimport { useDebounceValue } from 'src/hooks/useDebounceValue';\nimport {\n syncQueryEditor,\n setEditorTabLastUpdate,\n setLastUpdatedActiveTab,\n clearDestoryedQueryEditor,\n} from 'src/SqlLab/actions/sqlLab';\nimport useEffectEvent from 'src/hooks/useEffectEvent';\n\nexport const INTERVAL = 5000;\n\nfunction hasUnsavedChanges(\n queryEditor: QueryEditor,\n lastSavedTimestamp: number,\n) {\n return (\n queryEditor.inLocalStorage ||\n (queryEditor.updatedAt && queryEditor.updatedAt > lastSavedTimestamp)\n );\n}\n\nexport function filterUnsavedQueryEditorList(\n queryEditors: QueryEditor[],\n unsavedQueryEditor: UnsavedQueryEditor,\n lastSavedTimestamp: number,\n) {\n return queryEditors\n .map(queryEditor => ({\n ...queryEditor,\n ...(unsavedQueryEditor.id === queryEditor.id && unsavedQueryEditor),\n }))\n .filter(queryEditor => hasUnsavedChanges(queryEditor, lastSavedTimestamp));\n}\n\nconst EditorAutoSync: FC = () => {\n const queryEditors = useSelector(\n state => state.sqlLab.queryEditors,\n );\n const unsavedQueryEditor = useSelector(\n state => state.sqlLab.unsavedQueryEditor,\n );\n const editorTabLastUpdatedAt = useSelector(\n state => state.sqlLab.editorTabLastUpdatedAt,\n );\n const dispatch = useDispatch();\n const lastSavedTimestampRef = useRef(editorTabLastUpdatedAt);\n\n const currentQueryEditorId = useSelector(\n ({ sqlLab }) => sqlLab.tabHistory.slice(-1)[0] || '',\n );\n const lastUpdatedActiveTab = useSelector(\n ({ sqlLab }) => sqlLab.lastUpdatedActiveTab,\n );\n const destroyedQueryEditors = useSelector<\n SqlLabRootState,\n Record\n >(({ sqlLab }) => sqlLab.destroyedQueryEditors);\n const [updateSqlEditor, { error }] = useUpdateSqlEditorTabMutation();\n const [updateCurrentSqlEditor] = useUpdateCurrentSqlEditorTabMutation();\n const [deleteSqlEditor] = useDeleteSqlEditorTabMutation();\n\n const debouncedUnsavedQueryEditor = useDebounceValue(\n unsavedQueryEditor,\n INTERVAL,\n );\n\n const getUnsavedItems = useEffectEvent(unsavedQE =>\n filterUnsavedQueryEditorList(\n queryEditors,\n unsavedQE,\n lastSavedTimestampRef.current,\n ),\n );\n\n const getUnsavedNewQueryEditor = useEffectEvent(() =>\n filterUnsavedQueryEditorList(\n queryEditors,\n unsavedQueryEditor,\n lastSavedTimestampRef.current,\n ).find(({ inLocalStorage }) => Boolean(inLocalStorage)),\n );\n\n const syncCurrentQueryEditor = useEffectEvent(() => {\n if (\n currentQueryEditorId &&\n currentQueryEditorId !== lastUpdatedActiveTab &&\n !queryEditors.find(({ id }) => id === currentQueryEditorId)\n ?.inLocalStorage\n ) {\n updateCurrentSqlEditor(currentQueryEditorId).then(() => {\n dispatch(setLastUpdatedActiveTab(currentQueryEditorId));\n });\n }\n });\n\n const syncDeletedQueryEditor = useEffectEvent(() => {\n if (Object.keys(destroyedQueryEditors).length > 0) {\n Object.keys(destroyedQueryEditors).forEach(id => {\n deleteSqlEditor(id)\n .then(() => {\n dispatch(clearDestoryedQueryEditor(id));\n })\n .catch(({ status }) => {\n if (status === 404) {\n dispatch(clearDestoryedQueryEditor(id));\n }\n });\n });\n }\n });\n\n useEffect(() => {\n let saveTimer: NodeJS.Timeout;\n function saveUnsavedQueryEditor() {\n const firstUnsavedQueryEditor = getUnsavedNewQueryEditor();\n\n if (firstUnsavedQueryEditor) {\n dispatch(syncQueryEditor(firstUnsavedQueryEditor));\n }\n saveTimer = setTimeout(saveUnsavedQueryEditor, INTERVAL);\n }\n const syncTimer = setInterval(syncCurrentQueryEditor, INTERVAL);\n saveTimer = setTimeout(saveUnsavedQueryEditor, INTERVAL);\n const clearQueryEditorTimer = setInterval(syncDeletedQueryEditor, INTERVAL);\n return () => {\n clearTimeout(saveTimer);\n clearInterval(syncTimer);\n clearInterval(clearQueryEditorTimer);\n };\n }, [\n getUnsavedNewQueryEditor,\n syncCurrentQueryEditor,\n syncDeletedQueryEditor,\n dispatch,\n ]);\n\n useEffect(() => {\n const unsaved = getUnsavedItems(debouncedUnsavedQueryEditor);\n\n Promise.all(\n unsaved\n .filter(({ inLocalStorage }) => !inLocalStorage)\n .map(queryEditor => updateSqlEditor({ queryEditor })),\n ).then(resolvers => {\n if (!resolvers.some(result => 'error' in result)) {\n lastSavedTimestampRef.current = Date.now();\n dispatch(setEditorTabLastUpdate(lastSavedTimestampRef.current));\n }\n });\n }, [debouncedUnsavedQueryEditor, getUnsavedItems, dispatch, updateSqlEditor]);\n\n useEffect(() => {\n if (error) {\n logging.warn('An error occurred while saving your editor state.', error);\n }\n }, [dispatch, error]);\n\n return null;\n};\n\nexport default EditorAutoSync;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { t } from '@superset-ui/core';\nimport type { Type } from 'src/components/Label';\n\nexport const STATE_TYPE_MAP: Record = {\n offline: 'danger',\n failed: 'danger',\n pending: 'info',\n fetching: 'info',\n running: 'warning',\n stopped: 'danger',\n success: 'success',\n};\n\nexport const STATE_TYPE_MAP_LOCALIZED = {\n offline: t('offline'),\n failed: t('failed'),\n pending: t('pending'),\n fetching: t('fetching'),\n running: t('running'),\n stopped: t('stopped'),\n success: t('success'),\n};\n\nexport const STATUS_OPTIONS = {\n success: 'success',\n failed: 'failed',\n running: 'running',\n offline: 'offline',\n pending: 'pending',\n};\n\nexport const STATUS_OPTIONS_LOCALIZED = {\n success: t('success'),\n failed: t('failed'),\n running: t('running'),\n offline: t('offline'),\n pending: t('pending'),\n};\n\nexport const TIME_OPTIONS = [\n 'now',\n '1 hour ago',\n '1 day ago',\n '7 days ago',\n '28 days ago',\n '90 days ago',\n '1 year ago',\n];\n\n// SqlEditor layout constants\nexport const SQL_EDITOR_GUTTER_HEIGHT = 5;\nexport const SQL_EDITOR_GUTTER_MARGIN = 3;\nexport const SQL_TOOLBAR_HEIGHT = 51;\nexport const SQL_EDITOR_LEFTBAR_WIDTH = 400;\nexport const SQL_EDITOR_PADDING = 10;\nexport const INITIAL_NORTH_PERCENT = 30;\nexport const INITIAL_SOUTH_PERCENT = 70;\nexport const SET_QUERY_EDITOR_SQL_DEBOUNCE_MS = 2000;\nexport const VALIDATION_DEBOUNCE_MS = 600;\nexport const WINDOW_RESIZE_THROTTLE_MS = 100;\n\n// kilobyte storage\nexport const KB_STORAGE = 1024;\nexport const BYTES_PER_CHAR = 2;\n\n// browser's localStorage max usage constants\nexport const LOCALSTORAGE_MAX_QUERY_AGE_MS = 24 * 60 * 60 * 1000; // 24 hours\nexport const LOCALSTORAGE_MAX_USAGE_KB = 5 * 1024; // 5M\nexport const LOCALSTORAGE_MAX_QUERY_RESULTS_KB = 1 * 1024; // 1M\nexport const LOCALSTORAGE_WARNING_THRESHOLD = 0.9;\nexport const LOCALSTORAGE_WARNING_MESSAGE_THROTTLE_MS = 8000; // danger type toast duration\n\n// autocomplete score weights\nexport const SQL_KEYWORD_AUTOCOMPLETE_SCORE = 100;\nexport const SQL_FUNCTIONS_AUTOCOMPLETE_SCORE = 90;\nexport const SCHEMA_AUTOCOMPLETE_SCORE = 60;\nexport const TABLE_AUTOCOMPLETE_SCORE = 55;\nexport const COLUMN_AUTOCOMPLETE_SCORE = 50;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { t } from '@superset-ui/core';\nimport type { BootstrapData } from 'src/types/bootstrapTypes';\nimport type { InitialState } from 'src/hooks/apiResources/sqlLab';\nimport {\n QueryEditor,\n UnsavedQueryEditor,\n SqlLabRootState,\n Table,\n LatestQueryEditorVersion,\n QueryEditorVersion,\n} from 'src/SqlLab/types';\n\nexport function dedupeTabHistory(tabHistory: string[]) {\n return tabHistory.reduce(\n (result, tabId) =>\n result.slice(-1)[0] === tabId ? result : result.concat(tabId),\n [],\n );\n}\n\nexport default function getInitialState({\n common,\n active_tab: activeTab,\n tab_state_ids: tabStateIds = [],\n databases,\n queries: queries_,\n ...otherBootstrapData\n}: BootstrapData & Partial) {\n /**\n * Before YYYY-MM-DD, the state for SQL Lab was stored exclusively in the\n * browser's localStorage. The feature flag `SQLLAB_BACKEND_PERSISTENCE`\n * moves the state to the backend instead, migrating it from local storage.\n *\n * To allow for a transparent migration, the initial state is a combination\n * of the backend state (if any) with the browser state (if any).\n */\n let queryEditors: Record = {};\n const defaultQueryEditor = {\n version: LatestQueryEditorVersion,\n loaded: true,\n name: t('Untitled query'),\n sql: '',\n latestQueryId: null,\n autorun: false,\n dbId: common.conf.SQLLAB_DEFAULT_DBID,\n queryLimit: common.conf.DEFAULT_SQLLAB_LIMIT,\n hideLeftBar: false,\n remoteId: null,\n cursorPosition: { row: 0, column: 0 },\n };\n let unsavedQueryEditor: UnsavedQueryEditor = {};\n\n /**\n * Load state from the backend. This will be empty if the feature flag\n * `SQLLAB_BACKEND_PERSISTENCE` is off.\n */\n tabStateIds.forEach(({ id, label }) => {\n let queryEditor: QueryEditor;\n if (activeTab && activeTab.id === id) {\n queryEditor = {\n version: activeTab.extra_json?.version ?? QueryEditorVersion.V1,\n id: id.toString(),\n loaded: true,\n name: activeTab.label,\n sql: activeTab.sql || '',\n selectedText: undefined,\n latestQueryId: activeTab.latest_query\n ? activeTab.latest_query.id\n : null,\n remoteId: activeTab.saved_query?.id || null,\n autorun: Boolean(activeTab.autorun),\n templateParams: activeTab.template_params || undefined,\n dbId: activeTab.database_id,\n catalog: activeTab.catalog,\n schema: activeTab.schema,\n queryLimit: activeTab.query_limit,\n hideLeftBar: activeTab.hide_left_bar,\n updatedAt: activeTab.extra_json?.updatedAt,\n };\n } else {\n // dummy state, actual state will be loaded on tab switch\n queryEditor = {\n ...defaultQueryEditor,\n id: id.toString(),\n loaded: false,\n name: label,\n dbId: undefined,\n };\n }\n queryEditors = {\n ...queryEditors,\n [queryEditor.id]: queryEditor,\n };\n });\n const tabHistory = activeTab ? [activeTab.id.toString()] : [];\n let lastUpdatedActiveTab = activeTab ? activeTab.id.toString() : '';\n let tables = {} as Record;\n let editorTabLastUpdatedAt = Date.now();\n if (activeTab) {\n editorTabLastUpdatedAt =\n activeTab.extra_json?.updatedAt || editorTabLastUpdatedAt;\n activeTab.table_schemas\n .filter(tableSchema => tableSchema.description !== null)\n .forEach(tableSchema => {\n const { dataPreviewQueryId, ...persistData } = tableSchema.description;\n const table = {\n dbId: tableSchema.database_id,\n queryEditorId: tableSchema.tab_state_id.toString(),\n catalog: tableSchema.catalog,\n schema: tableSchema.schema,\n name: tableSchema.table,\n expanded: tableSchema.expanded,\n id: tableSchema.id,\n dataPreviewQueryId,\n persistData,\n initialized: true,\n };\n tables = {\n ...tables,\n [table.id]: table,\n };\n });\n }\n\n const queries = {\n ...queries_,\n ...(activeTab?.latest_query && {\n [activeTab.latest_query.id]: activeTab.latest_query,\n }),\n };\n\n const destroyedQueryEditors = {};\n\n /**\n * If the `SQLLAB_BACKEND_PERSISTENCE` feature flag is off, or if the user\n * hasn't used SQL Lab after it has been turned on, the state will be stored\n * in the browser's local storage.\n */\n try {\n const localStorageData = localStorage.getItem('redux');\n const sqlLabCacheData = localStorageData\n ? (JSON.parse(localStorageData) as Pick)\n : undefined;\n if (localStorageData && sqlLabCacheData?.sqlLab) {\n const { sqlLab } = sqlLabCacheData;\n\n if (sqlLab.queryEditors.length === 0) {\n // migration was successful\n localStorage.removeItem('redux');\n } else {\n unsavedQueryEditor = sqlLab.unsavedQueryEditor || unsavedQueryEditor;\n // add query editors and tables to state with a special flag so they can\n // be migrated if the `SQLLAB_BACKEND_PERSISTENCE` feature flag is on\n sqlLab.queryEditors.forEach(qe => {\n const hasConflictFromBackend = Boolean(queryEditors[qe.id]);\n const unsavedUpdatedAt = queryEditors[qe.id]?.updatedAt;\n const hasUnsavedUpdateSinceLastSave =\n qe.updatedAt &&\n (!unsavedUpdatedAt || qe.updatedAt > unsavedUpdatedAt);\n const cachedQueryEditor: UnsavedQueryEditor =\n !hasConflictFromBackend || hasUnsavedUpdateSinceLastSave ? qe : {};\n queryEditors = {\n ...queryEditors,\n [qe.id]: {\n ...queryEditors[qe.id],\n ...cachedQueryEditor,\n name:\n cachedQueryEditor.title ||\n cachedQueryEditor.name ||\n queryEditors[qe.id]?.name,\n ...(cachedQueryEditor.id &&\n unsavedQueryEditor.id === qe.id &&\n unsavedQueryEditor),\n inLocalStorage: !hasConflictFromBackend,\n loaded: true,\n },\n };\n });\n const expandedTables = new Set();\n\n if (sqlLab.tables) {\n tables = sqlLab.tables.reduce((merged, table) => {\n const expanded = !expandedTables.has(table.queryEditorId);\n if (expanded) {\n expandedTables.add(table.queryEditorId);\n }\n return {\n ...merged,\n [table.id]: {\n ...tables[table.id],\n ...table,\n expanded,\n inLocalStorage: true,\n },\n };\n }, tables);\n }\n if (sqlLab.queries) {\n Object.values(sqlLab.queries).forEach(query => {\n queries[query.id] = { ...query, inLocalStorage: true };\n });\n }\n if (sqlLab.tabHistory) {\n tabHistory.push(...sqlLab.tabHistory);\n }\n lastUpdatedActiveTab = tabHistory.slice(tabHistory.length - 1)[0] || '';\n\n if (sqlLab.destroyedQueryEditors) {\n Object.entries(sqlLab.destroyedQueryEditors).forEach(([id, ts]) => {\n if (queryEditors[id]) {\n destroyedQueryEditors[id] = ts;\n delete queryEditors[id];\n }\n });\n }\n }\n }\n } catch (error) {\n // continue regardless of error\n }\n\n return {\n sqlLab: {\n activeSouthPaneTab: 'Results',\n alerts: [],\n databases,\n offline: false,\n queries: Object.fromEntries(\n Object.entries(queries).map(([queryId, query]) => [\n queryId,\n {\n ...query,\n ...(query.startDttm && {\n startDttm: Number(query.startDttm),\n }),\n ...(query.endDttm && {\n endDttm: Number(query.endDttm),\n }),\n },\n ]),\n ),\n queryEditors: Object.values(queryEditors),\n tabHistory: dedupeTabHistory(tabHistory),\n tables: Object.values(tables),\n queriesLastUpdate: Date.now(),\n editorTabLastUpdatedAt,\n queryCostEstimates: {},\n unsavedQueryEditor,\n lastUpdatedActiveTab,\n destroyedQueryEditors,\n },\n localStorageUsageInKilobytes: 0,\n common,\n ...otherBootstrapData,\n };\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { QueryResponse } from '@superset-ui/core';\nimport {\n CommonBootstrapData,\n UserWithPermissionsAndRoles,\n} from 'src/types/bootstrapTypes';\nimport { ToastType } from 'src/components/MessageToasts/types';\nimport { DropdownButtonProps } from 'src/components/DropdownButton';\nimport { ButtonProps } from 'src/components/Button';\nimport type { TableMetaData } from 'src/hooks/apiResources';\n\nexport type QueryButtonProps = DropdownButtonProps | ButtonProps;\n\n// Object as Dictionary (associative array) with Query id as the key and type Query as the value\nexport type QueryDictionary = {\n [id: string]: QueryResponse;\n};\n\nexport enum QueryEditorVersion {\n V1 = 1,\n}\n\nexport const LatestQueryEditorVersion = QueryEditorVersion.V1;\n\nexport interface CursorPosition {\n row: number;\n column: number;\n}\n\nexport interface QueryEditor {\n version: QueryEditorVersion;\n id: string;\n dbId?: number;\n name: string;\n title?: string; // keep it optional for backward compatibility\n catalog?: string | null;\n schema?: string;\n autorun: boolean;\n sql: string;\n remoteId: number | null;\n hideLeftBar?: boolean;\n latestQueryId?: string | null;\n templateParams?: string;\n selectedText?: string;\n queryLimit?: number;\n description?: string;\n loaded?: boolean;\n inLocalStorage?: boolean;\n northPercent?: number;\n southPercent?: number;\n updatedAt?: number;\n cursorPosition?: CursorPosition;\n}\n\nexport type toastState = {\n id: string;\n toastType: ToastType;\n text: string;\n duration: number;\n noDuplicate: boolean;\n};\n\nexport type UnsavedQueryEditor = Partial;\n\nexport interface Table {\n id: string;\n dbId: number;\n catalog: string | null;\n schema: string;\n name: string;\n queryEditorId: QueryEditor['id'];\n dataPreviewQueryId: string | null;\n expanded: boolean;\n initialized?: boolean;\n inLocalStorage?: boolean;\n persistData?: TableMetaData;\n}\n\nexport type SqlLabRootState = {\n sqlLab: {\n activeSouthPaneTab: string | number; // default is string; action.newQuery.id is number\n alerts: any[];\n databases: Record;\n dbConnect: boolean;\n offline: boolean;\n queries: Record;\n queryEditors: QueryEditor[];\n tabHistory: string[]; // default is activeTab ? [activeTab.id.toString()] : []\n tables: Table[];\n queriesLastUpdate: number;\n errorMessage: string | null;\n unsavedQueryEditor: UnsavedQueryEditor;\n queryCostEstimates?: Record;\n editorTabLastUpdatedAt: number;\n lastUpdatedActiveTab: string;\n destroyedQueryEditors: Record;\n };\n localStorageUsageInKilobytes: number;\n messageToasts: toastState[];\n user: UserWithPermissionsAndRoles;\n common: CommonBootstrapData;\n};\n\nexport enum DatasetRadioState {\n SaveNew = 1,\n OverwriteDataset = 2,\n}\n\nexport const EXPLORE_CHART_DEFAULT = {\n metrics: [],\n groupby: [],\n time_range: 'No filter',\n row_limit: 1000,\n};\n\nexport interface DatasetOwner {\n first_name: string;\n id: number;\n last_name: string;\n username: string;\n}\n\nexport interface DatasetOptionAutocomplete {\n value: string;\n datasetId: number;\n owners: [DatasetOwner];\n}\n\nexport interface SchemaOption {\n value: string;\n label: string;\n title: string;\n}\n\nexport interface QueryCostEstimate {\n completed: string;\n cost: Record[];\n error: string;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport type { QueryResponse } from '@superset-ui/core';\nimport type { QueryEditor, SqlLabRootState, Table } from 'src/SqlLab/types';\nimport type { ThunkDispatch } from 'redux-thunk';\nimport { pick } from 'lodash';\nimport { tableApiUtil } from 'src/hooks/apiResources/tables';\nimport {\n BYTES_PER_CHAR,\n KB_STORAGE,\n LOCALSTORAGE_MAX_QUERY_AGE_MS,\n LOCALSTORAGE_MAX_QUERY_RESULTS_KB,\n} from '../constants';\n\nconst PERSISTENT_QUERY_EDITOR_KEYS = new Set([\n 'version',\n 'remoteId',\n 'autorun',\n 'dbId',\n 'height',\n 'id',\n 'latestQueryId',\n 'northPercent',\n 'queryLimit',\n 'schema',\n 'selectedText',\n 'southPercent',\n 'sql',\n 'templateParams',\n 'name',\n 'hideLeftBar',\n]);\n\nfunction shouldEmptyQueryResults(query: QueryResponse) {\n const { startDttm, results } = query;\n return (\n Date.now() - startDttm > LOCALSTORAGE_MAX_QUERY_AGE_MS ||\n ((JSON.stringify(results)?.length || 0) * BYTES_PER_CHAR) / KB_STORAGE >\n LOCALSTORAGE_MAX_QUERY_RESULTS_KB\n );\n}\n\nexport function emptyTablePersistData(tables: Table[]) {\n return tables\n .map(table =>\n pick(table, [\n 'id',\n 'name',\n 'dbId',\n 'schema',\n 'dataPreviewQueryId',\n 'queryEditorId',\n ]),\n )\n .filter(({ queryEditorId }) => Boolean(queryEditorId));\n}\n\nexport function emptyQueryResults(\n queries: SqlLabRootState['sqlLab']['queries'],\n) {\n return Object.keys(queries).reduce((accu, key) => {\n const { results } = queries[key];\n const query = {\n ...queries[key],\n results: shouldEmptyQueryResults(queries[key]) ? {} : results,\n };\n\n const updatedQueries = {\n ...accu,\n [key]: query,\n };\n return updatedQueries;\n }, {});\n}\n\nexport function clearQueryEditors(queryEditors: QueryEditor[]) {\n return queryEditors.map(editor =>\n // only return selected keys\n Object.keys(editor)\n .filter(key => PERSISTENT_QUERY_EDITOR_KEYS.has(key))\n .reduce(\n (accumulator, key) => ({\n ...accumulator,\n [key]: editor[key],\n }),\n {},\n ),\n );\n}\n\nexport function rehydratePersistedState(\n dispatch: ThunkDispatch,\n state: SqlLabRootState,\n) {\n // Rehydrate server side persisted table metadata\n state.sqlLab.tables.forEach(\n ({ name: table, catalog, schema, dbId, persistData }) => {\n if (dbId && schema && table && persistData?.columns) {\n dispatch(\n tableApiUtil.upsertQueryData(\n 'tableMetadata',\n { dbId, catalog, schema, table },\n persistData,\n ),\n );\n dispatch(\n tableApiUtil.upsertQueryData(\n 'tableExtendedMetadata',\n { dbId, catalog, schema, table },\n {},\n ),\n );\n }\n },\n );\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport {\n Children,\n ReactElement,\n ReactNode,\n Fragment,\n MouseEventHandler,\n} from 'react';\n\nimport { mix } from 'polished';\nimport cx from 'classnames';\nimport { AntdButton } from 'src/components';\nimport { useTheme } from '@superset-ui/core';\nimport { Tooltip } from 'src/components/Tooltip';\nimport { ButtonProps as AntdButtonProps } from 'antd/lib/button';\nimport { TooltipProps } from 'antd/lib/tooltip';\n\nexport type OnClickHandler = MouseEventHandler;\n\nexport type ButtonStyle =\n | 'primary'\n | 'secondary'\n | 'tertiary'\n | 'success'\n | 'warning'\n | 'danger'\n | 'default'\n | 'link'\n | 'dashed';\n\nexport type ButtonSize = 'default' | 'small' | 'xsmall';\n\nexport type ButtonProps = Omit &\n Pick & {\n tooltip?: ReactNode;\n className?: string;\n buttonSize?: ButtonSize;\n buttonStyle?: ButtonStyle;\n cta?: boolean;\n showMarginRight?: boolean;\n };\n\nexport default function Button(props: ButtonProps) {\n const {\n tooltip,\n placement,\n disabled = false,\n buttonSize,\n buttonStyle,\n className,\n cta,\n children,\n href,\n showMarginRight = true,\n ...restProps\n } = props;\n\n const theme = useTheme();\n const { colors, transitionTiming, borderRadius, typography } = theme;\n const { primary, grayscale, success, warning, error } = colors;\n\n let height = 32;\n let padding = 18;\n if (buttonSize === 'xsmall') {\n height = 22;\n padding = 5;\n } else if (buttonSize === 'small') {\n height = 30;\n padding = 10;\n }\n\n let backgroundColor = primary.light4;\n let backgroundColorHover = mix(0.1, primary.base, primary.light4);\n let backgroundColorActive = mix(0.25, primary.base, primary.light4);\n let backgroundColorDisabled = grayscale.light2;\n let color = primary.dark1;\n let colorHover = color;\n let borderWidth = 0;\n let borderStyle = 'none';\n let borderColor = 'transparent';\n let borderColorHover = 'transparent';\n let borderColorDisabled = 'transparent';\n\n if (buttonStyle === 'primary') {\n backgroundColor = primary.base;\n backgroundColorHover = primary.dark1;\n backgroundColorActive = mix(0.2, grayscale.dark2, primary.dark1);\n color = grayscale.light5;\n colorHover = color;\n } else if (buttonStyle === 'tertiary' || buttonStyle === 'dashed') {\n backgroundColor = grayscale.light5;\n backgroundColorHover = grayscale.light5;\n backgroundColorActive = grayscale.light5;\n backgroundColorDisabled = grayscale.light5;\n borderWidth = 1;\n borderStyle = buttonStyle === 'dashed' ? 'dashed' : 'solid';\n borderColor = primary.dark1;\n borderColorHover = primary.light1;\n borderColorDisabled = grayscale.light2;\n } else if (buttonStyle === 'danger') {\n backgroundColor = error.base;\n backgroundColorHover = mix(0.1, grayscale.light5, error.base);\n backgroundColorActive = mix(0.2, grayscale.dark2, error.base);\n color = grayscale.light5;\n colorHover = color;\n } else if (buttonStyle === 'warning') {\n backgroundColor = warning.base;\n backgroundColorHover = mix(0.1, grayscale.dark2, warning.base);\n backgroundColorActive = mix(0.2, grayscale.dark2, warning.base);\n color = grayscale.light5;\n colorHover = color;\n } else if (buttonStyle === 'success') {\n backgroundColor = success.base;\n backgroundColorHover = mix(0.1, grayscale.light5, success.base);\n backgroundColorActive = mix(0.2, grayscale.dark2, success.base);\n color = grayscale.light5;\n colorHover = color;\n } else if (buttonStyle === 'link') {\n backgroundColor = 'transparent';\n backgroundColorHover = 'transparent';\n backgroundColorActive = 'transparent';\n colorHover = primary.base;\n }\n\n const element = children as ReactElement;\n\n let renderedChildren = [];\n if (element && element.type === Fragment) {\n renderedChildren = Children.toArray(element.props.children);\n } else {\n renderedChildren = Children.toArray(children);\n }\n const firstChildMargin =\n showMarginRight && renderedChildren.length > 1 ? theme.gridUnit * 2 : 0;\n\n const button = (\n :first-of-type': {\n marginRight: firstChildMargin,\n },\n }}\n {...restProps}\n >\n {children}\n \n );\n\n if (tooltip) {\n return (\n \n {/* wrap the button in a span so that the tooltip shows up\n when the button is disabled. */}\n {disabled ? (\n .superset-button': {\n marginLeft: theme.gridUnit * 2,\n },\n }}\n >\n {button}\n \n ) : (\n button\n )}\n \n );\n }\n\n return button;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n/* eslint camelcase: 0 */\nimport { t } from '@superset-ui/core';\nimport { omit } from 'lodash';\nimport { HYDRATE_DASHBOARD } from 'src/dashboard/actions/hydrate';\nimport { DatasourcesAction } from 'src/dashboard/actions/datasources';\nimport { ChartState } from 'src/explore/types';\nimport { getFormDataFromControls } from 'src/explore/controlUtils';\nimport { HYDRATE_EXPLORE } from 'src/explore/actions/hydrateExplore';\nimport { now } from 'src/utils/dates';\nimport * as actions from './chartAction';\n\nexport const chart: ChartState = {\n id: 0,\n chartAlert: null,\n chartStatus: 'loading',\n chartStackTrace: null,\n chartUpdateEndTime: null,\n chartUpdateStartTime: 0,\n latestQueryFormData: {},\n sliceFormData: null,\n queryController: null,\n queriesResponse: null,\n triggerQuery: true,\n lastRendered: 0,\n};\n\ntype ChartActionHandler = (state: ChartState) => ChartState;\n\ntype AnyChartAction = Record;\n\nexport default function chartReducer(\n charts: Record = {},\n action: AnyChartAction,\n) {\n const actionHandlers: Record = {\n [actions.ADD_CHART]() {\n return {\n ...chart,\n ...action.chart,\n };\n },\n [actions.CHART_UPDATE_SUCCEEDED](state) {\n return {\n ...state,\n chartStatus: 'success',\n chartAlert: null,\n queriesResponse: action.queriesResponse,\n chartUpdateEndTime: now(),\n };\n },\n [actions.CHART_UPDATE_STARTED](state) {\n return {\n ...state,\n chartStatus: 'loading',\n chartStackTrace: null,\n chartAlert: null,\n chartUpdateEndTime: null,\n chartUpdateStartTime: now(),\n queryController: action.queryController,\n };\n },\n [actions.CHART_UPDATE_STOPPED](state) {\n return {\n ...state,\n chartStatus: 'stopped',\n chartAlert: t('Updating chart was stopped'),\n chartUpdateEndTime: now(),\n };\n },\n [actions.CHART_RENDERING_SUCCEEDED](state) {\n return { ...state, chartStatus: 'rendered', chartUpdateEndTime: now() };\n },\n [actions.CHART_RENDERING_FAILED](state) {\n return {\n ...state,\n chartStatus: 'failed',\n chartStackTrace: action.stackTrace,\n chartAlert: t(\n 'An error occurred while rendering the visualization: %s',\n action.error,\n ),\n };\n },\n [actions.CHART_UPDATE_FAILED](state) {\n return {\n ...state,\n chartStatus: 'failed',\n chartAlert: action.queriesResponse\n ? action.queriesResponse?.[0]?.error\n : t('Network error.'),\n chartUpdateEndTime: now(),\n queriesResponse: action.queriesResponse,\n chartStackTrace: action.queriesResponse\n ? action.queriesResponse?.[0]?.stacktrace\n : null,\n };\n },\n [actions.DYNAMIC_PLUGIN_CONTROLS_READY](state) {\n const sliceFormData = getFormDataFromControls(action.controlsState);\n return { ...state, sliceFormData };\n },\n [actions.TRIGGER_QUERY](state) {\n return {\n ...state,\n triggerQuery: action.value,\n chartStatus: 'loading',\n };\n },\n [actions.RENDER_TRIGGERED](state) {\n return { ...state, lastRendered: action.value };\n },\n [actions.UPDATE_QUERY_FORM_DATA](state) {\n return { ...state, latestQueryFormData: action.value };\n },\n [actions.ANNOTATION_QUERY_STARTED](state) {\n if (state.annotationQuery?.[action.annotation.name]) {\n state.annotationQuery[action.annotation.name].abort();\n }\n const annotationQuery = {\n ...state.annotationQuery,\n [action.annotation.name]: action.queryController,\n };\n return {\n ...state,\n annotationQuery,\n };\n },\n [actions.ANNOTATION_QUERY_SUCCESS](state) {\n const annotationData = {\n ...state.annotationData,\n [action.annotation.name]: action.queryResponse.data,\n };\n const annotationError = { ...state.annotationError };\n delete annotationError[action.annotation.name];\n const annotationQuery = { ...state.annotationQuery };\n delete annotationQuery[action.annotation.name];\n return {\n ...state,\n annotationData,\n annotationError,\n annotationQuery,\n };\n },\n [actions.ANNOTATION_QUERY_FAILED](state) {\n const annotationData = { ...state.annotationData };\n delete annotationData[action.annotation.name];\n const annotationError = {\n ...state.annotationError,\n [action.annotation.name]: action.queryResponse\n ? action.queryResponse.error\n : t('Network error.'),\n };\n const annotationQuery = { ...state.annotationQuery };\n delete annotationQuery[action.annotation.name];\n return {\n ...state,\n annotationData,\n annotationError,\n annotationQuery,\n };\n },\n };\n\n /* eslint-disable no-param-reassign */\n if (action.type === actions.REMOVE_CHART) {\n return omit(charts, [action.key]);\n }\n if (action.type === actions.UPDATE_CHART_ID) {\n const { newId, key } = action;\n charts[newId] = {\n ...charts[key],\n id: newId,\n };\n delete charts[key];\n return charts;\n }\n if (action.type === HYDRATE_DASHBOARD || action.type === HYDRATE_EXPLORE) {\n return { ...action.data.charts };\n }\n if (action.type === DatasourcesAction.SetDatasources) {\n return Object.fromEntries(\n Object.entries(charts).map(([chartId, chart]) => [\n chartId,\n // some charts may not have properly handled missing datasource,\n // causing a JS error, so we reset error message and try to re-render\n // the chart once the datasource is fully loaded\n chart.chartStatus === 'failed' && chart.chartStackTrace\n ? {\n ...chart,\n chartStatus: '',\n chartStackTrace: null,\n chartAlert: null,\n }\n : chart,\n ]),\n );\n }\n\n if (action.type in actionHandlers) {\n return {\n ...charts,\n [action.key]: actionHandlers[action.type](charts[action.key]),\n };\n }\n\n return charts;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { Component, cloneElement, ReactNode, ReactElement } from 'react';\nimport { t } from '@superset-ui/core';\nimport { Tooltip } from 'src/components/Tooltip';\nimport withToasts from 'src/components/MessageToasts/withToasts';\nimport copyTextToClipboard from 'src/utils/copy';\n\nexport interface CopyToClipboardProps {\n copyNode?: ReactNode;\n getText?: (callback: (data: string) => void) => void;\n onCopyEnd?: () => void;\n shouldShowText?: boolean;\n text?: string;\n wrapped?: boolean;\n tooltipText?: string;\n addDangerToast: (msg: string) => void;\n addSuccessToast: (msg: string) => void;\n hideTooltip?: boolean;\n}\n\nconst defaultProps: Partial = {\n copyNode: {t('Copy')},\n onCopyEnd: () => {},\n shouldShowText: true,\n wrapped: true,\n tooltipText: t('Copy to clipboard'),\n hideTooltip: false,\n};\n\nclass CopyToClipboard extends Component {\n static defaultProps = defaultProps;\n\n constructor(props: CopyToClipboardProps) {\n super(props);\n this.copyToClipboard = this.copyToClipboard.bind(this);\n this.onClick = this.onClick.bind(this);\n }\n\n onClick() {\n if (this.props.getText) {\n this.props.getText((d: string) => {\n this.copyToClipboard(Promise.resolve(d));\n });\n } else {\n this.copyToClipboard(Promise.resolve(this.props.text || ''));\n }\n }\n\n getDecoratedCopyNode() {\n return cloneElement(this.props.copyNode as ReactElement, {\n style: { cursor: 'pointer' },\n onClick: this.onClick,\n });\n }\n\n copyToClipboard(textToCopy: Promise) {\n copyTextToClipboard(() => textToCopy)\n .then(() => {\n this.props.addSuccessToast(t('Copied to clipboard!'));\n })\n .catch(() => {\n this.props.addDangerToast(\n t(\n 'Sorry, your browser does not support copying. Use Ctrl / Cmd + C!',\n ),\n );\n })\n .finally(() => {\n if (this.props.onCopyEnd) this.props.onCopyEnd();\n });\n }\n\n renderTooltip(cursor: string) {\n return (\n <>\n {!this.props.hideTooltip ? (\n \n {this.getDecoratedCopyNode()}\n \n ) : (\n this.getDecoratedCopyNode()\n )}\n \n );\n }\n\n renderNotWrapped() {\n return this.renderTooltip('pointer');\n }\n\n renderLink() {\n return (\n \n {this.props.shouldShowText && this.props.text && (\n \n {this.props.text}\n \n )}\n {this.renderTooltip('pointer')}\n \n );\n }\n\n render() {\n const { wrapped } = this.props;\n if (!wrapped) {\n return this.renderNotWrapped();\n }\n return this.renderLink();\n }\n}\n\nexport default withToasts(CopyToClipboard);\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { useState, ReactNode } from 'react';\nimport {\n ErrorLevel,\n ErrorSource,\n styled,\n useTheme,\n t,\n} from '@superset-ui/core';\nimport { noOp } from 'src/utils/common';\nimport Modal from 'src/components/Modal';\nimport Button from 'src/components/Button';\nimport { isCurrentUserBot } from 'src/utils/isBot';\n\nimport Icons from 'src/components/Icons';\nimport CopyToClipboard from '../CopyToClipboard';\n\nconst ErrorAlertDiv = styled.div<{ level: ErrorLevel }>`\n align-items: center;\n background-color: ${({ level, theme }) => theme.colors[level].light2};\n border-radius: ${({ theme }) => theme.borderRadius}px;\n border: 1px solid ${({ level, theme }) => theme.colors[level].base};\n color: ${({ level, theme }) => theme.colors[level].dark2};\n padding: ${({ theme }) => 2 * theme.gridUnit}px;\n width: 100%;\n\n .top-row {\n display: flex;\n justify-content: space-between;\n }\n\n .error-body {\n padding-top: ${({ theme }) => theme.gridUnit}px;\n padding-left: ${({ theme }) => 8 * theme.gridUnit}px;\n }\n\n .icon {\n margin-right: ${({ theme }) => 2 * theme.gridUnit}px;\n }\n\n .link {\n color: ${({ level, theme }) => theme.colors[level].dark2};\n text-decoration: underline;\n &:focus-visible {\n border: 1px solid ${({ theme }) => theme.colors.primary.base};\n padding: ${({ theme }) => theme.gridUnit / 2}px;\n margin: -${({ theme }) => theme.gridUnit / 2 + 1}px;\n border-radius: ${({ theme }) => theme.borderRadius}px;\n }\n`;\n\nconst ErrorModal = styled(Modal)<{ level: ErrorLevel }>`\n color: ${({ level, theme }) => theme.colors[level].dark2};\n overflow-wrap: break-word;\n\n .ant-modal-header {\n background-color: ${({ level, theme }) => theme.colors[level].light2};\n padding: ${({ theme }) => 4 * theme.gridUnit}px;\n }\n\n .icon {\n margin-right: ${({ theme }) => 2 * theme.gridUnit}px;\n }\n\n .header {\n display: flex;\n align-items: center;\n font-size: ${({ theme }) => theme.typography.sizes.l}px;\n }\n`;\n\nconst LeftSideContent = styled.div`\n align-items: center;\n display: flex;\n`;\n\ninterface ErrorAlertProps {\n body: ReactNode;\n copyText?: string;\n level: ErrorLevel;\n source?: ErrorSource;\n subtitle: ReactNode;\n title: ReactNode;\n description?: string;\n}\n\nexport default function ErrorAlert({\n body,\n copyText,\n level = 'error',\n source = 'dashboard',\n subtitle,\n title,\n description,\n}: ErrorAlertProps) {\n const theme = useTheme();\n\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [isBodyExpanded, setIsBodyExpanded] = useState(isCurrentUserBot());\n\n const isExpandable =\n isCurrentUserBot() || ['explore', 'sqllab'].includes(source);\n const iconColor = theme.colors[level].base;\n\n return (\n \n

\n \n {level === 'error' ? (\n \n ) : (\n \n )}\n {title}\n \n {!isExpandable && !description && (\n setIsModalOpen(true)}\n onKeyDown={event => {\n if (event.key === 'Enter') {\n setIsModalOpen(true);\n }\n }}\n >\n {t('See more')}\n \n )}\n
\n {description && (\n
\n

{description}

\n {!isExpandable && (\n setIsModalOpen(true)}\n onKeyDown={event => {\n if (event.key === 'Enter') {\n setIsModalOpen(true);\n }\n }}\n >\n {t('See more')}\n \n )}\n
\n )}\n {isExpandable ? (\n
\n

{subtitle}

\n {body && (\n <>\n {!isBodyExpanded && (\n setIsBodyExpanded(true)}\n onKeyDown={event => {\n if (event.key === 'Enter') {\n setIsBodyExpanded(true);\n }\n }}\n >\n {t('See more')}\n \n )}\n {isBodyExpanded && (\n <>\n
\n {body}\n setIsBodyExpanded(false)}\n onKeyDown={event => {\n if (event.key === 'Enter') {\n setIsBodyExpanded(false);\n }\n }}\n >\n {t('See less')}\n \n \n )}\n \n )}\n
\n ) : (\n setIsModalOpen(false)}\n destroyOnClose\n title={\n
\n {level === 'error' ? (\n \n ) : (\n \n )}\n
{title}
\n
\n }\n footer={\n <>\n {copyText && (\n {t('Copy message')}}\n />\n )}\n setIsModalOpen(false)}\n tabIndex={0}\n onKeyDown={event => {\n if (event.key === 'Enter') {\n setIsModalOpen(false);\n }\n }}\n >\n {t('Close')}\n \n \n }\n >\n <>\n

{subtitle}

\n {/* This break was in the original design of the modal but\n the spacing looks really off if there is only\n subtitle or a body */}\n {subtitle && body &&
}\n {body}\n \n \n )}\n \n );\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { ReactNode } from 'react';\nimport { ErrorSource, t, SupersetError } from '@superset-ui/core';\nimport getErrorMessageComponentRegistry from './getErrorMessageComponentRegistry';\nimport ErrorAlert from './ErrorAlert';\n\nconst DEFAULT_TITLE = t('Unexpected error');\n\ntype Props = {\n title?: string;\n error?: SupersetError;\n link?: string;\n subtitle?: ReactNode;\n copyText?: string;\n stackTrace?: string;\n source?: ErrorSource;\n description?: string;\n errorMitigationFunction?: () => void;\n fallback?: ReactNode;\n};\n\nexport default function ErrorMessageWithStackTrace({\n title = DEFAULT_TITLE,\n error,\n subtitle,\n copyText,\n link,\n stackTrace,\n source,\n description,\n fallback,\n}: Props) {\n // Check if a custom error message component was registered for this message\n if (error) {\n const ErrorMessageComponent = getErrorMessageComponentRegistry().get(\n error.error_type,\n );\n if (ErrorMessageComponent) {\n return (\n \n );\n }\n }\n\n if (fallback) {\n return <>{fallback};\n }\n\n return (\n \n {link && (\n \n (Request Access)\n \n )}\n
\n {stackTrace &&
{stackTrace}
}\n \n ) : undefined\n }\n />\n );\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { Registry, makeSingleton, OverwritePolicy } from '@superset-ui/core';\nimport { ErrorMessageComponent } from './types';\n\nclass ErrorMessageComponentRegistry extends Registry<\n ErrorMessageComponent,\n ErrorMessageComponent\n> {\n constructor() {\n super({\n name: 'ErrorMessageComponent',\n overwritePolicy: OverwritePolicy.Allow,\n });\n }\n}\n\nconst getErrorMessageComponentRegistry = makeSingleton(\n ErrorMessageComponentRegistry,\n);\n\nexport default getErrorMessageComponentRegistry;\n","function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nimport { forwardRef } from \"react\";\nconst SvgTransparent = ({\n title,\n titleId,\n ...props\n}, ref) => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n fill: \"none\",\n ref: ref,\n \"aria-labelledby\": titleId\n}, props));\nconst ForwardRef = /*#__PURE__*/forwardRef(SvgTransparent);\nexport default ForwardRef;","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { FC, SVGProps, useEffect, useRef, useState } from 'react';\nimport AntdIcon from '@ant-design/icons';\nimport { styled } from '@superset-ui/core';\nimport TransparentIcon from 'src/assets/images/icons/transparent.svg';\nimport IconType from './IconType';\n\nconst AntdIconComponent = ({\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n iconColor,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n iconSize,\n viewBox,\n ...rest\n}: Omit) => (\n \n);\n\nexport const StyledIcon = styled(AntdIconComponent)`\n ${({ iconColor }) => iconColor && `color: ${iconColor};`};\n font-size: ${({ iconSize, theme }) =>\n iconSize\n ? `${theme.typography.sizes[iconSize] || theme.typography.sizes.m}px`\n : '24px'};\n`;\n\nexport interface IconProps extends IconType {\n fileName: string;\n}\n\nexport const Icon = (props: IconProps) => {\n const { fileName, ...iconProps } = props;\n const [, setLoaded] = useState(false);\n const ImportedSVG = useRef>>();\n const name = fileName.replace('_', '-');\n\n useEffect(() => {\n let cancelled = false;\n async function importIcon(): Promise {\n ImportedSVG.current = (\n await import(`!!@svgr/webpack!src/assets/images/icons/${fileName}.svg`)\n ).default;\n if (!cancelled) {\n setLoaded(true);\n }\n }\n importIcon();\n return () => {\n cancelled = true;\n };\n }, [fileName, ImportedSVG]);\n\n const whatRole = props?.onClick ? 'button' : 'img';\n\n return (\n \n );\n};\n\nexport default Icon;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport * as AntdIcons from '@ant-design/icons/lib/icons';\nimport { StyledIcon } from './Icon';\nimport IconType from './IconType';\n\nconst AntdEnhancedIcons = Object.keys(AntdIcons)\n .filter(k => !k.includes('TwoTone'))\n .map(k => ({\n [k]: (props: IconType) => {\n const whatRole = props?.onClick ? 'button' : 'img';\n return ;\n },\n }))\n .reduce((l, r) => ({ ...l, ...r }));\n\nexport default AntdEnhancedIcons;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { FC } from 'react';\nimport { startCase } from 'lodash';\nimport AntdEnhancedIcons from './AntdEnhanced';\nimport Icon from './Icon';\nimport IconType from './IconType';\n\nconst IconFileNames = [\n 'alert',\n 'alert_solid',\n 'alert_solid_small',\n 'area-chart-tile',\n 'bar-chart-tile',\n 'big-number-chart-tile',\n 'binoculars',\n 'bolt',\n 'bolt_small',\n 'bolt_small_run',\n 'calendar',\n 'cancel',\n 'cancel_solid',\n 'cancel-x',\n 'card_view',\n 'cards',\n 'cards_locked',\n 'caret_down',\n 'caret_left',\n 'caret_right',\n 'caret_up',\n 'certified',\n 'check',\n 'checkbox-half',\n 'checkbox-off',\n 'checkbox-on',\n 'circle_check',\n 'circle_check_solid',\n 'circle',\n 'clock',\n 'close',\n 'code',\n 'cog',\n 'collapse',\n 'color_palette',\n 'current-rendered-tile',\n 'components',\n 'copy',\n 'cursor_target',\n 'database',\n 'dataset_physical',\n 'dataset_virtual_greyscale',\n 'dataset_virtual',\n 'download',\n 'drag',\n 'edit_alt',\n 'edit',\n 'email',\n 'error',\n 'error_solid',\n 'error_solid_small',\n 'exclamation',\n 'expand',\n 'eye',\n 'eye_slash',\n 'favorite-selected',\n 'favorite_small_selected',\n 'favorite-unselected',\n 'field_abc',\n 'field_boolean',\n 'field_date',\n 'field_derived',\n 'field_num',\n 'field_struct',\n 'file',\n 'filter',\n 'filter_small',\n 'folder',\n 'full',\n 'function_x',\n 'gear',\n 'grid',\n 'image',\n 'import',\n 'info',\n 'info-solid',\n 'info_solid_small',\n 'join',\n 'keyboard',\n 'layers',\n 'lightbulb',\n 'line-chart-tile',\n 'link',\n 'list',\n 'list_view',\n 'location',\n 'lock_locked',\n 'lock_unlocked',\n 'map',\n 'message',\n 'minus',\n 'minus_solid',\n 'more_horiz',\n 'more_vert',\n 'move',\n 'nav_charts',\n 'nav_dashboard',\n 'nav_data',\n 'nav_explore',\n 'nav_home',\n 'nav_lab',\n 'note',\n 'offline',\n 'paperclip',\n 'pie-chart-tile',\n 'placeholder',\n 'plus',\n 'plus_large',\n 'plus_small',\n 'plus_solid',\n 'queued',\n 'refresh',\n 'running',\n 'save',\n 'sql',\n 'search',\n 'server',\n 'share',\n 'slack',\n 'sort_asc',\n 'sort_desc',\n 'sort',\n 'table',\n 'table-chart-tile',\n 'tag',\n 'trash',\n 'triangle_change',\n 'triangle_down',\n 'triangle_up',\n 'up-level',\n 'user',\n 'warning',\n 'warning_solid',\n 'x-large',\n 'x-small',\n 'tags',\n 'ballot',\n 'category',\n 'undo',\n 'redo',\n];\n\nconst iconOverrides: Record> = {};\nIconFileNames.forEach(fileName => {\n const keyName = startCase(fileName).replace(/ /g, '');\n iconOverrides[keyName] = (props: IconType) => (\n \n );\n});\n\nexport type { IconType };\n\nexport default {\n ...AntdEnhancedIcons,\n ...iconOverrides,\n};\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { styled } from '@superset-ui/core';\nimport cls from 'classnames';\nimport Loader from 'src/assets/images/loading.gif';\n\nexport type PositionOption =\n | 'floating'\n | 'inline'\n | 'inline-centered'\n | 'normal';\nexport interface Props {\n position?: PositionOption;\n className?: string;\n image?: string;\n}\n\nconst LoaderImg = styled.img`\n z-index: 99;\n width: 50px;\n height: unset;\n position: relative;\n margin: 10px;\n &.inline {\n margin: 0px;\n width: 30px;\n }\n &.inline-centered {\n margin: 0 auto;\n width: 30px;\n display: block;\n }\n &.floating {\n padding: 0;\n margin: 0;\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n }\n`;\nexport default function Loading({\n position = 'floating',\n image,\n className,\n}: Props) {\n return (\n \n );\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { nanoid } from 'nanoid';\nimport { ToastType, ToastMeta } from './types';\n\ntype ToastOptions = Partial>;\n\nexport function getToastUuid(type: ToastType) {\n return `${type}-${nanoid()}`;\n}\n\nexport const ADD_TOAST = 'ADD_TOAST';\nexport function addToast({\n toastType,\n text,\n duration = 8000,\n noDuplicate = false,\n}: Omit) {\n return {\n type: ADD_TOAST,\n payload: {\n id: getToastUuid(toastType),\n toastType,\n text,\n duration,\n noDuplicate,\n },\n };\n}\n\nexport const REMOVE_TOAST = 'REMOVE_TOAST';\nexport function removeToast(id: string) {\n return {\n type: REMOVE_TOAST,\n payload: {\n id,\n },\n };\n}\n\n// Different types of toasts\nexport const ADD_INFO_TOAST = 'ADD_INFO_TOAST';\nexport function addInfoToast(text: string, options?: ToastOptions) {\n return addToast({\n text,\n toastType: ToastType.Info,\n duration: 4000,\n ...options,\n });\n}\n\nexport const ADD_SUCCESS_TOAST = 'ADD_SUCCESS_TOAST';\nexport function addSuccessToast(text: string, options?: ToastOptions) {\n return addToast({\n text,\n toastType: ToastType.Success,\n duration: 4000,\n ...options,\n });\n}\n\nexport const ADD_WARNING_TOAST = 'ADD_WARNING_TOAST';\nexport function addWarningToast(text: string, options?: ToastOptions) {\n return addToast({\n text,\n toastType: ToastType.Warning,\n duration: 6000,\n ...options,\n });\n}\n\nexport const ADD_DANGER_TOAST = 'ADD_DANGER_TOAST';\nexport function addDangerToast(text: string, options?: ToastOptions) {\n return addToast({\n text,\n toastType: ToastType.Danger,\n duration: 8000,\n ...options,\n });\n}\n\nexport const toastActions = {\n addInfoToast,\n addSuccessToast,\n addWarningToast,\n addDangerToast,\n};\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nexport enum ToastType {\n Info = 'INFO_TOAST',\n Success = 'SUCCESS_TOAST',\n Warning = 'WARNING_TOAST',\n Danger = 'DANGER_TOAST',\n}\n\nexport interface ToastMeta {\n id: string;\n toastType: ToastType;\n text: string;\n duration: number;\n /** Whether to skip displaying this message if there are another toast\n * with the same message. */\n noDuplicate?: boolean;\n /** For security reasons, HTML rendering is disabled by default. Use this property to enable it. */\n allowHtml?: boolean;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { ComponentType, useMemo } from 'react';\nimport { bindActionCreators } from 'redux';\nimport { connect, useDispatch } from 'react-redux';\n\nimport {\n addDangerToast,\n addInfoToast,\n addSuccessToast,\n addWarningToast,\n} from './actions';\n\nexport interface ToastProps {\n addDangerToast: typeof addDangerToast;\n addInfoToast: typeof addInfoToast;\n addSuccessToast: typeof addSuccessToast;\n addWarningToast: typeof addWarningToast;\n}\n\n/** just action creators, these do not dispatch */\nexport const toasters = {\n addInfoToast,\n addSuccessToast,\n addWarningToast,\n addDangerToast,\n};\n\n// To work properly the redux state must have a `messageToasts` subtree\nexport default function withToasts(BaseComponent: ComponentType) {\n return connect(null, dispatch => bindActionCreators(toasters, dispatch))(\n BaseComponent,\n ) as any;\n // Redux has some confusing typings that cause problems for consumers of this function.\n // If someone can fix the types, great, but for now it's just any.\n}\n\nexport function useToasts() {\n const dispatch = useDispatch();\n return useMemo(() => bindActionCreators(toasters, dispatch), [dispatch]);\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport {\n isValidElement,\n cloneElement,\n CSSProperties,\n ReactNode,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { isNil } from 'lodash';\nimport { ModalFuncProps } from 'antd/lib/modal';\nimport { styled, t } from '@superset-ui/core';\nimport { css } from '@emotion/react';\nimport { AntdModal, AntdModalProps } from 'src/components';\nimport Button from 'src/components/Button';\nimport { Resizable, ResizableProps } from 're-resizable';\nimport Draggable, {\n DraggableBounds,\n DraggableData,\n DraggableEvent,\n DraggableProps,\n} from 'react-draggable';\n\nexport interface ModalProps {\n className?: string;\n children: ReactNode;\n disablePrimaryButton?: boolean;\n primaryTooltipMessage?: ReactNode;\n primaryButtonLoading?: boolean;\n onHide: () => void;\n onHandledPrimaryAction?: () => void;\n primaryButtonName?: string;\n primaryButtonType?: 'primary' | 'danger';\n show: boolean;\n name?: string;\n title: ReactNode;\n width?: string;\n maxWidth?: string;\n responsive?: boolean;\n hideFooter?: boolean;\n centered?: boolean;\n footer?: ReactNode;\n wrapProps?: object;\n height?: string;\n closable?: boolean;\n resizable?: boolean;\n resizableConfig?: ResizableProps;\n draggable?: boolean;\n draggableConfig?: DraggableProps;\n destroyOnClose?: boolean;\n maskClosable?: boolean;\n zIndex?: number;\n bodyStyle?: CSSProperties;\n}\n\ninterface StyledModalProps {\n maxWidth?: string;\n responsive?: boolean;\n height?: string;\n hideFooter?: boolean;\n draggable?: boolean;\n resizable?: boolean;\n}\n\nconst MODAL_HEADER_HEIGHT = 55;\nconst MODAL_MIN_CONTENT_HEIGHT = 54;\nconst MODAL_FOOTER_HEIGHT = 65;\n\nconst RESIZABLE_MIN_HEIGHT = MODAL_HEADER_HEIGHT + MODAL_MIN_CONTENT_HEIGHT;\nconst RESIZABLE_MIN_WIDTH = '380px';\nconst RESIZABLE_MAX_HEIGHT = '100vh';\nconst RESIZABLE_MAX_WIDTH = '100vw';\n\nconst BaseModal = (props: AntdModalProps) => (\n // Removes mask animation. Fixed in 4.6.0.\n // https://github.com/ant-design/ant-design/issues/27192\n \n);\n\nexport const StyledModal = styled(BaseModal)`\n ${({ theme, responsive, maxWidth }) =>\n responsive &&\n css`\n max-width: ${maxWidth ?? '900px'};\n padding-left: ${theme.gridUnit * 3}px;\n padding-right: ${theme.gridUnit * 3}px;\n padding-bottom: 0;\n top: 0;\n `}\n\n .ant-modal-content {\n display: flex;\n flex-direction: column;\n max-height: ${({ theme }) => `calc(100vh - ${theme.gridUnit * 8}px)`};\n margin-bottom: ${({ theme }) => theme.gridUnit * 4}px;\n margin-top: ${({ theme }) => theme.gridUnit * 4}px;\n }\n\n .ant-modal-header {\n flex: 0 0 auto;\n background-color: ${({ theme }) => theme.colors.grayscale.light4};\n border-radius: ${({ theme }) => theme.borderRadius}px\n ${({ theme }) => theme.borderRadius}px 0 0;\n padding-left: ${({ theme }) => theme.gridUnit * 4}px;\n padding-right: ${({ theme }) => theme.gridUnit * 4}px;\n\n .ant-modal-title h4 {\n display: flex;\n margin: 0;\n align-items: center;\n }\n }\n\n .ant-modal-close-x {\n display: flex;\n align-items: center;\n\n .close {\n flex: 1 1 auto;\n margin-bottom: ${({ theme }) => theme.gridUnit}px;\n color: ${({ theme }) => theme.colors.secondary.dark1};\n font-size: 32px;\n font-weight: ${({ theme }) => theme.typography.weights.light};\n }\n }\n\n .ant-modal-body {\n flex: 0 1 auto;\n padding: ${({ theme }) => theme.gridUnit * 4}px;\n overflow: auto;\n ${({ resizable, height }) => !resizable && height && `height: ${height};`}\n }\n .ant-modal-footer {\n flex: 0 0 1;\n border-top: ${({ theme }) => theme.gridUnit / 4}px solid\n ${({ theme }) => theme.colors.grayscale.light2};\n padding: ${({ theme }) => theme.gridUnit * 4}px;\n\n .btn {\n font-size: 12px;\n text-transform: uppercase;\n }\n\n .btn + .btn {\n margin-left: ${({ theme }) => theme.gridUnit * 2}px;\n }\n }\n\n // styling for Tabs component\n // Aaron note 20-11-19: this seems to be exclusively here for the Edit Database modal.\n // TODO: remove this as it is a special case.\n .ant-tabs-top {\n margin-top: -${({ theme }) => theme.gridUnit * 4}px;\n }\n\n &.no-content-padding .ant-modal-body {\n padding: 0;\n }\n\n ${({ draggable, theme }) =>\n draggable &&\n `\n .ant-modal-header {\n padding: 0;\n .draggable-trigger {\n cursor: move;\n padding: ${theme.gridUnit * 4}px;\n width: 100%;\n }\n }\n `};\n\n ${({ resizable, hideFooter }) =>\n resizable &&\n `\n .resizable {\n pointer-events: all;\n\n .resizable-wrapper {\n height: 100%;\n }\n\n .ant-modal-content {\n height: 100%;\n\n .ant-modal-body {\n /* 100% - header height - footer height */\n height: ${\n hideFooter\n ? `calc(100% - ${MODAL_HEADER_HEIGHT}px);`\n : `calc(100% - ${MODAL_HEADER_HEIGHT}px - ${MODAL_FOOTER_HEIGHT}px);`\n }\n }\n }\n }\n `}\n`;\nconst defaultResizableConfig = (hideFooter: boolean | undefined) => ({\n maxHeight: RESIZABLE_MAX_HEIGHT,\n maxWidth: RESIZABLE_MAX_WIDTH,\n minHeight: hideFooter\n ? RESIZABLE_MIN_HEIGHT\n : RESIZABLE_MIN_HEIGHT + MODAL_FOOTER_HEIGHT,\n minWidth: RESIZABLE_MIN_WIDTH,\n enable: {\n bottom: true,\n bottomLeft: false,\n bottomRight: true,\n left: false,\n top: false,\n topLeft: false,\n topRight: false,\n right: true,\n },\n});\n\nconst CustomModal = ({\n children,\n disablePrimaryButton = false,\n primaryTooltipMessage,\n primaryButtonLoading = false,\n onHide,\n onHandledPrimaryAction,\n primaryButtonName = t('OK'),\n primaryButtonType = 'primary',\n show,\n name,\n title,\n width,\n maxWidth,\n responsive = false,\n centered,\n footer,\n hideFooter,\n wrapProps,\n draggable = false,\n resizable = false,\n resizableConfig = defaultResizableConfig(hideFooter),\n draggableConfig,\n destroyOnClose,\n ...rest\n}: ModalProps) => {\n const draggableRef = useRef(null);\n const [bounds, setBounds] = useState();\n const [dragDisabled, setDragDisabled] = useState(true);\n let FooterComponent;\n if (isValidElement(footer)) {\n // If a footer component is provided inject a closeModal function\n // so the footer can provide a \"close\" button if desired\n FooterComponent = cloneElement(footer, {\n closeModal: onHide,\n } as Partial);\n }\n const modalFooter = isNil(FooterComponent)\n ? [\n ,\n \n {primaryButtonName}\n ,\n ]\n : FooterComponent;\n\n const modalWidth = width || (responsive ? '100vw' : '600px');\n const shouldShowMask = !(resizable || draggable);\n\n const onDragStart = (_: DraggableEvent, uiData: DraggableData) => {\n const { clientWidth, clientHeight } = window?.document?.documentElement;\n const targetRect = draggableRef?.current?.getBoundingClientRect();\n\n if (targetRect) {\n setBounds({\n left: -targetRect?.left + uiData?.x,\n right: clientWidth - (targetRect?.right - uiData?.x),\n top: -targetRect?.top + uiData?.y,\n bottom: clientHeight - (targetRect?.bottom - uiData?.y),\n });\n }\n };\n\n const getResizableConfig = useMemo(() => {\n if (Object.keys(resizableConfig).length === 0) {\n return defaultResizableConfig(hideFooter);\n }\n return resizableConfig;\n }, [hideFooter, resizableConfig]);\n\n const ModalTitle = () =>\n draggable ? (\n dragDisabled && setDragDisabled(false)}\n onMouseOut={() => !dragDisabled && setDragDisabled(true)}\n >\n {title}\n \n ) : (\n <>{title}\n );\n\n return (\n }\n closeIcon={\n \n ×\n \n }\n footer={!hideFooter ? modalFooter : null}\n hideFooter={hideFooter}\n wrapProps={{ 'data-test': `${name || title}-modal`, ...wrapProps }}\n modalRender={modal =>\n resizable || draggable ? (\n onDragStart(event, uiData)}\n {...draggableConfig}\n >\n {resizable ? (\n \n
\n {modal}\n
\n
\n ) : (\n
{modal}
\n )}\n \n ) : (\n modal\n )\n }\n mask={shouldShowMask}\n draggable={draggable}\n resizable={resizable}\n destroyOnClose={destroyOnClose}\n {...rest}\n >\n {children}\n \n );\n};\nCustomModal.displayName = 'Modal';\n\n// Ant Design 4 does not allow overriding Modal's buttons when\n// using one of the pre-defined functions. Ant Design 5 Modal introduced\n// the footer property that will allow that. Meanwhile, we're replicating\n// Button style using global CSS in src/GlobalStyles.tsx.\n// TODO: Replace this logic when on Ant Design 5.\nconst buttonProps = {\n okButtonProps: { className: 'modal-functions-ok-button' },\n cancelButtonProps: { className: 'modal-functions-cancel-button' },\n};\n\n// TODO: in another PR, rename this to CompatabilityModal\n// and demote it as the default export.\n// We should start using AntD component interfaces going forward.\nconst Modal = Object.assign(CustomModal, {\n error: (config: ModalFuncProps) =>\n AntdModal.error({ ...config, ...buttonProps }),\n warning: (config: ModalFuncProps) =>\n AntdModal.warning({ ...config, ...buttonProps }),\n confirm: (config: ModalFuncProps) =>\n AntdModal.confirm({ ...config, ...buttonProps }),\n useModal: AntdModal.useModal,\n});\n\nexport default Modal;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport {\n forwardRef,\n FocusEvent,\n ReactElement,\n RefObject,\n UIEvent,\n useEffect,\n useMemo,\n useState,\n useRef,\n useCallback,\n useImperativeHandle,\n ClipboardEvent,\n} from 'react';\n\nimport {\n ensureIsArray,\n t,\n usePrevious,\n getClientErrorObject,\n} from '@superset-ui/core';\nimport { LabeledValue as AntdLabeledValue } from 'antd/lib/select';\nimport { debounce, isEqual, uniq } from 'lodash';\nimport Icons from 'src/components/Icons';\nimport { FAST_DEBOUNCE, SLOW_DEBOUNCE } from 'src/constants';\nimport {\n getValue,\n hasOption,\n isLabeledValue,\n renderSelectOptions,\n hasCustomLabels,\n sortSelectedFirstHelper,\n sortComparatorWithSearchHelper,\n sortComparatorForNoSearchHelper,\n getSuffixIcon,\n dropDownRenderHelper,\n handleFilterOptionHelper,\n mapOptions,\n getOption,\n isObject,\n isEqual as utilsIsEqual,\n} from './utils';\nimport {\n AsyncSelectProps,\n AsyncSelectRef,\n RawValue,\n SelectOptionsPagePromise,\n SelectOptionsType,\n SelectOptionsTypePage,\n SelectProps,\n} from './types';\nimport {\n StyledCheckOutlined,\n StyledContainer,\n StyledError,\n StyledErrorMessage,\n StyledHeader,\n StyledSelect,\n StyledStopOutlined,\n} from './styles';\nimport {\n DEFAULT_PAGE_SIZE,\n EMPTY_OPTIONS,\n MAX_TAG_COUNT,\n TOKEN_SEPARATORS,\n DEFAULT_SORT_COMPARATOR,\n} from './constants';\nimport { customTagRender } from './CustomTag';\n\nconst Error = ({ error }: { error: string }) => (\n \n {error}\n \n);\n\nconst getQueryCacheKey = (value: string, page: number, pageSize: number) =>\n `${value};${page};${pageSize}`;\n\n/**\n * This component is a customized version of the Antdesign 4.X Select component\n * https://ant.design/components/select/.\n * This Select component provides an API that is tested against all the different use cases of Superset.\n * It limits and overrides the existing Antdesign API in order to keep their usage to the minimum\n * and to enforce simplification and standardization.\n * It is divided into two macro categories, Static and Async.\n * The Static type accepts a static array of options.\n * The Async type accepts a promise that will return the options.\n * Each of the categories come with different abilities. For a comprehensive guide please refer to\n * the storybook in src/components/Select/Select.stories.tsx.\n */\nconst AsyncSelect = forwardRef(\n (\n {\n allowClear,\n allowNewOptions = false,\n ariaLabel,\n autoClearSearchValue = false,\n fetchOnlyOnSearch,\n filterOption = true,\n header = null,\n headerPosition = 'top',\n helperText,\n invertSelection = false,\n lazyLoading = true,\n loading,\n mode = 'single',\n name,\n notFoundContent,\n onBlur,\n onError,\n onChange,\n onClear,\n onDropdownVisibleChange,\n onDeselect,\n onSearch,\n onSelect,\n optionFilterProps = ['label', 'value'],\n options,\n pageSize = DEFAULT_PAGE_SIZE,\n placeholder = t('Select ...'),\n showSearch = true,\n sortComparator = DEFAULT_SORT_COMPARATOR,\n tokenSeparators = TOKEN_SEPARATORS,\n value,\n getPopupContainer,\n oneLine,\n maxTagCount: propsMaxTagCount,\n ...props\n }: AsyncSelectProps,\n ref: RefObject,\n ) => {\n const isSingleMode = mode === 'single';\n const [selectValue, setSelectValue] = useState(value);\n const [inputValue, setInputValue] = useState('');\n const [isLoading, setIsLoading] = useState(loading);\n const [error, setError] = useState('');\n const [isDropdownVisible, setIsDropdownVisible] = useState(false);\n const [page, setPage] = useState(0);\n const [totalCount, setTotalCount] = useState(0);\n const [loadingEnabled, setLoadingEnabled] = useState(!lazyLoading);\n const [allValuesLoaded, setAllValuesLoaded] = useState(false);\n const selectValueRef = useRef(selectValue);\n const fetchedQueries = useRef(new Map());\n const mappedMode = isSingleMode ? undefined : 'multiple';\n const allowFetch = !fetchOnlyOnSearch || inputValue;\n const [maxTagCount, setMaxTagCount] = useState(\n propsMaxTagCount ?? MAX_TAG_COUNT,\n );\n const [onChangeCount, setOnChangeCount] = useState(0);\n const previousChangeCount = usePrevious(onChangeCount, 0);\n\n const fireOnChange = useCallback(\n () => setOnChangeCount(onChangeCount + 1),\n [onChangeCount],\n );\n\n useEffect(() => {\n if (oneLine) {\n setMaxTagCount(isDropdownVisible ? 0 : 1);\n }\n }, [isDropdownVisible, oneLine]);\n\n useEffect(() => {\n selectValueRef.current = selectValue;\n }, [selectValue]);\n\n const sortSelectedFirst = useCallback(\n (a: AntdLabeledValue, b: AntdLabeledValue) =>\n sortSelectedFirstHelper(a, b, selectValueRef.current),\n [],\n );\n\n const sortComparatorWithSearch = useCallback(\n (a: AntdLabeledValue, b: AntdLabeledValue) =>\n sortComparatorWithSearchHelper(\n a,\n b,\n inputValue,\n sortSelectedFirst,\n sortComparator,\n ),\n [inputValue, sortComparator, sortSelectedFirst],\n );\n\n const sortComparatorForNoSearch = useCallback(\n (a: AntdLabeledValue, b: AntdLabeledValue) =>\n sortComparatorForNoSearchHelper(\n a,\n b,\n sortSelectedFirst,\n sortComparator,\n ),\n [sortComparator, sortSelectedFirst],\n );\n\n const [selectOptions, setSelectOptions] =\n useState(EMPTY_OPTIONS);\n\n // add selected values to options list if they are not in it\n const fullSelectOptions = useMemo(() => {\n const missingValues: SelectOptionsType = ensureIsArray(selectValue)\n .filter(opt => !hasOption(getValue(opt), selectOptions))\n .map(opt =>\n isLabeledValue(opt) ? opt : { value: opt, label: String(opt) },\n );\n return missingValues.length > 0\n ? missingValues.concat(selectOptions)\n : selectOptions;\n }, [selectOptions, selectValue]);\n\n const handleOnSelect: SelectProps['onSelect'] = (selectedItem, option) => {\n if (isSingleMode) {\n // on select is fired in single value mode if the same value is selected\n const valueChanged = !utilsIsEqual(\n selectedItem,\n selectValue as RawValue | AntdLabeledValue,\n 'value',\n );\n setSelectValue(selectedItem);\n if (valueChanged) {\n fireOnChange();\n }\n } else {\n setSelectValue(previousState => {\n const array = ensureIsArray(previousState);\n const value = getValue(selectedItem);\n // Tokenized values can contain duplicated values\n if (!hasOption(value, array)) {\n const result = [...array, selectedItem];\n return isLabeledValue(selectedItem)\n ? (result as AntdLabeledValue[])\n : (result as (string | number)[]);\n }\n return previousState;\n });\n fireOnChange();\n }\n onSelect?.(selectedItem, option);\n };\n\n const handleOnDeselect: SelectProps['onDeselect'] = (value, option) => {\n if (Array.isArray(selectValue)) {\n if (isLabeledValue(value)) {\n const array = selectValue as AntdLabeledValue[];\n setSelectValue(\n array.filter(element => element.value !== value.value),\n );\n } else {\n const array = selectValue as (string | number)[];\n setSelectValue(array.filter(element => element !== value));\n }\n // removes new option\n if (option.isNewOption) {\n setSelectOptions(\n fullSelectOptions.filter(\n option => getValue(option.value) !== getValue(value),\n ),\n );\n }\n }\n fireOnChange();\n onDeselect?.(value, option);\n };\n\n const internalOnError = useCallback(\n (response: Response) =>\n getClientErrorObject(response).then(e => {\n const { error } = e;\n setError(error);\n\n if (onError) {\n onError(error);\n }\n }),\n [onError],\n );\n\n const mergeData = useCallback(\n (data: SelectOptionsType) => {\n let mergedData: SelectOptionsType = [];\n if (data && Array.isArray(data) && data.length) {\n // unique option values should always be case sensitive so don't lowercase\n const dataValues = new Set(data.map(opt => opt.value));\n // merges with existing and creates unique options\n setSelectOptions(prevOptions => {\n mergedData = prevOptions\n .filter(previousOption => !dataValues.has(previousOption.value))\n .concat(data)\n .sort(sortComparatorForNoSearch);\n return mergedData;\n });\n }\n return mergedData;\n },\n [sortComparatorForNoSearch],\n );\n\n const fetchPage = useMemo(\n () => (search: string, page: number) => {\n setPage(page);\n if (allValuesLoaded) {\n setIsLoading(false);\n return;\n }\n const key = getQueryCacheKey(search, page, pageSize);\n const cachedCount = fetchedQueries.current.get(key);\n if (cachedCount !== undefined) {\n setTotalCount(cachedCount);\n setIsLoading(false);\n return;\n }\n setIsLoading(true);\n\n const fetchOptions = options as SelectOptionsPagePromise;\n fetchOptions(search, page, pageSize)\n .then(({ data, totalCount }: SelectOptionsTypePage) => {\n const mergedData = mergeData(data);\n fetchedQueries.current.set(key, totalCount);\n setTotalCount(totalCount);\n if (\n !fetchOnlyOnSearch &&\n search === '' &&\n mergedData.length >= totalCount\n ) {\n setAllValuesLoaded(true);\n }\n })\n .catch(internalOnError)\n .finally(() => {\n setIsLoading(false);\n });\n },\n [\n allValuesLoaded,\n fetchOnlyOnSearch,\n mergeData,\n internalOnError,\n options,\n pageSize,\n ],\n );\n\n const debouncedFetchPage = useMemo(\n () => debounce(fetchPage, SLOW_DEBOUNCE),\n [fetchPage],\n );\n\n const handleOnSearch = debounce((search: string) => {\n const searchValue = search.trim();\n if (allowNewOptions) {\n const newOption = searchValue &&\n !hasOption(searchValue, fullSelectOptions, true) && {\n label: searchValue,\n value: searchValue,\n isNewOption: true,\n };\n const cleanSelectOptions = fullSelectOptions.filter(\n opt => !opt.isNewOption || hasOption(opt.value, selectValue),\n );\n const newOptions = newOption\n ? [newOption, ...cleanSelectOptions]\n : cleanSelectOptions;\n setSelectOptions(newOptions);\n }\n if (\n !allValuesLoaded &&\n loadingEnabled &&\n !fetchedQueries.current.has(getQueryCacheKey(searchValue, 0, pageSize))\n ) {\n // if fetch only on search but search value is empty, then should not be\n // in loading state\n setIsLoading(!(fetchOnlyOnSearch && !searchValue));\n }\n setInputValue(search);\n onSearch?.(searchValue);\n }, FAST_DEBOUNCE);\n\n useEffect(() => () => handleOnSearch.cancel(), [handleOnSearch]);\n\n const handlePagination = (e: UIEvent) => {\n const vScroll = e.currentTarget;\n const thresholdReached =\n vScroll.scrollTop > (vScroll.scrollHeight - vScroll.offsetHeight) * 0.7;\n const hasMoreData = page * pageSize + pageSize < totalCount;\n\n if (!isLoading && hasMoreData && thresholdReached) {\n const newPage = page + 1;\n fetchPage(inputValue, newPage);\n }\n };\n\n const handleFilterOption = (search: string, option: AntdLabeledValue) =>\n handleFilterOptionHelper(search, option, optionFilterProps, filterOption);\n\n const handleOnDropdownVisibleChange = (isDropdownVisible: boolean) => {\n setIsDropdownVisible(isDropdownVisible);\n\n // loading is enabled when dropdown is open,\n // disabled when dropdown is closed\n if (loadingEnabled !== isDropdownVisible) {\n setLoadingEnabled(isDropdownVisible);\n }\n // when closing dropdown, always reset loading state\n if (!isDropdownVisible && isLoading) {\n // delay is for the animation of closing the dropdown\n // so the dropdown doesn't flash between \"Loading...\" and \"No data\"\n // before closing.\n setTimeout(() => {\n setIsLoading(false);\n }, 250);\n }\n // if no search input value, force sort options because it won't be sorted by\n // `filterSort`.\n if (isDropdownVisible && !inputValue && selectOptions.length > 1) {\n const sortedOptions = selectOptions\n .slice()\n .sort(sortComparatorForNoSearch);\n if (!isEqual(sortedOptions, selectOptions)) {\n setSelectOptions(sortedOptions);\n }\n }\n\n if (onDropdownVisibleChange) {\n onDropdownVisibleChange(isDropdownVisible);\n }\n };\n\n const dropdownRender = (\n originNode: ReactElement & { ref?: RefObject },\n ) =>\n dropDownRenderHelper(\n originNode,\n isDropdownVisible,\n isLoading,\n fullSelectOptions.length,\n helperText,\n error ? : undefined,\n );\n\n const handleClear = () => {\n setSelectValue(undefined);\n if (onClear) {\n onClear();\n }\n fireOnChange();\n };\n\n const handleOnBlur = (event: FocusEvent) => {\n setInputValue('');\n onBlur?.(event);\n };\n\n useEffect(() => {\n if (onChangeCount !== previousChangeCount) {\n const array = ensureIsArray(selectValue);\n const set = new Set(array.map(getValue));\n const options = mapOptions(\n fullSelectOptions.filter(opt => set.has(opt.value)),\n );\n if (isSingleMode) {\n // @ts-ignore\n onChange?.(selectValue, options[0]);\n } else {\n // @ts-ignore\n onChange?.(array, options);\n }\n }\n }, [\n fullSelectOptions,\n isSingleMode,\n onChange,\n onChangeCount,\n previousChangeCount,\n selectValue,\n ]);\n\n useEffect(() => {\n // when `options` list is updated from component prop, reset states\n fetchedQueries.current.clear();\n setAllValuesLoaded(false);\n setSelectOptions(EMPTY_OPTIONS);\n }, [options]);\n\n useEffect(() => {\n setSelectValue(value);\n }, [value]);\n\n // Stop the invocation of the debounced function after unmounting\n useEffect(\n () => () => {\n debouncedFetchPage.cancel();\n },\n [debouncedFetchPage],\n );\n\n useEffect(() => {\n if (loadingEnabled && allowFetch) {\n // trigger fetch every time inputValue changes\n if (inputValue) {\n debouncedFetchPage(inputValue, 0);\n } else {\n fetchPage('', 0);\n }\n }\n }, [loadingEnabled, fetchPage, allowFetch, inputValue, debouncedFetchPage]);\n\n useEffect(() => {\n if (loading !== undefined && loading !== isLoading) {\n setIsLoading(loading);\n }\n }, [isLoading, loading]);\n\n const clearCache = () => fetchedQueries.current.clear();\n\n useImperativeHandle(\n ref,\n () => ({\n ...(ref.current as HTMLInputElement),\n clearCache,\n }),\n [ref],\n );\n\n const getPastedTextValue = useCallback(\n async (text: string) => {\n let option = getOption(text, fullSelectOptions, true);\n if (!option && !allValuesLoaded) {\n const fetchOptions = options as SelectOptionsPagePromise;\n option = await fetchOptions(text, 0, pageSize).then(\n ({ data }: SelectOptionsTypePage) =>\n data.find(item => item.label === text),\n );\n }\n if (!option && !allowNewOptions) {\n return undefined;\n }\n const value: AntdLabeledValue = {\n label: text,\n value: text,\n };\n if (option) {\n value.label = isObject(option) ? option.label : option;\n value.value = isObject(option) ? option.value! : option;\n }\n return value;\n },\n [allValuesLoaded, allowNewOptions, fullSelectOptions, options, pageSize],\n );\n\n const onPaste = async (e: ClipboardEvent) => {\n const pastedText = e.clipboardData.getData('text');\n if (isSingleMode) {\n const value = await getPastedTextValue(pastedText);\n if (value) {\n setSelectValue(value);\n }\n } else {\n const token = tokenSeparators.find(token => pastedText.includes(token));\n const array = token ? uniq(pastedText.split(token)) : [pastedText];\n const values = (\n await Promise.all(array.map(item => getPastedTextValue(item)))\n ).filter(item => item !== undefined) as AntdLabeledValue[];\n setSelectValue(previous => [\n ...((previous || []) as AntdLabeledValue[]),\n ...values.filter(value => !hasOption(value.value, previous)),\n ]);\n }\n fireOnChange();\n };\n\n const shouldRenderChildrenOptions = useMemo(\n () => hasCustomLabels(fullSelectOptions),\n [fullSelectOptions],\n );\n\n return (\n \n {header && (\n {header}\n )}\n triggerNode.parentNode)\n }\n headerPosition={headerPosition}\n labelInValue\n maxTagCount={maxTagCount}\n mode={mappedMode}\n notFoundContent={isLoading ? t('Loading...') : notFoundContent}\n onBlur={handleOnBlur}\n onDeselect={handleOnDeselect}\n onDropdownVisibleChange={handleOnDropdownVisibleChange}\n // @ts-ignore\n onPaste={onPaste}\n onPopupScroll={handlePagination}\n onSearch={showSearch ? handleOnSearch : undefined}\n onSelect={handleOnSelect}\n onClear={handleClear}\n options={shouldRenderChildrenOptions ? undefined : fullSelectOptions}\n placeholder={placeholder}\n showSearch={showSearch}\n showArrow\n tokenSeparators={tokenSeparators}\n value={selectValue}\n suffixIcon={getSuffixIcon(isLoading, showSearch, isDropdownVisible)}\n menuItemSelectedIcon={\n invertSelection ? (\n \n ) : (\n \n )\n }\n oneLine={oneLine}\n tagRender={customTagRender}\n {...props}\n ref={ref}\n >\n {hasCustomLabels(fullSelectOptions) &&\n renderSelectOptions(fullSelectOptions)}\n \n \n );\n },\n);\n\nexport default AsyncSelect;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { MouseEvent } from 'react';\nimport { Tag as AntdTag } from 'antd';\nimport { styled, useCSSTextTruncation } from '@superset-ui/core';\nimport { Tooltip } from '../Tooltip';\nimport { CustomCloseIcon } from '../Tags/Tag';\nimport { CustomTagProps } from './types';\nimport { SELECT_ALL_VALUE } from './utils';\nimport { NoElement } from './styles';\n\nconst StyledTag = styled(AntdTag)`\n & .ant-tag-close-icon {\n display: inline-flex;\n align-items: center;\n margin-left: ${({ theme }) => theme.gridUnit}px;\n }\n\n & .tag-content {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n`;\n\n// TODO: use antd Tag props instead of any. Currently it's causing a typescript error\nconst Tag = (props: any) => {\n const [tagRef, tagIsTruncated] = useCSSTextTruncation();\n return (\n \n \n \n {props.children}\n \n \n \n );\n};\n\n/**\n * Custom tag renderer\n */\nexport const customTagRender = (props: CustomTagProps) => {\n const { label, value } = props;\n\n const onPreventMouseDown = (event: MouseEvent) => {\n // if close icon is clicked, stop propagation to avoid opening the dropdown\n const target = event.target as HTMLElement;\n if (\n target.tagName === 'svg' ||\n target.tagName === 'path' ||\n (target.tagName === 'span' &&\n target.className.includes('ant-tag-close-icon'))\n ) {\n event.stopPropagation();\n }\n };\n\n if (value !== SELECT_ALL_VALUE) {\n return (\n \n {label}\n \n );\n }\n return ;\n};\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport {\n forwardRef,\n FocusEvent,\n ReactElement,\n RefObject,\n useEffect,\n useMemo,\n useState,\n useCallback,\n ClipboardEvent,\n} from 'react';\n\nimport {\n ensureIsArray,\n formatNumber,\n NumberFormats,\n t,\n usePrevious,\n} from '@superset-ui/core';\nimport AntdSelect, { LabeledValue as AntdLabeledValue } from 'antd/lib/select';\nimport { debounce, isEqual, uniq } from 'lodash';\nimport { FAST_DEBOUNCE } from 'src/constants';\nimport {\n getValue,\n hasOption,\n isLabeledValue,\n renderSelectOptions,\n sortSelectedFirstHelper,\n sortComparatorWithSearchHelper,\n handleFilterOptionHelper,\n dropDownRenderHelper,\n getSuffixIcon,\n SELECT_ALL_VALUE,\n selectAllOption,\n mapValues,\n mapOptions,\n hasCustomLabels,\n getOption,\n isObject,\n isEqual as utilsIsEqual,\n} from './utils';\nimport { RawValue, SelectOptionsType, SelectProps } from './types';\nimport {\n StyledCheckOutlined,\n StyledContainer,\n StyledHeader,\n StyledSelect,\n StyledStopOutlined,\n} from './styles';\nimport {\n EMPTY_OPTIONS,\n MAX_TAG_COUNT,\n TOKEN_SEPARATORS,\n DEFAULT_SORT_COMPARATOR,\n} from './constants';\nimport { customTagRender } from './CustomTag';\n\n/**\n * This component is a customized version of the Antdesign 4.X Select component\n * https://ant.design/components/select/.\n * This Select component provides an API that is tested against all the different use cases of Superset.\n * It limits and overrides the existing Antdesign API in order to keep their usage to the minimum\n * and to enforce simplification and standardization.\n * It is divided into two macro categories, Static and Async.\n * The Static type accepts a static array of options.\n * The Async type accepts a promise that will return the options.\n * Each of the categories come with different abilities. For a comprehensive guide please refer to\n * the storybook in src/components/Select/Select.stories.tsx.\n */\nconst Select = forwardRef(\n (\n {\n allowClear,\n allowNewOptions = false,\n allowSelectAll = true,\n ariaLabel,\n autoClearSearchValue = false,\n filterOption = true,\n header = null,\n headerPosition = 'top',\n helperText,\n invertSelection = false,\n labelInValue = false,\n loading,\n mode = 'single',\n name,\n notFoundContent,\n onBlur,\n onChange,\n onClear,\n onDropdownVisibleChange,\n onDeselect,\n onSearch,\n onSelect,\n optionFilterProps = ['label', 'value'],\n options,\n placeholder = t('Select ...'),\n showSearch = true,\n sortComparator = DEFAULT_SORT_COMPARATOR,\n tokenSeparators = TOKEN_SEPARATORS,\n value,\n getPopupContainer,\n oneLine,\n maxTagCount: propsMaxTagCount,\n ...props\n }: SelectProps,\n ref: RefObject,\n ) => {\n const isSingleMode = mode === 'single';\n const shouldShowSearch = allowNewOptions ? true : showSearch;\n const [selectValue, setSelectValue] = useState(value);\n const [inputValue, setInputValue] = useState('');\n const [isLoading, setIsLoading] = useState(loading);\n const [isDropdownVisible, setIsDropdownVisible] = useState(false);\n const [maxTagCount, setMaxTagCount] = useState(\n propsMaxTagCount ?? MAX_TAG_COUNT,\n );\n const [onChangeCount, setOnChangeCount] = useState(0);\n const previousChangeCount = usePrevious(onChangeCount, 0);\n\n const fireOnChange = useCallback(\n () => setOnChangeCount(onChangeCount + 1),\n [onChangeCount],\n );\n\n useEffect(() => {\n if (oneLine) {\n setMaxTagCount(isDropdownVisible ? 0 : 1);\n }\n }, [isDropdownVisible, oneLine]);\n\n const mappedMode = isSingleMode ? undefined : 'multiple';\n\n const { Option } = AntdSelect;\n\n const sortSelectedFirst = useCallback(\n (a: AntdLabeledValue, b: AntdLabeledValue) =>\n sortSelectedFirstHelper(a, b, selectValue),\n [selectValue],\n );\n const sortComparatorWithSearch = useCallback(\n (a: AntdLabeledValue, b: AntdLabeledValue) =>\n sortComparatorWithSearchHelper(\n a,\n b,\n inputValue,\n sortSelectedFirst,\n sortComparator,\n ),\n [inputValue, sortComparator, sortSelectedFirst],\n );\n\n const initialOptions = useMemo(\n () => (Array.isArray(options) ? options.slice() : EMPTY_OPTIONS),\n [options],\n );\n const initialOptionsSorted = useMemo(\n () => initialOptions.slice().sort(sortSelectedFirst),\n [initialOptions, sortSelectedFirst],\n );\n\n const [selectOptions, setSelectOptions] =\n useState(initialOptionsSorted);\n\n // add selected values to options list if they are not in it\n const fullSelectOptions = useMemo(() => {\n // check to see if selectOptions are grouped\n let groupedOptions: SelectOptionsType;\n if (selectOptions.some(opt => opt.options)) {\n groupedOptions = selectOptions.reduce(\n (acc, group) => [...acc, ...group.options],\n [] as SelectOptionsType,\n );\n }\n const missingValues: SelectOptionsType = ensureIsArray(selectValue)\n .filter(\n opt => !hasOption(getValue(opt), groupedOptions || selectOptions),\n )\n .map(opt =>\n isLabeledValue(opt) ? opt : { value: opt, label: String(opt) },\n );\n const result =\n missingValues.length > 0\n ? missingValues.concat(selectOptions)\n : selectOptions;\n return result.filter(opt => opt.value !== SELECT_ALL_VALUE);\n }, [selectOptions, selectValue]);\n\n const enabledOptions = useMemo(\n () => fullSelectOptions.filter(option => !option.disabled),\n [fullSelectOptions],\n );\n\n const selectAllEligible = useMemo(\n () =>\n fullSelectOptions.filter(\n option => hasOption(option.value, selectValue) || !option.disabled,\n ),\n [fullSelectOptions, selectValue],\n );\n\n const selectAllEnabled = useMemo(\n () =>\n !isSingleMode &&\n allowSelectAll &&\n selectOptions.length > 0 &&\n enabledOptions.length > 1 &&\n !inputValue,\n [\n isSingleMode,\n allowSelectAll,\n selectOptions.length,\n enabledOptions.length,\n inputValue,\n ],\n );\n\n const selectAllMode = useMemo(\n () => ensureIsArray(selectValue).length === selectAllEligible.length + 1,\n [selectValue, selectAllEligible],\n );\n\n const handleOnSelect: SelectProps['onSelect'] = (selectedItem, option) => {\n if (isSingleMode) {\n // on select is fired in single value mode if the same value is selected\n const valueChanged = !utilsIsEqual(\n selectedItem,\n selectValue as RawValue | AntdLabeledValue,\n 'value',\n );\n setSelectValue(selectedItem);\n if (valueChanged) {\n fireOnChange();\n }\n } else {\n setSelectValue(previousState => {\n const array = ensureIsArray(previousState);\n const value = getValue(selectedItem);\n // Tokenized values can contain duplicated values\n if (value === getValue(SELECT_ALL_VALUE)) {\n if (isLabeledValue(selectedItem)) {\n return [\n ...selectAllEligible,\n selectAllOption,\n ] as AntdLabeledValue[];\n }\n return [\n SELECT_ALL_VALUE,\n ...selectAllEligible.map(opt => opt.value),\n ] as AntdLabeledValue[];\n }\n if (!hasOption(value, array)) {\n const result = [...array, selectedItem];\n if (\n result.length === selectAllEligible.length &&\n selectAllEnabled\n ) {\n return isLabeledValue(selectedItem)\n ? ([...result, selectAllOption] as AntdLabeledValue[])\n : ([...result, SELECT_ALL_VALUE] as (string | number)[]);\n }\n return result as AntdLabeledValue[];\n }\n return previousState;\n });\n fireOnChange();\n }\n onSelect?.(selectedItem, option);\n };\n\n const clear = () => {\n if (isSingleMode) {\n setSelectValue(undefined);\n } else {\n setSelectValue(\n fullSelectOptions\n .filter(\n option => option.disabled && hasOption(option.value, selectValue),\n )\n .map(option =>\n labelInValue\n ? { label: option.label, value: option.value }\n : option.value,\n ),\n );\n }\n fireOnChange();\n };\n\n const handleOnDeselect: SelectProps['onDeselect'] = (value, option) => {\n if (Array.isArray(selectValue)) {\n if (getValue(value) === getValue(SELECT_ALL_VALUE)) {\n clear();\n } else {\n let array = selectValue as AntdLabeledValue[];\n array = array.filter(\n element => getValue(element) !== getValue(value),\n );\n // if this was not a new item, deselect select all option\n if (selectAllMode && !option.isNewOption) {\n array = array.filter(\n element => getValue(element) !== SELECT_ALL_VALUE,\n );\n }\n setSelectValue(array);\n\n // removes new option\n if (option.isNewOption) {\n setSelectOptions(\n fullSelectOptions.filter(\n option => getValue(option.value) !== getValue(value),\n ),\n );\n }\n }\n }\n fireOnChange();\n onDeselect?.(value, option);\n };\n\n const handleOnSearch = debounce((search: string) => {\n const searchValue = search.trim();\n if (allowNewOptions) {\n const newOption = searchValue &&\n !hasOption(searchValue, fullSelectOptions, true) && {\n label: searchValue,\n value: searchValue,\n isNewOption: true,\n };\n const cleanSelectOptions = ensureIsArray(fullSelectOptions).filter(\n opt => !opt.isNewOption || hasOption(opt.value, selectValue),\n );\n const newOptions = newOption\n ? [newOption, ...cleanSelectOptions]\n : cleanSelectOptions;\n setSelectOptions(newOptions);\n }\n setInputValue(searchValue);\n onSearch?.(searchValue);\n }, FAST_DEBOUNCE);\n\n useEffect(() => () => handleOnSearch.cancel(), [handleOnSearch]);\n\n const handleFilterOption = (search: string, option: AntdLabeledValue) =>\n handleFilterOptionHelper(search, option, optionFilterProps, filterOption);\n\n const handleOnDropdownVisibleChange = (isDropdownVisible: boolean) => {\n setIsDropdownVisible(isDropdownVisible);\n\n // if no search input value, force sort options because it won't be sorted by\n // `filterSort`.\n if (isDropdownVisible && !inputValue && selectOptions.length > 1) {\n if (!isEqual(initialOptionsSorted, selectOptions)) {\n setSelectOptions(initialOptionsSorted);\n }\n }\n if (onDropdownVisibleChange) {\n onDropdownVisibleChange(isDropdownVisible);\n }\n };\n\n const dropdownRender = (\n originNode: ReactElement & { ref?: RefObject },\n ) =>\n dropDownRenderHelper(\n originNode,\n isDropdownVisible,\n isLoading,\n fullSelectOptions.length,\n helperText,\n );\n\n const handleClear = () => {\n clear();\n if (onClear) {\n onClear();\n }\n };\n\n useEffect(() => {\n // when `options` list is updated from component prop, reset states\n setSelectOptions(initialOptions);\n }, [initialOptions]);\n\n useEffect(() => {\n if (loading !== undefined && loading !== isLoading) {\n setIsLoading(loading);\n }\n }, [isLoading, loading]);\n\n useEffect(() => {\n setSelectValue(value);\n }, [value]);\n\n useEffect(() => {\n // if all values are selected, add select all to value\n if (\n selectAllEnabled &&\n ensureIsArray(value).length === selectAllEligible.length\n ) {\n setSelectValue(\n labelInValue\n ? ([...ensureIsArray(value), selectAllOption] as AntdLabeledValue[])\n : ([...ensureIsArray(value), SELECT_ALL_VALUE] as RawValue[]),\n );\n }\n }, [labelInValue, selectAllEligible.length, selectAllEnabled, value]);\n\n useEffect(() => {\n const checkSelectAll = ensureIsArray(selectValue).some(\n v => getValue(v) === SELECT_ALL_VALUE,\n );\n if (checkSelectAll && !selectAllMode) {\n const optionsToSelect = selectAllEligible.map(option =>\n labelInValue ? option : option.value,\n );\n optionsToSelect.push(labelInValue ? selectAllOption : SELECT_ALL_VALUE);\n setSelectValue(optionsToSelect);\n fireOnChange();\n }\n }, [\n selectValue,\n selectAllMode,\n labelInValue,\n selectAllEligible,\n fireOnChange,\n ]);\n\n const selectAllLabel = useMemo(\n () => () =>\n // TODO: localize\n `${SELECT_ALL_VALUE} (${formatNumber(\n NumberFormats.INTEGER,\n selectAllEligible.length,\n )})`,\n [selectAllEligible],\n );\n\n const handleOnBlur = (event: FocusEvent) => {\n setInputValue('');\n onBlur?.(event);\n };\n\n const handleOnChange = useCallback(\n (values: any, options: any) => {\n // intercept onChange call to handle the select all case\n // if the \"select all\" option is selected, we want to send all options to the onChange,\n // otherwise we want to remove\n let newValues = values;\n let newOptions = options;\n if (!isSingleMode) {\n if (\n ensureIsArray(newValues).some(\n val => getValue(val) === SELECT_ALL_VALUE,\n )\n ) {\n // send all options to onchange if all are not currently there\n if (!selectAllMode) {\n newValues = mapValues(selectAllEligible, labelInValue);\n newOptions = mapOptions(selectAllEligible);\n } else {\n newValues = ensureIsArray(values).filter(\n (val: any) => getValue(val) !== SELECT_ALL_VALUE,\n );\n }\n } else if (\n ensureIsArray(values).length === selectAllEligible.length &&\n selectAllMode\n ) {\n const array = selectAllEligible.filter(\n option => hasOption(option.value, selectValue) && option.disabled,\n );\n newValues = mapValues(array, labelInValue);\n newOptions = mapOptions(array);\n }\n }\n onChange?.(newValues, newOptions);\n },\n [\n isSingleMode,\n labelInValue,\n onChange,\n selectAllEligible,\n selectAllMode,\n selectValue,\n ],\n );\n\n useEffect(() => {\n if (onChangeCount !== previousChangeCount) {\n const array = ensureIsArray(selectValue);\n const set = new Set(array.map(getValue));\n const options = mapOptions(\n fullSelectOptions.filter(opt => set.has(opt.value)),\n );\n if (isSingleMode) {\n handleOnChange(selectValue, selectValue ? options[0] : undefined);\n } else {\n handleOnChange(array, options);\n }\n }\n }, [\n fullSelectOptions,\n handleOnChange,\n isSingleMode,\n onChange,\n onChangeCount,\n previousChangeCount,\n selectValue,\n ]);\n\n const shouldRenderChildrenOptions = useMemo(\n () => selectAllEnabled || hasCustomLabels(options),\n [selectAllEnabled, options],\n );\n\n const omittedCount = useMemo(() => {\n const num_selected = ensureIsArray(selectValue).length;\n const num_shown = maxTagCount as number;\n return num_selected - num_shown - (selectAllMode ? 1 : 0);\n }, [maxTagCount, selectAllMode, selectValue]);\n\n const customMaxTagPlaceholder = () =>\n `+ ${omittedCount > 0 ? omittedCount : 1} ...`;\n\n // We can't remove the + tag so when Select All\n // is the only item omitted, we subtract one from maxTagCount\n let actualMaxTagCount = maxTagCount;\n if (\n actualMaxTagCount !== 'responsive' &&\n omittedCount === 0 &&\n selectAllMode\n ) {\n actualMaxTagCount -= 1;\n }\n\n const getPastedTextValue = useCallback(\n (text: string) => {\n const option = getOption(text, fullSelectOptions, true);\n if (!option && !allowNewOptions) {\n return undefined;\n }\n if (labelInValue) {\n const value: AntdLabeledValue = {\n label: text,\n value: text,\n };\n if (option) {\n value.label = isObject(option) ? option.label : option;\n value.value = isObject(option) ? option.value! : option;\n }\n return value;\n }\n return option ? (isObject(option) ? option.value! : option) : text;\n },\n [allowNewOptions, fullSelectOptions, labelInValue],\n );\n\n const onPaste = (e: ClipboardEvent) => {\n const pastedText = e.clipboardData.getData('text');\n if (isSingleMode) {\n const value = getPastedTextValue(pastedText);\n if (value) {\n setSelectValue(value);\n }\n } else {\n const token = tokenSeparators.find(token => pastedText.includes(token));\n const array = token ? uniq(pastedText.split(token)) : [pastedText];\n const values = array\n .map(item => getPastedTextValue(item))\n .filter(item => item !== undefined);\n if (labelInValue) {\n setSelectValue(previous => [\n ...((previous || []) as AntdLabeledValue[]),\n ...(values as AntdLabeledValue[]),\n ]);\n } else {\n setSelectValue(previous => [\n ...((previous || []) as string[]),\n ...(values as string[]),\n ]);\n }\n }\n fireOnChange();\n };\n\n return (\n \n {header && (\n {header}\n )}\n triggerNode.parentNode)\n }\n headerPosition={headerPosition}\n labelInValue={labelInValue}\n maxTagCount={actualMaxTagCount}\n maxTagPlaceholder={customMaxTagPlaceholder}\n mode={mappedMode}\n notFoundContent={isLoading ? t('Loading...') : notFoundContent}\n onBlur={handleOnBlur}\n onDeselect={handleOnDeselect}\n onDropdownVisibleChange={handleOnDropdownVisibleChange}\n // @ts-ignore\n onPaste={onPaste}\n onPopupScroll={undefined}\n onSearch={shouldShowSearch ? handleOnSearch : undefined}\n onSelect={handleOnSelect}\n onClear={handleClear}\n placeholder={placeholder}\n showSearch={shouldShowSearch}\n showArrow\n tokenSeparators={tokenSeparators}\n value={selectValue}\n suffixIcon={getSuffixIcon(\n isLoading,\n shouldShowSearch,\n isDropdownVisible,\n )}\n menuItemSelectedIcon={\n invertSelection ? (\n \n ) : (\n \n )\n }\n options={shouldRenderChildrenOptions ? undefined : fullSelectOptions}\n oneLine={oneLine}\n tagRender={customTagRender}\n {...props}\n ref={ref}\n >\n {selectAllEnabled && (\n \n {selectAllLabel()}\n \n )}\n {shouldRenderChildrenOptions &&\n renderSelectOptions(fullSelectOptions)}\n \n \n );\n },\n);\n\nexport default Select;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { LabeledValue as AntdLabeledValue } from 'antd/lib/select';\nimport { rankedSearchCompare } from 'src/utils/rankedSearchCompare';\n\nexport const MAX_TAG_COUNT = 4;\n\nexport const TOKEN_SEPARATORS = [',', '\\r\\n', '\\n', '\\t', ';'];\n\nexport const EMPTY_OPTIONS = [];\n\nexport const DEFAULT_PAGE_SIZE = 100;\n\nexport const DEFAULT_SORT_COMPARATOR = (\n a: AntdLabeledValue,\n b: AntdLabeledValue,\n search?: string,\n) => {\n let aText: string | undefined;\n let bText: string | undefined;\n if (typeof a.label === 'string' && typeof b.label === 'string') {\n aText = a.label;\n bText = b.label;\n } else if (typeof a.value === 'string' && typeof b.value === 'string') {\n aText = a.value;\n bText = b.value;\n }\n // sort selected options first\n if (typeof aText === 'string' && typeof bText === 'string') {\n if (search) {\n return rankedSearchCompare(aText, bText, search);\n }\n return aText.localeCompare(bText);\n }\n return (a.value as number) - (b.value as number);\n};\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n/**\n * Sort comparator with basic rankings.\n */\nexport function rankedSearchCompare(a: string, b: string, search: string) {\n const aLower = a.toLowerCase() || '';\n const bLower = b.toLowerCase() || '';\n const searchLower = search.toLowerCase() || '';\n if (!search) return a.localeCompare(b);\n return (\n Number(b === search) - Number(a === search) ||\n Number(b.startsWith(search)) - Number(a.startsWith(search)) ||\n Number(bLower === searchLower) - Number(aLower === searchLower) ||\n Number(bLower.startsWith(searchLower)) -\n Number(aLower.startsWith(searchLower)) ||\n Number(b.includes(search)) - Number(a.includes(search)) ||\n Number(bLower.includes(searchLower)) - Number(a.includes(searchLower)) ||\n a.localeCompare(b)\n );\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { styled } from '@superset-ui/core';\nimport Icons from 'src/components/Icons';\nimport { Spin, Tag } from 'antd';\nimport AntdSelect from 'antd/lib/select';\n\nexport const StyledHeader = styled.span<{ headerPosition: string }>`\n ${({ theme, headerPosition }) => `\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n margin-right: ${headerPosition === 'left' ? theme.gridUnit * 2 : 0}px;\n `}\n`;\n\nexport const StyledContainer = styled.div<{ headerPosition: string }>`\n ${({ headerPosition }) => `\n display: flex;\n flex-direction: ${headerPosition === 'top' ? 'column' : 'row'};\n align-items: ${headerPosition === 'left' ? 'center' : undefined};\n width: 100%;\n `}\n`;\n\nexport const StyledSelect = styled(AntdSelect, {\n shouldForwardProp: prop => prop !== 'headerPosition' && prop !== 'oneLine',\n})<{ headerPosition?: string; oneLine?: boolean }>`\n ${({ theme, headerPosition, oneLine }) => `\n flex: ${headerPosition === 'left' ? 1 : 0};\n && .ant-select-selector {\n border-radius: ${theme.gridUnit}px;\n }\n // Open the dropdown when clicking on the suffix\n // This is fixed in version 4.16\n .ant-select-arrow .anticon:not(.ant-select-suffix) {\n pointer-events: none;\n }\n .select-all {\n border-bottom: 1px solid ${theme.colors.grayscale.light3};\n }\n ${\n oneLine &&\n `\n .ant-select-selection-overflow {\n flex-wrap: nowrap;\n }\n\n .ant-select-selection-overflow-item:not(.ant-select-selection-overflow-item-rest):not(.ant-select-selection-overflow-item-suffix) {\n flex-shrink: 1;\n min-width: ${theme.gridUnit * 13}px;\n }\n\n .ant-select-selection-overflow-item-suffix {\n flex: unset;\n min-width: 0px;\n }\n `\n };\n `}\n`;\n\nexport const NoElement = styled.span`\n display: none;\n`;\n\nexport const StyledTag = styled(Tag)`\n ${({ theme }) => `\n background: ${theme.colors.grayscale.light3};\n font-size: ${theme.typography.sizes.m}px;\n border: none;\n `}\n`;\n\nexport const StyledStopOutlined = styled(Icons.StopOutlined)`\n vertical-align: 0;\n`;\n\nexport const StyledCheckOutlined = styled(Icons.CheckOutlined)`\n vertical-align: 0;\n`;\n\nexport const StyledSpin = styled(Spin)`\n margin-top: ${({ theme }) => -theme.gridUnit}px;\n`;\n\nexport const StyledLoadingText = styled.div`\n ${({ theme }) => `\n margin-left: ${theme.gridUnit * 3}px;\n line-height: ${theme.gridUnit * 8}px;\n color: ${theme.colors.grayscale.light1};\n `}\n`;\n\nexport const StyledHelperText = styled.div`\n ${({ theme }) => `\n padding: ${theme.gridUnit * 2}px ${theme.gridUnit * 3}px;\n color: ${theme.colors.grayscale.base};\n font-size: ${theme.typography.sizes.s}px;\n cursor: default;\n border-bottom: 1px solid ${theme.colors.grayscale.light2};\n `}\n`;\n\nexport const StyledError = styled.div`\n ${({ theme }) => `\n display: flex;\n justify-content: center;\n align-items: flex-start;\n width: 100%;\n padding: ${theme.gridUnit * 2}px;\n color: ${theme.colors.error.base};\n & svg {\n margin-right: ${theme.gridUnit * 2}px;\n }\n `}\n`;\n\nexport const StyledErrorMessage = styled.div`\n overflow: hidden;\n text-overflow: ellipsis;\n`;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { ensureIsArray, t } from '@superset-ui/core';\nimport AntdSelect, { LabeledValue as AntdLabeledValue } from 'antd/lib/select';\nimport { ReactElement, RefObject } from 'react';\nimport Icons from 'src/components/Icons';\nimport { StyledHelperText, StyledLoadingText, StyledSpin } from './styles';\nimport { LabeledValue, RawValue, SelectOptionsType, V } from './types';\n\nconst { Option } = AntdSelect;\n\nexport const SELECT_ALL_VALUE: RawValue = 'Select All';\nexport const selectAllOption = {\n value: SELECT_ALL_VALUE,\n label: String(SELECT_ALL_VALUE),\n};\n\nexport function isObject(value: unknown): value is Record {\n return (\n value !== null &&\n typeof value === 'object' &&\n Array.isArray(value) === false\n );\n}\n\nexport function isLabeledValue(value: unknown): value is AntdLabeledValue {\n return isObject(value) && 'value' in value && 'label' in value;\n}\n\nexport function getValue(\n option: string | number | AntdLabeledValue | null | undefined,\n) {\n return isLabeledValue(option) ? option.value : option;\n}\n\nexport function isEqual(a: V | LabeledValue, b: V | LabeledValue, key: string) {\n const actualA = isObject(a) && key in a ? a[key] : a;\n const actualB = isObject(b) && key in b ? b[key] : b;\n // When comparing the values we use the equality\n // operator to automatically convert different types\n // eslint-disable-next-line eqeqeq\n return actualA == actualB;\n}\n\nexport function getOption(\n value: V,\n options?: V | LabeledValue | (V | LabeledValue)[],\n checkLabel = false,\n): V | LabeledValue {\n const optionsArray = ensureIsArray(options);\n return optionsArray.find(\n x =>\n isEqual(x, value, 'value') || (checkLabel && isEqual(x, value, 'label')),\n );\n}\n\nexport function hasOption(\n value: V,\n options?: V | LabeledValue | (V | LabeledValue)[],\n checkLabel = false,\n): boolean {\n return getOption(value, options, checkLabel) !== undefined;\n}\n\n/**\n * It creates a comparator to check for a specific property.\n * Can be used with string and number property values.\n * */\nexport const propertyComparator =\n (property: string) => (a: AntdLabeledValue, b: AntdLabeledValue) => {\n if (typeof a[property] === 'string' && typeof b[property] === 'string') {\n return a[property].localeCompare(b[property]);\n }\n return (a[property] as number) - (b[property] as number);\n };\n\nexport const sortSelectedFirstHelper = (\n a: AntdLabeledValue,\n b: AntdLabeledValue,\n selectValue:\n | string\n | number\n | RawValue[]\n | AntdLabeledValue\n | AntdLabeledValue[]\n | undefined,\n) =>\n selectValue && a.value !== undefined && b.value !== undefined\n ? Number(hasOption(b.value, selectValue)) -\n Number(hasOption(a.value, selectValue))\n : 0;\n\nexport const sortComparatorWithSearchHelper = (\n a: AntdLabeledValue,\n b: AntdLabeledValue,\n inputValue: string,\n sortCallback: (a: AntdLabeledValue, b: AntdLabeledValue) => number,\n sortComparator: (\n a: AntdLabeledValue,\n b: AntdLabeledValue,\n search?: string | undefined,\n ) => number,\n) => sortCallback(a, b) || sortComparator(a, b, inputValue);\n\nexport const sortComparatorForNoSearchHelper = (\n a: AntdLabeledValue,\n b: AntdLabeledValue,\n sortCallback: (a: AntdLabeledValue, b: AntdLabeledValue) => number,\n sortComparator: (\n a: AntdLabeledValue,\n b: AntdLabeledValue,\n search?: string | undefined,\n ) => number,\n) => sortCallback(a, b) || sortComparator(a, b, '');\n\n// use a function instead of component since every rerender of the\n// Select component will create a new component\nexport const getSuffixIcon = (\n isLoading: boolean | undefined,\n showSearch: boolean,\n isDropdownVisible: boolean,\n) => {\n if (isLoading) {\n return ;\n }\n if (showSearch && isDropdownVisible) {\n return ;\n }\n return ;\n};\n\nexport const dropDownRenderHelper = (\n originNode: ReactElement & { ref?: RefObject },\n isDropdownVisible: boolean,\n isLoading: boolean | undefined,\n optionsLength: number,\n helperText: string | undefined,\n errorComponent?: JSX.Element,\n) => {\n if (!isDropdownVisible) {\n originNode.ref?.current?.scrollTo({ top: 0 });\n }\n if (isLoading && optionsLength === 0) {\n return {t('Loading...')};\n }\n if (errorComponent) {\n return errorComponent;\n }\n return (\n <>\n {helperText && (\n {helperText}\n )}\n {originNode}\n \n );\n};\n\nexport const handleFilterOptionHelper = (\n search: string,\n option: AntdLabeledValue,\n optionFilterProps: string[],\n filterOption: boolean | Function,\n) => {\n if (typeof filterOption === 'function') {\n return filterOption(search, option);\n }\n\n if (filterOption) {\n const searchValue = search.trim().toLowerCase();\n if (optionFilterProps?.length) {\n return optionFilterProps.some(prop => {\n const optionProp = option?.[prop]\n ? String(option[prop]).trim().toLowerCase()\n : '';\n return optionProp.includes(searchValue);\n });\n }\n }\n\n return false;\n};\n\nexport const hasCustomLabels = (options: SelectOptionsType) =>\n options?.some(opt => !!opt?.customLabel);\n\nexport const renderSelectOptions = (options: SelectOptionsType) =>\n options.map(opt => {\n const isOptObject = typeof opt === 'object';\n const label = isOptObject ? opt?.label || opt.value : opt;\n const value = isOptObject ? opt.value : opt;\n const { customLabel, ...optProps } = opt;\n return (\n \n );\n });\n\nexport const mapValues = (values: SelectOptionsType, labelInValue: boolean) =>\n labelInValue\n ? values.map(opt => ({\n key: opt.value,\n value: opt.value,\n label: opt.label,\n }))\n : values.map(opt => opt.value);\n\nexport const mapOptions = (values: SelectOptionsType) =>\n values.map(opt => ({\n children: opt.label,\n key: opt.value,\n ...opt,\n }));\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { styled } from '@superset-ui/core';\nimport TagType from 'src/types/TagType';\nimport { Tag as AntdTag } from 'antd-v5';\nimport { useMemo } from 'react';\nimport { Tooltip } from 'src/components/Tooltip';\nimport { CloseOutlined } from '@ant-design/icons';\n\nconst StyledTag = styled(AntdTag)`\n ${({ theme }) => `\n margin-top: ${theme.gridUnit}px;\n margin-bottom: ${theme.gridUnit}px;\n `};\n`;\n\nexport const CustomCloseIcon = ;\n\nconst MAX_DISPLAY_CHAR = 20;\n\nconst Tag = ({\n name,\n id,\n index = undefined,\n onDelete = undefined,\n editable = false,\n onClick = undefined,\n toolTipTitle = name,\n}: TagType) => {\n const isLongTag = useMemo(() => name.length > MAX_DISPLAY_CHAR, [name]);\n const tagDisplay = isLongTag ? `${name.slice(0, MAX_DISPLAY_CHAR)}...` : name;\n\n const handleClose = () => (index ? onDelete?.(index) : null);\n\n const whatRole = onClick ? (!id ? 'button' : 'link') : undefined;\n\n const tagElem = (\n <>\n {editable ? (\n \n \n {tagDisplay}\n \n \n ) : (\n \n \n {id ? (\n \n {tagDisplay}\n \n ) : (\n tagDisplay\n )}\n \n \n )}\n \n );\n\n return tagElem;\n};\n\nexport default Tag;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { useTheme, css } from '@superset-ui/core';\nimport { Tooltip as AntdTooltip } from 'antd';\nimport {\n TooltipProps,\n TooltipPlacement as AntdTooltipPlacement,\n} from 'antd/lib/tooltip';\nimport { Global } from '@emotion/react';\n\nexport type TooltipPlacement = AntdTooltipPlacement;\n\nexport const Tooltip = (props: TooltipProps) => {\n const theme = useTheme();\n return (\n <>\n {/* Safari hack to hide browser default tooltips */}\n p {\n margin: 0;\n }\n `}\n />\n \n \n );\n};\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { createContext, useContext, useState, FC } from 'react';\n\nimport { URL_PARAMS } from 'src/constants';\nimport { getUrlParam } from 'src/utils/urlUtils';\n\ninterface UiConfigType {\n hideTitle: boolean;\n hideTab: boolean;\n hideNav: boolean;\n hideChartControls: boolean;\n}\ninterface EmbeddedUiConfigProviderProps {\n children: JSX.Element;\n}\n\nexport const UiConfigContext = createContext({\n hideTitle: false,\n hideTab: false,\n hideNav: false,\n hideChartControls: false,\n});\n\nexport const useUiConfig = () => useContext(UiConfigContext);\n\nexport const EmbeddedUiConfigProvider: FC = ({\n children,\n}) => {\n const config = getUrlParam(URL_PARAMS.uiConfig) || 0;\n const [embeddedConfig] = useState({\n hideTitle: (config & 1) !== 0,\n hideTab: (config & 2) !== 0,\n hideNav: (config & 4) !== 0,\n hideChartControls: (config & 8) !== 0,\n });\n\n return (\n \n {children}\n \n );\n};\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { Dispatch } from 'redux';\nimport { makeApi, t, getErrorText } from '@superset-ui/core';\nimport { addDangerToast } from 'src/components/MessageToasts/actions';\nimport {\n ChartConfiguration,\n DashboardInfo,\n FilterBarOrientation,\n GlobalChartCrossFilterConfig,\n RootState,\n} from 'src/dashboard/types';\nimport { onSave } from './dashboardState';\n\nexport const DASHBOARD_INFO_UPDATED = 'DASHBOARD_INFO_UPDATED';\n\n// updates partially changed dashboard info\nexport function dashboardInfoChanged(newInfo: { metadata: any }) {\n return { type: DASHBOARD_INFO_UPDATED, newInfo };\n}\nexport const SAVE_CHART_CONFIG_BEGIN = 'SAVE_CHART_CONFIG_BEGIN';\nexport const SAVE_CHART_CONFIG_COMPLETE = 'SAVE_CHART_CONFIG_COMPLETE';\nexport const SAVE_CHART_CONFIG_FAIL = 'SAVE_CHART_CONFIG_FAIL';\n\nexport const saveChartConfiguration =\n ({\n chartConfiguration,\n globalChartConfiguration,\n }: {\n chartConfiguration?: ChartConfiguration;\n globalChartConfiguration?: GlobalChartCrossFilterConfig;\n }) =>\n async (dispatch: Dispatch, getState: () => RootState) => {\n dispatch({\n type: SAVE_CHART_CONFIG_BEGIN,\n chartConfiguration,\n globalChartConfiguration,\n });\n const { id, metadata } = getState().dashboardInfo;\n\n // TODO extract this out when makeApi supports url parameters\n const updateDashboard = makeApi<\n Partial,\n { result: DashboardInfo }\n >({\n method: 'PUT',\n endpoint: `/api/v1/dashboard/${id}`,\n });\n\n try {\n const response = await updateDashboard({\n json_metadata: JSON.stringify({\n ...metadata,\n chart_configuration:\n chartConfiguration ?? metadata.chart_configuration,\n global_chart_configuration:\n globalChartConfiguration ?? metadata.global_chart_configuration,\n }),\n });\n dispatch(\n dashboardInfoChanged({\n metadata: JSON.parse(response.result.json_metadata),\n }),\n );\n dispatch({\n type: SAVE_CHART_CONFIG_COMPLETE,\n chartConfiguration,\n globalChartConfiguration,\n });\n } catch (err) {\n dispatch({\n type: SAVE_CHART_CONFIG_FAIL,\n chartConfiguration,\n globalChartConfiguration,\n });\n dispatch(addDangerToast(t('Failed to save cross-filter scoping')));\n }\n };\n\nexport const SET_FILTER_BAR_ORIENTATION = 'SET_FILTER_BAR_ORIENTATION';\n\nexport function setFilterBarOrientation(\n filterBarOrientation: FilterBarOrientation,\n) {\n return { type: SET_FILTER_BAR_ORIENTATION, filterBarOrientation };\n}\n\nexport const SET_CROSS_FILTERS_ENABLED = 'SET_CROSS_FILTERS_ENABLED';\n\nexport function setCrossFiltersEnabled(crossFiltersEnabled: boolean) {\n return { type: SET_CROSS_FILTERS_ENABLED, crossFiltersEnabled };\n}\n\nexport function saveFilterBarOrientation(orientation: FilterBarOrientation) {\n return async (dispatch: Dispatch, getState: () => RootState) => {\n const { id, metadata } = getState().dashboardInfo;\n const updateDashboard = makeApi<\n Partial,\n { result: Partial; last_modified_time: number }\n >({\n method: 'PUT',\n endpoint: `/api/v1/dashboard/${id}`,\n });\n try {\n const response = await updateDashboard({\n json_metadata: JSON.stringify({\n ...metadata,\n filter_bar_orientation: orientation,\n }),\n });\n const updatedDashboard = response.result;\n const lastModifiedTime = response.last_modified_time;\n if (updatedDashboard.json_metadata) {\n const metadata = JSON.parse(updatedDashboard.json_metadata);\n if (metadata.filter_bar_orientation) {\n dispatch(setFilterBarOrientation(metadata.filter_bar_orientation));\n }\n }\n if (lastModifiedTime) {\n dispatch(onSave(lastModifiedTime));\n }\n } catch (errorObject) {\n const errorText = await getErrorText(errorObject, 'dashboard');\n dispatch(addDangerToast(errorText));\n throw errorObject;\n }\n };\n}\n\nexport function saveCrossFiltersSetting(crossFiltersEnabled: boolean) {\n return async (dispatch: Dispatch, getState: () => RootState) => {\n const { id, metadata } = getState().dashboardInfo;\n const updateDashboard = makeApi<\n Partial,\n { result: Partial; last_modified_time: number }\n >({\n method: 'PUT',\n endpoint: `/api/v1/dashboard/${id}`,\n });\n try {\n const response = await updateDashboard({\n json_metadata: JSON.stringify({\n ...metadata,\n cross_filters_enabled: crossFiltersEnabled,\n }),\n });\n const updatedDashboard = response.result;\n const lastModifiedTime = response.last_modified_time;\n if (updatedDashboard.json_metadata) {\n const metadata = JSON.parse(updatedDashboard.json_metadata);\n dispatch(setCrossFiltersEnabled(metadata.cross_filters_enabled));\n }\n if (lastModifiedTime) {\n dispatch(onSave(lastModifiedTime));\n }\n } catch (errorObject) {\n const errorText = await getErrorText(errorObject, 'dashboard');\n dispatch(addDangerToast(errorText));\n throw errorObject;\n }\n };\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { Dispatch } from 'redux';\nimport { SupersetClient } from '@superset-ui/core';\nimport { Datasource, RootState } from 'src/dashboard/types';\n\n// update datasources index for Dashboard\nexport enum DatasourcesAction {\n SetDatasources = 'SET_DATASOURCES',\n SetDatasource = 'SET_DATASOURCE',\n}\n\nexport type DatasourcesActionPayload =\n | {\n type: DatasourcesAction.SetDatasources;\n datasources: Datasource[] | null;\n }\n | {\n type: DatasourcesAction.SetDatasource;\n key: Datasource['uid'];\n datasource: Datasource;\n };\n\nexport function setDatasources(datasources: Datasource[] | null) {\n return {\n type: DatasourcesAction.SetDatasources,\n datasources,\n };\n}\n\nexport function setDatasource(datasource: Datasource, key: string) {\n return {\n type: DatasourcesAction.SetDatasource,\n key,\n datasource,\n };\n}\n\nexport function fetchDatasourceMetadata(key: string) {\n return (dispatch: Dispatch, getState: () => RootState) => {\n const { datasources } = getState();\n const datasource = datasources[key];\n\n if (datasource) {\n return dispatch(setDatasource(datasource, key));\n }\n\n return SupersetClient.get({\n endpoint: `/superset/fetch_datasource_metadata?datasourceKey=${key}`,\n }).then(({ json }) => dispatch(setDatasource(json as Datasource, key)));\n };\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { FilterConfiguration, Filters, makeApi } from '@superset-ui/core';\nimport { Dispatch } from 'redux';\nimport { cloneDeep } from 'lodash';\nimport {\n SET_DATA_MASK_FOR_FILTER_CONFIG_FAIL,\n setDataMaskForFilterConfigComplete,\n} from 'src/dataMask/actions';\nimport { HYDRATE_DASHBOARD } from './hydrate';\nimport { dashboardInfoChanged } from './dashboardInfo';\nimport { DashboardInfo } from '../types';\n\nexport const SET_FILTER_CONFIG_BEGIN = 'SET_FILTER_CONFIG_BEGIN';\nexport interface SetFilterConfigBegin {\n type: typeof SET_FILTER_CONFIG_BEGIN;\n filterConfig: FilterConfiguration;\n}\n\nexport const SET_FILTER_CONFIG_COMPLETE = 'SET_FILTER_CONFIG_COMPLETE';\nexport interface SetFilterConfigComplete {\n type: typeof SET_FILTER_CONFIG_COMPLETE;\n filterConfig: FilterConfiguration;\n}\nexport const SET_FILTER_CONFIG_FAIL = 'SET_FILTER_CONFIG_FAIL';\nexport interface SetFilterConfigFail {\n type: typeof SET_FILTER_CONFIG_FAIL;\n filterConfig: FilterConfiguration;\n}\nexport const SET_IN_SCOPE_STATUS_OF_FILTERS = 'SET_IN_SCOPE_STATUS_OF_FILTERS';\nexport interface SetInScopeStatusOfFilters {\n type: typeof SET_IN_SCOPE_STATUS_OF_FILTERS;\n filterConfig: FilterConfiguration;\n}\n\nexport const setFilterConfiguration =\n (filterConfig: FilterConfiguration) =>\n async (dispatch: Dispatch, getState: () => any) => {\n dispatch({\n type: SET_FILTER_CONFIG_BEGIN,\n filterConfig,\n });\n const { id, metadata } = getState().dashboardInfo;\n const oldFilters = getState().nativeFilters?.filters;\n\n // TODO extract this out when makeApi supports url parameters\n const updateDashboard = makeApi<\n Partial,\n { result: DashboardInfo }\n >({\n method: 'PUT',\n endpoint: `/api/v1/dashboard/${id}`,\n });\n\n const mergedFilterConfig = filterConfig.map(filter => {\n const oldFilter = oldFilters[filter.id];\n if (!oldFilter) {\n return filter;\n }\n return { ...oldFilter, ...filter };\n });\n\n try {\n const response = await updateDashboard({\n json_metadata: JSON.stringify({\n ...metadata,\n native_filter_configuration: mergedFilterConfig,\n }),\n });\n dispatch(\n dashboardInfoChanged({\n metadata: JSON.parse(response.result.json_metadata),\n }),\n );\n dispatch({\n type: SET_FILTER_CONFIG_COMPLETE,\n filterConfig: mergedFilterConfig,\n });\n dispatch(\n setDataMaskForFilterConfigComplete(mergedFilterConfig, oldFilters),\n );\n } catch (err) {\n dispatch({\n type: SET_FILTER_CONFIG_FAIL,\n filterConfig: mergedFilterConfig,\n });\n dispatch({\n type: SET_DATA_MASK_FOR_FILTER_CONFIG_FAIL,\n filterConfig: mergedFilterConfig,\n });\n }\n };\n\nexport const setInScopeStatusOfFilters =\n (\n filterScopes: {\n filterId: string;\n chartsInScope: number[];\n tabsInScope: string[];\n }[],\n ) =>\n async (dispatch: Dispatch, getState: () => any) => {\n const filters = getState().nativeFilters?.filters;\n const filtersWithScopes = filterScopes.map(scope => ({\n ...filters[scope.filterId],\n chartsInScope: scope.chartsInScope,\n tabsInScope: scope.tabsInScope,\n }));\n dispatch({\n type: SET_IN_SCOPE_STATUS_OF_FILTERS,\n filterConfig: filtersWithScopes,\n });\n // need to update native_filter_configuration in the dashboard metadata\n const metadata = cloneDeep(getState().dashboardInfo.metadata);\n const filterConfig: FilterConfiguration =\n metadata.native_filter_configuration;\n const mergedFilterConfig = filterConfig.map(filter => {\n const filterWithScope = filtersWithScopes.find(\n scope => scope.id === filter.id,\n );\n if (!filterWithScope) {\n return filter;\n }\n return { ...filterWithScope, ...filter };\n });\n metadata.native_filter_configuration = mergedFilterConfig;\n dispatch(\n dashboardInfoChanged({\n metadata,\n }),\n );\n };\n\ntype BootstrapData = {\n nativeFilters: {\n filters: Filters;\n filtersState: object;\n };\n};\n\nexport interface SetBootstrapData {\n type: typeof HYDRATE_DASHBOARD;\n data: BootstrapData;\n}\n\nexport const SET_FOCUSED_NATIVE_FILTER = 'SET_FOCUSED_NATIVE_FILTER';\nexport interface SetFocusedNativeFilter {\n type: typeof SET_FOCUSED_NATIVE_FILTER;\n id: string;\n}\nexport const UNSET_FOCUSED_NATIVE_FILTER = 'UNSET_FOCUSED_NATIVE_FILTER';\nexport interface UnsetFocusedNativeFilter {\n type: typeof UNSET_FOCUSED_NATIVE_FILTER;\n}\n\nexport function setFocusedNativeFilter(id: string): SetFocusedNativeFilter {\n return {\n type: SET_FOCUSED_NATIVE_FILTER,\n id,\n };\n}\nexport function unsetFocusedNativeFilter(): UnsetFocusedNativeFilter {\n return {\n type: UNSET_FOCUSED_NATIVE_FILTER,\n };\n}\n\nexport const SET_HOVERED_NATIVE_FILTER = 'SET_HOVERED_NATIVE_FILTER';\nexport interface SetHoveredNativeFilter {\n type: typeof SET_HOVERED_NATIVE_FILTER;\n id: string;\n}\nexport const UNSET_HOVERED_NATIVE_FILTER = 'UNSET_HOVERED_NATIVE_FILTER';\nexport interface UnsetHoveredNativeFilter {\n type: typeof UNSET_HOVERED_NATIVE_FILTER;\n}\n\nexport function setHoveredNativeFilter(id: string): SetHoveredNativeFilter {\n return {\n type: SET_HOVERED_NATIVE_FILTER,\n id,\n };\n}\nexport function unsetHoveredNativeFilter(): UnsetHoveredNativeFilter {\n return {\n type: UNSET_HOVERED_NATIVE_FILTER,\n };\n}\n\nexport const UPDATE_CASCADE_PARENT_IDS = 'UPDATE_CASCADE_PARENT_IDS';\nexport interface UpdateCascadeParentIds {\n type: typeof UPDATE_CASCADE_PARENT_IDS;\n id: string;\n parentIds: string[];\n}\nexport function updateCascadeParentIds(\n id: string,\n parentIds: string[],\n): UpdateCascadeParentIds {\n return {\n type: UPDATE_CASCADE_PARENT_IDS,\n id,\n parentIds,\n };\n}\n\nexport type AnyFilterAction =\n | SetFilterConfigBegin\n | SetFilterConfigComplete\n | SetFilterConfigFail\n | SetInScopeStatusOfFilters\n | SetBootstrapData\n | SetFocusedNativeFilter\n | UnsetFocusedNativeFilter\n | SetHoveredNativeFilter\n | UnsetHoveredNativeFilter\n | UpdateCascadeParentIds;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport rison from 'rison';\nimport {\n DatasourceType,\n SupersetClient,\n t,\n getClientErrorObject,\n} from '@superset-ui/core';\nimport { addDangerToast } from 'src/components/MessageToasts/actions';\nimport { Dispatch } from 'redux';\nimport { Slice } from '../types';\n\nconst FETCH_SLICES_PAGE_SIZE = 200;\n\nexport function getDatasourceParameter(\n datasourceId: number,\n datasourceType: DatasourceType,\n) {\n return `${datasourceId}__${datasourceType}`;\n}\n\nexport const ADD_SLICES = 'ADD_SLICES';\nfunction addSlices(slices: { [id: number]: Slice }) {\n return { type: ADD_SLICES, payload: { slices } };\n}\n\nexport const SET_SLICES = 'SET_SLICES';\nfunction setSlices(slices: { [id: number]: Slice }) {\n return { type: SET_SLICES, payload: { slices } };\n}\n\nexport const FETCH_ALL_SLICES_STARTED = 'FETCH_ALL_SLICES_STARTED';\nfunction fetchAllSlicesStarted() {\n return { type: FETCH_ALL_SLICES_STARTED };\n}\n\nexport const FETCH_ALL_SLICES_FAILED = 'FETCH_ALL_SLICES_FAILED';\nfunction fetchAllSlicesFailed(error: string) {\n return { type: FETCH_ALL_SLICES_FAILED, payload: { error } };\n}\n\nconst parseResult = (result: any[]) =>\n result.reduce((slices, slice: any) => {\n let form_data = JSON.parse(slice.params);\n form_data = {\n ...form_data,\n // force using datasource stored in relational table prop\n datasource:\n getDatasourceParameter(slice.datasource_id, slice.datasource_type) ||\n form_data.datasource,\n };\n return {\n ...slices,\n [slice.id]: {\n slice_id: slice.id,\n slice_url: slice.url,\n slice_name: slice.slice_name,\n form_data,\n datasource_name: slice.datasource_name_text,\n datasource_url: slice.datasource_url,\n datasource_id: slice.datasource_id,\n datasource_type: slice.datasource_type,\n changed_on: new Date(slice.changed_on_utc).getTime(),\n description: slice.description,\n description_markdown: slice.description_markeddown,\n viz_type: slice.viz_type,\n modified: slice.changed_on_delta_humanized,\n changed_on_humanized: slice.changed_on_delta_humanized,\n thumbnail_url: slice.thumbnail_url,\n owners: slice.owners,\n created_by: slice.created_by,\n },\n };\n }, {});\n\nexport function updateSlices(slices: { [id: number]: Slice }) {\n return (dispatch: Dispatch) => {\n dispatch(setSlices(slices));\n };\n}\n\nexport function fetchSlices(\n userId?: number,\n filter_value?: string,\n sortColumn = 'changed_on',\n) {\n return (dispatch: Dispatch) => {\n dispatch(fetchAllSlicesStarted());\n\n const filters: {\n col: string;\n opr: string;\n value: string | number;\n }[] = filter_value\n ? [{ col: 'slice_name', opr: 'chart_all_text', value: filter_value }]\n : [];\n\n if (userId) {\n filters.push({ col: 'owners', opr: 'rel_m_m', value: userId });\n }\n\n return SupersetClient.get({\n endpoint: `/api/v1/chart/?q=${rison.encode({\n columns: [\n 'changed_on_delta_humanized',\n 'changed_on_utc',\n 'datasource_id',\n 'datasource_type',\n 'datasource_url',\n 'datasource_name_text',\n 'description_markeddown',\n 'description',\n 'id',\n 'params',\n 'slice_name',\n 'thumbnail_url',\n 'url',\n 'viz_type',\n 'owners.id',\n 'created_by.id',\n ],\n filters,\n page_size: FETCH_SLICES_PAGE_SIZE,\n order_column:\n sortColumn === 'changed_on'\n ? 'changed_on_delta_humanized'\n : sortColumn,\n order_direction: sortColumn === 'changed_on' ? 'desc' : 'asc',\n })}`,\n })\n .then(({ json }) => {\n const { result } = json;\n const slices = parseResult(result);\n return dispatch(addSlices(slices));\n })\n .catch(errorResponse =>\n getClientErrorObject(errorResponse).then(({ error }) => {\n dispatch(\n fetchAllSlicesFailed(\n error || t('Could not fetch all saved charts'),\n ),\n );\n dispatch(\n addDangerToast(\n t('Sorry there was an error fetching saved charts: ') + error,\n ),\n );\n }),\n );\n };\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport {\n Divider,\n Filter,\n FilterConfiguration,\n NativeFilterTarget,\n NativeFilterType,\n logging,\n} from '@superset-ui/core';\nimport { nanoid } from 'nanoid';\nimport { FormInstance } from 'src/components';\nimport { DASHBOARD_ROOT_ID } from 'src/dashboard/util/constants';\nimport { getInitialDataMask } from 'src/dataMask/reducer';\nimport { FilterRemoval, NativeFiltersForm } from './types';\n\nexport const REMOVAL_DELAY_SECS = 5;\n\nexport const hasCircularDependency = (\n dependencyMap: Map,\n filterId: string,\n trace: string[] = [],\n): boolean => {\n if (trace.includes(filterId)) {\n return true;\n }\n const dependencies = dependencyMap.get(filterId);\n if (dependencies) {\n return dependencies.some(dependency =>\n hasCircularDependency(dependencyMap, dependency, [...trace, filterId]),\n );\n }\n return false;\n};\n\nexport const validateForm = async (\n form: FormInstance,\n currentFilterId: string,\n setCurrentFilterId: Function,\n) => {\n try {\n let formValues: NativeFiltersForm;\n try {\n formValues = (await form.validateFields()) as NativeFiltersForm;\n } catch (error) {\n // In Jest tests in chain of tests, Ant generate `outOfDate` error so need to catch it here\n if (!error?.errorFields?.length && error?.outOfDate) {\n formValues = error.values;\n } else {\n throw error;\n }\n }\n return formValues;\n } catch (error) {\n logging.warn('Filter configuration failed:', error);\n\n if (!error.errorFields?.length) return null; // not a validation error\n\n // the name is in array format since the fields are nested\n type ErrorFields = { name: ['filters', string, string] }[];\n const errorFields = error.errorFields as ErrorFields;\n // filter id is the second item in the field name\n if (!errorFields.some(field => field.name[1] === currentFilterId)) {\n // switch to the first tab that had a validation error\n const filterError = errorFields.find(\n field => field.name[0] === 'filters',\n );\n if (filterError) {\n const filterId = filterError.name[1];\n setCurrentFilterId(filterId);\n }\n }\n return null;\n }\n};\n\nexport const createHandleSave =\n (\n filterConfigMap: Record,\n filterIds: string[],\n removedFilters: Record,\n saveForm: Function,\n values: NativeFiltersForm,\n ) =>\n async () => {\n const newFilterConfig: FilterConfiguration = filterIds\n .filter(id => !removedFilters[id])\n .map(id => {\n // create a filter config object from the form inputs\n const formInputs = values.filters?.[id];\n // if user didn't open a filter, return the original config\n if (!formInputs) return filterConfigMap[id];\n if (formInputs.type === NativeFilterType.Divider) {\n return {\n id,\n type: NativeFilterType.Divider,\n scope: {\n rootPath: [DASHBOARD_ROOT_ID],\n excluded: [],\n },\n title: formInputs.title,\n description: formInputs.description,\n };\n }\n const target: Partial = {};\n if (formInputs.dataset) {\n target.datasetId = formInputs.dataset.value;\n }\n if (formInputs.dataset && formInputs.column) {\n target.column = { name: formInputs.column };\n }\n return {\n id,\n adhoc_filters: formInputs.adhoc_filters,\n time_range: formInputs.time_range,\n controlValues: formInputs.controlValues ?? {},\n granularity_sqla: formInputs.granularity_sqla,\n requiredFirst: Object.values(formInputs.requiredFirst ?? {}).find(\n rf => rf,\n ),\n name: formInputs.name,\n filterType: formInputs.filterType,\n // for now there will only ever be one target\n targets: [target],\n defaultDataMask: formInputs.defaultDataMask ?? getInitialDataMask(),\n cascadeParentIds: formInputs.dependencies || [],\n scope: formInputs.scope,\n sortMetric: formInputs.sortMetric,\n type: formInputs.type,\n description: (formInputs.description || '').trim(),\n };\n });\n\n await saveForm(newFilterConfig);\n };\n\nexport const createHandleRemoveItem =\n (\n setRemovedFilters: (\n value:\n | ((\n prevState: Record,\n ) => Record)\n | Record,\n ) => void,\n setOrderedFilters: (\n val: string[] | ((prevState: string[]) => string[]),\n ) => void,\n setSaveAlertVisible: Function,\n ) =>\n (filterId: string) => {\n const completeFilterRemoval = (filterId: string) => {\n // the filter state will actually stick around in the form,\n // and the filterConfig/newFilterIds, but we use removedFilters\n // to mark it as removed.\n setRemovedFilters(removedFilters => ({\n ...removedFilters,\n [filterId]: { isPending: false },\n }));\n setOrderedFilters((orderedFilters: string[]) =>\n orderedFilters.filter(filter => filter !== filterId),\n );\n };\n\n // first set up the timer to completely remove it\n const timerId = window.setTimeout(() => {\n completeFilterRemoval(filterId);\n }, REMOVAL_DELAY_SECS * 1000);\n // mark the filter state as \"removal in progress\"\n setRemovedFilters(removedFilters => ({\n ...removedFilters,\n [filterId]: { isPending: true, timerId },\n }));\n setSaveAlertVisible(false);\n };\n\nexport const NATIVE_FILTER_PREFIX = 'NATIVE_FILTER-';\nexport const NATIVE_FILTER_DIVIDER_PREFIX = 'NATIVE_FILTER_DIVIDER-';\nexport const generateFilterId = (type: NativeFilterType) => {\n const prefix =\n type === NativeFilterType.NativeFilter\n ? NATIVE_FILTER_PREFIX\n : NATIVE_FILTER_DIVIDER_PREFIX;\n return `${prefix}${nanoid()}`;\n};\n\nexport const getFilterIds = (config: FilterConfiguration) =>\n config.map(filter => filter.id);\n","import { DatasourceType, NativeFilterScope } from '@superset-ui/core';\nimport { Datasource } from 'src/dashboard/types';\nimport { DASHBOARD_ROOT_ID } from './util/constants';\n/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nexport const PLACEHOLDER_DATASOURCE: Datasource = {\n id: 0,\n type: DatasourceType.Table,\n uid: '_placeholder_',\n datasource_name: '',\n table_name: '',\n columns: [],\n column_types: [],\n metrics: [],\n column_formats: {},\n currency_formats: {},\n verbose_map: {},\n main_dttm_col: '',\n description: '',\n};\n\nexport const MAIN_HEADER_HEIGHT = 53;\nexport const CLOSED_FILTER_BAR_WIDTH = 32;\nexport const OPEN_FILTER_BAR_WIDTH = 260;\nexport const OPEN_FILTER_BAR_MAX_WIDTH = 550;\nexport const FILTER_BAR_HEADER_HEIGHT = 80;\nexport const FILTER_BAR_TABS_HEIGHT = 46;\nexport const BUILDER_SIDEPANEL_WIDTH = 374;\nexport const OVERWRITE_INSPECT_FIELDS = ['css', 'json_metadata.filter_scopes'];\nexport const EMPTY_CONTAINER_Z_INDEX = 10;\n\nexport const DEFAULT_CROSS_FILTER_SCOPING: NativeFilterScope = {\n rootPath: [DASHBOARD_ROOT_ID],\n excluded: [],\n};\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport {\n AnyFilterAction,\n SET_FILTER_CONFIG_COMPLETE,\n SET_IN_SCOPE_STATUS_OF_FILTERS,\n SET_FOCUSED_NATIVE_FILTER,\n UNSET_FOCUSED_NATIVE_FILTER,\n SET_HOVERED_NATIVE_FILTER,\n UNSET_HOVERED_NATIVE_FILTER,\n UPDATE_CASCADE_PARENT_IDS,\n} from 'src/dashboard/actions/nativeFilters';\nimport { FilterConfiguration, NativeFiltersState } from '@superset-ui/core';\nimport { HYDRATE_DASHBOARD } from '../actions/hydrate';\n\nexport function getInitialState({\n filterConfig,\n state: prevState,\n}: {\n filterConfig?: FilterConfiguration;\n state?: NativeFiltersState;\n}): NativeFiltersState {\n const state: Partial = {};\n\n const filters = {};\n if (filterConfig) {\n filterConfig.forEach(filter => {\n const { id } = filter;\n filters[id] = filter;\n });\n state.filters = filters;\n } else {\n state.filters = prevState?.filters ?? {};\n }\n state.focusedFilterId = undefined;\n return state as NativeFiltersState;\n}\n\nexport default function nativeFilterReducer(\n state: NativeFiltersState = {\n filters: {},\n },\n action: AnyFilterAction,\n) {\n switch (action.type) {\n case HYDRATE_DASHBOARD:\n return {\n filters: action.data.nativeFilters.filters,\n };\n\n case SET_FILTER_CONFIG_COMPLETE:\n case SET_IN_SCOPE_STATUS_OF_FILTERS:\n return getInitialState({ filterConfig: action.filterConfig, state });\n\n case SET_FOCUSED_NATIVE_FILTER:\n return {\n ...state,\n focusedFilterId: action.id,\n };\n\n case UNSET_FOCUSED_NATIVE_FILTER:\n return {\n ...state,\n focusedFilterId: undefined,\n };\n\n case SET_HOVERED_NATIVE_FILTER:\n return {\n ...state,\n hoveredFilterId: action.id,\n };\n\n case UNSET_HOVERED_NATIVE_FILTER:\n return {\n ...state,\n hoveredFilterId: undefined,\n };\n\n case UPDATE_CASCADE_PARENT_IDS:\n return {\n ...state,\n filters: {\n ...state.filters,\n [action.id]: {\n ...state.filters[action.id],\n cascadeParentIds: action.parentIds,\n },\n },\n };\n // TODO handle SET_FILTER_CONFIG_FAIL action\n default:\n return state;\n }\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport {\n ChartProps,\n DataMaskStateWithId,\n DatasourceType,\n ExtraFormData,\n GenericDataType,\n JsonObject,\n NativeFilterScope,\n NativeFiltersState,\n} from '@superset-ui/core';\nimport { Dataset } from '@superset-ui/chart-controls';\nimport { chart } from 'src/components/Chart/chartReducer';\nimport componentTypes from 'src/dashboard/util/componentTypes';\nimport Database from 'src/types/Database';\nimport { UrlParamEntries } from 'src/utils/urlUtils';\n\nimport { UserWithPermissionsAndRoles } from 'src/types/bootstrapTypes';\nimport { ChartState } from '../explore/types';\n\nexport type { Dashboard } from 'src/types/Dashboard';\n\nexport type ChartReducerInitialState = typeof chart;\n\n// chart query built from initialState\n// Ref: https://github.com/apache/superset/blob/dcac860f3e5528ecbc39e58f045c7388adb5c3d0/superset-frontend/src/dashboard/reducers/getInitialState.js#L120\nexport interface ChartQueryPayload extends Partial {\n id: number;\n form_data?: ChartProps['rawFormData'];\n [key: string]: unknown;\n}\n\n/** Chart state of redux */\nexport type Chart = ChartState & {\n form_data: {\n viz_type: string;\n datasource: string;\n color_scheme: string;\n slice_id: number;\n };\n};\n\nexport enum FilterBarOrientation {\n Vertical = 'VERTICAL',\n Horizontal = 'HORIZONTAL',\n}\n\n// chart's cross filter scoping can have its custom value or point to the global configuration\nexport const GLOBAL_SCOPE_POINTER = 'global';\nexport type GlobalScopePointer = typeof GLOBAL_SCOPE_POINTER;\nexport type ChartCrossFiltersConfig = {\n scope: NativeFilterScope | GlobalScopePointer;\n chartsInScope: number[];\n};\nexport type GlobalChartCrossFilterConfig = {\n scope: NativeFilterScope;\n chartsInScope: number[];\n};\nexport const isCrossFilterScopeGlobal = (\n scope: NativeFilterScope | GlobalScopePointer,\n): scope is GlobalScopePointer => scope === GLOBAL_SCOPE_POINTER;\n\nexport type ChartConfiguration = {\n [chartId: number]: {\n id: number;\n crossFilters: ChartCrossFiltersConfig;\n };\n};\n\nexport type ActiveTabs = string[];\nexport type DashboardLayout = { [key: string]: LayoutItem };\nexport type DashboardLayoutState = { present: DashboardLayout };\nexport type DashboardState = {\n preselectNativeFilters?: JsonObject;\n editMode: boolean;\n isPublished: boolean;\n directPathToChild: string[];\n activeTabs: ActiveTabs;\n fullSizeChartId: number | null;\n isRefreshing: boolean;\n isFiltersRefreshing: boolean;\n hasUnsavedChanges: boolean;\n dashboardIsSaving: boolean;\n colorScheme: string;\n sliceIds: number[];\n directPathLastUpdated: number;\n focusedFilterField?: {\n chartId: number;\n column: string;\n };\n overwriteConfirmMetadata?: {\n updatedAt: string;\n updatedBy: string;\n overwriteConfirmItems: {\n keyPath: string;\n oldValue: string;\n newValue: string;\n }[];\n dashboardId: number;\n data: JsonObject;\n };\n};\nexport type DashboardInfo = {\n id: number;\n common: {\n conf: JsonObject;\n };\n userId: string;\n dash_edit_perm: boolean;\n json_metadata: string;\n metadata: {\n native_filter_configuration: JsonObject;\n chart_configuration: ChartConfiguration;\n global_chart_configuration: GlobalChartCrossFilterConfig;\n color_scheme: string;\n color_namespace: string;\n color_scheme_domain: string[];\n label_colors: JsonObject;\n shared_label_colors: string[];\n map_label_colors: JsonObject;\n cross_filters_enabled: boolean;\n };\n crossFiltersEnabled: boolean;\n filterBarOrientation: FilterBarOrientation;\n};\n\nexport type ChartsState = { [key: string]: Chart };\n\nexport type Datasource = Dataset & {\n uid: string;\n column_types: GenericDataType[];\n table_name: string;\n database?: Database;\n};\nexport type DatasourcesState = {\n [key: string]: Datasource;\n};\n\n/** Root state of redux */\nexport type RootState = {\n datasources: DatasourcesState;\n sliceEntities: JsonObject;\n charts: ChartsState;\n dashboardLayout: DashboardLayoutState;\n dashboardFilters: {};\n dashboardState: DashboardState;\n dashboardInfo: DashboardInfo;\n dataMask: DataMaskStateWithId;\n impressionId: string;\n nativeFilters: NativeFiltersState;\n user: UserWithPermissionsAndRoles;\n};\n\n/** State of dashboardLayout in redux */\nexport type Layout = { [key: string]: LayoutItem };\n\n/** State of charts in redux */\nexport type Charts = { [key: number]: Chart };\n\ntype ComponentTypesKeys = keyof typeof componentTypes;\nexport type ComponentType = (typeof componentTypes)[ComponentTypesKeys];\n\n/** State of dashboardLayout item in redux */\nexport type LayoutItem = {\n children: string[];\n parents?: string[];\n type: ComponentType;\n id: string;\n meta: {\n chartId: number;\n defaultText?: string;\n height: number;\n placeholder?: string;\n sliceName?: string;\n sliceNameOverride?: string;\n text?: string;\n uuid: string;\n width: number;\n };\n};\n\ntype ActiveFilter = {\n scope: number[];\n values: ExtraFormData;\n};\n\nexport type ActiveFilters = {\n [key: string]: ActiveFilter;\n};\n\nexport interface DashboardPermalinkState {\n dataMask: DataMaskStateWithId;\n activeTabs: string[];\n anchor: string;\n urlParams?: UrlParamEntries;\n}\n\nexport interface DashboardPermalinkValue {\n dashboardId: string;\n state: DashboardPermalinkState;\n}\n\nexport type EmbeddedDashboard = {\n uuid: string;\n dashboard_id: string;\n allowed_domains: string[];\n};\n\nexport type Slice = {\n slice_id: number;\n slice_name: string;\n description: string;\n description_markdown: string;\n form_data: any;\n slice_url: string;\n viz_type: string;\n thumbnail_url: string;\n changed_on: number;\n changed_on_humanized: string;\n modified: string;\n datasource_id: number;\n datasource_type: DatasourceType;\n datasource_url: string;\n datasource_name: string;\n owners: { id: number }[];\n created_by: { id: number };\n};\n\nexport enum MenuKeys {\n DownloadAsImage = 'download_as_image',\n ExploreChart = 'explore_chart',\n ExportCsv = 'export_csv',\n ExportPivotCsv = 'export_pivot_csv',\n ExportFullCsv = 'export_full_csv',\n ExportXlsx = 'export_xlsx',\n ExportFullXlsx = 'export_full_xlsx',\n ForceRefresh = 'force_refresh',\n Fullscreen = 'fullscreen',\n ToggleChartDescription = 'toggle_chart_description',\n ViewQuery = 'view_query',\n ViewResults = 'view_results',\n DrillToDetail = 'drill_to_detail',\n CrossFilterScoping = 'cross_filter_scoping',\n Share = 'share',\n ShareByEmail = 'share_by_email',\n CopyLink = 'copy_link',\n Download = 'download',\n SaveModal = 'save_modal',\n RefreshDashboard = 'refresh_dashboard',\n AutorefreshModal = 'autorefresh_modal',\n SetFilterMapping = 'set_filter_mapping',\n EditProperties = 'edit_properties',\n EditCss = 'edit_css',\n ToggleFullscreen = 'toggle_fullscreen',\n ManageEmbedded = 'manage_embedded',\n ManageEmailReports = 'manage_email_reports',\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nexport const CHART_TYPE = 'CHART';\nexport const COLUMN_TYPE = 'COLUMN';\nexport const DASHBOARD_HEADER_TYPE = 'HEADER';\nexport const DASHBOARD_GRID_TYPE = 'GRID';\nexport const DASHBOARD_ROOT_TYPE = 'ROOT';\nexport const DIVIDER_TYPE = 'DIVIDER';\nexport const HEADER_TYPE = 'HEADER';\nexport const MARKDOWN_TYPE = 'MARKDOWN';\nexport const NEW_COMPONENT_SOURCE_TYPE = 'NEW_COMPONENT_SOURCE';\nexport const ROW_TYPE = 'ROW';\nexport const TABS_TYPE = 'TABS';\nexport const TAB_TYPE = 'TAB';\n// Dynamic type proposes lazy loading of custom dashboard components that can be added in separate repository\nexport const DYNAMIC_TYPE = 'DYNAMIC';\n\nexport default {\n CHART_TYPE,\n COLUMN_TYPE,\n DASHBOARD_HEADER_TYPE,\n DASHBOARD_GRID_TYPE,\n DASHBOARD_ROOT_TYPE,\n DIVIDER_TYPE,\n HEADER_TYPE,\n MARKDOWN_TYPE,\n NEW_COMPONENT_SOURCE_TYPE,\n ROW_TYPE,\n TABS_TYPE,\n TAB_TYPE,\n DYNAMIC_TYPE,\n};\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n// Ids\nexport const DASHBOARD_GRID_ID = 'GRID_ID';\nexport const DASHBOARD_HEADER_ID = 'HEADER_ID';\nexport const DASHBOARD_ROOT_ID = 'ROOT_ID';\nexport const DASHBOARD_VERSION_KEY = 'DASHBOARD_VERSION_KEY';\n\nexport const NEW_COMPONENTS_SOURCE_ID = 'NEW_COMPONENTS_SOURCE_ID';\nexport const NEW_CHART_ID = 'NEW_CHART_ID';\nexport const NEW_COLUMN_ID = 'NEW_COLUMN_ID';\nexport const NEW_DIVIDER_ID = 'NEW_DIVIDER_ID';\nexport const NEW_HEADER_ID = 'NEW_HEADER_ID';\nexport const NEW_MARKDOWN_ID = 'NEW_MARKDOWN_ID';\nexport const NEW_ROW_ID = 'NEW_ROW_ID';\nexport const NEW_TAB_ID = 'NEW_TAB_ID';\nexport const NEW_TABS_ID = 'NEW_TABS_ID';\nexport const NEW_DYNAMIC_COMPONENT = 'NEW_DYNAMIC_COMPONENT';\n\n// grid constants\nexport const DASHBOARD_ROOT_DEPTH = 0;\nexport const GRID_BASE_UNIT = 8;\nexport const GRID_GUTTER_SIZE = 2 * GRID_BASE_UNIT;\nexport const GRID_COLUMN_COUNT = 12;\nexport const GRID_MIN_COLUMN_COUNT = 1;\nexport const GRID_MIN_ROW_UNITS = 5;\nexport const GRID_MAX_ROW_UNITS = 100;\nexport const GRID_MIN_ROW_HEIGHT = GRID_GUTTER_SIZE;\nexport const GRID_DEFAULT_CHART_WIDTH = 4;\n\n// Header types\nexport const SMALL_HEADER = 'SMALL_HEADER';\nexport const MEDIUM_HEADER = 'MEDIUM_HEADER';\nexport const LARGE_HEADER = 'LARGE_HEADER';\n\n// Style types\nexport const BACKGROUND_WHITE = 'BACKGROUND_WHITE';\nexport const BACKGROUND_TRANSPARENT = 'BACKGROUND_TRANSPARENT';\n\n// undo-redo\nexport const UNDO_LIMIT = 50;\n\n// save dash options\nexport const SAVE_TYPE_OVERWRITE = 'overwrite';\nexport const SAVE_TYPE_OVERWRITE_CONFIRMED = 'overwriteConfirmed';\nexport const SAVE_TYPE_NEWDASHBOARD = 'newDashboard';\n\n// default dashboard layout data size limit\n// could be overwritten by server-side config\nexport const DASHBOARD_POSITION_DATA_LIMIT = 65535;\n\n// in-component element types: can be added into\n// directPathToChild, used for in dashboard navigation and focus\nexport const IN_COMPONENT_ELEMENT_TYPES = ['LABEL'];\n\n// filter scope selector filter fields pane root id\nexport const ALL_FILTERS_ROOT = 'ALL_FILTERS_ROOT';\n\nexport enum DashboardStandaloneMode {\n None = 0,\n HideNav = 1,\n HideNavAndTitle = 2,\n Report = 3,\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { cloneDeep } from 'lodash';\nimport {\n Behavior,\n FeatureFlag,\n getChartMetadataRegistry,\n isDefined,\n isFeatureEnabled,\n} from '@superset-ui/core';\nimport { getChartIdsInFilterScope } from './getChartIdsInFilterScope';\nimport {\n ChartsState,\n DashboardInfo,\n DashboardLayout,\n GLOBAL_SCOPE_POINTER,\n isCrossFilterScopeGlobal,\n} from '../types';\nimport { DEFAULT_CROSS_FILTER_SCOPING } from '../constants';\n\nexport const isCrossFiltersEnabled = (\n metadataCrossFiltersEnabled: boolean | undefined,\n): boolean =>\n isFeatureEnabled(FeatureFlag.DashboardCrossFilters) &&\n (metadataCrossFiltersEnabled === undefined || metadataCrossFiltersEnabled);\n\nexport const getCrossFiltersConfiguration = (\n dashboardLayout: DashboardLayout,\n metadata: Pick<\n DashboardInfo['metadata'],\n 'chart_configuration' | 'global_chart_configuration'\n >,\n charts: ChartsState,\n) => {\n if (!isFeatureEnabled(FeatureFlag.DashboardCrossFilters)) {\n return undefined;\n }\n\n const globalChartConfiguration = metadata.global_chart_configuration?.scope\n ? {\n scope: metadata.global_chart_configuration.scope,\n chartsInScope: getChartIdsInFilterScope(\n metadata.global_chart_configuration.scope,\n Object.values(charts).map(chart => chart.id),\n dashboardLayout,\n ),\n }\n : {\n scope: DEFAULT_CROSS_FILTER_SCOPING,\n chartsInScope: Object.values(charts).map(chart => chart.id),\n };\n\n // If user just added cross filter to dashboard it's not saving its scope on server,\n // so we tweak it until user will update scope and will save it in server\n const chartConfiguration = {};\n Object.values(dashboardLayout).forEach(layoutItem => {\n const chartId = layoutItem.meta?.chartId;\n\n if (!isDefined(chartId)) {\n return;\n }\n\n const behaviors =\n (\n getChartMetadataRegistry().get(charts[chartId]?.form_data?.viz_type) ??\n {}\n )?.behaviors ?? [];\n\n if (behaviors.includes(Behavior.InteractiveChart)) {\n if (metadata.chart_configuration?.[chartId]) {\n // We need to clone to avoid mutating Redux state\n chartConfiguration[chartId] = cloneDeep(\n metadata.chart_configuration[chartId],\n );\n }\n if (!chartConfiguration[chartId]) {\n chartConfiguration[chartId] = {\n id: chartId,\n crossFilters: {\n scope: GLOBAL_SCOPE_POINTER,\n },\n };\n }\n chartConfiguration[chartId].crossFilters.chartsInScope =\n isCrossFilterScopeGlobal(chartConfiguration[chartId].crossFilters.scope)\n ? globalChartConfiguration.chartsInScope.filter(\n id => id !== Number(chartId),\n )\n : getChartIdsInFilterScope(\n chartConfiguration[chartId].crossFilters.scope,\n Object.values(charts).map(chart => chart.id),\n dashboardLayout,\n );\n }\n });\n\n return { chartConfiguration, globalChartConfiguration };\n};\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport querystring from 'query-string';\nimport { JsonObject } from '@superset-ui/core';\n\nconst reservedQueryParams = new Set(['standalone', 'edit']);\n\nexport type UrlParamType = 'reserved' | 'regular' | 'all';\n\n/**\n * Returns the url params that are used to customize queries\n */\nexport default function extractUrlParams(\n urlParamType: UrlParamType,\n): JsonObject {\n const queryParams = querystring.parse(window.location.search);\n return Object.entries(queryParams).reduce((acc, [key, value]) => {\n if (\n (urlParamType === 'regular' && reservedQueryParams.has(key)) ||\n (urlParamType === 'reserved' && !reservedQueryParams.has(key))\n )\n return acc;\n // if multiple url params share the same key (?foo=bar&foo=baz), they will appear as an array.\n // Only one value can be used for a given query param, so we just take the first one.\n if (Array.isArray(value)) {\n return {\n ...acc,\n [key]: value[0],\n };\n }\n return { ...acc, [key]: value };\n }, {});\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\ninterface ILayoutItem {\n [key: string]: {\n id: string;\n children: string[];\n };\n}\n\ninterface IStructure {\n childId: string;\n layout: ILayoutItem;\n}\n\nfunction findParentId(structure: IStructure): string | null {\n let parentId = null;\n if (structure) {\n const { childId, layout = {} } = structure;\n // default assignment to layout only works if value is undefined, not null\n if (layout) {\n const ids = Object.keys(layout);\n for (let i = 0; i <= ids.length - 1; i += 1) {\n const id = ids[i];\n const component = layout[id] || {};\n if (id !== childId && component?.children?.includes?.(childId)) {\n parentId = id;\n break;\n }\n }\n }\n }\n return parentId;\n}\n\nconst cache = {};\nexport default function findParentIdWithCache(\n structure: IStructure,\n): string | null {\n let parentId = null;\n if (structure) {\n const { childId, layout = {} } = structure;\n if (cache[childId]) {\n const lastParent = layout?.[cache[childId]] || {};\n if (lastParent?.children && lastParent?.children?.includes?.(childId)) {\n return lastParent.id;\n }\n }\n parentId = findParentId({ childId, layout });\n cache[childId] = parentId;\n }\n return parentId;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { NativeFilterScope } from '@superset-ui/core';\nimport { CHART_TYPE } from './componentTypes';\nimport { Layout } from '../types';\n\nexport function getChartIdsInFilterScope(\n filterScope: NativeFilterScope,\n chartIds: number[],\n layout: Layout,\n) {\n const layoutItems = Object.values(layout);\n return chartIds.filter(\n chartId =>\n !filterScope.excluded.includes(chartId) &&\n layoutItems\n .find(\n layoutItem =>\n layoutItem?.type === CHART_TYPE &&\n layoutItem.meta?.chartId === chartId,\n )\n ?.parents?.some(elementId => filterScope.rootPath.includes(elementId)),\n );\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\ninterface GetDashboardFilterKeyProps {\n chartId: string;\n column: string;\n}\n\nexport function getDashboardFilterKey({\n chartId,\n column,\n}: GetDashboardFilterKeyProps) {\n return `${chartId}_${column}`;\n}\n\nconst filterKeySplitter = /^([0-9]+)_(.*)$/;\n\nexport function getChartIdAndColumnFromFilterKey(key: string) {\n const match = filterKeySplitter.exec(key);\n if (!match) throw new Error('Cannot parse invalid filter key');\n return { chartId: parseInt(match[1], 10), column: match[2] };\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nexport default function getLocationHash() {\n return (window.location.hash || '#').substring(1);\n}\n","import {\n ColorSchemeConfig,\n FeatureFlagMap,\n JsonObject,\n LanguagePack,\n Locale,\n SequentialSchemeConfig,\n} from '@superset-ui/core';\nimport { FormatLocaleDefinition } from 'd3-format';\nimport { TimeLocaleDefinition } from 'd3-time-format';\nimport { isPlainObject } from 'lodash';\nimport { Languages } from 'src/features/home/LanguagePicker';\nimport { FlashMessage } from '../components/FlashProvider';\n\n/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nexport type User = {\n createdOn?: string;\n email?: string;\n firstName: string;\n isActive: boolean;\n isAnonymous: boolean;\n lastName: string;\n userId?: number; // optional because guest user doesn't have a user id\n username: string;\n};\n\nexport type UserRoles = Record;\nexport interface PermissionsAndRoles {\n permissions: {\n database_access?: string[];\n datasource_access?: string[];\n };\n roles: UserRoles;\n}\n\nexport type UserWithPermissionsAndRoles = User & PermissionsAndRoles;\n\nexport type UndefinedUser = {};\n\nexport type BootstrapUser = UserWithPermissionsAndRoles | undefined;\n\nexport type Dashboard = {\n dttm: number;\n id: number;\n url: string;\n title: string;\n creator?: string;\n creator_url?: string;\n};\n\nexport type DashboardData = {\n dashboard_title?: string;\n created_on_delta_humanized?: string;\n url: string;\n};\n\nexport type DashboardResponse = {\n result: DashboardData[];\n};\n\nexport type ChartData = {\n slice_name: string;\n created_on_delta_humanized?: string;\n url: string;\n};\n\nexport type ChartResponse = {\n result: ChartData[];\n};\n\nexport interface BrandProps {\n path: string;\n icon: string;\n alt: string;\n tooltip: string;\n text: string;\n}\n\nexport interface NavBarProps {\n show_watermark: boolean;\n bug_report_url?: string;\n bug_report_text?: string;\n bug_report_icon?: string;\n version_string?: string;\n version_sha?: string;\n build_number?: string;\n documentation_url?: string;\n documentation_text?: string;\n documentation_icon?: string;\n languages: Languages;\n show_language_picker: boolean;\n user_is_anonymous: boolean;\n user_info_url: string;\n user_login_url: string;\n user_logout_url: string;\n locale: string;\n}\n\nexport interface MenuObjectChildProps {\n label: string;\n name?: string;\n icon?: string;\n index?: number;\n url?: string;\n onClick?: () => void;\n isFrontendRoute?: boolean;\n perm?: string | boolean;\n view?: string;\n disable?: boolean;\n}\n\nexport interface MenuObjectProps extends MenuObjectChildProps {\n childs?: (MenuObjectChildProps | string)[];\n isHeader?: boolean;\n}\n\nexport interface MenuData {\n menu: MenuObjectProps[];\n brand: BrandProps;\n navbar_right: NavBarProps;\n settings: MenuObjectProps[];\n environment_tag: {\n text: string;\n color: string;\n };\n}\n\nexport interface CommonBootstrapData {\n flash_messages: FlashMessage[];\n conf: JsonObject;\n locale: Locale;\n feature_flags: FeatureFlagMap;\n language_pack: LanguagePack;\n extra_categorical_color_schemes: ColorSchemeConfig[];\n extra_sequential_color_schemes: SequentialSchemeConfig[];\n theme_overrides: JsonObject;\n menu_data: MenuData;\n d3_format: Partial;\n d3_time_format: Partial;\n}\n\nexport interface BootstrapData {\n user?: BootstrapUser;\n common: CommonBootstrapData;\n config?: any;\n embedded?: {\n dashboard_id: string;\n };\n requested_query?: JsonObject;\n}\n\nexport function isUser(user: any): user is User {\n return isPlainObject(user) && 'username' in user;\n}\n\nexport function isUserWithPermissionsAndRoles(\n user: any,\n): user is UserWithPermissionsAndRoles {\n return isUser(user) && 'permissions' in user && 'roles' in user;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { isFeatureEnabled, FeatureFlag } from '@superset-ui/core';\nimport {\n isUserWithPermissionsAndRoles,\n UndefinedUser,\n UserWithPermissionsAndRoles,\n} from 'src/types/bootstrapTypes';\nimport { Dashboard } from 'src/types/Dashboard';\nimport { findPermission } from 'src/utils/findPermission';\n\n// this should really be a config value,\n// but is hardcoded in backend logic already, so...\nconst ADMIN_ROLE_NAME = 'admin';\n\nexport const isUserAdmin = (\n user?: UserWithPermissionsAndRoles | UndefinedUser,\n) =>\n isUserWithPermissionsAndRoles(user) &&\n Object.keys(user.roles || {}).some(\n role => role.toLowerCase() === ADMIN_ROLE_NAME,\n );\n\nconst isUserDashboardOwner = (\n dashboard: Dashboard,\n user: UserWithPermissionsAndRoles | UndefinedUser,\n) =>\n isUserWithPermissionsAndRoles(user) &&\n dashboard.owners.some(owner => owner.id === user.userId);\n\nexport const canUserEditDashboard = (\n dashboard: Dashboard,\n user?: UserWithPermissionsAndRoles | UndefinedUser | null,\n) =>\n isUserWithPermissionsAndRoles(user) &&\n (isUserAdmin(user) || isUserDashboardOwner(dashboard, user)) &&\n findPermission('can_write', 'Dashboard', user?.roles);\n\nexport function userHasPermission(\n user: UserWithPermissionsAndRoles | UndefinedUser,\n viewName: string,\n permissionName: string,\n) {\n return (\n isUserAdmin(user) ||\n (isUserWithPermissionsAndRoles(user) &&\n Object.values(user.roles || {})\n .flat()\n .some(\n permissionView =>\n permissionView[0] === permissionName &&\n permissionView[1] === viewName,\n ))\n );\n}\n\nexport const canUserSaveAsDashboard = (\n dashboard: Dashboard,\n user?: UserWithPermissionsAndRoles | UndefinedUser | null,\n) =>\n isUserWithPermissionsAndRoles(user) &&\n findPermission('can_write', 'Dashboard', user?.roles) &&\n (!isFeatureEnabled(FeatureFlag.DashboardRbac) ||\n isUserAdmin(user) ||\n isUserDashboardOwner(dashboard, user));\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { DataMask, FilterConfiguration, Filters } from '@superset-ui/core';\nimport { getInitialDataMask } from './reducer';\n\nexport const CLEAR_DATA_MASK_STATE = 'CLEAR_DATA_MASK_STATE';\nexport interface ClearDataMaskState {\n type: typeof CLEAR_DATA_MASK_STATE;\n}\n\nexport const UPDATE_DATA_MASK = 'UPDATE_DATA_MASK';\nexport interface UpdateDataMask {\n type: typeof UPDATE_DATA_MASK;\n filterId: string | number;\n dataMask: DataMask;\n}\n\nexport const INIT_DATAMASK = 'INIT_DATAMASK';\nexport interface INITDATAMASK {\n type: typeof INIT_DATAMASK;\n dataMask: DataMask;\n}\n\nexport const SET_DATA_MASK_FOR_FILTER_CONFIG_COMPLETE =\n 'SET_DATA_MASK_FOR_FILTER_CONFIG_COMPLETE';\n\nexport interface SetDataMaskForFilterConfigComplete {\n type: typeof SET_DATA_MASK_FOR_FILTER_CONFIG_COMPLETE;\n filterConfig: FilterConfiguration;\n filters?: Filters;\n}\n\nexport const SET_DATA_MASK_FOR_FILTER_CONFIG_FAIL =\n 'SET_DATA_MASK_FOR_FILTER_CONFIG_FAIL';\n\nexport interface SetDataMaskForFilterConfigFail {\n type: typeof SET_DATA_MASK_FOR_FILTER_CONFIG_FAIL;\n filterConfig: FilterConfiguration;\n}\nexport function setDataMaskForFilterConfigComplete(\n filterConfig: FilterConfiguration,\n filters?: Filters,\n): SetDataMaskForFilterConfigComplete {\n return {\n type: SET_DATA_MASK_FOR_FILTER_CONFIG_COMPLETE,\n filterConfig,\n filters,\n };\n}\nexport function updateDataMask(\n filterId: string | number,\n dataMask: DataMask,\n): UpdateDataMask {\n return {\n type: UPDATE_DATA_MASK,\n filterId,\n dataMask,\n };\n}\n\nexport function clearDataMask(filterId: string | number) {\n return updateDataMask(filterId, getInitialDataMask(filterId));\n}\n\nexport function clearDataMaskState(): ClearDataMaskState {\n return {\n type: CLEAR_DATA_MASK_STATE,\n };\n}\n\nexport type AnyDataMaskAction =\n | ClearDataMaskState\n | UpdateDataMask\n | SetDataMaskForFilterConfigFail\n | SetDataMaskForFilterConfigComplete;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n/* eslint-disable no-param-reassign */\n// <- When we work with Immer, we need reassign, so disabling lint\nimport produce from 'immer';\nimport {\n DataMask,\n DataMaskStateWithId,\n DataMaskWithId,\n isFeatureEnabled,\n FeatureFlag,\n Filter,\n FilterConfiguration,\n Filters,\n} from '@superset-ui/core';\nimport { NATIVE_FILTER_PREFIX } from 'src/dashboard/components/nativeFilters/FiltersConfigModal/utils';\nimport { HYDRATE_DASHBOARD } from 'src/dashboard/actions/hydrate';\nimport {\n AnyDataMaskAction,\n CLEAR_DATA_MASK_STATE,\n SET_DATA_MASK_FOR_FILTER_CONFIG_COMPLETE,\n UPDATE_DATA_MASK,\n} from './actions';\nimport { areObjectsEqual } from '../reduxUtils';\n\nexport function getInitialDataMask(\n id?: string | number,\n moreProps?: DataMask,\n): DataMask;\nexport function getInitialDataMask(\n id: string | number,\n moreProps: DataMask = {},\n): DataMaskWithId {\n let otherProps = {};\n if (id) {\n otherProps = {\n id,\n };\n }\n return {\n ...otherProps,\n extraFormData: {},\n filterState: {},\n ownState: {},\n ...moreProps,\n } as DataMaskWithId;\n}\n\nfunction fillNativeFilters(\n filterConfig: FilterConfiguration,\n mergedDataMask: DataMaskStateWithId,\n draftDataMask: DataMaskStateWithId,\n initialDataMask?: DataMaskStateWithId,\n currentFilters?: Filters,\n) {\n filterConfig.forEach((filter: Filter) => {\n const dataMask = initialDataMask || {};\n mergedDataMask[filter.id] = {\n ...getInitialDataMask(filter.id), // take initial data\n ...filter.defaultDataMask, // if something new came from BE - take it\n ...dataMask[filter.id],\n };\n if (\n currentFilters &&\n !areObjectsEqual(\n filter.defaultDataMask,\n currentFilters[filter.id]?.defaultDataMask,\n { ignoreUndefined: true },\n )\n ) {\n mergedDataMask[filter.id] = {\n ...mergedDataMask[filter.id],\n ...filter.defaultDataMask,\n };\n }\n });\n\n // Get back all other non-native filters\n Object.values(draftDataMask).forEach(filter => {\n if (!String(filter?.id).startsWith(NATIVE_FILTER_PREFIX)) {\n mergedDataMask[filter?.id] = filter;\n }\n });\n}\n\nconst dataMaskReducer = produce(\n (draft: DataMaskStateWithId, action: AnyDataMaskAction) => {\n const cleanState = {};\n switch (action.type) {\n case CLEAR_DATA_MASK_STATE:\n return cleanState;\n case UPDATE_DATA_MASK:\n draft[action.filterId] = {\n ...getInitialDataMask(action.filterId),\n ...draft[action.filterId],\n ...action.dataMask,\n };\n return draft;\n // TODO: update hydrate to .ts\n // @ts-ignore\n case HYDRATE_DASHBOARD:\n if (isFeatureEnabled(FeatureFlag.DashboardCrossFilters)) {\n Object.keys(\n // @ts-ignore\n action.data.dashboardInfo?.metadata?.chart_configuration,\n ).forEach(id => {\n cleanState[id] = {\n ...getInitialDataMask(id), // take initial data\n };\n });\n }\n fillNativeFilters(\n // @ts-ignore\n action.data.dashboardInfo?.metadata?.native_filter_configuration ??\n [],\n cleanState,\n draft,\n // @ts-ignore\n action.data.dataMask,\n );\n return cleanState;\n case SET_DATA_MASK_FOR_FILTER_CONFIG_COMPLETE:\n fillNativeFilters(\n action.filterConfig ?? [],\n cleanState,\n draft,\n action.filters,\n );\n return cleanState;\n\n default:\n return draft;\n }\n },\n {},\n);\n\nexport default dataMaskReducer;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { Dispatch, AnyAction } from 'redux';\nimport { ThunkDispatch } from 'redux-thunk';\nimport { Dataset } from '@superset-ui/chart-controls';\nimport { SupersetClient, getClientErrorObject } from '@superset-ui/core';\nimport { addDangerToast } from 'src/components/MessageToasts/actions';\nimport { updateFormDataByDatasource } from './exploreActions';\nimport { ExplorePageState } from '../types';\n\nexport const SET_DATASOURCE = 'SET_DATASOURCE';\nexport interface SetDatasource {\n type: string;\n datasource: Dataset;\n}\nexport function setDatasource(datasource: Dataset) {\n return { type: SET_DATASOURCE, datasource };\n}\n\nexport function changeDatasource(newDatasource: Dataset) {\n return function (dispatch: Dispatch, getState: () => ExplorePageState) {\n const {\n explore: { datasource: prevDatasource },\n } = getState();\n dispatch(setDatasource(newDatasource));\n dispatch(updateFormDataByDatasource(prevDatasource, newDatasource));\n };\n}\n\nexport function saveDataset({\n schema,\n sql,\n database,\n templateParams,\n datasourceName,\n columns,\n}: Omit & { database: { id: number } }) {\n return async function (dispatch: ThunkDispatch) {\n // Create a dataset object\n try {\n const {\n json: { data },\n } = await SupersetClient.post({\n endpoint: '/api/v1/dataset/',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n database: database?.id,\n table_name: datasourceName,\n schema,\n sql,\n template_params: templateParams,\n columns,\n }),\n });\n // Update form_data to point to new dataset\n dispatch(changeDatasource(data));\n return data;\n } catch (error) {\n getClientErrorObject(error).then(e => {\n dispatch(addDangerToast(e.error));\n });\n throw error;\n }\n };\n}\n\nexport const datasourcesActions = {\n setDatasource,\n changeDatasource,\n saveDataset,\n};\n\nexport type AnyDatasourcesAction = SetDatasource;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n/* eslint camelcase: 0 */\nimport rison from 'rison';\nimport { Dataset } from '@superset-ui/chart-controls';\nimport { t, SupersetClient, QueryFormData } from '@superset-ui/core';\nimport { Dispatch } from 'redux';\nimport {\n addDangerToast,\n toastActions,\n} from 'src/components/MessageToasts/actions';\nimport { Slice } from 'src/types/Chart';\nimport { SaveActionType } from 'src/explore/types';\n\nexport const UPDATE_FORM_DATA_BY_DATASOURCE = 'UPDATE_FORM_DATA_BY_DATASOURCE';\nexport function updateFormDataByDatasource(\n prevDatasource: Dataset,\n newDatasource: Dataset,\n) {\n return {\n type: UPDATE_FORM_DATA_BY_DATASOURCE,\n prevDatasource,\n newDatasource,\n };\n}\n\nexport const POST_DATASOURCE_STARTED = 'POST_DATASOURCE_STARTED';\nexport const FETCH_DATASOURCE_SUCCEEDED = 'FETCH_DATASOURCE_SUCCEEDED';\nexport function fetchDatasourceSucceeded() {\n return { type: FETCH_DATASOURCE_SUCCEEDED };\n}\n\nexport const FETCH_DATASOURCES_STARTED = 'FETCH_DATASOURCES_STARTED';\nexport function fetchDatasourcesStarted() {\n return { type: FETCH_DATASOURCES_STARTED };\n}\n\nexport const FETCH_DATASOURCES_SUCCEEDED = 'FETCH_DATASOURCES_SUCCEEDED';\nexport function fetchDatasourcesSucceeded() {\n return { type: FETCH_DATASOURCES_SUCCEEDED };\n}\n\nexport const TOGGLE_FAVE_STAR = 'TOGGLE_FAVE_STAR';\nexport function toggleFaveStar(isStarred: boolean) {\n return { type: TOGGLE_FAVE_STAR, isStarred };\n}\n\nexport const FETCH_FAVE_STAR = 'FETCH_FAVE_STAR';\nexport function fetchFaveStar(sliceId: string) {\n return function (dispatch: Dispatch) {\n SupersetClient.get({\n endpoint: `/api/v1/chart/favorite_status/?q=${rison.encode([sliceId])}`,\n }).then(({ json }) => {\n dispatch(toggleFaveStar(!!json?.result?.[0]?.value));\n });\n };\n}\n\nexport const SAVE_FAVE_STAR = 'SAVE_FAVE_STAR';\nexport function saveFaveStar(sliceId: string, isStarred: boolean) {\n return function (dispatch: Dispatch) {\n const endpoint = `/api/v1/chart/${sliceId}/favorites/`;\n const apiCall = isStarred\n ? SupersetClient.delete({\n endpoint,\n })\n : SupersetClient.post({ endpoint });\n\n apiCall\n .then(() => dispatch(toggleFaveStar(!isStarred)))\n .catch(() => {\n dispatch(\n addDangerToast(t('An error occurred while starring this chart')),\n );\n });\n };\n}\n\nexport const SET_FIELD_VALUE = 'SET_FIELD_VALUE';\nexport function setControlValue(\n controlName: string,\n value: any,\n validationErrors?: any[],\n) {\n return { type: SET_FIELD_VALUE, controlName, value, validationErrors };\n}\n\nexport const SET_EXPLORE_CONTROLS = 'UPDATE_EXPLORE_CONTROLS';\nexport function setExploreControls(formData: QueryFormData) {\n return { type: SET_EXPLORE_CONTROLS, formData };\n}\n\nexport const SET_FORM_DATA = 'UPDATE_FORM_DATA';\nexport function setFormData(formData: QueryFormData) {\n return { type: SET_FORM_DATA, formData };\n}\n\nexport const UPDATE_CHART_TITLE = 'UPDATE_CHART_TITLE';\nexport function updateChartTitle(sliceName: string) {\n return { type: UPDATE_CHART_TITLE, sliceName };\n}\n\nexport const SET_SAVE_ACTION = 'SET_SAVE_ACTION';\nexport function setSaveAction(saveAction: SaveActionType | null) {\n return { type: SET_SAVE_ACTION, saveAction };\n}\n\nexport const CREATE_NEW_SLICE = 'CREATE_NEW_SLICE';\nexport function createNewSlice(\n can_add: boolean,\n can_download: boolean,\n can_overwrite: boolean,\n slice: Slice,\n form_data: QueryFormData,\n) {\n return {\n type: CREATE_NEW_SLICE,\n can_add,\n can_download,\n can_overwrite,\n slice,\n form_data,\n };\n}\n\nexport const SLICE_UPDATED = 'SLICE_UPDATED';\nexport function sliceUpdated(slice: Slice) {\n return { type: SLICE_UPDATED, slice };\n}\n\nexport const SET_FORCE_QUERY = 'SET_FORCE_QUERY';\nexport function setForceQuery(force: boolean) {\n return {\n type: SET_FORCE_QUERY,\n force,\n };\n}\n\nexport const SET_STASH_FORM_DATA = 'SET_STASH_FORM_DATA';\nexport function setStashFormData(\n isHidden: boolean,\n fieldNames: ReadonlyArray,\n) {\n return {\n type: SET_STASH_FORM_DATA,\n isHidden,\n fieldNames,\n };\n}\n\nexport const exploreActions = {\n ...toastActions,\n fetchDatasourcesStarted,\n fetchDatasourcesSucceeded,\n toggleFaveStar,\n fetchFaveStar,\n saveFaveStar,\n setControlValue,\n setExploreControls,\n setStashFormData,\n updateChartTitle,\n createNewSlice,\n sliceUpdated,\n setForceQuery,\n};\n\nexport type ExploreActions = typeof exploreActions;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { ControlStateMapping } from '@superset-ui/chart-controls';\n\nimport {\n ChartState,\n ExplorePageInitialData,\n ExplorePageState,\n} from 'src/explore/types';\nimport { getChartKey } from 'src/explore/exploreUtils';\nimport { getControlsState } from 'src/explore/store';\nimport { Dispatch } from 'redux';\nimport {\n ensureIsArray,\n getCategoricalSchemeRegistry,\n getColumnLabel,\n getSequentialSchemeRegistry,\n NO_TIME_RANGE,\n QueryFormColumn,\n} from '@superset-ui/core';\nimport {\n getFormDataFromControls,\n applyMapStateToPropsToControl,\n} from 'src/explore/controlUtils';\nimport { getDatasourceUid } from 'src/utils/getDatasourceUid';\nimport { getUrlParam } from 'src/utils/urlUtils';\nimport { URL_PARAMS } from 'src/constants';\nimport { findPermission } from 'src/utils/findPermission';\n\nenum ColorSchemeType {\n CATEGORICAL = 'CATEGORICAL',\n SEQUENTIAL = 'SEQUENTIAL',\n}\n\nexport const HYDRATE_EXPLORE = 'HYDRATE_EXPLORE';\nexport const hydrateExplore =\n ({\n form_data,\n slice,\n dataset,\n metadata,\n saveAction = null,\n }: ExplorePageInitialData) =>\n (dispatch: Dispatch, getState: () => ExplorePageState) => {\n const { user, datasources, charts, sliceEntities, common, explore } =\n getState();\n\n const sliceId = getUrlParam(URL_PARAMS.sliceId);\n const dashboardId = getUrlParam(URL_PARAMS.dashboardId);\n const fallbackSlice = sliceId ? sliceEntities?.slices?.[sliceId] : null;\n const initialSlice = slice ?? fallbackSlice;\n const initialFormData = form_data ?? initialSlice?.form_data;\n if (!initialFormData.viz_type) {\n const defaultVizType = common?.conf.DEFAULT_VIZ_TYPE || 'table';\n initialFormData.viz_type =\n getUrlParam(URL_PARAMS.vizType) || defaultVizType;\n }\n if (!initialFormData.time_range) {\n initialFormData.time_range =\n common?.conf?.DEFAULT_TIME_FILTER || NO_TIME_RANGE;\n }\n if (\n initialFormData.include_time &&\n initialFormData.granularity_sqla &&\n !initialFormData.groupby?.some(\n (col: QueryFormColumn) =>\n getColumnLabel(col) ===\n getColumnLabel(initialFormData.granularity_sqla!),\n )\n ) {\n initialFormData.groupby = [\n initialFormData.granularity_sqla,\n ...ensureIsArray(initialFormData.groupby),\n ];\n initialFormData.granularity_sqla = undefined;\n }\n\n if (dashboardId) {\n initialFormData.dashboardId = dashboardId;\n }\n\n const initialDatasource = dataset;\n\n const initialExploreState = {\n form_data: initialFormData,\n slice: initialSlice,\n datasource: initialDatasource,\n };\n const initialControls = getControlsState(\n initialExploreState,\n initialFormData,\n ) as ControlStateMapping;\n const colorSchemeKey = initialControls.color_scheme && 'color_scheme';\n const linearColorSchemeKey =\n initialControls.linear_color_scheme && 'linear_color_scheme';\n // if the selected color scheme does not exist anymore\n // fallbacks and selects the available default one\n const verifyColorScheme = (type: ColorSchemeType) => {\n const schemes =\n type === 'CATEGORICAL'\n ? getCategoricalSchemeRegistry()\n : getSequentialSchemeRegistry();\n const key =\n type === 'CATEGORICAL' ? colorSchemeKey : linearColorSchemeKey;\n const registryDefaultScheme = schemes.defaultKey;\n const defaultScheme =\n type === 'CATEGORICAL' ? 'supersetColors' : 'superset_seq_1';\n const currentScheme = initialFormData[key];\n const colorSchemeExists = !!schemes.get(currentScheme, true);\n\n if (currentScheme && !colorSchemeExists) {\n initialControls[key].value = registryDefaultScheme || defaultScheme;\n }\n };\n\n if (colorSchemeKey) verifyColorScheme(ColorSchemeType.CATEGORICAL);\n if (linearColorSchemeKey) verifyColorScheme(ColorSchemeType.SEQUENTIAL);\n\n const exploreState = {\n // note this will add `form_data` to state,\n // which will be manipulable by future reducers.\n can_add: findPermission('can_write', 'Chart', user?.roles),\n can_download: findPermission('can_csv', 'Superset', user?.roles),\n can_overwrite: ensureIsArray(slice?.owners).includes(\n user?.userId as number,\n ),\n isDatasourceMetaLoading: false,\n isStarred: false,\n triggerRender: false,\n // duplicate datasource in exploreState - it's needed by getControlsState\n datasource: initialDatasource,\n // Initial control state will skip `control.mapStateToProps`\n // because `bootstrapData.controls` is undefined.\n controls: initialControls,\n form_data: initialFormData,\n slice: initialSlice,\n controlsTransferred: explore.controlsTransferred,\n standalone: getUrlParam(URL_PARAMS.standalone),\n force: getUrlParam(URL_PARAMS.force),\n metadata,\n saveAction,\n common,\n };\n\n // apply initial mapStateToProps for all controls, must execute AFTER\n // bootstrapState has initialized `controls`. Order of execution is not\n // guaranteed, so controls shouldn't rely on each other's mapped state.\n Object.entries(exploreState.controls).forEach(([key, controlState]) => {\n exploreState.controls[key] = applyMapStateToPropsToControl(\n controlState,\n exploreState,\n );\n });\n const sliceFormData = initialSlice\n ? getFormDataFromControls(initialControls)\n : null;\n\n const chartKey: number = getChartKey(initialExploreState);\n const chart: ChartState = {\n id: chartKey,\n chartAlert: null,\n chartStatus: null,\n chartStackTrace: null,\n chartUpdateEndTime: null,\n chartUpdateStartTime: 0,\n latestQueryFormData: getFormDataFromControls(exploreState.controls),\n sliceFormData,\n queryController: null,\n queriesResponse: null,\n triggerQuery: false,\n lastRendered: 0,\n };\n\n return dispatch({\n type: HYDRATE_EXPLORE,\n data: {\n charts: {\n ...charts,\n [chartKey]: chart,\n },\n datasources: {\n ...datasources,\n [getDatasourceUid(initialDatasource)]: initialDatasource,\n },\n saveModal: {\n dashboards: [],\n saveModalAlert: null,\n isVisible: false,\n },\n explore: exploreState,\n },\n });\n };\n\nexport type HydrateExplore = {\n type: typeof HYDRATE_EXPLORE;\n data: ExplorePageState;\n};\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport rison from 'rison';\nimport { Dispatch } from 'redux';\nimport {\n DatasourceType,\n type QueryFormData,\n SimpleAdhocFilter,\n SupersetClient,\n t,\n} from '@superset-ui/core';\nimport { addSuccessToast } from 'src/components/MessageToasts/actions';\nimport { isEmpty } from 'lodash';\nimport { Slice } from 'src/dashboard/types';\nimport { Operators } from '../constants';\nimport { buildV1ChartDataPayload } from '../exploreUtils';\n\nexport interface PayloadSlice extends Slice {\n params: string;\n dashboards: number[];\n query_context: string;\n}\nconst ADHOC_FILTER_REGEX = /^adhoc_filters/;\n\nexport const FETCH_DASHBOARDS_SUCCEEDED = 'FETCH_DASHBOARDS_SUCCEEDED';\nexport function fetchDashboardsSucceeded(choices: string[]) {\n return { type: FETCH_DASHBOARDS_SUCCEEDED, choices };\n}\n\nexport const FETCH_DASHBOARDS_FAILED = 'FETCH_DASHBOARDS_FAILED';\nexport function fetchDashboardsFailed(userId: string) {\n return { type: FETCH_DASHBOARDS_FAILED, userId };\n}\n\nexport const SET_SAVE_CHART_MODAL_VISIBILITY =\n 'SET_SAVE_CHART_MODAL_VISIBILITY';\nexport function setSaveChartModalVisibility(isVisible: boolean) {\n return { type: SET_SAVE_CHART_MODAL_VISIBILITY, isVisible };\n}\n\nexport const SAVE_SLICE_FAILED = 'SAVE_SLICE_FAILED';\nexport function saveSliceFailed() {\n return { type: SAVE_SLICE_FAILED };\n}\n\nexport const SAVE_SLICE_SUCCESS = 'SAVE_SLICE_SUCCESS';\nexport function saveSliceSuccess(data: Partial) {\n return { type: SAVE_SLICE_SUCCESS, data };\n}\n\nfunction extractAdhocFiltersFromFormData(\n formDataToHandle: QueryFormData,\n): Partial {\n const result: Partial = {};\n Object.entries(formDataToHandle).forEach(([key, value]) => {\n if (ADHOC_FILTER_REGEX.test(key) && Array.isArray(value)) {\n result[key] = (value as SimpleAdhocFilter[]).filter(\n (f: SimpleAdhocFilter) => !f.isExtra,\n );\n }\n });\n return result;\n}\n\nconst hasTemporalRangeFilter = (formData: Partial): boolean =>\n (formData?.adhoc_filters || []).some(\n (filter: SimpleAdhocFilter) => filter.operator === Operators.TemporalRange,\n );\n\nexport const getSlicePayload = (\n sliceName: string,\n formDataWithNativeFilters: QueryFormData = {} as QueryFormData,\n dashboards: number[],\n owners: [],\n formDataFromSlice: QueryFormData = {} as QueryFormData,\n): Partial => {\n const adhocFilters: Partial = extractAdhocFiltersFromFormData(\n formDataWithNativeFilters,\n );\n\n if (\n !isEmpty(formDataFromSlice) &&\n formDataWithNativeFilters.adhoc_filters &&\n formDataWithNativeFilters.adhoc_filters.length > 0\n ) {\n Object.keys(adhocFilters).forEach(adhocFilterKey => {\n if (isEmpty(adhocFilters[adhocFilterKey])) {\n const sourceFilters = formDataFromSlice[adhocFilterKey];\n if (Array.isArray(sourceFilters)) {\n const targetArray = adhocFilters[adhocFilterKey] || [];\n sourceFilters.forEach(filter => {\n if (filter.operator === Operators.TemporalRange) {\n targetArray.push({\n ...filter,\n comparator: filter.comparator || 'No filter',\n });\n }\n });\n adhocFilters[adhocFilterKey] = targetArray;\n }\n }\n });\n }\n\n if (!hasTemporalRangeFilter(adhocFilters)) {\n const adhocFiltersKeys = Object.keys(formDataWithNativeFilters).filter(\n key => ADHOC_FILTER_REGEX.test(key),\n );\n adhocFiltersKeys?.forEach(filtersKey => {\n formDataWithNativeFilters[filtersKey]?.forEach(\n (filter: SimpleAdhocFilter) => {\n if (filter.operator === Operators.TemporalRange && filter.isExtra) {\n if (!adhocFilters[filtersKey]) {\n adhocFilters[filtersKey] = [];\n }\n adhocFilters[filtersKey].push({\n ...filter,\n comparator: 'No filter',\n });\n }\n },\n );\n });\n }\n const formData = {\n ...formDataWithNativeFilters,\n ...adhocFilters,\n dashboards,\n };\n let datasourceId = 0;\n let datasourceType: DatasourceType = DatasourceType.Table;\n\n if (formData.datasource) {\n const [id, typeString] = formData.datasource.split('__');\n datasourceId = parseInt(id, 10);\n\n const formattedTypeString =\n typeString.charAt(0).toUpperCase() + typeString.slice(1);\n if (formattedTypeString in DatasourceType) {\n datasourceType =\n DatasourceType[formattedTypeString as keyof typeof DatasourceType];\n }\n }\n\n const payload: Partial = {\n params: JSON.stringify(formData),\n slice_name: sliceName,\n viz_type: formData.viz_type,\n datasource_id: datasourceId,\n datasource_type: datasourceType,\n dashboards,\n owners,\n query_context: JSON.stringify(\n buildV1ChartDataPayload({\n formData,\n force: false,\n resultFormat: 'json',\n resultType: 'full',\n setDataMask: null,\n ownState: null,\n }),\n ),\n };\n\n return payload;\n};\n\nconst addToasts = (\n isNewSlice: boolean,\n sliceName: string,\n addedToDashboard?: {\n title: string;\n new?: boolean;\n },\n) => {\n const toasts = [];\n if (isNewSlice) {\n toasts.push(addSuccessToast(t('Chart [%s] has been saved', sliceName)));\n } else {\n toasts.push(\n addSuccessToast(t('Chart [%s] has been overwritten', sliceName)),\n );\n }\n\n if (addedToDashboard) {\n if (addedToDashboard.new) {\n toasts.push(\n addSuccessToast(\n t(\n 'Dashboard [%s] just got created and chart [%s] was added to it',\n addedToDashboard.title,\n sliceName,\n ),\n ),\n );\n } else {\n toasts.push(\n addSuccessToast(\n t(\n 'Chart [%s] was added to dashboard [%s]',\n sliceName,\n addedToDashboard.title,\n ),\n ),\n );\n }\n }\n\n return toasts;\n};\n\nexport const updateSlice =\n (\n slice: Slice,\n sliceName: string,\n dashboards: number[],\n addedToDashboard?: {\n title: string;\n new?: boolean;\n },\n ) =>\n async (dispatch: Dispatch, getState: () => Partial) => {\n const { slice_id: sliceId, owners, form_data: formDataFromSlice } = slice;\n const formData = getState().explore?.form_data;\n try {\n const response = await SupersetClient.put({\n endpoint: `/api/v1/chart/${sliceId}`,\n jsonPayload: getSlicePayload(\n sliceName,\n formData,\n dashboards,\n owners as [],\n formDataFromSlice,\n ),\n });\n\n dispatch(saveSliceSuccess(response.json));\n addToasts(false, sliceName, addedToDashboard).map(dispatch);\n return response.json;\n } catch (error) {\n dispatch(saveSliceFailed());\n throw error;\n }\n };\n\nexport const createSlice =\n (\n sliceName: string,\n dashboards: number[],\n addedToDashboard?: {\n title: string;\n new?: boolean;\n },\n ) =>\n async (dispatch: Dispatch, getState: () => Partial) => {\n const formData = getState().explore?.form_data;\n try {\n const response = await SupersetClient.post({\n endpoint: `/api/v1/chart/`,\n jsonPayload: getSlicePayload(\n sliceName,\n formData,\n dashboards,\n [],\n {} as QueryFormData,\n ),\n });\n\n dispatch(saveSliceSuccess(response.json));\n addToasts(true, sliceName, addedToDashboard).map(dispatch);\n return response.json;\n } catch (error) {\n dispatch(saveSliceFailed());\n throw error;\n }\n };\n\nexport const createDashboard =\n (dashboardName: string) => async (dispatch: Dispatch) => {\n try {\n const response = await SupersetClient.post({\n endpoint: `/api/v1/dashboard/`,\n jsonPayload: { dashboard_title: dashboardName },\n });\n\n return response.json;\n } catch (error) {\n dispatch(saveSliceFailed());\n throw error;\n }\n };\n\nexport const getSliceDashboards =\n (slice: Partial) => async (dispatch: Dispatch) => {\n try {\n const response = await SupersetClient.get({\n endpoint: `/api/v1/chart/${slice.slice_id}?q=${rison.encode({\n columns: ['dashboards.id'],\n })}`,\n });\n\n return response.json.result.dashboards.map(\n ({ id }: { id: number }) => id,\n );\n } catch (error) {\n dispatch(saveSliceFailed());\n throw error;\n }\n };\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { styled } from '@superset-ui/core';\nimport {\n MetricOption,\n ColumnOption,\n MetricOptionProps,\n ColumnOptionProps,\n} from '@superset-ui/chart-controls';\n\nconst OptionContainer = styled.div`\n width: 100%;\n > span {\n display: flex;\n align-items: center;\n }\n\n .option-label {\n display: inline-block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n & ~ i {\n margin-left: ${({ theme }) => theme.gridUnit}px;\n }\n }\n .type-label {\n margin-right: ${({ theme }) => theme.gridUnit * 3}px;\n width: ${({ theme }) => theme.gridUnit * 7}px;\n display: inline-block;\n text-align: center;\n font-weight: ${({ theme }) => theme.typography.weights.bold};\n }\n`;\n\nexport const StyledMetricOption = (props: MetricOptionProps) => (\n \n \n \n);\n\nexport const StyledColumnOption = (props: ColumnOptionProps) => (\n \n \n \n);\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { t } from '@superset-ui/core';\n\nexport const AGGREGATES = {\n AVG: 'AVG',\n COUNT: 'COUNT',\n COUNT_DISTINCT: 'COUNT_DISTINCT',\n MAX: 'MAX',\n MIN: 'MIN',\n SUM: 'SUM',\n};\nexport const AGGREGATES_OPTIONS = Object.values(AGGREGATES);\n\nexport enum Operators {\n Equals = 'EQUALS',\n NotEquals = 'NOT_EQUALS',\n LessThan = 'LESS_THAN',\n LessThanOrEqual = 'LESS_THAN_OR_EQUAL',\n GreaterThan = 'GREATER_THAN',\n GreaterThanOrEqual = 'GREATER_THAN_OR_EQUAL',\n In = 'IN',\n NotIn = 'NOT_IN',\n Like = 'LIKE',\n CaseInsensitiveLike = 'ILIKE',\n IsNotNull = 'IS_NOT_NULL',\n IsNull = 'IS_NULL',\n LatestPartition = 'LATEST_PARTITION',\n IsTrue = 'IS_TRUE',\n IsFalse = 'IS_FALSE',\n TemporalRange = 'TEMPORAL_RANGE',\n}\n\nexport interface OperatorType {\n display: string;\n operation: string;\n}\n\nexport const OPERATOR_ENUM_TO_OPERATOR_TYPE: {\n [key in Operators]: OperatorType;\n} = {\n [Operators.Equals]: { display: t('Equal to (=)'), operation: '==' },\n [Operators.NotEquals]: { display: t('Not equal to (≠)'), operation: '!=' },\n [Operators.LessThan]: { display: t('Less than (<)'), operation: '<' },\n [Operators.LessThanOrEqual]: {\n display: t('Less or equal (<=)'),\n operation: '<=',\n },\n [Operators.GreaterThan]: { display: t('Greater than (>)'), operation: '>' },\n [Operators.GreaterThanOrEqual]: {\n display: t('Greater or equal (>=)'),\n operation: '>=',\n },\n [Operators.In]: { display: t('In'), operation: 'IN' },\n [Operators.NotIn]: { display: t('Not in'), operation: 'NOT IN' },\n [Operators.Like]: { display: t('Like'), operation: 'LIKE' },\n [Operators.CaseInsensitiveLike]: {\n display: t('Like (case insensitive)'),\n operation: 'ILIKE',\n },\n [Operators.IsNotNull]: {\n display: t('Is not null'),\n operation: 'IS NOT NULL',\n },\n [Operators.IsNull]: { display: t('Is null'), operation: 'IS NULL' },\n [Operators.LatestPartition]: {\n display: t('use latest_partition template'),\n operation: 'LATEST PARTITION',\n },\n [Operators.IsTrue]: { display: t('Is true'), operation: '==' },\n [Operators.IsFalse]: { display: t('Is false'), operation: '==' },\n [Operators.TemporalRange]: {\n display: t('TEMPORAL_RANGE'),\n operation: 'TEMPORAL_RANGE',\n },\n};\n\nexport const OPERATORS_OPTIONS = Object.values(Operators) as Operators[];\n\nexport const TABLE_ONLY_OPERATORS = [\n Operators.Like,\n Operators.CaseInsensitiveLike,\n];\nexport const HAVING_OPERATORS = [\n Operators.Equals,\n Operators.NotEquals,\n Operators.LessThan,\n Operators.LessThanOrEqual,\n Operators.GreaterThan,\n Operators.GreaterThanOrEqual,\n];\nexport const MULTI_OPERATORS = new Set([Operators.In, Operators.NotIn]);\n// CUSTOM_OPERATORS will show operator in simple mode,\n// but will generate customized sqlExpression\nexport const CUSTOM_OPERATORS = new Set([\n Operators.LatestPartition,\n Operators.TemporalRange,\n]);\n// DISABLE_INPUT_OPERATORS will disable filter value input\n// in adhocFilter control\nexport const DISABLE_INPUT_OPERATORS = [\n Operators.IsNotNull,\n Operators.IsNull,\n Operators.LatestPartition,\n Operators.IsTrue,\n Operators.IsFalse,\n];\n\nexport const sqlaAutoGeneratedMetricNameRegex =\n /^(sum|min|max|avg|count|count_distinct)__.*$/i;\nexport const sqlaAutoGeneratedMetricRegex =\n /^(LONG|DOUBLE|FLOAT)?(SUM|AVG|MAX|MIN|COUNT)\\([A-Z0-9_.\"]*\\)$/i;\n\nexport const TIME_FILTER_LABELS = {\n time_range: t('Time range'),\n granularity_sqla: t('Time column'),\n time_grain_sqla: t('Time grain'),\n granularity: t('Time granularity'),\n};\n\nexport const FILTER_CONFIG_ATTRIBUTES = {\n CLEARABLE: 'clearable',\n DEFAULT_VALUE: 'defaultValue',\n MULTIPLE: 'multiple',\n SEARCH_ALL_OPTIONS: 'searchAllOptions',\n SORT_ASCENDING: 'asc',\n SORT_METRIC: 'metric',\n};\n\nexport const FILTER_OPTIONS_LIMIT = 1000;\n\n/**\n * Map control names to their key in extra_filters\n */\nexport const TIME_FILTER_MAP = {\n time_range: '__time_range',\n granularity_sqla: '__time_col',\n time_grain_sqla: '__time_grain',\n granularity: '__granularity',\n};\n\nexport const POPOVER_INITIAL_HEIGHT = 240;\nexport const POPOVER_INITIAL_WIDTH = 320;\nexport const UNSAVED_CHART_ID = 0;\n\nexport const QUERY_MODE_REQUISITES = new Set([\n 'all_columns',\n 'groupby',\n 'metrics',\n 'percent_metrics',\n 'order_by_cols',\n]);\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { t } from '@superset-ui/core';\nimport {\n ControlPanelSectionConfig,\n ControlSubSectionHeader,\n} from '@superset-ui/chart-controls';\n\nexport const datasourceAndVizType: ControlPanelSectionConfig = {\n controlSetRows: [\n ['datasource'],\n ['viz_type'],\n [\n {\n name: 'slice_id',\n config: {\n type: 'HiddenControl',\n label: t('Chart ID'),\n hidden: true,\n description: t('The id of the active chart'),\n },\n },\n {\n name: 'cache_timeout',\n config: {\n type: 'HiddenControl',\n label: t('Cache Timeout (seconds)'),\n hidden: true,\n description: t('The number of seconds before expiring the cache'),\n },\n },\n {\n name: 'url_params',\n config: {\n type: 'HiddenControl',\n label: t('URL parameters'),\n hidden: true,\n description: t('Extra parameters for use in jinja templated queries'),\n },\n },\n ],\n ],\n};\n\nexport const colorScheme: ControlPanelSectionConfig = {\n label: t('Color scheme'),\n controlSetRows: [['color_scheme']],\n};\n\nexport const sqlaTimeSeries: ControlPanelSectionConfig = {\n label: t('Time'),\n description: t('Time related form attributes'),\n expanded: true,\n controlSetRows: [['granularity_sqla'], ['time_range']],\n};\n\nexport const annotations: ControlPanelSectionConfig = {\n label: t('Annotations and layers'),\n tabOverride: 'data',\n expanded: true,\n controlSetRows: [\n [\n {\n name: 'annotation_layers',\n config: {\n type: 'AnnotationLayerControl',\n label: '',\n default: [],\n description: t('Annotation layers'),\n renderTrigger: true,\n tabOverride: 'data',\n },\n },\n ],\n ],\n};\n\nexport const NVD3TimeSeries: ControlPanelSectionConfig[] = [\n {\n label: t('Query'),\n expanded: true,\n controlSetRows: [\n ['metrics'],\n ['adhoc_filters'],\n ['groupby'],\n ['limit', 'timeseries_limit_metric'],\n ['order_desc'],\n [\n {\n name: 'contribution',\n config: {\n type: 'CheckboxControl',\n label: t('Contribution'),\n default: false,\n description: t('Compute the contribution to the total'),\n },\n },\n ],\n ['row_limit', null],\n ],\n },\n {\n label: t('Advanced analytics'),\n tabOverride: 'data',\n description: t(\n 'This section contains options ' +\n 'that allow for advanced analytical post processing ' +\n 'of query results',\n ),\n controlSetRows: [\n [\n \n {t('Rolling window')}\n ,\n ],\n [\n {\n name: 'rolling_type',\n config: {\n type: 'SelectControl',\n label: t('Rolling function'),\n default: 'None',\n choices: [\n ['None', t('None')],\n ['mean', t('mean')],\n ['sum', t('sum')],\n ['std', t('std')],\n ['cumsum', t('cumsum')],\n ],\n description: t(\n 'Defines a rolling window function to apply, works along ' +\n 'with the [Periods] text box',\n ),\n },\n },\n {\n name: 'rolling_periods',\n config: {\n type: 'TextControl',\n label: t('Periods'),\n isInt: true,\n description: t(\n 'Defines the size of the rolling window function, ' +\n 'relative to the time granularity selected',\n ),\n },\n },\n {\n name: 'min_periods',\n config: {\n type: 'TextControl',\n label: t('Min periods'),\n isInt: true,\n description: t(\n 'The minimum number of rolling periods required to show ' +\n 'a value. For instance if you do a cumulative sum on 7 days ' +\n 'you may want your \"Min Period\" to be 7, so that all data points ' +\n 'shown are the total of 7 periods. This will hide the \"ramp up\" ' +\n 'taking place over the first 7 periods',\n ),\n },\n },\n ],\n [\n \n {t('Time comparison')}\n ,\n ],\n [\n {\n name: 'time_compare',\n config: {\n type: 'SelectControl',\n multi: true,\n freeForm: true,\n label: t('Time shift'),\n choices: [\n ['1 day', t('1 day')],\n ['1 week', t('1 week')],\n ['28 days', t('28 days')],\n ['30 days', t('30 days')],\n ['52 weeks', t('52 weeks')],\n ['1 year', t('1 year')],\n ['104 weeks', t('104 weeks')],\n ['2 years', t('2 years')],\n ['156 weeks', t('156 weeks')],\n ['3 years', t('3 years')],\n ],\n description: t(\n 'Overlay one or more timeseries from a ' +\n 'relative time period. Expects relative time deltas ' +\n 'in natural language (example: 24 hours, 7 days, ' +\n '52 weeks, 365 days). Free text is supported.',\n ),\n },\n },\n {\n name: 'comparison_type',\n config: {\n type: 'SelectControl',\n label: t('Calculation type'),\n default: 'values',\n choices: [\n ['values', t('Actual values')],\n ['absolute', t('Difference')],\n ['percentage', t('Percentage change')],\n ['ratio', t('Ratio')],\n ],\n description: t(\n 'How to display time shifts: as individual lines; as the ' +\n 'difference between the main time series and each time shift; ' +\n 'as the percentage change; or as the ratio between series and time shifts.',\n ),\n },\n },\n ],\n [{t('Resample')}],\n [\n {\n name: 'resample_rule',\n config: {\n type: 'SelectControl',\n freeForm: true,\n label: t('Rule'),\n default: null,\n choices: [\n ['1T', t('1T')],\n ['1H', t('1H')],\n ['1D', t('1D')],\n ['7D', t('7D')],\n ['1M', t('1M')],\n ['1AS', t('1AS')],\n ],\n description: t('Pandas resample rule'),\n },\n },\n {\n name: 'resample_method',\n config: {\n type: 'SelectControl',\n freeForm: true,\n label: t('Method'),\n default: null,\n choices: [\n ['asfreq', t('asfreq')],\n ['bfill', t('bfill')],\n ['ffill', t('ffill')],\n ['median', t('median')],\n ['mean', t('mean')],\n ['sum', t('sum')],\n ],\n description: t('Pandas resample method'),\n },\n },\n ],\n ],\n },\n];\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport memoizeOne from 'memoize-one';\nimport {\n DatasourceType,\n getChartControlPanelRegistry,\n} from '@superset-ui/core';\nimport {\n ControlPanelConfig,\n expandControlConfig,\n isControlPanelSectionConfig,\n} from '@superset-ui/chart-controls';\n\nimport * as SECTIONS from 'src/explore/controlPanels/sections';\n\nconst getMemoizedSectionsToRender = memoizeOne(\n (datasourceType: DatasourceType, controlPanelConfig: ControlPanelConfig) => {\n const {\n sectionOverrides = {},\n controlOverrides,\n controlPanelSections = [],\n } = controlPanelConfig;\n\n // default control panel sections\n const sections = { ...SECTIONS };\n\n // apply section overrides\n Object.entries(sectionOverrides).forEach(([section, overrides]) => {\n if (typeof overrides === 'object' && overrides.constructor === Object) {\n sections[section] = {\n ...sections[section],\n ...overrides,\n };\n } else {\n sections[section] = overrides;\n }\n });\n\n const { datasourceAndVizType } = sections;\n\n // list of datasource-specific controls that should be removed if the datasource is a specific type\n const filterControlsForTypes = [DatasourceType.Query, DatasourceType.Table];\n const invalidControls = filterControlsForTypes.includes(datasourceType)\n ? ['granularity']\n : ['granularity_sqla', 'time_grain_sqla'];\n\n return [datasourceAndVizType]\n .concat(controlPanelSections.filter(isControlPanelSectionConfig))\n .map(section => {\n const { controlSetRows } = section;\n return {\n ...section,\n controlSetRows:\n controlSetRows?.map(row =>\n row\n .filter(\n control =>\n typeof control !== 'string' ||\n !invalidControls.includes(control),\n )\n .map(item => expandControlConfig(item, controlOverrides)),\n ) || [],\n };\n });\n },\n);\n\n/**\n * Get the clean and processed control panel sections\n */\nexport function getSectionsToRender(\n vizType: string,\n datasourceType: DatasourceType,\n) {\n const controlPanelConfig =\n // TODO: update `chartControlPanelRegistry` type to use ControlPanelConfig\n (getChartControlPanelRegistry().get(vizType) as ControlPanelConfig) || {};\n return getMemoizedSectionsToRender(datasourceType, controlPanelConfig);\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport memoizeOne from 'memoize-one';\nimport { getChartControlPanelRegistry } from '@superset-ui/core';\nimport {\n ControlPanelConfig,\n ControlPanelSectionConfig,\n expandControlConfig,\n isControlPanelSectionConfig,\n} from '@superset-ui/chart-controls';\n\n/**\n * Find control item from control panel config.\n */\nexport function findControlItem(\n controlPanelSections: (ControlPanelSectionConfig | null)[],\n controlKey: string,\n) {\n return (\n controlPanelSections\n .filter(isControlPanelSectionConfig)\n .map(section => section.controlSetRows)\n .flat(2)\n .find(\n control =>\n controlKey === control ||\n (control !== null &&\n typeof control === 'object' &&\n 'name' in control &&\n control.name === controlKey),\n ) ?? null\n );\n}\n\nconst getMemoizedControlConfig = memoizeOne(\n (controlKey, controlPanelConfig: ControlPanelConfig) => {\n const { controlOverrides = {}, controlPanelSections = [] } =\n controlPanelConfig;\n const control = expandControlConfig(\n findControlItem(controlPanelSections, controlKey),\n controlOverrides,\n );\n return control && 'config' in control ? control.config : control;\n },\n);\n\nexport const getControlConfig = function getControlConfig(\n controlKey: string,\n vizType: string,\n) {\n const controlPanelConfig = getChartControlPanelRegistry().get(vizType) || {};\n return getMemoizedControlConfig(\n controlKey,\n // TODO: the ChartControlPanelRegistry is incorrectly typed and needs to\n // be fixed\n controlPanelConfig as ControlPanelConfig,\n );\n};\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { ReactNode } from 'react';\nimport {\n DatasourceType,\n ensureIsArray,\n JsonValue,\n QueryFormData,\n} from '@superset-ui/core';\nimport {\n ControlConfig,\n ControlPanelState,\n ControlState,\n ControlType,\n ControlValueValidator,\n CustomControlItem,\n} from '@superset-ui/chart-controls';\nimport { getSectionsToRender } from './getSectionsToRender';\nimport { getControlConfig } from './getControlConfig';\n\ntype ValidationError = JsonValue;\n\nfunction execControlValidator(\n control: ControlState,\n processedState: ControlState,\n) {\n const validators = control.validators as ControlValueValidator[] | undefined;\n const { externalValidationErrors = [] } = control;\n const errors: ValidationError[] = [];\n if (validators && validators.length > 0) {\n validators.forEach(validator => {\n const error = validator.call(control, control.value, processedState);\n if (error) {\n errors.push(error);\n }\n });\n }\n const validationErrors = [...errors, ...externalValidationErrors];\n // always reset validation errors even when there is no validator\n return { ...control, validationErrors };\n}\n\n/**\n * Clear control values that are no longer in the `choices` list.\n */\nfunction handleMissingChoice(control: ControlState) {\n // If the value is not valid anymore based on choices, clear it\n if (\n control.type === 'SelectControl' &&\n !control.freeForm &&\n control.choices &&\n control.value\n ) {\n const alteredControl = { ...control };\n const choices = control.choices as [JsonValue, ReactNode][];\n const value = ensureIsArray(control.value);\n const choiceValues = choices.map(c => c[0]);\n if (control.multi && value.length > 0) {\n alteredControl.value = value.filter(el => choiceValues.includes(el));\n return alteredControl;\n }\n if (!control.multi && !choiceValues.includes(value[0])) {\n alteredControl.value = null;\n return alteredControl;\n }\n }\n return control;\n}\n\nexport function applyMapStateToPropsToControl(\n controlState: ControlState,\n controlPanelState: Partial | null,\n) {\n const { mapStateToProps } = controlState;\n let state = { ...controlState };\n let { value } = state; // value is current user-input value\n if (mapStateToProps && controlPanelState) {\n state = {\n ...controlState,\n ...mapStateToProps.call(controlState, controlPanelState, controlState),\n };\n // `mapStateToProps` may also provide a value\n value = value || state.value;\n }\n\n // InitialValue is used for setting value for the control,\n // this value is not recalculated. The default value will override it.\n if (typeof state.initialValue === 'function') {\n state.initialValue = state.initialValue(state, controlPanelState);\n // if default is still a function, discard\n if (typeof state.initialValue === 'function') {\n delete state.initialValue;\n }\n }\n if (state.initialValue) {\n value = state.initialValue;\n delete state.initialValue;\n }\n\n // If default is a function, evaluate it\n if (typeof state.default === 'function') {\n state.default = state.default(state, controlPanelState);\n // if default is still a function, discard\n if (typeof state.default === 'function') {\n delete state.default;\n }\n }\n // If no current value, set it as default\n if (state.default && value === undefined) {\n value = state.default;\n }\n // If a choice control went from multi=false to true, wrap value in array\n if (value && state.multi && !Array.isArray(value)) {\n value = [value];\n }\n state.value = value;\n return execControlValidator(handleMissingChoice(state), state);\n}\n\nexport function getControlStateFromControlConfig(\n controlConfig: ControlConfig | null,\n controlPanelState: Partial | null,\n value?: JsonValue,\n) {\n // skip invalid config values\n if (!controlConfig) {\n return null;\n }\n const controlState = { ...controlConfig, value } as ControlState;\n // only apply mapStateToProps when control states have been initialized\n // or when explicitly didn't provide control panel state (mostly for testing)\n if (controlPanelState?.controls || controlPanelState === null) {\n return applyMapStateToPropsToControl(controlState, controlPanelState);\n }\n return controlState;\n}\n\nexport function getControlState(\n controlKey: string,\n vizType: string,\n state: Partial,\n value?: JsonValue,\n) {\n return getControlStateFromControlConfig(\n getControlConfig(controlKey, vizType),\n state,\n value,\n );\n}\n\nexport function getAllControlsState(\n vizType: string,\n datasourceType: DatasourceType,\n state: ControlPanelState | null,\n formData: QueryFormData,\n) {\n const controlsState = {};\n getSectionsToRender(vizType, datasourceType).forEach(section =>\n section.controlSetRows.forEach(fieldsetRow =>\n fieldsetRow.forEach((field: CustomControlItem) => {\n if (field?.config && field.name) {\n const { config, name } = field;\n controlsState[name] = getControlStateFromControlConfig(\n config,\n state,\n formData[name],\n );\n }\n }),\n ),\n );\n return controlsState;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { QueryFormData } from '@superset-ui/core';\nimport { ControlStateMapping } from '@superset-ui/chart-controls';\n\nexport function getFormDataFromControls(\n controlsState: ControlStateMapping,\n): QueryFormData {\n const formData = {};\n Object.keys(controlsState).forEach(controlName => {\n const control = controlsState[controlName];\n formData[controlName] = control.value;\n });\n return formData as QueryFormData;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { ControlState, Dataset, Metric } from '@superset-ui/chart-controls';\nimport {\n Column,\n isAdhocMetricSimple,\n isAdhocMetricSQL,\n isSavedMetric,\n isSimpleAdhocFilter,\n JsonValue,\n SimpleAdhocFilter,\n} from '@superset-ui/core';\nimport AdhocMetric from 'src/explore/components/controls/MetricControl/AdhocMetric';\n\nconst isControlValueCompatibleWithDatasource = (\n datasource: Dataset,\n controlState: ControlState,\n value: any,\n) => {\n if (controlState.options && typeof value === 'string') {\n if (\n controlState.options.some(\n (option: [string | number, string] | { column_name: string }) =>\n Array.isArray(option)\n ? option[0] === value\n : option.column_name === value,\n )\n ) {\n return datasource.columns.some(column => column.column_name === value);\n }\n }\n if (\n controlState.savedMetrics &&\n isSavedMetric(value) &&\n controlState.savedMetrics.some(\n (savedMetric: Metric) => savedMetric.metric_name === value,\n )\n ) {\n return datasource.metrics.some(\n (metric: Metric) => metric.metric_name === value,\n );\n }\n if (\n controlState.columns &&\n (isAdhocMetricSimple(value) || isSimpleAdhocFilter(value)) &&\n controlState.columns.some(\n (column: Column) =>\n column.column_name === (value as AdhocMetric).column?.column_name ||\n column.column_name === (value as SimpleAdhocFilter).subject,\n )\n ) {\n return datasource.columns.some(\n (column: Column) =>\n column.column_name === (value as AdhocMetric).column?.column_name ||\n column.column_name === (value as SimpleAdhocFilter).subject,\n );\n }\n if (isAdhocMetricSQL(value)) {\n Object.assign(value, { datasourceWarning: true });\n return true;\n }\n return false;\n};\n\nexport const getControlValuesCompatibleWithDatasource = (\n datasource: Dataset,\n controlState: ControlState,\n value: JsonValue,\n) => {\n if (value === undefined || value === null) {\n return undefined;\n }\n if (Array.isArray(value)) {\n const compatibleValues = value.filter(val =>\n isControlValueCompatibleWithDatasource(datasource, controlState, val),\n );\n return compatibleValues.length > 0\n ? compatibleValues\n : controlState.default;\n }\n return isControlValueCompatibleWithDatasource(datasource, controlState, value)\n ? value\n : controlState.default;\n};\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { omit } from 'lodash';\nimport {\n ensureIsArray,\n getChartControlPanelRegistry,\n QueryFormColumn,\n QueryFormData,\n QueryFormMetric,\n} from '@superset-ui/core';\nimport {\n ControlStateMapping,\n getStandardizedControls,\n isStandardizedFormData,\n StandardizedControls,\n StandardizedFormDataInterface,\n} from '@superset-ui/chart-controls';\nimport { getControlsState } from 'src/explore/store';\nimport { getFormDataFromControls } from './getFormDataFromControls';\n\nexport const sharedMetricsKey = [\n 'metric', // via sharedControls, scalar\n 'metrics', // via sharedControls, array\n 'metric_2', // via sharedControls, scalar\n 'size', // via sharedControls, scalar\n 'x', // via sharedControls, scalar\n 'y', // via sharedControls, scalar\n 'secondary_metric', // via sharedControls, scalar\n];\nexport const sharedColumnsKey = [\n 'groupby', // via sharedControls, array\n 'columns', // via sharedControls, array\n 'groupbyColumns', // via pivot table v2, array\n 'groupbyRows', // via pivot table v2, array\n 'entity', // via sharedControls, scalar\n 'series', // via sharedControls, scalar\n 'series_columns', // via sharedControls, array\n];\n\nexport const publicControls = [\n // time section\n 'granularity_sqla', // via sharedControls\n 'time_grain_sqla', // via sharedControls\n 'time_range', // via sharedControls\n // filters\n 'adhoc_filters', // via sharedControls\n // subquery limit(series limit)\n 'limit', // via sharedControls\n // order by clause\n 'timeseries_limit_metric', // via sharedControls\n 'series_limit_metric', // via sharedControls\n // desc or asc in order by clause\n 'order_desc', // via sharedControls\n // outer query limit\n 'row_limit', // via sharedControls\n // x asxs column\n 'x_axis', // via sharedControls\n // advanced analytics - rolling window\n 'rolling_type', // via sections.advancedAnalytics\n 'rolling_periods', // via sections.advancedAnalytics\n 'min_periods', // via sections.advancedAnalytics\n // advanced analytics - time comparison\n 'time_compare', // via sections.advancedAnalytics\n 'comparison_type', // via sections.advancedAnalytics\n // advanced analytics - resample\n 'resample_rule', // via sections.advancedAnalytics\n 'resample_method', // via sections.advancedAnalytics\n];\n\nexport class StandardizedFormData {\n private sfd: StandardizedFormDataInterface;\n\n constructor(sourceFormData: QueryFormData) {\n /*\n * Support form_data for smooth switching between different viz\n * */\n const formData = Object.freeze(sourceFormData);\n\n // generates an ordered map, the key is viz_type and the value is form_data. the last item is current viz.\n const mfd = formData?.standardizedFormData?.memorizedFormData;\n const vizType = formData.viz_type;\n let memorizedFormData = new Map();\n let controls: StandardizedControls;\n if (\n Array.isArray(mfd) &&\n mfd.length > 0 &&\n formData.datasource === mfd.slice(-1)[0][1]?.datasource\n ) {\n memorizedFormData = new Map(\n formData.standardizedFormData.memorizedFormData,\n );\n if (memorizedFormData.has(vizType)) {\n memorizedFormData.delete(vizType);\n }\n memorizedFormData.set(vizType, formData);\n controls = StandardizedFormData.getStandardizedControls(formData);\n } else {\n // reset the `memorizedFormData` if a request between different datasource.\n const restFormData = omit(\n formData,\n 'standardizedFormData',\n ) as QueryFormData;\n memorizedFormData.set(vizType, restFormData);\n controls = StandardizedFormData.getStandardizedControls(restFormData);\n }\n\n this.sfd = {\n controls,\n memorizedFormData,\n };\n }\n\n static getStandardizedControls(\n formData: QueryFormData,\n ): StandardizedControls {\n // 1. initial StandardizedControls\n const controls: StandardizedControls = {\n metrics: [],\n columns: [],\n };\n\n // 2. collect current sharedControls\n Object.entries(formData).forEach(([key, value]) => {\n if (sharedMetricsKey.includes(key)) {\n controls.metrics.push(...ensureIsArray(value));\n }\n if (sharedColumnsKey.includes(key)) {\n controls.columns.push(...ensureIsArray(value));\n }\n });\n\n // 3. append inherit sharedControls\n if (isStandardizedFormData(formData)) {\n const { metrics, columns } = formData.standardizedFormData.controls;\n controls.metrics.push(...metrics);\n controls.columns.push(...columns);\n }\n\n return controls;\n }\n\n private getLatestFormData(vizType: string): QueryFormData {\n if (this.has(vizType)) {\n return this.get(vizType);\n }\n return this.memorizedFormData.slice(-1)[0][1];\n }\n\n private get standardizedControls() {\n return this.sfd.controls;\n }\n\n private get memorizedFormData() {\n return Array.from(this.sfd.memorizedFormData.entries());\n }\n\n serialize() {\n return {\n controls: this.standardizedControls,\n memorizedFormData: this.memorizedFormData,\n };\n }\n\n has(vizType: string): boolean {\n return this.sfd.memorizedFormData.has(vizType);\n }\n\n get(vizType: string): QueryFormData {\n return this.sfd.memorizedFormData.get(vizType) as QueryFormData;\n }\n\n transform(\n targetVizType: string,\n exploreState: Record,\n ): {\n formData: QueryFormData;\n controlsState: ControlStateMapping;\n } {\n /*\n * Transfrom form_data between different viz. Return new form_data and controlsState.\n * 1. get memorized form_data by viz type or get previous form_data\n * 2. collect public control values\n * 3. generate initial targetControlsState\n * 4. attach `standardizedFormData` to the initial form_data\n * 5. call formDataOverrides to transform initial form_data if the plugin was defined\n * 6. use final form_data to generate controlsState\n * 7. to refresh validator message\n * */\n const latestFormData = this.getLatestFormData(targetVizType);\n const publicFormData = {};\n publicControls.forEach(key => {\n if (key in exploreState.form_data) {\n publicFormData[key] = exploreState.form_data[key];\n }\n });\n const targetControlsState = getControlsState(exploreState, {\n ...latestFormData,\n ...publicFormData,\n viz_type: targetVizType,\n });\n const targetFormData = {\n ...getFormDataFromControls(targetControlsState),\n standardizedFormData: this.serialize(),\n };\n\n let rv = {\n formData: targetFormData,\n controlsState: targetControlsState,\n };\n\n const controlPanel = getChartControlPanelRegistry().get(targetVizType);\n if (controlPanel?.formDataOverrides) {\n getStandardizedControls().setStandardizedControls(targetFormData);\n const transformed = {\n ...controlPanel.formDataOverrides(targetFormData),\n standardizedFormData: {\n controls: { ...getStandardizedControls().controls },\n memorizedFormData: this.memorizedFormData,\n },\n };\n getStandardizedControls().clear();\n rv = {\n formData: transformed,\n controlsState: getControlsState(exploreState, transformed),\n };\n }\n\n // refresh validator message\n rv.controlsState = getControlsState(\n { ...exploreState, controls: rv.controlsState },\n rv.formData,\n );\n return rv;\n }\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { makeApi } from '@superset-ui/core';\nimport { useEffect, useMemo, useRef, useState } from 'react';\n\nexport enum ResourceStatus {\n Loading = 'loading',\n Complete = 'complete',\n Error = 'error',\n}\n\n/**\n * An object containing the data fetched from the API,\n * as well as loading and error info\n */\nexport type Resource = LoadingState | CompleteState | ErrorState;\n\n// Trying out something a little different: a separate type per status.\n// This should let Typescript know whether a Resource has a result or error.\n// It's possible that I'm expecting too much from Typescript here.\n// If this ends up causing problems, we can change the type to:\n//\n// export type Resource = {\n// status: ResourceStatus;\n// result: null | T;\n// error: null | Error;\n// }\n\ntype LoadingState = {\n status: ResourceStatus.Loading;\n result: null;\n error: null;\n};\n\ntype CompleteState = {\n status: ResourceStatus.Complete;\n result: T;\n error: null;\n};\n\ntype ErrorState = {\n status: ResourceStatus.Error;\n result: null;\n error: Error;\n};\n\nconst initialState: LoadingState = {\n status: ResourceStatus.Loading,\n result: null,\n error: null,\n};\n\n/**\n * A general-purpose hook to fetch the response from an endpoint.\n * Returns the full response body from the API, including metadata.\n *\n * Note: You likely want {useApiV1Resource} instead of this!\n *\n * TODO Store the state in redux or something, share state between hook instances.\n *\n * TODO Include a function in the returned resource object to refresh the data.\n *\n * A core design decision here is composition > configuration,\n * and every hook should only have one job.\n * Please address new needs with new hooks if possible,\n * rather than adding config options to this hook.\n *\n * @param endpoint The url where the resource is located.\n */\nexport function useApiResourceFullBody(\n endpoint: string,\n): Resource {\n const [resource, setResource] = useState>(initialState);\n const cancelRef = useRef<() => void>(() => {});\n\n useEffect(() => {\n // If refresh is implemented, this will need to change.\n // The previous values should stay during refresh.\n setResource(initialState);\n\n // when this effect runs, the endpoint has changed.\n // cancel any current calls so that state doesn't get messed up.\n cancelRef.current();\n let cancelled = false;\n cancelRef.current = () => {\n cancelled = true;\n };\n\n const fetchResource = makeApi<{}, RESULT>({\n method: 'GET',\n endpoint,\n });\n\n fetchResource({})\n .then(result => {\n if (!cancelled) {\n setResource({\n status: ResourceStatus.Complete,\n result,\n error: null,\n });\n }\n })\n .catch(error => {\n if (!cancelled) {\n setResource({\n status: ResourceStatus.Error,\n result: null,\n error,\n });\n }\n });\n\n // Cancel the request when the component un-mounts\n return () => {\n cancelled = true;\n };\n }, [endpoint]);\n\n return resource;\n}\n\n/**\n * For when you want to transform the result of an api resource hook before using it.\n *\n * @param resource the Resource object returned from useApiV1Resource\n * @param transformFn a callback that transforms the result object into the shape you want.\n * Make sure to use a persistent function for this so it doesn't constantly recalculate!\n */\nexport function useTransformedResource(\n resource: Resource,\n transformFn: (result: IN) => OUT,\n): Resource {\n return useMemo(() => {\n if (resource.status !== ResourceStatus.Complete) {\n // While incomplete, there is no result - no need to transform.\n return resource;\n }\n try {\n return {\n ...resource,\n result: transformFn(resource.result),\n };\n } catch (e) {\n return {\n status: ResourceStatus.Error,\n result: null,\n error: e,\n };\n }\n }, [resource, transformFn]);\n}\n\n// returns the \"result\" field from a fetched API v1 endpoint\nconst extractInnerResult = (responseBody: { result: T }) =>\n responseBody.result;\n\n/**\n * A general-purpose hook to fetch a Superset resource from a v1 API endpoint.\n * Handles request lifecycle and async logic so you don't have to.\n *\n * This returns the data under the \"result\" field in the API response body.\n * If you need the full response body, use {useFullApiResource} instead.\n *\n * @param endpoint The url where the resource is located.\n */\nexport function useApiV1Resource(endpoint: string): Resource {\n return useTransformedResource(\n useApiResourceFullBody<{ result: RESULT }>(endpoint),\n extractInnerResult,\n );\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport rison from 'rison';\nimport { createApi, BaseQueryFn } from '@reduxjs/toolkit/query/react';\nimport {\n ClientErrorObject,\n getClientErrorObject,\n SupersetClient,\n ParseMethod,\n SupersetClientResponse,\n JsonValue,\n RequestBase,\n} from '@superset-ui/core';\n\nexport type { JsonResponse, TextResponse } from '@superset-ui/core';\n\nexport const supersetClientQuery: BaseQueryFn<\n Pick & {\n endpoint: string;\n parseMethod?: ParseMethod;\n transformResponse?: (response: SupersetClientResponse) => JsonValue;\n urlParams?: Record;\n },\n JsonValue,\n ClientErrorObject\n> = (\n {\n endpoint,\n urlParams,\n transformResponse,\n method = 'GET',\n parseMethod = 'json',\n ...rest\n },\n api,\n) =>\n SupersetClient.request({\n ...rest,\n endpoint: `${endpoint}${urlParams ? `?q=${rison.encode(urlParams)}` : ''}`,\n method,\n parseMethod,\n signal: api.signal,\n })\n .then(data => ({\n data: transformResponse?.(data) ?? data,\n }))\n .catch(response =>\n getClientErrorObject(response).then(errorObj => ({\n error: {\n error: errorObj?.message || errorObj?.error || response.statusText,\n status: response.status,\n },\n })),\n );\n\nexport const api = createApi({\n reducerPath: 'queryApi',\n tagTypes: [\n 'Catalogs',\n 'Schemas',\n 'Tables',\n 'DatabaseFunctions',\n 'QueryValidations',\n 'TableMetadatas',\n 'SqlLabInitialState',\n 'EditorQueries',\n ],\n endpoints: () => ({}),\n baseQuery: supersetClientQuery,\n});\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { useCallback, useEffect } from 'react';\nimport useEffectEvent from 'src/hooks/useEffectEvent';\nimport { api, JsonResponse } from './queryApi';\n\nexport type SchemaOption = {\n value: string;\n label: string;\n title: string;\n};\n\nexport type FetchSchemasQueryParams = {\n dbId?: string | number;\n catalog?: string;\n forceRefresh: boolean;\n onSuccess?: (data: SchemaOption[], isRefetched: boolean) => void;\n onError?: () => void;\n};\n\ntype Params = Omit;\n\nconst schemaApi = api.injectEndpoints({\n endpoints: builder => ({\n schemas: builder.query({\n providesTags: [{ type: 'Schemas', id: 'LIST' }],\n query: ({ dbId, catalog, forceRefresh }) => ({\n endpoint: `/api/v1/database/${dbId}/schemas/`,\n // TODO: Would be nice to add pagination in a follow-up. Needs endpoint changes.\n urlParams: {\n force: forceRefresh,\n ...(catalog !== undefined && { catalog }),\n },\n transformResponse: ({ json }: JsonResponse) =>\n json.result.sort().map((value: string) => ({\n value,\n label: value,\n title: value,\n })),\n }),\n serializeQueryArgs: ({ queryArgs: { dbId, catalog } }) => ({\n dbId,\n catalog,\n }),\n }),\n }),\n});\n\nexport const {\n useLazySchemasQuery,\n useSchemasQuery,\n endpoints: schemaEndpoints,\n util: schemaApiUtil,\n} = schemaApi;\n\nexport const EMPTY_SCHEMAS = [] as SchemaOption[];\n\nexport function useSchemas(options: Params) {\n const { dbId, catalog, onSuccess, onError } = options || {};\n const [trigger] = useLazySchemasQuery();\n const result = useSchemasQuery(\n { dbId, catalog: catalog || undefined, forceRefresh: false },\n {\n skip: !dbId,\n },\n );\n\n const fetchData = useEffectEvent(\n (\n dbId: FetchSchemasQueryParams['dbId'],\n catalog: FetchSchemasQueryParams['catalog'],\n forceRefresh = false,\n ) => {\n if (dbId && (!result.currentData || forceRefresh)) {\n trigger({ dbId, catalog, forceRefresh }).then(\n ({ isSuccess, isError, data }) => {\n if (isSuccess) {\n onSuccess?.(data || EMPTY_SCHEMAS, forceRefresh);\n }\n if (isError) {\n onError?.();\n }\n },\n );\n }\n },\n );\n\n useEffect(() => {\n fetchData(dbId, catalog, false);\n }, [dbId, catalog, fetchData]);\n\n const refetch = useCallback(() => {\n fetchData(dbId, catalog, true);\n }, [dbId, catalog, fetchData]);\n\n return {\n ...result,\n refetch,\n };\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { useCallback, useMemo, useEffect, useRef } from 'react';\nimport useEffectEvent from 'src/hooks/useEffectEvent';\nimport { toQueryString } from 'src/utils/urlUtils';\nimport { api, JsonResponse } from './queryApi';\n\nimport { useSchemas } from './schemas';\n\nexport interface Table {\n label: string;\n value: string;\n type: string;\n extra?: {\n certification?: {\n certified_by: string;\n details: string;\n };\n warning_markdown?: string;\n };\n}\n\ntype QueryResponse = {\n json: {\n count: number;\n result: Table[];\n };\n response: Response;\n};\n\nexport type Data = {\n options: Table[];\n hasMore: boolean;\n};\n\nexport type FetchTablesQueryParams = {\n dbId?: string | number;\n catalog?: string | null;\n schema?: string;\n forceRefresh?: boolean;\n onSuccess?: (data: Data, isRefetched: boolean) => void;\n onError?: (error: Response) => void;\n};\n\nexport type FetchTableMetadataQueryParams = {\n dbId: string | number;\n catalog?: string | null;\n schema: string;\n table: string;\n};\n\ntype ColumnKeyTypeType = 'pk' | 'fk' | 'index';\ninterface Column {\n name: string;\n keys?: { type: ColumnKeyTypeType }[];\n type: string;\n}\n\nexport type TableMetaData = {\n name: string;\n partitions?: {\n partitionQuery: string;\n latest: object[];\n };\n metadata?: Record;\n indexes?: object[];\n selectStar?: string;\n view?: string;\n columns: Column[];\n};\n\ntype TableMetadataReponse = {\n json: TableMetaData;\n response: Response;\n};\n\nexport type TableExtendedMetadata = Record;\n\ntype Params = Omit;\n\nconst tableApi = api.injectEndpoints({\n endpoints: builder => ({\n tables: builder.query({\n providesTags: ['Tables'],\n query: ({ dbId, catalog, schema, forceRefresh }) => ({\n endpoint: `/api/v1/database/${dbId ?? 'undefined'}/tables/`,\n // TODO: Would be nice to add pagination in a follow-up. Needs endpoint changes.\n urlParams: {\n force: forceRefresh,\n schema_name: schema ? encodeURIComponent(schema) : '',\n ...(catalog && { catalog_name: catalog }),\n },\n transformResponse: ({ json }: QueryResponse) => ({\n options: json.result,\n hasMore: json.count > json.result.length,\n }),\n }),\n serializeQueryArgs: ({ queryArgs: { dbId, schema } }) => ({\n dbId,\n schema,\n }),\n }),\n tableMetadata: builder.query({\n providesTags: result =>\n result\n ? [\n { type: 'TableMetadatas', id: result.name },\n { type: 'TableMetadatas', id: 'LIST' },\n ]\n : [{ type: 'TableMetadatas', id: 'LIST' }],\n query: ({ dbId, catalog, schema, table }) => ({\n endpoint: `/api/v1/database/${dbId}/table_metadata/${toQueryString({\n name: table,\n catalog,\n schema,\n })}`,\n transformResponse: ({ json }: TableMetadataReponse) => json,\n }),\n }),\n tableExtendedMetadata: builder.query<\n TableExtendedMetadata,\n FetchTableMetadataQueryParams\n >({\n query: ({ dbId, catalog, schema, table }) => ({\n endpoint: `/api/v1/database/${dbId}/table_metadata/extra/${toQueryString(\n { name: table, catalog, schema },\n )}`,\n transformResponse: ({ json }: JsonResponse) => json,\n }),\n }),\n }),\n});\n\nexport const {\n useLazyTablesQuery,\n useTablesQuery,\n useTableMetadataQuery,\n useTableExtendedMetadataQuery,\n endpoints: tableEndpoints,\n util: tableApiUtil,\n} = tableApi;\n\nexport function useTables(options: Params) {\n const { dbId, catalog, schema, onSuccess, onError } = options || {};\n const isMountedRef = useRef(false);\n const { currentData: schemaOptions, isFetching } = useSchemas({\n dbId,\n catalog: catalog || undefined,\n });\n const schemaOptionsMap = useMemo(\n () => new Set(schemaOptions?.map(({ value }) => value)),\n [schemaOptions],\n );\n\n const enabled = Boolean(\n dbId && schema && !isFetching && schemaOptionsMap.has(schema),\n );\n\n const result = useTablesQuery(\n { dbId, catalog, schema, forceRefresh: false },\n {\n skip: !enabled,\n },\n );\n const [trigger] = useLazyTablesQuery();\n\n const handleOnSuccess = useEffectEvent((data: Data, isRefetched: boolean) => {\n onSuccess?.(data, isRefetched);\n });\n\n const handleOnError = useEffectEvent((error: Response) => {\n onError?.(error);\n });\n\n const refetch = useCallback(() => {\n if (enabled) {\n trigger({ dbId, catalog, schema, forceRefresh: true }).then(\n ({ isSuccess, isError, data, error }) => {\n if (isSuccess && data) {\n handleOnSuccess(data, true);\n }\n if (isError) {\n handleOnError(error as Response);\n }\n },\n );\n }\n }, [dbId, catalog, schema, enabled, handleOnSuccess, handleOnError, trigger]);\n\n useEffect(() => {\n if (isMountedRef.current) {\n const {\n requestId,\n isSuccess,\n isError,\n isFetching,\n currentData,\n error,\n originalArgs,\n } = result;\n if (!originalArgs?.forceRefresh && requestId && !isFetching) {\n if (isSuccess && currentData) {\n handleOnSuccess(currentData, false);\n }\n if (isError) {\n handleOnError(error as Response);\n }\n }\n } else {\n isMountedRef.current = true;\n }\n }, [result, handleOnSuccess, handleOnError]);\n\n return {\n ...result,\n refetch,\n };\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { useState, useEffect } from 'react';\nimport { FAST_DEBOUNCE } from 'src/constants';\n\nexport function useDebounceValue(value: T, delay = FAST_DEBOUNCE) {\n const [debouncedValue, setDebouncedValue] = useState(value);\n\n useEffect(() => {\n const handler: NodeJS.Timeout = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\n\n // Cancel the timeout if value changes (also on delay change or unmount)\n return () => {\n clearTimeout(handler);\n };\n }, [value, delay]);\n\n return debouncedValue;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n// TODO: Replace to react-use-event-hook once https://github.com/facebook/react/pull/25881 is released\nimport useEventCallback from 'use-event-callback';\n\ndeclare type Fn = (...args: ARGS) => R;\n\n/**\n * Similar to useCallback, with a few subtle differences:\n * @external\n * https://github.com/reactjs/rfcs/blob/useevent/text/0000-useevent.md#internal-implementation\n * @example\n * const onStateChanged = useEffectEvent((state: T) => log(['clicked', state]));\n *\n * useEffect(() => {\n * onStateChanged(state);\n * }, [onStateChanged, state]);\n * // ^ onStateChanged is guaranteed to never change and always be up to date!\n */\nexport default function useEffectEvent(\n fn: Fn,\n): Fn {\n return useEventCallback(fn);\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n// Log event names ------------------------------------------------------------\nexport const LOG_ACTIONS_LOAD_CHART = 'load_chart';\nexport const LOG_ACTIONS_RENDER_CHART = 'render_chart';\nexport const LOG_ACTIONS_HIDE_BROWSER_TAB = 'hide_browser_tab';\n\nexport const LOG_ACTIONS_MOUNT_DASHBOARD = 'mount_dashboard';\nexport const LOG_ACTIONS_MOUNT_EXPLORER = 'mount_explorer';\n\nexport const LOG_ACTIONS_SELECT_DASHBOARD_TAB = 'select_dashboard_tab';\nexport const LOG_ACTIONS_FORCE_REFRESH_CHART = 'force_refresh_chart';\nexport const LOG_ACTIONS_CHANGE_EXPLORE_CONTROLS = 'change_explore_controls';\nexport const LOG_ACTIONS_TOGGLE_EDIT_DASHBOARD = 'toggle_edit_dashboard';\nexport const LOG_ACTIONS_FORCE_REFRESH_DASHBOARD = 'force_refresh_dashboard';\nexport const LOG_ACTIONS_PERIODIC_RENDER_DASHBOARD =\n 'periodic_render_dashboard';\nexport const LOG_ACTIONS_EXPLORE_DASHBOARD_CHART = 'explore_dashboard_chart';\nexport const LOG_ACTIONS_EXPORT_CSV_DASHBOARD_CHART =\n 'export_csv_dashboard_chart';\nexport const LOG_ACTIONS_EXPORT_XLSX_DASHBOARD_CHART =\n 'export_xlsx_dashboard_chart';\nexport const LOG_ACTIONS_CHANGE_DASHBOARD_FILTER = 'change_dashboard_filter';\nexport const LOG_ACTIONS_DATASET_CREATION_EMPTY_CANCELLATION =\n 'dataset_creation_empty_cancellation';\nexport const LOG_ACTIONS_DATASET_CREATION_DATABASE_CANCELLATION =\n 'dataset_creation_database_cancellation';\nexport const LOG_ACTIONS_DATASET_CREATION_SCHEMA_CANCELLATION =\n 'dataset_creation_schema_cancellation';\nexport const LOG_ACTIONS_DATASET_CREATION_TABLE_CANCELLATION =\n 'dataset_creation_table_cancellation';\nexport const LOG_ACTIONS_DATASET_CREATION_SUCCESS = 'dataset_creation_success';\nexport const LOG_ACTIONS_SPA_NAVIGATION = 'spa_navigation';\nexport const LOG_ACTIONS_CONFIRM_OVERWRITE_DASHBOARD_METADATA =\n 'confirm_overwrite_dashboard_metadata';\nexport const LOG_ACTIONS_DASHBOARD_DOWNLOAD_AS_IMAGE =\n 'dashboard_download_as_image';\nexport const LOG_ACTIONS_DASHBOARD_DOWNLOAD_AS_PDF =\n 'dashboard_download_as_pdf';\nexport const LOG_ACTIONS_CHART_DOWNLOAD_AS_IMAGE = 'chart_download_as_image';\nexport const LOG_ACTIONS_CHART_DOWNLOAD_AS_CSV = 'chart_download_as_csv';\nexport const LOG_ACTIONS_CHART_DOWNLOAD_AS_CSV_PIVOTED =\n 'chart_download_as_csv_pivoted';\nexport const LOG_ACTIONS_CHART_DOWNLOAD_AS_XLS = 'chart_download_as_xls';\nexport const LOG_ACTIONS_CHART_DOWNLOAD_AS_JSON = 'chart_download_as_json';\nexport const LOG_ACTIONS_SQLLAB_WARN_LOCAL_STORAGE_USAGE =\n 'sqllab_warn_local_storage_usage';\nexport const LOG_ACTIONS_SQLLAB_FETCH_FAILED_QUERY =\n 'sqllab_fetch_failed_query';\nexport const LOG_ACTIONS_DRILL_BY_MODAL_OPENED = 'drill_by_modal_opened';\nexport const LOG_ACTIONS_FURTHER_DRILL_BY = 'further_drill_by';\nexport const LOG_ACTIONS_DRILL_BY_EDIT_CHART = 'drill_by_edit_chart';\nexport const LOG_ACTIONS_DRILL_BY_BREADCRUMB_CLICKED =\n 'drill_by_breadcrumb_clicked';\nexport const LOG_ACTIONS_SQLLAB_MONITOR_LOCAL_STORAGE_USAGE =\n 'sqllab_monitor_local_storage_usage';\nexport const LOG_ACTIONS_SQLLAB_CREATE_TABLE_AS = 'sqllab_create_table_as';\nexport const LOG_ACTIONS_SQLLAB_CREATE_VIEW_AS = 'sqllab_create_view_as';\nexport const LOG_ACTIONS_SQLLAB_RUN_QUERY = 'sqllab_run_query';\nexport const LOG_ACTIONS_SQLLAB_STOP_QUERY = 'sqllab_stop_query';\nexport const LOG_ACTIONS_SQLLAB_ESTIMATE_QUERY_COST =\n 'sqllab_estimate_query_cost';\nexport const LOG_ACTIONS_SQLLAB_SAVE_QUERY = 'sqllab_save_query';\nexport const LOG_ACTIONS_SQLLAB_SAVE_DATASET = 'sqllab_save_dataset';\nexport const LOG_ACTIONS_SQLLAB_COPY_LINK = 'sqllab_copy_link';\nexport const LOG_ACTIONS_SQLLAB_FORMAT_SQL = 'sqllab_format_sql';\nexport const LOG_ACTIONS_SQLLAB_DOWNLOAD_CSV = 'sqllab_download_csv';\nexport const LOG_ACTIONS_SQLLAB_COPY_RESULT_TO_CLIPBOARD =\n 'sqllab_copy_result_to_clipboard';\nexport const LOG_ACTIONS_SQLLAB_CREATE_CHART = 'sqllab_create_chart';\nexport const LOG_ACTIONS_SQLLAB_LOAD_TAB_STATE = 'sqllab_load_tab_state';\n\n// Log event types --------------------------------------------------------------\nexport const LOG_EVENT_TYPE_TIMING = new Set([\n LOG_ACTIONS_LOAD_CHART,\n LOG_ACTIONS_RENDER_CHART,\n LOG_ACTIONS_HIDE_BROWSER_TAB,\n LOG_ACTIONS_SQLLAB_FETCH_FAILED_QUERY,\n LOG_ACTIONS_SQLLAB_LOAD_TAB_STATE,\n]);\nexport const LOG_EVENT_TYPE_USER = new Set([\n LOG_ACTIONS_MOUNT_DASHBOARD,\n LOG_ACTIONS_SELECT_DASHBOARD_TAB,\n LOG_ACTIONS_EXPLORE_DASHBOARD_CHART,\n LOG_ACTIONS_FORCE_REFRESH_CHART,\n LOG_ACTIONS_EXPORT_CSV_DASHBOARD_CHART,\n LOG_ACTIONS_CHANGE_DASHBOARD_FILTER,\n LOG_ACTIONS_CHANGE_EXPLORE_CONTROLS,\n LOG_ACTIONS_TOGGLE_EDIT_DASHBOARD,\n LOG_ACTIONS_FORCE_REFRESH_DASHBOARD,\n LOG_ACTIONS_PERIODIC_RENDER_DASHBOARD,\n LOG_ACTIONS_MOUNT_EXPLORER,\n LOG_ACTIONS_CONFIRM_OVERWRITE_DASHBOARD_METADATA,\n LOG_ACTIONS_DASHBOARD_DOWNLOAD_AS_IMAGE,\n LOG_ACTIONS_DASHBOARD_DOWNLOAD_AS_PDF,\n LOG_ACTIONS_CHART_DOWNLOAD_AS_IMAGE,\n]);\n\nexport const LOG_EVENT_DATASET_TYPE_DATASET_CREATION = [\n LOG_ACTIONS_DATASET_CREATION_EMPTY_CANCELLATION,\n LOG_ACTIONS_DATASET_CREATION_DATABASE_CANCELLATION,\n LOG_ACTIONS_DATASET_CREATION_SCHEMA_CANCELLATION,\n LOG_ACTIONS_DATASET_CREATION_TABLE_CANCELLATION,\n LOG_ACTIONS_DATASET_CREATION_SUCCESS,\n];\n\nexport const Logger = {\n timeOriginOffset: 0,\n\n markTimeOrigin() {\n this.timeOriginOffset = window.performance.now();\n },\n\n // note that this returns ms since last navigation, NOT ms since epoch\n getTimestamp() {\n return Math.round(window.performance.now() - this.timeOriginOffset);\n },\n};\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { Dispatch } from 'redux';\n\nexport const LOG_EVENT = 'LOG_EVENT';\n\nexport function logEvent(eventName: string, eventData: Record) {\n return (dispatch: Dispatch) =>\n dispatch({\n type: LOG_EVENT,\n payload: {\n eventName,\n eventData,\n },\n });\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport {\n ensureIsArray,\n isFeatureEnabled,\n FeatureFlag,\n makeApi,\n SupersetClient,\n logging,\n getClientErrorObject,\n parseErrorJson,\n SupersetError,\n} from '@superset-ui/core';\nimport getBootstrapData from 'src/utils/getBootstrapData';\n\ntype AsyncEvent = {\n id?: string | null;\n channel_id: string;\n job_id: string;\n user_id?: string;\n status: string;\n errors?: SupersetError[];\n result_url: string | null;\n};\n\ntype CachedDataResponse = {\n status: string;\n data: any;\n};\ntype AppConfig = Record;\ntype ListenerFn = (asyncEvent: AsyncEvent) => Promise;\n\nconst TRANSPORT_POLLING = 'polling';\nconst TRANSPORT_WS = 'ws';\nconst JOB_STATUS = {\n PENDING: 'pending',\n RUNNING: 'running',\n ERROR: 'error',\n DONE: 'done',\n};\nconst LOCALSTORAGE_KEY = 'last_async_event_id';\nconst POLLING_URL = '/api/v1/async_event/';\nconst MAX_RETRIES = 6;\nconst RETRY_DELAY = 100;\n\nlet config: AppConfig;\nlet transport: string;\nlet pollingDelayMs: number;\nlet pollingTimeoutId: number;\nlet listenersByJobId: Record;\nlet retriesByJobId: Record;\nlet lastReceivedEventId: string | null | undefined;\n\nconst addListener = (id: string, fn: any) => {\n listenersByJobId[id] = fn;\n};\n\nconst removeListener = (id: string) => {\n if (!listenersByJobId[id]) return;\n delete listenersByJobId[id];\n};\n\nconst fetchCachedData = async (\n asyncEvent: AsyncEvent,\n): Promise => {\n let status = 'success';\n let data;\n try {\n const { json } = await SupersetClient.get({\n endpoint: String(asyncEvent.result_url),\n });\n data = 'result' in json ? json.result : json;\n } catch (response) {\n status = 'error';\n data = await getClientErrorObject(response);\n }\n\n return { status, data };\n};\n\nexport const waitForAsyncData = async (asyncResponse: AsyncEvent) =>\n new Promise((resolve, reject) => {\n const jobId = asyncResponse.job_id;\n const listener = async (asyncEvent: AsyncEvent) => {\n switch (asyncEvent.status) {\n case JOB_STATUS.DONE: {\n let { data, status } = await fetchCachedData(asyncEvent); // eslint-disable-line prefer-const\n data = ensureIsArray(data);\n if (status === 'success') {\n resolve(data);\n } else {\n reject(data);\n }\n break;\n }\n case JOB_STATUS.ERROR: {\n const err = parseErrorJson(asyncEvent);\n reject(err);\n break;\n }\n default: {\n logging.warn('received event with status', asyncEvent.status);\n }\n }\n removeListener(jobId);\n };\n addListener(jobId, listener);\n });\n\nconst fetchEvents = makeApi<\n { last_id?: string | null },\n { result: AsyncEvent[] }\n>({\n method: 'GET',\n endpoint: POLLING_URL,\n});\n\nconst setLastId = (asyncEvent: AsyncEvent) => {\n lastReceivedEventId = asyncEvent.id;\n try {\n localStorage.setItem(LOCALSTORAGE_KEY, lastReceivedEventId as string);\n } catch (err) {\n logging.warn('Error saving event Id to localStorage', err);\n }\n};\n\nexport const processEvents = async (events: AsyncEvent[]) => {\n events.forEach((asyncEvent: AsyncEvent) => {\n const jobId = asyncEvent.job_id;\n const listener = listenersByJobId[jobId];\n if (listener) {\n listener(asyncEvent);\n delete retriesByJobId[jobId];\n } else {\n // handle race condition where event is received\n // before listener is registered\n if (!retriesByJobId[jobId]) retriesByJobId[jobId] = 0;\n retriesByJobId[jobId] += 1;\n\n if (retriesByJobId[jobId] <= MAX_RETRIES) {\n setTimeout(() => {\n processEvents([asyncEvent]);\n }, RETRY_DELAY * retriesByJobId[jobId]);\n } else {\n delete retriesByJobId[jobId];\n logging.warn('listener not found for job_id', asyncEvent.job_id);\n }\n }\n setLastId(asyncEvent);\n });\n};\n\nconst loadEventsFromApi = async () => {\n const eventArgs = lastReceivedEventId ? { last_id: lastReceivedEventId } : {};\n if (Object.keys(listenersByJobId).length) {\n try {\n const { result: events } = await fetchEvents(eventArgs);\n if (events?.length) await processEvents(events);\n } catch (err) {\n logging.warn(err);\n }\n }\n\n if (transport === TRANSPORT_POLLING) {\n pollingTimeoutId = window.setTimeout(loadEventsFromApi, pollingDelayMs);\n }\n};\n\nconst wsConnectMaxRetries = 6;\nconst wsConnectErrorDelay = 2500;\nlet wsConnectRetries = 0;\nlet wsConnectTimeout: any;\nlet ws: WebSocket;\n\nconst wsConnect = (): void => {\n let url = config.GLOBAL_ASYNC_QUERIES_WEBSOCKET_URL;\n if (lastReceivedEventId) url += `?last_id=${lastReceivedEventId}`;\n ws = new WebSocket(url);\n\n ws.addEventListener('open', () => {\n logging.log('WebSocket connected');\n clearTimeout(wsConnectTimeout);\n wsConnectRetries = 0;\n });\n\n ws.addEventListener('close', () => {\n wsConnectTimeout = setTimeout(() => {\n wsConnectRetries += 1;\n if (wsConnectRetries <= wsConnectMaxRetries) {\n wsConnect();\n } else {\n logging.warn('WebSocket not available, falling back to async polling');\n loadEventsFromApi();\n }\n }, wsConnectErrorDelay);\n });\n\n ws.addEventListener('error', () => {\n // https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/readyState\n if (ws.readyState < 2) ws.close();\n });\n\n ws.addEventListener('message', async event => {\n let events: AsyncEvent[] = [];\n try {\n events = [JSON.parse(event.data)];\n await processEvents(events);\n } catch (err) {\n logging.warn(err);\n }\n });\n};\n\nexport const init = (appConfig?: AppConfig) => {\n if (!isFeatureEnabled(FeatureFlag.GlobalAsyncQueries)) return;\n if (pollingTimeoutId) clearTimeout(pollingTimeoutId);\n\n listenersByJobId = {};\n retriesByJobId = {};\n lastReceivedEventId = null;\n\n config = appConfig || getBootstrapData().common.conf;\n transport = config.GLOBAL_ASYNC_QUERIES_TRANSPORT || TRANSPORT_POLLING;\n pollingDelayMs = config.GLOBAL_ASYNC_QUERIES_POLLING_DELAY || 500;\n\n try {\n lastReceivedEventId = localStorage.getItem(LOCALSTORAGE_KEY);\n } catch (err) {\n logging.warn('Failed to fetch last event Id from localStorage');\n }\n\n if (transport === TRANSPORT_POLLING) {\n loadEventsFromApi();\n }\n if (transport === TRANSPORT_WS) {\n wsConnect();\n }\n};\n\ninit();\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { nanoid } from 'nanoid';\nimport { compose } from 'redux';\nimport persistState, { StorageAdapter } from 'redux-localstorage';\nimport {\n isEqual,\n omitBy,\n omit,\n isUndefined,\n isNull,\n isEqualWith,\n} from 'lodash';\nimport { ensureIsArray } from '@superset-ui/core';\n\nexport function addToObject(\n state: Record,\n arrKey: string,\n obj: Record,\n) {\n const newObject = { ...state[arrKey] };\n const copiedObject = { ...obj };\n\n if (!copiedObject.id) {\n copiedObject.id = nanoid();\n }\n newObject[copiedObject.id] = copiedObject;\n return { ...state, [arrKey]: newObject };\n}\n\nexport function alterInObject(\n state: Record,\n arrKey: string,\n obj: Record,\n alterations: Record,\n) {\n const newObject = { ...state[arrKey] };\n newObject[obj.id] = { ...newObject[obj.id], ...alterations };\n return { ...state, [arrKey]: newObject };\n}\n\nexport function alterInArr(\n state: Record,\n arrKey: string,\n obj: Record,\n alterations: Record,\n idKey = 'id',\n) {\n // Finds an item in an array in the state and replaces it with a\n // new object with an altered property\n const newArr: unknown[] = [];\n state[arrKey].forEach((arrItem: Record) => {\n if (obj[idKey] === arrItem[idKey]) {\n newArr.push({ ...arrItem, ...alterations });\n } else {\n newArr.push(arrItem);\n }\n });\n return { ...state, [arrKey]: newArr };\n}\n\nexport function removeFromArr(\n state: Record,\n arrKey: string,\n obj: Record,\n idKey = 'id',\n) {\n const newArr: unknown[] = [];\n state[arrKey].forEach((arrItem: Record) => {\n if (!(obj[idKey] === arrItem[idKey])) {\n newArr.push(arrItem);\n }\n });\n return { ...state, [arrKey]: newArr };\n}\n\nexport function getFromArr(arr: Record[], id: string) {\n let obj;\n arr.forEach(o => {\n if (o.id === id) {\n obj = o;\n }\n });\n return obj;\n}\n\nexport function addToArr(\n state: Record,\n arrKey: string,\n obj: Record,\n prepend = false,\n) {\n const newObj = { ...obj };\n if (!newObj.id) {\n newObj.id = nanoid();\n }\n const newState = {};\n if (prepend) {\n newState[arrKey] = [newObj, ...state[arrKey]];\n } else {\n newState[arrKey] = [...state[arrKey], newObj];\n }\n return { ...state, ...newState };\n}\n\nexport function extendArr(\n state: Record,\n arrKey: string,\n arr: Record[],\n prepend = false,\n) {\n const newArr = [...arr];\n newArr.forEach(el => {\n if (!el.id) {\n /* eslint-disable no-param-reassign */\n el.id = nanoid();\n }\n });\n const newState = {};\n if (prepend) {\n newState[arrKey] = [...newArr, ...state[arrKey]];\n } else {\n newState[arrKey] = [...state[arrKey], ...newArr];\n }\n return { ...state, ...newState };\n}\n\nexport function initEnhancer(\n persist = true,\n persistConfig: { paths?: StorageAdapter; config?: string } = {},\n disableDebugger = false,\n) {\n const { paths, config } = persistConfig;\n const composeEnhancers =\n process.env.WEBPACK_MODE === 'development' && disableDebugger !== true\n ? /* eslint-disable-next-line no-underscore-dangle, dot-notation */\n window['__REDUX_DEVTOOLS_EXTENSION_COMPOSE__']\n ? /* eslint-disable-next-line no-underscore-dangle, dot-notation */\n window['__REDUX_DEVTOOLS_EXTENSION_COMPOSE__']({\n trace: true,\n })\n : compose\n : compose;\n\n return persist\n ? composeEnhancers(persistState(paths, config))\n : composeEnhancers();\n}\n\nexport function areArraysShallowEqual(arr1: unknown[], arr2: unknown[]) {\n // returns whether 2 arrays are shallow equal\n // used in shouldComponentUpdate when denormalizing arrays\n // where the array object is different every time, but the content might\n // be the same\n if (!arr1 || !arr2) {\n return false;\n }\n if (arr1.length !== arr2.length) {\n return false;\n }\n const { length } = arr1;\n for (let i = 0; i < length; i += 1) {\n if (arr1[i] !== arr2[i]) {\n return false;\n }\n }\n return true;\n}\n\nexport function areObjectsEqual(\n obj1: any,\n obj2: any,\n opts: {\n ignoreUndefined?: boolean;\n ignoreNull?: boolean;\n ignoreFields?: string[];\n } = { ignoreUndefined: false, ignoreNull: false, ignoreFields: [] },\n) {\n let comp1 = obj1;\n let comp2 = obj2;\n if (opts.ignoreUndefined) {\n comp1 = omitBy(comp1, isUndefined);\n comp2 = omitBy(comp2, isUndefined);\n }\n if (opts.ignoreNull) {\n comp1 = omitBy(comp1, isNull);\n comp2 = omitBy(comp2, isNull);\n }\n if (opts.ignoreFields?.length) {\n const ignoreFields = ensureIsArray(opts.ignoreFields);\n return isEqualWith(comp1, comp2, (val1, val2) =>\n isEqual(\n ensureIsArray(val1).map(value => omit(value, ignoreFields)),\n ensureIsArray(val2).map(value => omit(value, ignoreFields)),\n ),\n );\n }\n return isEqual(comp1, comp2);\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {\n CategoricalColorNamespace,\n getCategoricalSchemeRegistry,\n getLabelsColorMap,\n} from '@superset-ui/core';\n\n/**\n * Force falsy namespace values to undefined to default to GLOBAL\n *\n * @param namespace\n * @returns - namespace or default undefined\n */\nexport const getColorNamespace = (namespace?: string) => namespace || undefined;\n\n/**\n *\n * Field shared_label_colors used to be a dict of all colors for all labels.\n * Force shared_label_colors field to be a list of actual shared labels.\n *\n * @param sharedLabelsColors - the shared label colors list\n * @returns string[]\n */\nexport const enforceSharedLabelsColorsArray = (\n sharedLabelsColors: string[] | Record | undefined,\n) => (Array.isArray(sharedLabelsColors) ? sharedLabelsColors : []);\n\n/**\n * Get labels shared across all charts in a dashboard.\n * Merges a fresh instance of shared label colors with a stored one.\n *\n * @param currentSharedLabels - existing shared labels to merge with fresh\n * @returns Record\n */\nexport const getFreshSharedLabels = (\n currentSharedLabels: string[] = [],\n): string[] => {\n const { chartsLabelsMap } = getLabelsColorMap();\n const allLabels = Array.from(chartsLabelsMap.values()).flatMap(\n ({ labels }) => labels,\n );\n\n const duplicates = Array.from(\n allLabels.reduce(\n (counts, label) => counts.set(label, (counts.get(label) || 0) + 1),\n new Map(),\n ),\n )\n .filter(([, count]) => count > 1)\n .map(([label]) => label);\n\n return Array.from(new Set([...currentSharedLabels, ...duplicates]));\n};\n\nexport const getSharedLabelsColorMapEntries = (\n currentColorMap: Record,\n sharedLabels: string[],\n): Record =>\n Object.fromEntries(\n Object.entries(currentColorMap).filter(([label]) =>\n sharedLabels.includes(label),\n ),\n );\n\n/**\n * Returns all entries (labels and colors) except custom label colors.\n *\n * @param customLabelsColor - the custom label colors in label_colors field\n * @returns all color entries except custom label colors\n */\nexport const getLabelsColorMapEntries = (\n customLabelsColor: Record = {},\n): Record => {\n const labelsColorMapInstance = getLabelsColorMap();\n const allEntries = Object.fromEntries(labelsColorMapInstance.getColorMap());\n\n // custom label colors are applied and stored separetely via label_colors\n // removing all instances of custom label colors from the entries\n Object.keys(customLabelsColor).forEach(label => {\n delete allEntries[label];\n });\n\n return allEntries;\n};\n\nexport const getColorSchemeDomain = (colorScheme: string) =>\n getCategoricalSchemeRegistry().get(colorScheme)?.colors || [];\n\n/**\n * Compare the current labels color map with a fresh one\n *\n * @param currentLabelsColorMap - the current labels color map\n * @returns true if the labels color map is the same as fresh\n */\nexport const isLabelsColorMapSynced = (\n metadata: Record,\n): boolean => {\n const storedLabelsColorMap = metadata.map_label_colors || {};\n const customLabelColors = metadata.label_colors || {};\n const freshColorMap = getLabelsColorMap().getColorMap();\n const fullFreshColorMap = {\n ...Object.fromEntries(freshColorMap),\n ...customLabelColors,\n };\n\n const isSynced = Object.entries(fullFreshColorMap).every(\n ([label, color]) =>\n storedLabelsColorMap.hasOwnProperty(label) &&\n storedLabelsColorMap[label] === color,\n );\n\n return isSynced;\n};\n\n/**\n * Annihilate color maps\n *\n * @param color_namespace - the categorical namespace\n */\nexport const resetColors = (color_namespace?: string) => {\n const labelsColorMapInstance = getLabelsColorMap();\n const categoricalNamespace = CategoricalColorNamespace.getNamespace(\n getColorNamespace(color_namespace),\n );\n categoricalNamespace.resetColors();\n labelsColorMapInstance.reset();\n};\n\n/**\n * Update the labels color map based on current color scheme\n * It will respect custom label colors if set via namespace\n *\n * @param namespace - the color namespace\n * @param colorScheme - the current color scheme\n */\nexport const refreshLabelsColorMap = (\n namespace?: string,\n colorScheme?: string,\n merge = false,\n) => {\n const colorNameSpace = getColorNamespace(namespace);\n const categoricalNamespace =\n CategoricalColorNamespace.getNamespace(colorNameSpace);\n const labelsColorMapInstance = getLabelsColorMap();\n\n labelsColorMapInstance.updateColorMap(\n categoricalNamespace,\n colorScheme,\n merge,\n );\n};\n\n/**\n * Merge labels colors with custom labels colors\n * Apply labels color based on chosen color scheme\n *\n * @param metadata - the dashboard metadata object\n */\nexport const applyColors = (\n metadata: Record,\n // Create a fresh color map by changing color scheme\n fresh: boolean | string[] = false,\n // Catch new labels in the color map as they appear\n merge = false,\n // Apply only label colors that are shared across multiple charts.\n shared = false,\n) => {\n const colorNameSpace = getColorNamespace(metadata?.color_namespace);\n const categoricalNamespace =\n CategoricalColorNamespace.getNamespace(colorNameSpace);\n const colorScheme = metadata?.color_scheme;\n const fullLabelsColor = metadata?.map_label_colors || {};\n const sharedLabels = enforceSharedLabelsColorsArray(\n metadata?.shared_label_colors,\n );\n const customLabelsColor = metadata?.label_colors || {};\n const sharedLabelsColor = getSharedLabelsColorMapEntries(\n fullLabelsColor,\n sharedLabels,\n );\n\n if (fresh && !Array.isArray(fresh)) {\n // reset custom label colors\n // re-evaluate all other label colors\n categoricalNamespace.resetColors();\n }\n\n if (fresh && Array.isArray(fresh)) {\n // when a color scheme is not set for the dashboard\n // should only reset colors for charts that have changed scheme\n // while keeping colors of existing shared label colors intact\n // this is used also to reset custom label colors when added or removed\n categoricalNamespace.resetColorsForLabels(fresh);\n }\n\n if (fresh || merge) {\n // re-instantiate a fresh labels color map based on current scheme\n // it consider just applied custom label colors if present and all forced colors\n // it will merge with the existing color map new labels only when merge is true\n refreshLabelsColorMap(metadata?.color_namespace, colorScheme, merge);\n }\n\n let applicableColorMapEntries: Record = fullLabelsColor;\n if (fresh) {\n // requires a new map all together\n applicableColorMapEntries = {\n ...getLabelsColorMapEntries(customLabelsColor),\n };\n }\n if (merge) {\n // must only add up newly appearing labels\n // without overriding existing ones\n applicableColorMapEntries = {\n ...fullLabelsColor,\n ...getLabelsColorMapEntries(customLabelsColor),\n };\n }\n\n if (shared) {\n // must apply the colors to only shared labels\n applicableColorMapEntries = sharedLabelsColor;\n }\n\n applicableColorMapEntries = {\n ...applicableColorMapEntries,\n ...customLabelsColor,\n };\n\n // apply the final color map\n if (applicableColorMapEntries) {\n Object.keys(applicableColorMapEntries).forEach(label => {\n categoricalNamespace.setColor(label, applicableColorMapEntries[label]);\n });\n }\n};\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport { isSafari } from './common';\n\n// Use the new Clipboard API if the browser supports it\nconst copyTextWithClipboardApi = async (getText: () => Promise) => {\n // Safari (WebKit) does not support delayed generation of clipboard.\n // This means that writing to the clipboard, from the moment the user\n // interacts with the app, must be instantaneous.\n // However, neither writeText nor write accepts a Promise, so\n // we need to create a ClipboardItem that accepts said Promise to\n // delay the text generation, as needed.\n // Source: https://bugs.webkit.org/show_bug.cgi?id=222262P\n if (isSafari()) {\n try {\n const clipboardItem = new ClipboardItem({\n 'text/plain': getText(),\n });\n await navigator.clipboard.write([clipboardItem]);\n } catch {\n // Fallback to default clipboard API implementation\n const text = await getText();\n await navigator.clipboard.writeText(text);\n }\n } else {\n // For Blink, the above method won't work, but we can use the\n // default (intended) API, since the delayed generation of the\n // clipboard is now supported.\n // Source: https://bugs.chromium.org/p/chromium/issues/detail?id=1014310\n const text = await getText();\n await navigator.clipboard.writeText(text);\n }\n};\n\nconst copyTextToClipboard = (getText: () => Promise) =>\n copyTextWithClipboardApi(getText)\n // If the Clipboard API is not supported, fallback to the older method.\n .catch(() =>\n getText().then(\n text =>\n new Promise((resolve, reject) => {\n const selection: Selection | null = document.getSelection();\n if (selection) {\n selection.removeAllRanges();\n const range = document.createRange();\n const span = document.createElement('span');\n span.textContent = text;\n span.style.position = 'fixed';\n span.style.top = '0';\n span.style.clip = 'rect(0, 0, 0, 0)';\n span.style.whiteSpace = 'pre';\n\n document.body.appendChild(span);\n range.selectNode(span);\n selection.addRange(range);\n\n try {\n if (!document.execCommand('copy')) {\n reject();\n }\n } catch (err) {\n reject();\n }\n\n document.body.removeChild(span);\n if (selection.removeRange) {\n selection.removeRange(range);\n } else {\n selection.removeAllRanges();\n }\n }\n\n resolve();\n }),\n ),\n );\n\nexport default copyTextToClipboard;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport memoizeOne from 'memoize-one';\nimport { UserRoles } from 'src/types/bootstrapTypes';\n\nexport const findPermission = memoizeOne(\n (perm: string, view: string, roles?: UserRoles | null) =>\n !!roles &&\n Object.values(roles).some(permissions =>\n permissions.some(([perm_, view_]) => perm_ === perm && view_ === view),\n ),\n);\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { Dataset } from '@superset-ui/chart-controls';\n\nexport const getDatasourceUid = (datasource: Dataset) =>\n datasource.uid ?? `${datasource.id ?? 'None'}__${datasource.type}`;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n// navigator.webdriver is true when browser is controlled by a bot\nexport const isCurrentUserBot = () => window?.navigator?.webdriver;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n/**\n * A Stringify function that will not crash when it runs into circular JSON references,\n * unlike JSON.stringify. Any circular references are simply omitted, as if there had\n * been no data present\n * @param object any JSON object to be stringified\n */\nexport function safeStringify(object: any): string {\n const cache = new Set();\n return JSON.stringify(object, (key, value) => {\n if (typeof value === 'object' && value !== null) {\n if (cache.has(value)) {\n // We've seen this object before\n try {\n // Quick deep copy to duplicate if this is a repeat rather than a circle.\n return JSON.parse(JSON.stringify(value));\n } catch (err) {\n // Discard key if value cannot be duplicated.\n return; // eslint-disable-line consistent-return\n }\n }\n // Store the value in our cache.\n cache.add(value);\n }\n return value;\n });\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport {\n isDefined,\n JsonObject,\n QueryFormData,\n SupersetClient,\n} from '@superset-ui/core';\nimport rison from 'rison';\nimport { isEmpty } from 'lodash';\nimport {\n RESERVED_CHART_URL_PARAMS,\n RESERVED_DASHBOARD_URL_PARAMS,\n URL_PARAMS,\n} from '../constants';\nimport { getActiveFilters } from '../dashboard/util/activeDashboardFilters';\nimport serializeActiveFilterValues from '../dashboard/util/serializeActiveFilterValues';\n\nexport type UrlParamType = 'string' | 'number' | 'boolean' | 'object' | 'rison';\nexport type UrlParam = (typeof URL_PARAMS)[keyof typeof URL_PARAMS];\nexport function getUrlParam(\n param: UrlParam & { type: 'string' },\n): string | null;\nexport function getUrlParam(\n param: UrlParam & { type: 'number' },\n): number | null;\nexport function getUrlParam(\n param: UrlParam & { type: 'boolean' },\n): boolean | null;\nexport function getUrlParam(\n param: UrlParam & { type: 'object' },\n): object | null;\nexport function getUrlParam(param: UrlParam & { type: 'rison' }): object | null;\nexport function getUrlParam(\n param: UrlParam & { type: 'rison | string' },\n): string | object | null;\nexport function getUrlParam({ name, type }: UrlParam): unknown {\n const urlParam = new URLSearchParams(window.location.search).get(name);\n switch (type) {\n case 'number':\n if (!urlParam) {\n return null;\n }\n if (urlParam.toLowerCase() === 'true') {\n return 1;\n }\n if (urlParam.toLowerCase() === 'false') {\n return 0;\n }\n if (!Number.isNaN(Number(urlParam))) {\n return Number(urlParam);\n }\n return null;\n case 'object':\n if (!urlParam) {\n return null;\n }\n return JSON.parse(urlParam);\n case 'boolean':\n if (!urlParam) {\n return null;\n }\n return urlParam.toLowerCase() !== 'false' && urlParam !== '0';\n case 'rison':\n if (!urlParam) {\n return null;\n }\n try {\n return rison.decode(urlParam);\n } catch {\n return urlParam;\n }\n default:\n return urlParam;\n }\n}\n\nfunction getUrlParams(excludedParams: string[]): URLSearchParams {\n const urlParams = new URLSearchParams();\n const currentParams = new URLSearchParams(window.location.search);\n currentParams.forEach((value, key) => {\n if (!excludedParams.includes(key)) urlParams.append(key, value);\n });\n return urlParams;\n}\n\nexport type UrlParamEntries = [string, string][];\n\nfunction getUrlParamEntries(urlParams: URLSearchParams): UrlParamEntries {\n const urlEntries: [string, string][] = [];\n urlParams.forEach((value, key) => urlEntries.push([key, value]));\n return urlEntries;\n}\n\nfunction getChartUrlParams(excludedUrlParams?: string[]): UrlParamEntries {\n const excludedParams = excludedUrlParams || RESERVED_CHART_URL_PARAMS;\n const urlParams = getUrlParams(excludedParams);\n const filterBoxFilters = getActiveFilters();\n if (\n !isEmpty(filterBoxFilters) &&\n !excludedParams.includes(URL_PARAMS.preselectFilters.name)\n )\n urlParams.append(\n URL_PARAMS.preselectFilters.name,\n JSON.stringify(serializeActiveFilterValues(getActiveFilters())),\n );\n return getUrlParamEntries(urlParams);\n}\n\nexport function getDashboardUrlParams(\n extraExcludedParams: string[] = [],\n): UrlParamEntries {\n const urlParams = getUrlParams([\n ...RESERVED_DASHBOARD_URL_PARAMS,\n ...extraExcludedParams,\n ]);\n const filterBoxFilters = getActiveFilters();\n if (!isEmpty(filterBoxFilters))\n urlParams.append(\n URL_PARAMS.preselectFilters.name,\n JSON.stringify(serializeActiveFilterValues(getActiveFilters())),\n );\n return getUrlParamEntries(urlParams);\n}\n\nfunction getPermalink(endpoint: string, jsonPayload: JsonObject) {\n return SupersetClient.post({\n endpoint,\n jsonPayload,\n }).then(result => result.json.url as string);\n}\n\nexport function getChartPermalink(\n formData: Pick,\n excludedUrlParams?: string[],\n) {\n return getPermalink('/api/v1/explore/permalink', {\n formData,\n urlParams: getChartUrlParams(excludedUrlParams),\n });\n}\n\nexport function getDashboardPermalink({\n dashboardId,\n dataMask,\n activeTabs,\n anchor, // the anchor part of the link which corresponds to the tab/chart id\n}: {\n dashboardId: string | number;\n /**\n * Current applied data masks (for native filters).\n */\n dataMask: JsonObject;\n /**\n * Current active tabs in the dashboard.\n */\n activeTabs: string[];\n /**\n * The \"anchor\" component for the permalink. It will be scrolled into view\n * and highlighted upon page load.\n */\n anchor?: string;\n}) {\n // only encode filter state if non-empty\n return getPermalink(`/api/v1/dashboard/${dashboardId}/permalink`, {\n urlParams: getDashboardUrlParams(),\n dataMask,\n activeTabs,\n anchor,\n });\n}\n\nconst externalUrlRegex =\n /^([^:/?#]+:)?(?:(\\/\\/)?([^/?#]*))?([^?#]+)?(\\?[^#]*)?(#.*)?/;\n\n// group 1 matches protocol\n// group 2 matches '//'\n// group 3 matches hostname\nexport function isUrlExternal(url: string) {\n const match = url.match(externalUrlRegex) || [];\n return (\n (typeof match[1] === 'string' && match[1].length > 0) ||\n match[2] === '//' ||\n (typeof match[3] === 'string' && match[3].length > 0)\n );\n}\n\nexport function parseUrl(url: string) {\n const match = url.match(externalUrlRegex) || [];\n // if url is external but start with protocol or '//',\n // it can't be used correctly with element\n // in such case, add '//' prefix\n if (isUrlExternal(url) && !isDefined(match[1]) && !url.startsWith('//')) {\n return `//${url}`;\n }\n return url;\n}\n\nexport function toQueryString(params: Record): string {\n const queryParts: string[] = [];\n Object.keys(params).forEach(key => {\n const value = params[key];\n if (value !== null && value !== undefined) {\n queryParts.push(\n `${encodeURIComponent(key)}=${encodeURIComponent(value)}`,\n );\n }\n });\n return queryParts.length > 0 ? `?${queryParts.join('&')}` : '';\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport {\n COLUMN_TYPE,\n CHART_TYPE,\n MARKDOWN_TYPE,\n DYNAMIC_TYPE,\n} from './componentTypes';\n\nexport default function componentIsResizable(entity: { type: string }) {\n return (\n [COLUMN_TYPE, CHART_TYPE, MARKDOWN_TYPE, DYNAMIC_TYPE].indexOf(\n entity.type,\n ) > -1\n );\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport {\n DASHBOARD_GRID_TYPE,\n CHART_TYPE,\n COLUMN_TYPE,\n MARKDOWN_TYPE,\n TAB_TYPE,\n} from './componentTypes';\n\nconst typeToWrapChildLookup = {\n [DASHBOARD_GRID_TYPE]: {\n [CHART_TYPE]: true,\n [COLUMN_TYPE]: true,\n [MARKDOWN_TYPE]: true,\n },\n\n [TAB_TYPE]: {\n [CHART_TYPE]: true,\n [COLUMN_TYPE]: true,\n [MARKDOWN_TYPE]: true,\n },\n};\n\nexport default function shouldWrapChildInRow({ parentType, childType }) {\n if (!parentType || !childType) return false;\n\n const wrapChildLookup = typeToWrapChildLookup[parentType];\n if (!wrapChildLookup) return false;\n\n return Boolean(wrapChildLookup[childType]);\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport componentIsResizable from './componentIsResizable';\nimport shouldWrapChildInRow from './shouldWrapChildInRow';\nimport newComponentFactory from './newComponentFactory';\nimport getComponentWidthFromDrop from './getComponentWidthFromDrop';\n\nimport { ROW_TYPE, TABS_TYPE, TAB_TYPE } from './componentTypes';\n\nexport default function newEntitiesFromDrop({ dropResult, layout }) {\n const { dragging, destination } = dropResult;\n\n const dragType = dragging.type;\n const dropEntity = layout[destination.id];\n const dropType = dropEntity.type;\n let newDropChild = newComponentFactory(dragType, dragging.meta);\n newDropChild.parents = (dropEntity.parents || []).concat(dropEntity.id);\n\n if (componentIsResizable(dragging)) {\n newDropChild.meta.width = // don't set a 0 width\n getComponentWidthFromDrop({ dropResult, layout }) || undefined;\n }\n\n const wrapChildInRow = shouldWrapChildInRow({\n parentType: dropType,\n childType: dragType,\n });\n\n const newEntities = {\n [newDropChild.id]: newDropChild,\n };\n\n if (wrapChildInRow) {\n const rowWrapper = newComponentFactory(ROW_TYPE);\n rowWrapper.children = [newDropChild.id];\n rowWrapper.parents = (dropEntity.parents || []).concat(dropEntity.id);\n newEntities[rowWrapper.id] = rowWrapper;\n newDropChild.parents = rowWrapper.parents.concat(rowWrapper.id);\n newDropChild = rowWrapper;\n } else if (dragType === TABS_TYPE) {\n // create a new tab component\n const tabChild = newComponentFactory(TAB_TYPE);\n tabChild.parents = (dropEntity.parents || []).concat(dropEntity.id);\n newDropChild.children = [tabChild.id];\n newEntities[tabChild.id] = tabChild;\n }\n\n const nextDropChildren = [...dropEntity.children];\n nextDropChildren.splice(destination.index, 0, newDropChild.id);\n\n newEntities[destination.id] = {\n ...dropEntity,\n children: nextDropChildren,\n };\n\n return newEntities;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport {\n DASHBOARD_ROOT_ID,\n DASHBOARD_GRID_ID,\n NEW_COMPONENTS_SOURCE_ID,\n DASHBOARD_HEADER_ID,\n} from '../util/constants';\nimport componentIsResizable from '../util/componentIsResizable';\nimport findParentId from '../util/findParentId';\nimport getComponentWidthFromDrop from '../util/getComponentWidthFromDrop';\nimport updateComponentParentsList from '../util/updateComponentParentsList';\nimport newComponentFactory from '../util/newComponentFactory';\nimport newEntitiesFromDrop from '../util/newEntitiesFromDrop';\nimport reorderItem from '../util/dnd-reorder';\nimport shouldWrapChildInRow from '../util/shouldWrapChildInRow';\nimport { ROW_TYPE, TAB_TYPE, TABS_TYPE } from '../util/componentTypes';\n\nimport {\n UPDATE_COMPONENTS,\n UPDATE_COMPONENTS_PARENTS_LIST,\n DELETE_COMPONENT,\n CREATE_COMPONENT,\n MOVE_COMPONENT,\n CREATE_TOP_LEVEL_TABS,\n DELETE_TOP_LEVEL_TABS,\n DASHBOARD_TITLE_CHANGED,\n} from '../actions/dashboardLayout';\n\nimport { HYDRATE_DASHBOARD } from '../actions/hydrate';\n\nexport function recursivelyDeleteChildren(\n componentId,\n componentParentId,\n nextComponents,\n) {\n // delete child and it's children\n const component = nextComponents?.[componentId];\n if (component) {\n // eslint-disable-next-line no-param-reassign\n delete nextComponents[componentId];\n\n const { children = [] } = component;\n children?.forEach?.(childId => {\n recursivelyDeleteChildren(childId, componentId, nextComponents);\n });\n\n const parent = nextComponents?.[componentParentId];\n if (Array.isArray(parent?.children)) {\n // may have been deleted in another recursion\n const componentIndex = parent.children.indexOf(componentId);\n if (componentIndex > -1) {\n const nextChildren = [...parent.children];\n nextChildren.splice(componentIndex, 1);\n // eslint-disable-next-line no-param-reassign\n nextComponents[componentParentId] = {\n ...parent,\n children: nextChildren,\n };\n }\n }\n }\n}\n\nconst actionHandlers = {\n [HYDRATE_DASHBOARD](state, action) {\n return {\n ...action.data.dashboardLayout.present,\n };\n },\n\n [UPDATE_COMPONENTS](state, action) {\n const {\n payload: { nextComponents },\n } = action;\n return {\n ...state,\n ...nextComponents,\n };\n },\n\n [DELETE_COMPONENT](state, action) {\n const {\n payload: { id, parentId },\n } = action;\n\n if (!parentId || !id || !state[id] || !state[parentId]) return state;\n\n const nextComponents = { ...state };\n\n recursivelyDeleteChildren(id, parentId, nextComponents);\n const nextParent = nextComponents[parentId];\n if (nextParent?.type === ROW_TYPE && nextParent?.children?.length === 0) {\n const grandparentId = findParentId({\n childId: parentId,\n layout: nextComponents,\n });\n recursivelyDeleteChildren(parentId, grandparentId, nextComponents);\n }\n\n return nextComponents;\n },\n\n [CREATE_COMPONENT](state, action) {\n const {\n payload: { dropResult },\n } = action;\n\n const newEntities = newEntitiesFromDrop({ dropResult, layout: state });\n\n return {\n ...state,\n ...newEntities,\n };\n },\n\n [MOVE_COMPONENT](state, action) {\n const {\n payload: { dropResult },\n } = action;\n const { source, destination, dragging } = dropResult;\n\n if (!source || !destination || !dragging) return state;\n\n const nextEntities = reorderItem({\n entitiesMap: state,\n source,\n destination,\n });\n\n if (componentIsResizable(nextEntities[dragging.id])) {\n // update component width if it changed\n const nextWidth =\n getComponentWidthFromDrop({\n dropResult,\n layout: state,\n }) || undefined; // don't set a 0 width\n if ((nextEntities[dragging.id].meta || {}).width !== nextWidth) {\n nextEntities[dragging.id] = {\n ...nextEntities[dragging.id],\n meta: {\n ...nextEntities[dragging.id].meta,\n width: nextWidth,\n },\n };\n }\n }\n\n // wrap the dragged component in a row depending on destination type\n const wrapInRow = shouldWrapChildInRow({\n parentType: destination.type,\n childType: dragging.type,\n });\n\n if (wrapInRow) {\n const destinationEntity = nextEntities[destination.id];\n const destinationChildren = destinationEntity.children;\n const newRow = newComponentFactory(ROW_TYPE);\n newRow.children = [destinationChildren[destination.index]];\n newRow.parents = (destinationEntity.parents || []).concat(destination.id);\n destinationChildren[destination.index] = newRow.id;\n nextEntities[newRow.id] = newRow;\n }\n\n return {\n ...state,\n ...nextEntities,\n };\n },\n\n [CREATE_TOP_LEVEL_TABS](state, action) {\n const {\n payload: { dropResult },\n } = action;\n const { source, dragging } = dropResult;\n\n // move children of current root to be children of the dragging tab\n const rootComponent = state[DASHBOARD_ROOT_ID];\n const topLevelId = rootComponent.children[0];\n const topLevelComponent = state[topLevelId];\n\n if (source.id !== NEW_COMPONENTS_SOURCE_ID) {\n // component already exists\n const draggingTabs = state[dragging.id];\n const draggingTabId = draggingTabs.children[0];\n const draggingTab = state[draggingTabId];\n\n // move all children except the one that is dragging\n const childrenToMove = [...topLevelComponent.children].filter(\n id => id !== dragging.id,\n );\n\n return {\n ...state,\n [DASHBOARD_ROOT_ID]: {\n ...rootComponent,\n children: [dragging.id],\n },\n [topLevelId]: {\n ...topLevelComponent,\n children: [],\n },\n [draggingTabId]: {\n ...draggingTab,\n children: [...draggingTab.children, ...childrenToMove],\n },\n };\n }\n\n // create new component\n const newEntities = newEntitiesFromDrop({ dropResult, layout: state });\n const newEntitiesArray = Object.values(newEntities);\n const tabComponent = newEntitiesArray.find(\n component => component.type === TAB_TYPE,\n );\n const tabsComponent = newEntitiesArray.find(\n component => component.type === TABS_TYPE,\n );\n\n tabComponent.children = [...topLevelComponent.children];\n newEntities[topLevelId] = { ...topLevelComponent, children: [] };\n newEntities[DASHBOARD_ROOT_ID] = {\n ...rootComponent,\n children: [tabsComponent.id],\n };\n\n return {\n ...state,\n ...newEntities,\n };\n },\n\n [DELETE_TOP_LEVEL_TABS](state) {\n const rootComponent = state[DASHBOARD_ROOT_ID];\n const topLevelId = rootComponent.children[0];\n const topLevelTabs = state[topLevelId];\n\n if (topLevelTabs.type !== TABS_TYPE) return state;\n\n let childrenToMove = [];\n const nextEntities = { ...state };\n\n topLevelTabs.children.forEach(tabId => {\n const tabComponent = state[tabId];\n childrenToMove = [...childrenToMove, ...tabComponent.children];\n delete nextEntities[tabId];\n });\n\n delete nextEntities[topLevelId];\n\n nextEntities[DASHBOARD_ROOT_ID] = {\n ...rootComponent,\n children: [DASHBOARD_GRID_ID],\n };\n\n nextEntities[DASHBOARD_GRID_ID] = {\n ...state[DASHBOARD_GRID_ID],\n children: childrenToMove,\n };\n\n return nextEntities;\n },\n\n [UPDATE_COMPONENTS_PARENTS_LIST](state) {\n const nextState = {\n ...state,\n };\n\n updateComponentParentsList({\n currentComponent: nextState[DASHBOARD_ROOT_ID],\n layout: nextState,\n });\n\n return {\n ...nextState,\n };\n },\n\n [DASHBOARD_TITLE_CHANGED](state, action) {\n return {\n ...state,\n [DASHBOARD_HEADER_ID]: {\n ...state[DASHBOARD_HEADER_ID],\n meta: {\n ...state[DASHBOARD_HEADER_ID].meta,\n text: action.text,\n },\n },\n };\n },\n};\n\nexport default function layoutReducer(state = {}, action) {\n if (action.type in actionHandlers) {\n const handler = actionHandlers[action.type];\n return handler(state, action);\n }\n\n return state;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nexport function reorder(list, startIndex, endIndex) {\n const result = [...list];\n const [removed] = result.splice(startIndex, 1);\n result.splice(endIndex, 0, removed);\n\n return result;\n}\n\nexport default function reorderItem({ entitiesMap, source, destination }) {\n const current = [...entitiesMap[source.id].children];\n const next = [...entitiesMap[destination.id].children];\n const target = current[source.index];\n\n // moving to same list\n if (source.id === destination.id) {\n const reordered = reorder(current, source.index, destination.index);\n\n const result = {\n ...entitiesMap,\n [source.id]: {\n ...entitiesMap[source.id],\n children: reordered,\n },\n };\n\n return result;\n }\n\n // moving to different list\n current.splice(source.index, 1); // remove from original\n next.splice(destination.index, 0, target); // insert into next\n\n const result = {\n ...entitiesMap,\n [source.id]: {\n ...entitiesMap[source.id],\n children: current,\n },\n [destination.id]: {\n ...entitiesMap[destination.id],\n children: next,\n },\n };\n\n return result;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport undoable, { includeAction } from 'redux-undo';\nimport { UNDO_LIMIT } from '../util/constants';\nimport {\n UPDATE_COMPONENTS,\n DELETE_COMPONENT,\n CREATE_COMPONENT,\n CREATE_TOP_LEVEL_TABS,\n DELETE_TOP_LEVEL_TABS,\n RESIZE_COMPONENT,\n MOVE_COMPONENT,\n HANDLE_COMPONENT_DROP,\n} from '../actions/dashboardLayout';\n\nimport { HYDRATE_DASHBOARD } from '../actions/hydrate';\n\nimport dashboardLayout from './dashboardLayout';\n\nexport default undoable(dashboardLayout, {\n // +1 because length of history seems max out at limit - 1\n // +1 again so we can detect if we've exceeded the limit\n limit: UNDO_LIMIT + 2,\n ignoreInitialState: true,\n filter: includeAction([\n HYDRATE_DASHBOARD,\n UPDATE_COMPONENTS,\n DELETE_COMPONENT,\n CREATE_COMPONENT,\n CREATE_TOP_LEVEL_TABS,\n DELETE_TOP_LEVEL_TABS,\n RESIZE_COMPONENT,\n MOVE_COMPONENT,\n HANDLE_COMPONENT_DROP,\n ]),\n});\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { debounce } from 'lodash';\n\nclass DebouncedMessageQueue {\n constructor({\n callback = () => {},\n sizeThreshold = 1000,\n delayThreshold = 1000,\n }) {\n this.queue = [];\n this.sizeThreshold = sizeThreshold;\n this.delayThreshold = delayThreshold;\n\n this.trigger = debounce(this.trigger.bind(this), this.delayThreshold);\n this.callback = callback;\n }\n\n append(eventData) {\n this.queue.push(eventData);\n this.trigger();\n }\n\n trigger() {\n if (this.queue.length > 0) {\n const events = this.queue.splice(0, this.sizeThreshold);\n this.callback.call(null, events);\n\n // If there are remaining items, call it again.\n if (this.queue.length > 0) {\n this.trigger();\n }\n }\n }\n}\n\nexport default DebouncedMessageQueue;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n/* eslint-disable camelcase */\n/* eslint prefer-const: 2 */\nimport { nanoid } from 'nanoid';\nimport { SupersetClient } from '@superset-ui/core';\n\nimport { safeStringify } from '../utils/safeStringify';\nimport { LOG_EVENT } from '../logger/actions';\nimport { LOG_EVENT_TYPE_TIMING } from '../logger/LogUtils';\nimport DebouncedMessageQueue from '../utils/DebouncedMessageQueue';\n\nconst LOG_ENDPOINT = '/superset/log/?explode=events';\nconst sendBeacon = events => {\n if (events.length <= 0) {\n return;\n }\n\n let endpoint = LOG_ENDPOINT;\n const { source, source_id } = events[0];\n // backend logs treat these request params as first-class citizens\n if (source === 'dashboard') {\n endpoint += `&dashboard_id=${source_id}`;\n } else if (source === 'slice') {\n endpoint += `&slice_id=${source_id}`;\n }\n\n if (navigator.sendBeacon) {\n const formData = new FormData();\n formData.append('events', safeStringify(events));\n if (SupersetClient.getGuestToken()) {\n // if we have a guest token, we need to send it for auth via the form\n formData.append('guest_token', SupersetClient.getGuestToken());\n }\n navigator.sendBeacon(endpoint, formData);\n } else {\n SupersetClient.post({\n endpoint,\n postPayload: { events },\n parseMethod: null,\n });\n }\n};\n\n// beacon API has data size limit = 2^16.\n// assume avg each log entry has 2^6 characters\nconst MAX_EVENTS_PER_REQUEST = 1024;\nconst logMessageQueue = new DebouncedMessageQueue({\n callback: sendBeacon,\n sizeThreshold: MAX_EVENTS_PER_REQUEST,\n delayThreshold: 1000,\n});\nlet lastEventId = 0;\nconst loggerMiddleware = store => next => action => {\n if (action.type !== LOG_EVENT) {\n return next(action);\n }\n\n const { dashboardInfo, explore, impressionId, dashboardLayout, sqlLab } =\n store.getState();\n let logMetadata = {\n impression_id: impressionId,\n version: 'v2',\n };\n if (dashboardInfo?.id) {\n logMetadata = {\n source: 'dashboard',\n source_id: dashboardInfo.id,\n ...logMetadata,\n };\n } else if (explore?.slice) {\n logMetadata = {\n source: 'explore',\n source_id: explore.slice ? explore.slice.slice_id : 0,\n ...logMetadata,\n };\n } else if (sqlLab) {\n const editor = sqlLab.queryEditors.find(\n ({ id }) => id === sqlLab.tabHistory.slice(-1)[0],\n );\n logMetadata = {\n source: 'sqlLab',\n source_id: editor?.id,\n db_id: editor?.dbId,\n schema: editor?.schema,\n };\n }\n\n const { eventName } = action.payload;\n let { eventData = {} } = action.payload;\n eventData = {\n ...logMetadata,\n ts: new Date().getTime(),\n event_name: eventName,\n ...eventData,\n };\n if (LOG_EVENT_TYPE_TIMING.has(eventName)) {\n eventData = {\n ...eventData,\n event_type: 'timing',\n trigger_event: lastEventId,\n };\n } else {\n lastEventId = nanoid();\n eventData = {\n ...eventData,\n event_type: 'user',\n event_id: lastEventId,\n visibility: document.visibilityState,\n };\n }\n\n if (eventData.target_id && dashboardLayout?.present?.[eventData.target_id]) {\n const { meta } = dashboardLayout.present[eventData.target_id];\n // chart name or tab/header text\n eventData.target_name = meta.chartId ? meta.sliceName : meta.text;\n }\n\n logMessageQueue.append(eventData);\n return eventData;\n};\n\nexport default loggerMiddleware;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n// TODO: requires redux-localstorage > 1.0 for typescript support\nimport persistState from 'redux-localstorage';\nimport { pickBy } from 'lodash';\nimport { isFeatureEnabled, FeatureFlag } from '@superset-ui/core';\nimport { filterUnsavedQueryEditorList } from 'src/SqlLab/components/EditorAutoSync';\nimport {\n emptyTablePersistData,\n emptyQueryResults,\n clearQueryEditors,\n} from '../utils/reduxStateToLocalStorageHelper';\nimport { BYTES_PER_CHAR, KB_STORAGE } from '../constants';\n\nconst CLEAR_ENTITY_HELPERS_MAP = {\n tables: emptyTablePersistData,\n queries: emptyQueryResults,\n queryEditors: clearQueryEditors,\n unsavedQueryEditor: qe => clearQueryEditors([qe])[0],\n};\n\nconst sqlLabPersistStateConfig = {\n paths: ['sqlLab'],\n config: {\n slicer: paths => state => {\n const subset = {};\n paths.forEach(path => {\n if (isFeatureEnabled(FeatureFlag.SqllabBackendPersistence)) {\n const {\n queryEditors,\n editorTabLastUpdatedAt,\n unsavedQueryEditor,\n tables,\n queries,\n tabHistory,\n lastUpdatedActiveTab,\n destroyedQueryEditors,\n } = state.sqlLab;\n const unsavedQueryEditors = filterUnsavedQueryEditorList(\n queryEditors,\n unsavedQueryEditor,\n editorTabLastUpdatedAt,\n );\n const hasUnsavedActiveTabState =\n tabHistory.slice(-1)[0] !== lastUpdatedActiveTab;\n const hasUnsavedDeletedQueryEditors =\n Object.keys(destroyedQueryEditors).length > 0;\n if (\n unsavedQueryEditors.length > 0 ||\n hasUnsavedActiveTabState ||\n hasUnsavedDeletedQueryEditors\n ) {\n const hasFinishedMigrationFromLocalStorage =\n unsavedQueryEditors.every(\n ({ inLocalStorage }) => !inLocalStorage,\n );\n subset.sqlLab = {\n queryEditors: unsavedQueryEditors,\n ...(!hasFinishedMigrationFromLocalStorage && {\n tabHistory,\n tables: tables.filter(table => table.inLocalStorage),\n queries: pickBy(\n queries,\n query => query.inLocalStorage && !query.isDataPreview,\n ),\n }),\n ...(hasUnsavedActiveTabState && {\n tabHistory,\n }),\n destroyedQueryEditors,\n };\n }\n return;\n }\n // this line is used to remove old data from browser localStorage.\n // we used to persist all redux state into localStorage, but\n // it caused configurations passed from server-side got override.\n // see PR 6257 for details\n delete state[path].common; // eslint-disable-line no-param-reassign\n if (path === 'sqlLab') {\n subset[path] = Object.fromEntries(\n Object.entries(state[path]).map(([key, value]) => [\n key,\n CLEAR_ENTITY_HELPERS_MAP[key]?.(value) ?? value,\n ]),\n );\n }\n });\n\n const data = JSON.stringify(subset);\n // 2 digit precision\n const currentSize =\n Math.round(((data.length * BYTES_PER_CHAR) / KB_STORAGE) * 100) / 100;\n if (state.localStorageUsageInKilobytes !== currentSize) {\n state.localStorageUsageInKilobytes = currentSize; // eslint-disable-line no-param-reassign\n }\n\n return subset;\n },\n merge: (initialState, persistedState = {}) => {\n const result = {\n ...initialState,\n ...persistedState,\n sqlLab: {\n ...(persistedState?.sqlLab || {}),\n // Overwrite initialState over persistedState for sqlLab\n // since a logic in getInitialState overrides the value from persistedState\n ...initialState.sqlLab,\n },\n };\n return result;\n },\n },\n};\n\nexport const persistSqlLabStateEnhancer = persistState(\n sqlLabPersistStateConfig.paths,\n sqlLabPersistStateConfig.config,\n);\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { normalizeTimestamp, QueryState, t } from '@superset-ui/core';\nimport { isEqual, omit } from 'lodash';\nimport { shallowEqual } from 'react-redux';\nimport * as actions from '../actions/sqlLab';\nimport { now } from '../../utils/dates';\nimport {\n addToObject,\n alterInObject,\n alterInArr,\n removeFromArr,\n getFromArr,\n addToArr,\n extendArr,\n} from '../../reduxUtils';\n\nfunction alterUnsavedQueryEditorState(state, updatedState, id, silent = false) {\n if (state.tabHistory[state.tabHistory.length - 1] !== id) {\n const { queryEditors } = alterInArr(\n state,\n 'queryEditors',\n { id },\n updatedState,\n );\n return {\n queryEditors,\n };\n }\n return {\n unsavedQueryEditor: {\n ...(state.unsavedQueryEditor.id === id && state.unsavedQueryEditor),\n ...(id ? { id, ...updatedState } : state.unsavedQueryEditor),\n ...(!silent && { updatedAt: new Date().getTime() }),\n },\n };\n}\n\nexport default function sqlLabReducer(state = {}, action) {\n const actionHandlers = {\n [actions.ADD_QUERY_EDITOR]() {\n const mergeUnsavedState = alterInArr(\n state,\n 'queryEditors',\n state.unsavedQueryEditor,\n {\n ...state.unsavedQueryEditor,\n },\n );\n const newState = {\n ...mergeUnsavedState,\n tabHistory: [...state.tabHistory, action.queryEditor.id],\n };\n return addToArr(newState, 'queryEditors', {\n ...action.queryEditor,\n updatedAt: new Date().getTime(),\n });\n },\n [actions.QUERY_EDITOR_SAVED]() {\n const { query, result, clientId } = action;\n const existing = state.queryEditors.find(qe => qe.id === clientId);\n return alterInArr(\n state,\n 'queryEditors',\n existing,\n {\n remoteId: result.remoteId,\n name: query.name,\n },\n 'id',\n );\n },\n [actions.UPDATE_QUERY_EDITOR]() {\n const id = action.alterations.remoteId;\n const existing = state.queryEditors.find(qe => qe.remoteId === id);\n if (existing == null) return state;\n return alterInArr(\n state,\n 'queryEditors',\n existing,\n action.alterations,\n 'remoteId',\n );\n },\n [actions.CLONE_QUERY_TO_NEW_TAB]() {\n const queryEditor = state.queryEditors.find(\n qe => qe.id === state.tabHistory[state.tabHistory.length - 1],\n );\n const progenitor = {\n ...queryEditor,\n ...(state.unsavedQueryEditor.id === queryEditor.id &&\n state.unsavedQueryEditor),\n };\n const qe = {\n remoteId: progenitor.remoteId,\n name: t('Copy of %s', progenitor.name),\n dbId: action.query.dbId ? action.query.dbId : null,\n catalog: action.query.catalog ? action.query.catalog : null,\n schema: action.query.schema ? action.query.schema : null,\n autorun: true,\n sql: action.query.sql,\n queryLimit: action.query.queryLimit,\n maxRow: action.query.maxRow,\n };\n const stateWithoutUnsavedState = {\n ...state,\n unsavedQueryEditor: {},\n };\n return sqlLabReducer(\n stateWithoutUnsavedState,\n actions.addQueryEditor(qe),\n );\n },\n [actions.REMOVE_QUERY_EDITOR]() {\n const queryEditor = {\n ...action.queryEditor,\n ...(action.queryEditor.id === state.unsavedQueryEditor.id &&\n state.unsavedQueryEditor),\n };\n let newState = removeFromArr(state, 'queryEditors', queryEditor);\n // List of remaining queryEditor ids\n const qeIds = newState.queryEditors.map(qe => qe.id);\n\n const queries = {};\n Object.keys(state.queries).forEach(k => {\n const query = state.queries[k];\n if (qeIds.indexOf(query.sqlEditorId) > -1) {\n queries[k] = query;\n }\n });\n\n let tabHistory = state.tabHistory.slice();\n tabHistory = tabHistory.filter(id => qeIds.indexOf(id) > -1);\n\n // Remove associated table schemas\n const tables = state.tables.filter(\n table => table.queryEditorId !== queryEditor.id,\n );\n\n newState = {\n ...newState,\n tabHistory:\n tabHistory.length === 0 && newState.queryEditors.length > 0\n ? newState.queryEditors.slice(-1).map(qe => qe.id)\n : tabHistory,\n tables,\n queries,\n unsavedQueryEditor: {\n ...(action.queryEditor.id !== state.unsavedQueryEditor.id &&\n state.unsavedQueryEditor),\n },\n destroyedQueryEditors: {\n ...newState.destroyedQueryEditors,\n [queryEditor.id]: Date.now(),\n },\n };\n return newState;\n },\n [actions.CLEAR_DESTROYED_QUERY_EDITOR]() {\n const destroyedQueryEditors = { ...state.destroyedQueryEditors };\n delete destroyedQueryEditors[action.queryEditorId];\n return { ...state, destroyedQueryEditors };\n },\n [actions.REMOVE_QUERY]() {\n const newQueries = { ...state.queries };\n delete newQueries[action.query.id];\n return { ...state, queries: newQueries };\n },\n [actions.RESET_STATE]() {\n return { ...action.sqlLabInitialState };\n },\n [actions.MERGE_TABLE]() {\n const at = { ...action.table };\n let existingTable;\n state.tables.forEach(xt => {\n if (\n xt.dbId === at.dbId &&\n xt.queryEditorId === at.queryEditorId &&\n xt.catalog === at.catalog &&\n xt.schema === at.schema &&\n xt.name === at.name\n ) {\n existingTable = xt;\n }\n });\n if (existingTable) {\n if (action.query) {\n at.dataPreviewQueryId = action.query.id;\n }\n if (existingTable.initialized) {\n at.id = existingTable.id;\n }\n return alterInArr(state, 'tables', existingTable, at);\n }\n // for new table, associate Id of query for data preview\n at.dataPreviewQueryId = null;\n let newState = addToArr(state, 'tables', at, Boolean(action.prepend));\n if (action.query) {\n newState = alterInArr(newState, 'tables', at, {\n dataPreviewQueryId: action.query.id,\n });\n }\n return newState;\n },\n [actions.EXPAND_TABLE]() {\n return alterInArr(state, 'tables', action.table, { expanded: true });\n },\n [actions.REMOVE_DATA_PREVIEW]() {\n const queries = { ...state.queries };\n delete queries[action.table.dataPreviewQueryId];\n const newState = alterInArr(state, 'tables', action.table, {\n dataPreviewQueryId: null,\n });\n return { ...newState, queries };\n },\n [actions.CHANGE_DATA_PREVIEW_ID]() {\n const queries = { ...state.queries };\n delete queries[action.oldQueryId];\n\n const newTables = [];\n state.tables.forEach(xt => {\n if (xt.dataPreviewQueryId === action.oldQueryId) {\n newTables.push({ ...xt, dataPreviewQueryId: action.newQuery.id });\n } else {\n newTables.push(xt);\n }\n });\n return {\n ...state,\n queries,\n tables: newTables,\n activeSouthPaneTab: action.newQuery.id,\n };\n },\n [actions.COLLAPSE_TABLE]() {\n return alterInArr(state, 'tables', action.table, { expanded: false });\n },\n [actions.REMOVE_TABLES]() {\n const tableIds = action.tables.map(table => table.id);\n return {\n ...state,\n tables: state.tables.filter(table => !tableIds.includes(table.id)),\n };\n },\n [actions.COST_ESTIMATE_STARTED]() {\n return {\n ...state,\n queryCostEstimates: {\n ...state.queryCostEstimates,\n [action.query.id]: {\n completed: false,\n cost: null,\n error: null,\n },\n },\n };\n },\n [actions.COST_ESTIMATE_RETURNED]() {\n return {\n ...state,\n queryCostEstimates: {\n ...state.queryCostEstimates,\n [action.query.id]: {\n completed: true,\n cost: action.json.result,\n error: null,\n },\n },\n };\n },\n [actions.COST_ESTIMATE_FAILED]() {\n return {\n ...state,\n queryCostEstimates: {\n ...state.queryCostEstimates,\n [action.query.id]: {\n completed: false,\n cost: null,\n error: action.error,\n },\n },\n };\n },\n [actions.START_QUERY]() {\n let newState = { ...state };\n if (action.query.sqlEditorId) {\n const qe = {\n ...getFromArr(state.queryEditors, action.query.sqlEditorId),\n ...(action.query.sqlEditorId === state.unsavedQueryEditor.id &&\n state.unsavedQueryEditor),\n };\n if (qe.latestQueryId && state.queries[qe.latestQueryId]) {\n const newResults = {\n ...state.queries[qe.latestQueryId].results,\n data: [],\n query: null,\n };\n const q = { ...state.queries[qe.latestQueryId], results: newResults };\n const queries = { ...state.queries, [q.id]: q };\n newState = { ...state, queries };\n }\n } else {\n newState.activeSouthPaneTab = action.query.id;\n }\n newState = addToObject(newState, 'queries', action.query);\n\n return {\n ...newState,\n ...alterUnsavedQueryEditorState(\n state,\n {\n latestQueryId: action.query.id,\n },\n action.query.sqlEditorId,\n action.query.isDataPreview,\n ),\n };\n },\n [actions.STOP_QUERY]() {\n return alterInObject(state, 'queries', action.query, {\n state: QueryState.Stopped,\n results: [],\n });\n },\n [actions.CLEAR_QUERY_RESULTS]() {\n const newResults = { ...action.query.results };\n newResults.data = [];\n return alterInObject(state, 'queries', action.query, {\n results: newResults,\n cached: true,\n });\n },\n [actions.REQUEST_QUERY_RESULTS]() {\n return alterInObject(state, 'queries', action.query, {\n state: QueryState.Fetching,\n });\n },\n [actions.QUERY_SUCCESS]() {\n // prevent race condition where query succeeds shortly after being canceled\n // or the final result was unsuccessful\n if (\n action.query.state === QueryState.STOPPED ||\n action.results.status !== QueryState.Success\n ) {\n return state;\n }\n const alts = {\n endDttm: now(),\n progress: 100,\n results: action.results,\n rows: action?.results?.query?.rows || 0,\n state: QueryState.Success,\n limitingFactor: action?.results?.query?.limitingFactor,\n tempSchema: action?.results?.query?.tempSchema,\n tempTable: action?.results?.query?.tempTable,\n errorMessage: null,\n cached: false,\n };\n\n const resultsKey = action?.results?.query?.resultsKey;\n if (resultsKey) {\n alts.resultsKey = resultsKey;\n }\n\n return alterInObject(state, 'queries', action.query, alts);\n },\n [actions.QUERY_FAILED]() {\n if (action.query.state === QueryState.Stopped) {\n return state;\n }\n const alts = {\n state: QueryState.Failed,\n errors: action.errors,\n errorMessage: action.msg,\n endDttm: now(),\n link: action.link,\n };\n return alterInObject(state, 'queries', action.query, alts);\n },\n [actions.SET_ACTIVE_QUERY_EDITOR]() {\n const qeIds = state.queryEditors.map(qe => qe.id);\n if (\n qeIds.indexOf(action.queryEditor?.id) > -1 &&\n state.tabHistory[state.tabHistory.length - 1] !== action.queryEditor.id\n ) {\n const mergeUnsavedState = {\n ...alterInArr(state, 'queryEditors', state.unsavedQueryEditor, {\n ...state.unsavedQueryEditor,\n }),\n unsavedQueryEditor: {},\n };\n return {\n ...(action.queryEditor.id === state.unsavedQueryEditor.id\n ? alterInArr(\n mergeUnsavedState,\n 'queryEditors',\n action.queryEditor,\n {\n ...action.queryEditor,\n ...state.unsavedQueryEditor,\n },\n )\n : mergeUnsavedState),\n tabHistory: [...state.tabHistory, action.queryEditor.id],\n };\n }\n return state;\n },\n [actions.LOAD_QUERY_EDITOR]() {\n const mergeUnsavedState = alterInArr(\n state,\n 'queryEditors',\n state.unsavedQueryEditor,\n {\n ...state.unsavedQueryEditor,\n },\n );\n return alterInArr(mergeUnsavedState, 'queryEditors', action.queryEditor, {\n ...action.queryEditor,\n });\n },\n [actions.SET_TABLES]() {\n return extendArr(state, 'tables', action.tables);\n },\n [actions.SET_ACTIVE_SOUTHPANE_TAB]() {\n return { ...state, activeSouthPaneTab: action.tabId };\n },\n [actions.MIGRATE_QUERY_EDITOR]() {\n try {\n // remove migrated query editor from localStorage\n const { sqlLab } = JSON.parse(localStorage.getItem('redux'));\n sqlLab.queryEditors = sqlLab.queryEditors.filter(\n qe => qe.id !== action.oldQueryEditor.id,\n );\n localStorage.setItem('redux', JSON.stringify({ sqlLab }));\n } catch (error) {\n // continue regardless of error\n }\n // replace localStorage query editor with the server backed one\n return alterInArr(\n state,\n 'queryEditors',\n action.oldQueryEditor,\n action.newQueryEditor,\n );\n },\n [actions.MIGRATE_TABLE]() {\n try {\n // remove migrated table from localStorage\n const { sqlLab } = JSON.parse(localStorage.getItem('redux'));\n sqlLab.tables = sqlLab.tables.filter(\n table => table.id !== action.oldTable.id,\n );\n localStorage.setItem('redux', JSON.stringify({ sqlLab }));\n } catch (error) {\n // continue regardless of error\n }\n\n // replace localStorage table with the server backed one\n return addToArr(\n removeFromArr(state, 'tables', action.oldTable),\n 'tables',\n action.newTable,\n );\n },\n [actions.MIGRATE_TAB_HISTORY]() {\n const tabHistory = state.tabHistory.map(tabId =>\n tabId === action.oldId ? action.newId : tabId,\n );\n return { ...state, tabHistory };\n },\n [actions.MIGRATE_QUERY]() {\n const query = {\n ...state.queries[action.queryId],\n // point query to migrated query editor\n sqlEditorId: action.queryEditorId,\n };\n const queries = { ...state.queries, [query.id]: query };\n return { ...state, queries };\n },\n [actions.QUERY_EDITOR_SETDB]() {\n return {\n ...state,\n ...alterUnsavedQueryEditorState(\n state,\n {\n dbId: action.dbId,\n },\n action.queryEditor.id,\n ),\n };\n },\n [actions.QUERY_EDITOR_SET_CATALOG]() {\n return {\n ...state,\n ...alterUnsavedQueryEditorState(\n state,\n {\n catalog: action.catalog,\n },\n action.queryEditor.id,\n ),\n };\n },\n [actions.QUERY_EDITOR_SET_SCHEMA]() {\n return {\n ...state,\n ...alterUnsavedQueryEditorState(\n state,\n {\n schema: action.schema,\n },\n action.queryEditor.id,\n ),\n };\n },\n [actions.QUERY_EDITOR_SET_TITLE]() {\n return {\n ...state,\n ...alterUnsavedQueryEditorState(\n state,\n {\n name: action.name,\n },\n action.queryEditor.id,\n ),\n };\n },\n [actions.QUERY_EDITOR_SET_SQL]() {\n const { unsavedQueryEditor } = state;\n if (\n unsavedQueryEditor?.id === action.queryEditor.id &&\n unsavedQueryEditor.sql === action.sql\n ) {\n return state;\n }\n return {\n ...state,\n ...alterUnsavedQueryEditorState(\n state,\n {\n sql: action.sql,\n ...(action.queryId && { latestQueryId: action.queryId }),\n },\n action.queryEditor.id,\n ),\n };\n },\n [actions.QUERY_EDITOR_SET_CURSOR_POSITION]() {\n return {\n ...state,\n ...alterUnsavedQueryEditorState(\n state,\n {\n cursorPosition: action.position,\n },\n action.queryEditor.id,\n ),\n };\n },\n [actions.QUERY_EDITOR_SET_QUERY_LIMIT]() {\n return {\n ...state,\n ...alterUnsavedQueryEditorState(\n state,\n {\n queryLimit: action.queryLimit,\n },\n action.queryEditor.id,\n ),\n };\n },\n [actions.QUERY_EDITOR_SET_TEMPLATE_PARAMS]() {\n return {\n ...state,\n ...alterUnsavedQueryEditorState(\n state,\n {\n templateParams: action.templateParams,\n },\n action.queryEditor.id,\n ),\n };\n },\n [actions.QUERY_EDITOR_SET_SELECTED_TEXT]() {\n return {\n ...state,\n ...alterUnsavedQueryEditorState(\n state,\n {\n selectedText: action.sql,\n },\n action.queryEditor.id,\n true,\n ),\n };\n },\n [actions.QUERY_EDITOR_SET_AUTORUN]() {\n return {\n ...state,\n ...alterUnsavedQueryEditorState(\n state,\n {\n autorun: action.autorun,\n },\n action.queryEditor.id,\n ),\n };\n },\n [actions.QUERY_EDITOR_PERSIST_HEIGHT]() {\n return {\n ...state,\n ...alterUnsavedQueryEditorState(\n state,\n {\n northPercent: action.northPercent,\n southPercent: action.southPercent,\n },\n action.queryEditor.id,\n ),\n };\n },\n [actions.QUERY_EDITOR_TOGGLE_LEFT_BAR]() {\n return {\n ...state,\n ...alterUnsavedQueryEditorState(\n state,\n {\n hideLeftBar: action.hideLeftBar,\n },\n action.queryEditor.id,\n ),\n };\n },\n [actions.SET_DATABASES]() {\n const databases = {};\n action.databases.forEach(db => {\n databases[db.id] = {\n ...db,\n extra_json: JSON.parse(db.extra || ''),\n };\n });\n return { ...state, databases };\n },\n [actions.REFRESH_QUERIES]() {\n let newQueries = { ...state.queries };\n // Fetch the updates to the queries present in the store.\n let change = false;\n let { queriesLastUpdate } = state;\n Object.entries(action.alteredQueries).forEach(([id, changedQuery]) => {\n if (\n !state.queries.hasOwnProperty(id) ||\n (state.queries[id].state !== QueryState.Stopped &&\n state.queries[id].state !== QueryState.Failed)\n ) {\n const changedOn = normalizeTimestamp(changedQuery.changed_on);\n const timestamp = Date.parse(changedOn);\n if (timestamp > queriesLastUpdate) {\n queriesLastUpdate = timestamp;\n }\n const prevState = state.queries[id]?.state;\n const currentState = changedQuery.state;\n newQueries[id] = {\n ...state.queries[id],\n ...changedQuery,\n ...(changedQuery.startDttm && {\n startDttm: Number(changedQuery.startDttm),\n }),\n ...(changedQuery.endDttm && {\n endDttm: Number(changedQuery.endDttm),\n }),\n // race condition:\n // because of async behavior, sql lab may still poll a couple of seconds\n // when it started fetching or finished rendering results\n state:\n currentState === QueryState.Success &&\n [\n QueryState.Fetching,\n QueryState.Success,\n QueryState.Running,\n ].includes(prevState)\n ? prevState\n : currentState,\n };\n if (\n shallowEqual(\n omit(newQueries[id], ['extra']),\n omit(state.queries[id], ['extra']),\n ) &&\n isEqual(newQueries[id].extra, state.queries[id].extra)\n ) {\n newQueries[id] = state.queries[id];\n } else {\n change = true;\n }\n }\n });\n if (!change) {\n newQueries = state.queries;\n }\n return { ...state, queries: newQueries, queriesLastUpdate };\n },\n [actions.CLEAR_INACTIVE_QUERIES]() {\n const { queries } = state;\n const cleanedQueries = Object.fromEntries(\n Object.entries(queries)\n .filter(([, query]) => {\n if (\n ['running', 'pending'].includes(query.state) &&\n Date.now() - query.startDttm > action.interval &&\n query.progress === 0\n ) {\n return false;\n }\n return true;\n })\n .map(([id, query]) => [\n id,\n {\n ...query,\n state:\n query.resultsKey && query.results?.status\n ? query.results.status\n : query.state,\n },\n ]),\n );\n return { ...state, queries: cleanedQueries };\n },\n [actions.SET_USER_OFFLINE]() {\n return { ...state, offline: action.offline };\n },\n [actions.CREATE_DATASOURCE_STARTED]() {\n return { ...state, isDatasourceLoading: true, errorMessage: null };\n },\n [actions.CREATE_DATASOURCE_SUCCESS]() {\n return {\n ...state,\n isDatasourceLoading: false,\n errorMessage: null,\n datasource: action.datasource,\n };\n },\n [actions.CREATE_DATASOURCE_FAILED]() {\n return { ...state, isDatasourceLoading: false, errorMessage: action.err };\n },\n [actions.SET_EDITOR_TAB_LAST_UPDATE]() {\n return { ...state, editorTabLastUpdatedAt: action.timestamp };\n },\n [actions.SET_LAST_UPDATED_ACTIVE_TAB]() {\n return { ...state, lastUpdatedActiveTab: action.queryEditorId };\n },\n };\n if (action.type in actionHandlers) {\n return actionHandlers[action.type]();\n }\n return state;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport {\n configureStore,\n ConfigureStoreOptions,\n StoreEnhancer,\n} from '@reduxjs/toolkit';\nimport thunk from 'redux-thunk';\nimport { api } from 'src/hooks/apiResources/queryApi';\nimport messageToastReducer from 'src/components/MessageToasts/reducers';\nimport charts from 'src/components/Chart/chartReducer';\nimport dataMask from 'src/dataMask/reducer';\nimport reports from 'src/features/reports/ReportModal/reducer';\nimport dashboardInfo from 'src/dashboard/reducers/dashboardInfo';\nimport dashboardState from 'src/dashboard/reducers/dashboardState';\nimport dashboardFilters from 'src/dashboard/reducers/dashboardFilters';\nimport nativeFilters from 'src/dashboard/reducers/nativeFilters';\nimport dashboardDatasources from 'src/dashboard/reducers/datasources';\nimport sliceEntities from 'src/dashboard/reducers/sliceEntities';\nimport dashboardLayout from 'src/dashboard/reducers/undoableDashboardLayout';\nimport logger from 'src/middleware/loggerMiddleware';\nimport saveModal from 'src/explore/reducers/saveModalReducer';\nimport explore from 'src/explore/reducers/exploreReducer';\nimport exploreDatasources from 'src/explore/reducers/datasourcesReducer';\n\nimport { persistSqlLabStateEnhancer } from 'src/SqlLab/middlewares/persistSqlLabStateEnhancer';\nimport sqlLabReducer from 'src/SqlLab/reducers/sqlLab';\nimport getInitialState from 'src/SqlLab/reducers/getInitialState';\nimport { DatasourcesState } from 'src/dashboard/types';\nimport {\n DatasourcesActionPayload,\n DatasourcesAction,\n} from 'src/dashboard/actions/datasources';\nimport { nanoid } from 'nanoid';\nimport {\n BootstrapUser,\n UndefinedUser,\n UserWithPermissionsAndRoles,\n} from 'src/types/bootstrapTypes';\nimport { AnyDatasourcesAction } from 'src/explore/actions/datasourcesActions';\nimport { HydrateExplore } from 'src/explore/actions/hydrateExplore';\nimport getBootstrapData from 'src/utils/getBootstrapData';\nimport { Dataset } from '@superset-ui/chart-controls';\n\n// Some reducers don't do anything, and redux is just used to reference the initial \"state\".\n// This may change later, as the client application takes on more responsibilities.\nconst noopReducer =\n (initialState: STATE) =>\n (state: STATE = initialState) =>\n state;\n\nconst bootstrapData = getBootstrapData();\n\nexport const USER_LOADED = 'USER_LOADED';\n\nexport type UserLoadedAction = {\n type: typeof USER_LOADED;\n user: UserWithPermissionsAndRoles;\n};\n\nexport const userReducer = (\n user = bootstrapData.user || {},\n action: UserLoadedAction,\n): BootstrapUser | UndefinedUser => {\n if (action.type === USER_LOADED) {\n return action.user;\n }\n return user;\n};\n\nconst getMiddleware: ConfigureStoreOptions['middleware'] =\n getDefaultMiddleware =>\n process.env.REDUX_DEFAULT_MIDDLEWARE\n ? getDefaultMiddleware({\n immutableCheck: {\n warnAfter: 200,\n },\n serializableCheck: {\n // Ignores AbortController instances\n ignoredActionPaths: [/queryController/g],\n ignoredPaths: [/queryController/g],\n warnAfter: 200,\n },\n }).concat(logger, api.middleware)\n : [thunk, logger, api.middleware];\n\n// TODO: This reducer is a combination of the Dashboard and Explore reducers.\n// The correct way of handling this is to unify the actions and reducers from both\n// modules in shared files. This involves a big refactor to unify the parameter types\n// and move files around. We should tackle this in a specific PR.\nconst CombinedDatasourceReducers = (\n datasources: DatasourcesState | undefined | { [key: string]: Dataset },\n action: DatasourcesActionPayload | AnyDatasourcesAction | HydrateExplore,\n) => {\n if (action.type === DatasourcesAction.SetDatasources) {\n return dashboardDatasources(\n datasources as DatasourcesState | undefined,\n action as DatasourcesActionPayload,\n );\n }\n return exploreDatasources(\n datasources as { [key: string]: Dataset },\n action as AnyDatasourcesAction | HydrateExplore,\n );\n};\n\nconst reducers = {\n sqlLab: sqlLabReducer,\n localStorageUsageInKilobytes: noopReducer(0),\n messageToasts: messageToastReducer,\n common: noopReducer(bootstrapData.common),\n user: userReducer,\n impressionId: noopReducer(nanoid()),\n charts,\n datasources: CombinedDatasourceReducers,\n dashboardInfo,\n dashboardFilters,\n dataMask,\n nativeFilters,\n dashboardState,\n dashboardLayout,\n sliceEntities,\n reports,\n saveModal,\n explore,\n};\n\n/* In some cases the jinja template injects two seperate React apps into basic.html\n * One for the top navigation Menu and one for the application below the Menu\n * The first app to connect to the Redux debugger wins which is the menu blocking\n * the application from being able to connect to the redux debugger.\n * setupStore with disableDebugger true enables the menu.tsx component to avoid connecting\n * to redux debugger so the application can connect to redux debugger\n */\nexport function setupStore({\n disableDebugger = false,\n initialState = getInitialState(bootstrapData),\n rootReducers = reducers,\n ...overrides\n}: {\n disableDebugger?: boolean;\n initialState?: ConfigureStoreOptions['preloadedState'];\n rootReducers?: ConfigureStoreOptions['reducer'];\n} & Partial = {}) {\n return configureStore({\n preloadedState: initialState,\n reducer: {\n [api.reducerPath]: api.reducer,\n ...rootReducers,\n },\n middleware: getMiddleware,\n devTools: process.env.WEBPACK_MODE === 'development' && !disableDebugger,\n enhancers: [persistSqlLabStateEnhancer as StoreEnhancer],\n ...overrides,\n });\n}\n\nexport const store = setupStore();\nexport type RootState = ReturnType;\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { ADD_TOAST, REMOVE_TOAST } from './actions';\n\nexport default function messageToastsReducer(toasts = [], action) {\n switch (action.type) {\n case ADD_TOAST: {\n const { payload: toast } = action;\n const result = toasts.slice();\n if (!toast.noDuplicate || !result.find(x => x.text === toast.text)) {\n return [toast, ...toasts];\n }\n return toasts;\n }\n\n case REMOVE_TOAST: {\n const {\n payload: { id },\n } = action;\n return [...toasts].filter(toast => toast.id !== id);\n }\n\n default:\n return toasts;\n }\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { keyBy } from 'lodash';\nimport { DatasourcesState } from 'src/dashboard/types';\nimport {\n DatasourcesActionPayload,\n DatasourcesAction,\n} from '../actions/datasources';\n\nexport default function datasourcesReducer(\n datasources: DatasourcesState | undefined,\n action: DatasourcesActionPayload,\n) {\n if (action.type === DatasourcesAction.SetDatasources) {\n return {\n ...datasources,\n ...keyBy(action.datasources, 'uid'),\n };\n }\n if (action.type === DatasourcesAction.SetDatasource) {\n return {\n ...datasources,\n [action.key]: action.datasource,\n };\n }\n return datasources || {};\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\nimport { Dataset } from '@superset-ui/chart-controls';\nimport { getDatasourceUid } from 'src/utils/getDatasourceUid';\nimport {\n AnyDatasourcesAction,\n SET_DATASOURCE,\n} from '../actions/datasourcesActions';\nimport { HYDRATE_EXPLORE, HydrateExplore } from '../actions/hydrateExplore';\n\nexport default function datasourcesReducer(\n // TODO: change type to include other datasource types\n datasources: { [key: string]: Dataset },\n action: AnyDatasourcesAction | HydrateExplore,\n) {\n if (action.type === SET_DATASOURCE) {\n return {\n ...datasources,\n [getDatasourceUid(action.datasource)]: action.datasource,\n };\n }\n if (action.type === HYDRATE_EXPLORE) {\n return { ...(action as HydrateExplore).data.datasources };\n }\n return datasources || {};\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nimport {\n DASHBOARD_INFO_UPDATED,\n SET_FILTER_BAR_ORIENTATION,\n SET_CROSS_FILTERS_ENABLED,\n} from '../actions/dashboardInfo';\nimport { HYDRATE_DASHBOARD } from '../actions/hydrate';\n\nexport default function dashboardStateReducer(state = {}, action) {\n switch (action.type) {\n case DASHBOARD_INFO_UPDATED:\n return {\n ...state,\n ...action.newInfo,\n // server-side compare last_modified_time in second level\n last_modified_time: Math.round(new Date().getTime() / 1000),\n };\n case HYDRATE_DASHBOARD:\n return {\n ...state,\n ...action.data.dashboardInfo,\n // set async api call data\n };\n case SET_FILTER_BAR_ORIENTATION:\n return {\n ...state,\n filterBarOrientation: action.filterBarOrientation,\n };\n case SET_CROSS_FILTERS_ENABLED:\n return {\n ...state,\n crossFiltersEnabled: action.crossFiltersEnabled,\n };\n default:\n return state;\n }\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n/* eslint-disable camelcase */\nimport {\n ADD_SLICE,\n ON_CHANGE,\n ON_SAVE,\n REMOVE_SLICE,\n SET_COLOR_SCHEME,\n SET_EDIT_MODE,\n SET_MAX_UNDO_HISTORY_EXCEEDED,\n SET_UNSAVED_CHANGES,\n SHOW_BUILDER_PANE,\n TOGGLE_EXPAND_SLICE,\n TOGGLE_FAVE_STAR,\n TOGGLE_PUBLISHED,\n UPDATE_CSS,\n SET_REFRESH_FREQUENCY,\n ON_REFRESH,\n ON_REFRESH_SUCCESS,\n SET_DIRECT_PATH,\n SET_FOCUSED_FILTER_FIELD,\n UNSET_FOCUSED_FILTER_FIELD,\n SET_ACTIVE_TAB,\n SET_ACTIVE_TABS,\n SET_FULL_SIZE_CHART_ID,\n ON_FILTERS_REFRESH,\n ON_FILTERS_REFRESH_SUCCESS,\n SET_DATASETS_STATUS,\n SET_OVERRIDE_CONFIRM,\n SAVE_DASHBOARD_STARTED,\n SAVE_DASHBOARD_FINISHED,\n SET_DASHBOARD_LABELS_COLORMAP_SYNCABLE,\n SET_DASHBOARD_LABELS_COLORMAP_SYNCED,\n SET_DASHBOARD_SHARED_LABELS_COLORS_SYNCABLE,\n SET_DASHBOARD_SHARED_LABELS_COLORS_SYNCED,\n} from '../actions/dashboardState';\nimport { HYDRATE_DASHBOARD } from '../actions/hydrate';\n\nexport default function dashboardStateReducer(state = {}, action) {\n const actionHandlers = {\n [HYDRATE_DASHBOARD]() {\n return { ...state, ...action.data.dashboardState };\n },\n [UPDATE_CSS]() {\n return { ...state, css: action.css };\n },\n [ADD_SLICE]() {\n const updatedSliceIds = new Set(state.sliceIds);\n updatedSliceIds.add(action.slice.slice_id);\n return {\n ...state,\n sliceIds: Array.from(updatedSliceIds),\n };\n },\n [REMOVE_SLICE]() {\n const { sliceId } = action;\n const updatedSliceIds = new Set(state.sliceIds);\n updatedSliceIds.delete(sliceId);\n\n return {\n ...state,\n sliceIds: Array.from(updatedSliceIds),\n };\n },\n [TOGGLE_FAVE_STAR]() {\n return { ...state, isStarred: action.isStarred };\n },\n [TOGGLE_PUBLISHED]() {\n return { ...state, isPublished: action.isPublished };\n },\n [SET_EDIT_MODE]() {\n return {\n ...state,\n editMode: action.editMode,\n };\n },\n [SET_MAX_UNDO_HISTORY_EXCEEDED]() {\n const { maxUndoHistoryExceeded = true } = action.payload;\n return { ...state, maxUndoHistoryExceeded };\n },\n [SHOW_BUILDER_PANE]() {\n return { ...state };\n },\n [SET_COLOR_SCHEME]() {\n return {\n ...state,\n colorScheme: action.colorScheme,\n updatedColorScheme: true,\n };\n },\n [SET_DASHBOARD_LABELS_COLORMAP_SYNCABLE]() {\n return {\n ...state,\n labelsColorMapMustSync: true,\n };\n },\n [SET_DASHBOARD_LABELS_COLORMAP_SYNCED]() {\n return {\n ...state,\n labelsColorMapMustSync: false,\n };\n },\n [SET_DASHBOARD_SHARED_LABELS_COLORS_SYNCABLE]() {\n return {\n ...state,\n sharedLabelsColorsMustSync: true,\n };\n },\n [SET_DASHBOARD_SHARED_LABELS_COLORS_SYNCED]() {\n return {\n ...state,\n sharedLabelsColorsMustSync: false,\n };\n },\n [TOGGLE_EXPAND_SLICE]() {\n const updatedExpandedSlices = { ...state.expandedSlices };\n const { sliceId } = action;\n if (updatedExpandedSlices[sliceId]) {\n delete updatedExpandedSlices[sliceId];\n } else {\n updatedExpandedSlices[sliceId] = true;\n }\n return { ...state, expandedSlices: updatedExpandedSlices };\n },\n [ON_CHANGE]() {\n return { ...state, hasUnsavedChanges: true };\n },\n [SAVE_DASHBOARD_STARTED]() {\n return {\n ...state,\n dashboardIsSaving: true,\n };\n },\n [SAVE_DASHBOARD_FINISHED]() {\n return {\n ...state,\n dashboardIsSaving: false,\n };\n },\n [ON_SAVE]() {\n return {\n ...state,\n hasUnsavedChanges: false,\n maxUndoHistoryExceeded: false,\n editMode: false,\n updatedColorScheme: false,\n // server-side returns last_modified_time for latest change\n lastModifiedTime: action.lastModifiedTime,\n };\n },\n [SET_UNSAVED_CHANGES]() {\n const { hasUnsavedChanges } = action.payload;\n return { ...state, hasUnsavedChanges };\n },\n [SET_REFRESH_FREQUENCY]() {\n return {\n ...state,\n refreshFrequency: action.refreshFrequency,\n shouldPersistRefreshFrequency: action.isPersistent,\n hasUnsavedChanges: action.isPersistent,\n };\n },\n [ON_REFRESH]() {\n return {\n ...state,\n isRefreshing: true,\n };\n },\n [ON_FILTERS_REFRESH]() {\n return {\n ...state,\n isFiltersRefreshing: true,\n };\n },\n [ON_FILTERS_REFRESH_SUCCESS]() {\n return {\n ...state,\n isFiltersRefreshing: false,\n };\n },\n [ON_REFRESH_SUCCESS]() {\n return {\n ...state,\n isRefreshing: false,\n };\n },\n [SET_DIRECT_PATH]() {\n return {\n ...state,\n directPathToChild: action.path,\n directPathLastUpdated: Date.now(),\n };\n },\n [SET_ACTIVE_TAB]() {\n const newActiveTabs = new Set(state.activeTabs);\n newActiveTabs.delete(action.prevTabId);\n newActiveTabs.add(action.tabId);\n return {\n ...state,\n activeTabs: Array.from(newActiveTabs),\n };\n },\n [SET_ACTIVE_TABS]() {\n return {\n ...state,\n activeTabs: action.activeTabs,\n };\n },\n [SET_OVERRIDE_CONFIRM]() {\n return {\n ...state,\n overwriteConfirmMetadata: action.overwriteConfirmMetadata,\n };\n },\n [SET_FOCUSED_FILTER_FIELD]() {\n return {\n ...state,\n focusedFilterField: {\n chartId: action.chartId,\n column: action.column,\n },\n };\n },\n [UNSET_FOCUSED_FILTER_FIELD]() {\n // dashboard only has 1 focused filter field at a time,\n // but when user switch different filter boxes,\n // browser didn't always fire onBlur and onFocus events in order.\n if (\n !state.focusedFilterField ||\n action.chartId !== state.focusedFilterField.chartId ||\n action.column !== state.focusedFilterField.column\n ) {\n return state;\n }\n return {\n ...state,\n focusedFilterField: null,\n };\n },\n [SET_FULL_SIZE_CHART_ID]() {\n return {\n ...state,\n fullSizeChartId: action.chartId,\n };\n },\n [SET_DATASETS_STATUS]() {\n return {\n ...state,\n datasetsStatus: action.status,\n };\n },\n };\n\n if (action.type in actionHandlers) {\n return actionHandlers[action.type]();\n }\n return state;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n/* eslint-disable camelcase */\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { omit } from 'lodash';\nimport { SET_REPORT, ADD_REPORT, EDIT_REPORT, DELETE_REPORT } from './actions';\n\nexport default function reportsReducer(state = {}, action) {\n const actionHandlers = {\n [SET_REPORT]() {\n const { report, resourceId, creationMethod, filterField } = action;\n // For now report count should only be one, but we are checking in case\n // functionality changes.\n const reportObject = report.result?.find(\n report => report[filterField] === resourceId,\n );\n\n if (reportObject) {\n return {\n ...state,\n [creationMethod]: {\n ...state[creationMethod],\n [resourceId]: reportObject,\n },\n };\n }\n if (state?.[creationMethod]?.[resourceId]) {\n // remove the empty report from state\n const newState = { ...state };\n delete newState[creationMethod][resourceId];\n return newState;\n }\n return { ...state };\n },\n\n [ADD_REPORT]() {\n const { result, id } = action.json;\n const report = { ...result, id };\n const reportTypeId = report.dashboard || report.chart;\n // this is the id of either the chart or the dashboard associated with the report.\n\n return {\n ...state,\n [report.creation_method]: {\n ...state[report.creation_method],\n [reportTypeId]: report,\n },\n };\n },\n\n [EDIT_REPORT]() {\n const report = {\n ...action.json.result,\n id: action.json.id,\n };\n const reportTypeId = report.dashboard || report.chart;\n\n return {\n ...state,\n [report.creation_method]: {\n ...state[report.creation_method],\n [reportTypeId]: report,\n },\n };\n },\n\n [DELETE_REPORT]() {\n const { report } = action;\n const reportTypeId = report.dashboard || report.chart;\n return {\n ...state,\n [report.creation_method]: {\n ...omit(state[report.creation_method], reportTypeId),\n },\n };\n },\n };\n\n if (action.type in actionHandlers) {\n return actionHandlers[action.type]();\n }\n return state;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n/* eslint camelcase: 0 */\nimport * as actions from '../actions/saveModalActions';\nimport { HYDRATE_EXPLORE } from '../actions/hydrateExplore';\n\nexport default function saveModalReducer(state = {}, action) {\n const actionHandlers = {\n [actions.SET_SAVE_CHART_MODAL_VISIBILITY]() {\n return { ...state, isVisible: action.isVisible };\n },\n [actions.FETCH_DASHBOARDS_SUCCEEDED]() {\n return { ...state, dashboards: action.choices };\n },\n [actions.FETCH_DASHBOARDS_FAILED]() {\n return {\n ...state,\n saveModalAlert: `fetching dashboards failed for ${action.userId}`,\n };\n },\n [actions.SAVE_SLICE_FAILED]() {\n return { ...state, saveModalAlert: 'Failed to save slice' };\n },\n [actions.SAVE_SLICE_SUCCESS](data) {\n return { ...state, data };\n },\n [HYDRATE_EXPLORE]() {\n return { ...action.data.saveModal };\n },\n };\n\n if (action.type in actionHandlers) {\n return actionHandlers[action.type]();\n }\n return state;\n}\n","/**\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n/* eslint camelcase: 0 */\nimport { ensureIsArray } from '@superset-ui/core';\nimport { omit, pick } from 'lodash';\nimport { DYNAMIC_PLUGIN_CONTROLS_READY } from 'src/components/Chart/chartAction';\nimport { getControlsState } from 'src/explore/store';\nimport {\n getControlConfig,\n getControlStateFromControlConfig,\n getControlValuesCompatibleWithDatasource,\n StandardizedFormData,\n} from 'src/explore/controlUtils';\nimport * as actions from 'src/explore/actions/exploreActions';\nimport { HYDRATE_EXPLORE } from '../actions/hydrateExplore';\n\nexport default function exploreReducer(state = {}, action) {\n const actionHandlers = {\n [DYNAMIC_PLUGIN_CONTROLS_READY]() {\n return {\n ...state,\n controls: action.controlsState,\n };\n },\n [actions.TOGGLE_FAVE_STAR]() {\n return {\n ...state,\n isStarred: action.isStarred,\n };\n },\n [actions.POST_DATASOURCE_STARTED]() {\n return {\n ...state,\n isDatasourceMetaLoading: true,\n };\n },\n [actions.UPDATE_FORM_DATA_BY_DATASOURCE]() {\n const newFormData = { ...state.form_data };\n const { prevDatasource, newDatasource } = action;\n const controls = { ...state.controls };\n const controlsTransferred = [];\n\n if (\n prevDatasource.id !== newDatasource.id ||\n prevDatasource.type !== newDatasource.type\n ) {\n newFormData.datasource = newDatasource.uid;\n }\n // reset control values for column/metric related controls\n Object.entries(controls).forEach(([controlName, controlState]) => {\n if (\n // for direct column select controls\n controlState.valueKey === 'column_name' ||\n // for all other controls\n 'savedMetrics' in controlState ||\n 'columns' in controlState ||\n ('options' in controlState && !Array.isArray(controlState.options))\n ) {\n newFormData[controlName] = getControlValuesCompatibleWithDatasource(\n newDatasource,\n controlState,\n controlState.value,\n );\n if (\n ensureIsArray(newFormData[controlName]).length > 0 &&\n newFormData[controlName] !== controls[controlName].default\n ) {\n controlsTransferred.push(controlName);\n }\n }\n });\n\n const newState = {\n ...state,\n controls,\n datasource: action.newDatasource,\n };\n return {\n ...newState,\n form_data: newFormData,\n controls: getControlsState(newState, newFormData),\n controlsTransferred,\n };\n },\n [actions.FETCH_DATASOURCES_STARTED]() {\n return {\n ...state,\n isDatasourcesLoading: true,\n };\n },\n [actions.SET_FIELD_VALUE]() {\n const { controlName, value, validationErrors } = action;\n let new_form_data = { ...state.form_data, [controlName]: value };\n const old_metrics_data = state.form_data.metrics;\n const new_column_config = state.form_data.column_config;\n\n const vizType = new_form_data.viz_type;\n\n // if the controlName is metrics, and the metric column name is updated,\n // need to update column config as well to keep the previous config.\n if (controlName === 'metrics' && old_metrics_data && new_column_config) {\n value.forEach((item, index) => {\n const itemExist = old_metrics_data.some(\n oldItem => oldItem?.label === item?.label,\n );\n\n if (\n !itemExist &&\n item?.label !== old_metrics_data[index]?.label &&\n !!new_column_config[old_metrics_data[index]?.label]\n ) {\n new_column_config[item.label] =\n new_column_config[old_metrics_data[index].label];\n\n delete new_column_config[old_metrics_data[index].label];\n }\n });\n new_form_data.column_config = new_column_config;\n }\n\n // Use the processed control config (with overrides and everything)\n // if `controlName` does not exist in current controls,\n const controlConfig =\n state.controls[action.controlName] ||\n getControlConfig(action.controlName, vizType) ||\n null;\n\n // will call validators again\n const control = {\n ...getControlStateFromControlConfig(controlConfig, state, action.value),\n };\n\n const column_config = {\n ...state.controls.column_config,\n ...(new_column_config && { value: new_column_config }),\n };\n\n const newState = {\n ...state,\n controls: {\n ...state.controls,\n ...(controlConfig && { [controlName]: control }),\n ...(controlName === 'metrics' && { column_config }),\n },\n };\n\n const rerenderedControls = {};\n if (Array.isArray(control.rerender)) {\n control.rerender.forEach(controlName => {\n rerenderedControls[controlName] = {\n ...getControlStateFromControlConfig(\n newState.controls[controlName],\n newState,\n newState.controls[controlName].value,\n ),\n };\n });\n }\n\n // combine newly detected errors with errors from `onChange` event of\n // each control component (passed via reducer action).\n const errors = control.validationErrors || [];\n (validationErrors || []).forEach(err => {\n // skip duplicated errors\n if (!errors.includes(err)) {\n errors.push(err);\n }\n });\n const hasErrors = errors && errors.length > 0;\n\n const isVizSwitch =\n action.controlName === 'viz_type' &&\n action.value !== state.controls.viz_type.value;\n let currentControlsState = state.controls;\n if (isVizSwitch) {\n // get StandardizedFormData from source form_data\n const sfd = new StandardizedFormData(state.form_data);\n const transformed = sfd.transform(action.value, state);\n new_form_data = transformed.formData;\n currentControlsState = transformed.controlsState;\n }\n\n return {\n ...state,\n form_data: new_form_data,\n triggerRender: control.renderTrigger && !hasErrors,\n controls: {\n ...currentControlsState,\n ...(controlConfig && {\n [action.controlName]: {\n ...control,\n validationErrors: errors,\n },\n }),\n ...rerenderedControls,\n },\n };\n },\n [actions.SET_EXPLORE_CONTROLS]() {\n return {\n ...state,\n controls: getControlsState(state, action.formData),\n };\n },\n [actions.SET_FORM_DATA]() {\n return {\n ...state,\n form_data: action.formData,\n };\n },\n [actions.UPDATE_CHART_TITLE]() {\n return {\n ...state,\n sliceName: action.sliceName,\n };\n },\n [actions.SET_SAVE_ACTION]() {\n return {\n ...state,\n saveAction: action.saveAction,\n };\n },\n [actions.CREATE_NEW_SLICE]() {\n return {\n ...state,\n slice: action.slice,\n controls: getControlsState(state, action.form_data),\n can_add: action.can_add,\n can_download: action.can_download,\n can_overwrite: action.can_overwrite,\n };\n },\n [actions.SET_STASH_FORM_DATA]() {\n const { form_data, hiddenFormData } = state;\n const { fieldNames, isHidden } = action;\n if (isHidden) {\n return {\n ...state,\n hiddenFormData: {\n ...hiddenFormData,\n ...pick(form_data, fieldNames),\n },\n form_data: omit(form_data, fieldNames),\n };\n }\n\n const restoredField = pick(hiddenFormData, fieldNames);\n return Object.keys(restoredField).length === 0\n ? state\n : {\n ...state,\n form_data: {\n ...form_data,\n ...restoredField,\n },\n hiddenFormData: omit(hiddenFormData, fieldNames),\n };\n },\n [actions.SLICE_UPDATED]() {\n return {\n ...state,\n slice: {\n ...state.slice,\n ...action.slice,\n owners: action.slice.owners\n ? action.slice.owners.map(owner => owner.value)\n : null,\n },\n sliceName: action.slice.slice_name ?? state.sliceName,\n metadata: {\n ...state.metadata,\n owners: action.slice.owners\n ? action.slice.owners.map(owner => owner.label)\n : null,\n },\n };\n },\n [actions.SET_FORCE_QUERY]() {\n return {\n ...state,\n force: action.force,\n };\n },\n [HYDRATE_EXPLORE]() {\n return {\n ...action.data.explore,\n };\n },\n };\n if (action.type in actionHandlers) {\n return actionHandlers[action.type]();\n }\n return state;\n}\n","var map = {\n\t\"./alert.svg\": [\n\t\t826230,\n\t\t6230\n\t],\n\t\"./alert_solid.svg\": [\n\t\t2886,\n\t\t2886\n\t],\n\t\"./alert_solid_small.svg\": [\n\t\t814002,\n\t\t4002\n\t],\n\t\"./area-chart-tile.svg\": [\n\t\t65573,\n\t\t5573\n\t],\n\t\"./ballot.svg\": [\n\t\t370287,\n\t\t287\n\t],\n\t\"./bar-chart-tile.svg\": [\n\t\t191084,\n\t\t1084\n\t],\n\t\"./big-number-chart-tile.svg\": [\n\t\t658310,\n\t\t8310\n\t],\n\t\"./binoculars.svg\": [\n\t\t381684,\n\t\t1684\n\t],\n\t\"./bolt.svg\": [\n\t\t506450,\n\t\t6450\n\t],\n\t\"./bolt_small.svg\": [\n\t\t440894,\n\t\t894\n\t],\n\t\"./bolt_small_run.svg\": [\n\t\t405094,\n\t\t5094\n\t],\n\t\"./calendar.svg\": [\n\t\t348829,\n\t\t8829\n\t],\n\t\"./cancel-x.svg\": [\n\t\t965394,\n\t\t5394\n\t],\n\t\"./cancel.svg\": [\n\t\t789364,\n\t\t9364\n\t],\n\t\"./cancel_solid.svg\": [\n\t\t130869,\n\t\t869\n\t],\n\t\"./card_view.svg\": [\n\t\t591277,\n\t\t1277\n\t],\n\t\"./cards.svg\": [\n\t\t876145,\n\t\t6145\n\t],\n\t\"./cards_locked.svg\": [\n\t\t449490,\n\t\t9490\n\t],\n\t\"./caret_down.svg\": [\n\t\t440149,\n\t\t149\n\t],\n\t\"./caret_left.svg\": [\n\t\t391363,\n\t\t1363\n\t],\n\t\"./caret_right.svg\": [\n\t\t56746,\n\t\t6746\n\t],\n\t\"./caret_up.svg\": [\n\t\t38754,\n\t\t8754\n\t],\n\t\"./category.svg\": [\n\t\t875362,\n\t\t5362\n\t],\n\t\"./certified.svg\": [\n\t\t307914,\n\t\t7914\n\t],\n\t\"./check.svg\": [\n\t\t769814,\n\t\t9814\n\t],\n\t\"./checkbox-half.svg\": [\n\t\t272109,\n\t\t2109\n\t],\n\t\"./checkbox-off.svg\": [\n\t\t751923,\n\t\t9131\n\t],\n\t\"./checkbox-on.svg\": [\n\t\t572426,\n\t\t2426\n\t],\n\t\"./circle.svg\": [\n\t\t131603,\n\t\t1603\n\t],\n\t\"./circle_check.svg\": [\n\t\t91503,\n\t\t1503\n\t],\n\t\"./circle_check_solid.svg\": [\n\t\t782078,\n\t\t2078\n\t],\n\t\"./clock.svg\": [\n\t\t633211,\n\t\t3211\n\t],\n\t\"./close.svg\": [\n\t\t748082,\n\t\t8082\n\t],\n\t\"./code.svg\": [\n\t\t528295,\n\t\t8295\n\t],\n\t\"./cog.svg\": [\n\t\t193533,\n\t\t3533\n\t],\n\t\"./collapse.svg\": [\n\t\t529414,\n\t\t9414\n\t],\n\t\"./color_palette.svg\": [\n\t\t581997,\n\t\t1997\n\t],\n\t\"./components.svg\": [\n\t\t327618,\n\t\t7618\n\t],\n\t\"./copy.svg\": [\n\t\t7335,\n\t\t7335\n\t],\n\t\"./cross-filter-badge.svg\": [\n\t\t760642,\n\t\t642\n\t],\n\t\"./current-rendered-tile.svg\": [\n\t\t711626,\n\t\t1626\n\t],\n\t\"./cursor_target.svg\": [\n\t\t842679,\n\t\t2679\n\t],\n\t\"./database.svg\": [\n\t\t557056,\n\t\t7056\n\t],\n\t\"./dataset_physical.svg\": [\n\t\t314255,\n\t\t4255\n\t],\n\t\"./dataset_virtual.svg\": [\n\t\t905336,\n\t\t1016\n\t],\n\t\"./dataset_virtual_greyscale.svg\": [\n\t\t280389,\n\t\t389\n\t],\n\t\"./default_db_image.svg\": [\n\t\t159286,\n\t\t9286\n\t],\n\t\"./download.svg\": [\n\t\t477239,\n\t\t7239\n\t],\n\t\"./drag.svg\": [\n\t\t833709,\n\t\t3709\n\t],\n\t\"./edit.svg\": [\n\t\t200673,\n\t\t673\n\t],\n\t\"./edit_alt.svg\": [\n\t\t284749,\n\t\t4749\n\t],\n\t\"./email.svg\": [\n\t\t3702,\n\t\t3702\n\t],\n\t\"./error.svg\": [\n\t\t916525,\n\t\t6525\n\t],\n\t\"./error_solid.svg\": [\n\t\t448277,\n\t\t8277\n\t],\n\t\"./error_solid_small.svg\": [\n\t\t868162,\n\t\t8162\n\t],\n\t\"./error_solid_small_red.svg\": [\n\t\t583702,\n\t\t8700\n\t],\n\t\"./exclamation.svg\": [\n\t\t924602,\n\t\t4602\n\t],\n\t\"./expand.svg\": [\n\t\t465481,\n\t\t5481\n\t],\n\t\"./eye.svg\": [\n\t\t213456,\n\t\t3456\n\t],\n\t\"./eye_slash.svg\": [\n\t\t395305,\n\t\t5305\n\t],\n\t\"./favorite-selected.svg\": [\n\t\t162913,\n\t\t2913\n\t],\n\t\"./favorite-unselected.svg\": [\n\t\t497914,\n\t\t9452\n\t],\n\t\"./favorite_small_selected.svg\": [\n\t\t366146,\n\t\t6146\n\t],\n\t\"./field_abc.svg\": [\n\t\t678942,\n\t\t8942\n\t],\n\t\"./field_boolean.svg\": [\n\t\t214804,\n\t\t4804\n\t],\n\t\"./field_date.svg\": [\n\t\t122417,\n\t\t2417\n\t],\n\t\"./field_derived.svg\": [\n\t\t23045,\n\t\t3045\n\t],\n\t\"./field_num.svg\": [\n\t\t827461,\n\t\t7461\n\t],\n\t\"./field_struct.svg\": [\n\t\t528325,\n\t\t8325\n\t],\n\t\"./file.svg\": [\n\t\t84376,\n\t\t4376\n\t],\n\t\"./filter.svg\": [\n\t\t385205,\n\t\t5205\n\t],\n\t\"./filter_small.svg\": [\n\t\t548225,\n\t\t8225\n\t],\n\t\"./folder.svg\": [\n\t\t783431,\n\t\t3431\n\t],\n\t\"./full.svg\": [\n\t\t309542,\n\t\t9542\n\t],\n\t\"./function_x.svg\": [\n\t\t383339,\n\t\t3339\n\t],\n\t\"./gear.svg\": [\n\t\t515634,\n\t\t5634\n\t],\n\t\"./grid.svg\": [\n\t\t489480,\n\t\t9480\n\t],\n\t\"./image.svg\": [\n\t\t8417,\n\t\t8417\n\t],\n\t\"./import.svg\": [\n\t\t747508,\n\t\t7508\n\t],\n\t\"./info-solid.svg\": [\n\t\t689558,\n\t\t9558\n\t],\n\t\"./info.svg\": [\n\t\t373489,\n\t\t3489\n\t],\n\t\"./info_solid_small.svg\": [\n\t\t707822,\n\t\t7822\n\t],\n\t\"./join.svg\": [\n\t\t472405,\n\t\t2405\n\t],\n\t\"./keyboard.svg\": [\n\t\t545310,\n\t\t5310\n\t],\n\t\"./layers.svg\": [\n\t\t351705,\n\t\t1705\n\t],\n\t\"./lightbulb.svg\": [\n\t\t946712,\n\t\t6712\n\t],\n\t\"./line-chart-tile.svg\": [\n\t\t783423,\n\t\t3423\n\t],\n\t\"./link.svg\": [\n\t\t854641,\n\t\t4641\n\t],\n\t\"./list.svg\": [\n\t\t991019,\n\t\t1019\n\t],\n\t\"./list_view.svg\": [\n\t\t448074,\n\t\t8074\n\t],\n\t\"./location.svg\": [\n\t\t155840,\n\t\t5840\n\t],\n\t\"./lock_locked.svg\": [\n\t\t9174,\n\t\t9174\n\t],\n\t\"./lock_unlocked.svg\": [\n\t\t125280,\n\t\t5280\n\t],\n\t\"./map.svg\": [\n\t\t648058,\n\t\t8058\n\t],\n\t\"./message.svg\": [\n\t\t325922,\n\t\t5922\n\t],\n\t\"./minus.svg\": [\n\t\t535117,\n\t\t5117\n\t],\n\t\"./minus_solid.svg\": [\n\t\t67539,\n\t\t7539\n\t],\n\t\"./more_horiz.svg\": [\n\t\t893246,\n\t\t3246\n\t],\n\t\"./more_vert.svg\": [\n\t\t251441,\n\t\t1441\n\t],\n\t\"./move.svg\": [\n\t\t734801,\n\t\t4801\n\t],\n\t\"./nav_charts.svg\": [\n\t\t498430,\n\t\t8430\n\t],\n\t\"./nav_dashboard.svg\": [\n\t\t36239,\n\t\t6239\n\t],\n\t\"./nav_data.svg\": [\n\t\t166730,\n\t\t6730\n\t],\n\t\"./nav_explore.svg\": [\n\t\t259360,\n\t\t9360\n\t],\n\t\"./nav_home.svg\": [\n\t\t158960,\n\t\t8960\n\t],\n\t\"./nav_lab.svg\": [\n\t\t243613,\n\t\t3613\n\t],\n\t\"./note.svg\": [\n\t\t560971,\n\t\t971\n\t],\n\t\"./offline.svg\": [\n\t\t970650,\n\t\t650\n\t],\n\t\"./paperclip.svg\": [\n\t\t244837,\n\t\t4837\n\t],\n\t\"./pie-chart-tile.svg\": [\n\t\t219804,\n\t\t9804\n\t],\n\t\"./placeholder.svg\": [\n\t\t227850,\n\t\t7850\n\t],\n\t\"./plus.svg\": [\n\t\t134616,\n\t\t4616\n\t],\n\t\"./plus_large.svg\": [\n\t\t967820,\n\t\t7820\n\t],\n\t\"./plus_small.svg\": [\n\t\t174585,\n\t\t4585\n\t],\n\t\"./plus_solid.svg\": [\n\t\t683070,\n\t\t3070\n\t],\n\t\"./queued.svg\": [\n\t\t862905,\n\t\t2905\n\t],\n\t\"./redo.svg\": [\n\t\t713043,\n\t\t3043\n\t],\n\t\"./refresh.svg\": [\n\t\t100084,\n\t\t84\n\t],\n\t\"./running.svg\": [\n\t\t315350,\n\t\t5350\n\t],\n\t\"./save.svg\": [\n\t\t390511,\n\t\t511\n\t],\n\t\"./search.svg\": [\n\t\t552652,\n\t\t2652\n\t],\n\t\"./server.svg\": [\n\t\t326878,\n\t\t6878\n\t],\n\t\"./share.svg\": [\n\t\t925869,\n\t\t5869\n\t],\n\t\"./slack.svg\": [\n\t\t751044,\n\t\t1044\n\t],\n\t\"./sort.svg\": [\n\t\t216945,\n\t\t6945\n\t],\n\t\"./sort_asc.svg\": [\n\t\t888012,\n\t\t8012\n\t],\n\t\"./sort_desc.svg\": [\n\t\t888426,\n\t\t8426\n\t],\n\t\"./sql.svg\": [\n\t\t817248,\n\t\t7248\n\t],\n\t\"./table-chart-tile.svg\": [\n\t\t85499,\n\t\t5499\n\t],\n\t\"./table.svg\": [\n\t\t199684,\n\t\t9684\n\t],\n\t\"./tag.svg\": [\n\t\t492237,\n\t\t2237\n\t],\n\t\"./tags.svg\": [\n\t\t451378,\n\t\t1378\n\t],\n\t\"./transparent.svg\": [\n\t\t154858,\n\t\t4858\n\t],\n\t\"./trash.svg\": [\n\t\t262663,\n\t\t2663\n\t],\n\t\"./triangle_change.svg\": [\n\t\t347635,\n\t\t7635\n\t],\n\t\"./triangle_down.svg\": [\n\t\t697589,\n\t\t6384\n\t],\n\t\"./triangle_up.svg\": [\n\t\t433478,\n\t\t3478\n\t],\n\t\"./undo.svg\": [\n\t\t962202,\n\t\t2202\n\t],\n\t\"./up-level.svg\": [\n\t\t315029,\n\t\t5029\n\t],\n\t\"./user.svg\": [\n\t\t572837,\n\t\t2837\n\t],\n\t\"./warning.svg\": [\n\t\t792707,\n\t\t2707\n\t],\n\t\"./warning_solid.svg\": [\n\t\t485725,\n\t\t5725\n\t],\n\t\"./x-large.svg\": [\n\t\t455521,\n\t\t5521\n\t],\n\t\"./x-small.svg\": [\n\t\t520057,\n\t\t57\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(() => {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(() => {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = () => (Object.keys(map));\nwebpackAsyncContext.id = 169233;\nmodule.exports = webpackAsyncContext;"],"names":["untitledQueryRegex","untitledQuery","newQueryTabName","queryEditors","initialTitle","resultTitle","t","length","untitledQueryNumbers","filter","qe","_qe$name","name","match","map","replace","largestNumber","Math","max","RESET_STATE","ADD_QUERY_EDITOR","UPDATE_QUERY_EDITOR","QUERY_EDITOR_SAVED","CLONE_QUERY_TO_NEW_TAB","REMOVE_QUERY_EDITOR","MERGE_TABLE","REMOVE_TABLES","END_QUERY","REMOVE_QUERY","EXPAND_TABLE","COLLAPSE_TABLE","QUERY_EDITOR_SETDB","QUERY_EDITOR_SET_CATALOG","QUERY_EDITOR_SET_SCHEMA","QUERY_EDITOR_SET_TITLE","QUERY_EDITOR_SET_AUTORUN","QUERY_EDITOR_SET_SQL","QUERY_EDITOR_SET_CURSOR_POSITION","QUERY_EDITOR_SET_QUERY_LIMIT","QUERY_EDITOR_SET_TEMPLATE_PARAMS","QUERY_EDITOR_SET_SELECTED_TEXT","QUERY_EDITOR_SET_FUNCTION_NAMES","QUERY_EDITOR_PERSIST_HEIGHT","QUERY_EDITOR_TOGGLE_LEFT_BAR","MIGRATE_QUERY_EDITOR","MIGRATE_TAB_HISTORY","MIGRATE_TABLE","MIGRATE_QUERY","SET_DATABASES","SET_ACTIVE_QUERY_EDITOR","LOAD_QUERY_EDITOR","SET_TABLES","SET_ACTIVE_SOUTHPANE_TAB","REFRESH_QUERIES","SET_USER_OFFLINE","RUN_QUERY","START_QUERY","STOP_QUERY","REQUEST_QUERY_RESULTS","QUERY_SUCCESS","QUERY_FAILED","CLEAR_INACTIVE_QUERIES","CLEAR_QUERY_RESULTS","REMOVE_DATA_PREVIEW","CHANGE_DATA_PREVIEW_ID","COST_ESTIMATE_STARTED","COST_ESTIMATE_RETURNED","COST_ESTIMATE_FAILED","CREATE_DATASOURCE_STARTED","CREATE_DATASOURCE_SUCCESS","CREATE_DATASOURCE_FAILED","SET_EDITOR_TAB_LAST_UPDATE","SET_LAST_UPDATED_ACTIVE_TAB","CLEAR_DESTROYED_QUERY_EDITOR","addInfoToast","addInfoToastAction","addSuccessToast","addSuccessToastAction","addDangerToast","addDangerToastAction","addWarningToast","addWarningToastAction","CtasEnum","Table","View","ERR_MSG_CANT_LOAD_QUERY","queryClientMapping","id","db_id","label","template_parameters","fieldConverter","mapping","obj","_mapKeys","value","key","convertQueryToServer","_invert","convertQueryToClient","getUpToDateQuery","rootState","queryEditor","sqlLab","unsavedQueryEditor","find","resetState","data","dispatch","getState","common","initialState","getInitialState","getBootstrapData","type","sqlLabInitialState","rehydratePersistedState","updateQueryEditor","alterations","setEditorTabLastUpdate","timestamp","scheduleQuery","query","SupersetClient","post","endpoint","jsonPayload","stringify","then","catch","estimateQueryCost","dbId","catalog","schema","sql","selectedText","templateParams","postPayload","database_id","template_params","JSON","parse","Promise","all","body","headers","json","response","getClientErrorObject","error","message","statusText","clearInactiveQueries","interval","startQuery","Object","assign","nanoid","progress","startDttm","now","state","runAsync","cached","querySuccess","results","queryFailed","msg","link","errors","eventData","has_err","start_offset","ts","Date","getTime","forEach","error_type","errorType","extra","_extra$issue_codes","issue_codes","logEvent","LOG_ACTIONS_SQLLAB_FETCH_FAILED_QUERY","error_details","stopQuery","clearQueryResults","removeDataPreview","table","requestQueryResults","fetchQueryResults","displayLimit","timeoutInMs","_getState$common$conf","_getState$common","SQLLAB_QUERY_RESULT_TIMEOUT","conf","queryParams","rison","resultsKey","rows","timeout","controller","AbortController","get","parseMethod","signal","abort","runQuery","client_id","sql_editor_id","sqlEditorId","tab","tmp_table_name","tempTable","select_as_cta","ctas","ctas_method","queryLimit","expand_data","search","window","location","includes","COMMON_ERR_MESSAGES","SESSION_TIMED_OUT","runQueryFromSqlEditor","database","defaultQueryLimit","ctasMethod","allow_run_async","updateTabState","reRunQuery","postStopQuery","setDatabases","databases","syncQueryEditor","tables","queries","localStorageTables","inLocalStorage","queryEditorId","localStorageQueries","values","newQueryEditor","toString","loaded","oldQueryEditor","oldId","newId","encodeURI","newTable","oldTable","migrateTable","queryId","migrateQuery","addQueryEditor","addNewQueryEditor","tabHistory","defaultDbId","SQLLAB_DEFAULT_DBID","activeQueryEditor","dbIds","firstDbId","min","undefined","autorun","warning","isFeatureEnabled","FeatureFlag","SqllabBackendPersistence","DEFAULT_SQLLAB_LIMIT","cloneQueryToNewTab","sourceQueryEditor","maxRow","setLastUpdatedActiveTab","setActiveQueryEditor","switchQueryEditor","goBackward","qeid","currentIndex","findIndex","loadQueryEditor","setTables","tableSchemas","tableSchema","description","columns","selectStar","primaryKey","foreignKeys","indexes","dataPreviewQueryId","tab_state_id","expanded","isMetadataLoading","isExtraMetadataLoading","fetchQueryEditor","_json$latest_query","_json$saved_query","loadedQueryEditor","latestQueryId","latest_query","query_limit","remoteId","saved_query","hideLeftBar","hide_left_bar","table_schemas","status","setActiveSouthPaneTab","tabId","toggleLeftBar","clearDestoryedQueryEditor","removeQueryEditor","removeAllOtherQueryEditors","_sqlLab$queryEditors","otherQueryEditor","removeQuery","delete","resolve","queryEditorSetDb","queryEditorSetCatalog","queryEditorSetSchema","queryEditorSetAutorun","queryEditorSetTitle","saveQuery","clientId","payload","result","savedQuery","addSavedQueryToTabState","put","saved_query_id","updateSavedQuery","e","console","queryEditorSetSql","queryEditorSetCursorPosition","position","queryEditorSetAndSaveSql","targetQueryEditor","latest_query_id","formatQuery","queryEditorSetQueryLimit","queryEditorSetTemplateParams","queryEditorSetSelectedText","mergeTable","prepend","addTable","tableName","catalogName","schemaName","runTablePreviewQuery","disable_data_preview","dataPreviewQuery","isDataPreview","syncTable","tableMetadata","resultJson","initialized","changeDataPreviewId","oldQueryId","newQuery","reFetchQueryResults","expandTable","collapseTable","removeTables","_tables$filter","tablesToRemove","Boolean","refreshQueries","alteredQueries","setUserOffline","offline","persistEditorHeight","northPercent","southPercent","popStoredQuery","urlId","parseInt","popSavedQuery","saveQueryId","queryEditorProps","tmpAdaptedProps","popQuery","queryData","tab_name","popDatasourceQuery","datasourceKey","QUERY_TEXT","datasetId","split","keys","select_star","createDatasourceStarted","createDatasourceSuccess","datasource","createDatasourceFailed","err","createDatasource","vizOptions","datasourceName","table_name","is_managed_externally","external_url","reject","createCtasDatasource","errorMsg","Error","CHART_UPDATE_STARTED","chartUpdateStarted","queryController","latestQueryFormData","CHART_UPDATE_SUCCEEDED","chartUpdateSucceeded","queriesResponse","CHART_UPDATE_STOPPED","chartUpdateStopped","CHART_UPDATE_FAILED","chartUpdateFailed","CHART_RENDERING_FAILED","chartRenderingFailed","stackTrace","CHART_RENDERING_SUCCEEDED","chartRenderingSucceeded","REMOVE_CHART","removeChart","ANNOTATION_QUERY_SUCCESS","annotationQuerySuccess","annotation","queryResponse","ANNOTATION_QUERY_STARTED","annotationQueryStarted","ANNOTATION_QUERY_FAILED","annotationQueryFailed","DYNAMIC_PLUGIN_CONTROLS_READY","dynamicPluginControlsReady","controlsState","getControlsState","explore","form_data","slice_id","legacyChartDataRequest","async","formData","resultFormat","resultType","force","method","requestParams","endpointType","getLegacyEndpointType","allowDomainSharding","domainShardingEnabled","dashboard_id","url","getExploreUrl","querySettings","v1ChartDataRequest","setDataMask","ownState","buildV1ChartDataPayload","sliceId","dashboardId","qs","getChartDataUri","path","getChartDataRequest","mode","credentials","useLegacyApi","getQuerySettings","runAnnotationQuery","isDashboardRequest","_fd$annotation_layers","charts","sliceKey","queryTimeout","SUPERSET_WEBSERVER_TIMEOUT","fd","sourceType","time_grain_sqla","granularity","granularity_sqla","overridesKeys","overrides","time_range","sliceFormData","reduce","d","k","hasExtraFilters","extra_filters","getAnnotationJsonUrl","annotationIndex","annotation_layers","it","_json$result","_json$result$","_json$result$$annotat","annotation_data","toLowerCase","TRIGGER_QUERY","triggerQuery","RENDER_TRIGGERED","renderTriggered","UPDATE_QUERY_FORM_DATA","updateQueryFormData","UPDATE_CHART_ID","updateChartId","ADD_CHART","addChart","chart","handleChartDataResponse","GlobalAsyncQueries","waitForAsyncData","exploreJSON","logStart","Logger","getTimestamp","chartDataRequest","dataMask","updateDataMask","chartDataRequestCaught","resultItem","LOG_ACTIONS_LOAD_CHART","applied_filters","is_cached","force_refresh","row_count","rowcount","duration","has_extra_filters","viz_type","data_age","moment","diff","cached_dttm","appendErrorLog","errorDetails","isCached","parsedResponse","annotationLayers","POST_CHART_FORM_DATA","postChartFormData","redirectSQLLab","history","redirectUrl","push","pathname","requestedQuery","postForm","safeStringify","refreshChart","chartKey","_getState$dataMask$ch","dashboardInfo","getDatasourceSamples","datasourceType","datasourceId","perPage","page","searchParams","datasource_type","datasource_id","isDefined","per_page","clientError","cause","isValidFilter","chartId","dashboardState","sliceIds","CHANGE_FILTER","changeFilter","newSelectedValues","merge","components","dashboardLayout","present","dashboardFilters","UPDATE_DIRECT_PATH_TO_FILTER","updateDirectPathToFilter","UPDATE_LAYOUT_COMPONENTS","updateLayoutComponents","UPDATE_DASHBOARD_FILTERS_SCOPE","updateDashboardFiltersScope","scopes","UPDATE_COMPONENTS","setUnsavedChangesAfterAction","action","args","nextComponents","hasUnsavedChanges","setUnsavedChanges","updateComponents","updateDashboardTitle","text","DASHBOARD_HEADER_ID","meta","DASHBOARD_TITLE_CHANGED","dashboardTitleChanged","DELETE_COMPONENT","deleteComponent","parentId","CREATE_COMPONENT","createComponent","dropResult","CREATE_TOP_LEVEL_TABS","createTopLevelTabs","DELETE_TOP_LEVEL_TABS","deleteTopLevelTabs","RESIZE_COMPONENT","resizeComponent","width","height","undoableLayout","dashboard","component","widthChanged","heightChanged","updatedComponents","MOVE_COMPONENT","moveComponent","HANDLE_COMPONENT_DROP","handleComponentDrop","overflowsParent","layout","childWidth","getComponentWidthFromDrop","dropOverflowsParent","source","destination","droppedOnRoot","DASHBOARD_ROOT_ID","isNewComponent","NEW_COMPONENTS_SOURCE_ID","dashboardRoot","rootChildId","children","TABS_TYPE","index","sourceComponent","destinationComponent","ROW_TYPE","findParentId","childId","sourceSet","Set","destinationSet","concat","scope","some","has","isInDifferentFilterScopes","parents","undoLayoutAction","UndoActionCreators","undo","past","maxUndoHistoryExceeded","updatedColorScheme","redoLayoutAction","redo","UPDATE_COMPONENTS_PARENTS_LIST","JSON_KEYS","extractValue","object","keyPath","SET_UNSAVED_CHANGES","ADD_SLICE","REMOVE_SLICE","TOGGLE_FAVE_STAR","toggleFaveStar","isStarred","fetchFaveStar","saveFaveStar","TOGGLE_PUBLISHED","savePublished","isPublished","published","togglePublished","TOGGLE_EXPAND_SLICE","toggleExpandSlice","UPDATE_CSS","updateCss","css","SET_EDIT_MODE","setEditMode","editMode","ON_CHANGE","onChange","ON_SAVE","onSave","lastModifiedTime","SET_REFRESH_FREQUENCY","setRefreshFrequency","refreshFrequency","isPersistent","saveDashboardRequestSuccess","clearHistory","SET_OVERRIDE_CONFIRM","setOverrideConfirm","overwriteConfirmMetadata","SAVE_DASHBOARD_STARTED","SAVE_DASHBOARD_FINISHED","saveDashboardFinished","SET_DASHBOARD_LABELS_COLORMAP_SYNCABLE","SET_DASHBOARD_LABELS_COLORMAP_SYNCED","SET_DASHBOARD_SHARED_LABELS_COLORS_SYNCABLE","SET_DASHBOARD_SHARED_LABELS_COLORS_SYNCED","setDashboardLabelsColorMapSync","setDashboardMetadata","updatedMetadata","dashboardInfoChanged","metadata","saveDashboardRequest","saveType","_data$metadata","_data$metadata2","_data$metadata3","_data$metadata4","_data$metadata5","_data$metadata6","_data$metadata7","_data$metadata8","_layout$componentId","componentId","directPathToFilter","slice","pop","serializedFilters","serializeActiveFilterValues","getActiveFilters","serializedFilterScopes","scopesByColumn","column","serializeFilterScopes","certified_by","certification_details","dashboard_title","owners","roles","slug","hasId","item","metadataCrossFiltersEnabled","cross_filters_enabled","colorScheme","color_scheme","customLabelsColor","label_colors","sharedLabelsColor","enforceSharedLabelsColorsArray","shared_label_colors","cleanedData","ensureIsArray","o","DashboardRbac","r","color_namespace","getColorNamespace","color_scheme_domain","getColorSchemeDomain","expanded_slices","getFreshSharedLabels","map_label_colors","getLabelsColorMapEntries","refresh_frequency","timed_refresh_immune_slices","isCrossFiltersEnabled","handleChartConfiguration","getCrossFiltersConfiguration","onError","errorText","SAVE_TYPE_OVERWRITE","SAVE_TYPE_OVERWRITE_CONFIRMED","chartConfiguration","globalChartConfiguration","DashboardCrossFilters","updatedDashboard","json_metadata","default_filters","filter_scopes","chart_configuration","global_chart_configuration","updateDashboard","onUpdateSuccess","last_modified_time","SAVE_CHART_CONFIG_COMPLETE","native_filter_configuration","SET_FILTER_CONFIG_COMPLETE","filterConfig","_json$result2","datasources","setDatasources","pushState","event","ConfirmDashboardDiff","overwriteConfirmItems","prev","next","OVERWRITE_INSPECT_FIELDS","oldValue","newValue","updatedAt","changed_on","updatedBy","changed_by_name","LOG_ACTIONS_CONFIRM_OVERWRITE_DASHBOARD_METADATA","items","positions","copyPayload","duplicate_slices","onCopySuccess","saveChartConfiguration","fetchCharts","chartList","refreshTime","stagger_time","stagger_refresh","delay","i","setTimeout","refreshCharts","ON_FILTERS_REFRESH","ON_FILTERS_REFRESH_SUCCESS","onFiltersRefreshSuccess","ON_REFRESH_SUCCESS","ON_REFRESH","onRefresh","SHOW_BUILDER_PANE","showBuilderPane","addSliceToDashboard","sliceEntities","selectedSlice","slices","newChart","initChart","applyDefaultFormData","fetchDatasourceMetadata","removeSliceFromDashboard","getLabelsColorMap","removeSlice","SET_COLOR_SCHEME","setColorScheme","SET_DIRECT_PATH","setDirectPathToChild","SET_ACTIVE_TAB","setActiveTab","prevTabId","SET_ACTIVE_TABS","SET_FOCUSED_FILTER_FIELD","setFocusedFilterField","UNSET_FOCUSED_FILTER_FIELD","unsetFocusedFilterField","SET_FULL_SIZE_CHART_ID","setFullSizeChartId","SET_MAX_UNDO_HISTORY_EXCEEDED","setMaxUndoHistoryExceeded","maxUndoHistoryToast","historyLength","SET_DATASETS_STATUS","setDatasetsStatus","persistDashboardLabelsColor","labelsColorMapMustSync","sharedLabelsColorsMustSync","storeDashboardMetadata","applyDashboardLabelsColorOnLoad","hasChanged","sharedLabels","Array","isArray","hasMapLabelColors","updatedScheme","categoricalSchemes","getCategoricalSchemeRegistry","colorSchemeRegistry","hasInvalidColorScheme","defaultScheme","defaultKey","fallbackScheme","freshColorSchemeDomain","currentColorSchemeDomain","_isEqual","shouldGoFresh","applyColors","ensureSyncedLabelsColorMap","promiseTimeout","syncLabelsColorMap","mustSync","isLabelsColorMapSynced","freshestColorMapEntries","ensureSyncedSharedLabelsColors","forceFresh","syncSharedLabelsColors","sharedLabelsColors","freshLabelsColors","updateDashboardLabelsColor","renderedChartIds","labelsColorMapInstance","fullLabelsColors","customLabelsColors","shouldReset","sharedLabelsSet","setOwnColorScheme","chartColorScheme","currentChartConfig","chartsLabelsMap","uniqueChartLabels","labels","l","hasOwnProperty","uniqueChartLabelsColor","expectedColorsForChartScheme","color","shouldMerge","HYDRATE_DASHBOARD","hydrateDashboard","activeTabs","user","position_data","positionData","regularUrlParams","extractUrlParams","edit","DASHBOARD_VERSION_KEY","DASHBOARD_ROOT_TYPE","DASHBOARD_GRID_ID","DASHBOARD_GRID_TYPE","chartIdToLayoutId","layoutComponent","CHART_TYPE","parent","findFirstParentContainerId","newSlicesContainer","newSlicesContainerWidth","chartQueries","slicesFromExploreCount","Map","url_params","slice_url","slice_name","description_markeddown","modified","add","_slicesFromExploreCou","GRID_DEFAULT_CHART_WIDTH","GRID_COLUMN_COUNT","newComponentFactory","chartHolder","count","set","layoutId","sliceName","element","updateComponentParentsList","currentComponent","buildActiveFilters","DASHBOARD_HEADER_TYPE","future","focusedChartId","getUrlParam","URL_PARAMS","dashboardFocusedChart","focusedChartLayoutId","found","_element$meta","params","URLSearchParams","directLinkComponentId","getLocationHash","directPathToChild","nativeFilters","getInitialNativeFilterState","canEdit","canUserEditDashboard","crossFiltersEnabled","initSliceEntities","isLoading","userId","String","dash_edit_perm","dash_save_perm","canUserSaveAsDashboard","dash_share_perm","findPermission","superset_can_explore","superset_can_share","superset_can_csv","flash_messages","filterBarOrientation","HorizontalFilterBar","filter_bar_orientation","FilterBarOrientation","Vertical","preselectNativeFilters","from","directPathLastUpdated","focusedFilterField","expandedSlices","shouldPersistRefreshFrequency","colorNamespace","dashboardIsSaving","isRefreshing","isFiltersRefreshing","datasetsStatus","ResourceStatus","Loading","DASHBOARD_FILTER_SCOPE_GLOBAL","immune","CHANGE_FILTER_VALUE_ACTIONS","dashboardFiltersReducer","actionHandlers","updatedColumns","allDashboardFiltersScope","updatedFilters","entries","entry","filterKey","getChartIdAndColumnFromFilterKey","errorMessage","lastUpdated","sliceEntitiesReducer","FETCH_ALL_SLICES_STARTED","ADD_SLICES","SET_SLICES","FETCH_ALL_SLICES_FAILED","activeFilters","appliedFilterValuesByChart","allComponents","getAppliedFilterValues","filters","applicableFilters","chartIds","_flow","_keyBy","_mapValues","getChartIdsInFilterScope","filterScope","traverse","immuneChartIds","child","scopeComponentIds","_isEmpty","nonEmptyFilters","getDashboardFilterKey","dragging","draggingWidth","minimumWidth","minDraggingWidth","getDetailedComponentWidth","destinationWidth","occupiedWidth","draggingOccupiedWidth","destinationCapacity","Number","isNaN","grandparentWidth","grandparentOccupiedWidth","getTotalChildWidth","passedComponent","GRID_MIN_COLUMN_COUNT","COLUMN_TYPE","DYNAMIC_TYPE","MARKDOWN_TYPE","typeToDefaultMetaData","background","BACKGROUND_TRANSPARENT","DIVIDER_TYPE","HEADER_TYPE","headerSize","MEDIUM_HEADER","TAB_TYPE","defaultText","placeholder","uuid","entityFactory","entryByChartId","parentsList","logging","warn","categoricalSchemeRegistry","sequentialSchemeRegistry","getSequentialSchemeRegistry","D3_FORMAT_OPTIONS","timeColumnOption","verbose_name","column_name","groupByControl","multi","freeForm","default","includeTime","optionRenderer","c","_jsx","StyledColumnOption","showType","valueKey","filterOption","opt","indexOf","mapStateToProps","control","newState","options","groupby","metrics","validators","validateNonEmpty","savedMetrics","metric","controls","isEditable","color_picker","g","b","a","renderTrigger","metric_2","clearable","linear_color_scheme","choices","getDefaultKey","schemes","getMap","isLinear","secondary_metric","TIME_FILTER_LABELS","props","main_dttm_col","row_limit","legacyValidateInteger","formatSelectOptions","limit","timeseries_limit_metric","series","entity","x","y","size","y_axis_format","showWarning","comparison_type","disabled","adhoc_filters","filterable","s","getChartKey","_ref","_slice$slice_id","UNSAVED_CHART_ID","requestCounter","getHostName","availableDomains","URI","getURIDirectory","mountExploreUrl","extraSearch","uri","directory","standalone","DashboardStandaloneMode","HideNav","protocol","hostname","port","curUrl","csv","samples","paramNames","_vizMetadata$useLegac","_vizMetadata$parseMet","vizMetadata","getChartMetadataRegistry","_getChartBuildQueryRe","getChartBuildQueryRegistry","buildQueryformData","buildQueryContext","baseQueryObject","result_format","result_type","hooks","exportChart","exploreChart","useDebouncedEffect","effect","deps","callback","useCallback","useEffect","handler","clearTimeout","getSimpleSQLExpression","subject","operator","comparator","_subject$column_name","isMulti","MULTI_OPERATORS","op","OPERATOR_ENUM_TO_OPERATOR_TYPE","operation","expression","firstValue","comparatorArray","isString","quote","prefix","suffix","formattedComparators","val","optionLabel","join","inputFormData","_state$common","vizType","DEFAULT_VIZ_TYPE","y_axis_zero","y_axis_bounds","handleDeprecatedControls","getAllControlsState","controlPanelConfig","getChartControlPanelRegistry","onInit","controlFormData","getFormDataFromControls","controlName","defaultControls","f","SET_REPORT","fetchUISpecificReport","filterField","creationMethod","resourceId","col","opr","report","setReport","structureFetchAction","_explore$user","chartArr","ADD_REPORT","addReport","EDIT_REPORT","editReport","toggleActive","isActive","active","finally","DELETE_REPORT","deleteActiveReport","EMPTY_STRING","NULL_STRING","TRUE_STRING","FALSE_STRING","DATETIME_FORMATTER","getTimeFormatter","TimeFormats","DATABASE_DATETIME","storeQuery","origin","getColumnName","prepareCopyToClipboardTabularData","row","j","parseFloat","applyFormattingToTabularData","timeFormattedColumns","acc","colName","noOp","detectOS","appVersion","navigator","isSafari","userAgent","test","fDuration","t1","t2","format","diffSec","utc","valueOf","_bootstrapData$common","_bootstrapData$common2","document","getElementById","bootstrapData","initFeatureFlags","feature_flags","SUPERSET_WEBSERVER_DOMAINS","hostName","getDomainsConfig","allowCrossDomain","StyledDiv","styled","div","theme","gridUnit","certifiedBy","details","metricName","useTheme","Tooltip","_kebabCase","title","_jsxs","xmlns","enableBackground","viewBox","fill","colors","primary","base","StyleOverrides","span","ColumnOption","labelRef","type_generic","hasExpression","warningMarkdown","warning_markdown","warning_text","error_text","tooltipText","setTooltipText","useState","columnTypeTooltipText","setcolumnTypeTooltipText","useLayoutEffect","getColumnTooltipNode","getColumnTypeTooltipNode","placement","align","offset","ColumnTypeLabel","className","ref","getColumnLabelText","SQLPopover","sqlExpression","is_certified","CertifiedIconWithTooltip","metric_name","InfoTooltipWithTrigger","icon","tooltip","SafeMarkdown","iconsStyle","marginLeft","_path","_extends","bind","n","arguments","call","apply","SvgFieldDerived","titleId","fillRule","clipRule","forwardRef","SvgFieldBoolean","SvgFieldAbc","SvgFieldNum","TypeIconWrapper","typeIcon","QuestionOutlined","FunctionSvg","GenericDataType","StringSvg","Numeric","NumSvg","BooleanSvg","Temporal","ClockCircleOutlined","ControlSubSectionHeader","typography","weights","bold","sizes","bsStyle","onClick","iconClass","iconEl","role","tabIndex","style","cursor","onKeyPress","FlexRowContainer","MetricOption","openInNewWindow","showFormula","shouldShowTooltip","verbose","href","target","rel","getMetricTooltipNode","StyledCalculatorIcon","CalculatorOutlined","grayscale","Popover","content","AceEditor","editorProps","$blockScrolling","setOptions","highlightActiveLine","highlightGutterLine","minLines","maxLines","readOnly","wrapEnabled","border","light2","secondary","light5","maxWidth","arrowPointAtCenter","overlayStyle","defaultColor","dark2","_Fragment","Global","styles","BaseTooltip","fontSize","lineHeight","minWidth","trigger","mouseLeaveDelay","TooltipSectionWrapper","TooltipSectionLabel","TooltipSection","isLabelTruncated","_labelRef$current","_labelRef$current2","current","scrollWidth","clientWidth","DEFAULT_MAX_ROW","COLUMN_NAME_ALIASES","DTTM_ALIAS","DATASET_TIME_COLUMN_OPTION","QUERY_TIME_COLUMN_OPTION","is_dttm","QueryModeLabel","QueryMode","Aggregate","Raw","DEFAULT_SORT_SERIES_DATA","sort_series_type","SortSeriesType","Sum","sort_series_ascending","SORT_SERIES_CHOICES","Name","Min","Max","Avg","DEFAULT_XAXIS_SORT_SERIES_DATA","ControlHeader","tooltipOnClick","danger","leftNode","rightNode","validationErrors","hovered","required","labelClass","htmlFor","RadioButtonControl","initialValue","currentValue","_css","top","outline","marginBottom","marginTop","dark1","light4","fontWeight","boxShadow","dndGroupByControl","valueRenderer","allowAll","_opt$column_name","_opt$verbose_name","promptTextCreator","controlState","_datasource$columns$","unshift","commaChoosesOption","dndColumnsControl","dndSeriesControl","dndEntityControl","dndAdhocFilterControl","isDataset","defineSavedMetrics","selectedMetrics","provideFormDataToProps","datePickerInAdhocFilterMixin","dndAdhocMetricsControl","dndAdhocMetricControl","dndAdhocMetricControl2","dndSortByControl","dndSizeControl","dndXControl","dndYControl","dndSecondaryMetricControl","dndGranularitySqlaControl","temporalColumnMixin","canDelete","ghostButtonText","dndXAxisControl","xAxisMixin","getAxisLabel","orientation","_state$form_data","_state$form_data2","x_axis","isTemporal","getTemporalColumns","temporalColumns","defaultTemporalColumn","_state$controls","_state$controls$time_","_state$form_data3","_state$form_data4","flt","clause","expressionType","temporalColumn","_state$common$conf","DEFAULT_TIME_FILTER","NO_TIME_RANGE","SERIES_LIMITS","appContainer","getAttribute","datasourceControl","getColorControlsProps","visibility","displayTimeRelatedControls","maxValue","SQL_MAX_ROW","v","validateMaxValue","order_desc","series_limit","DEFAULT_NUMBER_FORMAT","D3_FORMAT_DOCS","tokenSeparators","option","_state$controls$compa","ComparisonType","Percentage","currency_format","x_axis_time_format","DEFAULT_TIME_FORMAT","D3_TIME_FORMAT_OPTIONS","D3_TIME_FORMAT_DOCS","truncate_metric","show_empty_columns","temporal_columns_lookup","_state$datasource","fromEntries","_option$column_name","sort_by_metric","orderby","series_columns","series_limit_metric","legacy_order_by","isStandardizedFormData","_formData$standardize","_formData$standardize2","standardizedFormData","memorizedFormData","Comparator","MultipleValueComparators","Between","BetweenOrEqual","BetweenOrLeftEqual","BetweenOrRightEqual","isColumnMeta","isSavedExpression","isControlPanelSectionConfig","section","isQueryResponse","D3_NUMBER_FORMAT_DESCRIPTION_VALUES_TEXT","D3_NUMBER_FORMAT_DESCRIPTION_PERCENTAGE_TEXT","d3Formatted","fmt","getNumberFormatter","preview","NumberFormats","SMART_NUMBER","SMART_DATE_ID","_state$slice","_state$form_data5","_state$form_data6","hasDashboardColorScheme","dashboard_color_scheme","hasCustomLabelsColor","mapLabelsColors","DEFAULT_METRICS","xAxis","xAxisValue","isAdhocColumn","isPhysicalColumn","_find","_xAxis$options","expandControlType","controlType","sharedControlComponents","expandControlConfig","controlOverrides","sharedControls","config","isValidElement","override","getStandardizedControls","makeSingleton","constructor","this","setStandardizedControls","shiftMetric","shift","shiftColumn","popAllMetrics","splice","popAllColumns","clear","rv","_rv$temporalColumns$","_rv$temporalColumns$2","_rv$temporalColumns$3","isTemporalColumn","columnName","formatSelectOptionsForRange","start","end","step","ChartBuildQueryRegistry","Registry","super","overwritePolicy","OverwritePolicy","Warn","ChartControlPanelRegistry","ChartMetadataRegistry","Behavior","AppSection","ChartLabel","chartLabelExplanations","Deprecated","Featured","chartLabelWeight","weight","AxisType","CategoricalColorNamespace","forcedItems","scales","getScale","_scheme$colors","scheme","CategoricalColorScale","setColor","forcedColor","stringifyAndTrim","resetColors","resetColorsForLabels","updatedForcedItems","_cloneDeep","namespaces","DEFAULT_NAMESPACE","getNamespace","instance","newInstance","getColor","namespace","ExtensibleFunction","forcedColors","appliedColorScheme","originColors","scale","chartLabelsColorMap","multiple","scaleOrdinal","range","incrementColorRange","floor","domain","newRange","getAnalogousColors","extendedColors","_this$forcedColors","cleanedValue","currentColorMap","LabelsColorMapSource","Dashboard","getColorMap","isExistingLabel","UseAnalagousColors","AvoidColorsCollision","isColorUsed","getNextAvailableColor","addSlice","getColorUsageCount","currentLabel","currentColor","colorUsageCounts","orderedLabels","currentLabelIndex","adjacentColors","getAdjacentLabelsColors","previousLabel","nextLabel","calculateScore","unusedColor","bestColor","bestScore","colorMap","copy","unknown","newDomain","LabelsColorMap","updateColorMap","categoricalNamespace","newColorMap","chartConfig","ownScheme","colorScale","newColor","reset","trim","rgbRegex","getContrastingColor","thresholds","matchColor","exec","hex","startsWith","substring","generatedColors","analogousColors","tinycolor","analogous","_analogousColors","toHexString","addAlpha","opacity","round","toUpperCase","hexToRgb","h","rgbToHex","red","green","blue","htmlSanitization","htmlSchemaOverrides","escapeHtml","EscapeMarkdownHtml","rehypePlugins","useMemo","rehypeRaw","originalSchema","_mergeWith","objValue","srcValue","_isArray","getOverrideHtmlSchema","defaultSchema","rehypeSanitize","ReactMarkdown","remarkPlugins","remarkGfm","skipHtml","transformLinkUri","usePrevious","previous","useRef","truncationCSS","useCSSTextTruncation","isTruncated","setIsTruncated","offsetWidth","setOffsetWidth","setScrollWidth","_ref$current$offsetWi","_ref$current","_ref$current$scrollWi","_ref$current2","initialRecords","records","DatasourceKey","idStr","typeStr","DatasourceType","Query","toObject","WRAP_IN_ARRAY","queryFields","buildQuery","buildQueryObject","post_processing","isXAxisSet","normalizeTimeColumn","sanitizeClause","sanitizedClause","_normalizeSeriesLimit","extra_form_data","since","until","row_offset","custom_params","residualFormData","appendAdhocFilters","appendFilters","custom_form_data","numericRowLimit","numericRowOffset","extractQueryFields","extras","applied_time_extras","extract","reservedColumnsToQueryField","__time_range","__time_col","__time_grain","__granularity","extractExtras","extraFilters","filterFormData","extrasAndfilters","where","simpleWhere","freeformWhere","freeformHaving","isSimpleAdhocFilter","filterClause","convertFilter","having","processFilters","queryObject","normalizeSeriesLimitMetric","isQueryFormMetric","overrideFormData","overriddenFormData","overriddenExtras","EXTRA_FORM_DATA_OVERRIDE_REGULAR_MAPPINGS","EXTRA_FORM_DATA_OVERRIDE_EXTRA_KEYS","overrideExtraFormData","EXTRA_FORM_DATA_APPEND_KEYS","time_column","time_grain","EXTRA_FORM_DATA_OVERRIDE_REGULAR_KEYS","EXTRA_FORM_DATA_OVERRIDE_KEYS","isUnaryAdhocFilter","isBinaryAdhocFilter","aliases","queryFieldAliases","all_columns","order_by_cols","query_mode","queryMode","restFormData","normalizedKey","removeDuplicates","getColumnLabel","getMetricLabel","ERROR_CODE_LOOKUP","checkForHtml","str","isJsonString","isProbablyHTML","parseStringResponse","code","RegExp","getErrorFromStatusCode","retrieveErrorMessage","errorObject","parseErrorJson","responseJson","_error$errors$","_error$errors$$extra","_Object$values$","stack","stacktrace","responseText","TypeError","ErrorTypeEnum","FRONTEND_TIMEOUT_ERROR","level","responseObject","Response","bodyUsed","clone","errorJson","redirected","getErrorText","getClientErrorMessage","finalMessage","isSavedMetric","isAdhocMetricSimple","aggregate","isQueryFormColumn","getXAxisColumn","getXAxisLabel","_columns","_extras","mutatedColumns","axisIdx","timeGrain","columnType","newQueryObject","_omit","RollingType","NativeFilterType","DataMaskType","isAppliedCrossFilterType","filterElement","filterType","isAppliedNativeFilterType","isNativeFilter","NativeFilter","isNativeFilterWithDataMask","_filterElement$dataMa","_filterElement$dataMa2","filterState","isFilterDivider","Divider","isFreeFormAdhocFilter","isUnaryOperator","isBinaryOperator","isSetAdhocFilter","isSetOperator","isAdhocMetricSQL","unaryOperatorSet","binaryOperatorSet","setOperatorSet","FRONTEND_CSRF_ERROR","FRONTEND_NETWORK_ERROR","GENERIC_DB_ENGINE_ERROR","COLUMN_DOES_NOT_EXIST_ERROR","TABLE_DOES_NOT_EXIST_ERROR","SCHEMA_DOES_NOT_EXIST_ERROR","CONNECTION_INVALID_USERNAME_ERROR","CONNECTION_INVALID_PASSWORD_ERROR","CONNECTION_INVALID_HOSTNAME_ERROR","CONNECTION_PORT_CLOSED_ERROR","CONNECTION_INVALID_PORT_ERROR","CONNECTION_HOST_DOWN_ERROR","CONNECTION_ACCESS_DENIED_ERROR","CONNECTION_UNKNOWN_DATABASE_ERROR","CONNECTION_DATABASE_PERMISSIONS_ERROR","CONNECTION_MISSING_PARAMETERS_ERROR","OBJECT_DOES_NOT_EXIST_ERROR","SYNTAX_ERROR","CONNECTION_DATABASE_TIMEOUT","VIZ_GET_DF_ERROR","UNKNOWN_DATASOURCE_TYPE_ERROR","FAILED_FETCHING_DATASOURCE_INFO_ERROR","TABLE_SECURITY_ACCESS_ERROR","DATASOURCE_SECURITY_ACCESS_ERROR","DATABASE_SECURITY_ACCESS_ERROR","QUERY_SECURITY_ACCESS_ERROR","MISSING_OWNERSHIP_ERROR","USER_ACTIVITY_SECURITY_ACCESS_ERROR","DASHBOARD_SECURITY_ACCESS_ERROR","CHART_SECURITY_ACCESS_ERROR","OAUTH2_REDIRECT","OAUTH2_REDIRECT_ERROR","BACKEND_TIMEOUT_ERROR","DATABASE_NOT_FOUND_ERROR","MISSING_TEMPLATE_PARAMS_ERROR","INVALID_TEMPLATE_PARAMS_ERROR","RESULTS_BACKEND_NOT_CONFIGURED_ERROR","DML_NOT_ALLOWED_ERROR","INVALID_CTAS_QUERY_ERROR","INVALID_CVAS_QUERY_ERROR","SQLLAB_TIMEOUT_ERROR","RESULTS_BACKEND_ERROR","ASYNC_WORKERS_ERROR","ADHOC_SUBQUERY_NOT_ALLOWED_ERROR","INVALID_SQL_ERROR","GENERIC_COMMAND_ERROR","GENERIC_BACKEND_ERROR","INVALID_PAYLOAD_FORMAT_ERROR","INVALID_PAYLOAD_SCHEMA_ERROR","MARSHMALLOW_ERROR","REPORT_NOTIFICATION_ERROR","TABLE","VIEW","QueryState","runningQueryStateList","Running","Started","Pending","Fetching","Scheduled","concludedQueryStateList","Stopped","Failed","Success","TimedOut","testQuery","tempSchema","trackingUrl","limitingFactor","endDttm","time","db","started","querylink","executedSql","output","actions","testQueryResults","displayLimitReached","expanded_columns","selected_columns","testQueryResponse","ContributionType","TS_REGEX","normalizeTimestamp","ExtensionsRegistry","TypedRegistry","getExtensionsRegistry","xssFilter","FilterXSS","whiteList","getDefaultWhiteList","img","video","stripIgnoreTag","sanitizeHtml","htmlString","process","hasHtmlTagPattern","cleanedStr","doc","DOMParser","parseFromString","childNodes","nodeType","sanitizeHtmlIfNeeded","safeHtmlSpan","possiblyHtmlString","dangerouslySetInnerHTML","__html","removeHTMLTags","getParagraphContents","pTags","querySelectorAll","paragraphContents","pTag","textContent","func","hash","seen","itemHash","sqlEditorApi","api","injectEndpoints","endpoints","builder","updateSqlEditorTab","mutation","version","LatestQueryEditorVersion","_pickBy","extra_json","updateCurrentSqlEditorTab","transformResponse","deleteSqlEditorTab","useUpdateSqlEditorTabMutation","useUpdateCurrentSqlEditorTabMutation","useDeleteSqlEditorTabMutation","INTERVAL","filterUnsavedQueryEditorList","lastSavedTimestamp","EditorAutoSync","useSelector","editorTabLastUpdatedAt","useDispatch","lastSavedTimestampRef","currentQueryEditorId","lastUpdatedActiveTab","destroyedQueryEditors","updateSqlEditor","updateCurrentSqlEditor","deleteSqlEditor","debouncedUnsavedQueryEditor","useDebounceValue","getUnsavedItems","useEffectEvent","unsavedQE","getUnsavedNewQueryEditor","syncCurrentQueryEditor","_queryEditors$find","syncDeletedQueryEditor","saveTimer","syncTimer","setInterval","saveUnsavedQueryEditor","firstUnsavedQueryEditor","clearQueryEditorTimer","clearInterval","unsaved","resolvers","STATE_TYPE_MAP","failed","pending","fetching","running","stopped","success","STATE_TYPE_MAP_LOCALIZED","STATUS_OPTIONS","STATUS_OPTIONS_LOCALIZED","SQL_EDITOR_GUTTER_HEIGHT","SQL_EDITOR_GUTTER_MARGIN","SQL_TOOLBAR_HEIGHT","SQL_EDITOR_LEFTBAR_WIDTH","SQL_EDITOR_PADDING","INITIAL_NORTH_PERCENT","INITIAL_SOUTH_PERCENT","SET_QUERY_EDITOR_SQL_DEBOUNCE_MS","VALIDATION_DEBOUNCE_MS","WINDOW_RESIZE_THROTTLE_MS","KB_STORAGE","BYTES_PER_CHAR","LOCALSTORAGE_MAX_QUERY_AGE_MS","LOCALSTORAGE_MAX_USAGE_KB","LOCALSTORAGE_MAX_QUERY_RESULTS_KB","LOCALSTORAGE_WARNING_THRESHOLD","LOCALSTORAGE_WARNING_MESSAGE_THROTTLE_MS","SQL_KEYWORD_AUTOCOMPLETE_SCORE","SQL_FUNCTIONS_AUTOCOMPLETE_SCORE","SCHEMA_AUTOCOMPLETE_SCORE","TABLE_AUTOCOMPLETE_SCORE","COLUMN_AUTOCOMPLETE_SCORE","dedupeTabHistory","active_tab","activeTab","tab_state_ids","tabStateIds","queries_","otherBootstrapData","defaultQueryEditor","cursorPosition","_activeTab$extra_json","_activeTab$extra_json2","_activeTab$saved_quer","_activeTab$extra_json3","QueryEditorVersion","V1","_activeTab$extra_json4","persistData","localStorageData","localStorage","getItem","sqlLabCacheData","removeItem","_queryEditors$qe$id","_queryEditors$qe$id2","hasConflictFromBackend","unsavedUpdatedAt","hasUnsavedUpdateSinceLastSave","cachedQueryEditor","expandedTables","merged","activeSouthPaneTab","alerts","queriesLastUpdate","queryCostEstimates","localStorageUsageInKilobytes","DatasetRadioState","EXPLORE_CHART_DEFAULT","PERSISTENT_QUERY_EDITOR_KEYS","shouldEmptyQueryResults","_JSON$stringify","emptyTablePersistData","_pick","emptyQueryResults","accu","clearQueryEditors","editor","accumulator","tableApiUtil","upsertQueryData","Button","buttonSize","buttonStyle","cta","showMarginRight","restProps","transitionTiming","borderRadius","padding","backgroundColor","backgroundColorHover","mix","backgroundColorActive","backgroundColorDisabled","colorHover","borderWidth","borderStyle","borderColor","borderColorHover","borderColorDisabled","light1","renderedChildren","Fragment","Children","toArray","firstChildMargin","button","AntdButton","cx","display","alignItems","justifyContent","textTransform","transition","minHeight","pointerEvents","marginRight","chartAlert","chartStatus","chartStackTrace","chartUpdateEndTime","chartUpdateStartTime","lastRendered","chartReducer","_action$queriesRespon","_action$queriesRespon2","_action$queriesRespon3","_action$queriesRespon4","_state$annotationQuer","annotationQuery","annotationData","annotationError","HYDRATE_EXPLORE","DatasourcesAction","SetDatasources","defaultProps","copyNode","onCopyEnd","shouldShowText","wrapped","hideTooltip","CopyToClipboard","Component","copyToClipboard","getText","getDecoratedCopyNode","cloneElement","textToCopy","copyTextToClipboard","renderTooltip","renderNotWrapped","renderLink","render","withToasts","ErrorAlertDiv","ErrorModal","Modal","LeftSideContent","ErrorAlert","copyText","subtitle","isModalOpen","setIsModalOpen","isBodyExpanded","setIsBodyExpanded","isCurrentUserBot","isExpandable","iconColor","Icons","ErrorSolid","WarningSolid","onKeyDown","show","onHide","destroyOnClose","footer","DEFAULT_TITLE","ErrorMessageWithStackTrace","fallback","ErrorMessageComponent","getErrorMessageComponentRegistry","ErrorMessageComponentRegistry","Allow","SvgTransparent","StyledIcon","AntdIconComponent","iconSize","rest","AntdIcon","m","fileName","iconProps","setLoaded","ImportedSVG","cancelled","importIcon","whatRole","TransparentIcon","AntdIcons","iconOverrides","keyName","_startCase","Icon","AntdEnhancedIcons","LoaderImg","image","cls","alt","src","Loader","ADD_TOAST","addToast","toastType","noDuplicate","REMOVE_TOAST","removeToast","ToastType","Info","Warning","Danger","toastActions","toasters","BaseComponent","connect","bindActionCreators","useToasts","StyledModal","AntdModal","maskTransitionName","responsive","light","resizable","draggable","hideFooter","defaultResizableConfig","maxHeight","MODAL_HEADER_HEIGHT","RESIZABLE_MIN_HEIGHT","enable","bottom","bottomLeft","bottomRight","left","topLeft","topRight","right","CustomModal","disablePrimaryButton","primaryTooltipMessage","primaryButtonLoading","onHandledPrimaryAction","primaryButtonName","primaryButtonType","centered","wrapProps","resizableConfig","draggableConfig","draggableRef","bounds","setBounds","dragDisabled","setDragDisabled","FooterComponent","closeModal","modalFooter","_isNil","loading","modalWidth","shouldShowMask","getResizableConfig","onOk","onCancel","visible","ModalTitle","onMouseOver","onMouseOut","closeIcon","modalRender","modal","Draggable","onStart","uiData","onDragStart","_","_window","_window$document","_draggableRef$current","clientHeight","documentElement","targetRect","getBoundingClientRect","Resizable","mask","displayName","buttonProps","okButtonProps","cancelButtonProps","confirm","useModal","StyledError","StyledErrorMessage","getQueryCacheKey","pageSize","allowClear","allowNewOptions","ariaLabel","autoClearSearchValue","fetchOnlyOnSearch","header","headerPosition","helperText","invertSelection","lazyLoading","notFoundContent","onBlur","onClear","onDropdownVisibleChange","onDeselect","onSearch","onSelect","optionFilterProps","DEFAULT_PAGE_SIZE","showSearch","sortComparator","DEFAULT_SORT_COMPARATOR","TOKEN_SEPARATORS","getPopupContainer","oneLine","maxTagCount","propsMaxTagCount","isSingleMode","selectValue","setSelectValue","inputValue","setInputValue","setIsLoading","setError","isDropdownVisible","setIsDropdownVisible","setPage","totalCount","setTotalCount","loadingEnabled","setLoadingEnabled","allValuesLoaded","setAllValuesLoaded","selectValueRef","fetchedQueries","mappedMode","allowFetch","setMaxTagCount","MAX_TAG_COUNT","onChangeCount","setOnChangeCount","previousChangeCount","fireOnChange","sortSelectedFirst","sortSelectedFirstHelper","sortComparatorWithSearch","sortComparatorWithSearchHelper","sortComparatorForNoSearch","sortComparatorForNoSearchHelper","selectOptions","setSelectOptions","EMPTY_OPTIONS","fullSelectOptions","missingValues","hasOption","getValue","isLabeledValue","internalOnError","mergeData","mergedData","dataValues","prevOptions","previousOption","sort","fetchPage","cachedCount","debouncedFetchPage","_debounce","SLOW_DEBOUNCE","handleOnSearch","searchValue","newOption","isNewOption","cleanSelectOptions","newOptions","FAST_DEBOUNCE","cancel","array","mapOptions","clearCache","useImperativeHandle","getPastedTextValue","getOption","fetchOptions","isObject","shouldRenderChildrenOptions","hasCustomLabels","StyledContainer","StyledHeader","StyledSelect","dropdownRender","originNode","dropDownRenderHelper","handleFilterOption","handleFilterOptionHelper","filterSort","triggerNode","parentNode","labelInValue","handleOnDeselect","sortedOptions","onPaste","pastedText","clipboardData","getData","token","_uniq","onPopupScroll","vScroll","currentTarget","thresholdReached","scrollTop","scrollHeight","offsetHeight","handleOnSelect","selectedItem","valueChanged","utilsIsEqual","previousState","handleClear","showArrow","suffixIcon","getSuffixIcon","menuItemSelectedIcon","StyledStopOutlined","StyledCheckOutlined","tagRender","customTagRender","renderSelectOptions","StyledTag","AntdTag","Tag","tagRef","tagIsTruncated","closable","CustomCloseIcon","SELECT_ALL_VALUE","onMouseDown","tagName","stopPropagation","NoElement","allowSelectAll","shouldShowSearch","Option","AntdSelect","initialOptions","initialOptionsSorted","groupedOptions","group","enabledOptions","selectAllEligible","selectAllEnabled","selectAllMode","selectAllOption","optionsToSelect","selectAllLabel","formatNumber","INTEGER","handleOnChange","newValues","mapValues","omittedCount","actualMaxTagCount","maxTagPlaceholder","customMaxTagPlaceholder","aText","bText","aLower","bLower","searchLower","localeCompare","rankedSearchCompare","shouldForwardProp","prop","light3","StopOutlined","CheckOutlined","StyledSpin","Spin","StyledLoadingText","StyledHelperText","isEqual","checkLabel","propertyComparator","property","sortCallback","SearchOutlined","DownOutlined","optionsLength","errorComponent","_originNode$ref","_originNode$ref$curre","scrollTo","customLabel","isOptObject","optProps","_createElement","CloseOutlined","onDelete","editable","toolTipTitle","tagDisplay","onClose","handleClose","AntdTooltip","overlayInnerStyle","overflow","WebkitLineClamp","WebkitBoxOrient","textOverflow","UiConfigContext","createContext","hideTitle","hideTab","hideNav","hideChartControls","useUiConfig","useContext","EmbeddedUiConfigProvider","uiConfig","embeddedConfig","Provider","DASHBOARD_INFO_UPDATED","newInfo","makeApi","SET_FILTER_BAR_ORIENTATION","SET_CROSS_FILTERS_ENABLED","saveFilterBarOrientation","saveCrossFiltersSetting","setCrossFiltersEnabled","setDatasource","SetDatasource","SET_IN_SCOPE_STATUS_OF_FILTERS","setFilterConfiguration","_getState$nativeFilte","oldFilters","mergedFilterConfig","oldFilter","setDataMaskForFilterConfigComplete","SET_DATA_MASK_FOR_FILTER_CONFIG_FAIL","setInScopeStatusOfFilters","filterScopes","_getState$nativeFilte2","filtersWithScopes","filterId","chartsInScope","tabsInScope","filterWithScope","SET_FOCUSED_NATIVE_FILTER","UNSET_FOCUSED_NATIVE_FILTER","setFocusedNativeFilter","unsetFocusedNativeFilter","SET_HOVERED_NATIVE_FILTER","UNSET_HOVERED_NATIVE_FILTER","setHoveredNativeFilter","unsetHoveredNativeFilter","UPDATE_CASCADE_PARENT_IDS","updateCascadeParentIds","parentIds","FETCH_SLICES_PAGE_SIZE","parseResult","datasource_name","datasource_name_text","datasource_url","changed_on_utc","description_markdown","changed_on_delta_humanized","changed_on_humanized","thumbnail_url","created_by","updateSlices","setSlices","fetchSlices","filter_value","sortColumn","page_size","order_column","order_direction","addSlices","errorResponse","fetchAllSlicesFailed","hasCircularDependency","dependencyMap","trace","dependencies","dependency","validateForm","form","currentFilterId","setCurrentFilterId","formValues","validateFields","_error$errorFields","errorFields","outOfDate","_error$errorFields2","field","filterError","createHandleSave","filterConfigMap","filterIds","removedFilters","saveForm","newFilterConfig","_values$filters","_formInputs$controlVa","_formInputs$requiredF","_formInputs$defaultDa","formInputs","rootPath","excluded","dataset","controlValues","requiredFirst","rf","targets","defaultDataMask","getInitialDataMask","cascadeParentIds","sortMetric","createHandleRemoveItem","setRemovedFilters","setOrderedFilters","setSaveAlertVisible","timerId","completeFilterRemoval","isPending","orderedFilters","REMOVAL_DELAY_SECS","NATIVE_FILTER_PREFIX","NATIVE_FILTER_DIVIDER_PREFIX","generateFilterId","getFilterIds","PLACEHOLDER_DATASOURCE","uid","column_types","column_formats","currency_formats","verbose_map","MAIN_HEADER_HEIGHT","CLOSED_FILTER_BAR_WIDTH","OPEN_FILTER_BAR_WIDTH","OPEN_FILTER_BAR_MAX_WIDTH","FILTER_BAR_HEADER_HEIGHT","BUILDER_SIDEPANEL_WIDTH","EMPTY_CONTAINER_Z_INDEX","DEFAULT_CROSS_FILTER_SCOPING","prevState","_prevState$filters","focusedFilterId","nativeFilterReducer","hoveredFilterId","GLOBAL_SCOPE_POINTER","isCrossFilterScopeGlobal","MenuKeys","NEW_COMPONENT_SOURCE_TYPE","NEW_CHART_ID","NEW_COLUMN_ID","NEW_DIVIDER_ID","NEW_HEADER_ID","NEW_MARKDOWN_ID","NEW_ROW_ID","NEW_TAB_ID","NEW_TABS_ID","NEW_DYNAMIC_COMPONENT","DASHBOARD_ROOT_DEPTH","GRID_BASE_UNIT","GRID_GUTTER_SIZE","GRID_MIN_ROW_UNITS","SMALL_HEADER","LARGE_HEADER","BACKGROUND_WHITE","UNDO_LIMIT","SAVE_TYPE_NEWDASHBOARD","DASHBOARD_POSITION_DATA_LIMIT","IN_COMPONENT_ELEMENT_TYPES","ALL_FILTERS_ROOT","_metadata$global_char","layoutItem","_layoutItem$meta","_behaviors","_getChartMetadataRegi","_charts$chartId","_charts$chartId$form_","_metadata$chart_confi","behaviors","InteractiveChart","crossFilters","reservedQueryParams","urlParamType","querystring","cache","findParentIdWithCache","structure","_lastParent$children","lastParent","ids","_component$children","layoutItems","_layoutItems$find","_layoutItems$find$par","elementId","filterKeySplitter","isUserWithPermissionsAndRoles","_isPlainObject","isUser","isUserAdmin","isUserDashboardOwner","owner","userHasPermission","viewName","permissionName","flat","permissionView","CLEAR_DATA_MASK_STATE","UPDATE_DATA_MASK","SET_DATA_MASK_FOR_FILTER_CONFIG_COMPLETE","clearDataMask","clearDataMaskState","moreProps","otherProps","extraFormData","fillNativeFilters","mergedDataMask","draftDataMask","initialDataMask","currentFilters","_currentFilters$filte","areObjectsEqual","ignoreUndefined","produce","draft","_action$data$dashboar3","_action$data$dashboar4","_action$data$dashboar5","_action$filterConfig","cleanState","_action$data$dashboar","_action$data$dashboar2","SET_DATASOURCE","changeDatasource","newDatasource","prevDatasource","updateFormDataByDatasource","datasourcesActions","saveDataset","UPDATE_FORM_DATA_BY_DATASOURCE","POST_DATASOURCE_STARTED","FETCH_DATASOURCE_SUCCEEDED","fetchDatasourceSucceeded","FETCH_DATASOURCES_STARTED","fetchDatasourcesStarted","FETCH_DATASOURCES_SUCCEEDED","fetchDatasourcesSucceeded","FETCH_FAVE_STAR","SAVE_FAVE_STAR","SET_FIELD_VALUE","setControlValue","SET_EXPLORE_CONTROLS","setExploreControls","SET_FORM_DATA","setFormData","UPDATE_CHART_TITLE","updateChartTitle","SET_SAVE_ACTION","setSaveAction","saveAction","CREATE_NEW_SLICE","createNewSlice","can_add","can_download","can_overwrite","SLICE_UPDATED","sliceUpdated","SET_FORCE_QUERY","setForceQuery","SET_STASH_FORM_DATA","setStashFormData","isHidden","fieldNames","exploreActions","ColorSchemeType","hydrateExplore","_sliceEntities$slices","_initialFormData$grou","fallbackSlice","initialSlice","initialFormData","defaultVizType","_common$conf","include_time","initialDatasource","initialExploreState","initialControls","colorSchemeKey","linearColorSchemeKey","verifyColorScheme","registryDefaultScheme","currentScheme","colorSchemeExists","CATEGORICAL","SEQUENTIAL","exploreState","isDatasourceMetaLoading","triggerRender","controlsTransferred","applyMapStateToPropsToControl","getDatasourceUid","saveModal","dashboards","saveModalAlert","isVisible","ADHOC_FILTER_REGEX","FETCH_DASHBOARDS_SUCCEEDED","fetchDashboardsSucceeded","FETCH_DASHBOARDS_FAILED","fetchDashboardsFailed","SET_SAVE_CHART_MODAL_VISIBILITY","setSaveChartModalVisibility","SAVE_SLICE_FAILED","saveSliceFailed","SAVE_SLICE_SUCCESS","saveSliceSuccess","getSlicePayload","formDataWithNativeFilters","formDataFromSlice","adhocFilters","formDataToHandle","isExtra","extractAdhocFiltersFromFormData","adhocFilterKey","sourceFilters","targetArray","Operators","TemporalRange","hasTemporalRangeFilter","adhocFiltersKeys","filtersKey","_formDataWithNativeFi","typeString","formattedTypeString","charAt","query_context","addToasts","isNewSlice","addedToDashboard","toasts","new","updateSlice","_getState$explore","createSlice","_getState$explore2","createDashboard","dashboardName","getSliceDashboards","OptionContainer","StyledMetricOption","AGGREGATES","AVG","COUNT","COUNT_DISTINCT","MAX","MIN","SUM","AGGREGATES_OPTIONS","Equals","NotEquals","LessThan","LessThanOrEqual","GreaterThan","GreaterThanOrEqual","In","NotIn","Like","CaseInsensitiveLike","IsNotNull","IsNull","LatestPartition","IsTrue","IsFalse","OPERATORS_OPTIONS","HAVING_OPERATORS","CUSTOM_OPERATORS","DISABLE_INPUT_OPERATORS","sqlaAutoGeneratedMetricRegex","TIME_FILTER_MAP","POPOVER_INITIAL_HEIGHT","POPOVER_INITIAL_WIDTH","QUERY_MODE_REQUISITES","datasourceAndVizType","controlSetRows","hidden","sqlaTimeSeries","annotations","tabOverride","NVD3TimeSeries","isInt","getMemoizedSectionsToRender","memoizeOne","sectionOverrides","controlPanelSections","sections","SECTIONS","invalidControls","getSectionsToRender","getMemoizedControlConfig","controlKey","_controlPanelSections","findControlItem","getControlConfig","controlPanelState","processedState","externalValidationErrors","validator","execControlValidator","alteredControl","choiceValues","el","handleMissingChoice","getControlStateFromControlConfig","controlConfig","fieldsetRow","isControlValueCompatibleWithDatasource","savedMetric","_value$column","_value$column2","datasourceWarning","getControlValuesCompatibleWithDatasource","compatibleValues","sharedMetricsKey","sharedColumnsKey","publicControls","StandardizedFormData","sourceFormData","_mfd$slice$0$","sfd","freeze","mfd","getLatestFormData","standardizedControls","serialize","transform","targetVizType","latestFormData","publicFormData","targetControlsState","targetFormData","controlPanel","formDataOverrides","transformed","useTransformedResource","resource","transformFn","Complete","extractInnerResult","responseBody","useApiV1Resource","setResource","cancelRef","fetchResource","useApiResourceFullBody","createApi","reducerPath","tagTypes","baseQuery","supersetClientQuery","urlParams","request","_transformResponse","errorObj","schemaApi","schemas","providesTags","forceRefresh","serializeQueryArgs","queryArgs","useLazySchemasQuery","useSchemasQuery","schemaEndpoints","util","schemaApiUtil","EMPTY_SCHEMAS","useSchemas","onSuccess","skip","fetchData","currentData","isSuccess","isError","refetch","tableApi","schema_name","encodeURIComponent","catalog_name","hasMore","toQueryString","tableExtendedMetadata","useLazyTablesQuery","useTablesQuery","useTableMetadataQuery","useTableExtendedMetadataQuery","tableEndpoints","useTables","isMountedRef","schemaOptions","isFetching","schemaOptionsMap","enabled","handleOnSuccess","isRefetched","handleOnError","requestId","originalArgs","debouncedValue","setDebouncedValue","fn","useEventCallback","LOG_ACTIONS_RENDER_CHART","LOG_ACTIONS_HIDE_BROWSER_TAB","LOG_ACTIONS_MOUNT_DASHBOARD","LOG_ACTIONS_MOUNT_EXPLORER","LOG_ACTIONS_SELECT_DASHBOARD_TAB","LOG_ACTIONS_FORCE_REFRESH_CHART","LOG_ACTIONS_CHANGE_EXPLORE_CONTROLS","LOG_ACTIONS_TOGGLE_EDIT_DASHBOARD","LOG_ACTIONS_FORCE_REFRESH_DASHBOARD","LOG_ACTIONS_PERIODIC_RENDER_DASHBOARD","LOG_ACTIONS_EXPLORE_DASHBOARD_CHART","LOG_ACTIONS_EXPORT_CSV_DASHBOARD_CHART","LOG_ACTIONS_EXPORT_XLSX_DASHBOARD_CHART","LOG_ACTIONS_CHANGE_DASHBOARD_FILTER","LOG_ACTIONS_DATASET_CREATION_EMPTY_CANCELLATION","LOG_ACTIONS_DATASET_CREATION_DATABASE_CANCELLATION","LOG_ACTIONS_DATASET_CREATION_SCHEMA_CANCELLATION","LOG_ACTIONS_DATASET_CREATION_TABLE_CANCELLATION","LOG_ACTIONS_DATASET_CREATION_SUCCESS","LOG_ACTIONS_SPA_NAVIGATION","LOG_ACTIONS_DASHBOARD_DOWNLOAD_AS_IMAGE","LOG_ACTIONS_DASHBOARD_DOWNLOAD_AS_PDF","LOG_ACTIONS_CHART_DOWNLOAD_AS_IMAGE","LOG_ACTIONS_CHART_DOWNLOAD_AS_CSV","LOG_ACTIONS_CHART_DOWNLOAD_AS_CSV_PIVOTED","LOG_ACTIONS_CHART_DOWNLOAD_AS_XLS","LOG_ACTIONS_CHART_DOWNLOAD_AS_JSON","LOG_ACTIONS_SQLLAB_WARN_LOCAL_STORAGE_USAGE","LOG_ACTIONS_DRILL_BY_MODAL_OPENED","LOG_ACTIONS_FURTHER_DRILL_BY","LOG_ACTIONS_DRILL_BY_EDIT_CHART","LOG_ACTIONS_DRILL_BY_BREADCRUMB_CLICKED","LOG_ACTIONS_SQLLAB_MONITOR_LOCAL_STORAGE_USAGE","LOG_ACTIONS_SQLLAB_CREATE_TABLE_AS","LOG_ACTIONS_SQLLAB_CREATE_VIEW_AS","LOG_ACTIONS_SQLLAB_RUN_QUERY","LOG_ACTIONS_SQLLAB_STOP_QUERY","LOG_ACTIONS_SQLLAB_ESTIMATE_QUERY_COST","LOG_ACTIONS_SQLLAB_SAVE_QUERY","LOG_ACTIONS_SQLLAB_COPY_LINK","LOG_ACTIONS_SQLLAB_FORMAT_SQL","LOG_ACTIONS_SQLLAB_DOWNLOAD_CSV","LOG_ACTIONS_SQLLAB_COPY_RESULT_TO_CLIPBOARD","LOG_ACTIONS_SQLLAB_CREATE_CHART","LOG_ACTIONS_SQLLAB_LOAD_TAB_STATE","LOG_EVENT_TYPE_TIMING","timeOriginOffset","markTimeOrigin","performance","LOG_EVENT","eventName","TRANSPORT_POLLING","LOCALSTORAGE_KEY","transport","pollingDelayMs","pollingTimeoutId","listenersByJobId","retriesByJobId","lastReceivedEventId","asyncResponse","jobId","job_id","addListener","asyncEvent","result_url","fetchCachedData","removeListener","fetchEvents","processEvents","events","listener","setLastId","setItem","loadEventsFromApi","eventArgs","last_id","wsConnectTimeout","ws","wsConnectRetries","wsConnect","GLOBAL_ASYNC_QUERIES_WEBSOCKET_URL","WebSocket","addEventListener","log","readyState","close","init","appConfig","GLOBAL_ASYNC_QUERIES_TRANSPORT","GLOBAL_ASYNC_QUERIES_POLLING_DELAY","addToObject","arrKey","newObject","copiedObject","alterInObject","alterInArr","idKey","newArr","arrItem","removeFromArr","getFromArr","arr","addToArr","newObj","extendArr","obj1","obj2","opts","ignoreNull","ignoreFields","_opts$ignoreFields","comp1","comp2","_omitBy","_isUndefined","_isNull","_isEqualWith","val1","val2","currentSharedLabels","allLabels","flatMap","duplicates","counts","allEntries","_getCategoricalScheme","storedLabelsColorMap","customLabelColors","freshColorMap","fullFreshColorMap","every","fresh","shared","colorNameSpace","fullLabelsColor","getSharedLabelsColorMapEntries","refreshLabelsColorMap","applicableColorMapEntries","clipboardItem","ClipboardItem","clipboard","write","writeText","copyTextWithClipboardApi","selection","getSelection","removeAllRanges","createRange","createElement","clip","whiteSpace","appendChild","selectNode","addRange","execCommand","removeChild","removeRange","perm","view","permissions","perm_","view_","_datasource$uid","_datasource$id","_window$navigator","webdriver","urlParam","getUrlParams","excludedParams","append","getUrlParamEntries","urlEntries","getChartUrlParams","excludedUrlParams","RESERVED_CHART_URL_PARAMS","filterBoxFilters","preselectFilters","getDashboardUrlParams","extraExcludedParams","RESERVED_DASHBOARD_URL_PARAMS","getPermalink","getChartPermalink","getDashboardPermalink","anchor","externalUrlRegex","isUrlExternal","parseUrl","queryParts","componentIsResizable","typeToWrapChildLookup","shouldWrapChildInRow","parentType","childType","wrapChildLookup","newEntitiesFromDrop","dragType","dropEntity","dropType","newDropChild","wrapChildInRow","newEntities","rowWrapper","tabChild","nextDropChildren","recursivelyDeleteChildren","componentParentId","componentIndex","nextChildren","_nextParent$children","nextParent","nextEntities","entitiesMap","reordered","list","startIndex","endIndex","removed","reorder","reorderItem","nextWidth","destinationEntity","destinationChildren","newRow","rootComponent","topLevelId","topLevelComponent","draggingTabId","draggingTab","childrenToMove","newEntitiesArray","tabComponent","tabsComponent","topLevelTabs","nextState","undoable","ignoreInitialState","includeAction","logMessageQueue","sizeThreshold","delayThreshold","queue","source_id","sendBeacon","FormData","getGuestToken","lastEventId","store","_dashboardLayout$pres","impressionId","logMetadata","impression_id","event_name","event_type","trigger_event","event_id","visibilityState","target_id","target_name","CLEAR_ENTITY_HELPERS_MAP","sqlLabPersistStateConfig","paths","slicer","subset","unsavedQueryEditors","hasUnsavedActiveTabState","hasUnsavedDeletedQueryEditors","hasFinishedMigrationFromLocalStorage","_CLEAR_ENTITY_HELPERS","_CLEAR_ENTITY_HELPERS2","currentSize","persistedState","persistSqlLabStateEnhancer","persistState","alterUnsavedQueryEditorState","updatedState","silent","noopReducer","USER_LOADED","getMiddleware","getDefaultMiddleware","thunk","logger","middleware","reducers","sqlLabReducer","existing","progenitor","qeIds","newQueries","at","existingTable","xt","newTables","tableIds","completed","cost","newResults","q","_action$results","_action$results$query","_action$results2","_action$results2$quer","_action$results3","_action$results3$quer","_action$results4","_action$results4$quer","_action$results5","_action$results5$quer","STOPPED","alts","_action$queryEditor","mergeUnsavedState","change","changedQuery","_state$queries$id","changedOn","currentState","shallowEqual","cleanedQueries","_query$results","isDatasourceLoading","messageToasts","toast","userReducer","CombinedDatasourceReducers","dashboardDatasources","exploreDatasources","updatedSliceIds","updatedExpandedSlices","newActiveTabs","fullSizeChartId","reports","_report$result","_state$creationMethod","reportObject","reportTypeId","creation_method","newFormData","isDatasourcesLoading","new_form_data","old_metrics_data","new_column_config","column_config","_old_metrics_data$ind","_old_metrics_data$ind2","oldItem","rerenderedControls","rerender","hasErrors","isVizSwitch","currentControlsState","hiddenFormData","restoredField","_action$slice$slice_n","setupStore","disableDebugger","rootReducers","configureStore","preloadedState","reducer","devTools","enhancers","webpackAsyncContext","req","__webpack_require__","module","exports"],"sourceRoot":""}