123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- /*
- * <<
- * Davinci
- * ==
- * Copyright (C) 2016 - 2017 EDP
- * ==
- * Licensed 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 React, { useMemo } from 'react'
- import { Menu, Icon } from 'antd'
- import { getPivot } from 'containers/Widget/components/util'
- import { DrillType, WidgetDimension, IDataDrillProps } from './types'
- import { getListsByViewModelTypes } from 'containers/View/util'
- import { ViewModelTypes } from 'containers/View/constants'
- const styles = require('./datadrill.less')
- const DataDrill: React.FC<IDataDrillProps> = (props: IDataDrillProps) => {
- const {
- onDataDrillUp,
- onDataDrillDown,
- onDataDrillPath,
- currentData,
- drillHistory,
- widgetConfig,
- drillpathSetting
- } = props
- let renderComponent = void 0
- let menuDisabled = void 0
- const getCategoriesModels = useMemo(() => {
- return getListsByViewModelTypes(
- widgetConfig && widgetConfig.model,
- 'modelType'
- )(ViewModelTypes.Category)
- }, [widgetConfig])
- const widgetMode = useMemo(() => {
- return widgetConfig && widgetConfig.mode
- }, [widgetConfig])
- const currentCategories = useMemo(() => {
- return currentData && currentData[0] ? Object.keys(currentData[0]) : []
- }, [currentData])
- const drillHistoryGroups = useMemo(() => {
- if (drillHistory && drillHistory.length) {
- return drillHistory[drillHistory.length - 1]['groups']
- }
- }, [drillHistory])
- const getDrilledGroup = useMemo(() => {
- return drillHistory && drillHistory.length
- ? drillHistory.map((history) => history.currentGroup)
- : []
- }, [drillHistory])
- const modelsfilterDrilledGroup = useMemo(() => {
- return getCategoriesModels.filter((cate) => !getDrilledGroup.includes(cate))
- }, [drillHistory, widgetConfig, getCategoriesModels, getDrilledGroup])
- const { drilldownCategories, drillupCategories } = useMemo(() => {
- return {
- drillupCategories: modelsfilterDrilledGroup
- .filter((cate) => currentCategories.includes(cate))
- .map((c) => ({
- name: c,
- modelType: ViewModelTypes.Category,
- drillType: DrillType.UP
- })),
- drilldownCategories: modelsfilterDrilledGroup
- .filter((cate) => !currentCategories.includes(cate))
- .map((c) => ({
- name: c,
- modelType: ViewModelTypes.Category,
- drillType: DrillType.DOWN
- }))
- }
- }, [widgetConfig, currentData, currentCategories])
- const drillOtherCategories = useMemo(() => {
- return drillHistoryGroups && drillHistoryGroups.length
- ? modelsfilterDrilledGroup
- .filter((cate) => !drillHistory.some((his) => his.currentGroup === cate))
- .map((name) => ({
- name,
- modelType: ViewModelTypes.Category,
- drillType: drillHistoryGroups.includes(name)
- ? DrillType.UP
- : DrillType.DOWN
- }))
- : drilldownCategories
- }, [drillHistory])
- const isPivot = useMemo(() => widgetMode === 'pivot', [widgetMode])
- const isPivotTableVal = useMemo(() => isPivotTable(widgetConfig.metrics), [
- widgetConfig
- ])
- if (drillpathSetting && drillpathSetting.length) {
- if (drillHistory && drillHistory.length) {
- menuDisabled = drillHistory.length === drillpathSetting.length - 1
- }
- renderComponent = (
- <Menu onClick={drillpath} style={{ width: 120 }} mode="vertical">
- <Menu.Item key="drillpath" disabled={menuDisabled}>
- <span
- style={{ fontSize: '14px' }}
- className="iconfont icon-iconxiazuan"
- >
- <span style={{ marginLeft: '8px' }}>下钻</span>
- </span>
- </Menu.Item>
- </Menu>
- )
- } else {
- renderComponent = (
- <Menu onClick={drill} style={{ width: 120 }} mode="vertical">
- {isPivot ? (
- <Menu.SubMenu
- key={`${DrillType.UP}`}
- disabled={drillupCategories.length < 2}
- title={
- <span
- style={{ fontSize: '14px' }}
- className="iconfont icon-iconxiazuan1"
- >
- <span style={{ marginLeft: '8px' }}>上卷</span>
- </span>
- }
- >
- {drillupCategories
- ? drillupCategories.map((col) => (
- <Menu.Item key={col.name}>{col.name}</Menu.Item>
- ))
- : ''}
- </Menu.SubMenu>
- ) : (
- <Menu.SubMenu
- key="drillAll"
- disabled={drillOtherCategories.length < 1}
- title={
- <span
- style={{ fontSize: '14px' }}
- className="iconfont icon-iconxiazuan"
- >
- <span style={{ marginLeft: '8px' }}>钻取</span>
- </span>
- }
- >
- {drillOtherCategories
- ? drillOtherCategories.map((col) => (
- <Menu.Item key={`${col.name}|${col.drillType}`}>
- <span className={styles.items}>
- <span>{col.name}</span>
- <span>
- <Icon
- type={`${
- col.drillType === DrillType.UP
- ? 'arrow-up'
- : 'arrow-down'
- }`}
- />
- </span>
- </span>
- </Menu.Item>
- ))
- : ''}
- </Menu.SubMenu>
- )}
- {isPivot ? (
- <Menu.SubMenu
- key={`${DrillType.DOWN}`}
- disabled={drilldownCategories.length < 1}
- title={
- <span
- style={{ fontSize: '14px' }}
- className="iconfont icon-iconxiazuan"
- >
- <span style={{ marginLeft: '8px' }}>下钻</span>
- </span>
- }
- >
- {drilldownCategories
- ? drilldownCategories.map((col) =>
- isPivotTableVal ? (
- <Menu.SubMenu key={col.name} title={col.name}>
- <Menu.Item key="row">行</Menu.Item>
- <Menu.Item key="col">列</Menu.Item>
- </Menu.SubMenu>
- ) : (
- <Menu.Item key={col.name}>{col.name}</Menu.Item>
- )
- )
- : ''}
- </Menu.SubMenu>
- ) : (
- ''
- )}
- </Menu>
- )
- }
- return renderComponent
- function drill(e) {
- const path = e.keyPath
- if (path && path.length > 2) {
- onDataDrillDown(path[1], path[0])
- } else {
- switch (path[1]) {
- case DrillType.UP:
- onDataDrillUp(path[0])
- break
- case 'drillAll':
- const type = path[0].split('|')
- if (type) {
- if (type[1] === DrillType.UP) {
- onDataDrillUp(type[0])
- } else if (type[1] === DrillType.DOWN) {
- onDataDrillDown(type[0])
- }
- }
- break
- default:
- break
- }
- }
- }
- function drillpath() {
- onDataDrillPath()
- }
- function isPivotTable(selectedCharts) {
- const pivotChart = getPivot()
- const result =
- Array.isArray(selectedCharts) &&
- selectedCharts.every((sc) => sc.chart.id === pivotChart.id)
- return !isPivot ? false : result
- }
- }
- export default DataDrill
|