@carto/kepler.gl 0.0.65-alpha.labels.2 → 0.0.65-alpha.labels.4

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/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@carto/kepler.gl",
3
3
  "author": "CARTO",
4
4
  "homepage": "https://github.com/CartoDB/carto-kepler#readme",
5
- "version": "0.0.65-alpha.labels.2",
5
+ "version": "0.0.65-alpha.labels.4",
6
6
  "description": "kepler.gl is a webgl based application to visualize large scale location data in the browser",
7
7
  "license": "MIT",
8
8
  "main": "dist/index.js",
@@ -303,7 +303,6 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) {
303
303
  return;
304
304
  }
305
305
 
306
- throw error;
307
306
  const errorMessage = `An error in deck.gl: ${error?.message} in ${layer?.id}`;
308
307
  const notificationId = `${layer?.id}-${error?.message}`;
309
308
 
@@ -16,8 +16,8 @@ class EnhancedTextLayer extends TextLayer {
16
16
  }
17
17
  }
18
18
 
19
- // TODO fix in deck.gl
20
- TextLayer.defaultProps.fontSettings = {type: 'object', value: {}, optional: true, compare: 2};
19
+ // TODO remove once https://github.com/visgl/deck.gl/pull/7757 out
20
+ TextLayer.defaultProps.fontSettings = {type: 'object', value: {}, optional: true, compare: 1};
21
21
 
