Skip to content

Commit aa2bf14

Browse files
committed
WIP
1 parent 0b49a5c commit aa2bf14

File tree

115 files changed

+5318
-1560
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

115 files changed

+5318
-1560
lines changed

bin/build_javascript.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ const files = [
2121
// custom handling for StimulusBundle
2222
'src/StimulusBundle/assets/src/loader.ts',
2323
'src/StimulusBundle/assets/src/controllers.ts',
24+
// custom handling for Map
25+
...glob.sync('src/Map/src/Bridge/*/assets/src/*controller.ts'),
2426
...glob.sync('src/*/assets/src/*controller.ts'),
2527
];
2628

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
{
22
"private": true,
33
"workspaces": [
4-
"src/*/assets"
4+
"src/*/assets",
5+
"src/Map/src/Bridge/*/assets"
56
],
67
"scripts": {
78
"build": "node bin/build_javascript.js && node bin/build_styles.js",

src/Map/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
vendor
22
composer.lock
33
.phpunit.result.cache
4+
assets/node_modules

src/Map/.php-version

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
8.3
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import { Controller } from '@hotwired/stimulus';
2+
export type LatLng = {
3+
lat: number;
4+
lng: number;
5+
};
6+
export type MapView<Options> = {
7+
center: LatLng;
8+
zoom: number;
9+
fitBoundsToMarkers: boolean;
10+
markers: Array<MarkerDefinition>;
11+
infoWindows: Array<InfoWindowDefinition>;
12+
options: Options;
13+
};
14+
export type MarkerDefinition = {
15+
position: LatLng;
16+
title: string | null;
17+
infoWindow?: Omit<InfoWindowDefinition, 'position'>;
18+
};
19+
export type InfoWindowDefinition = {
20+
headerContent: string | null;
21+
content: string | null;
22+
position: LatLng;
23+
opened: boolean;
24+
autoClose: boolean;
25+
};
26+
export default abstract class<ProviderOptions, MapOptions, Map, Marker, InfoWindow> extends Controller<HTMLElement> {
27+
static values: {
28+
providerOptions: ObjectConstructor;
29+
view: ObjectConstructor;
30+
};
31+
providerOptionsValue: ProviderOptions;
32+
viewValue: MapView<MapOptions>;
33+
initialize(): void;
34+
connect(): void;
35+
protected abstract getMap(): Map;
36+
protected abstract doCreateMap({ beforeCreate, afterCreate, }: {
37+
beforeCreate: ({ options }: {
38+
options: MapOptions;
39+
}) => void;
40+
afterCreate: ({ map }: {
41+
map: Map;
42+
}) => void;
43+
}): void;
44+
protected abstract getMarkers(): Array<Marker>;
45+
createMarker(definition: MarkerDefinition): void;
46+
protected abstract doCreateMarker({ definition, beforeCreate, afterCreate, }: {
47+
definition: MarkerDefinition;
48+
beforeCreate: ({ definition }: {
49+
definition: MarkerDefinition;
50+
}) => void;
51+
afterCreate: ({ marker }: {
52+
marker: Marker;
53+
}) => void;
54+
}): void;
55+
protected abstract getInfoWindows(): Array<InfoWindow>;
56+
createInfoWindow(definition: InfoWindowDefinition): void;
57+
protected abstract doCreateInfoWindow({ definition, beforeCreate, afterCreate, }: {
58+
definition: InfoWindowDefinition;
59+
beforeCreate: ({ definition }: {
60+
definition: InfoWindowDefinition;
61+
}) => void;
62+
afterCreate: ({ infoWindow }: {
63+
infoWindow: InfoWindow;
64+
}) => void;
65+
}): void;
66+
protected abstract doFitBoundsToMarkers(): void;
67+
protected abstract dispatchEvent(name: string, detail: Record<string, unknown>): void;
68+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { Controller } from '@hotwired/stimulus';
2+
3+
class default_1 extends Controller {
4+
initialize() { }
5+
connect() {
6+
this.dispatchEvent('pre-connect', {});
7+
this.doCreateMap({
8+
beforeCreate: (args) => this.dispatchEvent('map:before-create', args),
9+
afterCreate: (args) => this.dispatchEvent('map:after-create', args),
10+
});
11+
const { markers, infoWindows, fitBoundsToMarkers } = this.viewValue;
12+
markers.forEach((marker) => this.createMarker(marker));
13+
infoWindows.forEach((infoWindow) => this.createInfoWindow(infoWindow));
14+
if (fitBoundsToMarkers) {
15+
this.doFitBoundsToMarkers();
16+
}
17+
this.dispatchEvent('connected', {
18+
map: this.getMap(),
19+
markers: this.getMarkers(),
20+
infoWindows: this.getInfoWindows(),
21+
});
22+
}
23+
createMarker(definition) {
24+
this.doCreateMarker({
25+
definition,
26+
beforeCreate: (args) => this.dispatchEvent('marker:before-create', args),
27+
afterCreate: (args) => this.dispatchEvent('marker:after-create', args),
28+
});
29+
}
30+
createInfoWindow(definition) {
31+
this.doCreateInfoWindow({
32+
definition,
33+
beforeCreate: (args) => this.dispatchEvent('info-window:before-create', args),
34+
afterCreate: (args) => this.dispatchEvent('info-window:after-create', args),
35+
});
36+
}
37+
}
38+
default_1.values = {
39+
providerOptions: Object,
40+
view: Object,
41+
};
42+
43+
export { default_1 as default };

src/Map/assets/dist/google_maps_controller.d.ts

Lines changed: 0 additions & 24 deletions
This file was deleted.

src/Map/assets/dist/leaflet_controller.d.ts

Lines changed: 0 additions & 29 deletions
This file was deleted.

src/Map/assets/package.json

Lines changed: 3 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -4,47 +4,15 @@
44
"license": "MIT",
55
"version": "1.0.0",
66
"symfony": {
7-
"controllers": {
8-
"google-maps": {
9-
"main": "dist/google_maps_controller.js",
10-
"webpackMode": "lazy",
11-
"fetch": "lazy",
12-
"enabled": false
13-
},
14-
"leaflet": {
15-
"main": "dist/leaflet_controller.js",
16-
"webpackMode": "lazy",
17-
"fetch": "lazy",
18-
"enabled": false
19-
}
20-
},
217
"importmap": {
228
"@hotwired/stimulus": "^3.0.0",
23-
"@googlemaps/js-api-loader": "^1.16.6",
24-
"leaflet": "^1.9.4",
25-
"@symfony/ux-map/google-maps": "path:%PACKAGE%/dist/google_maps_controller.js",
26-
"@symfony/ux-map/leaflet": "path:%PACKAGE%/dist/leaflet_controller.js"
9+
"@symfony/ux-map/abstract-map-controller": "path:%PACKAGE%/dist/abstract_map_controller.js"
2710
}
2811
},
2912
"peerDependencies": {
30-
"@googlemaps/js-api-loader": "^1.16.6",
31-
"@hotwired/stimulus": "^3.0.0",
32-
"leaflet": "^1.9.4"
33-
},
34-
"peerDependenciesMeta": {
35-
"@googlemaps/js-api-loader": {
36-
"optional": true
37-
},
38-
"leaflet": {
39-
"optional": true
40-
}
13+
"@hotwired/stimulus": "^3.0.0"
4114
},
4215
"devDependencies": {
43-
"@googlemaps/js-api-loader": "^1.16.6",
44-
"@hotwired/stimulus": "^3.0.0",
45-
"@types/google.maps": "^3.55.9",
46-
"@types/leaflet": "^1.9.12",
47-
"happy-dom": "^14.12.3",
48-
"leaflet": "^1.9.4"
16+
"@hotwired/stimulus": "^3.0.0"
4917
}
5018
}
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
import { Controller } from '@hotwired/stimulus';
2+
3+
export type LatLng = { lat: number; lng: number };
4+
5+
export type MapView<Options> = {
6+
center: LatLng;
7+
zoom: number;
8+
fitBoundsToMarkers: boolean;
9+
markers: Array<MarkerDefinition>;
10+
infoWindows: Array<InfoWindowDefinition>;
11+
options: Options;
12+
};
13+
14+
export type MarkerDefinition = {
15+
position: LatLng;
16+
title: string | null;
17+
infoWindow?: Omit<InfoWindowDefinition, 'position'>;
18+
};
19+
20+
export type InfoWindowDefinition = {
21+
headerContent: string | null;
22+
content: string | null;
23+
position: LatLng;
24+
opened: boolean;
25+
autoClose: boolean;
26+
};
27+
28+
export default abstract class<ProviderOptions, MapOptions, Map, Marker, InfoWindow> extends Controller<HTMLElement> {
29+
static values = {
30+
providerOptions: Object,
31+
view: Object,
32+
};
33+
34+
declare providerOptionsValue: ProviderOptions;
35+
declare viewValue: MapView<MapOptions>;
36+
37+
initialize() {}
38+
39+
connect() {
40+
this.dispatchEvent('pre-connect', {});
41+
42+
this.doCreateMap({
43+
beforeCreate: (args) => this.dispatchEvent('map:before-create', args),
44+
afterCreate: (args) => this.dispatchEvent('map:after-create', args),
45+
});
46+
47+
const { markers, infoWindows, fitBoundsToMarkers } = this.viewValue;
48+
49+
markers.forEach((marker) => this.createMarker(marker));
50+
infoWindows.forEach((infoWindow) => this.createInfoWindow(infoWindow));
51+
52+
if (fitBoundsToMarkers) {
53+
this.doFitBoundsToMarkers();
54+
}
55+
56+
this.dispatchEvent('connected', {
57+
map: this.getMap(),
58+
markers: this.getMarkers(),
59+
infoWindows: this.getInfoWindows(),
60+
});
61+
}
62+
63+
protected abstract getMap(): Map;
64+
65+
protected abstract doCreateMap({
66+
beforeCreate,
67+
afterCreate,
68+
}: {
69+
beforeCreate: ({ options }: { options: MapOptions }) => void;
70+
afterCreate: ({ map }: { map: Map }) => void;
71+
}): void;
72+
73+
protected abstract getMarkers(): Array<Marker>;
74+
75+
public createMarker(definition: MarkerDefinition) {
76+
this.doCreateMarker({
77+
definition,
78+
beforeCreate: (args) => this.dispatchEvent('marker:before-create', args),
79+
afterCreate: (args) => this.dispatchEvent('marker:after-create', args),
80+
});
81+
}
82+
83+
protected abstract doCreateMarker({
84+
definition,
85+
beforeCreate,
86+
afterCreate,
87+
}: {
88+
definition: MarkerDefinition;
89+
beforeCreate: ({ definition }: { definition: MarkerDefinition }) => void;
90+
afterCreate: ({ marker }: { marker: Marker }) => void;
91+
}): void;
92+
93+
protected abstract getInfoWindows(): Array<InfoWindow>;
94+
95+
public createInfoWindow(definition: InfoWindowDefinition) {
96+
this.doCreateInfoWindow({
97+
definition,
98+
beforeCreate: (args) => this.dispatchEvent('info-window:before-create', args),
99+
afterCreate: (args) => this.dispatchEvent('info-window:after-create', args),
100+
});
101+
}
102+
103+
protected abstract doCreateInfoWindow({
104+
definition,
105+
beforeCreate,
106+
afterCreate,
107+
}: {
108+
definition: InfoWindowDefinition;
109+
beforeCreate: ({ definition }: { definition: InfoWindowDefinition }) => void;
110+
afterCreate: ({ infoWindow }: { infoWindow: InfoWindow }) => void;
111+
}): void;
112+
113+
protected abstract doFitBoundsToMarkers(): void;
114+
115+
protected abstract dispatchEvent(name: string, detail: Record<string, unknown>): void;
116+
}

src/Map/assets/src/global.d.ts

Lines changed: 0 additions & 12 deletions
This file was deleted.

src/Map/assets/src/map.d.ts

Lines changed: 0 additions & 24 deletions
This file was deleted.

0 commit comments

Comments
 (0)