From 33ee8a4751cc6d4c463ebbc5383eb4002cbc9648 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E5=A6=82=E6=80=80=E5=BF=B5?= Date: Thu, 31 Oct 2019 09:21:36 +0800 Subject: [PATCH 1/2] add 'getGroupLayersId' method && fix bugs - add 'getGroupLayersId' method - fix missing 'metadata' error --- index.js | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/index.js b/index.js index 8b2ae96..cba174a 100644 --- a/index.js +++ b/index.js @@ -51,7 +51,7 @@ function addLayerToGroup(map, groupId, layer, beforeId) { function removeGroup(map, id) { var layers = map.getStyle().layers; for (var i = 0; i < layers.length; i++) { - if (layers[i].metadata.group === id) { + if (layers[i].metadata && layers[i].metadata.group === id) { map.removeLayer(layers[i].id); } } @@ -68,7 +68,7 @@ function moveGroup(map, id, beforeId) { var layers = map.getStyle().layers; for (var i = 0; i < layers.length; i++) { - if (layers[i].metadata.group === id) { + if (layers[i].metadata && layers[i].metadata.group === id) { map.moveLayer(layers[i].id, beforeLayerId); } } @@ -96,10 +96,28 @@ function getGroupLastLayerId(map, id) { return getLayerIdFromIndex(map, getGroupLastLayerIndex(map, id)); } +/** + * Get the ids of the all layers in a group. + * + * @param {Map} map + * @param {string} id The id of the group. + * @returns {string[]} + */ +function getGroupLayersId (map, id): string[] { + var ids = []; + var layers = map.getStyle().layers; + + layers.forEach(layer => { + layer.metadata && layer.metadata.group === id && ids.push(layer.id); + }) + + return ids; +} + function getGroupFirstLayerIndex(map, id) { var layers = map.getStyle().layers; for (var i = 0; i < layers.length; i++) { - if (layers[i].metadata.group === id) return i; + if (layers[i].metadata && layers[i].metadata.group === id) return i; } return -1; } @@ -108,7 +126,7 @@ function getGroupLastLayerIndex(map, id) { var layers = map.getStyle().layers; var i = getGroupFirstLayerIndex(map, id); if (i === -1) return -1; - while (i < layers.length && (layers[i].id === id || layers[i].metadata.group === id)) i++; + while (i < layers.length && (layers[i].id === id || (layers[i].metadata && layers[i].metadata.group === id))) i++; return i - 1; } @@ -119,7 +137,7 @@ function getLayerIdFromIndex(map, index) { } function getLayerGroup(map, id) { - return map.getLayer(id).metadata.group; + return map.getLayer(id).metadata ? map.getLayer(id).metadata.group : ''; } function isLayer(map, id) { From be2a526b1fad6edc0e98616b2c78d2e154efab70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E5=A6=82=E6=80=80=E5=BF=B5?= Date: Fri, 15 Nov 2019 10:55:08 +0800 Subject: [PATCH 2/2] Fix `addLayerToGroup` method bugs `addLayerToGroup(map, groupId, layer, beforeId)` The calculated `beforeId` is incorrect when `beforeId ` is not specified --- index.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/index.js b/index.js index cba174a..7dd5ad4 100644 --- a/index.js +++ b/index.js @@ -35,7 +35,14 @@ function addLayerToGroup(map, groupId, layer, beforeId) { if (beforeId && !ignoreBeforeIdCheck && (!isLayer(map, beforeId) || getLayerGroup(map, beforeId) !== groupId)) { throw new Error('beforeId must be the id of a layer within the same group'); } else if (!beforeId && !ignoreBeforeIdCheck) { - beforeId = getLayerIdFromIndex(map, getGroupFirstLayerId(map, groupId) - 1); + + const lastLayerIndex = getGroupLastLayerIndex(map, groupId) + + if (lastLayerIndex === -1) { + throw new Error(`the "${ groupId }" layer group does not exist`) + } + + beforeId = getLayerIdFromIndex(map, lastLayerIndex + 1) } var groupedLayer = assign({}, layer, {metadata: assign({}, layer.metadata || {}, {group: groupId})});