Skip to content

Commit a2333e2

Browse files
author
Lucas Wojciechowski
committed
Add 'addLayerToGroup' method
1 parent f0ca313 commit a2333e2

2 files changed

Lines changed: 146 additions & 28 deletions

File tree

index.js

Lines changed: 47 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,39 @@ var assign = require('lodash.assign');
99
* @param {string} id The id of the new group
1010
* @param {Array<Object>} layers The Mapbox style spec layers of the new group
1111
* @param {string} [beforeId] The layer id or group id after which the group
12-
* will be inserted after. If ommitted the group is added to the bottom of
13-
* the style.
12+
* will be inserted. If ommitted the group is added to the bottom of the
13+
* style.
1414
*/
1515
function addGroup(map, id, layers, beforeId) {
1616
var beforeLayerId = normalizeBeforeId(map, beforeId);
17-
1817
for (var i = 0; i < layers.length; i++) {
19-
var layer = layers[i];
20-
var groupedMetadata = assign({}, layers[i].metadata || {}, {group: id});
21-
var groupedLayer = assign({}, layer, {metadata: groupedMetadata});
22-
map.addLayer(groupedLayer, beforeLayerId);
18+
addLayerToGroup(map, id, layers[i], beforeLayerId, true);
2319
}
2420
}
2521

