@visactor/vchart 2.1.0-alpha.4 → 2.1.0-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/es5/index.js +1 -1
- package/build/index.es.js +362 -236
- package/build/index.js +362 -236
- package/build/index.min.js +2 -2
- package/build/tsconfig.tsbuildinfo +1 -1
- package/cjs/chart/base/base-chart.d.ts +1 -0
- package/cjs/chart/base/base-chart.js +10 -2
- package/cjs/chart/base/base-chart.js.map +1 -1
- package/cjs/chart/gauge/gauge-transformer.js +3 -2
- package/cjs/chart/gauge/gauge-transformer.js.map +1 -1
- package/cjs/chart/polar/polar-transformer.js +1 -1
- package/cjs/chart/polar/polar-transformer.js.map +1 -1
- package/cjs/chart/polar/progress-like/progress-like-transformer.js +1 -1
- package/cjs/chart/polar/progress-like/progress-like-transformer.js.map +1 -1
- package/cjs/chart/progress/circular/circular-progress-transformer.js +3 -2
- package/cjs/chart/progress/circular/circular-progress-transformer.js.map +1 -1
- package/cjs/chart/progress/linear/linear-progress-transformer.js +1 -1
- package/cjs/chart/progress/linear/linear-progress-transformer.js.map +1 -1
- package/cjs/chart/radar/radar-transformer.js +3 -2
- package/cjs/chart/radar/radar-transformer.js.map +1 -1
- package/cjs/chart/range-area/range-area-transformer.js +2 -2
- package/cjs/chart/range-area/range-area-transformer.js.map +1 -1
- package/cjs/chart/rose/rose-transformer.js +2 -1
- package/cjs/chart/rose/rose-transformer.js.map +1 -1
- package/cjs/compile/compiler.js +9 -7
- package/cjs/compile/compiler.js.map +1 -1
- package/cjs/component/axis/polar/band-axis.d.ts +2 -0
- package/cjs/component/axis/polar/band-axis.js +3 -0
- package/cjs/component/axis/polar/band-axis.js.map +1 -1
- package/cjs/component/axis/polar/linear-axis.js +3 -0
- package/cjs/component/axis/polar/linear-axis.js.map +1 -1
- package/cjs/component/indicator/indicator.js +2 -2
- package/cjs/component/indicator/indicator.js.map +1 -1
- package/cjs/component/indicator/util.d.ts +4 -3
- package/cjs/component/indicator/util.js +1 -1
- package/cjs/component/indicator/util.js.map +1 -1
- package/cjs/constant/funnel.js +2 -1
- package/cjs/constant/scatter.js +1 -2
- package/cjs/constant/scroll-bar.js +1 -1
- package/cjs/constant/sunburst.js +1 -1
- package/cjs/constant/waterfall.js +1 -1
- package/cjs/constant/word-cloud.js +1 -1
- package/cjs/core/instance-manager.js +1 -1
- package/cjs/core/interface.js +1 -1
- package/cjs/core/util.js +1 -1
- package/cjs/core/vchart.js +1 -1
- package/cjs/data/transforms/box-plot.d.ts +4 -1
- package/cjs/data/transforms/box-plot.js +3 -3
- package/cjs/data/transforms/box-plot.js.map +1 -1
- package/cjs/data/transforms/correlation-center.d.ts +11 -4
- package/cjs/data/transforms/correlation-center.js +3 -2
- package/cjs/data/transforms/correlation-center.js.map +1 -1
- package/cjs/data/transforms/correlation.d.ts +18 -15
- package/cjs/data/transforms/correlation.js +22 -17
- package/cjs/data/transforms/correlation.js.map +1 -1
- package/cjs/data/transforms/funnel.d.ts +10 -8
- package/cjs/data/transforms/funnel.js +4 -3
- package/cjs/data/transforms/funnel.js.map +1 -1
- package/cjs/data/transforms/lookup.d.ts +3 -3
- package/cjs/data/transforms/lookup.js +12 -7
- package/cjs/data/transforms/lookup.js.map +1 -1
- package/cjs/data/transforms/map.d.ts +8 -2
- package/cjs/data/transforms/map.js +9 -6
- package/cjs/data/transforms/map.js.map +1 -1
- package/cjs/data/transforms/sankey.d.ts +12 -4
- package/cjs/data/transforms/sankey.js +18 -13
- package/cjs/data/transforms/sankey.js.map +1 -1
- package/cjs/data/transforms/stack-split.d.ts +2 -1
- package/cjs/data/transforms/stack-split.js +1 -1
- package/cjs/data/transforms/stack-split.js.map +1 -1
- package/cjs/data/transforms/treemap.d.ts +5 -3
- package/cjs/data/transforms/treemap.js +7 -6
- package/cjs/data/transforms/treemap.js.map +1 -1
- package/cjs/data/transforms/venn.d.ts +4 -2
- package/cjs/data/transforms/venn.js +4 -4
- package/cjs/data/transforms/venn.js.map +1 -1
- package/cjs/data/transforms/waterfall.d.ts +4 -2
- package/cjs/data/transforms/waterfall.js +7 -7
- package/cjs/data/transforms/waterfall.js.map +1 -1
- package/cjs/series/base/base-series.js +2 -2
- package/cjs/series/base/base-series.js.map +1 -1
- package/cjs/series/box-plot/box-plot.js +2 -2
- package/cjs/series/box-plot/box-plot.js.map +1 -1
- package/cjs/series/correlation/correlation.js +13 -11
- package/cjs/series/correlation/correlation.js.map +1 -1
- package/cjs/series/dot/dot.d.ts +11 -0
- package/cjs/series/dot/dot.js +16 -1
- package/cjs/series/dot/dot.js.map +1 -1
- package/cjs/series/funnel/funnel.js +5 -8
- package/cjs/series/funnel/funnel.js.map +1 -1
- package/cjs/series/map/map.js +3 -3
- package/cjs/series/map/map.js.map +1 -1
- package/cjs/series/polar/progress-like/progress-like.d.ts +2 -0
- package/cjs/series/polar/progress-like/progress-like.js +16 -1
- package/cjs/series/polar/progress-like/progress-like.js.map +1 -1
- package/cjs/series/polar/rose-like/rose-like.d.ts +2 -0
- package/cjs/series/polar/rose-like/rose-like.js +15 -1
- package/cjs/series/polar/rose-like/rose-like.js.map +1 -1
- package/cjs/series/progress/circular/circular.js +2 -1
- package/cjs/series/progress/circular/circular.js.map +1 -1
- package/cjs/series/progress/linear/linear.js +3 -1
- package/cjs/series/progress/linear/linear.js.map +1 -1
- package/cjs/series/sankey/sankey.js +35 -33
- package/cjs/series/sankey/sankey.js.map +1 -1
- package/cjs/series/treemap/treemap.js +23 -20
- package/cjs/series/treemap/treemap.js.map +1 -1
- package/cjs/series/venn/venn.js +2 -2
- package/cjs/series/venn/venn.js.map +1 -1
- package/cjs/series/waterfall/waterfall.js +26 -20
- package/cjs/series/waterfall/waterfall.js.map +1 -1
- package/esm/chart/base/base-chart.d.ts +1 -0
- package/esm/chart/base/base-chart.js +9 -2
- package/esm/chart/base/base-chart.js.map +1 -1
- package/esm/chart/gauge/gauge-transformer.js +3 -2
- package/esm/chart/gauge/gauge-transformer.js.map +1 -1
- package/esm/chart/polar/polar-transformer.js +1 -1
- package/esm/chart/polar/polar-transformer.js.map +1 -1
- package/esm/chart/polar/progress-like/progress-like-transformer.js +1 -1
- package/esm/chart/polar/progress-like/progress-like-transformer.js.map +1 -1
- package/esm/chart/progress/circular/circular-progress-transformer.js +3 -2
- package/esm/chart/progress/circular/circular-progress-transformer.js.map +1 -1
- package/esm/chart/progress/linear/linear-progress-transformer.js +1 -1
- package/esm/chart/progress/linear/linear-progress-transformer.js.map +1 -1
- package/esm/chart/radar/radar-transformer.js +3 -2
- package/esm/chart/radar/radar-transformer.js.map +1 -1
- package/esm/chart/range-area/range-area-transformer.js +2 -2
- package/esm/chart/range-area/range-area-transformer.js.map +1 -1
- package/esm/chart/rose/rose-transformer.js +2 -1
- package/esm/chart/rose/rose-transformer.js.map +1 -1
- package/esm/compile/compiler.js +9 -7
- package/esm/compile/compiler.js.map +1 -1
- package/esm/component/axis/polar/band-axis.d.ts +2 -0
- package/esm/component/axis/polar/band-axis.js +3 -0
- package/esm/component/axis/polar/band-axis.js.map +1 -1
- package/esm/component/axis/polar/linear-axis.js +3 -0
- package/esm/component/axis/polar/linear-axis.js.map +1 -1
- package/esm/component/indicator/indicator.js +2 -2
- package/esm/component/indicator/indicator.js.map +1 -1
- package/esm/component/indicator/util.d.ts +4 -3
- package/esm/component/indicator/util.js +2 -2
- package/esm/component/indicator/util.js.map +1 -1
- package/esm/constant/funnel.js +2 -1
- package/esm/constant/scatter.js +1 -2
- package/esm/constant/scroll-bar.js +1 -1
- package/esm/constant/sunburst.js +1 -1
- package/esm/constant/waterfall.js +1 -1
- package/esm/constant/word-cloud.js +1 -1
- package/esm/core/instance-manager.js +1 -1
- package/esm/core/interface.js +1 -1
- package/esm/core/util.js +1 -1
- package/esm/core/vchart.js +1 -1
- package/esm/data/transforms/box-plot.d.ts +4 -1
- package/esm/data/transforms/box-plot.js +4 -4
- package/esm/data/transforms/box-plot.js.map +1 -1
- package/esm/data/transforms/correlation-center.d.ts +11 -4
- package/esm/data/transforms/correlation-center.js +4 -2
- package/esm/data/transforms/correlation-center.js.map +1 -1
- package/esm/data/transforms/correlation.d.ts +18 -15
- package/esm/data/transforms/correlation.js +13 -8
- package/esm/data/transforms/correlation.js.map +1 -1
- package/esm/data/transforms/funnel.d.ts +10 -8
- package/esm/data/transforms/funnel.js +5 -3
- package/esm/data/transforms/funnel.js.map +1 -1
- package/esm/data/transforms/lookup.d.ts +3 -3
- package/esm/data/transforms/lookup.js +12 -6
- package/esm/data/transforms/lookup.js.map +1 -1
- package/esm/data/transforms/map.d.ts +8 -2
- package/esm/data/transforms/map.js +11 -6
- package/esm/data/transforms/map.js.map +1 -1
- package/esm/data/transforms/sankey.d.ts +12 -4
- package/esm/data/transforms/sankey.js +19 -14
- package/esm/data/transforms/sankey.js.map +1 -1
- package/esm/data/transforms/stack-split.d.ts +2 -1
- package/esm/data/transforms/stack-split.js +2 -2
- package/esm/data/transforms/stack-split.js.map +1 -1
- package/esm/data/transforms/treemap.d.ts +5 -3
- package/esm/data/transforms/treemap.js +8 -5
- package/esm/data/transforms/treemap.js.map +1 -1
- package/esm/data/transforms/venn.d.ts +4 -2
- package/esm/data/transforms/venn.js +5 -3
- package/esm/data/transforms/venn.js.map +1 -1
- package/esm/data/transforms/waterfall.d.ts +4 -2
- package/esm/data/transforms/waterfall.js +7 -8
- package/esm/data/transforms/waterfall.js.map +1 -1
- package/esm/series/base/base-series.js +2 -2
- package/esm/series/base/base-series.js.map +1 -1
- package/esm/series/box-plot/box-plot.js +2 -2
- package/esm/series/box-plot/box-plot.js.map +1 -1
- package/esm/series/correlation/correlation.js +13 -11
- package/esm/series/correlation/correlation.js.map +1 -1
- package/esm/series/dot/dot.d.ts +11 -0
- package/esm/series/dot/dot.js +17 -0
- package/esm/series/dot/dot.js.map +1 -1
- package/esm/series/funnel/funnel.js +5 -8
- package/esm/series/funnel/funnel.js.map +1 -1
- package/esm/series/map/map.js +3 -3
- package/esm/series/map/map.js.map +1 -1
- package/esm/series/polar/progress-like/progress-like.d.ts +2 -0
- package/esm/series/polar/progress-like/progress-like.js +17 -0
- package/esm/series/polar/progress-like/progress-like.js.map +1 -1
- package/esm/series/polar/rose-like/rose-like.d.ts +2 -0
- package/esm/series/polar/rose-like/rose-like.js +16 -0
- package/esm/series/polar/rose-like/rose-like.js.map +1 -1
- package/esm/series/progress/circular/circular.js +2 -1
- package/esm/series/progress/circular/circular.js.map +1 -1
- package/esm/series/progress/linear/linear.js +3 -1
- package/esm/series/progress/linear/linear.js.map +1 -1
- package/esm/series/sankey/sankey.js +35 -33
- package/esm/series/sankey/sankey.js.map +1 -1
- package/esm/series/treemap/treemap.js +23 -20
- package/esm/series/treemap/treemap.js.map +1 -1
- package/esm/series/venn/venn.js +2 -2
- package/esm/series/venn/venn.js.map +1 -1
- package/esm/series/waterfall/waterfall.js +26 -20
- package/esm/series/waterfall/waterfall.js.map +1 -1
- package/package.json +10 -10
|
@@ -3,10 +3,10 @@ import type { Datum } from '../../typings';
|
|
|
3
3
|
export interface ILookUpOpt {
|
|
4
4
|
from: () => object[];
|
|
5
5
|
key: string;
|
|
6
|
-
fields: string;
|
|
6
|
+
fields: string | (() => string);
|
|
7
7
|
values?: string[];
|
|
8
8
|
as?: string[];
|
|
9
|
-
default?:
|
|
10
|
-
set?: (A: Datum, B
|
|
9
|
+
default?: unknown;
|
|
10
|
+
set?: (A: Datum, B?: Datum) => void;
|
|
11
11
|
}
|
|
12
12
|
export declare const lookup: (data: Array<DataView>, opt: ILookUpOpt) => DataView[];
|
|
@@ -1,22 +1,28 @@
|
|
|
1
1
|
import { isFunction, isNil, isValid } from "@visactor/vutils";
|
|
2
2
|
|
|
3
|
+
const resolveOptionValue = option => isFunction(option) ? option() : option;
|
|
4
|
+
|
|
3
5
|
export const lookup = (data, opt) => {
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
|
|
6
|
+
var _a;
|
|
7
|
+
const fromData = null === (_a = opt.from) || void 0 === _a ? void 0 : _a.call(opt);
|
|
8
|
+
if (!fromData) return data;
|
|
9
|
+
const fields = (option = opt.fields, isFunction(option) ? option() : option);
|
|
10
|
+
var option;
|
|
11
|
+
const key = opt.key, values = opt.values, defaultValue = opt.default, as = opt.as || [ fields ], index = fromData.reduce((function(map, obj) {
|
|
12
|
+
return obj[fields] && map.set(`${obj[fields]}`, obj), map;
|
|
7
13
|
}), new Map);
|
|
8
14
|
let set;
|
|
9
15
|
if (isFunction(opt.set)) set = function(d) {
|
|
10
|
-
const v = index.get(d[key]);
|
|
16
|
+
const v = index.get(`${d[key]}`);
|
|
11
17
|
opt.set(d, v);
|
|
12
18
|
}; else if (values) {
|
|
13
19
|
const m = values.length;
|
|
14
20
|
set = function(d) {
|
|
15
|
-
const v = index.get(d[key]);
|
|
21
|
+
const v = index.get(`${d[key]}`);
|
|
16
22
|
if (isNil(v)) for (let i = 0; i < m; ++i) d[as[i]] = defaultValue; else for (let i = 0; i < m; ++i) d[as[i]] = v[values[i]];
|
|
17
23
|
};
|
|
18
24
|
} else set = function(d) {
|
|
19
|
-
const v = index.get(d[key]);
|
|
25
|
+
const v = index.get(`${d[key]}`);
|
|
20
26
|
d[as[0]] = isValid(v) ? v : defaultValue;
|
|
21
27
|
};
|
|
22
28
|
return 0 === data.length ? [] : data.map((d => (set(d), d)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data/transforms/lookup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAc9D,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAqB,EAAE,GAAe,EAAE,EAAE
|
|
1
|
+
{"version":3,"sources":["../src/data/transforms/lookup.ts"],"names":[],"mappings":"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","file":"lookup.js","sourcesContent":["import type { DataView } from '@visactor/vdataset';\nimport { isFunction, isNil, isValid } from '@visactor/vutils';\nimport type { Datum } from '../../typings';\n\nexport interface ILookUpOpt {\n from: () => object[];\n key: string;\n // 暂时不支持Multi-field lookup\n fields: string | (() => string);\n values?: string[];\n as?: string[];\n default?: unknown;\n set?: (A: Datum, B?: Datum) => void;\n}\n\nconst resolveOptionValue = <T>(option: T | (() => T)) => (isFunction(option) ? option() : option);\n\nexport const lookup = (data: Array<DataView>, opt: ILookUpOpt) => {\n const fromData = opt.from?.();\n if (!fromData) {\n return data;\n }\n\n const fields = resolveOptionValue(opt.fields);\n const key = opt.key;\n const values = opt.values;\n const defaultValue = opt.default;\n const as = opt.as || [fields];\n const index = (fromData as Array<Record<string, unknown>>).reduce(function (\n map: Map<string, Record<string, unknown>>,\n obj\n ) {\n if (obj[fields]) {\n map.set(`${obj[fields]}`, obj);\n }\n return map;\n }, new Map<string, Record<string, unknown>>());\n\n let set: (d: Record<string, unknown>) => void;\n if (isFunction(opt.set)) {\n set = function (d: Record<string, unknown>) {\n const v = index.get(`${d[key]}`);\n opt.set(d as Datum, v as Datum);\n };\n } else if (values) {\n const m = values.length;\n set = function (d: Record<string, unknown>) {\n const v = index.get(`${d[key]}`);\n if (isNil(v)) {\n for (let i = 0; i < m; ++i) {\n d[as[i]] = defaultValue;\n }\n } else {\n for (let i = 0; i < m; ++i) {\n d[as[i]] = v[values[i]];\n }\n }\n };\n } else {\n set = function (d: Record<string, unknown>) {\n const v = index.get(`${d[key]}`);\n d[as[0]] = isValid(v) ? v : defaultValue;\n };\n }\n\n if (data.length === 0) {\n return [];\n }\n return (data as unknown as Array<Record<string, unknown>>).map(d => {\n set(d);\n return d;\n }) as unknown as Array<DataView>;\n};\n"]}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import type { GeoSourceType } from '../../typings/geo';
|
|
2
2
|
export interface IMapOpt {
|
|
3
|
-
nameMap: Record<string,
|
|
3
|
+
nameMap: Record<string, unknown>;
|
|
4
4
|
nameProperty: string;
|
|
5
5
|
}
|
|
6
|
-
|
|
6
|
+
type MapFeature = {
|
|
7
|
+
properties?: Record<string, unknown>;
|
|
8
|
+
[key: string]: unknown;
|
|
9
|
+
};
|
|
10
|
+
type MapOption = IMapOpt | (() => IMapOpt);
|
|
11
|
+
export declare const map: (data: GeoSourceType, opt: MapOption) => MapFeature[];
|
|
12
|
+
export {};
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import { DEFAULT_DATA_INDEX, DEFAULT_MAP_LOOK_UP_KEY } from "../../constant/data";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
import { isFunction } from "@visactor/vutils";
|
|
4
|
+
|
|
5
|
+
export const map = (data, opt) => {
|
|
6
|
+
const options = isFunction(opt) ? opt() : opt, features = data.features;
|
|
7
|
+
return features && features.forEach(((f, index) => {
|
|
8
|
+
var _a, _b;
|
|
9
|
+
f[DEFAULT_DATA_INDEX] = index;
|
|
10
|
+
const name = null === (_a = f.properties) || void 0 === _a ? void 0 : _a[options.nameProperty], mappedName = null === (_b = options.nameMap) || void 0 === _b ? void 0 : _b[`${name}`];
|
|
11
|
+
f[DEFAULT_MAP_LOOK_UP_KEY] = mappedName || name;
|
|
12
|
+
})), features;
|
|
13
|
+
};
|
|
9
14
|
//# sourceMappingURL=map.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data/transforms/map.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"sources":["../src/data/transforms/map.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAElF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAa9C,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,IAAmB,EAAE,GAAc,EAAE,EAAE;IACzD,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9C,MAAM,QAAQ,GAAI,IAAoC,CAAC,QAAQ,CAAC;IAChE,IAAI,QAAQ,EAAE;QACZ,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAa,EAAE,EAAE;;YACpC,CAAC,CAAC,kBAAkB,CAAC,GAAG,KAAK,CAAC;YAC9B,MAAM,IAAI,GAAG,MAAA,CAAC,CAAC,UAAU,0CAAG,OAAO,CAAC,YAAY,CAAC,CAAC;YAClD,MAAM,UAAU,GAAG,MAAA,OAAO,CAAC,OAAO,0CAAG,GAAG,IAAI,EAAE,CAAC,CAAC;YAChD,IAAI,UAAU,EAAE;gBACd,CAAC,CAAC,uBAAuB,CAAC,GAAG,UAAU,CAAC;aACzC;iBAAM;gBACL,CAAC,CAAC,uBAAuB,CAAC,GAAG,IAAI,CAAC;aACnC;QACH,CAAC,CAAC,CAAC;KACJ;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC","file":"map.js","sourcesContent":["import { DEFAULT_DATA_INDEX, DEFAULT_MAP_LOOK_UP_KEY } from '../../constant/data';\nimport type { GeoSourceType } from '../../typings/geo';\nimport { isFunction } from '@visactor/vutils';\n\nexport interface IMapOpt {\n nameMap: Record<string, unknown>;\n nameProperty: string;\n}\n\ntype MapFeature = {\n properties?: Record<string, unknown>;\n [key: string]: unknown;\n};\ntype MapOption = IMapOpt | (() => IMapOpt);\n\nexport const map = (data: GeoSourceType, opt: MapOption) => {\n const options = isFunction(opt) ? opt() : opt;\n const features = (data as { features?: MapFeature[] }).features;\n if (features) {\n features.forEach((f, index: number) => {\n f[DEFAULT_DATA_INDEX] = index;\n const name = f.properties?.[options.nameProperty];\n const mappedName = options.nameMap?.[`${name}`];\n if (mappedName) {\n f[DEFAULT_MAP_LOOK_UP_KEY] = mappedName;\n } else {\n f[DEFAULT_MAP_LOOK_UP_KEY] = name;\n }\n });\n }\n return features;\n};\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type SankeyOptions, type SankeyData } from '@visactor/vlayouts';
|
|
2
2
|
export interface ISankeyOpt extends SankeyOptions {
|
|
3
3
|
targetField: string;
|
|
4
4
|
sourceField: string;
|
|
@@ -10,10 +10,18 @@ export interface ISankeyOpt extends SankeyOptions {
|
|
|
10
10
|
y1: number;
|
|
11
11
|
};
|
|
12
12
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
type SankeyLayoutOption = ISankeyOpt | (() => ISankeyOpt);
|
|
14
|
+
type SankeyFormatDatum = Record<string, unknown> & {
|
|
15
|
+
id?: 'links' | 'nodes';
|
|
16
|
+
values?: unknown;
|
|
17
|
+
latestData?: SankeyData[];
|
|
18
|
+
children?: SankeyFormatDatum[];
|
|
19
|
+
};
|
|
20
|
+
export declare const collectHierarchyField: <T>(set: Set<T>, data: SankeyFormatDatum[], field: string) => void;
|
|
21
|
+
export declare const sankeyFormat: (data: SankeyFormatDatum[]) => SankeyData[];
|
|
22
|
+
export declare const sankeyLayout: (data: SankeyData[], op: SankeyLayoutOption) => {
|
|
16
23
|
nodes: import("@visactor/vlayouts").SankeyNodeElement[];
|
|
17
24
|
links: import("@visactor/vlayouts").SankeyLinkElement[];
|
|
18
25
|
columns: import("@visactor/vlayouts").SankeyNodeElement[][];
|
|
19
26
|
}[];
|
|
27
|
+
export {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { SankeyLayout } from "@visactor/vlayouts";
|
|
2
2
|
|
|
3
|
-
import { isArray, isNil } from "@visactor/vutils";
|
|
3
|
+
import { isArray, isFunction, isNil } from "@visactor/vutils";
|
|
4
4
|
|
|
5
5
|
export const collectHierarchyField = (set, data, field) => {
|
|
6
6
|
data.forEach((obj => {
|
|
@@ -24,19 +24,24 @@ export const sankeyFormat = data => {
|
|
|
24
24
|
};
|
|
25
25
|
|
|
26
26
|
export const sankeyLayout = (data, op) => {
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
const options = isFunction(op) ? op() : op;
|
|
28
|
+
if (!data || !(null == options ? void 0 : options.view) || !data.length) return [];
|
|
29
|
+
const view = options.view();
|
|
29
30
|
if (view.x1 - view.x0 == 0 || view.y1 - view.y0 == 0 || view.x1 - view.x0 == -1 / 0 || view.x1 - view.x0 == 1 / 0 || view.y1 - view.y0 == -1 / 0 || view.y1 - view.y0 == 1 / 0) return [];
|
|
30
|
-
const originalData = data[0];
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
31
|
+
const originalData = data[0], layoutData = normalizeSankeyData(originalData, options), layout = new SankeyLayout(options), result = [];
|
|
32
|
+
return result.push(layout.layout(layoutData, view)), result;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const normalizeSankeyData = (data, options) => {
|
|
36
|
+
if ("source" === options.sourceField && "target" === options.targetField && "value" === options.valueField) return data;
|
|
37
|
+
const links = data.links;
|
|
38
|
+
return links ? Object.assign(Object.assign({}, data), {
|
|
39
|
+
links: links.map((link => {
|
|
40
|
+
const updatedLink = {};
|
|
41
|
+
return Object.keys(link).forEach((key => {
|
|
42
|
+
key === options.sourceField ? updatedLink.source = link[options.sourceField] : key === options.targetField ? updatedLink.target = link[options.targetField] : key === options.valueField ? updatedLink.value = link[options.valueField] : updatedLink[key] = link[key];
|
|
43
|
+
})), updatedLink;
|
|
44
|
+
}))
|
|
45
|
+
}) : data;
|
|
41
46
|
};
|
|
42
47
|
//# sourceMappingURL=sankey.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data/transforms/sankey.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/data/transforms/sankey.ts"],"names":[],"mappings":"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","file":"sankey.js","sourcesContent":["import { SankeyLayout, type SankeyOptions, type SankeyData } from '@visactor/vlayouts';\nimport { isArray, isFunction, isNil } from '@visactor/vutils';\n\nexport interface ISankeyOpt extends SankeyOptions {\n targetField: string;\n sourceField: string;\n valueField: string;\n view: () => { x0: number; x1: number; y0: number; y1: number };\n}\n\ntype SankeyLayoutOption = ISankeyOpt | (() => ISankeyOpt);\ntype SankeyFormatDatum = Record<string, unknown> & {\n id?: 'links' | 'nodes';\n values?: unknown;\n latestData?: SankeyData[];\n children?: SankeyFormatDatum[];\n};\n\nexport const collectHierarchyField = <T>(set: Set<T>, data: SankeyFormatDatum[], field: string) => {\n data.forEach(obj => {\n if (!isNil(obj[field])) {\n set.add(obj[field] as T);\n }\n\n if (obj.children && obj.children.length > 0) {\n collectHierarchyField(set, obj.children, field); // 递归处理子节点\n }\n });\n};\n\nexport const sankeyFormat = (data: SankeyFormatDatum[]): SankeyData[] => {\n if (!data || !isArray(data)) {\n return [] as SankeyData[];\n }\n\n if (data.length > 1) {\n /**\n * data structure for Fengshen:\n * [{id:’nodes’, values:[xxx]},{id:’links’, values:[xxx]}]\n */\n const updateData: SankeyData = {\n links: [],\n nodes: []\n };\n data.forEach(datum => {\n if (datum.id === 'links' || datum.id === 'nodes') {\n (updateData as Record<string, unknown>)[datum.id] = datum.values;\n }\n });\n return [updateData];\n }\n /**\n * data structure:\n * [{nodes: [xxx], links: [xxx]}]\n */\n if (data[0]?.latestData) {\n return data[0].latestData;\n }\n return data as unknown as SankeyData[];\n};\n\nexport const sankeyLayout = (data: SankeyData[], op: SankeyLayoutOption) => {\n const options = isFunction(op) ? op() : op;\n if (!data || !options?.view || !data.length) {\n return [];\n }\n\n const view = options.view();\n\n if (\n view.x1 - view.x0 === 0 ||\n view.y1 - view.y0 === 0 ||\n view.x1 - view.x0 === -Infinity ||\n view.x1 - view.x0 === Infinity ||\n view.y1 - view.y0 === -Infinity ||\n view.y1 - view.y0 === Infinity\n ) {\n return [];\n }\n\n const originalData = data[0];\n const layoutData = normalizeSankeyData(originalData, options);\n\n const layout = new SankeyLayout(options);\n\n const result = [];\n\n result.push(layout.layout(layoutData, view));\n\n return result;\n};\n\nconst normalizeSankeyData = (data: SankeyData, options: ISankeyOpt): SankeyData => {\n if (\n options.sourceField === 'source' &&\n options.targetField === 'target' &&\n options.valueField === 'value'\n ) {\n return data;\n }\n\n const links = (data as { links?: Array<Record<string, unknown>> }).links;\n if (!links) {\n return data;\n }\n\n return {\n ...data,\n links: links.map(link => {\n const updatedLink: Record<string, unknown> = {};\n Object.keys(link).forEach(key => {\n if (key === options.sourceField) {\n updatedLink.source = link[options.sourceField];\n } else if (key === options.targetField) {\n updatedLink.target = link[options.targetField];\n } else if (key === options.valueField) {\n updatedLink.value = link[options.valueField];\n } else {\n updatedLink[key] = link[key];\n }\n });\n return updatedLink;\n })\n } as unknown as SankeyData;\n};\n"]}
|
|
@@ -3,4 +3,5 @@ import type { DataView } from '@visactor/vdataset';
|
|
|
3
3
|
export interface IStackOption {
|
|
4
4
|
fields: string[];
|
|
5
5
|
}
|
|
6
|
-
export
|
|
6
|
+
export type StackOption = IStackOption | (() => IStackOption);
|
|
7
|
+
export declare const stackSplit: (data: Array<DataView>, op: StackOption) => ISeriesStackDataNode;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { isNil } from "@visactor/vutils";
|
|
1
|
+
import { isFunction, isNil } from "@visactor/vutils";
|
|
2
2
|
|
|
3
3
|
export const stackSplit = (data, op) => {
|
|
4
4
|
const result = {
|
|
5
5
|
nodes: {}
|
|
6
|
-
}, {fields: fields} = op;
|
|
6
|
+
}, {fields: fields} = isFunction(op) ? op() : op;
|
|
7
7
|
if (!(null == fields ? void 0 : fields.length)) return result;
|
|
8
8
|
const lastFieldIndex = fields.length - 1;
|
|
9
9
|
let nextNode, leaf, temp = result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data/transforms/stack-split.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"sources":["../src/data/transforms/stack-split.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAUrD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAqB,EAAE,EAAe,EAAE,EAAE;IACnE,MAAM,MAAM,GAAqB;QAC/B,KAAK,EAAE,EAAE;KACV,CAAC;IACF,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,IAAI,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,CAAA,EAAE;QACnB,OAAO,MAAM,CAAC;KACf;IACD,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACzC,IAAI,IAAI,GAAyB,MAAM,CAAC;IACxC,IAAI,QAA8B,CAAC;IACnC,IAAI,IAA0B,CAAC;IAC/B,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;QAChB,EAAE,CAAC,UAAU;YACX,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAQ,EAAE,EAAE;gBACjC,IAAI,GAAG,MAAM,CAAC;gBACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBACtC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;oBACpB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBAChB,IAAI,KAAK,CAAC,EAAE,CAAC,EAAE;wBACb,MAAM;qBACP;oBACD,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;oBACpB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;wBACnB,IAAI,CAAC,KAAK,cAAc,EAAE;4BACxB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;yBACjC;6BAAM;4BACL,QAAQ,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;4BACzB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC;yBAC3B;qBACF;oBACD,IAAI,CAAC,KAAK,cAAc,EAAE;wBACxB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAyB,CAAC;wBAC9C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;qBACrB;yBAAM;wBACL,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAyB,CAAC;qBAC/C;iBACF;YACH,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC","file":"stack-split.js","sourcesContent":["import type { ISeriesStackData, ISeriesStackDataLeaf, ISeriesStackDataNode } from '../../series/interface';\nimport { isFunction, isNil } from '@visactor/vutils';\nimport type { DataView } from '@visactor/vdataset';\nimport type { Datum } from '../../typings';\n\nexport interface IStackOption {\n fields: string[];\n}\n\nexport type StackOption = IStackOption | (() => IStackOption);\n\nexport const stackSplit = (data: Array<DataView>, op: StackOption) => {\n const result: ISeriesStackData = {\n nodes: {}\n };\n const { fields } = isFunction(op) ? op() : op;\n if (!fields?.length) {\n return result;\n }\n const lastFieldIndex = fields.length - 1;\n let temp: ISeriesStackDataNode = result;\n let nextNode: ISeriesStackDataNode;\n let leaf: ISeriesStackDataLeaf;\n data.forEach(dv => {\n dv.latestData &&\n dv.latestData.forEach((d: Datum) => {\n temp = result;\n for (let i = 0; i < fields.length; i++) {\n const f = fields[i];\n const fV = d[f];\n if (isNil(fV)) {\n break;\n }\n temp.groupField = f;\n if (!temp.nodes[fV]) {\n if (i === lastFieldIndex) {\n temp.nodes[fV] = { values: [] };\n } else {\n nextNode = { nodes: {} };\n temp.nodes[fV] = nextNode;\n }\n }\n if (i === lastFieldIndex) {\n leaf = temp.nodes[fV] as ISeriesStackDataLeaf;\n leaf.values.push(d);\n } else {\n temp = temp.nodes[fV] as ISeriesStackDataNode;\n }\n }\n });\n });\n return result;\n};\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type
|
|
2
|
-
|
|
1
|
+
import { type TreemapNodeElement, type TreemapOptions } from '@visactor/vlayouts';
|
|
2
|
+
interface ITreemapLayoutOptions extends TreemapOptions {
|
|
3
3
|
getViewBox: () => {
|
|
4
4
|
x0: number;
|
|
5
5
|
x1: number;
|
|
@@ -7,4 +7,6 @@ export declare const treemapLayout: (data: Array<any>, op: TreemapOptions & {
|
|
|
7
7
|
y1: number;
|
|
8
8
|
};
|
|
9
9
|
nameField: string;
|
|
10
|
-
}
|
|
10
|
+
}
|
|
11
|
+
export declare const treemapLayout: (data: Array<Record<string, unknown>>, op: ITreemapLayoutOptions | (() => ITreemapLayoutOptions)) => TreemapNodeElement[];
|
|
12
|
+
export {};
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import { flattenNodes, TreemapLayout } from "@visactor/vlayouts";
|
|
2
2
|
|
|
3
|
+
import { isFunction } from "@visactor/vutils";
|
|
4
|
+
|
|
3
5
|
import { DEFAULT_HIERARCHY_ROOT } from "../../constant/hierarchy";
|
|
4
6
|
|
|
5
7
|
export const treemapLayout = (data, op) => {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
+
const options = isFunction(op) ? op() : op, viewBox = options.getViewBox();
|
|
9
|
+
if (viewBox) {
|
|
10
|
+
const res = new TreemapLayout(options).layout(data, viewBox), nodes = [];
|
|
8
11
|
return flattenNodes(res, nodes, {
|
|
9
|
-
maxDepth: null ==
|
|
10
|
-
}), nodes.forEach((
|
|
12
|
+
maxDepth: null == options ? void 0 : options.maxDepth
|
|
13
|
+
}), nodes.forEach((datum => {
|
|
11
14
|
datum && [ DEFAULT_HIERARCHY_ROOT, "name" ].forEach((key => {
|
|
12
|
-
datum[key] = datum.datum[datum.depth][
|
|
15
|
+
datum[key] = datum.datum[datum.depth][options.nameField];
|
|
13
16
|
}));
|
|
14
17
|
})), nodes;
|
|
15
18
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data/transforms/treemap.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/data/transforms/treemap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAgD,MAAM,oBAAoB,CAAC;AAC/G,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAYlE,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,IAAoC,EACpC,EAAyD,EACzD,EAAE;IACF,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAErC,IAAI,OAAO,EAAE;QACX,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAEzC,MAAM,KAAK,GAAyB,EAAE,CAAC;QACvC,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,QAAQ,EAAE,CAAC,CAAC;QAE1D,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACpB,IAAI,KAAK,EAAE;gBACT,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;oBAC5C,KAA4C,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACnG,CAAC,CAAC,CAAC;aACJ;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC;KACd;IAED,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC","file":"treemap.js","sourcesContent":["import { flattenNodes, TreemapLayout, type TreemapNodeElement, type TreemapOptions } from '@visactor/vlayouts';\nimport { isFunction } from '@visactor/vutils';\nimport { DEFAULT_HIERARCHY_ROOT } from '../../constant/hierarchy';\n\ninterface ITreemapLayoutOptions extends TreemapOptions {\n getViewBox: () => {\n x0: number;\n x1: number;\n y0: number;\n y1: number;\n };\n nameField: string;\n}\n\nexport const treemapLayout = (\n data: Array<Record<string, unknown>>,\n op: ITreemapLayoutOptions | (() => ITreemapLayoutOptions)\n) => {\n const options = isFunction(op) ? op() : op;\n const viewBox = options.getViewBox();\n\n if (viewBox) {\n const layout = new TreemapLayout(options);\n const res = layout.layout(data, viewBox);\n\n const nodes: TreemapNodeElement[] = [];\n flattenNodes(res, nodes, { maxDepth: options?.maxDepth });\n\n nodes.forEach(datum => {\n if (datum) {\n [DEFAULT_HIERARCHY_ROOT, 'name'].forEach(key => {\n (datum as unknown as Record<string, unknown>)[key] = datum.datum[datum.depth][options.nameField];\n });\n }\n });\n\n return nodes;\n }\n\n return [];\n};\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
interface IVennLayoutOptions {
|
|
2
2
|
setField: string;
|
|
3
3
|
valueField: string;
|
|
4
4
|
getViewBox: () => {
|
|
@@ -7,4 +7,6 @@ export declare const vennLayout: (data: Array<any>, op: {
|
|
|
7
7
|
y0: number;
|
|
8
8
|
y1: number;
|
|
9
9
|
};
|
|
10
|
-
}
|
|
10
|
+
}
|
|
11
|
+
export declare const vennLayout: (data: Array<Record<string, unknown>>, op: IVennLayoutOptions | (() => IVennLayoutOptions)) => (import("@visactor/vlayouts").IVennCircleDatum<any> | import("@visactor/vlayouts").IVennOverlapDatum<any>)[];
|
|
12
|
+
export {};
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { vennTransform } from "@visactor/vlayouts";
|
|
2
2
|
|
|
3
|
+
import { isFunction } from "@visactor/vutils";
|
|
4
|
+
|
|
3
5
|
export const vennLayout = (data, op) => {
|
|
4
|
-
const viewBox =
|
|
6
|
+
const options = isFunction(op) ? op() : op, viewBox = options.getViewBox();
|
|
5
7
|
return viewBox && (null == data ? void 0 : data.length) ? vennTransform(Object.assign({
|
|
6
|
-
setField:
|
|
7
|
-
valueField:
|
|
8
|
+
setField: options.setField,
|
|
9
|
+
valueField: options.valueField
|
|
8
10
|
}, viewBox), data) : [];
|
|
9
11
|
};
|
|
10
12
|
//# sourceMappingURL=venn.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data/transforms/venn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"sources":["../src/data/transforms/venn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAa9C,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,IAAoC,EACpC,EAAmD,EACnD,EAAE;IACF,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAErC,IAAI,OAAO,KAAI,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,CAAA,EAAE;QAC3B,OAAO,aAAa,iBAEhB,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAC1B,UAAU,EAAE,OAAO,CAAC,UAAU,IAC3B,OAAO,GAEZ,IAAI,CACL,CAAC;KACH;IAED,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC","file":"venn.js","sourcesContent":["import { vennTransform } from '@visactor/vlayouts';\nimport { isFunction } from '@visactor/vutils';\n\ninterface IVennLayoutOptions {\n setField: string;\n valueField: string;\n getViewBox: () => {\n x0: number;\n x1: number;\n y0: number;\n y1: number;\n };\n}\n\nexport const vennLayout = (\n data: Array<Record<string, unknown>>,\n op: IVennLayoutOptions | (() => IVennLayoutOptions)\n) => {\n const options = isFunction(op) ? op() : op;\n const viewBox = options.getViewBox();\n\n if (viewBox && data?.length) {\n return vennTransform(\n {\n setField: options.setField,\n valueField: options.valueField,\n ...viewBox\n },\n data\n );\n }\n\n return [];\n};\n"]}
|
|
@@ -17,7 +17,8 @@ export interface IWaterfallOpt {
|
|
|
17
17
|
stackInverse: boolean;
|
|
18
18
|
groupData: () => DataView;
|
|
19
19
|
}
|
|
20
|
-
export
|
|
20
|
+
export type WaterfallOption = IWaterfallOpt | (() => IWaterfallOpt);
|
|
21
|
+
export declare const waterfall: (lastData: Array<Datum>, op: WaterfallOption) => Datum[];
|
|
21
22
|
export interface IWaterfallFillEndOpt {
|
|
22
23
|
indexField: string;
|
|
23
24
|
valueField: string;
|
|
@@ -25,4 +26,5 @@ export interface IWaterfallFillEndOpt {
|
|
|
25
26
|
total: IWaterfallSeriesSpec['total'];
|
|
26
27
|
calculationMode: IWaterfallSeriesSpec['calculationMode'];
|
|
27
28
|
}
|
|
28
|
-
export
|
|
29
|
+
export type WaterfallFillEndOption = IWaterfallFillEndOpt | (() => IWaterfallFillEndOpt);
|
|
30
|
+
export declare const waterfallFillTotal: (data: Array<Datum>, op: WaterfallFillEndOption) => Datum[];
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isNil, precisionAdd, precisionSub } from "@visactor/vutils";
|
|
1
|
+
import { isFunction, isNil, precisionAdd, precisionSub } from "@visactor/vutils";
|
|
2
2
|
|
|
3
3
|
import { WaterfallDefaultSeriesField } from "../../constant/waterfall";
|
|
4
4
|
|
|
@@ -8,7 +8,7 @@ import { STACK_FIELD_TOTAL_TOP } from "../../constant/data";
|
|
|
8
8
|
|
|
9
9
|
export const waterfall = (lastData, op) => {
|
|
10
10
|
if (!lastData || 0 === lastData.length) return lastData;
|
|
11
|
-
const {indexField: indexField, total: totalSpec, groupData: groupData, calculationMode: calculationMode} =
|
|
11
|
+
const options = isFunction(op) ? op() : op, {indexField: indexField, total: totalSpec, groupData: groupData, calculationMode: calculationMode} = options, totalData = [], {dimensionValues: dimensionValues, dimensionData: dimensionData} = groupData().latestData;
|
|
12
12
|
let indexValues = Array.from(dimensionValues[indexField]);
|
|
13
13
|
"decrease" === calculationMode && (indexValues = indexValues.reverse());
|
|
14
14
|
let temp = {
|
|
@@ -28,7 +28,7 @@ export const waterfall = (lastData, op) => {
|
|
|
28
28
|
isTotal: !1,
|
|
29
29
|
positive: temp.end,
|
|
30
30
|
negative: temp.end
|
|
31
|
-
}, indexData = !0 ===
|
|
31
|
+
}, indexData = !0 === options.stackInverse ? dimensionData[key].reverse() : dimensionData[key];
|
|
32
32
|
if (null == indexData || indexData.forEach(((d, i) => {
|
|
33
33
|
i === indexData.length - 1 ? d[STACK_FIELD_TOTAL_TOP] = !0 : delete d[STACK_FIELD_TOTAL_TOP];
|
|
34
34
|
})), indexData.length > 1) {
|
|
@@ -40,10 +40,10 @@ export const waterfall = (lastData, op) => {
|
|
|
40
40
|
} else if (index === indexValues.length - 1) return !0;
|
|
41
41
|
return !1;
|
|
42
42
|
};
|
|
43
|
-
if (indexData.some((d => isTotalCheck(d)))) return temp = computeTotalWithMultipleData(indexData, key, total, totalData, temp, indexValues, index,
|
|
43
|
+
if (indexData.some((d => isTotalCheck(d)))) return temp = computeTotalWithMultipleData(indexData, key, total, totalData, temp, indexValues, index, options, isTotalCheck),
|
|
44
44
|
void totalData.push(total);
|
|
45
45
|
}
|
|
46
|
-
temp = computeNormalData(indexData, key, total, totalData, temp, indexValues, index,
|
|
46
|
+
temp = computeNormalData(indexData, key, total, totalData, temp, indexValues, index, options),
|
|
47
47
|
totalData.push(total);
|
|
48
48
|
})), totalData;
|
|
49
49
|
};
|
|
@@ -156,11 +156,10 @@ function getTotalInField(d, total, totalSpec) {
|
|
|
156
156
|
|
|
157
157
|
export const waterfallFillTotal = (data, op) => {
|
|
158
158
|
if (!data) return data;
|
|
159
|
-
const {indexField: indexField, valueField: valueField, total: total, seriesField: seriesField, calculationMode: calculationMode} = op, totalData = {
|
|
159
|
+
const {indexField: indexField, valueField: valueField, total: total, seriesField: seriesField, calculationMode: calculationMode} = isFunction(op) ? op() : op, totalData = {
|
|
160
160
|
[indexField]: (null == total ? void 0 : total.text) || "total",
|
|
161
161
|
[valueField]: data.reduce(((pre, cur) => precisionAdd(pre, +cur[valueField])), 0)
|
|
162
162
|
};
|
|
163
|
-
return seriesField && (totalData[seriesField] = "total"), "decrease" === calculationMode ?
|
|
164
|
-
data;
|
|
163
|
+
return seriesField && (totalData[seriesField] = "total"), "decrease" === calculationMode ? [ totalData, ...data ] : [ ...data, totalData ];
|
|
165
164
|
};
|
|
166
165
|
//# sourceMappingURL=waterfall.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data/transforms/waterfall.ts"],"names":[],"mappings":"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","file":"waterfall.js","sourcesContent":["import { isNil, precisionAdd, precisionSub } from '@visactor/vutils';\n\nimport type { DataView } from '@visactor/vdataset';\nimport type {\n IWaterfallSeriesSpec,\n IWaterfallTotalCustom,\n IWaterfallTotalField\n} from '../../series/waterfall/interface';\nimport type { Datum } from '../../typings';\nimport { WaterfallDefaultSeriesField } from '../../constant/waterfall';\nimport { warn } from '../../util/debug';\nimport { STACK_FIELD_TOTAL_TOP } from '../../constant/data';\n\ntype TotalInfo = {\n start: number;\n end: number;\n lastIndex: string;\n lastEnd: number;\n index: string;\n isTotal: boolean;\n positive: number;\n negative: number;\n};\n\nexport interface IWaterfallOpt {\n indexField: string;\n valueField: string;\n seriesField?: string;\n startAs: string;\n endAs: string;\n total: IWaterfallSeriesSpec['total'];\n calculationMode: 'increase' | 'decrease';\n\n seriesFieldName: {\n total: string;\n increase: string;\n decrease: string;\n };\n stackInverse: boolean;\n groupData: () => DataView;\n}\n\nexport const waterfall = (lastData: Array<Datum>, op: IWaterfallOpt) => {\n if (!lastData || lastData.length === 0) {\n return lastData;\n }\n const { indexField, total: totalSpec, groupData, calculationMode } = op;\n const totalData: {\n start: number;\n end: number;\n lastIndex: string;\n lastEnd: number;\n index: string;\n isTotal: boolean;\n positive: number;\n negative: number;\n }[] = [];\n const { dimensionValues, dimensionData } = groupData().latestData as {\n dimensionValues: { [key in string]: Set<string> };\n dimensionData: { [key in string]: Datum[] };\n };\n let indexValues = Array.from(dimensionValues[indexField]);\n if (calculationMode === 'decrease') {\n indexValues = indexValues.reverse();\n }\n // 上一次的计算结果\n let temp: { start: number; end: number; lastIndex: string; positive: number; negative: number } = {\n start: 0,\n end: 0,\n positive: 0,\n negative: 0,\n lastIndex: null\n };\n indexValues.forEach((key, index) => {\n const total = {\n start: temp.end,\n end: temp.end,\n lastIndex: temp.lastIndex,\n lastEnd: temp.end,\n index: key,\n isTotal: false,\n positive: temp.end,\n negative: temp.end\n };\n\n const indexData = op.stackInverse === true ? dimensionData[key].reverse() : dimensionData[key];\n indexData?.forEach((d, i) => {\n if (i === indexData.length - 1) {\n d[STACK_FIELD_TOTAL_TOP] = true;\n } else {\n delete d[STACK_FIELD_TOTAL_TOP];\n }\n });\n // 1.9.5 新增能力\n // 当前 key 对应的数据中有一个总计数据,并且还有其他的分组数据时。总计的计算逻辑需要将总计值拆分\n if (indexData.length > 1) {\n const isTotalCheck = (d: Datum) => {\n if (!totalSpec || totalSpec.type === 'end') {\n if (index === indexValues.length - 1) {\n return true;\n }\n } else if (totalSpec.type === 'field' || totalSpec.type === 'custom') {\n const tag = d[totalSpec.tagField];\n return !!tag;\n }\n return false;\n };\n const isTotalTag = indexData.some(d => isTotalCheck(d));\n if (isTotalTag) {\n temp = computeTotalWithMultipleData(\n indexData,\n key,\n total,\n totalData,\n temp,\n indexValues,\n index,\n op,\n isTotalCheck\n );\n totalData.push(total);\n return;\n }\n }\n temp = computeNormalData(indexData, key, total, totalData, temp, indexValues, index, op);\n totalData.push(total);\n });\n return totalData;\n};\n\nfunction computeTotalWithMultipleData(\n indexData: Datum[],\n key: string,\n total: TotalInfo,\n totalData: TotalInfo[],\n temp: { start: number; end: number; lastIndex: string; positive: number; negative: number },\n indexValues: string[],\n index: number,\n op: IWaterfallOpt,\n isTotalCheck: (d: Datum) => boolean\n) {\n total.isTotal = true;\n const { valueField, startAs, endAs, total: totalSpec } = op;\n // 先将数据分为总计数据与常规数据\n const _normalTemp: Datum[] = [];\n const _totalTemp: Datum[] = [];\n // 将总计数据与常规数据进行分离\n indexData.forEach((d, index) => {\n if (isTotalCheck(d)) {\n // 总计数据后续要重新按照顺序计算 start end 信息,所以需要记录下当前的 index\n _totalTemp.push({ ...d, [`_vchart_waterfall_waterfall_temp`]: index });\n } else {\n _normalTemp.push(d);\n }\n });\n // 1. 不可能全都不是总计数据\n // 2. 如果全都是总计数据,让它们都是同一个值\n if (_totalTemp.length === indexData.length) {\n const result = computeNormalData([indexData[0]], key, total, totalData, temp, indexValues, index, op);\n _totalTemp.forEach(d => {\n d[startAs] = indexData[0][startAs];\n d[endAs] = indexData[0][endAs];\n d[valueField] = indexData[0][valueField];\n });\n return result;\n }\n\n // 3. 其他常规情况\n // 先获取当前的起始值/结束值应当是多少\n // 按照第一个总计数据的配置来决定\n const totalConfigData = _totalTemp[0];\n // 获取配置中的总计结果\n // eslint-disable-next-line prefer-const\n let { start, end } = getTotalStartEnd(totalConfigData, total, totalData, temp, totalSpec);\n total.start = start;\n total.end = end;\n let positive = start;\n let navigate = start;\n // 当前剩余的总计值\n let valueTemp = end - start;\n const tempTotalValue = _normalTemp.reduce((pre, cur) => precisionSub(pre, +cur[valueField]), valueTemp);\n // 模拟一组临时总计数据,用来堆叠\n _totalTemp.forEach(d => {\n const tempTotalData = {\n [startAs]: start,\n [endAs]: end,\n [valueField]: tempTotalValue\n };\n // 将临时总计插入 `_vchart_waterfall_waterfall_temp_${index}` 中\n _normalTemp.splice(d._vchart_waterfall_waterfall_temp, 0, tempTotalData);\n });\n // 将全部数据进行堆叠\n _normalTemp.forEach(d => {\n const value = +d[valueField];\n if (value >= 0) {\n d[startAs] = +positive;\n positive = precisionAdd(positive, value);\n } else {\n d[startAs] = +navigate;\n navigate = precisionAdd(navigate, value);\n }\n d[endAs] = precisionAdd(d[startAs], value);\n start = precisionAdd(start, value);\n valueTemp = precisionSub(valueTemp, value);\n });\n // 设置数据中的总计数据\n _totalTemp.forEach(_d => {\n const index = _d._vchart_waterfall_waterfall_temp;\n // 数据的堆积计算结果\n _d = _normalTemp[index];\n // 原始数据\n const d = indexData[index];\n d[startAs] = _d[startAs];\n d[endAs] = _d[endAs];\n d[valueField] = _d[valueField];\n });\n return { ...total, lastIndex: key };\n}\n\nfunction computeNormalData(\n indexData: Datum[],\n key: string,\n total: TotalInfo,\n totalData: TotalInfo[],\n temp: { start: number; end: number; lastIndex: string; positive: number; negative: number },\n indexValues: string[],\n index: number,\n op: IWaterfallOpt\n) {\n const { valueField, startAs, endAs, total: totalSpec, seriesField, seriesFieldName } = op;\n indexData.forEach(d => {\n let isTotalTag = false;\n if (!totalSpec || totalSpec.type === 'end') {\n if (index === indexValues.length - 1) {\n total.start = 0;\n d[startAs] = total.start;\n d[endAs] = total.end;\n isTotalTag = true;\n }\n } else if (totalSpec.type === 'field' || totalSpec.type === 'custom') {\n const tag = d[totalSpec.tagField];\n if (tag) {\n isTotalTag = true;\n const { start, end } = getTotalStartEnd(d, total, totalData, temp, totalSpec);\n d[startAs] = start;\n d[endAs] = end;\n d[valueField] = end - start;\n total.start = start;\n total.end = end;\n }\n }\n if (!isTotalTag) {\n const value = +d[valueField];\n // 区分正负值\n if (value >= 0) {\n d[startAs] = +total.positive;\n total.positive = precisionAdd(total.positive, value);\n } else {\n d[startAs] = +total.negative;\n total.negative = precisionAdd(total.negative, value);\n }\n d[endAs] = precisionAdd(d[startAs], value);\n total.end = precisionAdd(total.end, value);\n }\n total.isTotal = isTotalTag;\n\n if (isNil(seriesField) || seriesField === WaterfallDefaultSeriesField) {\n if (isTotalTag) {\n d[WaterfallDefaultSeriesField] = seriesFieldName.total;\n } else {\n d[WaterfallDefaultSeriesField] = +d[valueField] >= 0 ? seriesFieldName.increase : seriesFieldName.decrease;\n }\n }\n });\n return { ...total, lastIndex: key };\n}\n\nfunction getTotalStartEnd(\n d: Datum,\n total: TotalInfo,\n totalData: TotalInfo[],\n temp: { start: number; end: number; lastIndex: string; positive: number; negative: number },\n totalSpec: IWaterfallOpt['total']\n) {\n if (!totalSpec || totalSpec.type === 'end') {\n return getTotalInEndType(total);\n } else if (totalSpec.type === 'field' || totalSpec.type === 'custom') {\n if (totalSpec.type === 'custom') {\n return getTotalInCustomType(d, temp, totalSpec);\n }\n // 如果有设置count, valueField 和 startField 无效\n if (totalSpec.collectCountField && !isNil(d[totalSpec.collectCountField])) {\n return getTotalInCollectField(d, totalData, total, totalSpec);\n }\n return getTotalInField(d, total, totalSpec);\n }\n return { start: 0, end: 0 };\n}\n\nfunction getTotalInEndType(total: TotalInfo) {\n return { start: 0, end: total.end };\n}\n\nfunction getTotalInCustomType(\n d: Datum,\n temp: { start: number; end: number; lastIndex: string; positive: number; negative: number },\n totalSpec: IWaterfallOpt['total']\n) {\n return (<IWaterfallTotalCustom>totalSpec).product(d, temp);\n}\n\nfunction getTotalInCollectField(d: Datum, totalData: TotalInfo[], total: TotalInfo, totalSpec: IWaterfallTotalField) {\n let start = 0;\n let end = total.end;\n const startIndex = totalData.length - +d[totalSpec.collectCountField];\n const endIndex = totalData.length - 1;\n if (startIndex < 0) {\n warn('total.collectCountField error');\n } else {\n start = totalData[startIndex].start;\n }\n if (endIndex < 0) {\n warn('total.collectCountField error');\n } else {\n end = totalData[endIndex].end;\n }\n return { start, end };\n}\n\nfunction getTotalInField(d: Datum, total: TotalInfo, totalSpec: IWaterfallTotalField) {\n let start = 0;\n let end = total.end;\n if (totalSpec.startField && !isNil(d[totalSpec.startField])) {\n start = +d[totalSpec.startField];\n }\n if (totalSpec.valueField && !isNil(d[totalSpec.valueField])) {\n end = precisionAdd(start, +d[totalSpec.valueField]);\n }\n return { start, end };\n}\n\nexport interface IWaterfallFillEndOpt {\n indexField: string;\n valueField: string;\n seriesField?: string;\n total: IWaterfallSeriesSpec['total'];\n calculationMode: IWaterfallSeriesSpec['calculationMode'];\n}\n\nexport const waterfallFillTotal = (data: Array<Datum>, op: IWaterfallFillEndOpt) => {\n if (!data) {\n return data;\n }\n const { indexField, valueField, total, seriesField, calculationMode } = op;\n const totalData = {\n [indexField]: total?.text || 'total',\n [valueField]: data.reduce((pre, cur) => precisionAdd(pre, +cur[valueField]), 0)\n };\n if (seriesField) {\n totalData[seriesField] = 'total';\n }\n if (calculationMode === 'decrease') {\n data.unshift(totalData);\n } else {\n data.push(totalData);\n }\n return data;\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/data/transforms/waterfall.ts"],"names":[],"mappings":"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","file":"waterfall.js","sourcesContent":["import { isFunction, isNil, precisionAdd, precisionSub } from '@visactor/vutils';\n\nimport type { DataView } from '@visactor/vdataset';\nimport type {\n IWaterfallSeriesSpec,\n IWaterfallTotalCustom,\n IWaterfallTotalField\n} from '../../series/waterfall/interface';\nimport type { Datum } from '../../typings';\nimport { WaterfallDefaultSeriesField } from '../../constant/waterfall';\nimport { warn } from '../../util/debug';\nimport { STACK_FIELD_TOTAL_TOP } from '../../constant/data';\n\ntype TotalInfo = {\n start: number;\n end: number;\n lastIndex: string;\n lastEnd: number;\n index: string;\n isTotal: boolean;\n positive: number;\n negative: number;\n};\n\nexport interface IWaterfallOpt {\n indexField: string;\n valueField: string;\n seriesField?: string;\n startAs: string;\n endAs: string;\n total: IWaterfallSeriesSpec['total'];\n calculationMode: 'increase' | 'decrease';\n\n seriesFieldName: {\n total: string;\n increase: string;\n decrease: string;\n };\n stackInverse: boolean;\n groupData: () => DataView;\n}\n\nexport type WaterfallOption = IWaterfallOpt | (() => IWaterfallOpt);\n\nexport const waterfall = (lastData: Array<Datum>, op: WaterfallOption) => {\n if (!lastData || lastData.length === 0) {\n return lastData;\n }\n const options = isFunction(op) ? op() : op;\n const { indexField, total: totalSpec, groupData, calculationMode } = options;\n const totalData: {\n start: number;\n end: number;\n lastIndex: string;\n lastEnd: number;\n index: string;\n isTotal: boolean;\n positive: number;\n negative: number;\n }[] = [];\n const { dimensionValues, dimensionData } = groupData().latestData as {\n dimensionValues: { [key in string]: Set<string> };\n dimensionData: { [key in string]: Datum[] };\n };\n let indexValues = Array.from(dimensionValues[indexField]);\n if (calculationMode === 'decrease') {\n indexValues = indexValues.reverse();\n }\n // 上一次的计算结果\n let temp: { start: number; end: number; lastIndex: string; positive: number; negative: number } = {\n start: 0,\n end: 0,\n positive: 0,\n negative: 0,\n lastIndex: null\n };\n indexValues.forEach((key, index) => {\n const total = {\n start: temp.end,\n end: temp.end,\n lastIndex: temp.lastIndex,\n lastEnd: temp.end,\n index: key,\n isTotal: false,\n positive: temp.end,\n negative: temp.end\n };\n\n const indexData = options.stackInverse === true ? dimensionData[key].reverse() : dimensionData[key];\n indexData?.forEach((d, i) => {\n if (i === indexData.length - 1) {\n d[STACK_FIELD_TOTAL_TOP] = true;\n } else {\n delete d[STACK_FIELD_TOTAL_TOP];\n }\n });\n // 1.9.5 新增能力\n // 当前 key 对应的数据中有一个总计数据,并且还有其他的分组数据时。总计的计算逻辑需要将总计值拆分\n if (indexData.length > 1) {\n const isTotalCheck = (d: Datum) => {\n if (!totalSpec || totalSpec.type === 'end') {\n if (index === indexValues.length - 1) {\n return true;\n }\n } else if (totalSpec.type === 'field' || totalSpec.type === 'custom') {\n const tag = d[totalSpec.tagField];\n return !!tag;\n }\n return false;\n };\n const isTotalTag = indexData.some(d => isTotalCheck(d));\n if (isTotalTag) {\n temp = computeTotalWithMultipleData(\n indexData,\n key,\n total,\n totalData,\n temp,\n indexValues,\n index,\n options,\n isTotalCheck\n );\n totalData.push(total);\n return;\n }\n }\n temp = computeNormalData(indexData, key, total, totalData, temp, indexValues, index, options);\n totalData.push(total);\n });\n return totalData;\n};\n\nfunction computeTotalWithMultipleData(\n indexData: Datum[],\n key: string,\n total: TotalInfo,\n totalData: TotalInfo[],\n temp: { start: number; end: number; lastIndex: string; positive: number; negative: number },\n indexValues: string[],\n index: number,\n op: IWaterfallOpt,\n isTotalCheck: (d: Datum) => boolean\n) {\n total.isTotal = true;\n const { valueField, startAs, endAs, total: totalSpec } = op;\n // 先将数据分为总计数据与常规数据\n const _normalTemp: Datum[] = [];\n const _totalTemp: Datum[] = [];\n // 将总计数据与常规数据进行分离\n indexData.forEach((d, index) => {\n if (isTotalCheck(d)) {\n // 总计数据后续要重新按照顺序计算 start end 信息,所以需要记录下当前的 index\n _totalTemp.push({ ...d, [`_vchart_waterfall_waterfall_temp`]: index });\n } else {\n _normalTemp.push(d);\n }\n });\n // 1. 不可能全都不是总计数据\n // 2. 如果全都是总计数据,让它们都是同一个值\n if (_totalTemp.length === indexData.length) {\n const result = computeNormalData([indexData[0]], key, total, totalData, temp, indexValues, index, op);\n _totalTemp.forEach(d => {\n d[startAs] = indexData[0][startAs];\n d[endAs] = indexData[0][endAs];\n d[valueField] = indexData[0][valueField];\n });\n return result;\n }\n\n // 3. 其他常规情况\n // 先获取当前的起始值/结束值应当是多少\n // 按照第一个总计数据的配置来决定\n const totalConfigData = _totalTemp[0];\n // 获取配置中的总计结果\n // eslint-disable-next-line prefer-const\n let { start, end } = getTotalStartEnd(totalConfigData, total, totalData, temp, totalSpec);\n total.start = start;\n total.end = end;\n let positive = start;\n let navigate = start;\n // 当前剩余的总计值\n let valueTemp = end - start;\n const tempTotalValue = _normalTemp.reduce((pre, cur) => precisionSub(pre, +cur[valueField]), valueTemp);\n // 模拟一组临时总计数据,用来堆叠\n _totalTemp.forEach(d => {\n const tempTotalData = {\n [startAs]: start,\n [endAs]: end,\n [valueField]: tempTotalValue\n };\n // 将临时总计插入 `_vchart_waterfall_waterfall_temp_${index}` 中\n _normalTemp.splice(d._vchart_waterfall_waterfall_temp, 0, tempTotalData);\n });\n // 将全部数据进行堆叠\n _normalTemp.forEach(d => {\n const value = +d[valueField];\n if (value >= 0) {\n d[startAs] = +positive;\n positive = precisionAdd(positive, value);\n } else {\n d[startAs] = +navigate;\n navigate = precisionAdd(navigate, value);\n }\n d[endAs] = precisionAdd(d[startAs], value);\n start = precisionAdd(start, value);\n valueTemp = precisionSub(valueTemp, value);\n });\n // 设置数据中的总计数据\n _totalTemp.forEach(_d => {\n const index = _d._vchart_waterfall_waterfall_temp;\n // 数据的堆积计算结果\n _d = _normalTemp[index];\n // 原始数据\n const d = indexData[index];\n d[startAs] = _d[startAs];\n d[endAs] = _d[endAs];\n d[valueField] = _d[valueField];\n });\n return { ...total, lastIndex: key };\n}\n\nfunction computeNormalData(\n indexData: Datum[],\n key: string,\n total: TotalInfo,\n totalData: TotalInfo[],\n temp: { start: number; end: number; lastIndex: string; positive: number; negative: number },\n indexValues: string[],\n index: number,\n op: IWaterfallOpt\n) {\n const { valueField, startAs, endAs, total: totalSpec, seriesField, seriesFieldName } = op;\n indexData.forEach(d => {\n let isTotalTag = false;\n if (!totalSpec || totalSpec.type === 'end') {\n if (index === indexValues.length - 1) {\n total.start = 0;\n d[startAs] = total.start;\n d[endAs] = total.end;\n isTotalTag = true;\n }\n } else if (totalSpec.type === 'field' || totalSpec.type === 'custom') {\n const tag = d[totalSpec.tagField];\n if (tag) {\n isTotalTag = true;\n const { start, end } = getTotalStartEnd(d, total, totalData, temp, totalSpec);\n d[startAs] = start;\n d[endAs] = end;\n d[valueField] = end - start;\n total.start = start;\n total.end = end;\n }\n }\n if (!isTotalTag) {\n const value = +d[valueField];\n // 区分正负值\n if (value >= 0) {\n d[startAs] = +total.positive;\n total.positive = precisionAdd(total.positive, value);\n } else {\n d[startAs] = +total.negative;\n total.negative = precisionAdd(total.negative, value);\n }\n d[endAs] = precisionAdd(d[startAs], value);\n total.end = precisionAdd(total.end, value);\n }\n total.isTotal = isTotalTag;\n\n if (isNil(seriesField) || seriesField === WaterfallDefaultSeriesField) {\n if (isTotalTag) {\n d[WaterfallDefaultSeriesField] = seriesFieldName.total;\n } else {\n d[WaterfallDefaultSeriesField] = +d[valueField] >= 0 ? seriesFieldName.increase : seriesFieldName.decrease;\n }\n }\n });\n return { ...total, lastIndex: key };\n}\n\nfunction getTotalStartEnd(\n d: Datum,\n total: TotalInfo,\n totalData: TotalInfo[],\n temp: { start: number; end: number; lastIndex: string; positive: number; negative: number },\n totalSpec: IWaterfallOpt['total']\n) {\n if (!totalSpec || totalSpec.type === 'end') {\n return getTotalInEndType(total);\n } else if (totalSpec.type === 'field' || totalSpec.type === 'custom') {\n if (totalSpec.type === 'custom') {\n return getTotalInCustomType(d, temp, totalSpec);\n }\n // 如果有设置count, valueField 和 startField 无效\n if (totalSpec.collectCountField && !isNil(d[totalSpec.collectCountField])) {\n return getTotalInCollectField(d, totalData, total, totalSpec);\n }\n return getTotalInField(d, total, totalSpec);\n }\n return { start: 0, end: 0 };\n}\n\nfunction getTotalInEndType(total: TotalInfo) {\n return { start: 0, end: total.end };\n}\n\nfunction getTotalInCustomType(\n d: Datum,\n temp: { start: number; end: number; lastIndex: string; positive: number; negative: number },\n totalSpec: IWaterfallOpt['total']\n) {\n return (<IWaterfallTotalCustom>totalSpec).product(d, temp);\n}\n\nfunction getTotalInCollectField(d: Datum, totalData: TotalInfo[], total: TotalInfo, totalSpec: IWaterfallTotalField) {\n let start = 0;\n let end = total.end;\n const startIndex = totalData.length - +d[totalSpec.collectCountField];\n const endIndex = totalData.length - 1;\n if (startIndex < 0) {\n warn('total.collectCountField error');\n } else {\n start = totalData[startIndex].start;\n }\n if (endIndex < 0) {\n warn('total.collectCountField error');\n } else {\n end = totalData[endIndex].end;\n }\n return { start, end };\n}\n\nfunction getTotalInField(d: Datum, total: TotalInfo, totalSpec: IWaterfallTotalField) {\n let start = 0;\n let end = total.end;\n if (totalSpec.startField && !isNil(d[totalSpec.startField])) {\n start = +d[totalSpec.startField];\n }\n if (totalSpec.valueField && !isNil(d[totalSpec.valueField])) {\n end = precisionAdd(start, +d[totalSpec.valueField]);\n }\n return { start, end };\n}\n\nexport interface IWaterfallFillEndOpt {\n indexField: string;\n valueField: string;\n seriesField?: string;\n total: IWaterfallSeriesSpec['total'];\n calculationMode: IWaterfallSeriesSpec['calculationMode'];\n}\n\nexport type WaterfallFillEndOption = IWaterfallFillEndOpt | (() => IWaterfallFillEndOpt);\n\nexport const waterfallFillTotal = (data: Array<Datum>, op: WaterfallFillEndOption) => {\n if (!data) {\n return data;\n }\n const { indexField, valueField, total, seriesField, calculationMode } = isFunction(op) ? op() : op;\n const totalData = {\n [indexField]: total?.text || 'total',\n [valueField]: data.reduce((pre, cur) => precisionAdd(pre, +cur[valueField]), 0)\n };\n if (seriesField) {\n totalData[seriesField] = 'total';\n }\n if (calculationMode === 'decrease') {\n return [totalData, ...data];\n }\n return [...data, totalData];\n};\n"]}
|
|
@@ -316,9 +316,9 @@ export class BaseSeries extends BaseModel {
|
|
|
316
316
|
type: "dataview"
|
|
317
317
|
}), this._viewStackData.transform({
|
|
318
318
|
type: "stackSplit",
|
|
319
|
-
options: {
|
|
319
|
+
options: () => ({
|
|
320
320
|
fields: this.getStackGroupFields()
|
|
321
|
-
}
|
|
321
|
+
})
|
|
322
322
|
}, !1);
|
|
323
323
|
}
|
|
324
324
|
_noAnimationDataKey(datum, index) {
|