forked from cardstack/boxel
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathleaflet-map.gts
111 lines (93 loc) · 2.39 KB
/
leaflet-map.gts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import { CardDef } from 'https://cardstack.com/base/card-api';
import NumberField from 'https://cardstack.com/base/number';
import StringField from 'https://cardstack.com/base/string';
import {
Component,
contains,
field,
} from 'https://cardstack.com/base/card-api';
import Modifier, { NamedArgs } from 'ember-modifier';
import { action } from '@ember/object';
declare global {
let L: any;
}
export class LeafletMap extends CardDef {
static displayName = 'Leaflet Map';
@field lat = contains(NumberField);
@field lon = contains(NumberField);
@field tileserverUrl = contains(StringField);
map: any;
@action
setMap(map: any) {
this.map = map;
}
static isolated = class Isolated extends Component<typeof this> {
<template>
<figure
{{LeafletModifier
lat=@model.lat
lon=@model.lon
tileserverUrl=@model.tileserverUrl
setMap=@model.setMap
}}
class='map'
>
Map loading for
{{@model.lat}},
{{@model.lon}}
</figure>
<style>
figure.map {
margin: 0;
width: 100%;
height: 100%;
}
</style>
<link
href='https://cdn.jsdelivr.net/npm/leaflet@1.9.4/dist/leaflet.min.css'
rel='stylesheet'
/>
</template>
};
/*
static embedded = class Embedded extends Component<typeof this> {
<template></template>
}
static atom = class Atom extends Component<typeof this> {
<template></template>
}
static edit = class Edit extends Component<typeof this> {
<template></template>
}
*/
}
interface LeafletModifierSignature {
Args: {
Positional: [];
Named: {
lat: number | undefined;
lon: number | undefined;
tileserverUrl?: string;
setMap?: (map: any) => void;
};
};
}
export class LeafletModifier extends Modifier<LeafletModifierSignature> {
element: HTMLElement | null = null;
modify(
element: HTMLElement,
[],
{ lat, lon, tileserverUrl, setMap }: NamedArgs<LeafletModifierSignature>,
) {
fetch('https://cdn.jsdelivr.net/npm/leaflet@1.9.4/dist/leaflet.min.js')
.then((r) => r.text())
.then((t) => {
eval(t);
let map = L.map(element).setView([lat, lon], 13);
L.tileLayer(
tileserverUrl || 'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
).addTo(map);
setMap?.(map);
});
}
}