Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Issue 19/listeners #20

Merged
merged 3 commits into from
Jul 11, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
added layerRemove event listener capability to map
  • Loading branch information
andrewgryan committed Jul 10, 2024
commit 8c85312f11eb1b059589c0b4d6dce6d060068bee
7 changes: 7 additions & 0 deletions src/l-map.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,13 @@ class LMap extends HTMLElement {
mutation.removedNodes.forEach((node) => {
if (node instanceof LLayer) {
if (el.map !== null && node.layer !== null) {
// Notify listeners of layer removal
el.dispatchEvent(new CustomEvent(layerRemove, {
bubbles: true,
detail: {
layer: node.layer
}
}))
el.map.removeLayer(node.layer);
}
}
Expand Down
55 changes: 51 additions & 4 deletions src/l-map.test.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
// @vitest-environment happy-dom
import "./index.js";
import { mapAddTo } from "./events"
import { layerRemove, mapAddTo } from "./events"
import { it, expect } from "vitest";
import LTileLayer from "./l-tile-layer";
import LMap from "./l-map.js";

it("should emit events", async () => {
it("should emit map:addTo event(s)", async () => {
// Arrange: create a <l-map><l-tile-layer>... arrangement
const el = document.createElement("l-map");
el.setAttribute("zoom", "0");
Expand All @@ -15,7 +16,7 @@ it("should emit events", async () => {
el.appendChild(tileLayer)
const promise = new Promise((resolve) => {
el.addEventListener(mapAddTo, (ev) => {
resolve(ev);
resolve(ev.detail);
})
})

Expand All @@ -25,5 +26,51 @@ it("should emit events", async () => {
// Assert: event triggered with layer detail
const actual = await promise;
const expected = { layer: tileLayer.layer, name: null };
expect(actual.detail).toEqual(expected);
expect(actual).toEqual(expected);
});

it("should emit ready event", async () => {
// Arrange: create a <l-map><l-tile-layer>... arrangement
const el = /** @type {LMap} */ (document.createElement("l-map"));
el.setAttribute("zoom", "0");
el.setAttribute("center", JSON.stringify([0, 0]));

const promise = new Promise((resolve) => {
el.addEventListener("ready", (ev) => {
resolve(ev.detail);
})
})

// Act: connect to DOM
document.body.appendChild(el);

// Assert: event triggered with layer detail
const actual = await promise;
const expected = el.map;
expect(actual).toEqual(expected);
});

it("should bubble layer remove events", async () => {
// Arrange: create a <l-map><l-tile-layer>... arrangement
const el = document.createElement("l-map");
el.setAttribute("zoom", "0");
el.setAttribute("center", JSON.stringify([0, 0]));

const tileLayer = /** @type {LTileLayer} */ (document.createElement("l-tile-layer"))
tileLayer.setAttribute("url-template", "fake-url")
el.appendChild(tileLayer)
const promise = new Promise((resolve) => {
el.addEventListener(layerRemove, (ev) => {
resolve(ev.detail);
})
})

// Act: connect to DOM and remove tile-layer
document.body.appendChild(el);
el.removeChild(tileLayer);

// Assert: event triggered with layer detail
const actual = await promise;
const expected = { layer: tileLayer.layer };
expect(actual).toEqual(expected);
})