22+
/**
23+
* Add a single layer to an existing layer group.
24+
*
25+
* @param {Map} map
26+
* @param {string} groupId The id of group
27+
* @param {Object} layer The Mapbox style spec layer
28+
* @param {string} [beforeId] An existing layer id after which the new layer
29+
* will be inserted. If ommitted the layer is added to the bottom of
30+
* the group.
31+
*/
32+
function addLayerToGroup(map, groupId, layer, beforeId) {
33+
var ignoreBeforeIdCheck = arguments[4];
34+
35+
if (beforeId && !ignoreBeforeIdCheck && (!isLayer(map, beforeId) || getLayerGroup(map, beforeId) !== groupId)) {
36+
throw new Error('beforeId must be the id of a layer within the same group');
37+
} else if (!beforeId && !ignoreBeforeIdCheck) {
38+
beforeId = getLayerIdFromIndex(map, getGroupFirstLayerId(map, groupId) - 1);
39+
}
40+
41+
var groupedLayer = assign({}, layer, {metadata: assign({}, layer.metadata || {}, {group: groupId})});
42+
map.addLayer(groupedLayer, beforeId);
43+
}
44+
2645
/**
2746
* Remove a layer group and all of its layers from the map.
2847
*
@@ -55,25 +74,15 @@ function moveGroup(map, id, beforeId) {
5574
}
5675
}
5776

58-
function normalizeBeforeId(map, beforeId) {
59-
if (beforeId && !isLayer(map, beforeId)) {
60-
return getGroupFirstLayer(map, beforeId);
61-
} else if (beforeId && getLayerGroup(map, beforeId)) {
62-
return getGroupFirstLayer(map, getLayerGroup(map, beforeId));
63-
} else {
64-
return beforeId;
65-
}
66-
}
67-
6877
/**
6978
* Get the id of the first layer in a group.
7079
*
7180
* @param {Map} map
7281
* @param {string} id The id of the group.
7382
* @returns {string}
7483
*/
75-
function getGroupFirstLayer(map, id) {
76-
return getLayerFromIndex(map, getGroupFirstIndex(map, id));
84+
function getGroupFirstLayerId(map, id) {
85+
return getLayerIdFromIndex(map, getGroupFirstLayerIndex(map, id));
7786
}
7887

7988
/**
@@ -83,27 +92,27 @@ function getGroupFirstLayer(map, id) {
8392
* @param {string} id The id of the group.
8493
* @returns {string}
8594
*/
86-
function getGroupLastLayer(map, id) {
87-
return getLayerFromIndex(map, getGroupLastIndex(map, id));
95+
function getGroupLastLayerId(map, id) {
96+
return getLayerIdFromIndex(map, getGroupLastLayerIndex(map, id));
8897
}
8998

90-
function getGroupFirstIndex(map, id) {
99+
function getGroupFirstLayerIndex(map, id) {
91100
var layers = map.getStyle().layers;
92101
for (var i = 0; i < layers.length; i++) {
93102
if (layers[i].metadata.group === id) return i;
94103
}
95104
return -1;
96105
}
97106

98-
function getGroupLastIndex(map, id) {
107+
function getGroupLastLayerIndex(map, id) {
99108
var layers = map.getStyle().layers;
100-
var i = getGroupFirstIndex(map, id);
109+
var i = getGroupFirstLayerIndex(map, id);
101110
if (i === -1) return -1;
102111
while (i < layers.length && (layers[i].id === id || layers[i].metadata.group === id)) i++;
103112
return i - 1;
104113
}
105114

106-
function getLayerFromIndex(map, index) {
115+
function getLayerIdFromIndex(map, index) {
107116
if (index === -1) return undefined;
108117
var layers = map.getStyle().layers;
109118
return layers[index] && layers[index].id;
@@ -117,10 +126,21 @@ function isLayer(map, id) {
117126
return !!map.getLayer(id);
118127
}
119128

129+
function normalizeBeforeId(map, beforeId) {
130+
if (beforeId && !isLayer(map, beforeId)) {
131+
return getGroupFirstLayerId(map, beforeId);
132+
} else if (beforeId && getLayerGroup(map, beforeId)) {
133+
return getGroupFirstLayerId(map, getLayerGroup(map, beforeId));
134+
} else {
135+
return beforeId;
136+
}
137+
}
138+
120139
module.exports = {
121140
addGroup,
122141
removeGroup,
123142
moveGroup,
124-
getGroupFirstLayer,
125-
getGroupLastLayer
143+
addLayerToGroup,
144+
getGroupFirstLayer: getGroupFirstLayerId,
145+
getGroupLastLayer: getGroupLastLayerId
126146
};

test.js

Lines changed: 99 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ t.test('addGroup', function(t) {
7474
});
7575
});
7676

77-
t.test('at the bottom of a style (without a "before")', function(t) {
77+
t.test('at the bottom of a style (without a "beforeId")', function(t) {
7878
createMap(
7979
[l('layer1')],
8080
function(err, map) {
@@ -153,6 +153,104 @@ t.test('addGroup', function(t) {
153153
t.end();
154154
});
155155

156+
t.test('addLayerToGroup', function(t) {
157+
158+
t.test('at the bottom of a group (without a "beforeId")', function(t) {
159+
createMap(
160+
[l('layer1', 'group1')],
161+
function(err, map) {
162+
t.error(err);
163+
164+
groups.addLayerToGroup(map, 'group1', l('layer2'));
165+
166+
t.deepEqual(map.getStyle().layers, [
167+
l('layer1', 'group1'),
168+
l('layer2', 'group1')
169+
]);
170+
171+
t.end();
172+
}
173+
);
174+
});
175+
176+
t.test('before a layer within the same group', function(t) {
177+
createMap(
178+
[l('layer1', 'group1')],
179+
function(err, map) {
180+
t.error(err);
181+
182+
groups.addLayerToGroup(map, 'group1', l('layer2'), 'layer1');
183+
184+
t.deepEqual(map.getStyle().layers, [
185+
l('layer2', 'group1'),
186+
l('layer1', 'group1')
187+
]);
188+
189+
t.end();
190+
}
191+
);
192+
});
193+
194+
t.test('to a non-existant group', function(t) {
195+
createMap([l('layer1', 'group1')], function(err, map) {
196+
t.error(err);
197+
198+
groups.addLayerToGroup(map, 'group2', l('layer2'));
199+
200+
t.deepEqual(map.getStyle().layers, [
201+
l('layer1', 'group1'),
202+
l('layer2', 'group2')
203+
]);
204+
205+
t.end();
206+
});
207+
});
208+
209+
t.test('before a layer within a different group', function(t) {
210+
createMap(
211+
[l('layer1', 'group1'), l('layer2', 'group2')],
212+
function(err, map) {
213+
t.error(err);
214+
215+
t.throws(function() {
216+
groups.addLayerToGroup(map, 'group1', l('layer3'), 'layer2');
217+
});
218+
219+
t.end();
220+
}
221+
);
222+
});
223+
224+
t.test('before a group', function(t) {
225+
createMap(
226+
[l('layer1', 'group1')],
227+
function(err, map) {
228+
t.error(err);
229+
230+
t.throws(function() {
231+
groups.addLayerToGroup(map, 'group1', l('layer3'), 'group1');
232+
});
233+
234+
t.end();
235+
}
236+
);
237+
});
238+
239+
t.test('before a non-existant group', function(t) {
240+
createMap([], function(err, map) {
241+
t.error(err);
242+
243+
t.throws(function() {
244+
groups.addLayerToGroup(map, 'group1', l('layer1'), 'group1');
245+
});
246+
247+
t.end();
248+
});
249+
});
250+
251+
t.end();
252+
});
253+
156254
t.test('removeGroup', function(t) {
157255

158256
t.test('a non-existent id', function(t) {

0 commit comments

Comments
 (0)