123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602 |
- /*
- * <<
- * 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 omit from 'lodash/omit'
- import {
- getPreciseDefaultValue,
- getFilterParams,
- getVariableParams,
- getCustomOptionVariableParams
- } from 'app/components/Control/util'
- import { FieldSortTypes } from '../Widget/components/Config/Sort'
- import { decodeMetricName } from '../Widget/components/util'
- import {
- IDashboardItemInfo,
- IQueryConditions,
- IDataRequestParams,
- IDataRequestBody,
- IDashboardItem
- } from './types'
- import { IWidgetFormed } from '../Widget/types'
- import ChartTypes from '../Widget/config/chart/ChartTypes'
- import {
- IControl,
- IGlobalControlConditionsByItem,
- ILocalControlConditions,
- IGlobalControlConditions
- } from 'app/components/Control/types'
- import {
- ControlPanelTypes,
- ControlFieldTypes
- } from 'app/components/Control/constants'
- import {
- IFormedViews,
- IShareFormedViews,
- IViewQueryResponse
- } from '../View/types'
- import { IPaginationParams } from '../Widget/components/Widget'
- export function getInitialPagination(widget: IWidgetFormed): IPaginationParams {
- const { mode, selectedChart, chartStyles } = widget.config
- if (mode === 'chart' && selectedChart === ChartTypes.Table) {
- const { withPaging, pageSize } = chartStyles.table
- return {
- withPaging,
- pageSize: withPaging ? Number(pageSize) : 0,
- pageNo: withPaging ? 1 : 0,
- totalCount: 0
- }
- } else {
- return null
- }
- }
- export function getInitialNativeQuery(widget: IWidgetFormed): boolean {
- const { mode, selectedChart, chartStyles } = widget.config
- if (mode === 'chart' && selectedChart === ChartTypes.Table) {
- return chartStyles.table.withNoAggregators
- } else {
- return false
- }
- }
- export function getInitialPaginationAndNativeQuery(widget: IWidgetFormed) {
- return {
- pagination: getInitialPagination(widget),
- nativeQuery: getInitialNativeQuery(widget)
- }
- }
- export function getUpdatedPagination(
- pagination: IPaginationParams,
- result: IViewQueryResponse
- ): IPaginationParams {
- if (!pagination) {
- return pagination
- }
- const { pageNo, pageSize, totalCount } = result
- return {
- ...pagination,
- pageNo: pagination.withPaging ? pageNo : 0,
- pageSize: pagination.withPaging ? pageSize : 0,
- totalCount
- }
- }
- export function getInitialItemInfo(
- widget: IWidgetFormed,
- formedViews: IFormedViews
- ): IDashboardItemInfo {
- return {
- datasource: {
- columns: [],
- pageNo: 0,
- pageSize: 0,
- totalCount: 0,
- resultList: []
- },
- loading: false,
- queryConditions: {
- linkageFilters: [],
- globalFilters: [],
- linkageVariables: [],
- globalVariables: [],
- drillpathInstance: [],
- ...getLocalControlInitialValues(widget.config.controls, formedViews),
- ...getInitialPaginationAndNativeQuery(widget)
- },
- shareToken: '',
- shareLoading: false,
- authorizedShareToken: '',
- downloadCsvLoading: false,
- interactId: '',
- rendered: false,
- renderType: 'rerender',
- selectedItems: [],
- errorMessage: ''
- }
- }
- interface IGlobalControlInitialValues {
- [itemId: string]: IGlobalControlConditions
- }
- export function getGlobalControlInitialValues(
- controls: IControl[],
- formedViews: IFormedViews | IShareFormedViews
- ): IGlobalControlInitialValues {
- const initialValues: IGlobalControlInitialValues = {}
- controls.forEach((control: IControl) => {
- const { optionWithVariable, relatedItems, relatedViews } = control
- const defaultValue = getPreciseDefaultValue(control)
- if (defaultValue) {
- Object.entries(relatedItems).forEach(([itemId, config]) => {
- Object.entries(relatedViews).forEach(([viewId, relatedView]) => {
- if (
- config.checked &&
- config.viewId === Number(viewId) &&
- formedViews[viewId]
- ) {
- const { model, variable } = formedViews[viewId]
- if (!initialValues[itemId]) {
- initialValues[itemId] = {
- globalFilters: [],
- globalVariables: []
- }
- }
- if (optionWithVariable) {
- const filterValue = getCustomOptionVariableParams(
- control,
- Number(viewId),
- defaultValue,
- variable
- )
- initialValues[itemId].globalVariables = initialValues[
- itemId
- ].globalVariables.concat(filterValue)
- } else {
- if (relatedView.fieldType === ControlFieldTypes.Column) {
- const filterValue = getFilterParams(
- control,
- relatedView.fields,
- defaultValue,
- model
- )
- initialValues[itemId].globalFilters = initialValues[
- itemId
- ].globalFilters.concat(filterValue)
- } else {
- const filterValue = getVariableParams(
- control,
- relatedView.fields,
- defaultValue,
- variable
- )
- initialValues[itemId].globalVariables = initialValues[
- itemId
- ].globalVariables.concat(filterValue)
- }
- }
- }
- })
- })
- }
- })
- return initialValues
- }
- export function getLocalControlInitialValues(
- controls: IControl[],
- formedViews: IFormedViews | IShareFormedViews
- ): ILocalControlConditions {
- const initialValues: ILocalControlConditions = {
- tempFilters: [], // @TODO combine widget static filters with local filters
- variables: []
- }
- controls.forEach((control: IControl) => {
- const { optionWithVariable, relatedViews } = control
- const defaultValue = getPreciseDefaultValue(control)
- if (defaultValue) {
- Object.entries(relatedViews).forEach(([viewId, relatedView]) => {
- if (formedViews[viewId]) {
- const { model, variable } = formedViews[viewId]
- if (optionWithVariable) {
- const filterValue = getCustomOptionVariableParams(
- control,
- Number(viewId),
- defaultValue,
- variable
- )
- initialValues.variables = initialValues.variables.concat(
- filterValue
- )
- } else {
- if (relatedView.fieldType === ControlFieldTypes.Column) {
- const filterValue = getFilterParams(
- control,
- relatedView.fields,
- defaultValue,
- model
- )
- initialValues.tempFilters = initialValues.tempFilters.concat(
- filterValue
- )
- } else {
- const filterValue = getVariableParams(
- control,
- relatedView.fields,
- defaultValue,
- variable
- )
- initialValues.variables = initialValues.variables.concat(
- filterValue
- )
- }
- }
- }
- })
- }
- })
- return initialValues
- }
- export function getRequestParams(
- widget: IWidgetFormed,
- cachedQueryConditions: IQueryConditions,
- flush: boolean,
- inputQueryConditions?: Partial<IQueryConditions>
- ): IDataRequestParams {
- const {
- cols,
- rows,
- metrics,
- secondaryMetrics,
- color,
- label,
- size,
- xAxis,
- tip,
- limit,
- cache,
- expired
- } = widget.config
- const customOrders = cols
- .concat(rows)
- .filter(({ sort }) => sort && sort.sortType === FieldSortTypes.Custom)
- .map(({ name, sort }) => ({
- name,
- list: sort[FieldSortTypes.Custom].sortList
- }))
- // @TODO combine widget static filters with local filters
- let tempFilters = cachedQueryConditions.tempFilters
- let linkageFilters = cachedQueryConditions.linkageFilters
- let globalFilters = cachedQueryConditions.globalFilters
- let paginationOrders = cachedQueryConditions.orders
- let variables = cachedQueryConditions.variables
- let linkageVariables = cachedQueryConditions.linkageVariables
- let globalVariables = cachedQueryConditions.globalVariables
- let pagination = cachedQueryConditions.pagination
- let nativeQuery = cachedQueryConditions.nativeQuery
- let drillStatus = cachedQueryConditions.drillStatus
- const prevDrillHistory = cachedQueryConditions.drillHistory
- ? cachedQueryConditions.drillHistory[
- cachedQueryConditions.drillHistory.length - 1
- ]
- : {}
- if (inputQueryConditions) {
- tempFilters = inputQueryConditions.tempFilters || tempFilters
- linkageFilters = inputQueryConditions.linkageFilters || linkageFilters
- globalFilters = inputQueryConditions.globalFilters || globalFilters
- paginationOrders = inputQueryConditions.orders || paginationOrders
- variables = inputQueryConditions.variables || variables
- linkageVariables = inputQueryConditions.linkageVariables || linkageVariables
- globalVariables = inputQueryConditions.globalVariables || globalVariables
- drillStatus = inputQueryConditions.drillStatus || prevDrillHistory
- pagination = inputQueryConditions.pagination || pagination
- nativeQuery =
- inputQueryConditions.nativeQuery !== void 0
- ? inputQueryConditions.nativeQuery
- : nativeQuery
- }
- let groups = cols
- .concat(rows)
- .filter((g) => g.name !== '指标名称')
- .map((g) => g.name)
- let aggregators = metrics.map((m) => ({
- column: decodeMetricName(m.name),
- func: m.agg
- }))
- let orders = widget.config.orders
- const filters = widget.config.filters.reduce(
- (a, b) => a.concat(b.config.sqlModel),
- []
- )
- if (secondaryMetrics && secondaryMetrics.length) {
- aggregators = aggregators.concat(
- secondaryMetrics.map((second) => ({
- column: decodeMetricName(second.name),
- func: second.agg
- }))
- )
- }
- if (color) {
- groups = groups.concat(color.items.map((c) => c.name))
- }
- if (label) {
- groups = groups.concat(
- label.items.filter((l) => l.type === 'category').map((l) => l.name)
- )
- aggregators = aggregators.concat(
- label.items
- .filter((l) => l.type === 'value')
- .map((l) => ({
- column: decodeMetricName(l.name),
- func: l.agg
- }))
- )
- }
- if (size) {
- aggregators = aggregators.concat(
- size.items.map((s) => ({
- column: decodeMetricName(s.name),
- func: s.agg
- }))
- )
- }
- if (xAxis) {
- aggregators = aggregators.concat(
- xAxis.items.map((x) => ({
- column: decodeMetricName(x.name),
- func: x.agg
- }))
- )
- }
- if (tip) {
- aggregators = aggregators.concat(
- tip.items.map((t) => ({
- column: decodeMetricName(t.name),
- func: t.agg
- }))
- )
- }
- if (paginationOrders) {
- orders = orders.concat(paginationOrders)
- }
- return {
- groups,
- aggregators,
- filters,
- tempFilters,
- linkageFilters,
- globalFilters,
- variables,
- linkageVariables,
- globalVariables,
- orders,
- limit,
- cache,
- expired,
- flush,
- pagination,
- nativeQuery,
- customOrders,
- drillStatus
- }
- }
- export function getRequestBody(
- requestParams: IDataRequestParams
- ): IDataRequestBody {
- const {
- filters,
- tempFilters, // @TODO combine widget static filters with local filters
- linkageFilters,
- globalFilters,
- variables,
- linkageVariables,
- globalVariables,
- pagination,
- drillStatus,
- groups,
- ...rest
- } = requestParams
- const { pageSize, pageNo } = pagination || { pageSize: 0, pageNo: 0 }
- let combinedFilters = filters
- .concat(tempFilters)
- .concat(linkageFilters)
- .concat(globalFilters)
- if (drillStatus && drillStatus.filters) {
- combinedFilters = combinedFilters.concat(drillStatus.filters)
- }
- return {
- ...omit(rest, 'customOrders'),
- groups: drillStatus && drillStatus.groups ? drillStatus.groups : groups,
- filters: combinedFilters,
- params: variables.concat(linkageVariables).concat(globalVariables),
- pageSize,
- pageNo
- }
- }
- export function getFormValuesRelatedItems(
- controls: IControl[],
- currentItems: IDashboardItem[],
- formValues: object
- ): number[] {
- return Object.keys(formValues).reduce((items, key) => {
- const control = controls.find((c) => c.key === key)
- const { relatedItems } = control
- const checkedItems = Object.entries(relatedItems)
- .filter(
- ([itemId, config]) =>
- config.checked && currentItems.find((c) => c.id === Number(itemId))
- )
- .map(([itemId]) => itemId)
- return Array.from(new Set([...items, ...checkedItems]))
- }, [])
- }
- export function getCurrentControlValues(
- type: ControlPanelTypes,
- controls: IControl[],
- formedViews: IFormedViews | IShareFormedViews,
- allFormValues: object,
- changedFormValues?: object,
- currentItems?: IDashboardItem[]
- ): IGlobalControlConditionsByItem | ILocalControlConditions {
- const updatedFormValues = {
- ...allFormValues,
- ...changedFormValues
- }
- if (type === ControlPanelTypes.Global) {
- const changedFormValuesRelatedItems = getFormValuesRelatedItems(
- controls,
- currentItems,
- changedFormValues || allFormValues
- )
- const conditionsByItem: IGlobalControlConditionsByItem = {}
- changedFormValuesRelatedItems.forEach((itemId) => {
- Object.entries(updatedFormValues).forEach(([key, value]) => {
- const control = controls.find((c) => c.key === key)
- if (control) {
- const { optionWithVariable, relatedViews, relatedItems } = control
- const relatedItem = relatedItems[itemId]
- if (
- relatedItem &&
- relatedItem.checked &&
- relatedViews[relatedItem.viewId] &&
- formedViews[relatedItem.viewId]
- ) {
- const relatedView = relatedViews[relatedItem.viewId]
- const { model, variable } = formedViews[relatedItem.viewId]
- if (!conditionsByItem[itemId]) {
- conditionsByItem[itemId] = {
- globalVariables: [],
- globalFilters: []
- }
- }
- if (optionWithVariable) {
- const controlVariables = getCustomOptionVariableParams(
- control,
- relatedItem.viewId,
- value,
- variable
- )
- conditionsByItem[itemId].globalVariables = conditionsByItem[
- itemId
- ].globalVariables.concat(controlVariables)
- } else {
- if (relatedView.fieldType === ControlFieldTypes.Column) {
- const controlFilters = getFilterParams(
- control,
- relatedView.fields,
- value,
- model
- )
- conditionsByItem[itemId].globalFilters = conditionsByItem[
- itemId
- ].globalFilters.concat(controlFilters)
- } else {
- const controlVariables = getVariableParams(
- control,
- relatedView.fields,
- value,
- variable
- )
- conditionsByItem[itemId].globalVariables = conditionsByItem[
- itemId
- ].globalVariables.concat(controlVariables)
- }
- }
- }
- }
- })
- })
- return conditionsByItem
- } else {
- const conditions: ILocalControlConditions = {
- tempFilters: [],
- variables: []
- }
- Object.entries(updatedFormValues).forEach(([key, value]) => {
- const control = controls.find((c) => c.key === key)
- if (control) {
- const [viewId, relatedView] = Object.entries(control.relatedViews)[0]
- if (formedViews[viewId]) {
- const { model, variable } = formedViews[viewId]
- if (control.optionWithVariable) {
- const controlVariables = getCustomOptionVariableParams(
- control,
- Number(viewId),
- value,
- variable
- )
- conditions.variables = conditions.variables.concat(controlVariables)
- } else {
- if (relatedView.fieldType === ControlFieldTypes.Column) {
- const controlFilters = getFilterParams(
- control,
- relatedView.fields,
- value,
- model
- )
- conditions.tempFilters = conditions.tempFilters.concat(
- controlFilters
- )
- } else {
- const controlVariables = getVariableParams(
- control,
- relatedView.fields,
- value,
- variable
- )
- conditions.variables = conditions.variables.concat(
- controlVariables
- )
- }
- }
- }
- }
- })
- return conditions
- }
- }
|