22
22
  const defaultProps = {
23
23
  ...TextLayer.defaultProps,
@@ -41,9 +41,13 @@ export class PointLabelLayer extends CompositeLayer {
41
41
 
42
42
  // Place secondary label under main label (spacing 1 / 3 main label font size)
43
43
  const yOffset = secondary ? (1 + 1 / 3) * sizeScale : 0;
44
- const xPadding = sizeScale / 4; // Padding based on font size (font size / 4)
45
- const yPadding = sizeScale;
46
- const radiusPadding = 1 + 1 / 4; // Padding based on point radius (radius/ 4)
44
+
45
+ // Padding based on font size (font size / 4)
46
+ const xPadding = sizeScale / 4;
47
+ const yPadding = sizeScale + 1 / 4;
48
+
49
+ // Padding based on point radius (radius/ 4)
50
+ const radiusPadding = 1 + 1 / 4;
47
51
 
48
52
  return typeof getRadius === 'function'
49
53
  ? d => {
@@ -57,8 +61,7 @@ export class PointLabelLayer extends CompositeLayer {
57
61
  }
58
62
 
59
63
  calculateBackgroundPadding(getPixelOffset) {
60
- // Alignment based only on first label
61
- const {alignment, anchor, sizeScale} = this.props;
64
+ const {getTextAnchor: anchor, getAlignmentBaseline: alignment, sizeScale} = this.props;
62
65
 
63
66
  // Heuristics to avoid label overlap (should we base this on the text length?)
64
67
  const paddingX = 12 * sizeScale;
@@ -146,9 +149,10 @@ export class PointLabelLayer extends CompositeLayer {
146
149
  getSecondaryColor,
147
150
  getSecondaryText,
148
151
  secondaryOutlineColor,
149
- secondarySizeScale
152
+ secondarySizeScale,
153
+ updateTriggers
150
154
  } = this.props;
151
- const getPixelOffset = this.calculatePixelOffset();
155
+ const getPixelOffset = this.calculatePixelOffset(false);
152
156
  const backgroundPadding = this.calculateBackgroundPadding(getPixelOffset);
153
157
  const out = [
154
158
  this.renderTextLayer('primary', {
@@ -161,6 +165,7 @@ export class PointLabelLayer extends CompositeLayer {
161
165
  this.renderTextLayer('secondary', {
162
166
  getText: getSecondaryText,
163
167
  getPixelOffset: this.calculatePixelOffset(true),
168
+ updateTriggers: {getText: updateTriggers.getSecondaryText},
164
169
 
165
170
  // Optional overrides
166
171
  ...(getSecondaryColor && {getColor: getSecondaryColor}),
Binary file
@@ -23,37 +23,6 @@ import keymirror from 'keymirror';
23
23
  import {CollisionFilterExtension, DataFilterExtension} from '@deck.gl/extensions';
24
24
  import {COORDINATE_SYSTEM, Layer as DeckLayer} from '@deck.gl/core';
25
25
  import {PointLabelLayer} from '../deckgl-layers/point-label-layer/point-label-layer';
26
-
27
- // Workaround until https://github.com/visgl/deck.gl/pull/7513 is released
28
- DeckLayer.defaultProps.getFilterValue = {type: 'accessor', value: 0};
29
-
30
- // Workaround until https://github.com/visgl/deck.gl/pull/7507 is released
31
- function deepEqual(a, b) {
32
- if (a === b) {
33
- return true;
34
- }
35
- if (!a || !b) {
36
- return false;
37
- }
38
- for (const key in a) {
39
- const aValue = a[key];
40
- const bValue = b[key];
41
- const equals = aValue === bValue || deepEqual(aValue, bValue);
42
- if (!equals) {
43
- return false;
44
- }
45
- }
46
- return true;
47
- }
48
-
49
- DeckLayer.defaultProps.loadOptions = {
50
- type: 'object',
51
- value: {},
52
- optional: true,
53
- compare: true,
54
- equal: deepEqual
55
- };
56
-
57
26
  import DefaultLayerIcon from './default-layer-icon';
58
27
  import {diffUpdateTriggers} from './layer-update';
59
28
 
@@ -1348,20 +1317,24 @@ class Layer {
1348
1317
  ) {
1349
1318
  const {data, mapState} = renderOpts;
1350
1319
  const {textLabel, visibilityByZoom} = this.config;
1351
- // const extensions = [...sharedProps.extensions];
1352
1320
  const extensions = [...sharedProps.extensions, collisionFilterExtension];
1353
1321
 
1354
1322
  if (!data || !data.textLabels || !data.textLabels[0] || !data.textLabels[0].getText) {
1355
- return null;
1323
+ return [];
1356
1324
  }
1357
1325
 
1358
- // TODO other labels
1359
- const i = 0;
1360
-
1361
1326
  const [mainLabel, secondaryLabel] = textLabel;
1362
- const {alignment, anchor, color: getColor, outlineColor, size: sizeScale} = mainLabel;
1327
+ const {
1328
+ alignment,
1329
+ anchor,
1330
+ color: getColor,
1331
+ field: mainField,
1332
+ outlineColor,
1333
+ size: sizeScale
1334
+ } = mainLabel;
1363
1335
  const {
1364
1336
  color: getSecondaryColor,
1337
+ field: secondaryField,
1365
1338
  outlineColor: secondaryOutlineColor,
1366
1339
  size: secondarySizeScale
1367
1340
  } = secondaryLabel || {};
@@ -1369,12 +1342,15 @@ class Layer {
1369
1342
  return [
1370
1343
  new PointLabelLayer({
1371
1344
  ...sharedProps,
1372
- id: `${this.id}-label`,
1345
+
1346
+ // Recreate layer when labels change otherwise rendering breaks
1347
+ // TODO could be more efficient with updateTriggers?
1348
+ id: `${this.id}-${mainField?.name}-${secondaryField?.name}-label`,
1373
1349
  data: data.data,
1374
1350
  visibilityByZoom,
1375
- characterSet: 'auto',
1376
-
1377
1351
  extensions,
1352
+
1353
+ characterSet: 'auto',
1378
1354
  collisionEnabled: true,
1379
1355
  collisionGroup: `${this.id}-labels`,
1380
1356
 
@@ -1383,7 +1359,7 @@ class Layer {
1383
1359
  sizeScale,
1384
1360
  outlineColor,
1385
1361
 
1386
- ...(secondaryLabel && {
1362
+ ...(secondaryField && {
1387
1363
  getSecondaryText: data.textLabels[1].getText,
1388
1364
  getSecondaryColor,
1389
1365
  secondarySizeScale,
@@ -1410,7 +1386,8 @@ class Layer {
1410
1386
  getFilterValue: data.getFilterValue,
1411
1387
  updateTriggers: {
1412
1388
  ...updateTriggers,
1413
- getText: textLabel[i].field?.name,
1389
+ getText: mainField?.name,
1390
+ getColor: mainField?.color,
1414
1391
  getPixelOffset: {
1415
1392
  ...updateTriggers.getPixelOffset,
1416
1393
  ...updateTriggers.getRadius,
@@ -1419,7 +1396,7 @@ class Layer {
1419
1396
  },
1420
1397
  getTextAnchor: mainLabel.anchor,
1421
1398
  getAlignmentBaseline: mainLabel.alignment,
1422
- getColor: textLabel[i].color
1399
+ getSecondaryText: secondaryField?.name
1423
1400
  }
1424
1401
  })
1425
1402
  ];