adt-js-components 1.10.0 → 1.10.2

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 (2) hide show
  1. package/package.json +1 -1
  2. package/src/Map/index.js +80 -17
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "adt-js-components",
3
- "version": "1.10.0",
3
+ "version": "1.10.2",
4
4
  "description": "JavaScript components for Nette framework",
5
5
  "main": "index.js",
6
6
  "scripts": {
package/src/Map/index.js CHANGED
@@ -139,6 +139,7 @@ async function run(options) {
139
139
  enableRectangleSelection(map, onSelectionChange, showSelectionOrder);
140
140
  }
141
141
 
142
+ /** @type {RouteSetting} */
142
143
  const markerOptions = {};
143
144
  const customMarkerOptions = {};
144
145
  const normalImg = customMarkers.normal || markerImg;
@@ -346,11 +347,25 @@ function addMarkers(map, markers, options, selectedOptions, position, selectable
346
347
  }
347
348
 
348
349
  function checkAndApplyPreselection(map, markers, showSelectionOrder, onSelectionChange, selectable) {
349
- if (selectable && showSelectionOrder) {
350
+ if (showSelectionOrder) {
350
351
  applyPreselectedMarkers(map, markers, showSelectionOrder, onSelectionChange);
352
+ } else if (!selectable) {
353
+ applyPreselectedMarkersVisualOnly(map, markers);
351
354
  }
352
355
  }
353
356
 
357
+ function applyPreselectedMarkersVisualOnly(map, markersData) {
358
+ const markerMap = markerInstances.get(map);
359
+ const preselected = markersData.filter(m => m.selected === true);
360
+
361
+ preselected.forEach((markerData) => {
362
+ const markerInstance = markerMap.get(markerData.id);
363
+ if (markerInstance && markerInstance._selectedIcon) {
364
+ markerInstance.setIcon(markerInstance._selectedIcon);
365
+ }
366
+ });
367
+ }
368
+
354
369
  function createMarker(marker, options, selectedOptions, cluster = null, selectable = false, onSelectionChange = null, map = null, showSelectionOrder = false, markerInfoCallback = null) {
355
370
  const mapMarker = L.marker(marker.position, {...options, id: marker.id});
356
371
  mapMarker._normalIcon = options.icon;
@@ -426,6 +441,11 @@ function createMarker(marker, options, selectedOptions, cluster = null, selectab
426
441
  async function selectMarker(marker, map, showSelectionOrder) {
427
442
  const selected = selectedMarkers.get(map);
428
443
  const order = selectionOrder.get(map);
444
+
445
+ if (selected.has(marker.options.id)) {
446
+ return;
447
+ }
448
+
429
449
  selected.add(marker.options.id);
430
450
  const maxOrder = order.size > 0 ? Math.max(...order.values()) : 0;
431
451
  const newOrder = maxOrder + 1;
@@ -512,21 +532,21 @@ async function createMarkerIcon(map, iconUrl, orderNumber, color = null) {
512
532
  });
513
533
  }
514
534
 
515
- function applyPreselectedMarkers(map, markersData, showSelectionOrder, onSelectionChange) {
535
+ async function applyPreselectedMarkers(map, markersData, showSelectionOrder, onSelectionChange) {
516
536
  const markerMap = markerInstances.get(map);
517
537
  const order = selectionOrder.get(map);
518
538
  const preselected = markersData
519
539
  .filter(m => m.selected === true)
520
540
  .sort((a, b) => (a.selectionOrder || 0) - (b.selectionOrder || 0));
521
541
 
522
- preselected.forEach((markerData) => {
542
+ for (const markerData of preselected) {
523
543
  const markerInstance = markerMap.get(markerData.id);
524
544
  if (markerInstance) {
525
- selectMarker(markerInstance, map, showSelectionOrder);
545
+ await selectMarker(markerInstance, map, showSelectionOrder);
526
546
  } else {
527
547
  console.warn('Marker instance NOT found for ID:', markerData.id);
528
548
  }
529
- });
549
+ }
530
550
 
531
551
  if (onSelectionChange && window[onSelectionChange] && order.size > 0) {
532
552
  const orderedIds = Array.from(order.entries()).sort((a, b) => a[1] - b[1]).map(e => e[0]);
@@ -534,7 +554,8 @@ function applyPreselectedMarkers(map, markersData, showSelectionOrder, onSelecti
534
554
  }
535
555
 
536
556
  const settings = routeSettingsMap.get(map);
537
- if (settings && settings.enabled && order.size >= 2) {
557
+ const hasDepot = settings?.startPoint !== null && settings?.startPoint !== undefined || settings?.endPoint !== null && settings?.endPoint !== undefined;
558
+ if (settings && settings.enabled && order.size >= (hasDepot ? 1 : 2)) {
538
559
  calculateRoute(map);
539
560
  }
540
561
  }
@@ -568,7 +589,7 @@ async function calculateRoute(map) {
568
589
  const orderedIds = Array.from(order.entries()).sort((a, b) => a[1] - b[1]).map(e => e[0]);
569
590
  const routeMarkers = orderedIds.map(id => markers.find(m => m.id === id)).filter(m => m !== undefined);
570
591
 
571
- if (routeMarkers.length < 2) return;
592
+ if (routeMarkers.length < (hasCustomStart || hasCustomEnd ? 1 : 2)) return;
572
593
 
573
594
  const beforeCallback = onBeforeRouteCalculationMap.get(map);
574
595
  if (beforeCallback && window[beforeCallback]) {
@@ -586,7 +607,7 @@ async function calculateRoute(map) {
586
607
  if (isHere) {
587
608
  await calculateRouteHere({ routeMarkers, startPoint, endPoint, routeSettings, allCoords, allParts });
588
609
  } else {
589
- await calculateRouteMapy({ routeMarkers, startPoint, endPoint, routeSettings, allCoords, allParts });
610
+ await calculateRouteMapyCz({ routeMarkers, startPoint, endPoint, routeSettings, allCoords, allParts });
590
611
  }
591
612
  } catch (error) {
592
613
  console.error('Error calculating route:', error);
@@ -604,6 +625,7 @@ async function calculateRoute(map) {
604
625
  opacity: routeSettings.opacity
605
626
  }).addTo(map);
606
627
  routePolylines.set(map, polyline);
628
+ map.fitBounds(polyline.getBounds(), { padding: [32, 32] });
607
629
  }
608
630
 
609
631
  const totalDuration = allParts.reduce((s, p) => s + (p.duration || 0), 0);
@@ -622,7 +644,7 @@ async function calculateRoute(map) {
622
644
  }
623
645
  }
624
646
 
625
- async function calculateRouteMapy({ routeMarkers, startPoint, endPoint, routeSettings, allCoords, allParts }) {
647
+ async function calculateRouteMapyCz({ routeMarkers, startPoint, endPoint, routeSettings, allCoords, allParts }) {
626
648
  const WAYPOINTS_LIMIT = 15;
627
649
 
628
650
  const chunks = [];
@@ -738,7 +760,7 @@ function clearSelection(mapElement) {
738
760
  order.clear();
739
761
  }
740
762
 
741
- function toggleMarker(mapElement, markerId, selected) {
763
+ async function toggleMarker(mapElement, markerId, selected, recalculate = true) {
742
764
  const map = mapInstances.get(mapElement);
743
765
  const markers = markerInstances.get(map);
744
766
  const marker = markers?.get(markerId);
@@ -748,7 +770,7 @@ function toggleMarker(mapElement, markerId, selected) {
748
770
  const isSelected = selectedSet.has(markerId);
749
771
 
750
772
  if (selected && !isSelected) {
751
- selectMarker(marker, map, true);
773
+ await selectMarker(marker, map, true);
752
774
  } else if (!selected && isSelected) {
753
775
  deselectMarker(marker, map, true);
754
776
  } else {
@@ -761,7 +783,7 @@ function toggleMarker(mapElement, markerId, selected) {
761
783
  }
762
784
 
763
785
  const settings = routeSettingsMap.get(map);
764
- if (settings && settings.enabled) {
786
+ if (recalculate && settings && settings.enabled) {
765
787
  calculateRoute(map);
766
788
  }
767
789
  }
@@ -793,13 +815,51 @@ function onAfterRouteCalculation(mapElement, callbackName) {
793
815
 
794
816
  function recalculateRoute(mapElement) {
795
817
  const map = mapInstances.get(mapElement);
818
+
796
819
  if (!map) return;
820
+
797
821
  calculateRoute(map);
798
822
  }
799
823
 
824
+ function removeMarker(mapElement, markerId) {
825
+ const map = mapInstances.get(mapElement);
826
+ if (!map) return;
800
827
 
801
- function addMarkerAndSelect(mapElement, markerData) {
828
+ const markers = markerInstances.get(map);
829
+ const marker = markers?.get(markerId);
830
+ if (!marker) return;
831
+
832
+ const cluster = markerClusters.get(map);
833
+ if (cluster) {
834
+ cluster.removeLayer(marker);
835
+ } else {
836
+ map.removeLayer(marker);
837
+ }
838
+
839
+ markers.delete(markerId);
840
+
841
+ const selected = selectedMarkers.get(map);
842
+ const order = selectionOrder.get(map);
843
+ if (selected.has(markerId)) {
844
+ const removedOrder = order.get(markerId);
845
+ selected.delete(markerId);
846
+ order.delete(markerId);
847
+ order.forEach((value, key) => { if (value > removedOrder) order.set(key, value - 1); });
848
+ }
849
+
850
+ const markersData = markersDataMap.get(map);
851
+ const idx = markersData.findIndex(m => m.id === markerId);
852
+ if (idx !== -1) markersData.splice(idx, 1);
853
+
854
+ const settings = routeSettingsMap.get(map);
855
+ if (settings?.enabled) {
856
+ calculateRoute(map);
857
+ }
858
+ }
859
+
860
+ function addMarkerAndSelect(mapElement, markerData, recalculate = true) {
802
861
  const map = mapInstances.get(mapElement);
862
+
803
863
  if (!map) return;
804
864
 
805
865
  const markers = markerInstances.get(map);
@@ -841,13 +901,15 @@ function addMarkerAndSelect(mapElement, markerData) {
841
901
  };
842
902
  };
843
903
 
844
- loadSelectedIcon((selectedIcon) => {
904
+ loadSelectedIcon(async (selectedIcon) => {
905
+ const mapConfig = JSON.parse(mapElement.dataset.adtMap ?? '{}');
906
+ const selectable = mapConfig.selectable ?? false;
845
907
  const newMarker = createMarker(
846
908
  markerData,
847
909
  { icon: normalIcon },
848
910
  { icon: selectedIcon },
849
911
  cluster || null,
850
- true,
912
+ selectable,
851
913
  onSelectionChangeMap.get(map),
852
914
  map,
853
915
  true,
@@ -859,9 +921,9 @@ function addMarkerAndSelect(mapElement, markerData) {
859
921
  }
860
922
 
861
923
  markersData.push(markerData);
862
- selectMarker(newMarker, map, true);
924
+ await selectMarker(newMarker, map, true);
863
925
 
864
- if (routeSettings?.enabled) {
926
+ if (recalculate && routeSettings?.enabled) {
865
927
  calculateRoute(map);
866
928
  }
867
929
  });
@@ -877,4 +939,5 @@ export default {
877
939
  onAfterRouteCalculation,
878
940
  recalculateRoute,
879
941
  addMarkerAndSelect,
942
+ removeMarker,
880
943
  }