From 17c0ead71cde3729c2504bf804132fa2a8ed23f0 Mon Sep 17 00:00:00 2001 From: Hao Chen <270001151@qq.com> Date: Wed, 23 Feb 2022 21:55:24 +0800 Subject: [PATCH 01/26] =?UTF-8?q?fix:=20graphic=20walker=20=E5=88=86?= =?UTF-8?q?=E9=9D=A2=E4=BF=AE=E5=A4=8D=20+=20=E6=9B=B4=E5=A4=9Ageom?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/Fields/fieldsContext.tsx | 1 + .../src/Fields/obComponents/obPill.tsx | 3 +- packages/graphic-walker/src/config.ts | 8 ++++ .../graphic-walker/src/renderer/index.tsx | 1 + .../src/store/visualSpecStore.ts | 4 ++ .../graphic-walker/src/vis/react-vega.tsx | 43 ++++++++++++------- .../src/visualSettings/index.tsx | 6 +++ 7 files changed, 49 insertions(+), 17 deletions(-) diff --git a/packages/graphic-walker/src/Fields/fieldsContext.tsx b/packages/graphic-walker/src/Fields/fieldsContext.tsx index 6a400484..4b761ce3 100644 --- a/packages/graphic-walker/src/Fields/fieldsContext.tsx +++ b/packages/graphic-walker/src/Fields/fieldsContext.tsx @@ -7,6 +7,7 @@ import { DraggableLocation, } from "react-beautiful-dnd"; import { useGlobalStore } from '../store'; +window['__react-beautiful-dnd-disable-dev-warnings'] = true; export const FieldsContextWrapper: React.FC = props => { diff --git a/packages/graphic-walker/src/Fields/obComponents/obPill.tsx b/packages/graphic-walker/src/Fields/obComponents/obPill.tsx index bef488c2..f305973a 100644 --- a/packages/graphic-walker/src/Fields/obComponents/obPill.tsx +++ b/packages/graphic-walker/src/Fields/obComponents/obPill.tsx @@ -14,6 +14,7 @@ interface PillProps { const OBPill: React.FC = props => { const { provided, dkey, fIndex } = props; const { vizStore } = useGlobalStore(); + const { visualConfig } = vizStore; const field = vizStore.draggableFieldState[dkey.id][fIndex]; return = props => { {...provided.dragHandleProps} > {field.name}  - {field.type === 'M' && ( + {field.type === 'M' && visualConfig.defaultAggregated && ( { + vizStore.setVisualConfig('defaultStack', e.target.checked); + }} /> + +
+ { + props.children + } + + +} + +export default DropDownSelect; diff --git a/packages/frontend/src/components/fieldConfig.tsx b/packages/frontend/src/components/fieldConfig.tsx index ce08f34b..b1d81194 100644 --- a/packages/frontend/src/components/fieldConfig.tsx +++ b/packages/frontend/src/components/fieldConfig.tsx @@ -1,7 +1,8 @@ import React, { useState, useEffect } from 'react'; import { PrimaryButton, Panel, PanelType, Toggle } from 'office-ui-fabric-react'; import intl from 'react-intl-universal'; -import { BIField, BIFieldType } from '../global'; +import { IAnalyticType } from 'visual-insights'; +import { BIField } from '../global'; interface FieldPanelProps { show: boolean; @@ -21,7 +22,7 @@ const FieldPanel: React.FC = (props) => { setFields(props.fields) }, [props.fields]) - function updateFieldType(field: BIField, type: BIFieldType) { + function updateFieldType(field: BIField, type: IAnalyticType) { setFields(fields => { return fields.map(f => { if (field.name === f.name) { diff --git a/packages/frontend/src/components/simpleTick.tsx b/packages/frontend/src/components/simpleTick.tsx index a5d98588..8bd53819 100644 --- a/packages/frontend/src/components/simpleTick.tsx +++ b/packages/frontend/src/components/simpleTick.tsx @@ -1,12 +1,12 @@ import React, { useMemo } from 'react'; -import { DataSource } from '../global'; +import { IRow } from 'visual-insights'; import ReactVega from './react-vega'; interface SimpleTickProps { x: string; y: string; threshold: number; - dataSource: DataSource + dataSource: IRow[] } const SimpleTick: React.FC = props => { const { x, y, threshold, dataSource = [] } = props; diff --git a/packages/frontend/src/components/table.tsx b/packages/frontend/src/components/table.tsx index 939394b2..7b88fba9 100644 --- a/packages/frontend/src/components/table.tsx +++ b/packages/frontend/src/components/table.tsx @@ -1,8 +1,9 @@ import React from 'react'; import { DetailsList, SelectionMode } from 'office-ui-fabric-react'; -import { DataSource, BIField } from '../global'; +import { BIField } from '../global'; +import { IRow } from '../interfaces'; export interface DataTableProps { - dataSource: DataSource, + dataSource: IRow[], fields: BIField[] } const DataTable: React.FC = (props) => { diff --git a/packages/frontend/src/components/userSettings.tsx b/packages/frontend/src/components/userSettings.tsx index 9cce0f63..bcee79df 100644 --- a/packages/frontend/src/components/userSettings.tsx +++ b/packages/frontend/src/components/userSettings.tsx @@ -9,7 +9,7 @@ import { IDropdownOption, Dropdown } from 'office-ui-fabric-react' -import { DropdownSelect } from '@tableau/tableau-ui'; +import DropdownSelect from "./dropDownSelect"; import { observer } from 'mobx-react-lite' import { SUPPORT_LANG } from "../locales"; @@ -36,6 +36,7 @@ const UserSettings: React.FC = () => { return ( { langStore.useLocales(e.target.value) diff --git a/packages/frontend/src/global.ts b/packages/frontend/src/global.ts index 39b777fb..0f5ea38f 100644 --- a/packages/frontend/src/global.ts +++ b/packages/frontend/src/global.ts @@ -1,22 +1,14 @@ +import { ISemanticType, IAnalyticType } from 'visual-insights' + export type Aggregator = 'sum' | 'mean' | 'count'; -export type FieldType = 'quantitative' | 'nominal' | 'ordinal' | 'temporal'; export interface Field { name: string; - type: FieldType -} - -export interface Record { - [key: string]: any + type: ISemanticType } -export type DataSource = Record[]; - -// export Impurity -export type BIFieldType = 'dimension' | 'measure'; - export interface BIField { name: string; - type: 'dimension' | 'measure' + type: IAnalyticType } export type FieldImpurity = [string, number, number, Field]; diff --git a/packages/frontend/src/interfaces.ts b/packages/frontend/src/interfaces.ts index 27e114ac..495d03dd 100644 --- a/packages/frontend/src/interfaces.ts +++ b/packages/frontend/src/interfaces.ts @@ -1,6 +1,6 @@ // define new interfaces here, global.ts is no longer maintained. -import { IFieldSummary, IInsightSpace } from "visual-insights"; -import { Aggregator, BIFieldType, FieldType } from "./global"; +import { IAnalyticType, IFieldSummary, IInsightSpace, ISemanticType } from "visual-insights"; +import { Aggregator } from "./global"; export interface IRow { [key: string]: any @@ -13,8 +13,8 @@ export interface IRow { interface IFieldBase { fid: string; name?: string; - analyticType: BIFieldType; - semanticType: FieldType; + analyticType: IAnalyticType; + semanticType: ISemanticType; } export interface IRawField extends IFieldBase { disable?: boolean; @@ -50,8 +50,6 @@ export enum IComputeMode { worker = 'worker' } -export type IAnalyticType = 'dimension' | 'measure'; - export interface PreferencePanelConfig { aggregator: Aggregator; defaultAggregated: boolean; diff --git a/packages/frontend/src/pages/dashBoard/combinedChart.tsx b/packages/frontend/src/pages/dashBoard/combinedChart.tsx index b12672e2..d60197bd 100644 --- a/packages/frontend/src/pages/dashBoard/combinedChart.tsx +++ b/packages/frontend/src/pages/dashBoard/combinedChart.tsx @@ -1,18 +1,19 @@ import React, { useMemo, useEffect, useState } from "react"; import { DashBoard } from "../../service"; -import { Aggregator, DataSource, Field } from "../../global"; +import { Aggregator, Field } from "../../global"; import { specification } from "visual-insights"; import { useComposeState } from "../../hooks/index"; import { IconButton } from "office-ui-fabric-react"; import IndicatorCard from "./indicatorCard"; import ReactVega from '../../components/react-vega'; import { DataField, featureVis, targetVis } from '../../queries/index'; +import { IRow } from "../../interfaces"; const IndicatorCardType = "indicator" as const; interface CombinedChartProps { dashBoard: DashBoard; - dataSource: DataSource; + dataSource: IRow[]; dimScores: [string, number, number, Field][]; aggregator?: Aggregator; } @@ -132,7 +133,7 @@ const CombinedChart: React.FC = props => { }); }, [dashBoard, chartStateList, setGlobalFilters]); - const vsourceList = useMemo>(() => { + const vsourceList = useMemo(() => { let ans = []; const filters = Object.keys(globalFilters).map(fieldName => { return { diff --git a/packages/frontend/src/pages/dashBoard/indicatorCard.tsx b/packages/frontend/src/pages/dashBoard/indicatorCard.tsx index 00de5a3e..93866513 100644 --- a/packages/frontend/src/pages/dashBoard/indicatorCard.tsx +++ b/packages/frontend/src/pages/dashBoard/indicatorCard.tsx @@ -1,7 +1,8 @@ import React, { useMemo } from "react"; import styled from "styled-components"; -import { Aggregator, DataSource } from "../../global"; +import { Aggregator } from "../../global"; import datalib from "datalib"; +import { IRow } from "../../interfaces"; function numberWithCommas(x: number): string { let parts = x.toString().split("."); @@ -34,7 +35,7 @@ const Card = styled.div` } `; interface IndicatorProps { - dataSource: DataSource; + dataSource: IRow[]; measures: string[]; operator?: Aggregator; } diff --git a/packages/frontend/src/pages/dataSource/clean.ts b/packages/frontend/src/pages/dataSource/clean.ts index 4e040fbe..488527eb 100644 --- a/packages/frontend/src/pages/dataSource/clean.ts +++ b/packages/frontend/src/pages/dataSource/clean.ts @@ -2,7 +2,7 @@ import { useObserver } from 'mobx-react-lite'; import { useMemo } from 'react'; import intl from "react-intl-universal"; import { Cleaner } from 'visual-insights'; -import { DataSource } from '../../global'; +import { IRow } from '../../interfaces'; import { useGlobalStore } from '../../store'; const { dropNull, simpleClean, useMode } = Cleaner; @@ -11,10 +11,10 @@ const { dropNull, simpleClean, useMode } = Cleaner; // cleanMethodList has redundency. // clean method type, cleanData(switch), cleanMethodList should be maintained in one structure. export type CleanMethod = 'dropNull' | 'useMode' | 'simpleClean' | 'none'; -function unClean(dataSource: DataSource) { +function unClean(dataSource: IRow[]) { return [...dataSource]; } -export function cleanData (dataSource: DataSource, dimensions: string[], measures: string[], method: CleanMethod): DataSource { +export function cleanData (dataSource: IRow[], dimensions: string[], measures: string[], method: CleanMethod): IRow[] { // hint: dropNull works really bad when we test titanic dataset. // useMode fails when there are more null values than normal values; switch (method) { diff --git a/packages/frontend/src/pages/dataSource/dataTable/distributionMiniChart.tsx b/packages/frontend/src/pages/dataSource/dataTable/distributionMiniChart.tsx index faca5379..f0c28f7b 100644 --- a/packages/frontend/src/pages/dataSource/dataTable/distributionMiniChart.tsx +++ b/packages/frontend/src/pages/dataSource/dataTable/distributionMiniChart.tsx @@ -1,11 +1,12 @@ import React, { useRef, useEffect } from 'react'; import embed from 'vega-embed'; -import { FieldType, DataSource } from '../../../global'; +import { ISemanticType } from 'visual-insights'; +import { IRow } from '../../../interfaces'; export interface DistributionChartProps { - fieldType: FieldType; + fieldType: ISemanticType; x: string; y: string; - dataSource: DataSource + dataSource: IRow[] } const DistributionChart: React.FC = (props) => { diff --git a/packages/frontend/src/pages/dataSource/dataTable/headerCell.tsx b/packages/frontend/src/pages/dataSource/dataTable/headerCell.tsx index 9e20ec8c..ca9e599a 100644 --- a/packages/frontend/src/pages/dataSource/dataTable/headerCell.tsx +++ b/packages/frontend/src/pages/dataSource/dataTable/headerCell.tsx @@ -2,10 +2,9 @@ import React, { useMemo, useState } from 'react'; import styled from 'styled-components'; import intl from 'react-intl-universal'; import DistributionMiniChart from './distributionMiniChart'; -import { DropdownSelect } from '@tableau/tableau-ui' -import { BIFieldType, FieldType } from '../../../global'; +import DropdownSelect from '../../../components/dropDownSelect' import { IFieldMeta, IRawField } from '../../../interfaces'; -import { ISemanticType } from 'visual-insights/build/esm/insights/InsightFlow/interfaces'; +import { IAnalyticType, ISemanticType } from 'visual-insights/build/esm/insights/InsightFlow/interfaces'; import { Callout, IconButton, TextField } from 'office-ui-fabric-react'; import { useId } from '@uifabric/react-hooks'; @@ -49,17 +48,17 @@ interface HeaderCellProps { interface IOption { key: T; text: string }; -const DataTypeOptions: IOption[] = [ +const DataTypeOptions: IOption[] = [ { key: 'nominal', text: 'nominal' }, { key: 'ordinal', text: 'ordinal' }, { key: 'quantitative', text: 'quantitative' }, { key: 'temporal', text: 'temporal' } ] -function useBIFieldTypeOptions (): IOption[] { +function useBIFieldTypeOptions (): IOption[] { const dimensionLabel = intl.get('meta.dimension'); const measureLabel = intl.get('meta.measure'); - const options = useMemo[]>(() => { + const options = useMemo[]>(() => { return [ { key: 'dimension', text: dimensionLabel }, { key: 'measure', text: measureLabel } @@ -100,7 +99,7 @@ const HeaderCell: React.FC = props => { } {meta && ( - { + { if (onChange) { onChange(code, 'semanticType', e.target.value as ISemanticType) } @@ -113,10 +112,10 @@ const HeaderCell: React.FC = props => { )} { - { + { if (onChange) { // FIXME: 弱约束问题 - onChange(code, 'analyticType', e.target.value as BIFieldType); + onChange(code, 'analyticType', e.target.value as IAnalyticType); } }}> { diff --git a/packages/frontend/src/pages/dataSource/index.tsx b/packages/frontend/src/pages/dataSource/index.tsx index e3525ffb..91dc3b72 100644 --- a/packages/frontend/src/pages/dataSource/index.tsx +++ b/packages/frontend/src/pages/dataSource/index.tsx @@ -7,7 +7,6 @@ import MetaView from './metaView/index'; import { CleanMethod, useCleanMethodList } from './clean'; import Selection from './selection/index'; import ImportStorage from "./importStorage"; -import { Record } from "../../global"; import { observer } from 'mobx-react-lite'; import { useGlobalStore } from "../../store"; import { COMPUTATION_ENGINE, EXPLORE_MODE, PIVOT_KEYS } from "../../constants"; @@ -45,7 +44,7 @@ const DataSourceBoard: React.FC = (props) => { const cleanMethodListLang = useCleanMethodList(); - const dataImportButton = useCallback((text: string, dataSource: Record[]) => { + const dataImportButton = useCallback((text: string, dataSource: IRow[]) => { let UsedButton = dataSource.length === 0 ? PrimaryButton : DefaultButton; return ( (() => { return fields.filter(field => field.type === 'dimension').map(field => field.name) }, [fields]) @@ -14,9 +15,9 @@ export function useDataSource (rawData: DataSource, fields: BIField[], cleanMeth return fields.filter(field => field.type === 'measure').map(field => field.name) }, [fields]) - const dataSource = useMemo(() => { + const dataSource = useMemo(() => { return rawData.map(row => { - let record: Record = {} + let record: IRow = {} fields.forEach(field => { record[field.name] = field.type === 'dimension' ? row[field.name] : Transform.transNumber(row[field.name]) }) @@ -24,7 +25,7 @@ export function useDataSource (rawData: DataSource, fields: BIField[], cleanMeth }) }, [rawData, fields]) - const preparedData = useMemo(() => { + const preparedData = useMemo(() => { return cleanData(deepcopy(dataSource), dimensions, measures, cleanMethod); }, [dimensions, measures, dataSource, cleanMethod]) diff --git a/packages/frontend/src/pages/gallery/association/digDimension.tsx b/packages/frontend/src/pages/gallery/association/digDimension.tsx index 4901726f..471333a8 100644 --- a/packages/frontend/src/pages/gallery/association/digDimension.tsx +++ b/packages/frontend/src/pages/gallery/association/digDimension.tsx @@ -1,8 +1,9 @@ import { useMemo } from 'react'; import { FieldSummary, ViewSpace } from '../../../service'; -import { Field, DataSource } from '../../../global'; +import { Field } from '../../../global'; import { specification } from 'visual-insights'; import { PreferencePanelConfig } from '../../../components/preference'; +import { IRow } from '../../../interfaces'; // import { FieldSummary } from '\'; const similarityThrehold = 0.2; const topKRelatedSpace = 5; @@ -35,7 +36,7 @@ export interface DigDimensionProps { viewSpaces: ViewSpace[]; interestedViewSpace: ViewSpace; fieldScores: FieldSummary[]; - dataSource: DataSource; + dataSource: IRow[]; visualConfig: PreferencePanelConfig } diff --git a/packages/frontend/src/pages/lts/save/index.tsx b/packages/frontend/src/pages/lts/save/index.tsx index b0be3946..baac8692 100644 --- a/packages/frontend/src/pages/lts/save/index.tsx +++ b/packages/frontend/src/pages/lts/save/index.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useEffect, useState } from 'react'; +import React, { useCallback, useState } from 'react'; import { observer } from 'mobx-react-lite' import { DefaultButton, Modal, PrimaryButton, Stack, TextField } from 'office-ui-fabric-react' import dayjs from 'dayjs'; diff --git a/packages/frontend/src/pages/notebook/distributionChart.tsx b/packages/frontend/src/pages/notebook/distributionChart.tsx index dc7f5a4b..e9eae0b4 100644 --- a/packages/frontend/src/pages/notebook/distributionChart.tsx +++ b/packages/frontend/src/pages/notebook/distributionChart.tsx @@ -1,11 +1,12 @@ import React, { useRef, useEffect } from 'react'; import embed from 'vega-embed'; -import { FieldType, DataSource } from '../../global'; +import { ISemanticType } from 'visual-insights'; +import { IRow } from '../../interfaces'; export interface DistributionChartProps { - fieldType: FieldType; + fieldType: ISemanticType; x: string; y: string; - dataSource: DataSource + dataSource: IRow[] } const DistributionChart: React.FC = (props) => { diff --git a/packages/frontend/src/pages/notebook/fieldAnalysis.tsx b/packages/frontend/src/pages/notebook/fieldAnalysis.tsx index 282df859..23ec0ac6 100644 --- a/packages/frontend/src/pages/notebook/fieldAnalysis.tsx +++ b/packages/frontend/src/pages/notebook/fieldAnalysis.tsx @@ -4,12 +4,12 @@ import { Icon, HoverCard, IExpandingCardProps } from 'office-ui-fabric-react'; import chroma from 'chroma-js'; import { FieldSummary } from '../../service'; import DistributionChart from './distributionChart'; -import { FieldType, Record } from '../../global'; import { BaseTable, ArtColumn } from 'ali-react-table'; import styled from 'styled-components'; import './fieldAnalysis.css'; import { IRow } from '../../interfaces'; +import { ISemanticType } from 'visual-insights'; // todo: distribution info @@ -85,18 +85,18 @@ const FieldAnalsis: React.FC = (props) => { return [0, Math.max(...originEntropy)]; }, [originSummary]) - const onRenderCompactCard = useCallback((item: Record) => { + const onRenderCompactCard = useCallback((item: IRow) => { return (

{item.fieldName}

Field entropy is {Number(item.entropy).toFixed(2)}
- +
); }, []); - const onRenderExpandedCard = useCallback((item: Record) => { + const onRenderExpandedCard = useCallback((item: IRow) => { const name = item.fieldName; const target = groupedSummary.find((s) => s.fieldName === name + "(group)"); return ( @@ -109,7 +109,7 @@ const FieldAnalsis: React.FC = (props) => {
@@ -126,7 +126,7 @@ const FieldAnalsis: React.FC = (props) => { const nextCol: ArtColumn = { ...col, name: intl.get(`noteBook.univariate.columns.${col.code}`), - render(value: any, record: Record, rowIndex?: number) { + render(value: any, record: IRow, rowIndex?: number) { const name = record.fieldName; const target = groupedSummary.find((s) => s.fieldName === name + "(group)"); const expandingCardProps: IExpandingCardProps = { diff --git a/packages/frontend/src/pages/notebook/index.tsx b/packages/frontend/src/pages/notebook/index.tsx index e230301b..8ae5dffa 100644 --- a/packages/frontend/src/pages/notebook/index.tsx +++ b/packages/frontend/src/pages/notebook/index.tsx @@ -1,4 +1,4 @@ -import React, { useMemo, useState, useEffect, useCallback } from 'react'; +import React, { useMemo, useState, useCallback } from 'react'; import intl from 'react-intl-universal'; import { Field } from '../../global'; import FieldAnalysisBoard from './fieldAnalysis'; diff --git a/packages/frontend/src/pages/notebook/subspaces.tsx b/packages/frontend/src/pages/notebook/subspaces.tsx index b0a7a191..c2454ed8 100644 --- a/packages/frontend/src/pages/notebook/subspaces.tsx +++ b/packages/frontend/src/pages/notebook/subspaces.tsx @@ -1,7 +1,7 @@ import React, { useRef, useMemo, useEffect, useState } from 'react'; import { Subspace } from '../../service'; import embed from 'vega-embed'; -import { DataSource } from '../../global'; +import { IRow } from '../../interfaces'; function encodeArr (arr: any[]): string { return arr.join(',') @@ -32,7 +32,7 @@ const Subspaces: React.FC = (props) => { } }, [subspaceList, onSpaceChange]) - const values = useMemo(() => { + const values = useMemo(() => { let ans = []; // todos: // the fold operation here is a tmp solution. it is designed when I don't there is a api in vega to handle event listener. @@ -108,7 +108,7 @@ const Subspaces: React.FC = (props) => { useEffect(() => { let space = subspaceList[curIndex]; if (relationChart.current && subspaceList.length > 0 && space) { - let matrix: DataSource = []; + let matrix: IRow[] = []; for (let i = 0; i < space.correlationMatrix.length; i++) { for (let j = 0; j < space.correlationMatrix[i].length; j++) { diff --git a/packages/frontend/src/pages/pattern/components.tsx b/packages/frontend/src/pages/pattern/components.tsx index db1f74c7..d74f919b 100644 --- a/packages/frontend/src/pages/pattern/components.tsx +++ b/packages/frontend/src/pages/pattern/components.tsx @@ -1,4 +1,3 @@ -import React from 'react' import styled from 'styled-components'; export const AssoContainer = styled.div` diff --git a/packages/frontend/src/plugins/visSummary/description.tsx b/packages/frontend/src/plugins/visSummary/description.tsx index 1f506e87..b562c47e 100644 --- a/packages/frontend/src/plugins/visSummary/description.tsx +++ b/packages/frontend/src/plugins/visSummary/description.tsx @@ -3,7 +3,6 @@ import ReactMarkdown from 'react-markdown'; import { FieldSummary, Subspace } from '../../service'; import './index.css'; -import { Field } from '../../global'; import { Specification } from '../../visBuilder/vegaBase'; interface VisDescriptionProps { diff --git a/packages/frontend/src/plugins/visSummary/index.tsx b/packages/frontend/src/plugins/visSummary/index.tsx index be464aa7..a2ed0bb7 100644 --- a/packages/frontend/src/plugins/visSummary/index.tsx +++ b/packages/frontend/src/plugins/visSummary/index.tsx @@ -4,7 +4,6 @@ import { FieldSummary, Subspace } from '../../service'; import { DefaultButton, TeachingBubble, DirectionalHint } from 'office-ui-fabric-react'; import './index.css'; -import { Field } from '../../global'; import { Specification } from '../../visBuilder/vegaBase'; diff --git a/packages/frontend/src/queries/baseVis.ts b/packages/frontend/src/queries/baseVis.ts index ef0e8493..4e3b33cf 100644 --- a/packages/frontend/src/queries/baseVis.ts +++ b/packages/frontend/src/queries/baseVis.ts @@ -1,7 +1,6 @@ import { ISemanticType } from "visual-insights"; import { Specification } from "visual-insights/build/esm/commonTypes"; -import { DataSource } from "../global"; -import { IFieldMeta } from "../interfaces"; +import { IFieldMeta, IRow } from "../interfaces"; export const geomTypeMap: { [key: string]: any } = { interval: "point", // interval: 'boxplot', @@ -13,7 +12,7 @@ export const geomTypeMap: { [key: string]: any } = { }; interface BaseVisProps { query: Specification; - dataSource: DataSource; + dataSource: IRow[]; dimensions: string[]; measures: string[]; aggregatedMeasures: Array<{op: string; field: string; as: string}>; diff --git a/packages/frontend/src/queries/commonVis.ts b/packages/frontend/src/queries/commonVis.ts index a30c80a1..50b5e086 100644 --- a/packages/frontend/src/queries/commonVis.ts +++ b/packages/frontend/src/queries/commonVis.ts @@ -1,7 +1,6 @@ import { ISemanticType } from "visual-insights"; import { Specification } from "visual-insights/build/esm/commonTypes"; -import { DataSource } from "../global"; -import { IFieldMeta } from "../interfaces"; +import { IFieldMeta, IRow } from "../interfaces"; export const geomTypeMap: { [key: string]: any } = { interval: "bar", line: "line", @@ -11,7 +10,7 @@ export const geomTypeMap: { [key: string]: any } = { }; interface BaseVisProps { query: Specification; - dataSource: DataSource; + dataSource: IRow[]; dimensions: string[]; measures: string[]; aggregatedMeasures: Array<{ op: string; field: string; as: string }>; diff --git a/packages/frontend/src/service.ts b/packages/frontend/src/service.ts index be20224a..dd237df9 100644 --- a/packages/frontend/src/service.ts +++ b/packages/frontend/src/service.ts @@ -1,4 +1,4 @@ -import { DataSource, Field, FieldType, OperatorType } from './global'; +import { Field, OperatorType } from './global'; /* eslint import/no-webpack-loader-syntax:0 */ // @ts-ignore // eslint-disable-next-line @@ -35,6 +35,7 @@ import { InsightSpace } from 'visual-insights/build/esm/insights/dev'; import { MessageProps } from './workers/engine/service'; import { IFieldMeta, IMuteFieldBase, IRawField, IRow } from './interfaces'; +import { ISemanticType } from 'visual-insights'; let server = '//lobay.moe:8443'; @@ -122,9 +123,9 @@ export interface FieldSummary { entropy: number; maxEntropy: number; distribution: Array<{ memberName: string; count: number }> - type: FieldType + type: ISemanticType } -export async function getFieldsSummaryService (dataSource: DataSource, fields: string[] | Field[], useServer?: boolean): Promise { +export async function getFieldsSummaryService (dataSource: IRow[], fields: string[] | Field[], useServer?: boolean): Promise { let fieldSummaryList: FieldSummary[] = []; if (useServer) { try { @@ -161,11 +162,11 @@ export async function getFieldsSummaryService (dataSource: DataSource, fields: s } interface GroupFieldsResponse { - groupedData: DataSource; + groupedData: IRow[]; newFields: Field[]; fields: Field[]; } -export async function getGroupFieldsService (dataSource: DataSource, fields: Field[], useServer?: boolean): Promise { +export async function getGroupFieldsService (dataSource: IRow[], fields: Field[], useServer?: boolean): Promise { let ans: GroupFieldsResponse = { groupedData: [], newFields: [], @@ -211,7 +212,7 @@ export interface Subspace { measures: Array<{name: string; value: number}>; correlationMatrix: number[][]; } -export async function combineFieldsService (dataSource: DataSource, dimensions: string[], measures: string[], operator: OperatorType, useServer?: boolean): Promise { +export async function combineFieldsService (dataSource: IRow[], dimensions: string[], measures: string[], operator: OperatorType, useServer?: boolean): Promise { let subspaceList: Subspace[] = []; if (useServer) { try { @@ -370,7 +371,7 @@ export async function generateDashBoard (props: IDashBoardServiceProps): Promise return dashBoardList; } -export async function getInsightViewSpace (dataSource: DataSource, dimensions: string[], measures: string[]): Promise { +export async function getInsightViewSpace (dataSource: IRow[], dimensions: string[], measures: string[]): Promise { let ansSpace: InsightSpace[] = []; try { const worker = new InsightViewWorker(); diff --git a/packages/frontend/src/store/dataSourceStore.ts b/packages/frontend/src/store/dataSourceStore.ts index b8f80581..6e8522df 100644 --- a/packages/frontend/src/store/dataSourceStore.ts +++ b/packages/frontend/src/store/dataSourceStore.ts @@ -2,10 +2,9 @@ import { makeAutoObservable, observable, runInAction } from "mobx"; import { fromStream, IStreamListener, toStream } from "mobx-utils"; import { combineLatest, from } from "rxjs"; import * as op from 'rxjs/operators' -import { ISemanticType } from "visual-insights/build/esm/insights/InsightFlow/interfaces"; +import { IAnalyticType, ISemanticType } from "visual-insights/build/esm/insights/InsightFlow/interfaces"; import { RATH_INDEX_COLUMN_KEY } from "../constants"; import { NextVICore } from "../dev"; -import { BIFieldType } from "../global"; import { IDataPreviewMode, IDatasetBase, IFieldMeta, IMuteFieldBase, IRawField, IRow } from "../interfaces"; import { cleanData, CleanMethod } from "../pages/dataSource/clean"; import { getFieldsSummaryService, inferMetaService } from "../service"; @@ -227,7 +226,7 @@ export class DataSourceStore { this.cleanMethod = method; } - public updateFieldAnalyticType (type: BIFieldType, fid: string) { + public updateFieldAnalyticType (type: IAnalyticType, fid: string) { const target = this.mutFields.find(f => f.fid === fid); if (target) { target.analyticType = type; diff --git a/packages/frontend/src/store/galleryStore.ts b/packages/frontend/src/store/galleryStore.ts index 25845a10..2e5edbed 100644 --- a/packages/frontend/src/store/galleryStore.ts +++ b/packages/frontend/src/store/galleryStore.ts @@ -1,15 +1,16 @@ import { makeAutoObservable, runInAction } from "mobx"; import { FieldSummary } from "../service"; -import { Aggregator, globalRef, Record } from "../global"; +import { Aggregator, globalRef } from "../global"; import { recallLogger } from "../loggers/recall"; import { Specification } from "../visBuilder/vegaBase"; import { specification } from "visual-insights"; import { fieldMeta2fieldSummary } from "../utils/transform"; import { LitePipeStore } from "./pipeLineStore/lite"; +import { IRow } from "../interfaces"; interface DataView { schema: Specification; - aggData: Record[]; + aggData: IRow[]; fieldFeatures: FieldSummary[]; dimensions: string[]; measures: string[]; diff --git a/packages/frontend/src/stream/litePipe.ts b/packages/frontend/src/stream/litePipe.ts index 56eb0da8..ac3b555a 100644 --- a/packages/frontend/src/stream/litePipe.ts +++ b/packages/frontend/src/stream/litePipe.ts @@ -106,7 +106,7 @@ export function getDataEventStreams (dataSource$: Observable, fields$: O op.withLatestFrom(dataSource$, fields$), op.map(([_start, dataSource, fields]) => { const fieldIds = fields.map(f => f.fid); - const { dimSet, meaSet } = createAnalyticFieldSet(fields); + const { dimSet } = createAnalyticFieldSet(fields); return from(getFieldsSummaryService(dataSource, fieldIds, false)).pipe( // field with semantic type info op.map(summary => ({ @@ -155,7 +155,7 @@ export function getDataEventStreams (dataSource$: Observable, fields$: O const cookedDataset$ = univar$.pipe( // op.withLatestFrom(dataSource$, fields$, aggOperator$), op.map((univarResult) => { - const { transedData, transedMetas, originMetas } = univarResult; + const { transedMetas } = univarResult; const orderedDimMetas = transedMetas.filter(m => m.analyticType === 'dimension'); const orderedMeaMetas = transedMetas.filter(m => m.analyticType === 'measure'); orderedDimMetas.sort((a, b) => a.features.entropy - b.features.entropy); @@ -171,7 +171,7 @@ export function getDataEventStreams (dataSource$: Observable, fields$: O const fullDataSubspaces$ = combineLatest([cookedDataset$, aggOperator$, TOP_K_DIM_PERCENT$]).pipe( op.map(([cookedDataset, operator, TOP_K_DIM_PERCENT]) => { - const { dimMetas, meaMetas, transedData, transedMetas } = cookedDataset + const { dimMetas, meaMetas, transedData } = cookedDataset const selectedDimIds = dimMetas.slice(0, Math.round(dimMetas.length * TOP_K_DIM_PERCENT)) .map(dim => dim.fid); const meaIds = meaMetas.map(m => m.fid); diff --git a/packages/frontend/src/utils/fileParser.ts b/packages/frontend/src/utils/fileParser.ts index 510332c5..419b8055 100644 --- a/packages/frontend/src/utils/fileParser.ts +++ b/packages/frontend/src/utils/fileParser.ts @@ -1,13 +1,14 @@ -import { DataSource } from '../global'; +import { IRow } from "../interfaces"; -export function jsonLoader (file: File): Promise { + +export function jsonLoader (file: File): Promise { return new Promise((resolve, reject) => { let reader = new FileReader() reader.readAsText(file) reader.onload = (ev) => { if (ev.target) { try { - const rawData: DataSource = JSON.parse(ev.target.result as string); + const rawData: IRow[] = JSON.parse(ev.target.result as string); resolve(rawData); } catch (error) { reject(error) diff --git a/packages/frontend/src/utils/index.ts b/packages/frontend/src/utils/index.ts index 3d3a665c..9fc3782b 100644 --- a/packages/frontend/src/utils/index.ts +++ b/packages/frontend/src/utils/index.ts @@ -7,6 +7,7 @@ import { IAnalyticType, IDataType, ISemanticType, UnivariateSummary } from 'visu import { RATH_INDEX_COLUMN_KEY } from '../constants'; function isASCII(str: string) { + // eslint-disable-next-line no-control-regex return /^[\x00-\x7F]*$/.test(str) } diff --git a/packages/frontend/src/visBuilder/g2.js b/packages/frontend/src/visBuilder/g2.js deleted file mode 100644 index 733543f4..00000000 --- a/packages/frontend/src/visBuilder/g2.js +++ /dev/null @@ -1,76 +0,0 @@ -import React, { useState, useEffect, useRef } from 'react'; -import G2 from '@antv/g2'; -function Demo(props) { - const { dataSource, schema, dimensions, measures } = props; - const container = useRef(null); - // const [chart, setChart] = useState(null); - const chart = useRef(); - const { - position, - size, - opacity, - shape, - geomType, - 'adjust&color': color, - facets = [] - } = schema; - - useEffect(() => { - chart.current = new G2.Chart({ - container: container.current, - forceFit: true, - padding: [10, 30, 100, 30], - height: 400, - width: window.innerWidth - }) - }, []); - - useEffect(() => { - if (!chart || !chart.current) return; - const scale = {}; - ['opacity', 'shape', 'size', 'adjust&color'].filter(aestheic => typeof schema[aestheic] !== 'undefined').forEach(aestheic => { - schema[aestheic].forEach(key => { - scale[key] = { sync: true }; - }) - }); - position.forEach(key => { - scale[key] = { - sync: true, - // hack for fucking g2 timecat rule - // type: dimensions.includes(key) ? 'cat' : undefined - }; - }) - console.log(scale) - // debugger - chart.current.source(dataSource, scale); - ['opacity', 'shape', 'size', 'adjust&color'].filter(aestheic => typeof schema[aestheic] !== 'undefined').forEach(aestheic => { - chart.current.legend(schema[aestheic][0], { - title: schema[aestheic][0] - }) - }); - if (schema.geomType && schema.geomType[0] && schema.position.length > 0) { - chart.current.facet('rect', { - fields: facets, - eachView (view) { - let geom = view[schema.geomType[0]](); - geom.position(schema.position); - if (color) { - geom.color(color[0]).adjust([{ - type: 'stack', - // marginRatio: 1 / 32 - }]) - } - if (schema.geomType[0] !== 'interval') { - ['opacity', 'shape', 'size'].filter(aesthic => typeof schema[aesthic] !== 'undefined').forEach(aestheic => { - geom[aestheic](schema[aestheic][0]); - }); - } - } - }); - chart.current.render(); - } - }); - return
-} - -export default Demo; \ No newline at end of file diff --git a/packages/frontend/src/visBuilder/vegaBase.tsx b/packages/frontend/src/visBuilder/vegaBase.tsx index 9ce36912..577aa968 100644 --- a/packages/frontend/src/visBuilder/vegaBase.tsx +++ b/packages/frontend/src/visBuilder/vegaBase.tsx @@ -1,10 +1,10 @@ import React, { useEffect, useRef, useMemo } from 'react'; import aggregate from 'cube-core'; import embed from 'vega-embed'; -import { DataSource, Field, globalRef } from '../global' +import { globalRef } from '../global' import { baseVis, commonVis } from '../queries/index'; import { EDITOR_URL } from '../constants'; -import { IFieldMeta } from '../interfaces'; +import { IFieldMeta, IRow } from '../interfaces'; // import { simpleAggregate } from 'visual-insights/build/esm/statistics'; export const geomTypeMap: {[key: string]: any} = { @@ -29,7 +29,7 @@ export interface BaseChartProps { defaultAggregated: boolean; defaultStack: boolean; aggregator: 'sum' | 'mean' | 'count'; - dataSource: DataSource; + dataSource: IRow[]; dimensions: string[]; measures: string[]; fieldFeatures: IFieldMeta[]; diff --git a/yarn.lock b/yarn.lock index 9415b5ee..f8d41283 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2122,13 +2122,6 @@ "@svgr/plugin-svgo" "^5.4.0" loader-utils "^2.0.0" -"@tableau/tableau-ui@^3.0.0": - version "3.2.0" - resolved "https://registry.nlark.com/@tableau/tableau-ui/download/@tableau/tableau-ui-3.2.0.tgz#25277a07111e281042d70cd610e52ba1104aaf25" - integrity sha1-JSd6BxEeKBBC1wzWEOUroRBKryU= - dependencies: - typestyle "2.0.4" - "@testing-library/dom@^7.28.1": version "7.31.2" resolved "https://registry.nlark.com/@testing-library/dom/download/@testing-library/dom-7.31.2.tgz#df361db38f5212b88555068ab8119f5d841a8c4a" @@ -5199,11 +5192,6 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" -csstype@^2.4.0: - version "2.6.17" - resolved "https://registry.nlark.com/csstype/download/csstype-2.6.17.tgz#4cf30eb87e1d1a005d8b6510f95292413f6a1c0e" - integrity sha1-TPMOuH4dGgBdi2UQ+VKSQT9qHA4= - csstype@^3.0.2: version "3.0.8" resolved "https://registry.nlark.com/csstype/download/csstype-3.0.8.tgz#d2266a792729fb227cd216fb572f43728e1ad340" @@ -6847,11 +6835,6 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" -free-style@2.6.1: - version "2.6.1" - resolved "https://registry.npm.taobao.org/free-style/download/free-style-2.6.1.tgz#6af512568291195854842cbbaacd95578a6a9a8b" - integrity sha1-avUSVoKRGVhUhCy7qs2VV4pqmos= - fresh@0.5.2, fresh@~0.5.2: version "0.5.2" resolved "https://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -13865,14 +13848,6 @@ typescript@^4.4.3: resolved "https://registry.npmmirror.com/typescript/download/typescript-4.4.3.tgz?cache=0&sync_timestamp=1632554372698&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ftypescript%2Fdownload%2Ftypescript-4.4.3.tgz#bdc5407caa2b109efd4f82fe130656f977a29324" integrity sha1-vcVAfKorEJ79T4L+EwZW+XeikyQ= -typestyle@2.0.4: - version "2.0.4" - resolved "https://registry.npm.taobao.org/typestyle/download/typestyle-2.0.4.tgz#b8da5feaf8a4f9d1f69066f3cc4659098bd08457" - integrity sha1-uNpf6vik+dH2kGbzzEZZCYvQhFc= - dependencies: - csstype "^2.4.0" - free-style "2.6.1" - ua-parser-js@^0.7.18: version "0.7.28" resolved "https://registry.nlark.com/ua-parser-js/download/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31" From 27f0d2d0c9e1c1f513e25ed79d31e209da5c3c97 Mon Sep 17 00:00:00 2001 From: Hao Chen <270001151@qq.com> Date: Thu, 17 Mar 2022 17:53:18 +0800 Subject: [PATCH 18/26] feat: more datasets --- apps/testServer/index.js | 56 +++++++++---------- .../frontend/src/pages/dataSource/config.ts | 40 +++++++++++-- .../frontend/src/pages/dataSource/index.tsx | 41 ++++++++++---- .../src/pages/dataSource/selection/demo.tsx | 2 +- .../frontend/src/store/dataSourceStore.ts | 14 +++++ packages/frontend/src/store/langStore.ts | 2 + .../frontend/src/store/pipeLineStore/lts.ts | 3 +- packages/frontend/src/workers/engine/core.ts | 3 + 8 files changed, 111 insertions(+), 50 deletions(-) diff --git a/apps/testServer/index.js b/apps/testServer/index.js index 5f965655..49ffc865 100644 --- a/apps/testServer/index.js +++ b/apps/testServer/index.js @@ -27,38 +27,32 @@ app.all("*", function (req, res, next) { } }); app.post("/associate", function (req, res) { - console.log("[/assocaite]", req); + // console.log("[/assocaite]", req); const fields = req.body.fields; - res.json({ - success: true, - data: { - t1: [ - { - dimensions: fields - .filter((f) => f.analyticType === "dimension") - .slice(0, 1) - .map((f) => f.fid), - measures: fields - .filter((f) => f.analyticType === "measure") - .slice(0, 1) - .map((f) => f.fid), - score: 2, - }, - { - dimensions: fields - .filter((f) => f.analyticType === "dimension") - .slice(1, 2) - .map((f) => f.fid), - measures: fields - .filter((f) => f.analyticType === "measure") - .slice(1, 2) - .map((f) => f.fid), - score: 1, - }, - ], - t2: [], - }, - }); + const returns = JSON.parse(fs.readFileSync('/Users/chenhao/Downloads/result(3).json').toString()) + const result1 = returns.data.t1; + for (let i = 0; i < result1.length; i++) { + result1[i].dimensions = result1[i].dimensions.map(d => { + const target = fields.find(f => f.fid.split('_')[1] === d.split('_')[1]); + return target.fid; + }).filter(f => Boolean(f)); + result1[i].measures = result1[i].measures.map(d => { + const target = fields.find(f => f.fid.split('_')[1] === d.split('_')[1]); + return target.fid; + }).filter(f => Boolean(f)); + } + const result2 = returns.data.t2; + for (let i = 0; i < result2.length; i++) { + result2[i].dimensions = result2[i].dimensions.map(d => { + const target = fields.find(f => f.fid.split('_')[1] === d.split('_')[1]); + return target.fid; + }).filter(f => Boolean(f)); + result2[i].measures = result2[i].measures.map(d => { + const target = fields.find(f => f.fid.split('_')[1] === d.split('_')[1]); + return target.fid; + }).filter(f => Boolean(f)); + } + res.json(returns); }); app.post("/start", function (req, res) { diff --git a/packages/frontend/src/pages/dataSource/config.ts b/packages/frontend/src/pages/dataSource/config.ts index 6ab716bd..daf1a3df 100644 --- a/packages/frontend/src/pages/dataSource/config.ts +++ b/packages/frontend/src/pages/dataSource/config.ts @@ -47,12 +47,22 @@ export const DemoDataAssets = process.env.NODE_ENV === 'production' ? { CARS: "https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-cars-service.json", STUDENTS: "https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-students-service.json", BTC_GOLD: "https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds_btc_gold_service.json", + BIKE_SHARING: 'https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-bikesharing-service.json', + CAR_SALES: 'https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-bikesharing-service.json', + COLLAGE: 'https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-collage-service.json', + TITANIC: 'https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-titanic-service.json', + KELPER: 'https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-kelper-service.json', } : { // CARS: "https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-cars-service.json", CARS: "http://localhost:3000/datasets/ds-cars-service.json", // STUDENTS: "https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-students-service.json", STUDENTS: "http://localhost:3000/datasets/ds-students-service.json", BTC_GOLD: "http://localhost:3000/datasets/ds_btc_gold_service.json", + BIKE_SHARING: 'http://localhost:3000/datasets/ds-bikesharing-service.json', + CAR_SALES: 'http://localhost:3000/datasets/ds-bikesharing-service.json', + COLLAGE: 'http://localhost:3000/datasets/ds-collage-service.json', + TITANIC: 'http://localhost:3000/datasets/ds-titanic-service.json', + KELPER: 'http://localhost:3000/datasets/ds-kelper-service.json', } as const; export type IDemoDataKey = keyof typeof DemoDataAssets; @@ -60,17 +70,37 @@ export type IDemoDataKey = keyof typeof DemoDataAssets; export const useDemoDataOptions = function (): Array<{key: IDemoDataKey; text: string}> { const options = useMemo>(() => { return [ - { - key: 'BTC_GOLD', - text: "2022MCM Problem C: Trading Strategies" - }, { key: "CARS", text: "Cars", }, { key: "STUDENTS", - text: "students" + text: "Students' Performance" + }, + { + key: "BIKE_SHARING", + text: "Bike Sharing" + }, + { + key: "CAR_SALES", + text: "Car Sales" + }, + { + key: "COLLAGE", + text: "Collage" + }, + { + key: "KELPER", + text: "NASA Kelper" + }, + { + key: 'BTC_GOLD', + text: "2022MCM Problem C: Trading Strategies" + }, + { + key: "TITANIC", + text: "Titanic" } ]; }, []); diff --git a/packages/frontend/src/pages/dataSource/index.tsx b/packages/frontend/src/pages/dataSource/index.tsx index 91dc3b72..958325e4 100644 --- a/packages/frontend/src/pages/dataSource/index.tsx +++ b/packages/frontend/src/pages/dataSource/index.tsx @@ -1,6 +1,6 @@ import React, { useCallback, useEffect, useMemo } from "react"; import intl from 'react-intl-universal' -import { ComboBox, PrimaryButton, Stack, DefaultButton, Dropdown, IDropdownOption, IContextualMenuProps, Toggle, IContextualMenuItem, IconButton } from 'office-ui-fabric-react'; +import { ComboBox, PrimaryButton, Stack, DefaultButton, Dropdown, IDropdownOption, IContextualMenuProps, Toggle, IContextualMenuItem, IconButton, Icon } from 'office-ui-fabric-react'; // import DataTable from '../../components/table'; import DataTable from './dataTable/index'; import MetaView from './metaView/index'; @@ -151,6 +151,20 @@ const DataSourceBoard: React.FC = (props) => { return analysisOptions.items[0] }, [hasResults, exploreMode, analysisOptions]) + const exportData = useCallback(() => { + const ds = dataSourceStore.exportDataAsDSService() + const content = JSON.stringify(ds); + const ele = document.createElement('a'); + ele.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(content)); + ele.setAttribute('download', 'dataset-service.json') + ele.style.display = 'none'; + document.body.appendChild(ele) + ele.click(); + + document.body.removeChild(ele); + + }, [dataSourceStore]) + // useEffect(() => { // console.log('meta update') // dataSourceStore.getFieldsMetas(); @@ -220,17 +234,20 @@ const DataSourceBoard: React.FC = (props) => {
- { - option && dataSourceStore.setCleanMethod(option.key as CleanMethod) - }} - /> + + { + option && dataSourceStore.setCleanMethod(option.key as CleanMethod) + }} + /> + download +

{intl.get('dataSource.tip')}

diff --git a/packages/frontend/src/pages/dataSource/selection/demo.tsx b/packages/frontend/src/pages/dataSource/selection/demo.tsx index 4d785ea0..9aabc995 100644 --- a/packages/frontend/src/pages/dataSource/selection/demo.tsx +++ b/packages/frontend/src/pages/dataSource/selection/demo.tsx @@ -48,7 +48,7 @@ function requestDemoData (dsKey: IDemoDataKey = 'CARS'): Promise { const DemoData: React.FC = props => { const { onDataLoaded, onClose, onStartLoading, onLoadingFailed } = props; const options = useDemoDataOptions(); - const [dsKey, setDSKey] = useState('BTC_GOLD'); + const [dsKey, setDSKey] = useState('CARS'); const loadData = useCallback(() => { onStartLoading(); diff --git a/packages/frontend/src/store/dataSourceStore.ts b/packages/frontend/src/store/dataSourceStore.ts index 6e8522df..29734277 100644 --- a/packages/frontend/src/store/dataSourceStore.ts +++ b/packages/frontend/src/store/dataSourceStore.ts @@ -281,6 +281,20 @@ export class DataSourceStore { } } + public exportDataAsDSService(): IDatasetBase { + const { cleanedData, fieldMetas } = this; + return { + dataSource: cleanedData, + fields: fieldMetas.map(f => ({ + name: f.name, + analyticType: f.analyticType, + semanticType: f.semanticType, + disable: f.disable, + fid: f.fid + })) + } + } + public importStore(state: IDataSourceStoreStorage) { this.rawData = state.rawData; this.mutFields = state.mutFields; diff --git a/packages/frontend/src/store/langStore.ts b/packages/frontend/src/store/langStore.ts index c0befd29..6614dd4a 100644 --- a/packages/frontend/src/store/langStore.ts +++ b/packages/frontend/src/store/langStore.ts @@ -17,6 +17,7 @@ export class LangStore { "Content-Type": "application/json", }, }); + localStorage.setItem('lang', lang); const result = await res.json(); await intl.init({ currentLocale: lang, @@ -36,6 +37,7 @@ export class LangStore { let currentLocale = intl.determineLocale({ urlLocaleKey: "lang", cookieLocaleKey: "lang", + localStorageLocaleKey: "lang" }); if (!SUPPORT_LANG.find((f) => f.value === currentLocale)) { currentLocale = SUPPORT_LANG[0].value; diff --git a/packages/frontend/src/store/pipeLineStore/lts.ts b/packages/frontend/src/store/pipeLineStore/lts.ts index 9e6a37c2..f1287188 100644 --- a/packages/frontend/src/store/pipeLineStore/lts.ts +++ b/packages/frontend/src/store/pipeLineStore/lts.ts @@ -139,7 +139,7 @@ export class LTSPipeLine { runInAction(() => { this.computing = false; }) - throw error; + // throw error; } } } @@ -200,6 +200,7 @@ export class LTSPipeLine { t2.sort((a, b) => b.score - a.score) const assSpacesT1: IVizSpace[] = []; const assSpacesT2: IVizSpace[] = []; + console.log(fieldMetas) for (let i = 0; i < t1.length; i++) { const view = await this.specify({ dimensions: t1[i].dimensions, diff --git a/packages/frontend/src/workers/engine/core.ts b/packages/frontend/src/workers/engine/core.ts index a83df551..a6749279 100644 --- a/packages/frontend/src/workers/engine/core.ts +++ b/packages/frontend/src/workers/engine/core.ts @@ -256,6 +256,9 @@ export class RathEngine extends VIEngine { } let conEnt = 0; // let tEnt = 0; + if (!fieldDictonary.has(mea)) { + continue; + } const totalCount = fieldDictonary.get(mea)!.features.size; const distList = localDist.map(r => ({ // TODO: 讨论是否应当直接使用count From 784f43598354973a3f5778869ab876e0a3bf35af Mon Sep 17 00:00:00 2001 From: Hao Chen <270001151@qq.com> Date: Fri, 18 Mar 2022 11:48:25 +0800 Subject: [PATCH 19/26] fix: graphic walker public dataset --- .../frontend/src/pages/dataSource/index.tsx | 4 +- packages/graphic-walker/package.json | 2 +- .../graphic-walker/src/dataSource/config.ts | 62 ++++++++++++++++ .../src/dataSource/dataSelection/csvData.tsx | 71 +++++++++++++++++++ .../src/dataSource/dataSelection/index.tsx | 40 +++++++++++ .../dataSource/dataSelection/publicData.tsx | 50 +++++++++++++ .../graphic-walker/src/dataSource/index.tsx | 6 +- packages/graphic-walker/src/insights.ts | 16 ++--- .../graphic-walker/src/store/commonStore.ts | 6 ++ .../src/store/visualSpecStore.ts | 20 +++++- yarn.lock | 10 --- 11 files changed, 263 insertions(+), 24 deletions(-) create mode 100644 packages/graphic-walker/src/dataSource/config.ts create mode 100644 packages/graphic-walker/src/dataSource/dataSelection/csvData.tsx create mode 100644 packages/graphic-walker/src/dataSource/dataSelection/index.tsx create mode 100644 packages/graphic-walker/src/dataSource/dataSelection/publicData.tsx diff --git a/packages/frontend/src/pages/dataSource/index.tsx b/packages/frontend/src/pages/dataSource/index.tsx index 958325e4..e3d95710 100644 --- a/packages/frontend/src/pages/dataSource/index.tsx +++ b/packages/frontend/src/pages/dataSource/index.tsx @@ -234,7 +234,7 @@ const DataSourceBoard: React.FC = (props) => {
- + = (props) => { option && dataSourceStore.setCleanMethod(option.key as CleanMethod) }} /> - download +

{intl.get('dataSource.tip')}

diff --git a/packages/graphic-walker/package.json b/packages/graphic-walker/package.json index a6d770a1..73ac9487 100644 --- a/packages/graphic-walker/package.json +++ b/packages/graphic-walker/package.json @@ -37,7 +37,7 @@ "vega": "^5.20.2", "vega-embed": "^6.18.2", "vega-lite": "^5.1.0", - "visual-insights": "0.7.3" + "visual-insights": "0.7.15" }, "devDependencies": { "@rollup/plugin-typescript": "^8.2.5", diff --git a/packages/graphic-walker/src/dataSource/config.ts b/packages/graphic-walker/src/dataSource/config.ts new file mode 100644 index 00000000..44eff64c --- /dev/null +++ b/packages/graphic-walker/src/dataSource/config.ts @@ -0,0 +1,62 @@ +export const DemoDataAssets = process.env.NODE_ENV === 'production' ? { + CARS: "https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-cars-service.json", + STUDENTS: "https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-students-service.json", + BTC_GOLD: "https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds_btc_gold_service.json", + BIKE_SHARING: 'https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-bikesharing-service.json', + CAR_SALES: 'https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-bikesharing-service.json', + COLLAGE: 'https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-collage-service.json', + TITANIC: 'https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-titanic-service.json', + KELPER: 'https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-kelper-service.json', +} : { + // CARS: "https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-cars-service.json", + CARS: "http://localhost:8080/api/ds-cars-service.json", + // STUDENTS: "https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-students-service.json", + STUDENTS: "http://localhost:8080/api/ds-students-service.json", + BTC_GOLD: "http://localhost:8080/api/ds_btc_gold_service.json", + BIKE_SHARING: 'http://localhost:8080/api/ds-bikesharing-service.json', + CAR_SALES: 'http://localhost:8080/api/ds-bikesharing-service.json', + COLLAGE: 'http://localhost:8080/api/ds-collage-service.json', + TITANIC: 'http://localhost:8080/api/ds-titanic-service.json', + KELPER: 'http://localhost:8080/api/ds-kelper-service.json', +} as const; + +interface IPublicData { + key: string; + title: string; + desc?: string; +} + +export const PUBLIC_DATA_LIST: IPublicData[] = [ + { + key: "CARS", + title: "Cars", + }, + { + key: "STUDENTS", + title: "Students' Performance" + }, + { + key: "BIKE_SHARING", + title: "Bike Sharing" + }, + { + key: "CAR_SALES", + title: "Car Sales" + }, + { + key: "COLLAGE", + title: "Collage" + }, + { + key: "KELPER", + title: "NASA Kelper" + }, + { + key: 'BTC_GOLD', + title: "2022MCM Problem C: Trading Strategies" + }, + { + key: "TITANIC", + title: "Titanic" + } +] \ No newline at end of file diff --git a/packages/graphic-walker/src/dataSource/dataSelection/csvData.tsx b/packages/graphic-walker/src/dataSource/dataSelection/csvData.tsx new file mode 100644 index 00000000..16283aa5 --- /dev/null +++ b/packages/graphic-walker/src/dataSource/dataSelection/csvData.tsx @@ -0,0 +1,71 @@ +import React, { useRef, useCallback } from 'react'; +import { FileReader } from '@kanaries/web-data-loader'; +import { Record } from '../../interfaces'; +import Table from '../table'; +import styled from 'styled-components'; +import { useGlobalStore } from '../../store'; +import { observer } from 'mobx-react-lite'; + +const Container = styled.div` + overflow-x: auto; +`; + +interface ICSVData { +} +const CSVData: React.FC = props => { + const fileRef = useRef(null); + const { commonStore } = useGlobalStore(); + const { tmpDSName, tmpDataSource } = commonStore; + + const onSubmitData = useCallback(() => { + commonStore.commitTempDS(); + }, []) + return ( + + { + const files = e.target.files; + if (files !== null) { + const file = files[0]; + FileReader.csvReader({ + file, + config: { type: 'reservoirSampling', size: Infinity }, + onLoading: () => {} + }).then((data) => { + commonStore.updateTempDS(data as Record[]); + }); + } + }} + /> +
+ + +
+
+ + { + commonStore.updateTempName(e.target.value) + }} + className="text-xs p-1 border border-gray-300 outline-none focus:outline-none focus:border-blue-500" + /> +
+ + + ); +} + +export default observer(CSVData); diff --git a/packages/graphic-walker/src/dataSource/dataSelection/index.tsx b/packages/graphic-walker/src/dataSource/dataSelection/index.tsx new file mode 100644 index 00000000..125abd07 --- /dev/null +++ b/packages/graphic-walker/src/dataSource/dataSelection/index.tsx @@ -0,0 +1,40 @@ +import React from 'react'; +import { useState } from 'react'; +import CSVData from './csvData'; +import PublicData from './publicData'; + +interface IDataSelectionProps { + +} + +const DataSelection: React.FC = props =>{ + const [sourceType, setSourceType] = useState<'file' | 'public'>('file') + return
+
+

Data Types

+
+
{ setSourceType('file'); }} + > + Text File Data +
+
{ setSourceType('public'); }} + > + Public Data +
+
+
+

Data Source Type [{sourceType}]

+
+ { + sourceType === 'file' && + } + { + sourceType === 'public' && + } +
+
+} + +export default DataSelection; diff --git a/packages/graphic-walker/src/dataSource/dataSelection/publicData.tsx b/packages/graphic-walker/src/dataSource/dataSelection/publicData.tsx new file mode 100644 index 00000000..1777e09e --- /dev/null +++ b/packages/graphic-walker/src/dataSource/dataSelection/publicData.tsx @@ -0,0 +1,50 @@ +import React from 'react'; +import Table from '../table'; +import { DemoDataAssets, PUBLIC_DATA_LIST } from '../config' +import { useGlobalStore } from '../../store'; +import { observer } from 'mobx-react-lite'; +interface IPublicDataProps { + +} + +const PublicData: React.FC = props => { + const { commonStore } = useGlobalStore(); + const { tmpDataSource } = commonStore; + return
+
+ { + PUBLIC_DATA_LIST.map(data =>
{ + fetch(DemoDataAssets[data.key]).then(res => res.json()) + .then(res => { + commonStore.updateTempSTDDS({ + dataSource: res.dataSource, + rawFields: res.fields.map(f => ({ + key: f.fid, + name: f.name, + analyticType: f.analyticType, + semanticType: f.semanticType, + dataType: f.dataType || '?' + })), + name: data.title + }) + }) + }} + className="border rounded border-gray-400 p-2 m-2 cursor-pointer hover:bg-gray-50" + > +
{data.title}
+ {/*

{data.title}

*/} +
) + } +
+
+ +
+
+ +} + +export default observer(PublicData); diff --git a/packages/graphic-walker/src/dataSource/index.tsx b/packages/graphic-walker/src/dataSource/index.tsx index 5670a846..066be28a 100644 --- a/packages/graphic-walker/src/dataSource/index.tsx +++ b/packages/graphic-walker/src/dataSource/index.tsx @@ -2,7 +2,8 @@ import { observer } from 'mobx-react-lite'; import React from 'react'; import { Container } from '../components/container'; import Modal from '../components/modal'; -import DataSourcePanel from './pannel'; +// import DataSourcePanel from './pannel'; +import DataSelection from './dataSelection'; import { useGlobalStore } from '../store'; import { CheckCircleIcon, RefreshIcon } from '@heroicons/react/outline'; @@ -39,7 +40,8 @@ const DataSourceSegment: React.FC = props => { title="创建数据源" onClose={() => { commonStore.setShowDSPanel(false) }} > - + + {/* */} )} { preWorkDone && } diff --git a/packages/graphic-walker/src/insights.ts b/packages/graphic-walker/src/insights.ts index 3981979e..f07cb4dc 100644 --- a/packages/graphic-walker/src/insights.ts +++ b/packages/graphic-walker/src/insights.ts @@ -147,7 +147,7 @@ export class DataExplainer { public explainValue(predicates: IPredicate[], dimensions: string[], measures: IMeasure[]): number[] { const measureNames = measures.map(m => m.key); const measureOps = measures.map(m => m.op); - const data = this.engine.cube.getCuboid(dimensions).getState(measureNames, measureOps); + const data = this.engine.cube.getCuboid(dimensions).getAggregatedRows(measureNames, measureOps); const selection = filterByPredicates(data, predicates); const cmps: number[] = []; for (let mea of measureNames) { @@ -176,7 +176,7 @@ export class DataExplainer { const parentCuboid = this.engine.cube.getCuboid(dimensions); const measureNames = measures.map(m => m.key); const ops = measures.map(m => m.op); - const parentData = filterByPredicates(parentCuboid.getState(measureNames, ops), predicates); + const parentData = filterByPredicates(parentCuboid.getAggregatedRows(measureNames, ops), predicates); // console.log(parentData) const knn = this.getGeneralizeKNN('dimension', dimensions, K_Neighbor, 0); @@ -184,7 +184,7 @@ export class DataExplainer { const outlierList: Array<{key: string; score: number; dimensions: string[]; measures: IMeasure[]}> = []; for (let extendDim of knn) { const cuboid = this.engine.cube.getCuboid([...dimensions, extendDim]); - const data = filterByPredicates(cuboid.getState(measureNames, ops), predicates); + const data = filterByPredicates(cuboid.getAggregatedRows(measureNames, ops), predicates); let groups: Map = new Map(); for (let record of data) { if (!groups.has(record[extendDim])) { @@ -214,8 +214,8 @@ export class DataExplainer { for (let extendDim of knn) { const parentCuboid = this.engine.cube.getCuboid([extendDim]) const cuboid = this.engine.cube.getCuboid([...dimensions, extendDim]) - const overallData = parentCuboid.getState(measureNames, ops); - const subData = filterByPredicates(cuboid.getState(measureNames, ops), predicates); + const overallData = parentCuboid.getAggregatedRows(measureNames, ops); + const subData = filterByPredicates(cuboid.getAggregatedRows(measureNames, ops), predicates); let outlierNormalization = normalizeWithParent(subData, overallData, measureNames, false); @@ -250,7 +250,7 @@ export class DataExplainer { for (let op of this.defaultAggs) { const extendMeasureOps = knn.map(() => op); const normalizedState = normalizeByMeasures( - cuboid.getState(allMeasureNames, [...ops, ...extendMeasureOps]), + cuboid.getAggregatedRows(allMeasureNames, [...ops, ...extendMeasureOps]), allMeasureNames ); for (let extendMea of allMeasureNames) { @@ -270,7 +270,7 @@ export class DataExplainer { if (intMeasures.length === 0) continue; if (originMeasure) { const norStateWithNewOp = normalizeByMeasures( - cuboid.getState([extendMea], [op]), + cuboid.getAggregatedRows([extendMea], [op]), [extendMea] ) const mergedDataSource = normalizedState.map((record, rIndex) => { @@ -399,7 +399,7 @@ export class DataExplainer { const allMeasures = [...space.measures, ...space.extendMs]; return { schema: engine.specification(visSpace).schema, - dataView: engine.cube.getCuboid([...space.dimensions, ...space.extendDs]).getState(allMeasures.map(m => m.key), allMeasures.map(m => m.op)) + dataView: engine.cube.getCuboid([...space.dimensions, ...space.extendDs]).getAggregatedRows(allMeasures.map(m => m.key), allMeasures.map(m => m.op)) }; }) } diff --git a/packages/graphic-walker/src/store/commonStore.ts b/packages/graphic-walker/src/store/commonStore.ts index 179d5c37..b8169f21 100644 --- a/packages/graphic-walker/src/store/commonStore.ts +++ b/packages/graphic-walker/src/store/commonStore.ts @@ -87,6 +87,12 @@ export class CommonStore { this.tmpDSRawFields = result.fields; } + public updateTempSTDDS (dataset: IDataSetInfo) { + this.tmpDataSource = dataset.dataSource; + this.tmpDSRawFields = dataset.rawFields; + this.tmpDSName = dataset.name; + } + public commitTempDS () { const { tmpDSName, tmpDSRawFields, tmpDataSource } = this; this.addAndUseDS({ diff --git a/packages/graphic-walker/src/store/visualSpecStore.ts b/packages/graphic-walker/src/store/visualSpecStore.ts index 469f46f6..c9a69cf0 100644 --- a/packages/graphic-walker/src/store/visualSpecStore.ts +++ b/packages/graphic-walker/src/store/visualSpecStore.ts @@ -28,6 +28,21 @@ export const MetaFieldKeys: Array = [ 'fields' ] +const CHANNEL_LIMIT = { + rows: Infinity, + columns: Infinity, + color: 1, + opacity: 1, + size: 1, +} + +function getChannelSizeLimit (channel: string): number { + if (typeof CHANNEL_LIMIT[channel] === 'undefined') return 0; + return CHANNEL_LIMIT[channel]; +} + + + function geomAdapter (geom: string) { switch (geom) { case 'interval': @@ -164,7 +179,10 @@ export class VizSpecStore { [movingField] = this.draggableFieldState[sourceKey].splice(sourceIndex, 1); } if (MetaFieldKeys.includes(destinationKey))return; - this.draggableFieldState[destinationKey].splice(destinationIndex, 0, movingField) + const limitSize = getChannelSizeLimit(destinationKey); + const fixedDestinationIndex = Math.min(destinationIndex, limitSize - 1); + const overflowSize = Math.max(0, this.draggableFieldState[destinationKey].length + 1 - limitSize); + this.draggableFieldState[destinationKey].splice(fixedDestinationIndex, overflowSize, movingField) } public removeField(sourceKey: keyof DraggableFieldState, sourceIndex: number) { if (MetaFieldKeys.includes(sourceKey))return; diff --git a/yarn.lock b/yarn.lock index f8d41283..6b54df5a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14593,16 +14593,6 @@ visual-insights@0.7.15: cube-core "^2.13.0" simple-statistics "^7.1.0" -visual-insights@0.7.3: - version "0.7.3" - resolved "https://registry.npmmirror.com/visual-insights/download/visual-insights-0.7.3.tgz#5c1520a916602e43a9097d70558e1d04afed6785" - integrity sha1-XBUgqRZgLkOpCX1wVY4dBK/tZ4U= - dependencies: - assert "^2.0.0" - axios "^0.22.0" - cube-core "^2.13.0" - simple-statistics "^7.1.0" - vite@^2.4.4: version "2.5.0" resolved "https://registry.nlark.com/vite/download/vite-2.5.0.tgz?cache=0&sync_timestamp=1629090689000&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvite%2Fdownload%2Fvite-2.5.0.tgz#111ba3679432d426e44566acf480005a7914cbd6" From 9d69c72ce31cd6b8a9c415973714d9f6101a7501 Mon Sep 17 00:00:00 2001 From: Hao Chen <270001151@qq.com> Date: Fri, 18 Mar 2022 14:56:00 +0800 Subject: [PATCH 20/26] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dgraphic-walker?= =?UTF-8?q?=E8=A7=A3=E9=87=8A=E5=99=A8bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 顺便加了一点小样式 --- .../src/InsightBoard/mainBoard.tsx | 31 ++++++++++++------- .../src/InsightBoard/std2vegaSpec.ts | 1 + .../graphic-walker/src/renderer/index.tsx | 1 - .../src/store/visualSpecStore.ts | 6 ++-- .../src/vis/future-react-vega.tsx | 1 - 5 files changed, 24 insertions(+), 16 deletions(-) diff --git a/packages/graphic-walker/src/InsightBoard/mainBoard.tsx b/packages/graphic-walker/src/InsightBoard/mainBoard.tsx index 90626222..db3f8aa0 100644 --- a/packages/graphic-walker/src/InsightBoard/mainBoard.tsx +++ b/packages/graphic-walker/src/InsightBoard/mainBoard.tsx @@ -120,29 +120,38 @@ const InsightMainBoard: React.FC = props => { } }, [visIndex, recSpaces, visSpaces, fieldsWithType, dataSource]) - const FilterDesc = useMemo(() => { + const FilterDesc = useMemo(() => { if (filters) { const dimValues = Object.keys(filters) .filter(k => filters[k].length > 0) - .map((k) => { - return `${k}=${filters[k]}`; + .map((k, ki) => { + return
+
{k}
+
=
+
{filters[k]}
+
}); - return `选中对象${dimValues.join(', ')}的数据`; + return dimValues } - return '' + return [] }, [filters]) - const valueDesc = useMemo(() => { - const meaStatus = valueExp.map( - (mea) => `${mea.key}(${mea.op})的取值${mea.score === 1 ? '大于' : '小于'}预期` + const valueDesc = useMemo(() => { + const meaStatus = valueExp.map((mea, mi) => +
+ {mea.key}({mea.op})的取值{mea.score === 1 ? '大于' : '小于'}预期 +
); - return meaStatus.join(', '); + return meaStatus }, [valueExp]) return (
-

- {FilterDesc}, {valueDesc} +

+ {FilterDesc} +

+

+ {valueDesc}

{loading && (
diff --git a/packages/graphic-walker/src/InsightBoard/std2vegaSpec.ts b/packages/graphic-walker/src/InsightBoard/std2vegaSpec.ts index 9ae1cf41..c658c28d 100644 --- a/packages/graphic-walker/src/InsightBoard/std2vegaSpec.ts +++ b/packages/graphic-walker/src/InsightBoard/std2vegaSpec.ts @@ -166,6 +166,7 @@ export function baseVis( spec = { ...spec, layer: [basicSpec, basicSpecFilter], + "resolve": {"scale": {"y": "independent"}} }; } return spec; diff --git a/packages/graphic-walker/src/renderer/index.tsx b/packages/graphic-walker/src/renderer/index.tsx index aa8f212b..91f12a7b 100644 --- a/packages/graphic-walker/src/renderer/index.tsx +++ b/packages/graphic-walker/src/renderer/index.tsx @@ -19,7 +19,6 @@ const ReactiveRenderer: React.FC = props => { const onGeomClick = useCallback((values: any, e: any) => { runInAction(() => { commonStore.showEmbededMenu([e.pageX, e.pageY]) - console.log({ values }) commonStore.setFilters(values); }) }, []) diff --git a/packages/graphic-walker/src/store/visualSpecStore.ts b/packages/graphic-walker/src/store/visualSpecStore.ts index c9a69cf0..a51cb075 100644 --- a/packages/graphic-walker/src/store/visualSpecStore.ts +++ b/packages/graphic-walker/src/store/visualSpecStore.ts @@ -122,7 +122,7 @@ export class VizSpecStore { (Object.keys(state) as (keyof DraggableFieldState)[]) .filter(dkey => !MetaFieldKeys.includes(dkey)) .forEach(dkey => { - fields.push(...draggableFieldState[dkey].filter(f => f.type === 'D')) + fields.push(...state[dkey].filter(f => f.type === 'D')) }) return fields; } @@ -134,9 +134,9 @@ export class VizSpecStore { const state = toJS(draggableFieldState); const fields: IViewField[] = []; (Object.keys(state) as (keyof DraggableFieldState)[]) - .filter(dkey => MetaFieldKeys.includes(dkey)) + .filter(dkey => !MetaFieldKeys.includes(dkey)) .forEach(dkey => { - fields.push(...draggableFieldState[dkey].filter(f => f.type === 'M')) + fields.push(...state[dkey].filter(f => f.type === 'M')) }) return fields; } diff --git a/packages/graphic-walker/src/vis/future-react-vega.tsx b/packages/graphic-walker/src/vis/future-react-vega.tsx index 3e396288..bfb7b0ae 100644 --- a/packages/graphic-walker/src/vis/future-react-vega.tsx +++ b/packages/graphic-walker/src/vis/future-react-vega.tsx @@ -158,7 +158,6 @@ const ReactVega: React.FC = props => { // spec.encoding = singleView.encoding; } else { spec.concat = []; - console.log('latest', rowRepeatFields, colRepeatFields, rowDims, colDims.slice(-1)) for (let i = 0; i < rowRepeatFields.length; i++) { for (let j = 0; j < colRepeatFields.length; j++) { const singleView = getSingleView( From 8e7217a44a4d3e4c44b351200d4205e89fcc7c8f Mon Sep 17 00:00:00 2001 From: Hao Chen <270001151@qq.com> Date: Sun, 20 Mar 2022 15:53:34 +0800 Subject: [PATCH 21/26] =?UTF-8?q?fix:=20autoMark=20=E5=8F=AF=E7=94=A8?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 涉及到一些interface 的调整 --- .../frontend/src/pages/dataSource/config.ts | 4 +- packages/graphic-walker/package.json | 6 +- .../src/Fields/datasetFields/dimFields.tsx | 4 +- .../src/Fields/datasetFields/meaFields.tsx | 4 +- .../src/InsightBoard/mainBoard.tsx | 18 +- .../src/components/dataTypeIcon.tsx | 6 +- packages/graphic-walker/src/config.ts | 4 + .../graphic-walker/src/dataSource/config.ts | 4 +- .../dataSource/dataSelection/publicData.tsx | 2 +- .../graphic-walker/src/dataSource/table.tsx | 18 +- .../graphic-walker/src/dataSource/utils.ts | 2 +- packages/graphic-walker/src/interfaces.ts | 41 +- .../graphic-walker/src/store/commonStore.ts | 3 +- .../src/store/visualSpecStore.ts | 40 +- packages/graphic-walker/src/utils/autoMark.ts | 34 ++ .../src/vis/future-react-vega.tsx | 20 +- .../graphic-walker/src/vis/react-vega.tsx | 154 +++-- yarn.lock | 536 +++++++++++++++++- 18 files changed, 758 insertions(+), 142 deletions(-) create mode 100644 packages/graphic-walker/src/utils/autoMark.ts diff --git a/packages/frontend/src/pages/dataSource/config.ts b/packages/frontend/src/pages/dataSource/config.ts index daf1a3df..4346f006 100644 --- a/packages/frontend/src/pages/dataSource/config.ts +++ b/packages/frontend/src/pages/dataSource/config.ts @@ -48,7 +48,7 @@ export const DemoDataAssets = process.env.NODE_ENV === 'production' ? { STUDENTS: "https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-students-service.json", BTC_GOLD: "https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds_btc_gold_service.json", BIKE_SHARING: 'https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-bikesharing-service.json', - CAR_SALES: 'https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-bikesharing-service.json', + CAR_SALES: 'https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-carsales-service.json', COLLAGE: 'https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-collage-service.json', TITANIC: 'https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-titanic-service.json', KELPER: 'https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-kelper-service.json', @@ -59,7 +59,7 @@ export const DemoDataAssets = process.env.NODE_ENV === 'production' ? { STUDENTS: "http://localhost:3000/datasets/ds-students-service.json", BTC_GOLD: "http://localhost:3000/datasets/ds_btc_gold_service.json", BIKE_SHARING: 'http://localhost:3000/datasets/ds-bikesharing-service.json', - CAR_SALES: 'http://localhost:3000/datasets/ds-bikesharing-service.json', + CAR_SALES: 'http://localhost:3000/datasets/ds-carsales-service.json', COLLAGE: 'http://localhost:3000/datasets/ds-collage-service.json', TITANIC: 'http://localhost:3000/datasets/ds-titanic-service.json', KELPER: 'http://localhost:3000/datasets/ds-kelper-service.json', diff --git a/packages/graphic-walker/package.json b/packages/graphic-walker/package.json index 73ac9487..6a2eae62 100644 --- a/packages/graphic-walker/package.json +++ b/packages/graphic-walker/package.json @@ -34,9 +34,9 @@ "styled-components": "^5.3.0", "tailwindcss": "^2.2.15", "uuid": "^8.3.2", - "vega": "^5.20.2", - "vega-embed": "^6.18.2", - "vega-lite": "^5.1.0", + "vega": "^5.22.0", + "vega-embed": "^6.20.8", + "vega-lite": "^5.2.0", "visual-insights": "0.7.15" }, "devDependencies": { diff --git a/packages/graphic-walker/src/Fields/datasetFields/dimFields.tsx b/packages/graphic-walker/src/Fields/datasetFields/dimFields.tsx index e516ca3a..6a62eab3 100644 --- a/packages/graphic-walker/src/Fields/datasetFields/dimFields.tsx +++ b/packages/graphic-walker/src/Fields/datasetFields/dimFields.tsx @@ -23,11 +23,11 @@ const DimFields: React.FC = props => { {...provided.draggableProps} {...provided.dragHandleProps} > - {f.name}  + {f.name} 
{
- {f.name}  + {f.name} 
} diff --git a/packages/graphic-walker/src/Fields/datasetFields/meaFields.tsx b/packages/graphic-walker/src/Fields/datasetFields/meaFields.tsx index 3bc35b26..04af4195 100644 --- a/packages/graphic-walker/src/Fields/datasetFields/meaFields.tsx +++ b/packages/graphic-walker/src/Fields/datasetFields/meaFields.tsx @@ -23,11 +23,11 @@ const MeaFields: React.FC = props => { {...provided.draggableProps} {...provided.dragHandleProps} > - {f.name}  + {f.name}  {
- {f.name}  + {f.name} 
} diff --git a/packages/graphic-walker/src/InsightBoard/mainBoard.tsx b/packages/graphic-walker/src/InsightBoard/mainBoard.tsx index db3f8aa0..189a6175 100644 --- a/packages/graphic-walker/src/InsightBoard/mainBoard.tsx +++ b/packages/graphic-walker/src/InsightBoard/mainBoard.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useState, useMemo, useRef } from 'react'; -import { Record, Field, Filters, IMeasure } from '../interfaces'; +import { Record, IField, Filters, IMeasure } from '../interfaces'; import { Insight, Utils, UnivariateSummary } from 'visual-insights'; import { baseVis, IReasonType } from './std2vegaSpec'; import embed from 'vega-embed'; @@ -25,10 +25,10 @@ interface SubSpace { interface InsightMainBoardProps { dataSource: Record[]; - fields: Field[]; + fields: IField[]; filters?: Filters; - viewDs: Field[]; - viewMs: Field[]; + viewDs: IField[]; + viewMs: IField[]; } const InsightMainBoard: React.FC = props => { const { dataSource, fields, viewDs, viewMs, filters } = props; @@ -42,13 +42,13 @@ const InsightMainBoard: React.FC = props => { const dimsWithTypes = useMemo(() => { const dimensions = fields .filter((f) => f.type === 'D') - .map((f) => f.id) + .map((f) => f.fid) .filter((f) => !Utils.isFieldUnique(dataSource, f)); return UnivariateSummary.getAllFieldTypes(dataSource, dimensions); }, [fields, dataSource]) const measWithTypes = useMemo(() => { - const measures = fields.filter((f) => f.type === 'M').map((f) => f.id); + const measures = fields.filter((f) => f.type === 'M').map((f) => f.fid); return measures.map((m) => ({ name: m, type: 'quantitative', @@ -57,12 +57,12 @@ const InsightMainBoard: React.FC = props => { useEffect(() => { if (dimsWithTypes.length > 0 && measWithTypes.length > 0 && dataSource.length > 0) { - const measures = fields.filter((f) => f.type === 'M').map((f) => f.id); + const measures = fields.filter((f) => f.type === 'M').map((f) => f.fid); const dimensions = dimsWithTypes.map(d => d.name); const currentSpace: SubSpace = { - dimensions: viewDs.map((f) => f.id), + dimensions: viewDs.map((f) => f.fid), measures: viewMs.map((f) => ({ - key: f.id, + key: f.fid, op: f.aggName as any })), }; diff --git a/packages/graphic-walker/src/components/dataTypeIcon.tsx b/packages/graphic-walker/src/components/dataTypeIcon.tsx index bc8506b8..c756aee8 100644 --- a/packages/graphic-walker/src/components/dataTypeIcon.tsx +++ b/packages/graphic-walker/src/components/dataTypeIcon.tsx @@ -2,11 +2,11 @@ import React from 'react'; import { IMutField } from "../interfaces"; import { DocumentTextIcon, HashtagIcon } from '@heroicons/react/outline'; -const DataTypeIcon: React.FC<{dataType: IMutField['dataType']}> = props => { +const DataTypeIcon: React.FC<{dataType: IMutField['semanticType']}> = props => { const { dataType } = props; switch (dataType) { - case 'integer': - case 'number': + case 'quantitative': + case 'ordinal': return default: return diff --git a/packages/graphic-walker/src/config.ts b/packages/graphic-walker/src/config.ts index 8c362355..18858538 100644 --- a/packages/graphic-walker/src/config.ts +++ b/packages/graphic-walker/src/config.ts @@ -1,4 +1,8 @@ export const GEMO_TYPES = [ + { + value: 'auto', + label: '自动' + }, { value: 'bar', label: '矩形', diff --git a/packages/graphic-walker/src/dataSource/config.ts b/packages/graphic-walker/src/dataSource/config.ts index 44eff64c..05816616 100644 --- a/packages/graphic-walker/src/dataSource/config.ts +++ b/packages/graphic-walker/src/dataSource/config.ts @@ -3,7 +3,7 @@ export const DemoDataAssets = process.env.NODE_ENV === 'production' ? { STUDENTS: "https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-students-service.json", BTC_GOLD: "https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds_btc_gold_service.json", BIKE_SHARING: 'https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-bikesharing-service.json', - CAR_SALES: 'https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-bikesharing-service.json', + CAR_SALES: 'https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-carsales-service.json', COLLAGE: 'https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-collage-service.json', TITANIC: 'https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-titanic-service.json', KELPER: 'https://chspace.oss-cn-hongkong.aliyuncs.com/api/ds-kelper-service.json', @@ -14,7 +14,7 @@ export const DemoDataAssets = process.env.NODE_ENV === 'production' ? { STUDENTS: "http://localhost:8080/api/ds-students-service.json", BTC_GOLD: "http://localhost:8080/api/ds_btc_gold_service.json", BIKE_SHARING: 'http://localhost:8080/api/ds-bikesharing-service.json', - CAR_SALES: 'http://localhost:8080/api/ds-bikesharing-service.json', + CAR_SALES: 'http://localhost:8080/api/ds-carsales-service.json', COLLAGE: 'http://localhost:8080/api/ds-collage-service.json', TITANIC: 'http://localhost:8080/api/ds-titanic-service.json', KELPER: 'http://localhost:8080/api/ds-kelper-service.json', diff --git a/packages/graphic-walker/src/dataSource/dataSelection/publicData.tsx b/packages/graphic-walker/src/dataSource/dataSelection/publicData.tsx index 1777e09e..af4d17c6 100644 --- a/packages/graphic-walker/src/dataSource/dataSelection/publicData.tsx +++ b/packages/graphic-walker/src/dataSource/dataSelection/publicData.tsx @@ -20,7 +20,7 @@ const PublicData: React.FC = props => { commonStore.updateTempSTDDS({ dataSource: res.dataSource, rawFields: res.fields.map(f => ({ - key: f.fid, + fid: f.fid, name: f.name, analyticType: f.analyticType, semanticType: f.semanticType, diff --git a/packages/graphic-walker/src/dataSource/table.tsx b/packages/graphic-walker/src/dataSource/table.tsx index de4b1c86..143ba78c 100644 --- a/packages/graphic-walker/src/dataSource/table.tsx +++ b/packages/graphic-walker/src/dataSource/table.tsx @@ -59,9 +59,9 @@ const TYPE_LIST = [ label: '度量' } ]; -function getCellType(field: IMutField): 'number' | 'text' { - return field.dataType === 'number' || field.dataType === 'integer' ? 'number' : 'text'; -} +// function getCellType(field: IMutField): 'number' | 'text' { +// return field.dataType === 'number' || field.dataType === 'integer' ? 'number' : 'text'; +// } function getHeaderType(field: IMutField): 'number' | 'text' { return field.analyticType === 'dimension'? 'text' : 'number'; } @@ -77,13 +77,13 @@ const Table: React.FC = props => {
{tmpDSRawFields.map((field, fIndex) => ( - {tmpDSRawFields.map((field) => ( ))} diff --git a/packages/graphic-walker/src/dataSource/utils.ts b/packages/graphic-walker/src/dataSource/utils.ts index a6c86ff0..3909b517 100644 --- a/packages/graphic-walker/src/dataSource/utils.ts +++ b/packages/graphic-walker/src/dataSource/utils.ts @@ -39,7 +39,7 @@ export function transData(dataSource: Record[]): { return { dataSource: ans, fields: fields.map(f => ({ - key: f.key, + fid: f.key, analyticType: f.analyticType, dataType: f.dataType, semanticType: f.semanticType diff --git a/packages/graphic-walker/src/interfaces.ts b/packages/graphic-walker/src/interfaces.ts index 24beb180..5659f181 100644 --- a/packages/graphic-walker/src/interfaces.ts +++ b/packages/graphic-walker/src/interfaces.ts @@ -1,6 +1,6 @@ import { StatFuncName } from "visual-insights/build/esm/statistics"; import { AggFC } from 'cube-core/built/types'; -import { IMutField as VIMutField } from 'visual-insights'; +import { IAnalyticType, IMutField as VIMutField, ISemanticType } from 'visual-insights'; export interface Record { [key: string]: any; } @@ -11,19 +11,19 @@ export interface Filters { [key: string]: any[]; } -export interface IField { - key: string; - type: string; - analyticType: 'dimension' | 'measure'; -} - -export type IMutField = VIMutField; +export interface IMutField { + fid: string; + name?: string; + disable?: boolean; + semanticType: ISemanticType; + analyticType: IAnalyticType; +}; -export interface Field { +export interface IField { /** - * id: key in data record + * fid: key in data record */ - id: string; + fid: string; /** * display name for field */ @@ -33,15 +33,16 @@ export interface Field { */ aggName?: string; type: 'D' | 'M'; - [key: string]: any; + semanticType: ISemanticType; + analyticType: IAnalyticType; cmp?: (a: any, b: any) => number; } -export interface IViewField extends Field { +export interface IViewField extends IField { dragId: string; } -export interface Measure extends Field { +export interface Measure extends IField { aggregator?: AggFC; minWidth?: number; formatter?: (value: number | undefined) => number | string; @@ -85,12 +86,12 @@ export interface IDataSource { data: Record[] } export interface DraggableFieldState { - fields: Field[]; - rows: Field[]; - columns: Field[]; - color: Field[]; - opacity: Field[]; - size: Field[]; + fields: IField[]; + rows: IField[]; + columns: IField[]; + color: IField[]; + opacity: IField[]; + size: IField[]; } export interface IDraggableStateKey { diff --git a/packages/graphic-walker/src/store/commonStore.ts b/packages/graphic-walker/src/store/commonStore.ts index b8169f21..997d6249 100644 --- a/packages/graphic-walker/src/store/commonStore.ts +++ b/packages/graphic-walker/src/store/commonStore.ts @@ -1,7 +1,6 @@ import { DataSet, Filters, IDataSet, IDataSetInfo, IDataSource, IMutField, Record } from '../interfaces'; import { makeAutoObservable, observable } from 'mobx'; import { transData } from '../dataSource/utils'; -import { GEMO_TYPES } from '../config'; interface VisualConfig { defaultAggregated: boolean; @@ -70,7 +69,7 @@ export class CommonStore { } public updateTempFieldAnalyticType (fieldKey: string, analyticType: IMutField['analyticType']) { - const field = this.tmpDSRawFields.find(f => f.key === fieldKey); + const field = this.tmpDSRawFields.find(f => f.fid === fieldKey); if (field) { field.analyticType = analyticType; } diff --git a/packages/graphic-walker/src/store/visualSpecStore.ts b/packages/graphic-walker/src/store/visualSpecStore.ts index a51cb075..ba0ba04f 100644 --- a/packages/graphic-walker/src/store/visualSpecStore.ts +++ b/packages/graphic-walker/src/store/visualSpecStore.ts @@ -84,32 +84,48 @@ export class VizSpecStore { size: [] } makeAutoObservable(this); + // FIXME!!!!! this.reactions.push(reaction(() => commonStore.currentDataset, (dataset) => { this.initState(); this.draggableFieldState.fields = dataset.rawFields.map((f) => ({ dragId: uuidv4(), - id: f.key, - name: f.name || f.key, + fid: f.fid, + name: f.name || f.fid, type: f.analyticType === 'dimension' ? 'D' : 'M', aggName: f.analyticType === 'measure' ? 'sum' : undefined, + analyticType: f.analyticType, + semanticType: f.semanticType })) this.draggableFieldState.dimensions = dataset.rawFields .filter(f => f.analyticType === 'dimension') .map((f) => ({ dragId: uuidv4(), - id: f.key, - name: f.name || f.key, + fid: f.fid, + name: f.name || f.fid, + semanticType: f.semanticType, + analyticType: f.analyticType, type: 'D' })) this.draggableFieldState.measures = dataset.rawFields .filter(f => f.analyticType === 'measure') .map((f) => ({ dragId: uuidv4(), - id: f.key, - name: f.name || f.key, + fid: f.fid, + name: f.name || f.fid, + analyticType: f.analyticType, + semanticType: f.semanticType, type: 'M', aggName: 'sum' })) + this.draggableFieldState.measures.push({ + dragId: uuidv4(), + fid: '', + name: '记录数', + analyticType: 'measure', + semanticType: 'quantitative', + type: 'M', + aggName: 'count' + }) })) } /** @@ -212,21 +228,21 @@ export class VizSpecStore { if (spec.facets && spec.facets.length > 0) { const facets = (spec.facets || []).concat(spec.highFacets || []); for (let facet of facets) { - this.appendField('rows', fields.find(f => f.id === facet)); + this.appendField('rows', fields.find(f => f.fid === facet)); } } if (spec.position && spec.position.length > 1) { - this.appendField('rows', fields.find(f => f.id === spec.position![1])); - this.appendField('columns', fields.find(f => f.id === spec.position![0])); + this.appendField('rows', fields.find(f => f.fid === spec.position![1])); + this.appendField('columns', fields.find(f => f.fid === spec.position![0])); } if (spec.color && spec.color.length > 0) { - this.appendField('color', fields.find(f => f.id === spec.color![0])); + this.appendField('color', fields.find(f => f.fid === spec.color![0])); } if (spec.size && spec.size.length > 0) { - this.appendField('size', fields.find(f => f.id === spec.size![0])); + this.appendField('size', fields.find(f => f.fid === spec.size![0])); } if (spec.opacity && spec.opacity.length > 0) { - this.appendField('opacity', fields.find(f => f.id === spec.opacity![0])); + this.appendField('opacity', fields.find(f => f.fid === spec.opacity![0])); } } diff --git a/packages/graphic-walker/src/utils/autoMark.ts b/packages/graphic-walker/src/utils/autoMark.ts new file mode 100644 index 00000000..1b518a35 --- /dev/null +++ b/packages/graphic-walker/src/utils/autoMark.ts @@ -0,0 +1,34 @@ +import { ISemanticType } from "visual-insights"; + +/** + * + * @param semanticTypeList semanticTypeList.length <= 2,调用时,手动将columns 和 rows的最后一个元素组合传进来 + * @returns geom(mark) type + */ +export function autoMark(semanticTypeList: ISemanticType[]): string { + if (semanticTypeList.length < 2) { + if (semanticTypeList[0] === 'temporal') return 'tick' + return 'bar' + } + const couter: Map = new Map(); + (['nominal', 'ordinal', 'quantitative', 'temporal'] as ISemanticType[]).forEach(s => { + couter.set(s, 0) + }) + for (let st of semanticTypeList) { + // if (!couter.has(st)) { + // couter.set(st, 0); + // } + couter.set(st, couter.get(st)! + 1); + } + if (couter.get('nominal') === 1 || couter.get('ordinal') === 1) { + return 'bar' + } + if (couter.get('temporal') === 1 && couter.get('quantitative') === 1) { + return 'line' + } + if (couter.get('quantitative') === 2) { + return 'point' + } + return 'point' + // if (cou) +} \ No newline at end of file diff --git a/packages/graphic-walker/src/vis/future-react-vega.tsx b/packages/graphic-walker/src/vis/future-react-vega.tsx index bfb7b0ae..bcbb6c53 100644 --- a/packages/graphic-walker/src/vis/future-react-vega.tsx +++ b/packages/graphic-walker/src/vis/future-react-vega.tsx @@ -21,8 +21,10 @@ interface ReactVegaProps { onGeomClick?: (values: any, e: any) => void } const NULL_FIELD: Field = { - id: '', + fid: '', name: '', + semanticType: 'quantitative', + analyticType: 'measure', aggName: 'sum', type: 'D' } @@ -47,7 +49,7 @@ function getSingleView(xField: Field, yField: Field, color: Field, opacity: Fiel mark: geomType, encoding: { x: { - field: xField.id, + field: xField.fid, type: getFieldType(xField), aggregate: xField.type === 'M' && @@ -55,7 +57,7 @@ function getSingleView(xField: Field, yField: Field, color: Field, opacity: Fiel (xField.aggName as any), }, y: { - field: yField.id, + field: yField.fid, type: getFieldType(yField), aggregate: yField.type === 'M' && @@ -63,23 +65,23 @@ function getSingleView(xField: Field, yField: Field, color: Field, opacity: Fiel (yField.aggName as any), }, row: row !== NULL_FIELD ? { - field: row.id, + field: row.fid, type: getFieldType(row), } : undefined, column: col !== NULL_FIELD ? { - field: col.id, + field: col.fid, type: getFieldType(col), } : undefined, color: color !== NULL_FIELD ? { - field: color.id, + field: color.fid, type: getFieldType(color) } : undefined, opacity: opacity !== NULL_FIELD ? { - field: opacity.id, + field: opacity.fid, type: getFieldType(opacity) } : undefined, size: size !== NULL_FIELD ? { - field: size.id, + field: size.fid, type: getFieldType(size) } : undefined } @@ -129,7 +131,7 @@ const ReactVega: React.FC = props => { const rowRepeatField = rowRepeatFields.length > 0 ? rowRepeatFields[rowRepeatFields.length - 1] : NULL_FIELD; const colRepeatField = colRepeatFields.length > 0 ? colRepeatFields[colRepeatFields.length - 1] : NULL_FIELD; - const dimensions = [...rows, ...columns, color, opacity, size].filter(f => Boolean(f)).map(f => (f as Field).id) + const dimensions = [...rows, ...columns, color, opacity, size].filter(f => Boolean(f)).map(f => (f as Field).fid) const spec: any = { data: { diff --git a/packages/graphic-walker/src/vis/react-vega.tsx b/packages/graphic-walker/src/vis/react-vega.tsx index ca59a49a..2893b9da 100644 --- a/packages/graphic-walker/src/vis/react-vega.tsx +++ b/packages/graphic-walker/src/vis/react-vega.tsx @@ -1,26 +1,30 @@ import React, { useEffect, useState, useMemo } from 'react'; -import { Field, Record } from '../interfaces'; +import { IField, Record } from '../interfaces'; import embed from 'vega-embed'; import { Subject } from 'rxjs' import * as op from 'rxjs/operators'; import { ScenegraphEvent } from 'vega'; +import { autoMark } from '../utils/autoMark'; +import { ISemanticType } from 'visual-insights'; const SELECTION_NAME = 'geom'; interface ReactVegaProps { - rows: Field[]; - columns: Field[]; + rows: IField[]; + columns: IField[]; dataSource: Record[]; defaultAggregate?: boolean; defaultStack?: boolean; geomType: string; - color?: Field; - opacity?: Field; - size?: Field; + color?: IField; + opacity?: IField; + size?: IField; onGeomClick?: (values: any, e: any) => void } -const NULL_FIELD: Field = { - id: '', +const NULL_FIELD: IField = { + fid: '', name: '', + semanticType: 'quantitative', + analyticType: 'measure', aggName: 'sum', type: 'D' } @@ -35,52 +39,110 @@ const geomClick$ = selection$.pipe( return false }) ); -function getFieldType(field: Field): 'quantitative' | 'nominal' | 'ordinal' | 'temporal' { - if (field.type === 'M') return 'quantitative'; - return 'nominal'; +function getFieldType(field: IField): 'quantitative' | 'nominal' | 'ordinal' | 'temporal' { + return field.semanticType } -function getSingleView(xField: Field, yField: Field, color: Field, opacity: Field, size: Field, row: Field, col: Field, defaultAggregated: boolean, defaultStack: boolean, geomType: string) { +interface SingleViewProps { + xField: IField; + yField: IField; + color: IField; + opacity: IField; + size: IField; + xOffset: IField; + yOffset: IField; + row: IField; + col: IField; + defaultAggregated: boolean; + defaultStack: boolean; + geomType: string; + +} +function getSingleView(props: SingleViewProps) { + const { + xField, + yField, + color, + opacity, + size, + row, + col, + // xOffset, + // yOffset, + defaultAggregated, + defaultStack, + geomType + } = props const xFieldAgg = (xField.type === 'M' && defaultAggregated && (xField.aggName as any)); const yFieldAgg = (yField.type === 'M' && defaultAggregated && (yField.aggName as any)) ; + let markType = geomType; + if (geomType === 'auto') { + const types: ISemanticType[] = []; + if (xField !== NULL_FIELD) types.push(xField.semanticType)//types.push(getFieldType(xField)); + if (yField !== NULL_FIELD) types.push(yField.semanticType)//types.push(getFieldType(yField)); + markType = autoMark(types); + } const spec = { mark: { - type: geomType, + type: markType, opacity: 0.96 }, encoding: { x: { - field: xField.id, + field: xField.fid, type: getFieldType(xField), aggregate: xFieldAgg, - stack: defaultStack + stack: defaultStack, + title: xFieldAgg ? `${xField.aggName}(${xField.name})` : xField.name }, y: { - field: yField.id, + field: yField.fid, type: getFieldType(yField), aggregate: yFieldAgg, - stack: defaultStack + stack: defaultStack, + title: yFieldAgg ? `${yField.aggName}(${yField.name})` : yField.name }, row: row !== NULL_FIELD ? { - field: row.id, + field: row.fid, type: getFieldType(row), + title: row.name } : undefined, + // TODO: xOffset等通道的特性不太稳定,建议后续vega相关特性稳定后,再使用。 + // 1. 场景太细,仅仅对对应的坐标轴是nominal(可能由ordinal)时,才可用 + // 2. 部分geom type会出现bug,如line,会出现组间的错误连接 + // "vega": "^5.22.0", + // "vega-embed": "^6.20.8", + // "vega-lite": "^5.2.0", + // ```ts + // xOffset: xOffset !== NULL_FIELD ? { + // field: xOffset.fid, + // type: getFieldType(xOffset), + // } : undefined, + // yOffset: yOffset !== NULL_FIELD ? { + // field: yOffset.fid, + // type: getFieldType(yOffset), + // } : undefined, + // ``` column: col !== NULL_FIELD ? { - field: col.id, + field: col.fid, type: getFieldType(col), + name: col.name } : undefined, color: color !== NULL_FIELD ? { - field: color.id, - type: getFieldType(color) + field: color.fid, + type: getFieldType(color), + color: color.name } : undefined, opacity: opacity !== NULL_FIELD ? { - field: opacity.id, - type: getFieldType(opacity) + field: opacity.fid, + type: getFieldType(opacity), + name: opacity.name } : undefined, size: size !== NULL_FIELD ? { - field: size.id, - type: getFieldType(size) + field: size.fid, + type: getFieldType(size), + name: size.name } : undefined } }; @@ -120,7 +182,7 @@ const ReactVega: React.FC = props => { const colFacetFields = useMemo(() => colDims.slice(0, -1), [colDims]); const rowRepeatFields = useMemo(() => rowMeas.length === 0 ? rowDims.slice(-1) : rowMeas, [rowDims, rowMeas]);//rowMeas.slice(0, -1); const colRepeatFields = useMemo(() => colMeas.length === 0 ? colDims.slice(-1) : colMeas, [rowDims, rowMeas]);//colMeas.slice(0, -1); - const allFieldIds = useMemo(() => [...rows, ...columns, color, opacity, size].filter(f => Boolean(f)).map(f => (f as Field).id), [rows, columns, color, opacity, size]); + const allFieldIds = useMemo(() => [...rows, ...columns, color, opacity, size].filter(f => Boolean(f)).map(f => (f as IField).fid), [rows, columns, color, opacity, size]); useEffect(() => { @@ -154,18 +216,20 @@ const ReactVega: React.FC = props => { } }; if (rowRepeatFields.length <= 1 && colRepeatFields.length <= 1) { - const singleView = getSingleView( + const singleView = getSingleView({ xField, yField, - color ? color : NULL_FIELD, - opacity ? opacity : NULL_FIELD, - size ? size : NULL_FIELD, - rowFacetField, - colFacetField, - defaultAggregate, + color: color ? color : NULL_FIELD, + opacity: opacity ? opacity : NULL_FIELD, + size: size ? size : NULL_FIELD, + row: rowFacetField, + col: colFacetField, + xOffset: NULL_FIELD, + yOffset: NULL_FIELD, + defaultAggregated: defaultAggregate, defaultStack, geomType - ); + }); spec.mark = singleView.mark; spec.encoding = singleView.encoding; if (viewPlaceholders.length > 0 && viewPlaceholders[0].current) { @@ -181,18 +245,20 @@ const ReactVega: React.FC = props => { } else { for (let i = 0; i < rowRepeatFields.length; i++) { for (let j = 0; j < colRepeatFields.length; j++) { - const singleView = getSingleView( - colRepeatFields[j] || NULL_FIELD, - rowRepeatFields[i] || NULL_FIELD, - color ? color : NULL_FIELD, - opacity ? opacity : NULL_FIELD, - size ? size : NULL_FIELD, - rowFacetField, - colFacetField, - defaultAggregate, + const singleView = getSingleView({ + xField: colRepeatFields[j] || NULL_FIELD, + yField: rowRepeatFields[i] || NULL_FIELD, + color: color ? color : NULL_FIELD, + opacity: opacity ? opacity : NULL_FIELD, + size: size ? size : NULL_FIELD, + row: rowFacetField, + col: colFacetField, + xOffset: NULL_FIELD, + yOffset: NULL_FIELD, + defaultAggregated: defaultAggregate, defaultStack, geomType - ); + }); const node = i * colRepeatFields.length + j < viewPlaceholders.length ? viewPlaceholders[i * colRepeatFields.length + j].current : null const ans = { ...spec, ...singleView } if (node) { diff --git a/yarn.lock b/yarn.lock index 6b54df5a..2ae33398 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2261,6 +2261,11 @@ resolved "https://registry.nlark.com/@types/clone/download/@types/clone-2.1.0.tgz#cb888a3fe5319275b566ae3a9bc606e310c533d4" integrity sha1-y4iKP+UxknW1Zq46m8YG4xDFM9Q= +"@types/clone@~2.1.1": + version "2.1.1" + resolved "https://registry.npmmirror.com/@types/clone/-/clone-2.1.1.tgz#9b880d0ce9b1f209b5e0bd6d9caa38209db34024" + integrity sha512-BZIU34bSYye0j/BFcPraiDZ5ka6MJADjcDVELGf7glr9K+iE8NYVjFslJFVWzskSxkLLyCrSPScE82/UUoBSvg== + "@types/concat-stream@^1.6.0": version "1.6.0" resolved "https://registry.nlark.com/@types/concat-stream/download/@types/concat-stream-1.6.0.tgz?cache=0&sync_timestamp=1621240805595&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fconcat-stream%2Fdownload%2F%40types%2Fconcat-stream-1.6.0.tgz#394dbe0bb5fee46b38d896735e8b68ef2390d00d" @@ -2308,6 +2313,11 @@ resolved "https://registry.nlark.com/@types/estree/download/@types/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha1-4Xfmme4bjCLSMXTKqnQiZEOJUJ8= +"@types/estree@^0.0.50": + version "0.0.50" + resolved "https://registry.npmmirror.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" + integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== + "@types/express-serve-static-core@^4.17.18": version "4.17.24" resolved "https://registry.nlark.com/@types/express-serve-static-core/download/@types/express-serve-static-core-4.17.24.tgz?cache=0&sync_timestamp=1629707772598&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fexpress-serve-static-core%2Fdownload%2F%40types%2Fexpress-serve-static-core-4.17.24.tgz#ea41f93bf7e0d59cd5a76665068ed6aab6815c07" @@ -4589,6 +4599,11 @@ commander@2, commander@^2.20.0: resolved "https://registry.nlark.com/commander/download/commander-2.20.3.tgz?cache=0&sync_timestamp=1624609539421&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcommander%2Fdownload%2Fcommander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha1-/UhehMA+tIgcIHIrpIA16FMa6zM= +commander@7: + version "7.2.0" + resolved "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + commander@^4.1.1: version "4.1.1" resolved "https://registry.nlark.com/commander/download/commander-4.1.1.tgz?cache=0&sync_timestamp=1624609539421&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcommander%2Fdownload%2Fcommander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" @@ -5214,11 +5229,23 @@ cyclist@^1.0.1: dependencies: internmap "^1.0.0" +"d3-array@1 - 3", "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3.1.1, d3-array@^3.1.1: + version "3.1.1" + resolved "https://registry.npmmirror.com/d3-array/-/d3-array-3.1.1.tgz#7797eb53ead6b9083c75a45a681e93fc41bc468c" + integrity sha512-33qQ+ZoZlli19IFiQx4QEpf2CBEayMRzhlisJHSCsSUbDXv6ZishqS1x7uFVClKG4Wr7rZVHvaAttoLow6GqdQ== + dependencies: + internmap "1 - 2" + "d3-color@1 - 2", d3-color@^2.0.0: version "2.0.0" resolved "https://registry.nlark.com/d3-color/download/d3-color-2.0.0.tgz#8d625cab42ed9b8f601a1760a389f7ea9189d62e" integrity sha1-jWJcq0Ltm49gGhdgo4n36pGJ1i4= +"d3-color@1 - 3", d3-color@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/d3-color/-/d3-color-3.0.1.tgz#03316e595955d1fcd39d9f3610ad41bb90194d0a" + integrity sha512-6/SlHkDOBLyQSJ1j1Ghs82OIUXpKWlR0hCsw0XrLSQhuUPuCSmLQ1QPH98vpnQxMUQM2/gfAkUEWsupVpd9JGw== + d3-delaunay@^5.3.0: version "5.3.0" resolved "https://registry.nlark.com/d3-delaunay/download/d3-delaunay-5.3.0.tgz#b47f05c38f854a4e7b3cea80e0bb12e57398772d" @@ -5226,11 +5253,23 @@ d3-delaunay@^5.3.0: dependencies: delaunator "4" +d3-delaunay@^6.0.2: + version "6.0.2" + resolved "https://registry.npmmirror.com/d3-delaunay/-/d3-delaunay-6.0.2.tgz#7fd3717ad0eade2fc9939f4260acfb503f984e92" + integrity sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ== + dependencies: + delaunator "5" + "d3-dispatch@1 - 2": version "2.0.0" resolved "https://registry.nlark.com/d3-dispatch/download/d3-dispatch-2.0.0.tgz#8a18e16f76dd3fcaef42163c97b926aa9b55e7cf" integrity sha1-ihjhb3bdP8rvQhY8l7kmqptV588= +"d3-dispatch@1 - 3": + version "3.0.1" + resolved "https://registry.npmmirror.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" + integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== + d3-dsv@0.1: version "0.1.14" resolved "https://registry.nlark.com/d3-dsv/download/d3-dsv-0.1.14.tgz#9833cd61a5a3e81e03263a1ce78f74de56a1dbb8" @@ -5245,6 +5284,15 @@ d3-dsv@^2.0.0: iconv-lite "0.4" rw "1" +d3-dsv@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73" + integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q== + dependencies: + commander "7" + iconv-lite "0.6" + rw "1" + d3-force@^2.1.1: version "2.1.1" resolved "https://registry.nlark.com/d3-force/download/d3-force-2.1.1.tgz#f20ccbf1e6c9e80add1926f09b51f686a8bc0937" @@ -5254,6 +5302,15 @@ d3-force@^2.1.1: d3-quadtree "1 - 2" d3-timer "1 - 2" +d3-force@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4" + integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg== + dependencies: + d3-dispatch "1 - 3" + d3-quadtree "1 - 3" + d3-timer "1 - 3" + d3-format@0.4: version "0.4.2" resolved "https://registry.nlark.com/d3-format/download/d3-format-0.4.2.tgz#aa759c1e5aae5fa8dabc9ab7819c502fc6b56875" @@ -5264,6 +5321,11 @@ d3-format@0.4: resolved "https://registry.nlark.com/d3-format/download/d3-format-2.0.0.tgz#a10bcc0f986c372b729ba447382413aabf5b0767" integrity sha1-oQvMD5hsNytym6RHOCQTqr9bB2c= +"d3-format@1 - 3", d3-format@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" + integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== + d3-geo-projection@^3.0.0: version "3.0.0" resolved "https://registry.nlark.com/d3-geo-projection/download/d3-geo-projection-3.0.0.tgz#45ad8ce756cdbfa8340b11b2988644d8e1fa42e4" @@ -5274,6 +5336,15 @@ d3-geo-projection@^3.0.0: d3-geo "1.12.0 - 2" resolve "^1.1.10" +d3-geo-projection@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/d3-geo-projection/-/d3-geo-projection-4.0.0.tgz#dc229e5ead78d31869a4e87cf1f45bd2716c48ca" + integrity sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg== + dependencies: + commander "7" + d3-array "1 - 3" + d3-geo "1.12.0 - 3" + "d3-geo@1.12.0 - 2", d3-geo@^2.0.1: version "2.0.2" resolved "https://registry.nlark.com/d3-geo/download/d3-geo-2.0.2.tgz#c065c1b71fe8c5f1be657e5f43d9bdd010383c40" @@ -5281,11 +5352,23 @@ d3-geo-projection@^3.0.0: dependencies: d3-array "^2.5.0" +"d3-geo@1.12.0 - 3", d3-geo@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/d3-geo/-/d3-geo-3.0.1.tgz#4f92362fd8685d93e3b1fae0fd97dc8980b1ed7e" + integrity sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA== + dependencies: + d3-array "2.5.0 - 3" + d3-hierarchy@^2.0.0: version "2.0.0" resolved "https://registry.nlark.com/d3-hierarchy/download/d3-hierarchy-2.0.0.tgz#dab88a58ca3e7a1bc6cab390e89667fcc6d20218" integrity sha1-2riKWMo+ehvGyrOQ6JZn/MbSAhg= +d3-hierarchy@^3.1.0: + version "3.1.1" + resolved "https://registry.npmmirror.com/d3-hierarchy/-/d3-hierarchy-3.1.1.tgz#9cbb0ffd2375137a351e6cfeed344a06d4ff4597" + integrity sha512-LtAIu54UctRmhGKllleflmHalttH3zkfSi4NlKrTAoFKjC+AFBJohsCAdgCBYQwH0F8hIOGY89X1pPqAchlMkA== + "d3-interpolate@1.2.0 - 2", d3-interpolate@^2.0.1: version "2.0.1" resolved "https://registry.nlark.com/d3-interpolate/download/d3-interpolate-2.0.1.tgz#98be499cfb8a3b94d4ff616900501a64abc91163" @@ -5293,16 +5376,33 @@ d3-hierarchy@^2.0.0: dependencies: d3-color "1 - 2" +"d3-interpolate@1.2.0 - 3", d3-interpolate@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" + integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== + dependencies: + d3-color "1 - 3" + "d3-path@1 - 2", d3-path@^2.0.0: version "2.0.0" resolved "https://registry.nlark.com/d3-path/download/d3-path-2.0.0.tgz#55d86ac131a0548adae241eebfb56b4582dd09d8" integrity sha1-VdhqwTGgVIra4kHuv7VrRYLdCdg= +"d3-path@1 - 3", d3-path@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/d3-path/-/d3-path-3.0.1.tgz#f09dec0aaffd770b7995f1a399152bf93052321e" + integrity sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w== + "d3-quadtree@1 - 2": version "2.0.0" resolved "https://registry.nlark.com/d3-quadtree/download/d3-quadtree-2.0.0.tgz#edbad045cef88701f6fee3aee8e93fb332d30f9d" integrity sha1-7brQRc74hwH2/uOu6Ok/szLTD50= +"d3-quadtree@1 - 3": + version "3.0.1" + resolved "https://registry.npmmirror.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f" + integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== + d3-scale@^3.2.2: version "3.3.0" resolved "https://registry.nlark.com/d3-scale/download/d3-scale-3.3.0.tgz?cache=0&sync_timestamp=1622924716548&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fd3-scale%2Fdownload%2Fd3-scale-3.3.0.tgz#28c600b29f47e5b9cd2df9749c206727966203f3" @@ -5314,6 +5414,17 @@ d3-scale@^3.2.2: d3-time "^2.1.1" d3-time-format "2 - 3" +d3-scale@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" + integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== + dependencies: + d3-array "2.10.0 - 3" + d3-format "1 - 3" + d3-interpolate "1.2.0 - 3" + d3-time "2.1.1 - 3" + d3-time-format "2 - 4" + d3-shape@^2.0.0: version "2.1.0" resolved "https://registry.nlark.com/d3-shape/download/d3-shape-2.1.0.tgz#3b6a82ccafbc45de55b57fcf956c584ded3b666f" @@ -5321,6 +5432,13 @@ d3-shape@^2.0.0: dependencies: d3-path "1 - 2" +d3-shape@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/d3-shape/-/d3-shape-3.1.0.tgz#c8a495652d83ea6f524e482fca57aa3f8bc32556" + integrity sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ== + dependencies: + d3-path "1 - 3" + d3-time-format@0.2: version "0.2.1" resolved "https://registry.nlark.com/d3-time-format/download/d3-time-format-0.2.1.tgz#846e39eb7f22676692d86040c48e9fa54fd8bf18" @@ -5335,6 +5453,13 @@ d3-time-format@0.2: dependencies: d3-time "1 - 2" +"d3-time-format@2 - 4", d3-time-format@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" + integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== + dependencies: + d3-time "1 - 3" + d3-time@0.1, d3-time@~0.1.1: version "0.1.1" resolved "https://registry.nlark.com/d3-time/download/d3-time-0.1.1.tgz#38ce2a7bb47a4031613823dde4688e58e892ae5b" @@ -5347,11 +5472,23 @@ d3-time@0.1, d3-time@~0.1.1: dependencies: d3-array "2" +"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/d3-time/-/d3-time-3.0.0.tgz#65972cb98ae2d4954ef5c932e8704061335d4975" + integrity sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ== + dependencies: + d3-array "2 - 3" + "d3-timer@1 - 2", d3-timer@^2.0.0: version "2.0.0" resolved "https://registry.nlark.com/d3-timer/download/d3-timer-2.0.0.tgz#055edb1d170cfe31ab2da8968deee940b56623e6" integrity sha1-BV7bHRcM/jGrLaiWje7pQLVmI+Y= +"d3-timer@1 - 3", d3-timer@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" + integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== + d@1, d@^1.0.1: version "1.0.1" resolved "https://registry.npm.taobao.org/d/download/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" @@ -5546,6 +5683,13 @@ delaunator@4: resolved "https://registry.npm.taobao.org/delaunator/download/delaunator-4.0.1.tgz#3d779687f57919a7a418f8ab947d3bddb6846957" integrity sha1-PXeWh/V5GaekGPirlH073baEaVc= +delaunator@5: + version "5.0.0" + resolved "https://registry.npmmirror.com/delaunator/-/delaunator-5.0.0.tgz#60f052b28bd91c9b4566850ebf7756efe821d81b" + integrity sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw== + dependencies: + robust-predicates "^3.0.0" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.nlark.com/delayed-stream/download/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -6532,6 +6676,11 @@ fast-json-patch@^3.0.0-1: resolved "https://registry.npm.taobao.org/fast-json-patch/download/fast-json-patch-3.0.0-1.tgz#4c68f2e7acfbab6d29d1719c44be51899c93dabb" integrity sha1-TGjy56z7q20p0XGcRL5RiZyT2rs= +fast-json-patch@^3.1.0: + version "3.1.0" + resolved "https://registry.npmmirror.com/fast-json-patch/-/fast-json-patch-3.1.0.tgz#ec8cd9b9c4c564250ec8b9140ef7a55f70acaee6" + integrity sha512-IhpytlsVTRndz0hU5t0/MGzS/etxLlfrpG5V5M9mVbuj9TrJLWaMfsox9REM5rkuGX0T+5qjpe8XA1o0gZ42nA== + fast-json-stable-stringify@*, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0, fast-json-stable-stringify@~2.1.0: version "2.1.0" resolved "https://registry.nlark.com/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -7537,7 +7686,7 @@ iconv-lite@0.4, iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.6.2: +iconv-lite@0.6, iconv-lite@^0.6.2: version "0.6.3" resolved "https://registry.nlark.com/iconv-lite/download/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha1-pS+AvzjaGVLrXGgXkHGYcaGnJQE= @@ -7723,6 +7872,11 @@ internal-slot@^1.0.3: has "^1.0.3" side-channel "^1.0.4" +"internmap@1 - 2": + version "2.0.3" + resolved "https://registry.npmmirror.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" + integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== + internmap@^1.0.0: version "1.0.1" resolved "https://registry.nlark.com/internmap/download/internmap-1.0.1.tgz#0017cc8a3b99605f0302f2b198d272e015e5df95" @@ -9870,6 +10024,13 @@ node-fetch@2.6.1, node-fetch@^2.6.1: resolved "https://registry.nlark.com/node-fetch/download/node-fetch-2.6.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnode-fetch%2Fdownload%2Fnode-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha1-BFvTI2Mfdu0uK1VXM5RBa2OaAFI= +node-fetch@^2.6.7: + version "2.6.7" + resolved "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + node-forge@^0.10.0: version "0.10.0" resolved "https://registry.npm.taobao.org/node-forge/download/node-forge-0.10.0.tgz?cache=0&sync_timestamp=1599010726129&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnode-forge%2Fdownload%2Fnode-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" @@ -12327,6 +12488,11 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" +robust-predicates@^3.0.0: + version "3.0.1" + resolved "https://registry.npmmirror.com/robust-predicates/-/robust-predicates-3.0.1.tgz#ecde075044f7f30118682bd9fb3f123109577f9a" + integrity sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g== + rollup-plugin-babel@^4.3.3: version "4.4.0" resolved "https://registry.npm.taobao.org/rollup-plugin-babel/download/rollup-plugin-babel-4.4.0.tgz#d15bd259466a9d1accbdb2fe2fff17c52d030acb" @@ -13652,6 +13818,11 @@ tr46@^2.1.0: dependencies: punycode "^2.1.1" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + tree-kill@^1.2.1: version "1.2.2" resolved "https://registry.npm.taobao.org/tree-kill/download/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" @@ -13715,6 +13886,11 @@ tslib@^2.0.3, tslib@^2.2.0: resolved "https://registry.nlark.com/tslib/download/tslib-2.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" integrity sha1-gDuM2rPhK6WBpMpByIObuw2ssJ4= +tslib@^2.3.1, tslib@~2.3.1: + version "2.3.1" + resolved "https://registry.npmmirror.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + tslib@~2.0.3: version "2.0.3" resolved "https://registry.nlark.com/tslib/download/tslib-2.0.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c" @@ -13725,11 +13901,6 @@ tslib@~2.1.0: resolved "https://registry.nlark.com/tslib/download/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" integrity sha1-2mCGDxwuyqVwOrfTm8Bba/mIuXo= -tslib@~2.2.0: - version "2.2.0" - resolved "https://registry.nlark.com/tslib/download/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" - integrity sha1-+yxHWXfjXiQTEe3iaTzuHsZpj1w= - tsscmp@1.0.6: version "1.0.6" resolved "https://registry.npm.taobao.org/tsscmp/download/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" @@ -14168,7 +14339,7 @@ vary@^1.1.2, vary@~1.1.2: resolved "https://registry.nlark.com/vary/download/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= -vega-canvas@^1.2.5: +vega-canvas@^1.2.5, vega-canvas@^1.2.6: version "1.2.6" resolved "https://registry.npm.taobao.org/vega-canvas/download/vega-canvas-1.2.6.tgz#55e032ce9a62acd17229f6bac66d99db3d6879cd" integrity sha1-VeAyzppirNFyKfa6xm2Z2z1oec0= @@ -14182,6 +14353,15 @@ vega-crossfilter@~4.0.5: vega-dataflow "^5.7.3" vega-util "^1.15.2" +vega-crossfilter@~4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/vega-crossfilter/-/vega-crossfilter-4.1.0.tgz#b6c5a728ce987f2514074adb22cf86b9bc63e0c8" + integrity sha512-aiOJcvVpiEDIu5uNc4Kf1hakkkPaVOO5fw5T4RSFAw6GEDbdqcB6eZ1xePcsLVic1hxYD5SGiUPdiiIs0SMh2g== + dependencies: + d3-array "^3.1.1" + vega-dataflow "^5.7.3" + vega-util "^1.15.2" + vega-dataflow@^5.7.3, vega-dataflow@^5.7.4, vega-dataflow@~5.7.4: version "5.7.4" resolved "https://registry.npm.taobao.org/vega-dataflow/download/vega-dataflow-5.7.4.tgz#7cafc0a41b9d0b11dd2e34a513f8b7ca345dfd74" @@ -14191,7 +14371,7 @@ vega-dataflow@^5.7.3, vega-dataflow@^5.7.4, vega-dataflow@~5.7.4: vega-loader "^4.3.2" vega-util "^1.16.1" -vega-embed@^6.15.1, vega-embed@^6.18.2: +vega-embed@^6.15.1: version "6.18.2" resolved "https://registry.nlark.com/vega-embed/download/vega-embed-6.18.2.tgz#1fcbf9c1eca1fc58db337efacbca7b9c74db43ca" integrity sha1-H8v5weyh/FjbM376y8p7nHTbQ8o= @@ -14204,6 +14384,20 @@ vega-embed@^6.15.1, vega-embed@^6.18.2: vega-themes "^2.10.0" vega-tooltip "^0.25.1" +vega-embed@^6.20.8: + version "6.20.8" + resolved "https://registry.npmmirror.com/vega-embed/-/vega-embed-6.20.8.tgz#7fdd3ec1f39c9bf8b5fd610011d1622fecd7f96a" + integrity sha512-UgUYJ9etuACULPwwy45Uw4Gz0sC4npxIn8yIW6dZsAu7EXMwEmeki+aA/9I9BVzD3EDD/TptG+ndlUTF2RW/Eg== + dependencies: + fast-json-patch "^3.1.0" + json-stringify-pretty-compact "^3.0.0" + semver "^7.3.5" + tslib "^2.3.1" + vega-interpreter "^1.0.4" + vega-schema-url-parser "^2.2.0" + vega-themes "^2.10.0" + vega-tooltip "^0.28.0" + vega-encode@~4.8.3: version "4.8.3" resolved "https://registry.npm.taobao.org/vega-encode/download/vega-encode-4.8.3.tgz#b3048fb39845d72f18d8dc302ad697f826e0ff83" @@ -14215,11 +14409,27 @@ vega-encode@~4.8.3: vega-scale "^7.0.3" vega-util "^1.15.2" +vega-encode@~4.9.0: + version "4.9.0" + resolved "https://registry.npmmirror.com/vega-encode/-/vega-encode-4.9.0.tgz#3dd1031056bb8029f262afc4b4d58372c8f073a6" + integrity sha512-etv2BHuCn9bzEc0cxyA2TnbtcAFQGVFmsaqmB4sgBCaqTSEfXMoX68LK3yxBrsdm5LU+y3otJVoewi3qWYCx2g== + dependencies: + d3-array "^3.1.1" + d3-interpolate "^3.0.1" + vega-dataflow "^5.7.3" + vega-scale "^7.0.3" + vega-util "^1.15.2" + vega-event-selector@^2.0.6, vega-event-selector@~2.0.6: version "2.0.6" resolved "https://registry.npm.taobao.org/vega-event-selector/download/vega-event-selector-2.0.6.tgz#6beb00e066b78371dde1a0f40cb5e0bbaecfd8bc" integrity sha1-a+sA4Ga3g3Hd4aD0DLXgu67P2Lw= +vega-event-selector@^3.0.0, vega-event-selector@~3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/vega-event-selector/-/vega-event-selector-3.0.0.tgz#7b855ac0c3ddb59bc5b5caa0d96dbbc9fbd33a4c" + integrity sha512-Gls93/+7tEJGE3kUuUnxrBIxtvaNeF01VIFB2Q2Of2hBIBvtHX74jcAdDtkh5UhhoYGD8Q1J30P5cqEBEwtPoQ== + vega-expression@^4.0.1, vega-expression@~4.0.1: version "4.0.1" resolved "https://registry.npm.taobao.org/vega-expression/download/vega-expression-4.0.1.tgz#c03e4fc68a00acac49557faa4e4ed6ac8a59c5fd" @@ -14227,6 +14437,14 @@ vega-expression@^4.0.1, vega-expression@~4.0.1: dependencies: vega-util "^1.16.0" +vega-expression@^5.0.0, vega-expression@~5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/vega-expression/-/vega-expression-5.0.0.tgz#938f26689693a1e0d26716030cdaed43ca7abdfb" + integrity sha512-y5+c2frq0tGwJ7vYXzZcfVcIRF/QGfhf2e+bV1Z0iQs+M2lI1II1GPDdmOcMKimpoCVp/D61KUJDIGE1DSmk2w== + dependencies: + "@types/estree" "^0.0.50" + vega-util "^1.16.0" + vega-expression@~3.0.0: version "3.0.1" resolved "https://registry.npm.taobao.org/vega-expression/download/vega-expression-3.0.1.tgz#bbccd8f59371a537eab16f3d9eff5cbeaa27532d" @@ -14243,6 +14461,15 @@ vega-force@~4.0.7: vega-dataflow "^5.7.3" vega-util "^1.15.2" +vega-force@~4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/vega-force/-/vega-force-4.1.0.tgz#cc8dea972baa52adc60840ff744ebb9e57d8f1f5" + integrity sha512-Sssf8iH48vYlz+E7/RpU+SUaJbuLoIL87U4tG2Av4gf/hRiImU49x2TI3EuhFWg1zpaCFxlz0CAaX++Oh/gjdw== + dependencies: + d3-force "^3.0.0" + vega-dataflow "^5.7.3" + vega-util "^1.15.2" + vega-format@^1.0.4, vega-format@~1.0.4: version "1.0.4" resolved "https://registry.npm.taobao.org/vega-format/download/vega-format-1.0.4.tgz#40c0c252d11128738b845ee73d8173f8064d6626" @@ -14254,6 +14481,17 @@ vega-format@^1.0.4, vega-format@~1.0.4: vega-time "^2.0.3" vega-util "^1.15.2" +vega-format@^1.1.0, vega-format@~1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/vega-format/-/vega-format-1.1.0.tgz#b9d81cf1bcf222ae5cbd94357ae70245d2c7b18d" + integrity sha512-6mgpeWw8yGdG0Zdi8aVkx5oUrpJGOpNxqazC2858RSDPvChM/jDFlgRMTYw52qk7cxU0L08ARp4BwmXaI75j0w== + dependencies: + d3-array "^3.1.1" + d3-format "^3.1.0" + d3-time-format "^4.1.0" + vega-time "^2.0.3" + vega-util "^1.15.2" + vega-functions@^5.10.0, vega-functions@^5.12.0, vega-functions@~5.12.0: version "5.12.0" resolved "https://registry.npm.taobao.org/vega-functions/download/vega-functions-5.12.0.tgz#44bf08a7b20673dc8cf51d6781c8ea1399501668" @@ -14271,6 +14509,23 @@ vega-functions@^5.10.0, vega-functions@^5.12.0, vega-functions@~5.12.0: vega-time "^2.0.4" vega-util "^1.16.0" +vega-functions@^5.12.1, vega-functions@^5.13.0, vega-functions@~5.13.0: + version "5.13.0" + resolved "https://registry.npmmirror.com/vega-functions/-/vega-functions-5.13.0.tgz#c9ab8c6eedbf39f75b424cca6776b1d0b8c74b32" + integrity sha512-Mf53zNyx+c9fFqagEI0T8zc9nMlx0zozOngr8oOpG1tZDKOgwOnUgN99zQKbLHjyv+UzWrq3LYTnSLyVe0ZmhQ== + dependencies: + d3-array "^3.1.1" + d3-color "^3.0.1" + d3-geo "^3.0.1" + vega-dataflow "^5.7.3" + vega-expression "^5.0.0" + vega-scale "^7.2.0" + vega-scenegraph "^4.9.3" + vega-selections "^5.3.1" + vega-statistics "^1.7.9" + vega-time "^2.1.0" + vega-util "^1.16.0" + vega-geo@~4.3.8: version "4.3.8" resolved "https://registry.npm.taobao.org/vega-geo/download/vega-geo-4.3.8.tgz#5629d18327bb4f3700cdf05db4aced0a43abbf4a" @@ -14285,6 +14540,20 @@ vega-geo@~4.3.8: vega-statistics "^1.7.9" vega-util "^1.15.2" +vega-geo@~4.4.0: + version "4.4.0" + resolved "https://registry.npmmirror.com/vega-geo/-/vega-geo-4.4.0.tgz#ce792df57f8ca4c54a7a1a29467cfa24bc53f573" + integrity sha512-3YX41y+J5pu0PMjvBCASg0/lgvu9+QXWJZ+vl6FFKa8AlsIopQ67ZL7ObwqjZcoZMolJ4q0rc+ZO8aj1pXCYcw== + dependencies: + d3-array "^3.1.1" + d3-color "^3.0.1" + d3-geo "^3.0.1" + vega-canvas "^1.2.5" + vega-dataflow "^5.7.3" + vega-projection "^1.4.5" + vega-statistics "^1.7.9" + vega-util "^1.15.2" + vega-hierarchy@~4.0.9: version "4.0.9" resolved "https://registry.npm.taobao.org/vega-hierarchy/download/vega-hierarchy-4.0.9.tgz#4b4bafbc181a14a280ecdbee8874c0db7e369f47" @@ -14294,6 +14563,20 @@ vega-hierarchy@~4.0.9: vega-dataflow "^5.7.3" vega-util "^1.15.2" +vega-hierarchy@~4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/vega-hierarchy/-/vega-hierarchy-4.1.0.tgz#605edbe3a6232853f9e8b57e3b905471d33b1a48" + integrity sha512-DWBK39IEt4FiQru12twzKSFUvFFZ7KtlH9+lAaqrJnKuIZFCyQ1XOUfKScfbKIlk4KS+DuCTNLI/pxC/f7Sk9Q== + dependencies: + d3-hierarchy "^3.1.0" + vega-dataflow "^5.7.3" + vega-util "^1.15.2" + +vega-interpreter@^1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/vega-interpreter/-/vega-interpreter-1.0.4.tgz#291ebf85bc2d1c3550a3da22ff75b3ba0d326a39" + integrity sha512-6tpYIa/pJz0cZo5fSxDSkZkAA51pID2LjOtQkOQvbzn+sJiCaWKPFhur8MBqbcmYZ9bnap1OYNwlrvpd2qBLvg== + vega-label@~1.0.0: version "1.0.0" resolved "https://registry.npm.taobao.org/vega-label/download/vega-label-1.0.0.tgz#c3bea3a608a62217ca554ecc0f7fe0395d81bd1b" @@ -14304,6 +14587,16 @@ vega-label@~1.0.0: vega-scenegraph "^4.9.2" vega-util "^1.15.2" +vega-label@~1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/vega-label/-/vega-label-1.2.0.tgz#bcb2659aec54f890f9debab3e41ab87a58292dce" + integrity sha512-1prOqkCAfXaUvMqavbGI0nbYGqV8UQR9qvuVwrPJ6Yxm3GIUIOA/JRqNY8eZR8USwMP/kzsqlfVEixj9+Y75VQ== + dependencies: + vega-canvas "^1.2.6" + vega-dataflow "^5.7.3" + vega-scenegraph "^4.9.2" + vega-util "^1.15.2" + vega-lite@^4.17.0: version "4.17.0" resolved "https://registry.npm.taobao.org/vega-lite/download/vega-lite-4.17.0.tgz#01ad4535e92f28c3852c1071711de272ddfb4631" @@ -14322,23 +14615,22 @@ vega-lite@^4.17.0: vega-util "~1.16.0" yargs "~16.0.3" -vega-lite@^5.1.0: - version "5.1.0" - resolved "https://registry.npm.taobao.org/vega-lite/download/vega-lite-5.1.0.tgz#14cbfd3e1158db06ae0bf923505d3b5954a8df3f" - integrity sha1-FMv9PhFY2wauC/kjUF07WVSo3z8= +vega-lite@^5.2.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/vega-lite/-/vega-lite-5.2.0.tgz#bc3c5c70a38d9de8f3fb9644c7dd52f3b9f47a1b" + integrity sha512-Yxcg8MvYfxHcG6BbkaKT0oVCIMIcE19UvqIsEwBmyd/7h2nzW7oRnID81T8UrY7hpDrIr6wa2JADOT2dhGNErw== dependencies: - "@types/clone" "~2.1.0" - "@types/fast-json-stable-stringify" "^2.0.0" + "@types/clone" "~2.1.1" array-flat-polyfill "^1.0.1" clone "~2.1.2" fast-deep-equal "~3.1.3" fast-json-stable-stringify "~2.1.0" json-stringify-pretty-compact "~3.0.0" - tslib "~2.2.0" - vega-event-selector "~2.0.6" - vega-expression "~4.0.1" - vega-util "~1.16.1" - yargs "~16.2.0" + tslib "~2.3.1" + vega-event-selector "~3.0.0" + vega-expression "~5.0.0" + vega-util "~1.17.0" + yargs "~17.2.1" vega-loader@^4.3.2, vega-loader@^4.3.3, vega-loader@~4.4.0: version "4.4.0" @@ -14351,6 +14643,17 @@ vega-loader@^4.3.2, vega-loader@^4.3.3, vega-loader@~4.4.0: vega-format "^1.0.4" vega-util "^1.16.0" +vega-loader@^4.4.0, vega-loader@~4.5.0: + version "4.5.0" + resolved "https://registry.npmmirror.com/vega-loader/-/vega-loader-4.5.0.tgz#b15acc4c8f84191f500e94d35ddfb9721ac943ad" + integrity sha512-EkAyzbx0pCYxH3v3wghGVCaKINWxHfgbQ2pYDiYv0yo8e04S8Mv/IlRGTt6BAe7cLhrk1WZ4zh20QOppnGG05w== + dependencies: + d3-dsv "^3.0.1" + node-fetch "^2.6.7" + topojson-client "^3.1.0" + vega-format "^1.1.0" + vega-util "^1.16.0" + vega-parser@~6.1.3: version "6.1.3" resolved "https://registry.npm.taobao.org/vega-parser/download/vega-parser-6.1.3.tgz#df72785e4b086eceb90ee6219a399210933b507b" @@ -14362,6 +14665,17 @@ vega-parser@~6.1.3: vega-scale "^7.1.1" vega-util "^1.16.0" +vega-parser@~6.1.4: + version "6.1.4" + resolved "https://registry.npmmirror.com/vega-parser/-/vega-parser-6.1.4.tgz#4868e41af2c9645b6d7daeeb205cfad06b9d465c" + integrity sha512-tORdpWXiH/kkXcpNdbSVEvtaxBuuDtgYp9rBunVW9oLsjFvFXbSWlM1wvJ9ZFSaTfx6CqyTyGMiJemmr1QnTjQ== + dependencies: + vega-dataflow "^5.7.3" + vega-event-selector "^3.0.0" + vega-functions "^5.12.1" + vega-scale "^7.1.1" + vega-util "^1.16.0" + vega-projection@^1.4.5, vega-projection@~1.4.5: version "1.4.5" resolved "https://registry.npm.taobao.org/vega-projection/download/vega-projection-1.4.5.tgz#020cb646b4eaae535359da25f4f48eef8d324af2" @@ -14370,6 +14684,14 @@ vega-projection@^1.4.5, vega-projection@~1.4.5: d3-geo "^2.0.1" d3-geo-projection "^3.0.0" +vega-projection@~1.5.0: + version "1.5.0" + resolved "https://registry.npmmirror.com/vega-projection/-/vega-projection-1.5.0.tgz#51c5f0455170cd35b3c5f3e653e99c3616520640" + integrity sha512-aob7qojh555x3hQWZ/tr8cIJNSWQbm6EoWTJaheZgFOY2x3cDa4Qrg3RJbGw6KwVj/IQk2p40paRzixKZ2kr+A== + dependencies: + d3-geo "^3.0.1" + d3-geo-projection "^4.0.0" + vega-regression@~1.0.9: version "1.0.9" resolved "https://registry.npm.taobao.org/vega-regression/download/vega-regression-1.0.9.tgz#f33da47fe457e03ad134782c11414bcef7b1da82" @@ -14380,6 +14702,16 @@ vega-regression@~1.0.9: vega-statistics "^1.7.9" vega-util "^1.15.2" +vega-regression@~1.1.0: + version "1.1.0" + resolved "https://registry.npmmirror.com/vega-regression/-/vega-regression-1.1.0.tgz#b4394db403ada93de52bb4536d04be336c983a8c" + integrity sha512-09K0RemY6cdaXBAyakDUNFfEkRcLkGjkDJyWQPAUqGK59hV2J+G3i4uxkZp18Vu0t8oqU7CgzwWim1s5uEpOcA== + dependencies: + d3-array "^3.1.1" + vega-dataflow "^5.7.3" + vega-statistics "^1.7.9" + vega-util "^1.15.2" + vega-runtime@^6.1.3, vega-runtime@~6.1.3: version "6.1.3" resolved "https://registry.npm.taobao.org/vega-runtime/download/vega-runtime-6.1.3.tgz#01e18246f7a80cee034a96017ac30113b92c4034" @@ -14399,6 +14731,29 @@ vega-scale@^7.0.3, vega-scale@^7.1.1, vega-scale@~7.1.1: vega-time "^2.0.4" vega-util "^1.15.2" +vega-scale@^7.2.0, vega-scale@~7.2.0: + version "7.2.0" + resolved "https://registry.npmmirror.com/vega-scale/-/vega-scale-7.2.0.tgz#9e298cc02ad340498cb56847436b19439911f0fc" + integrity sha512-QYltO/otrZHLrCGGf06Y99XtPtqWXITr6rw7rO9oL+l3d9o5RFl9sjHrVxiM7v+vGoZVWbBd5IPbFhPsXZ6+TA== + dependencies: + d3-array "^3.1.1" + d3-interpolate "^3.0.1" + d3-scale "^4.0.2" + vega-time "^2.1.0" + vega-util "^1.17.0" + +vega-scenegraph@^4.10.0, vega-scenegraph@~4.10.0: + version "4.10.0" + resolved "https://registry.npmmirror.com/vega-scenegraph/-/vega-scenegraph-4.10.0.tgz#232643372760ea081f2a899f640530777c2e2ba8" + integrity sha512-znUQAulNJnuXSza8+Qg1objNpXcHxP9KZwwp0XW4H/AHbzVhHEigZagb8xKDpQI1/8OSk2WZf9Bkr7CrsFC0hg== + dependencies: + d3-path "^3.0.1" + d3-shape "^3.1.0" + vega-canvas "^1.2.5" + vega-loader "^4.4.0" + vega-scale "^7.2.0" + vega-util "^1.15.2" + vega-scenegraph@^4.9.2, vega-scenegraph@^4.9.3, vega-scenegraph@^4.9.4, vega-scenegraph@~4.9.4: version "4.9.4" resolved "https://registry.npm.taobao.org/vega-scenegraph/download/vega-scenegraph-4.9.4.tgz#468408c1e89703fa9d3450445daabff623de2757" @@ -14424,6 +14779,15 @@ vega-selections@^5.3.0: vega-expression "^4.0.1" vega-util "^1.16.0" +vega-selections@^5.3.1: + version "5.4.0" + resolved "https://registry.npmmirror.com/vega-selections/-/vega-selections-5.4.0.tgz#c2783897421fa39b674c015fa8f15a0023b8054e" + integrity sha512-Un3JdLDPjIpF9Dh4sw6m1c/QAcfam6m1YXHJ9vJxE/GdJ+sOrPxc7bcEU8VhOmTUN7IQUn4/1ry4JqqOVMbEhw== + dependencies: + d3-array "3.1.1" + vega-expression "^5.0.0" + vega-util "^1.16.0" + vega-statistics@^1.7.9, vega-statistics@~1.7.9: version "1.7.9" resolved "https://registry.npm.taobao.org/vega-statistics/download/vega-statistics-1.7.9.tgz#feec01d463e1b50593d890d20631f72138fcb65d" @@ -14431,6 +14795,13 @@ vega-statistics@^1.7.9, vega-statistics@~1.7.9: dependencies: d3-array "^2.7.1" +vega-statistics@^1.8.0, vega-statistics@~1.8.0: + version "1.8.0" + resolved "https://registry.npmmirror.com/vega-statistics/-/vega-statistics-1.8.0.tgz#ad66f7461473d58bc96671588981a059ffd60b59" + integrity sha512-dl+LCRS6qS4jWDme/NEdPVt5r649uB4IK6Kyr2/czmGA5JqjuFmtQ9lHQOnRu8945XLkqLf+JIQQo7vnw+nslA== + dependencies: + d3-array "^3.1.1" + vega-themes@^2.10.0: version "2.10.0" resolved "https://registry.npm.taobao.org/vega-themes/download/vega-themes-2.10.0.tgz#82768b14686e3fbfbdab0e77cb63e12c62b4911e" @@ -14445,6 +14816,15 @@ vega-time@^2.0.3, vega-time@^2.0.4, vega-time@~2.0.4: d3-time "^2.0.0" vega-util "^1.15.2" +vega-time@^2.1.0, vega-time@~2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/vega-time/-/vega-time-2.1.0.tgz#acfbab88d7798b87ff63913b0dce2ca5eb0d46ca" + integrity sha512-Q9/l3S6Br1RPX5HZvyLD/cQ4K6K8DtpR09/1y7D66gxNorg2+HGzYZINH9nUvN3mxoXcBWg4cCUh3+JvmkDaEg== + dependencies: + d3-array "^3.1.1" + d3-time "^3.0.0" + vega-util "^1.15.2" + vega-tooltip@^0.25.1: version "0.25.1" resolved "https://registry.npm.taobao.org/vega-tooltip/download/vega-tooltip-0.25.1.tgz#cb7e438438649eb46896e7bee6f54e25d25b3c09" @@ -14452,6 +14832,24 @@ vega-tooltip@^0.25.1: dependencies: vega-util "^1.16.0" +vega-tooltip@^0.28.0: + version "0.28.0" + resolved "https://registry.npmmirror.com/vega-tooltip/-/vega-tooltip-0.28.0.tgz#8bae2601ffae5e67622de37108f53f284e9a978b" + integrity sha512-DbK0V5zzk+p9cphZZXV91ZGeKq0zr6JIS0VndUoGTisldzw4tRgmpGQcTfMjew53o7/voeTM2ELTnJAJRzX4tg== + dependencies: + vega-util "^1.17.0" + +vega-transforms@~4.10.0: + version "4.10.0" + resolved "https://registry.npmmirror.com/vega-transforms/-/vega-transforms-4.10.0.tgz#a1017ede13cf4e25499f588610a3be4da615d82d" + integrity sha512-Yk6ByzVq5F2niFfPlSsrU5wi+NZhsF7IBpJCcTfms4U7eoyNepUXagdFEJ3VWBD/Lit6GorLXFgO17NYcyS5gg== + dependencies: + d3-array "^3.1.1" + vega-dataflow "^5.7.4" + vega-statistics "^1.8.0" + vega-time "^2.1.0" + vega-util "^1.16.1" + vega-transforms@~4.9.4: version "4.9.4" resolved "https://registry.npm.taobao.org/vega-transforms/download/vega-transforms-4.9.4.tgz#5cf6b91bda9f184bbbaba63838be8e5e6a571235" @@ -14470,11 +14868,25 @@ vega-typings@~0.21.0: dependencies: vega-util "^1.15.2" +vega-typings@~0.22.0: + version "0.22.2" + resolved "https://registry.npmmirror.com/vega-typings/-/vega-typings-0.22.2.tgz#c5f5037680778664f5246c19a56e4cfffeb0d90b" + integrity sha512-op4bNiyS150V7gnuIdjwFYB1belYB8qnapqLQQ+ZBJQ+r7a+IbvXphEUf8AkBlOoGPN1ITNdhlIsq9WWiuxu8Q== + dependencies: + vega-event-selector "^3.0.0" + vega-expression "^5.0.0" + vega-util "^1.15.2" + vega-util@^1.15.2, vega-util@^1.16.0, vega-util@^1.16.1, vega-util@~1.16.0, vega-util@~1.16.1: version "1.16.1" resolved "https://registry.npm.taobao.org/vega-util/download/vega-util-1.16.1.tgz#992bf3c3b6e145797214d99862841baea417ba39" integrity sha1-mSvzw7bhRXlyFNmYYoQbrqQXujk= +vega-util@^1.17.0, vega-util@~1.17.0: + version "1.17.0" + resolved "https://registry.npmmirror.com/vega-util/-/vega-util-1.17.0.tgz#b72ae0baa97f943bf591f8f5bb27ceadf06834ac" + integrity sha512-HTaydZd9De3yf+8jH66zL4dXJ1d1p5OIFyoBzFiOli4IJbwkL1jrefCKz6AHDm1kYBzDJ0X4bN+CzZSCTvNk1w== + vega-view-transforms@~4.5.8: version "4.5.8" resolved "https://registry.npm.taobao.org/vega-view-transforms/download/vega-view-transforms-4.5.8.tgz#c8dc42c3c7d4aa725d40b8775180c9f23bc98f4e" @@ -14498,6 +14910,20 @@ vega-view@~5.10.1: vega-scenegraph "^4.9.4" vega-util "^1.16.1" +vega-view@~5.11.0: + version "5.11.0" + resolved "https://registry.npmmirror.com/vega-view/-/vega-view-5.11.0.tgz#8a7b29a36776e43cc6599e087ed7f48a918b805d" + integrity sha512-MI9NTRFmtFX6ADk6KOHhi8bhHjC9pPm42Bj2+74c6l1d3NQZf9Jv7lkiGqKohdkQDNH9LPwz/6slhKwPU9JdkQ== + dependencies: + d3-array "^3.1.1" + d3-timer "^3.0.1" + vega-dataflow "^5.7.3" + vega-format "^1.1.0" + vega-functions "^5.13.0" + vega-runtime "^6.1.3" + vega-scenegraph "^4.10.0" + vega-util "^1.16.1" + vega-voronoi@~4.1.5: version "4.1.5" resolved "https://registry.npm.taobao.org/vega-voronoi/download/vega-voronoi-4.1.5.tgz#e7af574d4c27fd9cb12d70082f12c6f59b80b445" @@ -14507,6 +14933,15 @@ vega-voronoi@~4.1.5: vega-dataflow "^5.7.3" vega-util "^1.15.2" +vega-voronoi@~4.2.0: + version "4.2.0" + resolved "https://registry.npmmirror.com/vega-voronoi/-/vega-voronoi-4.2.0.tgz#14c74c84f52d9a16be2facd1bede879d32d988f2" + integrity sha512-1iuNAVZgUHRlBpdq4gSga3KlQmrgFfwy+KpyDgPLQ8HbLkhcVeT7RDh2L6naluqD7Op0xVLms3clR920WsYryQ== + dependencies: + d3-delaunay "^6.0.2" + vega-dataflow "^5.7.3" + vega-util "^1.15.2" + vega-wordcloud@~4.1.3: version "4.1.3" resolved "https://registry.npm.taobao.org/vega-wordcloud/download/vega-wordcloud-4.1.3.tgz#ce90900333f4e0d3ee706ba4f36bb0905f8b4a9f" @@ -14518,7 +14953,7 @@ vega-wordcloud@~4.1.3: vega-statistics "^1.7.9" vega-util "^1.15.2" -vega@^5.19.1, vega@^5.20.2: +vega@^5.19.1: version "5.20.2" resolved "https://registry.npm.taobao.org/vega/download/vega-5.20.2.tgz#41178edc6417aa8f743e981f8ccbc7588b13af90" integrity sha1-QReO3GQXqo90PpgfjMvHWIsTr5A= @@ -14551,6 +14986,39 @@ vega@^5.19.1, vega@^5.20.2: vega-voronoi "~4.1.5" vega-wordcloud "~4.1.3" +vega@^5.22.0: + version "5.22.0" + resolved "https://registry.npmmirror.com/vega/-/vega-5.22.0.tgz#9286832a0bc523ee39b1f3baff9a2ca1957a61f0" + integrity sha512-ZIehKTrMY93sWaWIn/2N2LwsCN8XymQthxQA5fQwTmefVl7OOvcYmsGFJ9nttXUF4n0z5WRXkSsPZcJHHBlOKw== + dependencies: + vega-crossfilter "~4.1.0" + vega-dataflow "~5.7.4" + vega-encode "~4.9.0" + vega-event-selector "~3.0.0" + vega-expression "~5.0.0" + vega-force "~4.1.0" + vega-format "~1.1.0" + vega-functions "~5.13.0" + vega-geo "~4.4.0" + vega-hierarchy "~4.1.0" + vega-label "~1.2.0" + vega-loader "~4.5.0" + vega-parser "~6.1.4" + vega-projection "~1.5.0" + vega-regression "~1.1.0" + vega-runtime "~6.1.3" + vega-scale "~7.2.0" + vega-scenegraph "~4.10.0" + vega-statistics "~1.8.0" + vega-time "~2.1.0" + vega-transforms "~4.10.0" + vega-typings "~0.22.0" + vega-util "~1.17.0" + vega-view "~5.11.0" + vega-view-transforms "~4.5.8" + vega-voronoi "~4.2.0" + vega-wordcloud "~4.1.3" + vendors@^1.0.0: version "1.0.4" resolved "https://registry.nlark.com/vendors/download/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" @@ -14661,6 +15129,11 @@ web-vitals@^0.2.4: resolved "https://registry.nlark.com/web-vitals/download/web-vitals-0.2.4.tgz#ec3df43c834a207fd7cdefd732b2987896e08511" integrity sha1-7D30PINKIH/Xze/XMrKYeJbghRE= +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + webidl-conversions@^5.0.0: version "5.0.0" resolved "https://registry.npm.taobao.org/webidl-conversions/download/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" @@ -14814,6 +15287,14 @@ whatwg-mimetype@^2.3.0: resolved "https://registry.npm.taobao.org/whatwg-mimetype/download/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha1-PUseAxLSB5h5+Cav8Y2+7KWWD78= +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + whatwg-url@^8.0.0, whatwg-url@^8.5.0: version "8.7.0" resolved "https://registry.nlark.com/whatwg-url/download/whatwg-url-8.7.0.tgz?cache=0&sync_timestamp=1624743593534&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwhatwg-url%2Fdownload%2Fwhatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" @@ -15249,7 +15730,7 @@ yargs@^15.4.1: y18n "^4.0.0" yargs-parser "^18.1.2" -yargs@^16.2.0, yargs@~16.2.0: +yargs@^16.2.0: version "16.2.0" resolved "https://registry.nlark.com/yargs/download/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha1-HIK/D2tqZur85+8w43b0mhJHf2Y= @@ -15275,6 +15756,19 @@ yargs@~16.0.3: y18n "^5.0.1" yargs-parser "^20.0.0" +yargs@~17.2.1: + version "17.2.1" + resolved "https://registry.npmmirror.com/yargs/-/yargs-17.2.1.tgz#e2c95b9796a0e1f7f3bf4427863b42e0418191ea" + integrity sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yarn@^1.19.0: version "1.22.10" resolved "https://registry.npm.taobao.org/yarn/download/yarn-1.22.10.tgz#c99daa06257c80f8fa2c3f1490724e394c26b18c" From 4851781206bdba5819e178c63313713c758d8efc Mon Sep 17 00:00:00 2001 From: Hao Chen <270001151@qq.com> Date: Sun, 20 Mar 2022 16:02:29 +0800 Subject: [PATCH 22/26] fix: delete field type --- .../graphic-walker/src/Fields/components.tsx | 11 ------ .../src/Fields/datasetFields/index.tsx | 6 +-- .../src/Fields/obComponents/obPill.tsx | 4 +- .../src/InsightBoard/mainBoard.tsx | 6 +-- packages/graphic-walker/src/interfaces.ts | 1 - .../src/store/visualSpecStore.ts | 8 +--- .../src/vis/future-react-vega.tsx | 37 +++++++++---------- .../graphic-walker/src/vis/react-vega.tsx | 19 +++++----- 8 files changed, 37 insertions(+), 55 deletions(-) diff --git a/packages/graphic-walker/src/Fields/components.tsx b/packages/graphic-walker/src/Fields/components.tsx index 1d25c332..4c064038 100644 --- a/packages/graphic-walker/src/Fields/components.tsx +++ b/packages/graphic-walker/src/Fields/components.tsx @@ -78,17 +78,6 @@ export const FieldListSegment = styled.div` } `; -export const FieldLabel = styled.div<{ highlight?: boolean; type?: 'D' | 'M' }>` - padding: 0.2em 0.4em; - margin: 0.2em; - border-radius: 0.2em; - background-color: ${props => (props.type === 'D' ? '#2185d0' : '#21ba45')}; - color: #fff; - ${(props) => - props.highlight ? "box-shadow: 0px 0px 5px 1px #21ba45" : null}; - position: relative; -`; - export const Pill = styled.div<{colType: 'discrete' | 'continuous'}>` background-color: ${props => props.colType === 'continuous' ? COLORS.measure : COLORS.dimension}; color: #fff; diff --git a/packages/graphic-walker/src/Fields/datasetFields/index.tsx b/packages/graphic-walker/src/Fields/datasetFields/index.tsx index beacbf5a..a1429800 100644 --- a/packages/graphic-walker/src/Fields/datasetFields/index.tsx +++ b/packages/graphic-walker/src/Fields/datasetFields/index.tsx @@ -19,13 +19,13 @@ const DatasetFields: React.FC = props => { const { draggableFieldState } = vizStore; const { fields } = draggableFieldState; - const dimensions: IViewField[] = []; // = draggableFieldState[FIELDS_KEY].filter(f => f.type === 'D'); - const measures: IViewField[] = []; // = draggableFieldState[FIELDS_KEY].filter(f => f.type === 'M'); + const dimensions: IViewField[] = []; + const measures: IViewField[] = []; const dimOriginIndices: number[] = []; const meaOriginIndices: number[] = []; for (let i = 0; i < fields.length; i++) { - if (fields[i].type === 'D') { + if (fields[i].analyticType === 'dimension') { dimensions.push(fields[i]); dimOriginIndices.push(i) } else { diff --git a/packages/graphic-walker/src/Fields/obComponents/obPill.tsx b/packages/graphic-walker/src/Fields/obComponents/obPill.tsx index f305973a..b5219de5 100644 --- a/packages/graphic-walker/src/Fields/obComponents/obPill.tsx +++ b/packages/graphic-walker/src/Fields/obComponents/obPill.tsx @@ -19,12 +19,12 @@ const OBPill: React.FC = props => { return {field.name}  - {field.type === 'M' && visualConfig.defaultAggregated && ( + {field.analyticType === 'measure' && visualConfig.defaultAggregated && (
- {field.key} + + {/* {field.key} */}
- {record[field.key]} + {record[field.fid]}