Skip to content

Commit b6afb43

Browse files
committed
Streamline crosstalk support; fix tests
Stop passing Crosstalk options for every single method; instead, each method that wants Crosstalk options must explicitly pass them to invokeMethod(), just like any other argument. Also remove addSelect(), we haven't fully thought through how one might use it for non-Crosstalk scenarios.
1 parent 4e15614 commit b6afb43

File tree

9 files changed

+42
-37
lines changed

9 files changed

+42
-37
lines changed

DESCRIPTION

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ Imports:
4444
raster,
4545
scales (>= 0.2.5),
4646
sp,
47-
jsonlite,
4847
crosstalk
4948
Suggests:
5049
knitr,

NAMESPACE

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ export(addProviderTiles)
3333
export(addRasterImage)
3434
export(addRectangles)
3535
export(addScaleBar)
36-
export(addSelect)
3736
export(addSimpleGraticule)
3837
export(addTerminator)
3938
export(addTiles)
@@ -103,7 +102,6 @@ export(removeMarkerFromCluster)
103102
export(removeMeasure)
104103
export(removePopup)
105104
export(removeScaleBar)
106-
export(removeSelect)
107105
export(removeShape)
108106
export(removeTiles)
109107
export(removeTopoJSON)

R/layers.R

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -535,10 +535,19 @@ addMarkers = function(
535535
invokeMethod(
536536
map, data, 'addMarkers', pts$lat, pts$lng, icon, layerId, group, options,
537537
popup, popupOptions, clusterOptions, clusterId,
538-
safeLabel(label, data), labelOptions
538+
safeLabel(label, data), labelOptions,
539+
getCrosstalkOptions(data)
539540
) %>% expandLimits(pts$lat, pts$lng)
540541
}
541542

543+
getCrosstalkOptions <- function(data) {
544+
if (is.SharedData(data)) {
545+
list(ctKey = data$key(), ctGroup = data$groupName())
546+
} else {
547+
NULL
548+
}
549+
}
550+
542551
#' @describeIn map-layers Add Label only markers to the map
543552
#' @export
544553
addLabelOnlyMarkers = function(
@@ -838,7 +847,8 @@ addCircleMarkers = function(
838847
pts = derivePoints(data, lng, lat, missing(lng), missing(lat), "addCircleMarkers")
839848
invokeMethod(map, data, 'addCircleMarkers', pts$lat, pts$lng, radius,
840849
layerId, group, options, clusterOptions, clusterId,
841-
popup, popupOptions, safeLabel(label, data), labelOptions) %>%
850+
popup, popupOptions, safeLabel(label, data), labelOptions,
851+
getCrosstalkOptions(data)) %>%
842852
expandLimits(pts$lat, pts$lng)
843853
}
844854

R/plugin-awesomeMarkers.R

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,8 @@ addAwesomeMarkers = function(
274274
invokeMethod(
275275
map, data, 'addAwesomeMarkers', pts$lat, pts$lng, icon, layerId,
276276
group, options, popup, popupOptions,
277-
clusterOptions, clusterId, safeLabel(label, data), labelOptions
277+
clusterOptions, clusterId, safeLabel(label, data), labelOptions,
278+
getCrosstalkOptions(data)
278279
) %>% expandLimits(pts$lat, pts$lng)
279280
}
280281

R/selection.R

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,17 @@ locationFilter2Dependencies <- function() {
1010
)
1111
}
1212

