This is an automated email from the ASF dual-hosted git repository. graceguo pushed a commit to branch gg-Test-Scoped-Filters in repository https://gitbox.apache.org/repos/asf/incubator-superset.git
commit 83a6c5f3e1e6e4217418a536d1cc70a13925ff15 Author: Grace <[email protected]> AuthorDate: Tue Oct 22 22:09:23 2019 -0700 remove changes that should be another PR --- .../util/getFilterScopeFromNodesTree_spec.js | 216 --------------------- .../dashboard/util/getFilterScopeFromNodesTree.js | 146 -------------- 2 files changed, 362 deletions(-) diff --git a/superset/assets/spec/javascripts/dashboard/util/getFilterScopeFromNodesTree_spec.js b/superset/assets/spec/javascripts/dashboard/util/getFilterScopeFromNodesTree_spec.js deleted file mode 100644 index 067e193..0000000 --- a/superset/assets/spec/javascripts/dashboard/util/getFilterScopeFromNodesTree_spec.js +++ /dev/null @@ -1,216 +0,0 @@ -/** - * 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 getFilterScopeFromNodesTree from '../../../../src/dashboard/util/getFilterScopeFromNodesTree'; - -describe('getFilterScopeFromNodesTree', () => { - it('should return empty scope', () => { - const nodes = []; - expect( - getFilterScopeFromNodesTree({ - filterKey: '107_region', - nodes, - checkedChartIds: [], - }), - ).toEqual({}); - }); - - it('should return scope for simple grid', () => { - const nodes = [ - { - label: 'All dashboard', - type: 'ROOT', - value: 'ROOT_ID', - children: [ - { - value: 104, - label: 'Life Expectancy VS Rural %', - type: 'CHART', - }, - { value: 105, label: 'Rural Breakdown', type: 'CHART' }, - { - value: 106, - label: "World's Pop Growth", - type: 'CHART', - }, - { - label: 'Time Filter', - showCheckbox: false, - type: 'CHART', - value: 108, - }, - ], - }, - ]; - const checkedChartIds = [104, 106]; - expect( - getFilterScopeFromNodesTree({ - filterKey: '108___time_range', - nodes, - checkedChartIds, - }), - ).toEqual({ - scope: ['ROOT_ID'], - immune: [105], - }); - }); - - describe('should return scope for tabbed dashboard', () => { - const nodes = [ - { - label: 'All dashboard', - type: 'ROOT', - value: 'ROOT_ID', - children: [ - { - label: 'Tab 1', - type: 'TAB', - value: 'TAB-Rb5aaqKWgG', - children: [ - { - label: 'Geo Filters', - showCheckbox: false, - type: 'CHART', - value: 107, - }, - { - label: "World's Pop Growth", - showCheckbox: true, - type: 'CHART', - value: 106, - }, - ], - }, - { - label: 'Tab 2', - type: 'TAB', - value: 'TAB-w5Fp904Rs', - children: [ - { - label: 'Time Filter', - showCheckbox: true, - type: 'CHART', - value: 108, - }, - { - label: 'Life Expectancy VS Rural %', - showCheckbox: true, - type: 'CHART', - value: 104, - }, - { - label: 'Row Tab 1', - type: 'TAB', - value: 'TAB-E4mJaZ-uQM', - children: [ - { - value: 105, - label: 'Rural Breakdown', - type: 'CHART', - showCheckbox: true, - }, - { - value: 103, - label: '% Rural', - type: 'CHART', - showCheckbox: true, - }, - ], - }, - { - value: 'TAB-rLYu-Cryu', - label: 'New Tab', - type: 'TAB', - children: [ - { - value: 102, - label: 'Most Populated Countries', - type: 'CHART', - showCheckbox: true, - }, - { - value: 101, - label: "World's Population", - type: 'CHART', - showCheckbox: true, - }, - ], - }, - ], - }, - ], - }, - ]; - - it('root level tab scope', () => { - const checkedChartIds = [106]; - expect( - getFilterScopeFromNodesTree({ - filterKey: '107_region', - nodes, - checkedChartIds, - }), - ).toEqual({ - scope: ['TAB-Rb5aaqKWgG'], - immune: [], - }); - }); - - it('global scope', () => { - const checkedChartIds = [106, 104, 101, 102, 103, 105]; - expect( - getFilterScopeFromNodesTree({ - filterKey: '107_country_name', - nodes, - checkedChartIds, - }), - ).toEqual({ - scope: ['ROOT_ID'], - immune: [108], - }); - }); - - it('row level tab scope', () => { - const checkedChartIds = [103, 105]; - expect( - getFilterScopeFromNodesTree({ - filterKey: '108___time_range', - nodes, - checkedChartIds, - }), - ).toEqual({ - scope: ['TAB-E4mJaZ-uQM'], - immune: [], - }); - }); - - it('mixed row level and root level scope', () => { - const checkedChartIds = [103, 105, 106]; - expect( - getFilterScopeFromNodesTree({ - filterKey: '107_region', - nodes, - checkedChartIds, - }), - ).toEqual({ - scope: ['TAB-Rb5aaqKWgG', 'TAB-E4mJaZ-uQM'], - immune: [], - }); - }); - }); -}); diff --git a/superset/assets/src/dashboard/util/getFilterScopeFromNodesTree.js b/superset/assets/src/dashboard/util/getFilterScopeFromNodesTree.js deleted file mode 100644 index d45e22b..0000000 --- a/superset/assets/src/dashboard/util/getFilterScopeFromNodesTree.js +++ /dev/null @@ -1,146 +0,0 @@ -/** - * 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 { isEmpty } from 'lodash'; -import { CHART_TYPE, TAB_TYPE } from './componentTypes'; -import { getDashboardFilterByKey } from './getDashboardFilterKey'; - -// filterKey: '107_region', -// nodes: [ -// { value, label, children: -// [ -// { value1, label1, children1 }, -// { value2, label2, children2 }, -// ] -// }, -// ], -// checkedIds: [101] -// -// output { -// { scope: [tab1, tab2], immune: [chart1, chart2] } -// } -export default function getFilterScopeFromNodesTree({ - filterKey, - nodes = [], - checkedChartIds = [], -}) { - function getTabChildrenScope({ - tabScopes, - parentNodeValue, - forceAggregate = false, - }) { - // if all sub-tabs are in scope, or forceAggregate = true - // aggregate scope to parentNodeValue - if ( - forceAggregate || - Object.entries(tabScopes).every( - ([key, { scope }]) => scope.length && key === scope[0], - ) - ) { - return { - scope: [parentNodeValue], - immune: [].concat( - ...Object.values(tabScopes).map(({ immune }) => immune), - ), - }; - } - - const componentsInScope = Object.values(tabScopes).filter( - ({ scope }) => scope && scope.length, - ); - const scopeValue = [].concat( - ...componentsInScope.map(({ scope }) => scope), - ); - const immuneValue = [].concat( - ...componentsInScope.map(({ immune }) => immune), - ); - - return { - scope: scopeValue, - immune: immuneValue, - }; - } - - function traverse({ currentNode, filterId }) { - if (!currentNode) { - return {}; - } - - const { value: currentValue, children } = currentNode; - const chartChildren = children.filter(({ type }) => type === CHART_TYPE); - const tabChildren = children.filter(({ type }) => type === TAB_TYPE); - - const chartsImmune = chartChildren - .filter( - ({ value }) => filterId !== value && !checkedChartIds.includes(value), - ) - .map(({ value }) => value); - const tabScopes = tabChildren.reduce((map, child) => { - const { value: tabValue } = child; - return { - ...map, - [tabValue]: traverse({ - currentNode: child, - filterId, - }), - }; - }, {}); - - // if any chart type child is in scope, - // no matter has tab children or not, current node should be scope - if ( - !isEmpty(chartChildren) && - chartChildren.some(({ value }) => checkedChartIds.includes(value)) - ) { - if (isEmpty(tabChildren)) { - return { scope: [currentValue], immune: chartsImmune }; - } - - const { scope, immune } = getTabChildrenScope({ - tabScopes, - parentNodeValue: currentValue, - forceAggregate: true, - }); - return { - scope, - immune: chartsImmune.concat(immune), - }; - } - - // has tab children but only some sub-tab in scope - if (!isEmpty(tabChildren)) { - return getTabChildrenScope({ tabScopes, parentNodeValue: currentValue }); - } - - // no tab children and no chart children in scope - return { - scope: [], - immune: chartsImmune, - }; - } - - const [chartId] = getDashboardFilterByKey(filterKey); - if (nodes && nodes.length) { - return traverse({ - currentNode: nodes[0], - filterId: chartId, - }); - } - - return {}; -}
