import React from 'react'
import Aggregator from './Aggregator'
import Field from './Field'
import Sort from './Sort'
import Format from './Format'
import Color from './Color'
import Filters from './Filters'
import { ViewModelTypes, ViewModelVisualTypes } from 'containers/View/constants'
import ChartTypes from 'containers/Widget/config/chart/ChartTypes'
import { SettingTypes, ItemTypes, ItemValueTypes } from './types'
import { Menu } from 'antd'
const { Item: MenuItem, SubMenu, Divider: MenuDivider } = Menu
const SettingsList = [...Aggregator, Format, Field, ...Sort, Filters, Color]
export function getSettingKeyByDropItem (itemKey: string): 'aggregator' | 'field' | 'sort' | 'format' | 'color' | 'filters' | 'tip' {
let settingKey
SettingsList.some((s) => {
const exists = s.items.some((item) => !!item[itemKey])
if (exists) { settingKey = s.key }
return exists
})
return settingKey
}
export function getAvailableSettings (settingType: SettingTypes, itemType: ItemTypes, itemValueType: ItemValueTypes) {
const availableSettings = SettingsList.filter((settingItem) => {
const { constrants } = settingItem
const byType = constrants.some((constrant) => (
(!constrant.settingType || (constrant.settingType & settingType))
&& (!constrant.itemType || (constrant.itemType & itemType))
&& (!constrant.itemValueType || (constrant.itemValueType & itemValueType))
))
return byType
})
const result = availableSettings.reduce((acc, setting) => {
if (!setting.sub) {
return acc.concat(setting.items)
}
return acc.concat({
[setting.key]: {
name: setting.name,
subs: setting.items
}
})
}, [])
return result
}
export function getSettingsDropdownList (settings) {
return settings.reduce((menuItems, group, index) => {
menuItems = menuItems.concat(Object.entries(group).map(([k, v]: [string, any]) => {
if (v.subs) {
const subItems = getSettingsDropdownList(v.subs)
return ({subItems})
} else {
return ()
}
}))
if (index !== settings.length - 1) {
menuItems = menuItems.concat()
}
return menuItems
}, [])
}
export const MapSettingTypes = {
cols: SettingTypes.Dimension,
rows: SettingTypes.Dimension,
metrics: SettingTypes.Indicator,
secondaryMetrics: SettingTypes.Indicator,
filters: SettingTypes.Filters,
color: SettingTypes.Color,
tip: SettingTypes.Tip
}
export const MapItemTypes = {
[ViewModelTypes.Category]: ItemTypes.Category,
[ViewModelTypes.Value]: ItemTypes.Value
}
export const MapItemValueTypes = {
[ViewModelVisualTypes.Date]: ItemValueTypes.Date,
[ViewModelVisualTypes.GeoCity]: ItemValueTypes.GeoCity,
[ViewModelVisualTypes.GeoCountry]: ItemValueTypes.GeoCountry,
[ViewModelVisualTypes.GeoProvince]: ItemValueTypes.GeoProvince,
[ViewModelVisualTypes.Number]: ItemValueTypes.Number,
[ViewModelVisualTypes.String]: ItemValueTypes.String
}
export default SettingsList