vega 0.2.5 → 0.2.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/README.md +47 -6
- data/lib/vega/base_chart.rb +3 -2
- data/lib/vega/helper.rb +29 -0
- data/lib/vega/spec.rb +7 -5
- data/lib/vega/version.rb +1 -1
- data/lib/vega.rb +9 -2
- data/vendor/assets/javascripts/vega-embed.js +632 -558
- data/vendor/assets/javascripts/vega-lite.js +382 -167
- data/vendor/assets/javascripts/vega.js +1295 -700
- metadata +4 -3
@@ -15,6 +15,11 @@
|
|
15
15
|
];
|
16
16
|
var homepage = "https://vega.github.io/vega-lite/";
|
17
17
|
var description$1 = "Vega-Lite is a concise high-level language for interactive visualization.";
|
18
|
+
var keywords = [
|
19
|
+
"vega",
|
20
|
+
"chart",
|
21
|
+
"visualization"
|
22
|
+
];
|
18
23
|
var main$1 = "build/vega-lite.js";
|
19
24
|
var unpkg = "build/vega-lite.min.js";
|
20
25
|
var jsdelivr = "build/vega-lite.min.js";
|
@@ -26,9 +31,6 @@
|
|
26
31
|
vl2pdf: "./bin/vl2pdf",
|
27
32
|
vl2vg: "./bin/vl2vg"
|
28
33
|
};
|
29
|
-
var directories = {
|
30
|
-
test: "test"
|
31
|
-
};
|
32
34
|
var files = [
|
33
35
|
"bin",
|
34
36
|
"build",
|
@@ -72,7 +74,10 @@
|
|
72
74
|
"test:runtime:generate": "yarn build:only && del-cli test-runtime/resources && VL_GENERATE_TESTS=true yarn test:runtime",
|
73
75
|
watch: "tsc -p tsconfig.build.json -w",
|
74
76
|
"watch:site": "yarn build:site -w",
|
75
|
-
"watch:test": "yarn jest --watch test/"
|
77
|
+
"watch:test": "yarn jest --watch test/",
|
78
|
+
"watch:test:runtime": "NODE_OPTIONS=--experimental-vm-modules TZ=America/Los_Angeles npx jest --watch test-runtime/ --config test-runtime/jest-config.json",
|
79
|
+
release: "yarn run prebuild && yarn build && yarn shipit",
|
80
|
+
shipit: "auto shipit"
|
76
81
|
};
|
77
82
|
var repository = {
|
78
83
|
type: "git",
|
@@ -83,53 +88,56 @@
|
|
83
88
|
url: "https://github.com/vega/vega-lite/issues"
|
84
89
|
};
|
85
90
|
var devDependencies = {
|
86
|
-
"@
|
87
|
-
"@
|
88
|
-
"@babel/
|
89
|
-
"@
|
90
|
-
"@
|
91
|
-
"@rollup/plugin-
|
91
|
+
"@auto-it/conventional-commits": "^10.34.1",
|
92
|
+
"@auto-it/first-time-contributor": "^10.34.1",
|
93
|
+
"@babel/core": "^7.17.5",
|
94
|
+
"@babel/preset-env": "^7.16.11",
|
95
|
+
"@babel/preset-typescript": "^7.16.7",
|
96
|
+
"@rollup/plugin-alias": "^3.1.9",
|
97
|
+
"@rollup/plugin-babel": "^5.3.1",
|
98
|
+
"@rollup/plugin-commonjs": "^22.0.0",
|
92
99
|
"@rollup/plugin-json": "^4.1.0",
|
93
|
-
"@rollup/plugin-node-resolve": "^13.
|
94
|
-
"@types/chai": "^4.
|
100
|
+
"@rollup/plugin-node-resolve": "^13.1.3",
|
101
|
+
"@types/chai": "^4.3.0",
|
95
102
|
"@types/d3": "^7.1.0",
|
96
|
-
"@types/jest": "^27.
|
103
|
+
"@types/jest": "^27.4.1",
|
97
104
|
"@types/mkdirp": "^1.0.2",
|
98
|
-
"@types/pako": "^
|
99
|
-
"@typescript-eslint/eslint-plugin": "^5.
|
100
|
-
"@typescript-eslint/parser": "^5.
|
101
|
-
ajv: "^8.
|
105
|
+
"@types/pako": "^2.0.0",
|
106
|
+
"@typescript-eslint/eslint-plugin": "^5.14.0",
|
107
|
+
"@typescript-eslint/parser": "^5.14.0",
|
108
|
+
ajv: "^8.10.0",
|
102
109
|
"ajv-formats": "^2.1.1",
|
103
|
-
|
110
|
+
auto: "^10.34.1",
|
111
|
+
chai: "^4.3.6",
|
104
112
|
cheerio: "^1.0.0-rc.10",
|
105
|
-
"conventional-changelog-cli": "^2.
|
106
|
-
d3: "^7.
|
107
|
-
"del-cli": "^
|
108
|
-
eslint: "^8.
|
109
|
-
"eslint-config-prettier": "^8.
|
110
|
-
"eslint-plugin-jest": "^
|
113
|
+
"conventional-changelog-cli": "^2.2.2",
|
114
|
+
d3: "^7.4.4",
|
115
|
+
"del-cli": "^5.0.0",
|
116
|
+
eslint: "^8.11.0",
|
117
|
+
"eslint-config-prettier": "^8.5.0",
|
118
|
+
"eslint-plugin-jest": "^26.1.1",
|
111
119
|
"eslint-plugin-prettier": "^4.0.0",
|
112
|
-
"gh-pages": "^
|
113
|
-
"highlight.js": "^11.
|
114
|
-
jest: "^27.
|
115
|
-
"jest-dev-server": "^6.0.
|
120
|
+
"gh-pages": "^4.0.0",
|
121
|
+
"highlight.js": "^11.5.0",
|
122
|
+
jest: "^27.5.1",
|
123
|
+
"jest-dev-server": "^6.0.3",
|
116
124
|
mkdirp: "^1.0.4",
|
117
125
|
pako: "^2.0.4",
|
118
|
-
prettier: "^2.
|
119
|
-
puppeteer: "^
|
120
|
-
rollup: "^2.
|
126
|
+
prettier: "^2.5.1",
|
127
|
+
puppeteer: "^15.0.0",
|
128
|
+
rollup: "^2.70.1",
|
121
129
|
"rollup-plugin-bundle-size": "^1.0.3",
|
122
130
|
"rollup-plugin-sourcemaps": "^0.6.3",
|
123
131
|
"rollup-plugin-terser": "^7.0.2",
|
124
|
-
serve: "^
|
125
|
-
terser: "^5.
|
126
|
-
"ts-jest": "^27.
|
127
|
-
"ts-json-schema-generator": "^0.
|
128
|
-
|
129
|
-
|
130
|
-
"vega-datasets": "~2.
|
131
|
-
"vega-embed": "^6.20.
|
132
|
-
"vega-tooltip": "^0.
|
132
|
+
serve: "^14.0.1",
|
133
|
+
terser: "^5.12.1",
|
134
|
+
"ts-jest": "^27.1.3",
|
135
|
+
"ts-json-schema-generator": "^1.0.0",
|
136
|
+
"vega-cli": "^5.22.0",
|
137
|
+
typescript: "~4.7.2",
|
138
|
+
"vega-datasets": "~2.4.0",
|
139
|
+
"vega-embed": "^6.20.8",
|
140
|
+
"vega-tooltip": "^0.28.0",
|
133
141
|
"yaml-front-matter": "^4.1.1"
|
134
142
|
};
|
135
143
|
var dependencies = {
|
@@ -139,14 +147,14 @@
|
|
139
147
|
"fast-deep-equal": "~3.1.3",
|
140
148
|
"fast-json-stable-stringify": "~2.1.0",
|
141
149
|
"json-stringify-pretty-compact": "~3.0.0",
|
142
|
-
tslib: "~2.
|
150
|
+
tslib: "~2.4.0",
|
143
151
|
"vega-event-selector": "~3.0.0",
|
144
152
|
"vega-expression": "~5.0.0",
|
145
153
|
"vega-util": "~1.17.0",
|
146
|
-
yargs: "~17.
|
154
|
+
yargs: "~17.5.1"
|
147
155
|
};
|
148
156
|
var peerDependencies = {
|
149
|
-
vega: "^5.
|
157
|
+
vega: "^5.22.0"
|
150
158
|
};
|
151
159
|
var engines = {
|
152
160
|
node: ">=12"
|
@@ -158,13 +166,13 @@
|
|
158
166
|
collaborators: collaborators,
|
159
167
|
homepage: homepage,
|
160
168
|
description: description$1,
|
169
|
+
keywords: keywords,
|
161
170
|
main: main$1,
|
162
171
|
unpkg: unpkg,
|
163
172
|
jsdelivr: jsdelivr,
|
164
173
|
module: module,
|
165
174
|
types: types,
|
166
175
|
bin: bin,
|
167
|
-
directories: directories,
|
168
176
|
files: files,
|
169
177
|
scripts: scripts,
|
170
178
|
repository: repository,
|
@@ -1739,7 +1747,7 @@
|
|
1739
1747
|
}
|
1740
1748
|
|
1741
1749
|
function isExprRef(o) {
|
1742
|
-
return o &&
|
1750
|
+
return !!(o !== null && o !== void 0 && o.expr);
|
1743
1751
|
}
|
1744
1752
|
function replaceExprRef(index) {
|
1745
1753
|
const props = keys(index || {});
|
@@ -1835,7 +1843,7 @@
|
|
1835
1843
|
}
|
1836
1844
|
|
1837
1845
|
function isSignalRef(o) {
|
1838
|
-
return o &&
|
1846
|
+
return !!(o !== null && o !== void 0 && o.signal);
|
1839
1847
|
} // TODO: add type of value (Make it VgValueRef<V extends ValueOrGradient> {value?:V ...})
|
1840
1848
|
|
1841
1849
|
function isVgRangeStep(range) {
|
@@ -2866,19 +2874,19 @@
|
|
2866
2874
|
return predicate === null || predicate === void 0 ? void 0 : predicate['param'];
|
2867
2875
|
}
|
2868
2876
|
function isFieldEqualPredicate(predicate) {
|
2869
|
-
return predicate &&
|
2877
|
+
return !!(predicate !== null && predicate !== void 0 && predicate.field) && predicate.equal !== undefined;
|
2870
2878
|
}
|
2871
2879
|
function isFieldLTPredicate(predicate) {
|
2872
|
-
return predicate &&
|
2880
|
+
return !!(predicate !== null && predicate !== void 0 && predicate.field) && predicate.lt !== undefined;
|
2873
2881
|
}
|
2874
2882
|
function isFieldLTEPredicate(predicate) {
|
2875
|
-
return predicate &&
|
2883
|
+
return !!(predicate !== null && predicate !== void 0 && predicate.field) && predicate.lte !== undefined;
|
2876
2884
|
}
|
2877
2885
|
function isFieldGTPredicate(predicate) {
|
2878
|
-
return predicate &&
|
2886
|
+
return !!(predicate !== null && predicate !== void 0 && predicate.field) && predicate.gt !== undefined;
|
2879
2887
|
}
|
2880
2888
|
function isFieldGTEPredicate(predicate) {
|
2881
|
-
return predicate &&
|
2889
|
+
return !!(predicate !== null && predicate !== void 0 && predicate.field) && predicate.gte !== undefined;
|
2882
2890
|
}
|
2883
2891
|
function isFieldRangePredicate(predicate) {
|
2884
2892
|
if (predicate !== null && predicate !== void 0 && predicate.field) {
|
@@ -2892,11 +2900,11 @@
|
|
2892
2900
|
return false;
|
2893
2901
|
}
|
2894
2902
|
function isFieldOneOfPredicate(predicate) {
|
2895
|
-
return predicate &&
|
2903
|
+
return !!(predicate !== null && predicate !== void 0 && predicate.field) && (vega.isArray(predicate.oneOf) || vega.isArray(predicate.in)) // backward compatibility
|
2896
2904
|
;
|
2897
2905
|
}
|
2898
2906
|
function isFieldValidPredicate(predicate) {
|
2899
|
-
return predicate &&
|
2907
|
+
return !!(predicate !== null && predicate !== void 0 && predicate.field) && predicate.valid !== undefined;
|
2900
2908
|
}
|
2901
2909
|
function isFieldPredicate(predicate) {
|
2902
2910
|
return isFieldOneOfPredicate(predicate) || isFieldEqualPredicate(predicate) || isFieldRangePredicate(predicate) || isFieldLTPredicate(predicate) || isFieldGTPredicate(predicate) || isFieldLTEPredicate(predicate) || isFieldGTEPredicate(predicate);
|
@@ -3193,7 +3201,7 @@
|
|
3193
3201
|
return domain === null || domain === void 0 ? void 0 : domain['param'];
|
3194
3202
|
}
|
3195
3203
|
function isDomainUnionWith(domain) {
|
3196
|
-
return domain
|
3204
|
+
return domain === null || domain === void 0 ? void 0 : domain['unionWith'];
|
3197
3205
|
}
|
3198
3206
|
function isFieldRange(range) {
|
3199
3207
|
return vega.isObject(range) && 'field' in range;
|
@@ -3304,7 +3312,7 @@
|
|
3304
3312
|
case 'scheme':
|
3305
3313
|
case 'domainMid':
|
3306
3314
|
if (!isColorChannel(channel)) {
|
3307
|
-
return cannotUseScalePropertyWithNonColor(
|
3315
|
+
return cannotUseScalePropertyWithNonColor(propName);
|
3308
3316
|
}
|
3309
3317
|
|
3310
3318
|
return undefined;
|
@@ -3852,17 +3860,62 @@
|
|
3852
3860
|
}
|
3853
3861
|
|
3854
3862
|
const field = fieldToFormat(fieldOrDatumDef, expr, normalizeStack);
|
3863
|
+
const type = channelDefType(fieldOrDatumDef);
|
3864
|
+
|
3865
|
+
if (format === undefined && formatType === undefined && config.customFormatTypes) {
|
3866
|
+
if (type === 'quantitative') {
|
3867
|
+
if (normalizeStack && config.normalizedNumberFormatType) return formatCustomType({
|
3868
|
+
fieldOrDatumDef,
|
3869
|
+
format: config.normalizedNumberFormat,
|
3870
|
+
formatType: config.normalizedNumberFormatType,
|
3871
|
+
expr,
|
3872
|
+
config
|
3873
|
+
});
|
3874
|
+
|
3875
|
+
if (config.numberFormatType) {
|
3876
|
+
return formatCustomType({
|
3877
|
+
fieldOrDatumDef,
|
3878
|
+
format: config.numberFormat,
|
3879
|
+
formatType: config.numberFormatType,
|
3880
|
+
expr,
|
3881
|
+
config
|
3882
|
+
});
|
3883
|
+
}
|
3884
|
+
}
|
3885
|
+
|
3886
|
+
if (type === 'temporal' && config.timeFormatType && isFieldDef(fieldOrDatumDef) && fieldOrDatumDef.timeUnit === undefined) {
|
3887
|
+
return formatCustomType({
|
3888
|
+
fieldOrDatumDef,
|
3889
|
+
format: config.timeFormat,
|
3890
|
+
formatType: config.timeFormatType,
|
3891
|
+
expr,
|
3892
|
+
config
|
3893
|
+
});
|
3894
|
+
}
|
3895
|
+
}
|
3855
3896
|
|
3856
3897
|
if (isFieldOrDatumDefForTimeFormat(fieldOrDatumDef)) {
|
3857
3898
|
var _normalizeTimeUnit, _fieldOrDatumDef$scal;
|
3858
3899
|
|
3859
|
-
const signal = timeFormatExpression(
|
3900
|
+
const signal = timeFormatExpression({
|
3901
|
+
field,
|
3902
|
+
timeUnit: isFieldDef(fieldOrDatumDef) ? (_normalizeTimeUnit = normalizeTimeUnit(fieldOrDatumDef.timeUnit)) === null || _normalizeTimeUnit === void 0 ? void 0 : _normalizeTimeUnit.unit : undefined,
|
3903
|
+
format,
|
3904
|
+
formatType: config.timeFormatType,
|
3905
|
+
rawTimeFormat: config.timeFormat,
|
3906
|
+
isUTCScale: isScaleFieldDef(fieldOrDatumDef) && ((_fieldOrDatumDef$scal = fieldOrDatumDef.scale) === null || _fieldOrDatumDef$scal === void 0 ? void 0 : _fieldOrDatumDef$scal.type) === ScaleType.UTC
|
3907
|
+
});
|
3860
3908
|
return signal ? {
|
3861
3909
|
signal
|
3862
3910
|
} : undefined;
|
3863
3911
|
}
|
3864
3912
|
|
3865
|
-
format = numberFormat(
|
3913
|
+
format = numberFormat({
|
3914
|
+
type,
|
3915
|
+
specifiedFormat: format,
|
3916
|
+
config,
|
3917
|
+
normalizeStack
|
3918
|
+
});
|
3866
3919
|
|
3867
3920
|
if (isFieldDef(fieldOrDatumDef) && isBinning(fieldOrDatumDef.bin)) {
|
3868
3921
|
const endField = vgField(fieldOrDatumDef, {
|
@@ -3917,7 +3970,8 @@
|
|
3917
3970
|
} = _ref2;
|
3918
3971
|
(_field = field) !== null && _field !== void 0 ? _field : field = fieldToFormat(fieldOrDatumDef, expr, normalizeStack);
|
3919
3972
|
|
3920
|
-
if (
|
3973
|
+
if (field !== 'datum.value' && // For axis/legend, we can't correctly know the end of the bin from `datum`
|
3974
|
+
isFieldDef(fieldOrDatumDef) && isBinning(fieldOrDatumDef.bin)) {
|
3921
3975
|
const endField = vgField(fieldOrDatumDef, {
|
3922
3976
|
expr,
|
3923
3977
|
binSuffix: 'end'
|
@@ -3934,16 +3988,48 @@
|
|
3934
3988
|
function guideFormat(fieldOrDatumDef, type, format, formatType, config, omitTimeFormatConfig) {
|
3935
3989
|
if (isCustomFormatType(formatType)) {
|
3936
3990
|
return undefined; // handled in encode block
|
3991
|
+
} else if (format === undefined && formatType === undefined && config.customFormatTypes) {
|
3992
|
+
if (channelDefType(fieldOrDatumDef) === 'quantitative') {
|
3993
|
+
if (config.normalizedNumberFormatType && isPositionFieldOrDatumDef(fieldOrDatumDef) && fieldOrDatumDef.stack === 'normalize') {
|
3994
|
+
return undefined; // handled in encode block
|
3995
|
+
}
|
3996
|
+
|
3997
|
+
if (config.numberFormatType) {
|
3998
|
+
return undefined; // handled in encode block
|
3999
|
+
}
|
4000
|
+
}
|
4001
|
+
}
|
4002
|
+
|
4003
|
+
if (isPositionFieldOrDatumDef(fieldOrDatumDef) && fieldOrDatumDef.stack === 'normalize' && config.normalizedNumberFormat) {
|
4004
|
+
return numberFormat({
|
4005
|
+
type: 'quantitative',
|
4006
|
+
config,
|
4007
|
+
normalizeStack: true
|
4008
|
+
});
|
3937
4009
|
}
|
3938
4010
|
|
3939
4011
|
if (isFieldOrDatumDefForTimeFormat(fieldOrDatumDef)) {
|
3940
4012
|
var _normalizeTimeUnit2;
|
3941
4013
|
|
3942
4014
|
const timeUnit = isFieldDef(fieldOrDatumDef) ? (_normalizeTimeUnit2 = normalizeTimeUnit(fieldOrDatumDef.timeUnit)) === null || _normalizeTimeUnit2 === void 0 ? void 0 : _normalizeTimeUnit2.unit : undefined;
|
3943
|
-
|
4015
|
+
|
4016
|
+
if (timeUnit === undefined && config.customFormatTypes && config.timeFormatType) {
|
4017
|
+
return undefined; // hanlded in encode block
|
4018
|
+
}
|
4019
|
+
|
4020
|
+
return timeFormat({
|
4021
|
+
specifiedFormat: format,
|
4022
|
+
timeUnit,
|
4023
|
+
config,
|
4024
|
+
omitTimeFormatConfig
|
4025
|
+
});
|
3944
4026
|
}
|
3945
4027
|
|
3946
|
-
return numberFormat(
|
4028
|
+
return numberFormat({
|
4029
|
+
type,
|
4030
|
+
specifiedFormat: format,
|
4031
|
+
config
|
4032
|
+
});
|
3947
4033
|
}
|
3948
4034
|
function guideFormatType(formatType, fieldOrDatumDef, scaleType) {
|
3949
4035
|
if (formatType && (isSignalRef(formatType) || formatType === 'number' || formatType === 'time')) {
|
@@ -3951,7 +4037,9 @@
|
|
3951
4037
|
}
|
3952
4038
|
|
3953
4039
|
if (isFieldOrDatumDefForTimeFormat(fieldOrDatumDef) && scaleType !== 'time' && scaleType !== 'utc') {
|
3954
|
-
|
4040
|
+
var _normalizeTimeUnit3;
|
4041
|
+
|
4042
|
+
return isFieldDef(fieldOrDatumDef) && (_normalizeTimeUnit3 = normalizeTimeUnit(fieldOrDatumDef === null || fieldOrDatumDef === void 0 ? void 0 : fieldOrDatumDef.timeUnit)) !== null && _normalizeTimeUnit3 !== void 0 && _normalizeTimeUnit3.utc ? 'utc' : 'time';
|
3955
4043
|
}
|
3956
4044
|
|
3957
4045
|
return undefined;
|
@@ -3960,7 +4048,14 @@
|
|
3960
4048
|
* Returns number format for a fieldDef.
|
3961
4049
|
*/
|
3962
4050
|
|
3963
|
-
function numberFormat(
|
4051
|
+
function numberFormat(_ref3) {
|
4052
|
+
let {
|
4053
|
+
type,
|
4054
|
+
specifiedFormat,
|
4055
|
+
config,
|
4056
|
+
normalizeStack
|
4057
|
+
} = _ref3;
|
4058
|
+
|
3964
4059
|
// Specified format in axis/legend has higher precedence than fieldDef.format
|
3965
4060
|
if (vega.isString(specifiedFormat)) {
|
3966
4061
|
return specifiedFormat;
|
@@ -3968,7 +4063,7 @@
|
|
3968
4063
|
|
3969
4064
|
if (type === QUANTITATIVE) {
|
3970
4065
|
// we only apply the default if the field is quantitative
|
3971
|
-
return config.numberFormat;
|
4066
|
+
return normalizeStack ? config.normalizedNumberFormat : config.numberFormat;
|
3972
4067
|
}
|
3973
4068
|
|
3974
4069
|
return undefined;
|
@@ -3977,7 +4072,14 @@
|
|
3977
4072
|
* Returns time format for a fieldDef for use in guides.
|
3978
4073
|
*/
|
3979
4074
|
|
3980
|
-
function timeFormat(
|
4075
|
+
function timeFormat(_ref4) {
|
4076
|
+
let {
|
4077
|
+
specifiedFormat,
|
4078
|
+
timeUnit,
|
4079
|
+
config,
|
4080
|
+
omitTimeFormatConfig
|
4081
|
+
} = _ref4;
|
4082
|
+
|
3981
4083
|
if (specifiedFormat) {
|
3982
4084
|
return specifiedFormat;
|
3983
4085
|
}
|
@@ -3996,16 +4098,20 @@
|
|
3996
4098
|
}
|
3997
4099
|
|
3998
4100
|
function binNumberFormatExpr(field, format, formatType, config) {
|
3999
|
-
var
|
4101
|
+
var _ref5;
|
4000
4102
|
|
4001
4103
|
if (isCustomFormatType(formatType)) {
|
4002
4104
|
return customFormatExpr(formatType, field, format);
|
4003
4105
|
}
|
4004
4106
|
|
4005
|
-
return formatExpr(field, (
|
4107
|
+
return formatExpr(field, (_ref5 = vega.isString(format) ? format : undefined) !== null && _ref5 !== void 0 ? _ref5 : config.numberFormat);
|
4006
4108
|
}
|
4007
4109
|
|
4008
4110
|
function binFormatExpression(startField, endField, format, formatType, config) {
|
4111
|
+
if (format === undefined && formatType === undefined && config.customFormatTypes && config.numberFormatType) {
|
4112
|
+
return binFormatExpression(startField, endField, config.numberFormat, config.numberFormatType, config);
|
4113
|
+
}
|
4114
|
+
|
4009
4115
|
const start = binNumberFormatExpr(startField, format, formatType, config);
|
4010
4116
|
const end = binNumberFormatExpr(endField, format, formatType, config);
|
4011
4117
|
return "".concat(fieldValidPredicate(startField, false), " ? \"null\" : ").concat(start, " + \"").concat(BIN_RANGE_DELIMITER, "\" + ").concat(end);
|
@@ -4014,10 +4120,22 @@
|
|
4014
4120
|
* Returns the time expression used for axis/legend labels or text mark for a temporal field
|
4015
4121
|
*/
|
4016
4122
|
|
4017
|
-
function timeFormatExpression(
|
4018
|
-
|
4123
|
+
function timeFormatExpression(_ref6) {
|
4124
|
+
let {
|
4125
|
+
field,
|
4126
|
+
timeUnit,
|
4127
|
+
format,
|
4128
|
+
formatType,
|
4129
|
+
rawTimeFormat,
|
4130
|
+
isUTCScale
|
4131
|
+
} = _ref6;
|
4132
|
+
|
4019
4133
|
if (!timeUnit || format) {
|
4020
4134
|
// If there is no time unit, or if user explicitly specifies format for axis/legend/text.
|
4135
|
+
if (!timeUnit && formatType) {
|
4136
|
+
return "".concat(formatType, "(").concat(field, ", '").concat(format, "')");
|
4137
|
+
}
|
4138
|
+
|
4021
4139
|
format = vega.isString(format) ? format : rawTimeFormat; // only use provided timeFormat if there is no timeUnit.
|
4022
4140
|
|
4023
4141
|
return "".concat(isUTCScale ? 'utc' : 'time', "Format(").concat(field, ", '").concat(format, "')");
|
@@ -4049,13 +4167,13 @@
|
|
4049
4167
|
return c in SORT_BY_CHANNEL_INDEX;
|
4050
4168
|
}
|
4051
4169
|
function isSortByEncoding(sort) {
|
4052
|
-
return !!sort &&
|
4170
|
+
return !!(sort !== null && sort !== void 0 && sort['encoding']);
|
4053
4171
|
}
|
4054
4172
|
function isSortField(sort) {
|
4055
|
-
return
|
4173
|
+
return sort && (sort['op'] === 'count' || !!sort['field']);
|
4056
4174
|
}
|
4057
4175
|
function isSortArray(sort) {
|
4058
|
-
return
|
4176
|
+
return sort && vega.isArray(sort);
|
4059
4177
|
}
|
4060
4178
|
|
4061
4179
|
function isFacetMapping(f) {
|
@@ -4217,15 +4335,15 @@
|
|
4217
4335
|
*/
|
4218
4336
|
|
4219
4337
|
function hasConditionalFieldDef(channelDef) {
|
4220
|
-
const condition = channelDef
|
4338
|
+
const condition = channelDef === null || channelDef === void 0 ? void 0 : channelDef['condition'];
|
4221
4339
|
return !!condition && !vega.isArray(condition) && isFieldDef(condition);
|
4222
4340
|
}
|
4223
4341
|
function hasConditionalFieldOrDatumDef(channelDef) {
|
4224
|
-
const condition = channelDef
|
4342
|
+
const condition = channelDef === null || channelDef === void 0 ? void 0 : channelDef['condition'];
|
4225
4343
|
return !!condition && !vega.isArray(condition) && isFieldOrDatumDef(condition);
|
4226
4344
|
}
|
4227
4345
|
function hasConditionalValueDef(channelDef) {
|
4228
|
-
const condition = channelDef
|
4346
|
+
const condition = channelDef === null || channelDef === void 0 ? void 0 : channelDef['condition'];
|
4229
4347
|
return !!condition && (vega.isArray(condition) || isValueDef(condition));
|
4230
4348
|
}
|
4231
4349
|
function isFieldDef(channelDef) {
|
@@ -4233,7 +4351,7 @@
|
|
4233
4351
|
return channelDef && (!!channelDef['field'] || channelDef['aggregate'] === 'count');
|
4234
4352
|
}
|
4235
4353
|
function channelDefType(channelDef) {
|
4236
|
-
return channelDef
|
4354
|
+
return channelDef === null || channelDef === void 0 ? void 0 : channelDef['type'];
|
4237
4355
|
}
|
4238
4356
|
function isDatumDef(channelDef) {
|
4239
4357
|
return channelDef && 'datum' in channelDef;
|
@@ -5082,7 +5200,7 @@
|
|
5082
5200
|
}
|
5083
5201
|
};
|
5084
5202
|
function isConditionalAxisValue(v) {
|
5085
|
-
return v
|
5203
|
+
return v === null || v === void 0 ? void 0 : v.condition;
|
5086
5204
|
}
|
5087
5205
|
const AXIS_PARTS = ['domain', 'grid', 'labels', 'ticks', 'title'];
|
5088
5206
|
/**
|
@@ -5955,7 +6073,7 @@
|
|
5955
6073
|
...(isMarkDef(partBaseSpec.mark) ? partBaseSpec.mark : {
|
5956
6074
|
type: partBaseSpec.mark
|
5957
6075
|
}),
|
5958
|
-
style: "".concat(mark, "-").concat(part),
|
6076
|
+
style: "".concat(mark, "-").concat(String(part)),
|
5959
6077
|
...(vega.isBoolean(markDef[part]) ? {} : markDef[part])
|
5960
6078
|
}
|
5961
6079
|
}];
|
@@ -7047,13 +7165,13 @@
|
|
7047
7165
|
}
|
7048
7166
|
};
|
7049
7167
|
function isLegendBinding(bind) {
|
7050
|
-
return
|
7168
|
+
return bind === 'legend' || !!(bind !== null && bind !== void 0 && bind.legend);
|
7051
7169
|
}
|
7052
7170
|
function isLegendStreamBinding(bind) {
|
7053
7171
|
return isLegendBinding(bind) && vega.isObject(bind);
|
7054
7172
|
}
|
7055
7173
|
function isSelectionParameter(param) {
|
7056
|
-
return !!param['select'];
|
7174
|
+
return !!(param !== null && param !== void 0 && param['select']);
|
7057
7175
|
}
|
7058
7176
|
|
7059
7177
|
function assembleParameterSignals(params) {
|
@@ -7122,34 +7240,6 @@
|
|
7122
7240
|
return 'hconcat' in spec;
|
7123
7241
|
}
|
7124
7242
|
|
7125
|
-
function isFitType(autoSizeType) {
|
7126
|
-
return autoSizeType === 'fit' || autoSizeType === 'fit-x' || autoSizeType === 'fit-y';
|
7127
|
-
}
|
7128
|
-
function getFitType(sizeType) {
|
7129
|
-
return sizeType ? "fit-".concat(getPositionScaleChannel(sizeType)) : 'fit';
|
7130
|
-
}
|
7131
|
-
const TOP_LEVEL_PROPERTIES = ['background', 'padding' // We do not include "autosize" here as it is supported by only unit and layer specs and thus need to be normalized
|
7132
|
-
];
|
7133
|
-
function extractTopLevelProperties(t, includeParams) {
|
7134
|
-
const o = {};
|
7135
|
-
|
7136
|
-
for (const p of TOP_LEVEL_PROPERTIES) {
|
7137
|
-
if (t && t[p] !== undefined) {
|
7138
|
-
o[p] = signalRefOrValue(t[p]);
|
7139
|
-
}
|
7140
|
-
}
|
7141
|
-
|
7142
|
-
if (includeParams) {
|
7143
|
-
o.params = t.params;
|
7144
|
-
}
|
7145
|
-
|
7146
|
-
return o;
|
7147
|
-
}
|
7148
|
-
|
7149
|
-
/**
|
7150
|
-
* Common properties for all types of specification
|
7151
|
-
*/
|
7152
|
-
|
7153
7243
|
function getStepFor(_ref) {
|
7154
7244
|
let {
|
7155
7245
|
step,
|
@@ -7318,7 +7408,8 @@
|
|
7318
7408
|
},
|
7319
7409
|
concat: {
|
7320
7410
|
spacing: DEFAULT_SPACING
|
7321
|
-
}
|
7411
|
+
},
|
7412
|
+
normalizedNumberFormat: '.0%'
|
7322
7413
|
}; // Tableau10 color palette, copied from `vegaScale.scheme('tableau10')`
|
7323
7414
|
|
7324
7415
|
const tab10 = ['#4c78a8', '#f58518', '#e45756', '#72b7b2', '#54a24b', '#eeca3b', '#b279a2', '#ff9da6', '#9d755d', '#bab0ac'];
|
@@ -7598,7 +7689,7 @@
|
|
7598
7689
|
}
|
7599
7690
|
const MARK_STYLES = new Set(['view', ...PRIMITIVE_MARKS]);
|
7600
7691
|
const VL_ONLY_CONFIG_PROPERTIES = ['color', 'fontSize', 'background', // We apply background to the spec directly.
|
7601
|
-
'padding', 'facet', 'concat', 'numberFormat', 'timeFormat', 'countTitle', 'header', 'axisQuantitative', 'axisTemporal', 'axisDiscrete', 'axisPoint', 'axisXBand', 'axisXPoint', 'axisXDiscrete', 'axisXQuantitative', 'axisXTemporal', 'axisYBand', 'axisYPoint', 'axisYDiscrete', 'axisYQuantitative', 'axisYTemporal', 'scale', 'selection', 'overlay' // FIXME: Redesign and unhide this
|
7692
|
+
'padding', 'facet', 'concat', 'numberFormat', 'numberFormatType', 'normalizedNumberFormat', 'normalizedNumberFormatType', 'timeFormat', 'countTitle', 'header', 'axisQuantitative', 'axisTemporal', 'axisDiscrete', 'axisPoint', 'axisXBand', 'axisXPoint', 'axisXDiscrete', 'axisXQuantitative', 'axisXTemporal', 'axisYBand', 'axisYPoint', 'axisYDiscrete', 'axisYQuantitative', 'axisYTemporal', 'scale', 'selection', 'overlay' // FIXME: Redesign and unhide this
|
7602
7693
|
];
|
7603
7694
|
const VL_ONLY_ALL_MARK_SPECIFIC_CONFIG_PROPERTY_INDEX = {
|
7604
7695
|
view: ['continuousWidth', 'continuousHeight', 'discreteWidth', 'discreteHeight', 'step'],
|
@@ -7907,14 +7998,11 @@
|
|
7907
7998
|
case 'radius':
|
7908
7999
|
return 'theta';
|
7909
8000
|
}
|
7910
|
-
}
|
7911
|
-
// If required properties change, make sure to update CompassQL.
|
7912
|
-
|
8001
|
+
}
|
7913
8002
|
|
7914
8003
|
function stack(m, encoding) {
|
7915
8004
|
var _stackedFieldDef$scal, _stackedFieldDef$scal2;
|
7916
8005
|
|
7917
|
-
let opt = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
7918
8006
|
const mark = isMarkDef(m) ? m.type : m; // Should have stackable mark
|
7919
8007
|
|
7920
8008
|
if (!STACKABLE_MARKS.has(mark)) {
|
@@ -8011,11 +8099,8 @@
|
|
8011
8099
|
|
8012
8100
|
|
8013
8101
|
if (stackedFieldDef !== null && stackedFieldDef !== void 0 && (_stackedFieldDef$scal = stackedFieldDef.scale) !== null && _stackedFieldDef$scal !== void 0 && _stackedFieldDef$scal.type && (stackedFieldDef === null || stackedFieldDef === void 0 ? void 0 : (_stackedFieldDef$scal2 = stackedFieldDef.scale) === null || _stackedFieldDef$scal2 === void 0 ? void 0 : _stackedFieldDef$scal2.type) !== ScaleType.LINEAR) {
|
8014
|
-
|
8015
|
-
|
8016
|
-
} else {
|
8017
|
-
warn(cannotStackNonLinearScale(stackedFieldDef.scale.type));
|
8018
|
-
}
|
8102
|
+
warn(cannotStackNonLinearScale(stackedFieldDef.scale.type));
|
8103
|
+
return null;
|
8019
8104
|
} // Check if it is a ranged mark
|
8020
8105
|
|
8021
8106
|
|
@@ -9283,6 +9368,30 @@
|
|
9283
9368
|
return autosize;
|
9284
9369
|
}
|
9285
9370
|
|
9371
|
+
function isFitType(autoSizeType) {
|
9372
|
+
return autoSizeType === 'fit' || autoSizeType === 'fit-x' || autoSizeType === 'fit-y';
|
9373
|
+
}
|
9374
|
+
function getFitType(sizeType) {
|
9375
|
+
return sizeType ? "fit-".concat(getPositionScaleChannel(sizeType)) : 'fit';
|
9376
|
+
}
|
9377
|
+
const TOP_LEVEL_PROPERTIES = ['background', 'padding' // We do not include "autosize" here as it is supported by only unit and layer specs and thus need to be normalized
|
9378
|
+
];
|
9379
|
+
function extractTopLevelProperties(t, includeParams) {
|
9380
|
+
const o = {};
|
9381
|
+
|
9382
|
+
for (const p of TOP_LEVEL_PROPERTIES) {
|
9383
|
+
if (t && t[p] !== undefined) {
|
9384
|
+
o[p] = signalRefOrValue(t[p]);
|
9385
|
+
}
|
9386
|
+
}
|
9387
|
+
|
9388
|
+
if (includeParams) {
|
9389
|
+
o.params = t.params;
|
9390
|
+
}
|
9391
|
+
|
9392
|
+
return o;
|
9393
|
+
}
|
9394
|
+
|
9286
9395
|
/**
|
9287
9396
|
* Generic class for storing properties that are explicitly specified
|
9288
9397
|
* and implicitly determined by the compiler.
|
@@ -9602,14 +9711,26 @@
|
|
9602
9711
|
}
|
9603
9712
|
function assembleUnitSelectionData(model, data) {
|
9604
9713
|
const dataCopy = [...data];
|
9714
|
+
const unit = unitName(model, {
|
9715
|
+
escape: false
|
9716
|
+
});
|
9605
9717
|
|
9606
9718
|
for (const selCmpt of vals((_model$component$sele3 = model.component.selection) !== null && _model$component$sele3 !== void 0 ? _model$component$sele3 : {})) {
|
9607
9719
|
var _model$component$sele3;
|
9608
9720
|
|
9609
|
-
const
|
9721
|
+
const store = {
|
9610
9722
|
name: selCmpt.name + STORE
|
9611
9723
|
};
|
9612
9724
|
|
9725
|
+
if (selCmpt.project.hasSelectionId) {
|
9726
|
+
store.transform = [{
|
9727
|
+
type: 'collect',
|
9728
|
+
sort: {
|
9729
|
+
field: SELECTION_ID
|
9730
|
+
}
|
9731
|
+
}];
|
9732
|
+
}
|
9733
|
+
|
9613
9734
|
if (selCmpt.init) {
|
9614
9735
|
const fields = selCmpt.project.items.map(proj => {
|
9615
9736
|
const {
|
@@ -9618,10 +9739,11 @@
|
|
9618
9739
|
} = proj;
|
9619
9740
|
return rest;
|
9620
9741
|
});
|
9621
|
-
|
9622
|
-
unit
|
9623
|
-
|
9624
|
-
|
9742
|
+
store.values = selCmpt.project.hasSelectionId ? selCmpt.init.map(i => ({
|
9743
|
+
unit,
|
9744
|
+
[SELECTION_ID]: assembleInit(i, false)[0]
|
9745
|
+
})) : selCmpt.init.map(i => ({
|
9746
|
+
unit,
|
9625
9747
|
fields,
|
9626
9748
|
values: assembleInit(i, false)
|
9627
9749
|
}));
|
@@ -9630,7 +9752,7 @@
|
|
9630
9752
|
const contains = dataCopy.filter(d => d.name === selCmpt.name + STORE);
|
9631
9753
|
|
9632
9754
|
if (!contains.length) {
|
9633
|
-
dataCopy.push(
|
9755
|
+
dataCopy.push(store);
|
9634
9756
|
}
|
9635
9757
|
}
|
9636
9758
|
|
@@ -9787,9 +9909,10 @@
|
|
9787
9909
|
this._children = []; // equivalent to removing every child link one by one
|
9788
9910
|
|
9789
9911
|
parent.removeChild(this);
|
9790
|
-
parent.parent.removeChild(parent); // swap two nodes
|
9912
|
+
const loc = parent.parent.removeChild(parent); // swap two nodes but maintain order in children
|
9791
9913
|
|
9792
|
-
this.
|
9914
|
+
this._parent = newParent;
|
9915
|
+
newParent.addChild(this, loc);
|
9793
9916
|
parent.parent = this;
|
9794
9917
|
}
|
9795
9918
|
|
@@ -10022,6 +10145,8 @@
|
|
10022
10145
|
|
10023
10146
|
_defineProperty(this, "hasField", void 0);
|
10024
10147
|
|
10148
|
+
_defineProperty(this, "hasSelectionId", void 0);
|
10149
|
+
|
10025
10150
|
_defineProperty(this, "timeUnit", void 0);
|
10026
10151
|
|
10027
10152
|
_defineProperty(this, "items", void 0);
|
@@ -10033,6 +10158,7 @@
|
|
10033
10158
|
this.items = items;
|
10034
10159
|
this.hasChannel = {};
|
10035
10160
|
this.hasField = {};
|
10161
|
+
this.hasSelectionId = false;
|
10036
10162
|
}
|
10037
10163
|
|
10038
10164
|
}
|
@@ -10164,6 +10290,7 @@
|
|
10164
10290
|
};
|
10165
10291
|
proj.items.push(parsed[field] = p);
|
10166
10292
|
proj.hasField[field] = proj.hasChannel[channel] = parsed[field];
|
10293
|
+
proj.hasSelectionId = proj.hasSelectionId || field === SELECTION_ID;
|
10167
10294
|
}
|
10168
10295
|
} else {
|
10169
10296
|
warn(cannotProjectOnChannelWithoutField(channel));
|
@@ -10182,6 +10309,7 @@
|
|
10182
10309
|
};
|
10183
10310
|
proj.items.push(p);
|
10184
10311
|
proj.hasField[field] = p;
|
10312
|
+
proj.hasSelectionId = proj.hasSelectionId || field === SELECTION_ID;
|
10185
10313
|
}
|
10186
10314
|
|
10187
10315
|
if (init) {
|
@@ -10199,7 +10327,7 @@
|
|
10199
10327
|
signals: (model, selCmpt, allSignals) => {
|
10200
10328
|
const name = selCmpt.name + TUPLE_FIELDS;
|
10201
10329
|
const hasSignal = allSignals.filter(s => s.name === name);
|
10202
|
-
return hasSignal.length > 0 ? allSignals : allSignals.concat({
|
10330
|
+
return hasSignal.length > 0 || selCmpt.project.hasSelectionId ? allSignals : allSignals.concat({
|
10203
10331
|
name,
|
10204
10332
|
value: selCmpt.project.items.map(proj => {
|
10205
10333
|
const {
|
@@ -10579,14 +10707,7 @@
|
|
10579
10707
|
const name = selCmpt.name;
|
10580
10708
|
const fieldsSg = name + TUPLE_FIELDS;
|
10581
10709
|
const project = selCmpt.project;
|
10582
|
-
const datum = '(item().isVoronoi ? datum.datum : datum)';
|
10583
|
-
const values = project.items.map(p => {
|
10584
|
-
const fieldDef = model.fieldDef(p.channel); // Binned fields should capture extents, for a range test against the raw field.
|
10585
|
-
|
10586
|
-
return fieldDef !== null && fieldDef !== void 0 && fieldDef.bin ? "[".concat(datum, "[").concat(vega.stringValue(model.vgField(p.channel, {})), "], ") + "".concat(datum, "[").concat(vega.stringValue(model.vgField(p.channel, {
|
10587
|
-
binSuffix: 'end'
|
10588
|
-
})), "]]") : "".concat(datum, "[").concat(vega.stringValue(p.field), "]");
|
10589
|
-
}).join(', '); // Only add a discrete selection to the store if a datum is present _and_
|
10710
|
+
const datum = '(item().isVoronoi ? datum.datum : datum)'; // Only add a discrete selection to the store if a datum is present _and_
|
10590
10711
|
// the interaction isn't occurring on a group mark. This guards against
|
10591
10712
|
// polluting interactive state with invalid values in faceted displays
|
10592
10713
|
// as the group marks are also data-driven. We force the update to account
|
@@ -10594,17 +10715,31 @@
|
|
10594
10715
|
// whitespace followed by a click in whitespace; the store should only
|
10595
10716
|
// be cleared on the second click).
|
10596
10717
|
|
10597
|
-
const update = "unit: ".concat(unitName(model), ", fields: ").concat(fieldsSg, ", values");
|
10598
|
-
const events = selCmpt.events;
|
10599
10718
|
const brushes = vals((_model$component$sele = model.component.selection) !== null && _model$component$sele !== void 0 ? _model$component$sele : {}).reduce((acc, cmpt) => {
|
10600
10719
|
return cmpt.type === 'interval' ? acc.concat(cmpt.name + BRUSH) : acc;
|
10601
10720
|
}, []).map(b => "indexof(item().mark.name, '".concat(b, "') < 0")).join(' && ');
|
10602
|
-
const test = "datum && item().mark.marktype !== 'group'".concat(brushes ? " && ".concat(brushes) : '');
|
10721
|
+
const test = "datum && item().mark.marktype !== 'group' && indexof(item().mark.role, 'legend') < 0".concat(brushes ? " && ".concat(brushes) : '');
|
10722
|
+
let update = "unit: ".concat(unitName(model), ", ");
|
10723
|
+
|
10724
|
+
if (selCmpt.project.hasSelectionId) {
|
10725
|
+
update += "".concat(SELECTION_ID, ": ").concat(datum, "[").concat(vega.stringValue(SELECTION_ID), "]");
|
10726
|
+
} else {
|
10727
|
+
const values = project.items.map(p => {
|
10728
|
+
const fieldDef = model.fieldDef(p.channel); // Binned fields should capture extents, for a range test against the raw field.
|
10729
|
+
|
10730
|
+
return fieldDef !== null && fieldDef !== void 0 && fieldDef.bin ? "[".concat(datum, "[").concat(vega.stringValue(model.vgField(p.channel, {})), "], ") + "".concat(datum, "[").concat(vega.stringValue(model.vgField(p.channel, {
|
10731
|
+
binSuffix: 'end'
|
10732
|
+
})), "]]") : "".concat(datum, "[").concat(vega.stringValue(p.field), "]");
|
10733
|
+
}).join(', ');
|
10734
|
+
update += "fields: ".concat(fieldsSg, ", values: [").concat(values, "]");
|
10735
|
+
}
|
10736
|
+
|
10737
|
+
const events = selCmpt.events;
|
10603
10738
|
return signals.concat([{
|
10604
10739
|
name: name + TUPLE,
|
10605
10740
|
on: events ? [{
|
10606
10741
|
events,
|
10607
|
-
update: "".concat(test, " ? {").concat(update, "
|
10742
|
+
update: "".concat(test, " ? {").concat(update, "} : null"),
|
10608
10743
|
force: true
|
10609
10744
|
}] : []
|
10610
10745
|
}]);
|
@@ -10785,22 +10920,24 @@
|
|
10785
10920
|
} = getFormatMixins(fieldDef);
|
10786
10921
|
value = binFormatExpression(startField, endField, format, formatType, config);
|
10787
10922
|
toSkip[channel2] = true;
|
10788
|
-
} else if (stack && stack.fieldChannel === channel && stack.offset === 'normalize') {
|
10789
|
-
const {
|
10790
|
-
format,
|
10791
|
-
formatType
|
10792
|
-
} = getFormatMixins(fieldDef);
|
10793
|
-
value = formatSignalRef({
|
10794
|
-
fieldOrDatumDef: fieldDef,
|
10795
|
-
format,
|
10796
|
-
formatType,
|
10797
|
-
expr,
|
10798
|
-
config,
|
10799
|
-
normalizeStack: true
|
10800
|
-
}).signal;
|
10801
10923
|
}
|
10802
10924
|
}
|
10803
10925
|
|
10926
|
+
if ((isXorY(channel) || channel === THETA || channel === RADIUS) && stack && stack.fieldChannel === channel && stack.offset === 'normalize') {
|
10927
|
+
const {
|
10928
|
+
format,
|
10929
|
+
formatType
|
10930
|
+
} = getFormatMixins(fieldDef);
|
10931
|
+
value = formatSignalRef({
|
10932
|
+
fieldOrDatumDef: fieldDef,
|
10933
|
+
format,
|
10934
|
+
formatType,
|
10935
|
+
expr,
|
10936
|
+
config,
|
10937
|
+
normalizeStack: true
|
10938
|
+
}).signal;
|
10939
|
+
}
|
10940
|
+
|
10804
10941
|
(_value = value) !== null && _value !== void 0 ? _value : value = textRef(fieldDef, config, expr).signal;
|
10805
10942
|
tuples.push({
|
10806
10943
|
channel,
|
@@ -11576,9 +11713,15 @@
|
|
11576
11713
|
const scaleType = scale.get('type');
|
11577
11714
|
|
11578
11715
|
if (scaleType === 'band') {
|
11716
|
+
let bandWidth = "bandwidth('".concat(scaleName, "')");
|
11717
|
+
|
11718
|
+
if (bandSize.band !== 1) {
|
11719
|
+
bandWidth = "".concat(bandSize.band, " * ").concat(bandWidth);
|
11720
|
+
} // TODO(#8351): make 0.25 here configurable
|
11721
|
+
|
11722
|
+
|
11579
11723
|
return {
|
11580
|
-
|
11581
|
-
band: bandSize.band
|
11724
|
+
signal: "max(0.25, ".concat(bandWidth, ")")
|
11582
11725
|
};
|
11583
11726
|
} else if (bandSize.band !== 1) {
|
11584
11727
|
warn(cannotUseRelativeBandSizeWithNonBandScale(scaleType));
|
@@ -11649,8 +11792,9 @@
|
|
11649
11792
|
} else {
|
11650
11793
|
warn(cannotApplySizeToNonOrientedMark(markDef.type));
|
11651
11794
|
}
|
11652
|
-
}
|
11795
|
+
}
|
11653
11796
|
|
11797
|
+
const hasSizeFromMarkOrEncoding = !!sizeMixins; // Otherwise, apply default value
|
11654
11798
|
|
11655
11799
|
const bandSize = getBandSize({
|
11656
11800
|
channel,
|
@@ -11671,7 +11815,7 @@
|
|
11671
11815
|
If band is 0.6, the the x/y position in such case should be `(1 - band) / 2` = 0.2
|
11672
11816
|
*/
|
11673
11817
|
|
11674
|
-
const defaultBandAlign = (scale === null || scale === void 0 ? void 0 : scale.get('type'))
|
11818
|
+
const defaultBandAlign = (scale === null || scale === void 0 ? void 0 : scale.get('type')) === 'band' && isRelativeBandSize(bandSize) && !hasSizeFromMarkOrEncoding ? 'top' : 'middle';
|
11675
11819
|
const vgChannel = vgAlignedPositionChannel(channel, markDef, config, defaultBandAlign);
|
11676
11820
|
const center = vgChannel === 'xc' || vgChannel === 'yc';
|
11677
11821
|
const {
|
@@ -11991,9 +12135,12 @@
|
|
11991
12135
|
const scaleComponent = model.getScaleComponent(channel);
|
11992
12136
|
|
11993
12137
|
if (scaleComponent) {
|
12138
|
+
var _model$stack;
|
12139
|
+
|
11994
12140
|
const scaleType = scaleComponent.get('type');
|
11995
12141
|
const field = model.vgField(channel, {
|
11996
|
-
expr: 'datum'
|
12142
|
+
expr: 'datum',
|
12143
|
+
binSuffix: (_model$stack = model.stack) !== null && _model$stack !== void 0 && _model$stack.impute ? 'mid' : undefined
|
11997
12144
|
}); // While discrete domain scales can handle invalid values, continuous scales can't.
|
11998
12145
|
|
11999
12146
|
if (field && hasContinuousDomain(scaleType)) {
|
@@ -12577,7 +12724,7 @@
|
|
12577
12724
|
var _model$component$sele;
|
12578
12725
|
|
12579
12726
|
return vals((_model$component$sele = model.component.selection) !== null && _model$component$sele !== void 0 ? _model$component$sele : {}).reduce((identifier, selCmpt) => {
|
12580
|
-
return identifier || selCmpt.project.
|
12727
|
+
return identifier || selCmpt.project.hasSelectionId;
|
12581
12728
|
}, false);
|
12582
12729
|
} // Binding a point selection to query widgets or legends disables default direct manipulation interaction.
|
12583
12730
|
// A user can choose to re-enable it by explicitly specifying triggering input events.
|
@@ -12747,7 +12894,9 @@
|
|
12747
12894
|
}
|
12748
12895
|
}
|
12749
12896
|
|
12750
|
-
const
|
12897
|
+
const fn = selCmpt.project.hasSelectionId ? 'vlSelectionIdTest(' : 'vlSelectionTest(';
|
12898
|
+
const resolve = selCmpt.resolve === 'global' ? ')' : ", ".concat(vega.stringValue(selCmpt.resolve), ")");
|
12899
|
+
const test = "".concat(fn).concat(store, ", ").concat(datum).concat(resolve);
|
12751
12900
|
const length = "length(data(".concat(store, "))");
|
12752
12901
|
return pred.empty === false ? "".concat(length, " && ").concat(test) : "!".concat(length, " || ").concat(test);
|
12753
12902
|
}
|
@@ -14194,13 +14343,36 @@
|
|
14194
14343
|
format,
|
14195
14344
|
formatType
|
14196
14345
|
} = legend;
|
14197
|
-
|
14198
|
-
|
14199
|
-
|
14200
|
-
|
14201
|
-
|
14202
|
-
|
14203
|
-
|
14346
|
+
let text = undefined;
|
14347
|
+
|
14348
|
+
if (isCustomFormatType(formatType)) {
|
14349
|
+
text = formatCustomType({
|
14350
|
+
fieldOrDatumDef,
|
14351
|
+
field: 'datum.value',
|
14352
|
+
format,
|
14353
|
+
formatType,
|
14354
|
+
config
|
14355
|
+
});
|
14356
|
+
} else if (format === undefined && formatType === undefined && config.customFormatTypes) {
|
14357
|
+
if (fieldOrDatumDef.type === 'quantitative' && config.numberFormatType) {
|
14358
|
+
text = formatCustomType({
|
14359
|
+
fieldOrDatumDef,
|
14360
|
+
field: 'datum.value',
|
14361
|
+
format: config.numberFormat,
|
14362
|
+
formatType: config.numberFormatType,
|
14363
|
+
config
|
14364
|
+
});
|
14365
|
+
} else if (fieldOrDatumDef.type === 'temporal' && config.timeFormatType && isFieldDef(fieldOrDatumDef) && fieldOrDatumDef.timeUnit === undefined) {
|
14366
|
+
text = formatCustomType({
|
14367
|
+
fieldOrDatumDef,
|
14368
|
+
field: 'datum.value',
|
14369
|
+
format: config.timeFormat,
|
14370
|
+
formatType: config.timeFormatType,
|
14371
|
+
config
|
14372
|
+
});
|
14373
|
+
}
|
14374
|
+
}
|
14375
|
+
|
14204
14376
|
const labelsSpec = { ...(opacity ? {
|
14205
14377
|
opacity
|
14206
14378
|
} : {}),
|
@@ -20152,7 +20324,11 @@
|
|
20152
20324
|
this.transform = duplicate(transform); // duplicate to prevent side effects
|
20153
20325
|
|
20154
20326
|
const specifiedAs = (_this$transform$as = this.transform.as) !== null && _this$transform$as !== void 0 ? _this$transform$as : [undefined, undefined];
|
20155
|
-
this.transform.as = [(_specifiedAs$ = specifiedAs[0]) !== null && _specifiedAs$ !== void 0 ? _specifiedAs$ : 'value', (_specifiedAs$2 = specifiedAs[1]) !== null && _specifiedAs$2 !== void 0 ? _specifiedAs$2 : 'density'];
|
20327
|
+
this.transform.as = [(_specifiedAs$ = specifiedAs[0]) !== null && _specifiedAs$ !== void 0 ? _specifiedAs$ : 'value', (_specifiedAs$2 = specifiedAs[1]) !== null && _specifiedAs$2 !== void 0 ? _specifiedAs$2 : 'density']; // set steps when we are grouping so that we get consitent sampling points for imputing and grouping
|
20328
|
+
|
20329
|
+
if (transform.groupby && transform.minsteps == null && transform.maxsteps == null && transform.steps == null) {
|
20330
|
+
this.transform.steps = 200;
|
20331
|
+
}
|
20156
20332
|
}
|
20157
20333
|
|
20158
20334
|
dependentFields() {
|
@@ -22543,6 +22719,45 @@
|
|
22543
22719
|
}),
|
22544
22720
|
...specifiedLabelsSpec
|
22545
22721
|
};
|
22722
|
+
} else if (format === undefined && formatType === undefined && config.customFormatTypes) {
|
22723
|
+
if (channelDefType(fieldOrDatumDef) === 'quantitative') {
|
22724
|
+
if (isPositionFieldOrDatumDef(fieldOrDatumDef) && fieldOrDatumDef.stack === 'normalize' && config.normalizedNumberFormatType) {
|
22725
|
+
return {
|
22726
|
+
text: formatCustomType({
|
22727
|
+
fieldOrDatumDef,
|
22728
|
+
field: 'datum.value',
|
22729
|
+
format: config.normalizedNumberFormat,
|
22730
|
+
formatType: config.normalizedNumberFormatType,
|
22731
|
+
config
|
22732
|
+
}),
|
22733
|
+
...specifiedLabelsSpec
|
22734
|
+
};
|
22735
|
+
} else if (config.numberFormatType) {
|
22736
|
+
return {
|
22737
|
+
text: formatCustomType({
|
22738
|
+
fieldOrDatumDef,
|
22739
|
+
field: 'datum.value',
|
22740
|
+
format: config.numberFormat,
|
22741
|
+
formatType: config.numberFormatType,
|
22742
|
+
config
|
22743
|
+
}),
|
22744
|
+
...specifiedLabelsSpec
|
22745
|
+
};
|
22746
|
+
}
|
22747
|
+
}
|
22748
|
+
|
22749
|
+
if (channelDefType(fieldOrDatumDef) === 'temporal' && config.timeFormatType && isFieldDef(fieldOrDatumDef) && !fieldOrDatumDef.timeUnit) {
|
22750
|
+
return {
|
22751
|
+
text: formatCustomType({
|
22752
|
+
fieldOrDatumDef,
|
22753
|
+
field: 'datum.value',
|
22754
|
+
format: config.timeFormat,
|
22755
|
+
formatType: config.timeFormatType,
|
22756
|
+
config
|
22757
|
+
}),
|
22758
|
+
...specifiedLabelsSpec
|
22759
|
+
};
|
22760
|
+
}
|
22546
22761
|
}
|
22547
22762
|
|
22548
22763
|
return specifiedLabelsSpec;
|