superset state 源码
superset state 代码
文件路径:/superset-frontend/src/dashboard/components/nativeFilters/state.ts
/**
* 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 { useSelector } from 'react-redux';
import { useMemo } from 'react';
import {
Filter,
FilterConfiguration,
Divider,
isFilterDivider,
} from '@superset-ui/core';
import { ActiveTabs, DashboardLayout, RootState } from '../../types';
import { TAB_TYPE } from '../../util/componentTypes';
const defaultFilterConfiguration: Filter[] = [];
export function useFilterConfiguration() {
return useSelector<any, FilterConfiguration>(
state =>
state.dashboardInfo?.metadata?.native_filter_configuration ||
defaultFilterConfiguration,
);
}
/**
* returns the dashboard's filter configuration,
* converted into a map of id -> filter
*/
export function useFilterConfigMap() {
const filterConfig = useFilterConfiguration();
return useMemo(
() =>
filterConfig.reduce(
(acc: Record<string, Filter | Divider>, filter: Filter) => {
acc[filter.id] = filter;
return acc;
},
{} as Record<string, Filter | Divider>,
),
[filterConfig],
);
}
export function useDashboardLayout() {
return useSelector<any, DashboardLayout>(
state => state.dashboardLayout?.present,
);
}
export function useDashboardHasTabs() {
const dashboardLayout = useDashboardLayout();
return useMemo(
() =>
Object.values(dashboardLayout).some(element => element.type === TAB_TYPE),
[dashboardLayout],
);
}
function useActiveDashboardTabs() {
return useSelector<RootState, ActiveTabs>(
state => state.dashboardState?.activeTabs,
);
}
function useSelectChartTabParents() {
const dashboardLayout = useDashboardLayout();
return (chartId: number) => {
const chartLayoutItem = Object.values(dashboardLayout).find(
layoutItem => layoutItem.meta?.chartId === chartId,
);
return chartLayoutItem?.parents.filter(
(parent: string) => dashboardLayout[parent].type === TAB_TYPE,
);
};
}
function useIsFilterInScope() {
const activeTabs = useActiveDashboardTabs();
const selectChartTabParents = useSelectChartTabParents();
// Filter is in scope if any of it's charts is visible.
// Chart is visible if it's placed in an active tab tree or if it's not attached to any tab.
// Chart is in an active tab tree if all of it's ancestors of type TAB are active
// Dividers are always in scope
return (filter: Filter | Divider) =>
isFilterDivider(filter) ||
('chartsInScope' in filter &&
filter.chartsInScope?.some((chartId: number) => {
const tabParents = selectChartTabParents(chartId);
return (
tabParents?.length === 0 ||
tabParents?.every(tab => activeTabs.includes(tab))
);
}));
}
export function useSelectFiltersInScope(filters: (Filter | Divider)[]) {
const dashboardHasTabs = useDashboardHasTabs();
const isFilterInScope = useIsFilterInScope();
return useMemo(() => {
let filtersInScope: (Filter | Divider)[] = [];
const filtersOutOfScope: (Filter | Divider)[] = [];
// we check native filters scopes only on dashboards with tabs
if (!dashboardHasTabs) {
filtersInScope = filters;
} else {
filters.forEach(filter => {
const filterInScope = isFilterInScope(filter);
if (filterInScope) {
filtersInScope.push(filter);
} else {
filtersOutOfScope.push(filter);
}
});
}
return [filtersInScope, filtersOutOfScope];
}, [filters, dashboardHasTabs, isFilterInScope]);
}
相关信息
相关文章
0
赞
热门推荐
-
2、 - 优质文章
-
3、 gate.io
-
7、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