123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- /*
- * <<
- * 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 from 'react'
- import { Button, Modal } from 'antd'
- import { SQL_NUMBER_TYPES, DEFAULT_SPLITER } from 'app/globalConstants'
- import { decodeMetricName, getAggregatorLocale } from 'containers/Widget/components/util'
- import { IFormedViews } from 'containers/View/types'
- import { IWidgetConfig } from 'containers/Widget/components/Widget'
- import LinkageConfig from 'components/Linkages/LinkageConfig'
- const styles = require('../Dashboard.less')
- interface IDashboardLinkageConfigProps {
- currentDashboard: any
- currentItems: any[]
- currentItemsInfo: any
- linkages: any[]
- views: IFormedViews
- widgets: any[]
- visible: boolean
- loading: boolean
- onCancel: () => void
- onSave: (filterItems: any[]) => void
- onGetWidgetInfo: (itemId: number) => void
- }
- interface IDashboardLinkageConfigStates {
- linkageCascaderSource: any[]
- savingLinkageConfig: boolean
- }
- export class DashboardLinkageConfig extends React.Component<IDashboardLinkageConfigProps, IDashboardLinkageConfigStates> {
- public constructor (props: IDashboardLinkageConfigProps) {
- super(props)
- this.state = {
- linkageCascaderSource: [],
- savingLinkageConfig: false
- }
- }
- public componentWillReceiveProps (nextProps: IDashboardLinkageConfigProps) {
- const { visible } = nextProps
- if (visible) {
- const linkageCascaderSource = this.getLinkageConfigSource()
- this.setState({ linkageCascaderSource })
- }
- }
- private getLinkageConfigSource = () => {
- const { currentItems, widgets, views, currentItemsInfo } = this.props
- if (!currentItemsInfo) { return [] }
- const linkageConfigSource = []
- Object.keys(currentItemsInfo).forEach((infoKey) => {
- const dashboardItem = currentItems.find((ci) => `${ci.id}` === infoKey)
- const widget = widgets.find((w) => w.id === dashboardItem.widgetId)
- const { cols, rows, metrics, color, label } = widget.config
- const view = views[widget.viewId]
- const { model, variable } = view
- let triggerDimensions = [...cols, ...rows].map(({ name }) => name)
- if (color) {
- triggerDimensions = triggerDimensions.concat(color.items.map(({ name }) => name))
- }
- if (label) {
- triggerDimensions = triggerDimensions.concat(label.items.map(({ name }) => name))
- }
- const triggerColumns = [
- ...[...new Set(triggerDimensions)]
- .filter((name) => model[name])
- .map((name) => {
- return {
- label: name,
- value: [name, model[name].sqlType, 'column'].join(DEFAULT_SPLITER)
- }
- }),
- ...metrics.map(({ name, agg }) => {
- const metricName = decodeMetricName(name)
- return {
- label: `${getAggregatorLocale(agg)} ${metricName}`,
- value: [`${agg}(${metricName})`, SQL_NUMBER_TYPES[SQL_NUMBER_TYPES.length - 1], 'column'].join(DEFAULT_SPLITER)
- }
- })
- ]
- const linkagerColumns = Object.entries(model)
- .map(([name, value]) => ({
- label: name,
- value: [name, value.sqlType, 'column'].join(DEFAULT_SPLITER)
- }))
- const variables = variable.map(({ name }) => {
- return {
- label: `${name}[变量]`,
- value: [name, null, 'variable'].join(DEFAULT_SPLITER)
- }
- })
- linkageConfigSource.push({
- label: widget.name,
- value: infoKey,
- children: {
- triggerColumns,
- linkagerColumns,
- variables
- }
- })
- })
- return linkageConfigSource
- }
- private onSavingLinkageConfig = () => {
- this.setState({
- savingLinkageConfig: !this.state.savingLinkageConfig
- })
- }
- public render () {
- const { visible, loading, onSave, onGetWidgetInfo, linkages, onCancel } = this.props
- const { linkageCascaderSource, savingLinkageConfig } = this.state
- const modalButtons = [(
- <Button
- key="cancel"
- size="large"
- onClick={onCancel}
- >
- 取 消
- </Button>
- ), (
- <Button
- key="submit"
- size="large"
- type="primary"
- loading={loading}
- disabled={loading}
- onClick={this.onSavingLinkageConfig}
- >
- 保 存
- </Button>
- )]
- return (
- <Modal
- title="联动关系配置"
- wrapClassName="ant-modal-large"
- maskClosable={false}
- visible={visible}
- onCancel={onCancel}
- footer={modalButtons}
- >
- <div className={styles.modalLinkageConfig}>
- <LinkageConfig
- linkages={linkages}
- cascaderSource={linkageCascaderSource}
- onGetWidgetInfo={onGetWidgetInfo}
- saving={savingLinkageConfig}
- onSave={onSave}
- />
- </div>
- </Modal>
- )
- }
- }
- export default DashboardLinkageConfig
|