@mapcomponents/react-maplibre 0.1.61 → 0.1.62

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/coverage/clover.xml +36 -48
  3. package/coverage/coverage-final.json +3 -3
  4. package/coverage/lcov-report/index.html +23 -23
  5. package/coverage/lcov-report/src/components/MapLibreMap/MapLibreMap.tsx.html +1 -1
  6. package/coverage/lcov-report/src/components/MapLibreMap/index.html +1 -1
  7. package/coverage/lcov-report/src/components/MlCenterPosition/MlCenterPosition.tsx.html +1 -1
  8. package/coverage/lcov-report/src/components/MlCenterPosition/index.html +1 -1
  9. package/coverage/lcov-report/src/components/MlCreatePdfButton/MlCreatePdfButton.tsx.html +1 -1
  10. package/coverage/lcov-report/src/components/MlCreatePdfButton/index.html +1 -1
  11. package/coverage/lcov-report/src/components/MlCreatePdfForm/MlCreatePdfForm.tsx.html +2 -8
  12. package/coverage/lcov-report/src/components/MlCreatePdfForm/index.html +1 -1
  13. package/coverage/lcov-report/src/components/MlFeatureEditor/MlFeatureEditor.tsx.html +1 -1
  14. package/coverage/lcov-report/src/components/MlFeatureEditor/index.html +1 -1
  15. package/coverage/lcov-report/src/components/MlFillExtrusionLayer/MlFillExtrusionLayer.tsx.html +1 -1
  16. package/coverage/lcov-report/src/components/MlFillExtrusionLayer/index.html +1 -1
  17. package/coverage/lcov-report/src/components/MlFollowGps/MlFollowGps.tsx.html +1 -1
  18. package/coverage/lcov-report/src/components/MlFollowGps/index.html +1 -1
  19. package/coverage/lcov-report/src/components/MlGPXViewer/MlGPXViewer.tsx.html +1 -1
  20. package/coverage/lcov-report/src/components/MlGPXViewer/gpxConverter.js.html +1 -1
  21. package/coverage/lcov-report/src/components/MlGPXViewer/index.html +1 -1
  22. package/coverage/lcov-report/src/components/MlGeoJsonLayer/MlGeoJsonLayer.tsx.html +1 -1
  23. package/coverage/lcov-report/src/components/MlGeoJsonLayer/index.html +1 -1
  24. package/coverage/lcov-report/src/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.tsx.html +1 -1
  25. package/coverage/lcov-report/src/components/MlGeojsonLayerWithSource/index.html +1 -1
  26. package/coverage/lcov-report/src/components/MlImageMarkerLayer/MlImageMarkerLayer.tsx.html +1 -1
  27. package/coverage/lcov-report/src/components/MlImageMarkerLayer/index.html +1 -1
  28. package/coverage/lcov-report/src/components/MlLayer/MlLayer.tsx.html +1 -1
  29. package/coverage/lcov-report/src/components/MlLayer/index.html +1 -1
  30. package/coverage/lcov-report/src/components/MlLayerMagnify/MlLayerMagnify.tsx.html +1 -1
  31. package/coverage/lcov-report/src/components/MlLayerMagnify/index.html +1 -1
  32. package/coverage/lcov-report/src/components/MlLayerSwipe/MlLayerSwipe.tsx.html +1 -1
  33. package/coverage/lcov-report/src/components/MlLayerSwipe/index.html +1 -1
  34. package/coverage/lcov-report/src/components/MlLayerSwitcher/MlLayerSwitcher.js.html +1 -1
  35. package/coverage/lcov-report/src/components/MlLayerSwitcher/components/LayerBox.js.html +1 -1
  36. package/coverage/lcov-report/src/components/MlLayerSwitcher/components/index.html +1 -1
  37. package/coverage/lcov-report/src/components/MlLayerSwitcher/index.html +1 -1
  38. package/coverage/lcov-report/src/components/MlMarker/MlMarker.tsx.html +1 -1
  39. package/coverage/lcov-report/src/components/MlMarker/index.html +1 -1
  40. package/coverage/lcov-report/src/components/MlMeasureTool/MlMeasureTool.tsx.html +1 -1
  41. package/coverage/lcov-report/src/components/MlMeasureTool/index.html +1 -1
  42. package/coverage/lcov-report/src/components/MlNavigationCompass/MlNavigationCompass.tsx.html +1 -1
  43. package/coverage/lcov-report/src/components/MlNavigationCompass/index.html +1 -1
  44. package/coverage/lcov-report/src/components/MlNavigationTools/MlNavigationTools.tsx.html +1 -1
  45. package/coverage/lcov-report/src/components/MlNavigationTools/index.html +1 -1
  46. package/coverage/lcov-report/src/components/MlOsmLayer/MlOsmLayer.js.html +1 -1
  47. package/coverage/lcov-report/src/components/MlOsmLayer/MlOsmLayer.stories_.js.html +1 -1
  48. package/coverage/lcov-report/src/components/MlOsmLayer/index.html +1 -1
  49. package/coverage/lcov-report/src/components/MlScaleReference/MlScaleReference.js.html +1 -1
  50. package/coverage/lcov-report/src/components/MlScaleReference/index.html +1 -1
  51. package/coverage/lcov-report/src/components/MlShareMapState/MlShareMapState.js.html +1 -1
  52. package/coverage/lcov-report/src/components/MlShareMapState/index.html +1 -1
  53. package/coverage/lcov-report/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.js.html +1 -1
  54. package/coverage/lcov-report/src/components/MlSpatialElevationProfile/index.html +1 -1
  55. package/coverage/lcov-report/src/components/MlThreeJsLayer/MlThreeJsLayer.js.html +1 -1
  56. package/coverage/lcov-report/src/components/MlThreeJsLayer/index.html +1 -1
  57. package/coverage/lcov-report/src/components/MlTransitionGeoJsonLayer/MlTransitionGeoJsonLayer.tsx.html +1 -1
  58. package/coverage/lcov-report/src/components/MlTransitionGeoJsonLayer/index.html +1 -1
  59. package/coverage/lcov-report/src/components/MlUseMapDebugger/MlUseMapDebugger.js.html +1 -1
  60. package/coverage/lcov-report/src/components/MlUseMapDebugger/index.html +1 -1
  61. package/coverage/lcov-report/src/components/MlVectorTileLayer/MlVectorTileLayer.tsx.html +1 -1
  62. package/coverage/lcov-report/src/components/MlVectorTileLayer/index.html +1 -1
  63. package/coverage/lcov-report/src/components/MlWmsFeatureInfoPopup/MlWmsFeatureInfoPopup.js.html +1 -1
  64. package/coverage/lcov-report/src/components/MlWmsFeatureInfoPopup/index.html +1 -1
  65. package/coverage/lcov-report/src/components/MlWmsLayer/MlWmsLayer.tsx.html +1 -1
  66. package/coverage/lcov-report/src/components/MlWmsLayer/index.html +1 -1
  67. package/coverage/lcov-report/src/components/MlWmsLoader/MlWmsLoader.tsx.html +1 -1
  68. package/coverage/lcov-report/src/components/MlWmsLoader/index.html +1 -1
  69. package/coverage/lcov-report/src/contexts/MapContext.tsx.html +1 -1
  70. package/coverage/lcov-report/src/contexts/SimpleDataContext.js.html +1 -1
  71. package/coverage/lcov-report/src/contexts/SimpleDataProvider.js.html +1 -1
  72. package/coverage/lcov-report/src/contexts/index.html +1 -1
  73. package/coverage/lcov-report/src/hooks/index.html +11 -11
  74. package/coverage/lcov-report/src/hooks/useCameraFollowPath/index.html +1 -1
  75. package/coverage/lcov-report/src/hooks/useCameraFollowPath/useCameraFollowPath.tsx.html +1 -1
  76. package/coverage/lcov-report/src/hooks/useExportMap/index.html +14 -14
  77. package/coverage/lcov-report/src/hooks/useExportMap/index.ts.html +1 -1
  78. package/coverage/lcov-report/src/hooks/useExportMap/lib.ts.html +21 -108
  79. package/coverage/lcov-report/src/hooks/useLayer.ts.html +1 -1
  80. package/coverage/lcov-report/src/hooks/useLayerEvent.js.html +9 -9
  81. package/coverage/lcov-report/src/hooks/useMap.ts.html +1 -1
  82. package/coverage/lcov-report/src/hooks/useMapState.ts.html +1 -1
  83. package/coverage/lcov-report/src/hooks/useSource.ts.html +1 -1
  84. package/coverage/lcov-report/src/hooks/useWms.js.html +1 -1
  85. package/coverage/lcov-report/src/index.html +1 -1
  86. package/coverage/lcov-report/src/index.ts.html +5 -2
  87. package/coverage/lcov.info +50 -72
  88. package/dist/components/MlCreatePdfForm/MlCreatePdfForm.stories.d.ts +1 -0
  89. package/dist/components/MlCreatePdfForm/lib/PdfContext.d.ts +3 -16
  90. package/dist/components/MlCreatePdfForm/lib/PdfPreview.d.ts +19 -6
  91. package/dist/components/MlCreatePdfForm/lib/_PdfPreview.d.ts +13 -0
  92. package/dist/index.d.ts +1 -0
  93. package/dist/index.esm.js +505 -597
  94. package/dist/index.esm.js.map +1 -1
  95. package/package.json +2 -1
  96. package/src/components/MlCreatePdfForm/MlCreatePdfForm.stories.tsx +16 -1
  97. package/src/components/MlCreatePdfForm/MlCreatePdfForm.tsx +0 -2
  98. package/src/components/MlCreatePdfForm/lib/PdfContext.tsx +16 -18
  99. package/src/components/MlCreatePdfForm/lib/PdfForm.tsx +78 -5
  100. package/src/components/MlCreatePdfForm/lib/PdfPreview.tsx +285 -357
  101. package/src/components/MlCreatePdfForm/lib/_PdfPreview.tsx +399 -0
  102. package/src/components/MlCreatePdfForm/lib/pdfContext.d.ts +24 -0
  103. package/src/components/MlCreatePdfForm/lib/preview.css +114 -0
  104. package/src/hooks/useExportMap/lib.ts +14 -43
  105. package/src/index.ts +1 -0
