@@ -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 */
1515function 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+
120139module . exports = {
121140 addGroup,
122141 removeGroup,
123142 moveGroup,
124- getGroupFirstLayer,
125- getGroupLastLayer
143+ addLayerToGroup,
144+ getGroupFirstLayer : getGroupFirstLayerId ,
145+ getGroupLastLayer : getGroupLastLayerId
126146} ;
0 commit comments