@sentropic/dataviz-core 0.1.0 → 0.2.0
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/dist/aggregate.d.ts +4 -4
- package/dist/aggregate.d.ts.map +1 -1
- package/dist/aggregate.js +13 -7
- package/dist/aggregate.js.map +1 -1
- package/dist/analytics.d.ts +105 -0
- package/dist/analytics.d.ts.map +1 -0
- package/dist/analytics.js +323 -0
- package/dist/analytics.js.map +1 -0
- package/dist/categorical.d.ts +84 -0
- package/dist/categorical.d.ts.map +1 -0
- package/dist/categorical.js +158 -0
- package/dist/categorical.js.map +1 -0
- package/dist/describe.d.ts +11 -0
- package/dist/describe.d.ts.map +1 -0
- package/dist/describe.js +26 -0
- package/dist/describe.js.map +1 -0
- package/dist/distribution.d.ts +109 -0
- package/dist/distribution.d.ts.map +1 -0
- package/dist/distribution.js +231 -0
- package/dist/distribution.js.map +1 -0
- package/dist/fields.d.ts +53 -0
- package/dist/fields.d.ts.map +1 -0
- package/dist/fields.js +108 -0
- package/dist/fields.js.map +1 -0
- package/dist/geo.d.ts +151 -0
- package/dist/geo.d.ts.map +1 -0
- package/dist/geo.js +300 -0
- package/dist/geo.js.map +1 -0
- package/dist/index.d.ts +22 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -2
- package/dist/index.js.map +1 -1
- package/dist/kpi.d.ts +35 -0
- package/dist/kpi.d.ts.map +1 -0
- package/dist/kpi.js +40 -0
- package/dist/kpi.js.map +1 -0
- package/dist/model.d.ts +4 -0
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +4 -0
- package/dist/model.js.map +1 -1
- package/dist/partOfWhole.d.ts +159 -0
- package/dist/partOfWhole.d.ts.map +1 -0
- package/dist/partOfWhole.js +260 -0
- package/dist/partOfWhole.js.map +1 -0
- package/dist/pivot.d.ts +31 -0
- package/dist/pivot.d.ts.map +1 -0
- package/dist/pivot.js +121 -0
- package/dist/pivot.js.map +1 -0
- package/dist/pivotAdvanced.d.ts +47 -0
- package/dist/pivotAdvanced.d.ts.map +1 -0
- package/dist/pivotAdvanced.js +208 -0
- package/dist/pivotAdvanced.js.map +1 -0
- package/dist/serialize.d.ts +15 -3
- package/dist/serialize.d.ts.map +1 -1
- package/dist/serialize.js +55 -20
- package/dist/serialize.js.map +1 -1
- package/dist/store.d.ts +17 -4
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +120 -15
- package/dist/store.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -6,10 +6,21 @@
|
|
|
6
6
|
* bookmark serialisation. Zero framework / design-system dependencies.
|
|
7
7
|
*/
|
|
8
8
|
export { isDimensionType, isAggregation, isDimension, isMeasure, isDataModel, validateModel, assertModel, findDimension, findMeasure, } from './model.js';
|
|
9
|
-
export {
|
|
9
|
+
export { fieldId, parseFieldId, listFields, buildFieldPaneTree, fieldToPill, } from './fields.js';
|
|
10
|
+
// Descriptions
|
|
11
|
+
export { describeFilterSpec } from './describe.js';
|
|
12
|
+
export { buildPivotTable } from './pivot.js';
|
|
13
|
+
export { buildKpiCards } from './kpi.js';
|
|
14
|
+
export { buildCategoricalSeries, buildParetoModel, buildDivergingBarModel, } from './categorical.js';
|
|
15
|
+
export { buildPartWholeModel, buildPartWholeHierarchy, buildWaterfallModel, buildFlowModel, buildRadarModel, buildRoseModel, buildMekkoModel, buildPackedBubbleModel, } from './partOfWhole.js';
|
|
16
|
+
export { buildHistogramModel, buildBoxPlotModel, buildHeatmapModel, buildBulletChartModel, buildGaugeChartModel, } from './distribution.js';
|
|
17
|
+
export { buildAdvancedPivotTable } from './pivotAdvanced.js';
|
|
18
|
+
export { buildReferenceLineModel, buildPercentileBandModel, buildTrendLineModel, buildForecastModel, buildErrorBarsModel, buildAnalyticsClusterModel, } from './analytics.js';
|
|
19
|
+
export { buildGeoPointModel, buildChoroplethModel, buildGeoFlowModel, buildGeoHexbinModel, buildGeoClusterModel, buildGeoDensityModel, buildGeoJsonLayerModel, } from './geo.js';
|
|
20
|
+
export { createDashboardStore, specToPredicate, applyFilters, isFilterSpec } from './store.js';
|
|
10
21
|
export { sourcesFor, applyCrossfilter } from './crossfilter.js';
|
|
11
22
|
// Aggregate
|
|
12
23
|
export { groupBy, aggregate, aggregateValues, extractNumbers, groupAggregate, } from './aggregate.js';
|
|
13
24
|
// Serialize
|
|
14
|
-
export {
|
|
25
|
+
export { serializeFilters, deserializeFilters, serializeDrill, deserializeDrill, } from './serialize.js';
|
|
15
26
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,OAAO,EACL,eAAe,EACf,aAAa,EACb,WAAW,EACX,SAAS,EACT,WAAW,EACX,aAAa,EACb,WAAW,EACX,aAAa,EACb,WAAW,GACZ,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,OAAO,EACL,eAAe,EACf,aAAa,EACb,WAAW,EACX,SAAS,EACT,WAAW,EACX,aAAa,EACb,WAAW,EACX,aAAa,EACb,WAAW,GACZ,MAAM,YAAY,CAAC;AAapB,OAAO,EACL,OAAO,EACP,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,WAAW,GACZ,MAAM,aAAa,CAAC;AAErB,eAAe;AACf,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AASnD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAS7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAoBzC,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAiC1B,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,cAAc,EACd,eAAe,EACf,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAsB1B,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAU3B,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAoB7D,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,gBAAgB,CAAC;AA8BxB,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,UAAU,CAAC;AAYlB,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/F,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEhE,YAAY;AACZ,OAAO,EACL,OAAO,EACP,SAAS,EACT,eAAe,EACf,cAAc,EACd,cAAc,GACf,MAAM,gBAAgB,CAAC;AAExB,YAAY;AACZ,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,gBAAgB,GACjB,MAAM,gBAAgB,CAAC"}
|
package/dist/kpi.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KPI card data contracts.
|
|
3
|
+
*
|
|
4
|
+
* The core computes the BI values; framework adapters render these with DS
|
|
5
|
+
* primitives such as Card, Badge, ProgressBar and Sparkline.
|
|
6
|
+
*/
|
|
7
|
+
import type { DataModel, Row } from './model.js';
|
|
8
|
+
export interface KpiCardConfig {
|
|
9
|
+
id: string;
|
|
10
|
+
label?: string;
|
|
11
|
+
measure: string;
|
|
12
|
+
goal?: number;
|
|
13
|
+
sparklineDimension?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface KpiBuildOptions {
|
|
16
|
+
comparisonData?: readonly Row[];
|
|
17
|
+
}
|
|
18
|
+
export interface KpiSparklinePoint {
|
|
19
|
+
key: string;
|
|
20
|
+
value: number;
|
|
21
|
+
}
|
|
22
|
+
export interface KpiCard {
|
|
23
|
+
id: string;
|
|
24
|
+
label: string;
|
|
25
|
+
measureId: string;
|
|
26
|
+
value: number;
|
|
27
|
+
comparisonValue?: number;
|
|
28
|
+
delta?: number;
|
|
29
|
+
deltaPercent?: number;
|
|
30
|
+
goal?: number;
|
|
31
|
+
progress?: number;
|
|
32
|
+
sparkline?: KpiSparklinePoint[];
|
|
33
|
+
}
|
|
34
|
+
export declare function buildKpiCards(model: DataModel, data: readonly Row[], configs: readonly KpiCardConfig[], options?: KpiBuildOptions): KpiCard[];
|
|
35
|
+
//# sourceMappingURL=kpi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kpi.d.ts","sourceRoot":"","sources":["../src/kpi.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,cAAc,CAAC,EAAE,SAAS,GAAG,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,iBAAiB,EAAE,CAAC;CACjC;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,SAAS,GAAG,EAAE,EACpB,OAAO,EAAE,SAAS,aAAa,EAAE,EACjC,OAAO,GAAE,eAAoB,GAC5B,OAAO,EAAE,CAmCX"}
|
package/dist/kpi.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KPI card data contracts.
|
|
3
|
+
*
|
|
4
|
+
* The core computes the BI values; framework adapters render these with DS
|
|
5
|
+
* primitives such as Card, Badge, ProgressBar and Sparkline.
|
|
6
|
+
*/
|
|
7
|
+
import { aggregate, groupAggregate } from './aggregate.js';
|
|
8
|
+
import { findDimension, findMeasure } from './model.js';
|
|
9
|
+
export function buildKpiCards(model, data, configs, options = {}) {
|
|
10
|
+
return configs.map((config) => {
|
|
11
|
+
const measure = findMeasure(model, config.measure);
|
|
12
|
+
if (!measure) {
|
|
13
|
+
throw new Error(`Unknown KPI measure: ${config.measure}`);
|
|
14
|
+
}
|
|
15
|
+
const card = {
|
|
16
|
+
id: config.id,
|
|
17
|
+
label: config.label ?? measure.label,
|
|
18
|
+
measureId: measure.id,
|
|
19
|
+
value: aggregate([...data], measure),
|
|
20
|
+
};
|
|
21
|
+
if (options.comparisonData !== undefined) {
|
|
22
|
+
const comparisonValue = aggregate([...options.comparisonData], measure);
|
|
23
|
+
card.comparisonValue = comparisonValue;
|
|
24
|
+
card.delta = card.value - comparisonValue;
|
|
25
|
+
card.deltaPercent = comparisonValue === 0 ? Number.NaN : card.delta / comparisonValue;
|
|
26
|
+
}
|
|
27
|
+
if (config.goal !== undefined) {
|
|
28
|
+
card.goal = config.goal;
|
|
29
|
+
card.progress = config.goal === 0 ? Number.NaN : card.value / config.goal;
|
|
30
|
+
}
|
|
31
|
+
if (config.sparklineDimension !== undefined) {
|
|
32
|
+
if (!findDimension(model, config.sparklineDimension)) {
|
|
33
|
+
throw new Error(`Unknown KPI sparkline dimension: ${config.sparklineDimension}`);
|
|
34
|
+
}
|
|
35
|
+
card.sparkline = groupAggregate([...data], config.sparklineDimension, measure);
|
|
36
|
+
}
|
|
37
|
+
return card;
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=kpi.js.map
|
package/dist/kpi.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kpi.js","sourceRoot":"","sources":["../src/kpi.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAiCxD,MAAM,UAAU,aAAa,CAC3B,KAAgB,EAChB,IAAoB,EACpB,OAAiC,EACjC,UAA2B,EAAE;IAE7B,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QAC5B,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,IAAI,GAAY;YACpB,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK;YACpC,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,KAAK,EAAE,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC;SACrC,CAAC;QAEF,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACzC,MAAM,eAAe,GAAG,SAAS,CAAC,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC;YACxE,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;YACvC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,eAAe,CAAC;YAC1C,IAAI,CAAC,YAAY,GAAG,eAAe,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,eAAe,CAAC;QACxF,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YACxB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;QAC5E,CAAC;QAED,IAAI,MAAM,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;YAC5C,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBACrD,MAAM,IAAI,KAAK,CAAC,oCAAoC,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC;YACnF,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,MAAM,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;QACjF,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/model.d.ts
CHANGED
|
@@ -18,6 +18,8 @@ export interface Dimension {
|
|
|
18
18
|
id: string;
|
|
19
19
|
label: string;
|
|
20
20
|
type: DimensionType;
|
|
21
|
+
/** Optional field-pane folder/group label. */
|
|
22
|
+
folder?: string;
|
|
21
23
|
/**
|
|
22
24
|
* Optional drill-down path, ordered from coarse to fine, e.g.
|
|
23
25
|
* `['country', 'region', 'city']`. Each entry is a dimension id.
|
|
@@ -29,6 +31,8 @@ export interface Measure {
|
|
|
29
31
|
id: string;
|
|
30
32
|
label: string;
|
|
31
33
|
aggregation: Aggregation;
|
|
34
|
+
/** Optional field-pane folder/group label. */
|
|
35
|
+
folder?: string;
|
|
32
36
|
}
|
|
33
37
|
/** The full declarative model of a dataset. */
|
|
34
38
|
export interface DataModel {
|
package/dist/model.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,6DAA6D;AAC7D,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAEpD,mDAAmD;AACnD,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAEvC,gDAAgD;AAChD,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,YAAY,CAAC;AAEtD,6DAA6D;AAC7D,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC;AAElE,6CAA6C;AAC7C,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,aAAa,CAAC;IACpB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,8BAA8B;AAC9B,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,6DAA6D;AAC7D,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAEpD,mDAAmD;AACnD,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAEvC,gDAAgD;AAChD,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,YAAY,CAAC;AAEtD,6DAA6D;AAC7D,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC;AAElE,6CAA6C;AAC7C,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,aAAa,CAAC;IACpB,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,8BAA8B;AAC9B,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,WAAW,CAAC;IACzB,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,+CAA+C;AAC/C,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAKD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAEtE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAElE;AAMD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAW9D;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,CAM1D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAK9D;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,EAAE,CA+CxD;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,CAMvD;AAED,iDAAiD;AACjD,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAEjF;AAED,+CAA+C;AAC/C,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAE7E"}
|
package/dist/model.js
CHANGED
|
@@ -24,6 +24,8 @@ export function isDimension(value) {
|
|
|
24
24
|
return false;
|
|
25
25
|
if (!isDimensionType(d.type))
|
|
26
26
|
return false;
|
|
27
|
+
if (d.folder !== undefined && !isNonEmptyString(d.folder))
|
|
28
|
+
return false;
|
|
27
29
|
if (d.hierarchy !== undefined) {
|
|
28
30
|
if (!Array.isArray(d.hierarchy))
|
|
29
31
|
return false;
|
|
@@ -38,6 +40,8 @@ export function isMeasure(value) {
|
|
|
38
40
|
const m = value;
|
|
39
41
|
if (!isNonEmptyString(m.id) || !isNonEmptyString(m.label))
|
|
40
42
|
return false;
|
|
43
|
+
if (m.folder !== undefined && !isNonEmptyString(m.folder))
|
|
44
|
+
return false;
|
|
41
45
|
return isAggregation(m.aggregation);
|
|
42
46
|
}
|
|
43
47
|
export function isDataModel(value) {
|
package/dist/model.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Part-of-whole, waterfall and flow data contracts.
|
|
3
|
+
*
|
|
4
|
+
* These builders stay rendering-agnostic while covering the data shapes needed
|
|
5
|
+
* by pie/donut/funnel, treemap/sunburst, waterfall, sankey/chord, radar and
|
|
6
|
+
* rose, Mekko and packed bubble renderers.
|
|
7
|
+
*/
|
|
8
|
+
import type { DataModel, Row } from './model.js';
|
|
9
|
+
export type PartWholeSort = 'input' | 'value-asc' | 'value-desc';
|
|
10
|
+
export interface PartWholeConfig {
|
|
11
|
+
category: string;
|
|
12
|
+
measure: string;
|
|
13
|
+
sort?: PartWholeSort;
|
|
14
|
+
}
|
|
15
|
+
export interface PartWholeItem {
|
|
16
|
+
key: string;
|
|
17
|
+
label: string;
|
|
18
|
+
value: number;
|
|
19
|
+
percent: number;
|
|
20
|
+
cumulativeValue: number;
|
|
21
|
+
cumulativePercent: number;
|
|
22
|
+
}
|
|
23
|
+
export interface PartWholeModel {
|
|
24
|
+
total: number;
|
|
25
|
+
items: PartWholeItem[];
|
|
26
|
+
}
|
|
27
|
+
export interface PartWholeHierarchyConfig {
|
|
28
|
+
hierarchy: string[];
|
|
29
|
+
measure: string;
|
|
30
|
+
}
|
|
31
|
+
export interface PartWholeNode {
|
|
32
|
+
key: string;
|
|
33
|
+
label: string;
|
|
34
|
+
value: number;
|
|
35
|
+
children?: PartWholeNode[];
|
|
36
|
+
}
|
|
37
|
+
export interface WaterfallConfig {
|
|
38
|
+
category: string;
|
|
39
|
+
measure: string;
|
|
40
|
+
totalLabel?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface WaterfallStep {
|
|
43
|
+
key: string;
|
|
44
|
+
label: string;
|
|
45
|
+
kind: 'delta' | 'total';
|
|
46
|
+
delta: number;
|
|
47
|
+
start: number;
|
|
48
|
+
end: number;
|
|
49
|
+
}
|
|
50
|
+
export interface WaterfallModel {
|
|
51
|
+
total: number;
|
|
52
|
+
steps: WaterfallStep[];
|
|
53
|
+
}
|
|
54
|
+
export interface FlowConfig {
|
|
55
|
+
source: string;
|
|
56
|
+
target: string;
|
|
57
|
+
measure: string;
|
|
58
|
+
}
|
|
59
|
+
export interface FlowNode {
|
|
60
|
+
id: string;
|
|
61
|
+
label: string;
|
|
62
|
+
}
|
|
63
|
+
export interface FlowLink {
|
|
64
|
+
id: string;
|
|
65
|
+
source: string;
|
|
66
|
+
target: string;
|
|
67
|
+
value: number;
|
|
68
|
+
}
|
|
69
|
+
export interface FlowModel {
|
|
70
|
+
nodes: FlowNode[];
|
|
71
|
+
links: FlowLink[];
|
|
72
|
+
}
|
|
73
|
+
export interface RadarConfig {
|
|
74
|
+
axes: string[];
|
|
75
|
+
series?: string;
|
|
76
|
+
}
|
|
77
|
+
export interface RadarAxis {
|
|
78
|
+
id: string;
|
|
79
|
+
label: string;
|
|
80
|
+
}
|
|
81
|
+
export interface RadarPoint {
|
|
82
|
+
axisId: string;
|
|
83
|
+
label: string;
|
|
84
|
+
value: number;
|
|
85
|
+
}
|
|
86
|
+
export interface RadarSeries {
|
|
87
|
+
key: string;
|
|
88
|
+
label: string;
|
|
89
|
+
points: RadarPoint[];
|
|
90
|
+
}
|
|
91
|
+
export interface RadarModel {
|
|
92
|
+
axes: RadarAxis[];
|
|
93
|
+
series: RadarSeries[];
|
|
94
|
+
}
|
|
95
|
+
export interface RoseConfig {
|
|
96
|
+
category: string;
|
|
97
|
+
measure: string;
|
|
98
|
+
}
|
|
99
|
+
export interface RoseSector {
|
|
100
|
+
key: string;
|
|
101
|
+
label: string;
|
|
102
|
+
value: number;
|
|
103
|
+
percent: number;
|
|
104
|
+
startAngle: number;
|
|
105
|
+
endAngle: number;
|
|
106
|
+
}
|
|
107
|
+
export interface RoseModel {
|
|
108
|
+
total: number;
|
|
109
|
+
sectors: RoseSector[];
|
|
110
|
+
}
|
|
111
|
+
export interface MekkoConfig {
|
|
112
|
+
category: string;
|
|
113
|
+
series: string;
|
|
114
|
+
measure: string;
|
|
115
|
+
}
|
|
116
|
+
export interface MekkoSegment {
|
|
117
|
+
key: string;
|
|
118
|
+
label: string;
|
|
119
|
+
value: number;
|
|
120
|
+
percent: number;
|
|
121
|
+
}
|
|
122
|
+
export interface MekkoColumn {
|
|
123
|
+
key: string;
|
|
124
|
+
label: string;
|
|
125
|
+
value: number;
|
|
126
|
+
width: number;
|
|
127
|
+
start: number;
|
|
128
|
+
end: number;
|
|
129
|
+
segments: MekkoSegment[];
|
|
130
|
+
}
|
|
131
|
+
export interface MekkoModel {
|
|
132
|
+
total: number;
|
|
133
|
+
columns: MekkoColumn[];
|
|
134
|
+
}
|
|
135
|
+
export interface PackedBubbleConfig {
|
|
136
|
+
category: string;
|
|
137
|
+
measure: string;
|
|
138
|
+
sort?: PartWholeSort;
|
|
139
|
+
}
|
|
140
|
+
export interface PackedBubble {
|
|
141
|
+
key: string;
|
|
142
|
+
label: string;
|
|
143
|
+
value: number;
|
|
144
|
+
percent: number;
|
|
145
|
+
radius: number;
|
|
146
|
+
}
|
|
147
|
+
export interface PackedBubbleModel {
|
|
148
|
+
total: number;
|
|
149
|
+
bubbles: PackedBubble[];
|
|
150
|
+
}
|
|
151
|
+
export declare function buildPartWholeModel(model: DataModel, data: readonly Row[], config: PartWholeConfig): PartWholeModel;
|
|
152
|
+
export declare function buildPartWholeHierarchy(model: DataModel, data: readonly Row[], config: PartWholeHierarchyConfig): PartWholeNode;
|
|
153
|
+
export declare function buildWaterfallModel(model: DataModel, data: readonly Row[], config: WaterfallConfig): WaterfallModel;
|
|
154
|
+
export declare function buildFlowModel(model: DataModel, data: readonly Row[], config: FlowConfig): FlowModel;
|
|
155
|
+
export declare function buildRadarModel(model: DataModel, data: readonly Row[], config: RadarConfig): RadarModel;
|
|
156
|
+
export declare function buildRoseModel(model: DataModel, data: readonly Row[], config: RoseConfig): RoseModel;
|
|
157
|
+
export declare function buildMekkoModel(model: DataModel, data: readonly Row[], config: MekkoConfig): MekkoModel;
|
|
158
|
+
export declare function buildPackedBubbleModel(model: DataModel, data: readonly Row[], config: PackedBubbleConfig): PackedBubbleModel;
|
|
159
|
+
//# sourceMappingURL=partOfWhole.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"partOfWhole.d.ts","sourceRoot":"","sources":["../src/partOfWhole.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAW,GAAG,EAAE,MAAM,YAAY,CAAC;AAE1D,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,WAAW,GAAG,YAAY,CAAC;AAEjE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,aAAa,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,aAAa,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAgDD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,SAAS,GAAG,EAAE,EACpB,MAAM,EAAE,eAAe,GACtB,cAAc,CAyBhB;AA2BD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,SAAS,GAAG,EAAE,EACpB,MAAM,EAAE,wBAAwB,GAC/B,aAAa,CASf;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,SAAS,GAAG,EAAE,EACpB,MAAM,EAAE,eAAe,GACtB,cAAc,CAwBhB;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,SAAS,GAAG,EAAE,EACpB,MAAM,EAAE,UAAU,GACjB,SAAS,CAsCX;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,SAAS,GAAG,EAAE,EACpB,MAAM,EAAE,WAAW,GAClB,UAAU,CAyBZ;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,SAAS,GAAG,EAAE,EACpB,MAAM,EAAE,UAAU,GACjB,SAAS,CAkBX;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,SAAS,GAAG,EAAE,EACpB,MAAM,EAAE,WAAW,GAClB,UAAU,CA2CZ;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,SAAS,GAAG,EAAE,EACpB,MAAM,EAAE,kBAAkB,GACzB,iBAAiB,CAwBnB"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Part-of-whole, waterfall and flow data contracts.
|
|
3
|
+
*
|
|
4
|
+
* These builders stay rendering-agnostic while covering the data shapes needed
|
|
5
|
+
* by pie/donut/funnel, treemap/sunburst, waterfall, sankey/chord, radar and
|
|
6
|
+
* rose, Mekko and packed bubble renderers.
|
|
7
|
+
*/
|
|
8
|
+
import { aggregate } from './aggregate.js';
|
|
9
|
+
import { findDimension, findMeasure } from './model.js';
|
|
10
|
+
function cellKey(value) {
|
|
11
|
+
return value == null ? 'null' : String(value);
|
|
12
|
+
}
|
|
13
|
+
function pathKey(path) {
|
|
14
|
+
return path.join('\u001f');
|
|
15
|
+
}
|
|
16
|
+
function assertDimension(model, id, role) {
|
|
17
|
+
if (!findDimension(model, id)) {
|
|
18
|
+
throw new Error(`Unknown ${role} dimension: ${id}`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function resolveMeasure(model, id, role) {
|
|
22
|
+
const measure = findMeasure(model, id);
|
|
23
|
+
if (!measure) {
|
|
24
|
+
throw new Error(`Unknown ${role} measure: ${id}`);
|
|
25
|
+
}
|
|
26
|
+
return measure;
|
|
27
|
+
}
|
|
28
|
+
function groupRows(rows, dimensionId) {
|
|
29
|
+
const groups = new Map();
|
|
30
|
+
for (const row of rows) {
|
|
31
|
+
const key = cellKey(row[dimensionId]);
|
|
32
|
+
const bucket = groups.get(key);
|
|
33
|
+
if (bucket) {
|
|
34
|
+
bucket.push(row);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
groups.set(key, [row]);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return groups;
|
|
41
|
+
}
|
|
42
|
+
function sortItems(items, sort) {
|
|
43
|
+
if (sort === 'input')
|
|
44
|
+
return items;
|
|
45
|
+
return [...items].sort((a, b) => {
|
|
46
|
+
const left = Number.isFinite(a.value) ? a.value : Number.NEGATIVE_INFINITY;
|
|
47
|
+
const right = Number.isFinite(b.value) ? b.value : Number.NEGATIVE_INFINITY;
|
|
48
|
+
return sort === 'value-desc' ? right - left : left - right;
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
export function buildPartWholeModel(model, data, config) {
|
|
52
|
+
assertDimension(model, config.category, 'part-whole category');
|
|
53
|
+
const measure = resolveMeasure(model, config.measure, 'part-whole');
|
|
54
|
+
const items = Array.from(groupRows(data, config.category), ([key, rows]) => ({
|
|
55
|
+
key,
|
|
56
|
+
label: key,
|
|
57
|
+
value: aggregate(rows, measure),
|
|
58
|
+
percent: 0,
|
|
59
|
+
cumulativeValue: 0,
|
|
60
|
+
cumulativePercent: 0,
|
|
61
|
+
}));
|
|
62
|
+
const total = items.reduce((sum, item) => sum + item.value, 0);
|
|
63
|
+
const sorted = sortItems(items, config.sort ?? 'input');
|
|
64
|
+
let cumulative = 0;
|
|
65
|
+
for (const item of sorted) {
|
|
66
|
+
cumulative += item.value;
|
|
67
|
+
item.percent = total === 0 ? Number.NaN : item.value / total;
|
|
68
|
+
item.cumulativeValue = cumulative;
|
|
69
|
+
item.cumulativePercent = total === 0 ? Number.NaN : cumulative / total;
|
|
70
|
+
}
|
|
71
|
+
return { total, items: sorted };
|
|
72
|
+
}
|
|
73
|
+
function buildHierarchyNode(rows, dimensions, measure, depth, path) {
|
|
74
|
+
const key = path.length === 0 ? 'root' : pathKey(path);
|
|
75
|
+
const label = path.length === 0 ? 'Total' : path[path.length - 1];
|
|
76
|
+
const node = {
|
|
77
|
+
key,
|
|
78
|
+
label,
|
|
79
|
+
value: aggregate([...rows], measure),
|
|
80
|
+
};
|
|
81
|
+
if (depth < dimensions.length) {
|
|
82
|
+
const children = Array.from(groupRows(rows, dimensions[depth]), ([childKey, childRows]) => buildHierarchyNode(childRows, dimensions, measure, depth + 1, [...path, childKey]));
|
|
83
|
+
node.children = children;
|
|
84
|
+
}
|
|
85
|
+
return node;
|
|
86
|
+
}
|
|
87
|
+
export function buildPartWholeHierarchy(model, data, config) {
|
|
88
|
+
if (config.hierarchy.length === 0) {
|
|
89
|
+
throw new Error('Part-whole hierarchy requires at least one dimension');
|
|
90
|
+
}
|
|
91
|
+
for (const dimensionId of config.hierarchy) {
|
|
92
|
+
assertDimension(model, dimensionId, 'part-whole hierarchy');
|
|
93
|
+
}
|
|
94
|
+
const measure = resolveMeasure(model, config.measure, 'part-whole hierarchy');
|
|
95
|
+
return buildHierarchyNode(data, config.hierarchy, measure, 0, []);
|
|
96
|
+
}
|
|
97
|
+
export function buildWaterfallModel(model, data, config) {
|
|
98
|
+
assertDimension(model, config.category, 'waterfall category');
|
|
99
|
+
const measure = resolveMeasure(model, config.measure, 'waterfall');
|
|
100
|
+
const steps = [];
|
|
101
|
+
let cumulative = 0;
|
|
102
|
+
for (const [key, rows] of groupRows(data, config.category)) {
|
|
103
|
+
const delta = aggregate(rows, measure);
|
|
104
|
+
const start = cumulative;
|
|
105
|
+
cumulative += delta;
|
|
106
|
+
steps.push({ key, label: key, kind: 'delta', delta, start, end: cumulative });
|
|
107
|
+
}
|
|
108
|
+
steps.push({
|
|
109
|
+
key: 'total',
|
|
110
|
+
label: config.totalLabel ?? 'Total',
|
|
111
|
+
kind: 'total',
|
|
112
|
+
delta: cumulative,
|
|
113
|
+
start: 0,
|
|
114
|
+
end: cumulative,
|
|
115
|
+
});
|
|
116
|
+
return { total: cumulative, steps };
|
|
117
|
+
}
|
|
118
|
+
export function buildFlowModel(model, data, config) {
|
|
119
|
+
assertDimension(model, config.source, 'flow source');
|
|
120
|
+
assertDimension(model, config.target, 'flow target');
|
|
121
|
+
const measure = resolveMeasure(model, config.measure, 'flow');
|
|
122
|
+
const nodes = new Map();
|
|
123
|
+
const linkRows = new Map();
|
|
124
|
+
const ensureNode = (id) => {
|
|
125
|
+
if (!nodes.has(id)) {
|
|
126
|
+
nodes.set(id, { id, label: id });
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
for (const row of data) {
|
|
130
|
+
const source = cellKey(row[config.source]);
|
|
131
|
+
const target = cellKey(row[config.target]);
|
|
132
|
+
ensureNode(source);
|
|
133
|
+
ensureNode(target);
|
|
134
|
+
const id = pathKey([source, target]);
|
|
135
|
+
const link = linkRows.get(id);
|
|
136
|
+
if (link) {
|
|
137
|
+
link.rows.push(row);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
linkRows.set(id, { source, target, rows: [row] });
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
nodes: [...nodes.values()],
|
|
145
|
+
links: Array.from(linkRows, ([id, link]) => ({
|
|
146
|
+
id,
|
|
147
|
+
source: link.source,
|
|
148
|
+
target: link.target,
|
|
149
|
+
value: aggregate(link.rows, measure),
|
|
150
|
+
})),
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
export function buildRadarModel(model, data, config) {
|
|
154
|
+
if (config.axes.length === 0) {
|
|
155
|
+
throw new Error('Radar requires at least one measure axis');
|
|
156
|
+
}
|
|
157
|
+
if (config.series !== undefined) {
|
|
158
|
+
assertDimension(model, config.series, 'radar series');
|
|
159
|
+
}
|
|
160
|
+
const measures = config.axes.map((axis) => resolveMeasure(model, axis, 'radar axis'));
|
|
161
|
+
const groups = config.series === undefined
|
|
162
|
+
? new Map([['All', [...data]]])
|
|
163
|
+
: groupRows(data, config.series);
|
|
164
|
+
return {
|
|
165
|
+
axes: measures.map((measure) => ({ id: measure.id, label: measure.label })),
|
|
166
|
+
series: Array.from(groups, ([key, rows]) => ({
|
|
167
|
+
key,
|
|
168
|
+
label: key,
|
|
169
|
+
points: measures.map((measure) => ({
|
|
170
|
+
axisId: measure.id,
|
|
171
|
+
label: measure.label,
|
|
172
|
+
value: aggregate(rows, measure),
|
|
173
|
+
})),
|
|
174
|
+
})),
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
export function buildRoseModel(model, data, config) {
|
|
178
|
+
assertDimension(model, config.category, 'rose category');
|
|
179
|
+
const measure = resolveMeasure(model, config.measure, 'rose');
|
|
180
|
+
const rawSectors = Array.from(groupRows(data, config.category), ([key, rows]) => ({
|
|
181
|
+
key,
|
|
182
|
+
label: key,
|
|
183
|
+
value: aggregate(rows, measure),
|
|
184
|
+
}));
|
|
185
|
+
const total = rawSectors.reduce((sum, sector) => sum + sector.value, 0);
|
|
186
|
+
let angle = 0;
|
|
187
|
+
const sectors = rawSectors.map((sector) => {
|
|
188
|
+
const percent = total === 0 ? Number.NaN : sector.value / total;
|
|
189
|
+
const startAngle = angle;
|
|
190
|
+
angle += total === 0 ? 0 : percent * 360;
|
|
191
|
+
return { ...sector, percent, startAngle, endAngle: angle };
|
|
192
|
+
});
|
|
193
|
+
return { total, sectors };
|
|
194
|
+
}
|
|
195
|
+
export function buildMekkoModel(model, data, config) {
|
|
196
|
+
assertDimension(model, config.category, 'Mekko category');
|
|
197
|
+
assertDimension(model, config.series, 'Mekko series');
|
|
198
|
+
const measure = resolveMeasure(model, config.measure, 'Mekko');
|
|
199
|
+
const categoryGroups = groupRows(data, config.category);
|
|
200
|
+
const rawColumns = Array.from(categoryGroups, ([key, rows]) => {
|
|
201
|
+
const value = aggregate(rows, measure);
|
|
202
|
+
return {
|
|
203
|
+
key,
|
|
204
|
+
label: key,
|
|
205
|
+
value,
|
|
206
|
+
rows,
|
|
207
|
+
};
|
|
208
|
+
});
|
|
209
|
+
const total = rawColumns.reduce((sum, column) => sum + column.value, 0);
|
|
210
|
+
let offset = 0;
|
|
211
|
+
const columns = rawColumns.map((column) => {
|
|
212
|
+
const width = total === 0 ? 0 : column.value / total;
|
|
213
|
+
const start = offset;
|
|
214
|
+
offset += width;
|
|
215
|
+
const segments = Array.from(groupRows(column.rows, config.series), ([key, rows]) => {
|
|
216
|
+
const value = aggregate(rows, measure);
|
|
217
|
+
return {
|
|
218
|
+
key,
|
|
219
|
+
label: key,
|
|
220
|
+
value,
|
|
221
|
+
percent: column.value === 0 ? Number.NaN : value / column.value,
|
|
222
|
+
};
|
|
223
|
+
});
|
|
224
|
+
return {
|
|
225
|
+
key: column.key,
|
|
226
|
+
label: column.label,
|
|
227
|
+
value: column.value,
|
|
228
|
+
width,
|
|
229
|
+
start,
|
|
230
|
+
end: offset,
|
|
231
|
+
segments,
|
|
232
|
+
};
|
|
233
|
+
});
|
|
234
|
+
return { total, columns };
|
|
235
|
+
}
|
|
236
|
+
export function buildPackedBubbleModel(model, data, config) {
|
|
237
|
+
assertDimension(model, config.category, 'packed bubble category');
|
|
238
|
+
const measure = resolveMeasure(model, config.measure, 'packed bubble');
|
|
239
|
+
const items = Array.from(groupRows(data, config.category), ([key, rows]) => ({
|
|
240
|
+
key,
|
|
241
|
+
label: key,
|
|
242
|
+
value: aggregate(rows, measure),
|
|
243
|
+
percent: 0,
|
|
244
|
+
cumulativeValue: 0,
|
|
245
|
+
cumulativePercent: 0,
|
|
246
|
+
}));
|
|
247
|
+
const total = items.reduce((sum, item) => sum + item.value, 0);
|
|
248
|
+
const sorted = sortItems(items, config.sort ?? 'input');
|
|
249
|
+
return {
|
|
250
|
+
total,
|
|
251
|
+
bubbles: sorted.map((item) => ({
|
|
252
|
+
key: item.key,
|
|
253
|
+
label: item.label,
|
|
254
|
+
value: item.value,
|
|
255
|
+
percent: total === 0 ? Number.NaN : item.value / total,
|
|
256
|
+
radius: Math.sqrt(Math.max(0, item.value) / Math.PI),
|
|
257
|
+
})),
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=partOfWhole.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"partOfWhole.js","sourceRoot":"","sources":["../src/partOfWhole.ts"],"names":[],"mappings":"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"}
|