@@ -0,0 +1,399 @@
1
+ import React, { useContext, useRef, useState, useEffect } from 'react';
2
+ import MlGeoJsonLayer from '../../MlGeoJsonLayer/MlGeoJsonLayer';
3
+ import * as turf from '@turf/turf';
4
+ import useMap from '../../../hooks/useMap';
5
+ import useLayerEvent from '../../../hooks/useLayerEvent';
6
+ import { BBox, Feature, Polygon } from '@turf/turf';
7
+ import PdfContext from './PdfContext';
8
+ import { MapMouseEvent, MapTouchEvent, MapLayerMouseEvent, LngLat } from 'maplibre-gl';
9
+
10
+ const createPreviewGeojson = (
11
+ geojsonProps: { center: LngLat; distance: number; bearing: number },
12
+ orientation: string
13
+ ) => {
14
+ const topLeftAngle = orientation === 'portrait' ? -35.3 : -54.7;
15
+ const bottomRightAngle = orientation === 'portrait' ? 144.7 : 125.3;
16
+ const topLeft = turf.destination(
17
+ [geojsonProps.center.lng, geojsonProps.center.lat],
18
+ geojsonProps.distance,
19
+ topLeftAngle
20
+ );
21
+ const bottomRight = turf.destination(
22
+ [geojsonProps.center.lng, geojsonProps.center.lat],
23
+ geojsonProps.distance,
24
+ bottomRightAngle
25
+ );
26
+ const bbox = [
27
+ topLeft.geometry.coordinates[0],
28
+ topLeft.geometry.coordinates[1],
29
+ bottomRight.geometry.coordinates[0],
30
+ bottomRight.geometry.coordinates[1],
31
+ ];
32
+
33
+ let _previewGeojson = turf.bboxPolygon(bbox as BBox);
34
+ _previewGeojson = turf.transformRotate(_previewGeojson, geojsonProps.bearing);
35
+ if (!_previewGeojson?.properties) {
36
+ _previewGeojson.properties = {};
37
+ }
38
+ _previewGeojson.properties.bearing = geojsonProps.bearing;
39
+ return _previewGeojson;
40
+ };
41
+
42
+ interface PdfPreviewProps {
43
+ /**
44
+ * Id of the target MapLibre instance in mapContext
45
+ */
46
+ mapId?: string;
47
+ /**
48
+ * Id of an existing layer in the mapLibre instance to help specify the layer order
49
+ * This layer will be visually beneath the layer with the "insertBeforeLayer" id.
50
+ */
51
+ insertBeforeLayer?: string;
52
+ }
53
+
54
+ interface geojsonProps {
55
+ center: { lng: number; lat: number };
56
+ distance: number;
57
+ bearing: number;
58
+ geojson: Feature<Polygon> | undefined;
59
+ }
60
+
61
+ export default function PdfPreview(props: PdfPreviewProps) {
62
+ const pdfContext = useContext(PdfContext);
63
+ const initializedRef = useRef(false);
64
+ const activeFeature = useRef();
65
+
66
+ const dragging = useRef(false);
67
+
68
+ const draggingResizeHandle = useRef(false);
69
+
70
+ const draggingRotationHandle = useRef(false);
71
+
72
+ const [geojsonProps, setGeojsonProps] = useState<geojsonProps>({
73
+ center: { lng: 0, lat: 0 },
74
+ distance: 10,
75
+ bearing: 0,
76
+ geojson: undefined,
77
+ });
78
+
79
+ const mapHook = useMap({
80
+ mapId: props.mapId,
81
+ waitForLayer: props.insertBeforeLayer,
82
+ });
83
+
84
+ useEffect(() => {
85
+ if (
86
+ !mapHook.map ||
87
+ !pdfContext.geojsonRef ||
88
+ !pdfContext.orientation ||
89
+ !pdfContext.template ||
90
+ initializedRef.current
91
+ )
92
+ return;
93
+
94
+ initializedRef.current = true;
95
+
96
+ const center = mapHook.map.map.getCenter();
97
+ const canvasHeight = mapHook.map.map._canvas.height;
98
+ const canvasWidth = mapHook.map.map._canvas.width;
99
+ const bboxPixelHeight = Math.ceil(canvasHeight / 2);
100
+ const bboxPixelWidth = Math.ceil(
101
+ (pdfContext.template.width / pdfContext.template.height) * bboxPixelHeight
102
+ );
103
+
104
+ const topLeft = mapHook.map.map.unproject([
105
+ Math.floor(canvasWidth / 2 - bboxPixelWidth / 2),
106
+ Math.floor(canvasHeight / 2 - bboxPixelHeight / 2),
107
+ ]);
108
+
109
+ const distance = turf.distance([center.lng, center.lat], [topLeft.lng, topLeft.lat]);
110
+
111
+ const tmpGeojsonProps = {
112
+ center,
113
+ distance,
114
+ bearing: 0,
115
+ geojson: createPreviewGeojson({ center, distance, bearing: 0 }, pdfContext.orientation),
116
+ };
117
+ setGeojsonProps(tmpGeojsonProps);
118
+ pdfContext.geojsonRef.current = tmpGeojsonProps.geojson;
119
+ }, [mapHook.map]);
120
+
121
+ useEffect(() => {
122
+ if (!pdfContext.orientation || !pdfContext.geojsonRef) return;
123
+
124
+ const tmpGeojsonProps = JSON.parse(JSON.stringify(geojsonProps));
125
+ tmpGeojsonProps.geojson = createPreviewGeojson(tmpGeojsonProps, pdfContext.orientation);
126
+ setGeojsonProps(tmpGeojsonProps);
127
+ pdfContext.geojsonRef.current = tmpGeojsonProps.geojson;
128
+ }, [pdfContext.orientation]);
129
+
130
+ // Resize handle events
131
+ useLayerEvent({
132
+ event: 'mouseenter',
133
+ layerId: 'pdfPreviewGeojsonResizeHandle',
134
+ eventHandler: function () {
135
+ if (!mapHook.map) return;
136
+
137
+ mapHook.map.map._canvas.style.cursor = 'nwse-resize';
138
+ mapHook.map.map.dragPan.disable();
139
+ },
140
+ });
141
+ useLayerEvent({
142
+ event: 'mouseleave',
143
+ layerId: 'pdfPreviewGeojsonResizeHandle',
144
+ eventHandler: function () {
145
+ if (!mapHook.map) return;
146
+
147
+ mapHook.map.map._canvas.style.cursor = '';
148
+ mapHook.map.map.dragPan.enable();
149
+ },
150
+ });
151
+ useLayerEvent({
152
+ event: 'mousedown',
153
+ layerId: 'pdfPreviewGeojsonResizeHandle',
154
+ addTouchEvents: true,
155
+ eventHandler: function (e: MapMouseEvent | MapTouchEvent) {
156
+ e.preventDefault();
157
+ if (!mapHook.map) return;
158
+
159
+ dragging.current = false;
160
+ draggingRotationHandle.current = false;
161
+ draggingResizeHandle.current = true;
162
+ mapHook.map.map._canvas.style.cursor = 'move';
163
+
164
+ function onMove(e: MapMouseEvent | MapTouchEvent) {
165
+ if (!pdfContext.geojsonRef || !draggingResizeHandle.current || !pdfContext.orientation)
166
+ return;
167
+
168
+ const tmpGeojsonProps = JSON.parse(JSON.stringify(geojsonProps));
169
+ let _distance = turf.distance(
170
+ [tmpGeojsonProps.center.lng, tmpGeojsonProps.center.lat],
171
+ [e.lngLat.lng, e.lngLat.lat]
172
+ );
173
+ // limit max diagonal distance of PDF area to 120km as larger area lead to distortions for northern and southern areas
174
+ if (_distance > 60) {
175
+ _distance = 60;
176
+ }
177
+ tmpGeojsonProps.distance = _distance;
178
+ tmpGeojsonProps.geojson = createPreviewGeojson(tmpGeojsonProps, pdfContext.orientation);
179
+ pdfContext.geojsonRef.current = tmpGeojsonProps.geojson;
180
+ setGeojsonProps(tmpGeojsonProps);
181
+ }
182
+ function onUp() {
183
+ if (!draggingResizeHandle.current || !mapHook.map) return;
184
+
185
+ mapHook.map.map._canvas.style.cursor = '';
186
+ draggingResizeHandle.current = false;
187
+
188
+ mapHook.map.map.dragPan.enable();
189
+ // Unbind mouse events
190
+ mapHook.map.map.off('mousemove', onMove);
191
+ mapHook.map.map.off('touchmove', onMove);
192
+ }
193
+
194
+ // Mouse events
195
+ mapHook.map.map.on('mousemove', onMove);
196
+ mapHook.map.map.on('touchmove', onMove);
197
+ mapHook.map.map.once('mouseup', onUp);
198
+ mapHook.map.map.once('touchend', onUp);
199
+ },
200
+ });
201
+
202
+ // Rotation handle events
203
+ useLayerEvent({
204
+ event: 'mouseenter',
205
+ layerId: 'pdfPreviewGeojsonRotationHandle',
206
+ eventHandler: function () {
207
+ if (!mapHook.map) return;
208
+
209
+ mapHook.map.map._canvas.style.cursor = 'nwse-resize';
210
+ mapHook.map.map.dragPan.disable();
211
+ },
212
+ });
213
+ useLayerEvent({
214
+ event: 'mouseleave',
215
+ layerId: 'pdfPreviewGeojsonRotationHandle',
216
+ eventHandler: function () {
217
+ if (!mapHook.map) return;
218
+
219
+ mapHook.map.map._canvas.style.cursor = '';
220
+ mapHook.map.map.dragPan.enable();
221
+ },
222
+ });
223
+ useLayerEvent({
224
+ event: 'mousedown',
225
+ layerId: 'pdfPreviewGeojsonRotationHandle',
226
+ addTouchEvents: true,
227
+ eventHandler: function (e: MapMouseEvent | MapTouchEvent) {
228
+ e.preventDefault();
229
+ if (!mapHook.map || !pdfContext.orientation) return;
230
+
231
+ dragging.current = false;
232
+ draggingResizeHandle.current = false;
233
+ draggingRotationHandle.current = true;
234
+ mapHook.map.map._canvas.style.cursor = 'move';
235
+
236
+ function onMove(e: MapMouseEvent | MapTouchEvent) {
237
+ e.preventDefault();
238
+ if (!draggingRotationHandle.current || !pdfContext.orientation || !pdfContext.geojsonRef)
239
+ return;
240
+
241
+ const tmpGeojsonProps = JSON.parse(JSON.stringify(geojsonProps));
242
+ const _bearing = turf.bearing(
243
+ [tmpGeojsonProps.center.lng, tmpGeojsonProps.center.lat],
244
+ [e.lngLat.lng, e.lngLat.lat]
245
+ );
246
+ tmpGeojsonProps.bearing = 144.7 + _bearing;
247
+ tmpGeojsonProps.geojson = createPreviewGeojson(tmpGeojsonProps, pdfContext.orientation);
248
+ pdfContext.geojsonRef.current = tmpGeojsonProps.geojson;
249
+ setGeojsonProps(tmpGeojsonProps);
250
+ }
251
+ function onUp() {
252
+ if (!draggingRotationHandle.current || !mapHook.map) return;
253
+
254
+ mapHook.map.map._canvas.style.cursor = '';
255
+ draggingRotationHandle.current = false;
256
+
257
+ mapHook.map.map.dragPan.enable();
258
+ // Unbind mouse events
259
+ mapHook.map.map.off('mousemove', onMove);
260
+ mapHook.map.map.off('touchmove', onMove);
261
+ }
262
+
263
+ // Mouse events
264
+ mapHook.map.map.on('mousemove', onMove);
265
+ mapHook.map.map.on('touchmove', onMove);
266
+ mapHook.map.map.once('mouseup', onUp);
267
+ mapHook.map.map.once('touchend', onUp);
268
+ },
269
+ });
270
+
271
+ // drag & drop events
272
+ useLayerEvent({
273
+ event: 'mouseenter',
274
+ layerId: 'pdfPreviewGeojson',
275
+ eventHandler: function (e: MapLayerMouseEvent) {
276
+ if (!mapHook.map || !e?.features?.length) return;
277
+ mapHook.map.map._canvas.style.cursor = 'move';
278
+ activeFeature.current = e.features[0];
279
+ },
280
+ });
281
+ useLayerEvent({
282
+ event: 'mouseleave',
283
+ layerId: 'pdfPreviewGeojson',
284
+ eventHandler: function () {
285
+ if (!mapHook.map) return;
286
+
287
+ mapHook.map.map._canvas.style.cursor = '';
288
+ mapHook.map.map.dragPan.enable();
289
+ activeFeature.current = undefined;
290
+ },
291
+ });
292
+ useLayerEvent({
293
+ event: 'mousedown',
294
+ addTouchEvents: true,
295
+ layerId: 'pdfPreviewGeojson',
296
+ eventHandler: function (e: MapMouseEvent | MapTouchEvent) {
297
+ e.preventDefault();
298
+ console.log('mousedown');
299
+ if (!mapHook.map) return;
300
+
301
+ draggingResizeHandle.current = false;
302
+ draggingRotationHandle.current = false;
303
+ dragging.current = true;
304
+ mapHook.map.map._canvas.style.cursor = 'move';
305
+
306
+ function onMove(e: MapMouseEvent | MapTouchEvent) {
307
+ e.preventDefault();
308
+ if (!dragging.current || !pdfContext.geojsonRef || !pdfContext.orientation) return;
309
+
310
+ const tmpGeojsonProps = JSON.parse(JSON.stringify(geojsonProps));
311
+ tmpGeojsonProps.center = e.lngLat;
312
+ tmpGeojsonProps.geojson = createPreviewGeojson(tmpGeojsonProps, pdfContext.orientation);
313
+ pdfContext.geojsonRef.current = tmpGeojsonProps.geojson;
314
+ setGeojsonProps(tmpGeojsonProps);
315
+ }
316
+ function onUp() {
317
+ if (!dragging.current || !mapHook.map) return;
318
+
319
+ mapHook.map.map._canvas.style.cursor = '';
320
+ dragging.current = false;
321
+
322
+ mapHook.map.map.dragPan.enable();
323
+ // Unbind mouse events
324
+ mapHook.map.map.off('mousemove', onMove);
325
+ mapHook.map.map.off('touchmove', onMove);
326
+ }
327
+
328
+ // Mouse events
329
+ mapHook.map.map.on('mousemove', onMove);
330
+ mapHook.map.map.on('touchmove', onMove);
331
+ mapHook.map.map.once('mouseup', onUp);
332
+ mapHook.map.map.once('touchend', onUp);
333
+ },
334
+ });
335
+
336
+ //map.on('mouseleave', 'point', function() {
337
+ // map.setPaintProperty('point', 'circle-color', '#3887be');
338
+ // canvas.style.cursor = '';
339
+ // isCursorOverPoint = false;
340
+ // map.dragPan.enable();
341
+ //});
342
+
343
+ return (
344
+ <>
345
+ {geojsonProps?.geojson?.bbox && (
346
+ <>
347
+ <MlGeoJsonLayer
348
+ paint={{ 'line-color': '#616161', 'line-width': 4 }}
349
+ type="line"
350
+ layerId="pdfPreviewGeojsonOutline"
351
+ geojson={geojsonProps.geojson}
352
+ />
353
+ <MlGeoJsonLayer
354
+ paint={{ 'fill-opacity': 0 }}
355
+ type="fill"
356
+ layerId="pdfPreviewGeojson"
357
+ geojson={geojsonProps.geojson}
358
+ />
359
+ <MlGeoJsonLayer
360
+ layerId="pdfPreviewGeojsonResizeHandle"
361
+ paint={{
362
+ 'circle-radius': 10,
363
+ 'circle-color': '#1976d2',
364
+ 'circle-stroke-width': 2,
365
+ 'circle-stroke-color': '#ffffff',
366
+ }}
367
+ geojson={{
368
+ type: 'Feature',
369
+ geometry: {
370
+ type: 'Point',
371
+ //coordinates: [geojsonProps.geojson.bbox[2], geojsonProps.geojson.bbox[3]],
372
+ coordinates: geojsonProps.geojson.geometry.coordinates[0][2],
373
+ },
374
+ properties: {},
375
+ }}
376
+ />
377
+ <MlGeoJsonLayer
378
+ layerId="pdfPreviewGeojsonRotationHandle"
379
+ paint={{
380
+ 'circle-radius': 10,
381
+ 'circle-color': '#86dd71',
382
+ 'circle-stroke-width': 2,
383
+ 'circle-stroke-color': '#ffffff',
384
+ }}
385
+ geojson={{
386
+ type: 'Feature',
387
+ geometry: {
388
+ type: 'Point',
389
+ //coordinates: [geojsonProps.geojson.bbox[0], geojsonProps.geojson.bbox[3]],
390
+ coordinates: geojsonProps.geojson.geometry.coordinates[0][3],
391
+ },
392
+ properties: {},
393
+ }}
394
+ />
395
+ </>
396
+ )}
397
+ </>
398
+ );
399
+ }
@@ -0,0 +1,24 @@
1
+ import { Feature } from '@turf/turf';
2
+ export interface PdfPreviewOptions {
3
+ center: [number, number] | undefined;
4
+ scale: [number, number] | undefined;
5
+ rotate: number;
6
+ width: number;
7
+ height: number;
8
+ fixedScale?: number | false;
9
+ orientation: 'portrait' | 'landscape';
10
+ }
11
+
12
+ export interface PdfContextInterface {
13
+ options: PdfPreviewOptions;
14
+ setOptions: (arg1: (val: PdfPreviewOptions) => PdfPreviewOptions) => void;
15
+ format: string;
16
+ setFormat: (format: string) => void;
17
+ quality: string;
18
+ setQuality: (quality: string) => void;
19
+ geojsonRef: MutableRefObject<
20
+ | Feature
21
+ | undefined
22
+ >;
23
+ template: { width: number; height: number };
24
+ }
@@ -0,0 +1,114 @@
1
+ .root {
2
+ position: relative;
3
+ }
4
+ .mapContainer {
5
+ position: relative;
6
+ }
7
+ .will-change-container {
8
+ padding-left: 100px;
9
+ padding-top: 100px;
10
+ will-change: transform;
11
+ }
12
+ .will-change-target {
13
+ position: relative;
14
+ width: 100px;
15
+ height: 100px;
16
+ line-height: 100px;
17
+ text-align: center;
18
+ background: #ee8;
19
+ color: #333;
20
+ font-weight: bold;
21
+ border: 1px solid #333;
22
+ box-sizing: border-box;
23
+ }
24
+ .moveable-control-box{
25
+ z-index:255;
26
+ cursor: pointer;
27
+ }
28
+ .moveable-rotation .moveable-rotation-control {
29
+ cursor:pointer !important;
30
+ }
31
+ .target {
32
+ position: fixed;
33
+ top: 0;
34
+ left: 0;
35
+ line-height: 100px;
36
+ text-align: center;
37
+ background: rgba(120,210,210,0.1);
38
+ border: 3px solid #3a3;
39
+ box-sizing: border-box;
40
+ z-index:250;
41
+ cursor: pointer;
42
+ }
43
+
44
+ .nested {
45
+ position: absolute;
46
+ border: 4px solid #ccc;
47
+ width: 100px;
48
+ height: 100px;
49
+ top: 50px;
50
+ left: 70px;
51
+ color: #333;
52
+ /* box-sizing: border-box; */
53
+ }
54
+
55
+ .nested.first {
56
+ top: 150px;
57
+ }
58
+
59
+ .nested.rotate {
60
+ transform-origin: 0 0;
61
+ transform: rotate(-30deg);
62
+ }
63
+
64
+ .nested.scale {
65
+ transform: scale(1.5, 1.5);
66
+ }
67
+
68
+ .nested .target {
69
+ top: 50px;
70
+ left: 50px
71
+ }
72
+
73
+
74
+ /* pos guidelines */
75
+ .moveable-normal.red {
76
+ background: red!important;
77
+ }
78
+ /* gap guidelines */
79
+ .moveable-gap.red {
80
+ background: red!important;
81
+ }
82
+ /* When snapped to an element in elementGuidelines */
83
+ .moveable-bold.red {
84
+ background: red!important;
85
+ }
86
+ /* A dashed line between target and element */
87
+ .moveable-dashed.red {
88
+ border-top-color: red!important;
89
+ border-left-color: red!important;
90
+ }
91
+
92
+ /* pos guidelines */
93
+ .moveable-normal.green {
94
+ background: green!important;
95
+ }
96
+ /* gap guidelines */
97
+ .moveable-gap.green {
98
+ background: green!important;
99
+ }
100
+ /* When snapped to an element in elementGuidelines */
101
+ .moveable-bold.green {
102
+ background: green!important;
103
+ }
104
+ /* A dashed line between target and element */
105
+ .moveable-dashed.green {
106
+ border-top-color: green!important;
107
+ border-left-color: green!important;
108
+ }
109
+ .MuiDialog-root{
110
+ pointer-events: none;
111
+ }
112
+ .MuiDialog-root .react-draggable{
113
+ pointer-events: all;
114
+ }
@@ -1,8 +1,7 @@
1
- import { LngLatLike, Map } from '!maplibre-gl';
1
+ import { Map } from '!maplibre-gl';
2
2
  import jsPDF from 'jspdf';
