blob: e1a589acdbf81b013683dd1c3d7decad2c87bb99 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import {
ChartProps,
DataMaskStateWithId,
DatasourceType,
ExtraFormData,
JsonObject,
NativeFilterScope,
NativeFiltersState,
NativeFilterTarget,
} from '@superset-ui/core';
import { GenericDataType } from '@apache-superset/core/api/core';
import { Dataset } from '@superset-ui/chart-controls';
import { chart } from 'src/components/Chart/chartReducer';
import componentTypes from 'src/dashboard/util/componentTypes';
import Database from 'src/types/Database';
import { UrlParamEntries } from 'src/utils/urlUtils';
import { UserWithPermissionsAndRoles } from 'src/types/bootstrapTypes';
import Owner from 'src/types/Owner';
import {
ChartCustomizationItem,
FilterOption,
} from './components/nativeFilters/ChartCustomization/types';
import { GroupByCustomizationsState } from './reducers/groupByCustomizations';
import { ChartState } from '../explore/types';
export type { Dashboard } from 'src/types/Dashboard';
export interface ExtendedNativeFilterScope extends NativeFilterScope {
selectedLayers?: string[];
}
export type ChartReducerInitialState = typeof chart;
// chart query built from initialState
// Ref: https://github.com/apache/superset/blob/dcac860f3e5528ecbc39e58f045c7388adb5c3d0/superset-frontend/src/dashboard/reducers/getInitialState.js#L120
export interface ChartQueryPayload extends Partial<ChartReducerInitialState> {
id: number;
form_data?: ChartProps['rawFormData'];
[key: string]: unknown;
}
/** Chart state of redux */
export type Chart = ChartState & {
form_data: {
viz_type: string;
datasource: string;
color_scheme: string;
slice_id: number;
};
};
export enum FilterBarOrientation {
Vertical = 'VERTICAL',
Horizontal = 'HORIZONTAL',
}
// chart's cross filter scoping can have its custom value or point to the global configuration
export const GLOBAL_SCOPE_POINTER = 'global';
export type GlobalScopePointer = typeof GLOBAL_SCOPE_POINTER;
export type ChartCrossFiltersConfig = {
scope: NativeFilterScope | GlobalScopePointer;
chartsInScope: number[];
};
export type GlobalChartCrossFilterConfig = {
scope: NativeFilterScope;
chartsInScope: number[];
};
export const isCrossFilterScopeGlobal = (
scope: NativeFilterScope | GlobalScopePointer,
): scope is GlobalScopePointer => scope === GLOBAL_SCOPE_POINTER;
export type ChartConfiguration = {
[chartId: number]: {
id: number;
crossFilters: ChartCrossFiltersConfig;
};
};
export type ActiveTabs = string[];
export type DashboardLayout = { [key: string]: LayoutItem };
export type DashboardLayoutState = { present: DashboardLayout };
export type DashboardState = {
preselectNativeFilters?: JsonObject;
editMode: boolean;
isPublished: boolean;
directPathToChild: string[];
activeTabs: ActiveTabs;
fullSizeChartId: number | null;
isRefreshing: boolean;
isFiltersRefreshing: boolean;
hasUnsavedChanges: boolean;
dashboardIsSaving: boolean;
colorScheme: string;
sliceIds: number[];
directPathLastUpdated: number;
nativeFiltersBarOpen?: boolean;
css?: string;
focusedFilterField?: {
chartId: number;
column: string;
};
overwriteConfirmMetadata?: {
updatedAt: string;
updatedBy: string;
overwriteConfirmItems: {
keyPath: string;
oldValue: string;
newValue: string;
}[];
dashboardId: number;
data: JsonObject;
};
chartStates?: Record<string, any>;
};
export type DashboardInfo = {
id: number;
common: {
conf: JsonObject;
};
userId: string;
dash_edit_perm: boolean;
json_metadata: string;
metadata: {
native_filter_configuration: JsonObject;
chart_configuration: ChartConfiguration;
global_chart_configuration: GlobalChartCrossFilterConfig;
color_scheme: string;
color_namespace: string;
color_scheme_domain: string[];
label_colors: JsonObject;
shared_label_colors: string[];
map_label_colors: JsonObject;
cross_filters_enabled: boolean;
chart_customization_config?: ChartCustomizationItem[];
};
crossFiltersEnabled: boolean;
filterBarOrientation: FilterBarOrientation;
created_on_delta_humanized: string;
changed_on_delta_humanized: string;
changed_by?: Owner;
created_by?: Owner;
owners: Owner[];
chartCustomizationData?: { [itemId: string]: FilterOption[] };
chartCustomizationLoading?: { [itemId: string]: boolean };
pendingChartCustomizations?: Record<string, ChartCustomizationItem>;
theme?: {
id: number;
name: string;
} | null;
theme_id?: number | null;
css?: string;
};
export type ChartsState = { [key: string]: Chart };
export type Datasource = Dataset & {
uid: string;
column_types: GenericDataType[];
table_name: string;
database?: Database;
};
export type DatasourcesState = {
[key: string]: Datasource;
};
/** Root state of redux */
export type RootState = {
datasources: DatasourcesState;
sliceEntities: JsonObject;
charts: ChartsState;
dashboardLayout: DashboardLayoutState;
dashboardFilters: {};
dashboardState: DashboardState;
dashboardInfo: DashboardInfo;
dataMask: DataMaskStateWithId;
impressionId: string;
nativeFilters: NativeFiltersState;
groupByCustomizations: GroupByCustomizationsState;
user: UserWithPermissionsAndRoles;
};
/** State of dashboardLayout in redux */
export type Layout = { [key: string]: LayoutItem };
/** State of charts in redux */
export type Charts = { [key: number]: Chart };
type ComponentTypesKeys = keyof typeof componentTypes;
export type ComponentType = (typeof componentTypes)[ComponentTypesKeys];
export type LayoutItemMeta = {
chartId: number;
defaultText?: string;
height: number;
placeholder?: string;
sliceName?: string;
sliceNameOverride?: string;
text?: string;
uuid: string;
width: number;
};
/** State of dashboardLayout item in redux */
export type LayoutItem = {
children: string[];
parents?: string[];
type: ComponentType;
id: string;
meta: LayoutItemMeta;
};
type ActiveFilter = {
filterType?: string;
targets: number[] | [Partial<NativeFilterTarget>];
scope: number[];
values: ExtraFormData;
layerScope?: {
[chartId: number]: number[];
};
};
export type ActiveFilters = {
[key: string]: ActiveFilter;
};
export interface DashboardPermalinkState {
dataMask: DataMaskStateWithId;
activeTabs: string[];
anchor: string;
urlParams?: UrlParamEntries;
chartStates?: Record<string, any>;
}
export interface DashboardPermalinkValue {
dashboardId: string;
state: DashboardPermalinkState;
}
export type EmbeddedDashboard = {
uuid: string;
dashboard_id: string;
allowed_domains: string[];
};
export type Slice = {
slice_id: number;
slice_name: string;
description: string;
description_markdown: string;
form_data: any;
slice_url: string;
viz_type: string;
thumbnail_url: string;
changed_on: number;
changed_on_humanized: string;
modified: string;
datasource_id: number;
datasource_type: DatasourceType;
datasource_url: string;
datasource_name: string;
owners: { id: number }[];
created_by: { id: number };
};
export enum MenuKeys {
DownloadAsImage = 'download_as_image',
ExploreChart = 'explore_chart',
ExportCsv = 'export_csv',
ExportPivotCsv = 'export_pivot_csv',
ExportFullCsv = 'export_full_csv',
ExportXlsx = 'export_xlsx',
ExportFullXlsx = 'export_full_xlsx',
ForceRefresh = 'force_refresh',
Fullscreen = 'fullscreen',
ToggleChartDescription = 'toggle_chart_description',
ViewQuery = 'view_query',
ViewResults = 'view_results',
DrillToDetail = 'drill_to_detail',
CrossFilterScoping = 'cross_filter_scoping',
Share = 'share',
ShareByEmail = 'share_by_email',
CopyLink = 'copy_link',
Download = 'download',
SaveModal = 'save_modal',
RefreshDashboard = 'refresh_dashboard',
AutorefreshModal = 'autorefresh_modal',
SetFilterMapping = 'set_filter_mapping',
EditProperties = 'edit_properties',
EditCss = 'edit_css',
ToggleFullscreen = 'toggle_fullscreen',
ManageEmbedded = 'manage_embedded',
ManageEmailReports = 'manage_email_reports',
ExportPivotXlsx = 'export_pivot_xlsx',
EmbedCode = 'embed_code',
}