13-
#' @export
14-
addSelect <- function(map) {
13+
addSelect <- function(map, data = getMapData(map)) {
1514
map$dependencies <- c(map$dependencies,
1615
leafletEasyButtonDependencies(),
1716
locationFilter2Dependencies())
1817
map <- addIonIcon(map)
1918

20-
invokeMethod(map, getMapData(map), "addSelect")
19+
invokeMethod(map, data, "addSelect",
20+
getCrosstalkOptions(data)[["ctGroup"]]
21+
)
2122
}
2223

23-
#' @export
2424
removeSelect <- function(map) {
2525
invokeMethod(map, NULL, "removeSelect")
2626
}

R/utils.R

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,12 @@ filterNULL = function(x) {
4949
invokeMethod = function(map, data, method, ...) {
5050
crosstalkOptions <- if (crosstalk::is.SharedData(data)) {
5151
map$dependencies <- c(map$dependencies, crosstalk::crosstalkLibs())
52-
sd <- data
53-
data <- sd$data()
54-
list(
55-
ctKey = sd$key(),
56-
ctGroup = sd$groupName()
57-
)
52+
data <- data$data()
5853
} else {
5954
NULL
6055
}
6156

62-
args = c(evalFormula(list(...), data), list(crosstalkOptions))
57+
args = evalFormula(list(...), data)
6358

6459
dispatch(map,
6560
method,

inst/htmlwidgets/leaflet.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1391,7 +1391,7 @@ methods.addMarkers = function (lat, lng, icon, layerId, group, options, popup, p
13911391
}
13921392
};
13931393

1394-
methods.addAwesomeMarkers = function (lat, lng, icon, layerId, group, options, popup, popupOptions, clusterOptions, clusterId, label, labelOptions) {
1394+
methods.addAwesomeMarkers = function (lat, lng, icon, layerId, group, options, popup, popupOptions, clusterOptions, clusterId, label, labelOptions, crosstalkOptions) {
13951395
var icondf = void 0;
13961396
var getIcon = void 0;
13971397
if (icon) {
@@ -1413,7 +1413,7 @@ methods.addAwesomeMarkers = function (lat, lng, icon, layerId, group, options, p
14131413

14141414
if (!(_jquery2.default.isEmptyObject(lat) || _jquery2.default.isEmptyObject(lng)) || _jquery2.default.isNumeric(lat) && _jquery2.default.isNumeric(lng)) {
14151415

1416-
var df = new _dataframe2.default().col("lat", lat).col("lng", lng).col("layerId", layerId).col("group", group).col("popup", popup).col("popupOptions", popupOptions).col("label", label).col("labelOptions", labelOptions).cbind(options);
1416+
var df = new _dataframe2.default().col("lat", lat).col("lng", lng).col("layerId", layerId).col("group", group).col("popup", popup).col("popupOptions", popupOptions).col("label", label).col("labelOptions", labelOptions).cbind(options).cbind(crosstalkOptions || {});
14171417

14181418
if (icon) icondf.effectiveLength = df.nrow();
14191419

@@ -1515,9 +1515,9 @@ methods.addCircles = function (lat, lng, radius, layerId, group, options, popup,
15151515
}
15161516
};
15171517

1518-
methods.addCircleMarkers = function (lat, lng, radius, layerId, group, options, clusterOptions, clusterId, popup, popupOptions, label, labelOptions) {
1518+
methods.addCircleMarkers = function (lat, lng, radius, layerId, group, options, clusterOptions, clusterId, popup, popupOptions, label, labelOptions, crosstalkOptions) {
15191519
if (!(_jquery2.default.isEmptyObject(lat) || _jquery2.default.isEmptyObject(lng)) || _jquery2.default.isNumeric(lat) && _jquery2.default.isNumeric(lng)) {
1520-
var df = new _dataframe2.default().col("lat", lat).col("lng", lng).col("radius", radius).col("layerId", layerId).col("group", group).col("popup", popup).col("popupOptions", popupOptions).col("label", label).col("labelOptions", labelOptions).cbind(options);
1520+
var df = new _dataframe2.default().col("lat", lat).col("lng", lng).col("radius", radius).col("layerId", layerId).col("group", group).col("popup", popup).col("popupOptions", popupOptions).col("label", label).col("labelOptions", labelOptions).cbind(crosstalkOptions || {}).cbind(options);
15211521

15221522
addMarkers(this, df, group, clusterOptions, clusterId, function (df, i) {
15231523
return _leaflet2.default.circleMarker([df.get(i, "lat"), df.get(i, "lng")], df.get(i));
@@ -2203,7 +2203,7 @@ methods.removeMeasure = function () {
22032203
delete this.measureControl;
22042204
};
22052205

2206-
methods.addSelect = function (crosstalkOptions) {
2206+
methods.addSelect = function (ctGroup) {
22072207
var _this8 = this;
22082208

22092209
methods.removeSelect.call(this);
@@ -2217,9 +2217,9 @@ methods.addSelect = function (crosstalkOptions) {
22172217
btn.state("select-active");
22182218
_this8._locationFilter = new _leaflet2.default.LocationFilter2();
22192219

2220-
if (crosstalkOptions && crosstalkOptions.ctGroup) {
2220+
if (ctGroup) {
22212221
(function () {
2222-
var selectionHandle = new global.crosstalk.SelectionHandle(crosstalkOptions.ctGroup);
2222+
var selectionHandle = new global.crosstalk.SelectionHandle(ctGroup);
22232223
selectionHandle.on("change", function (e) {
22242224
if (e.sender !== selectionHandle) {
22252225
if (_this8._locationFilter) {
@@ -2258,7 +2258,7 @@ methods.addSelect = function (crosstalkOptions) {
22582258
this._selectButton.addTo(this);
22592259
};
22602260

2261-
methods.removeSelect = function (crosstalkOptions) {
2261+
methods.removeSelect = function () {
22622262
if (this._locationFilter) {
22632263
this._locationFilter.disable();
22642264
}

javascript/src/methods.js

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ methods.addMarkers = function(lat, lng, icon, layerId, group, options, popup, po
262262
};
263263

264264
methods.addAwesomeMarkers = function(lat, lng, icon, layerId, group, options, popup, popupOptions,
265-
clusterOptions, clusterId, label, labelOptions) {
265+
clusterOptions, clusterId, label, labelOptions, crosstalkOptions) {
266266
let icondf;
267267
let getIcon;
268268
if (icon) {
@@ -294,7 +294,8 @@ clusterOptions, clusterId, label, labelOptions) {
294294
.col("popupOptions", popupOptions)
295295
.col("label", label)
296296
.col("labelOptions", labelOptions)
297-
.cbind(options);
297+
.cbind(options)
298+
.cbind(crosstalkOptions || {});
298299

299300
if (icon) icondf.effectiveLength = df.nrow();
300301

@@ -401,7 +402,7 @@ methods.addCircles = function(lat, lng, radius, layerId, group, options, popup,
401402
}
402403
};
403404

404-
methods.addCircleMarkers = function(lat, lng, radius, layerId, group, options, clusterOptions, clusterId, popup, popupOptions, label, labelOptions) {
405+
methods.addCircleMarkers = function(lat, lng, radius, layerId, group, options, clusterOptions, clusterId, popup, popupOptions, label, labelOptions, crosstalkOptions) {
405406
if(!($.isEmptyObject(lat) || $.isEmptyObject(lng)) ||
406407
($.isNumeric(lat) && $.isNumeric(lng))) {
407408
let df = new DataFrame()
@@ -414,6 +415,7 @@ methods.addCircleMarkers = function(lat, lng, radius, layerId, group, options, c
414415
.col("popupOptions", popupOptions)
415416
.col("label", label)
416417
.col("labelOptions", labelOptions)
418+
.cbind(crosstalkOptions || {})
417419
.cbind(options);
418420

419421
addMarkers(this, df, group, clusterOptions, clusterId, function(df, i) {
@@ -1148,7 +1150,7 @@ methods.removeMeasure = function() {
11481150
delete this.measureControl;
11491151
};
11501152

1151-
methods.addSelect = function(crosstalkOptions) {
1153+
methods.addSelect = function(ctGroup) {
11521154
methods.removeSelect.call(this);
11531155

11541156
this._selectButton = L.easyButton({
@@ -1161,8 +1163,8 @@ methods.addSelect = function(crosstalkOptions) {
11611163
btn.state("select-active");
11621164
this._locationFilter = new L.LocationFilter2();
11631165

1164-
if (crosstalkOptions && crosstalkOptions.ctGroup) {
1165-
let selectionHandle = new global.crosstalk.SelectionHandle(crosstalkOptions.ctGroup);
1166+
if (ctGroup) {
1167+
let selectionHandle = new global.crosstalk.SelectionHandle(ctGroup);
11661168
selectionHandle.on("change", (e) => {
11671169
if (e.sender !== selectionHandle) {
11681170
if (this._locationFilter) {
@@ -1204,7 +1206,7 @@ methods.addSelect = function(crosstalkOptions) {
12041206
this._selectButton.addTo(this);
12051207
};
12061208

1207-
methods.removeSelect = function(crosstalkOptions) {
1209+
methods.removeSelect = function() {
12081210
if (this._locationFilter) {
12091211
this._locationFilter.disable();
12101212
}

tests/testit/test-remote.R

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -150,10 +150,9 @@ assert(
150150
identical(mockSession$.calls, list())
151151
)
152152
mockSession$.flush()
153-
expected <- list(
154-
list(type = "leaflet-calls", message = structure("{\"id\":\"map\",\"calls\":[{\"dependencies\":[],\"method\":\"addPolygons\",\"args\":[[[{\"lng\":[1,2,3,4,5],\"lat\":[1,2,3,4,5]}]],null,null,{\"lineCap\":null,\"lineJoin\":null,\"clickable\":true,\"pointerEvents\":null,\"className\":\"\",\"stroke\":true,\"color\":\"#03F\",\"weight\":5,\"opacity\":0.5,\"fill\":true,\"fillColor\":\"#03F\",\"fillOpacity\":0.2,\"dashArray\":null,\"smoothFactor\":1,\"noClip\":false},null,null,null,null,null]}]}", class = "json"))
155-
)
153+
expected <- list(structure(list(type = "leaflet-calls", message = structure("{\"id\":\"map\",\"calls\":[{\"dependencies\":[],\"method\":\"addPolygons\",\"args\":[[[{\"lng\":[1,2,3,4,5],\"lat\":[1,2,3,4,5]}]],null,null,{\"lineCap\":null,\"lineJoin\":null,\"clickable\":true,\"pointerEvents\":null,\"className\":\"\",\"stroke\":true,\"color\":\"#03F\",\"weight\":5,\"opacity\":0.5,\"fill\":true,\"fillColor\":\"#03F\",\"fillOpacity\":0.2,\"dashArray\":null,\"smoothFactor\":1,\"noClip\":false},null,null,null,null,null]}]}", class = "json")), .Names = c("type", "message")))
156154
# cat(deparse(mockSession$.calls), "\n")
155+
dput(mockSession$.calls)
157156
assert(identical(mockSession$.calls, expected))
158157

159158

@@ -167,7 +166,7 @@ remote2 <- leafletProxy("map", mockSession,
167166
)
168167
# Check that addMarkers() takes effect immediately, no flush required
169168
remote2 %>% addMarkers()
170-
expected2 <- list(structure(list(type = "leaflet-calls", message = structure("{\"id\":\"map\",\"calls\":[{\"dependencies\":[],\"method\":\"addMarkers\",\"args\":[[10,9,8,7,6,5,4,3,2,1],[10,9,8,7,6,5,4,3,2,1],null,null,null,{\"clickable\":true,\"draggable\":false,\"keyboard\":true,\"title\":\"\",\"alt\":\"\",\"zIndexOffset\":0,\"opacity\":1,\"riseOnHover\":false,\"riseOffset\":250},null,null,null,null,null,null]}]}", class = "json")), .Names = c("type", "message")))
169+
expected2 <- list(list(type = "leaflet-calls", message = structure("{\"id\":\"map\",\"calls\":[{\"dependencies\":[],\"method\":\"addMarkers\",\"args\":[[10,9,8,7,6,5,4,3,2,1],[10,9,8,7,6,5,4,3,2,1],null,null,null,{\"clickable\":true,\"draggable\":false,\"keyboard\":true,\"title\":\"\",\"alt\":\"\",\"zIndexOffset\":0,\"opacity\":1,\"riseOnHover\":false,\"riseOffset\":250},null,null,null,null,null,null,null]}]}", class = "json")))
171170
# cat(deparse(mockSession$.calls), "\n")
172171
assert(identical(mockSession$.calls, expected2))
173172
# Flushing should do nothing
@@ -184,6 +183,7 @@ remote3 <- leafletProxy("map", mockSession,
184183
remote3 %>% clearShapes() %>% addMarkers()
185184
assert(identical(mockSession$.calls, list()))
186185
mockSession$.flush()
187-
expected3 <- list(structure(list(type = "leaflet-calls", message = structure("{\"id\":\"map\",\"calls\":[{\"dependencies\":[],\"method\":\"clearShapes\",\"args\":[]}]}", class = "json")), .Names = c("type", "message")), structure(list(type = "leaflet-calls", message = structure("{\"id\":\"map\",\"calls\":[{\"dependencies\":[],\"method\":\"addMarkers\",\"args\":[[10,9,8,7,6,5,4,3,2,1],[10,9,8,7,6,5,4,3,2,1],null,null,null,{\"clickable\":true,\"draggable\":false,\"keyboard\":true,\"title\":\"\",\"alt\":\"\",\"zIndexOffset\":0,\"opacity\":1,\"riseOnHover\":false,\"riseOffset\":250},null,null,null,null,null,null]}]}", class = "json")), .Names = c("type", "message")))
186+
expected3 <- list(structure(list(type = "leaflet-calls", message = structure("{\"id\":\"map\",\"calls\":[{\"dependencies\":[],\"method\":\"clearShapes\",\"args\":[]}]}", class = "json")), .Names = c("type", "message")), structure(list(type = "leaflet-calls", message = structure("{\"id\":\"map\",\"calls\":[{\"dependencies\":[],\"method\":\"addMarkers\",\"args\":[[10,9,8,7,6,5,4,3,2,1],[10,9,8,7,6,5,4,3,2,1],null,null,null,{\"clickable\":true,\"draggable\":false,\"keyboard\":true,\"title\":\"\",\"alt\":\"\",\"zIndexOffset\":0,\"opacity\":1,\"riseOnHover\":false,\"riseOffset\":250},null,null,null,null,null,null,null]}]}", class = "json")), .Names = c("type", "message")))
187+
188188
# Check that multiple calls are invoked in order
189189
assert(identical(mockSession$.calls, expected3))

0 commit comments

Comments
 (0)