3
3
  import MapLibreGlWrapper from '../../components/MapLibreMap/lib/MapLibreGlWrapper';
4
4
 
5
- import * as turf from '@turf/turf';
6
5
  import { BBox } from '@turf/turf';
7
6
 
8
7
  interface createExportOptions {
@@ -59,54 +58,26 @@ const createExport = (options: createExportOptions) => {
59
58
  style: style,
60
59
  });
61
60
 
62
- let _previewGeojson = turf.bboxPolygon([
63
- options.bbox[0],
64
- options.bbox[1],
65
- options.bbox[2],
66
- options.bbox[3],
67
- ]);
68
- _previewGeojson = turf.transformRotate(_previewGeojson, options.bearing);
69
-
70
- // use original unrotated bbox and bearing 0 to calculate the correct zoom value as the function always adds a padding if used on the rotated feature coordinates
71
61
  const bboxCamera = renderMap._cameraForBoxAndBearing(
72
62
  [options.bboxUnrotated[0], options.bboxUnrotated[1]],
73
63
  [options.bboxUnrotated[2], options.bboxUnrotated[3]],
74
- 0
75
- );
76
- const geometryCamera = renderMap._cameraForBoxAndBearing(
77
- _previewGeojson.geometry.coordinates[0][0] as LngLatLike,
78
- _previewGeojson.geometry.coordinates[0][2] as LngLatLike,
79
- options.bearing
64
+ options.bearing+options.map.map.getBearing()
80
65
  );
81
- geometryCamera.zoom = bboxCamera.zoom;
82
66
 
83
- renderMap._fitInternal(geometryCamera);
67
+ renderMap._fitInternal(bboxCamera);
84
68
  return new Promise<createExportResolverParams>((resolve) => {
85
- renderMap.once('idle', function () {
86
- if (renderMap.getLayer('pdfPreviewGeojsonOutline')) {
87
- renderMap.setLayoutProperty('pdfPreviewGeojsonOutline', 'visibility', 'none');
88
- }
89
- if (renderMap.getLayer('pdfPreviewGeojson')) {
90
- renderMap.setLayoutProperty('pdfPreviewGeojson', 'visibility', 'none');
91
- }
92
- if (renderMap.getLayer('pdfPreviewGeojsonResizeHandle')) {
93
- renderMap.setLayoutProperty('pdfPreviewGeojsonResizeHandle', 'visibility', 'none');
94
- }
95
- if (renderMap.getLayer('pdfPreviewGeojsonRotationHandle')) {
96
- renderMap.setLayoutProperty('pdfPreviewGeojsonRotationHandle', 'visibility', 'none');
97
- }
69
+ console.log('before idle');
98
70
 
99
- renderMap.once('idle', function () {
100
- const params: createExportResolverParams = {
101
- ...options,
102
- renderMap,
103
- hiddenContainer,
104
- createPdf: (_options?: createJsPdfOptions) =>
105
- createJsPdf({ ...options, renderMap, hiddenContainer, ..._options }),
106
- };
107
-
108
- resolve(params);
109
- });
71
+ renderMap.once('idle', function () {
72
+ const params: createExportResolverParams = {
73
+ ...options,
74
+ renderMap,
75
+ hiddenContainer,
76
+ createPdf: (_options?: createJsPdfOptions) =>
77
+ createJsPdf({ ...options, renderMap, hiddenContainer, ..._options }),
78
+ };
79
+
80
+ resolve(params);
110
81
  });
111
82
  });
112
83
  };
package/src/index.ts CHANGED
@@ -2,6 +2,7 @@ export { default as MapLibreMap } from "./components/MapLibreMap/MapLibreMap";
2
2
  export { default as MlComponentTemplate } from "./components/MlComponentTemplate/MlComponentTemplate";
3
3
  export { default as MlCreatePdfButton } from "./components/MlCreatePdfButton/MlCreatePdfButton";
4
4
  export { default as MlCreatePdfForm } from "./components/MlCreatePdfForm/MlCreatePdfForm";
5
+ export { default as MlPdfPreview } from "./components/MlCreatePdfForm/lib/PdfPreview";
5
6
  export { default as MlFeatureEditor } from "./components/MlFeatureEditor/MlFeatureEditor";
6
7
  export { default as MlFillExtrusionLayer } from "./components/MlFillExtrusionLayer/MlFillExtrusionLayer";
7
8
  export { default as MlFollowGps } from "./components/MlFollowGps/MlFollowGps";