|
572 | 572 | </div> |
573 | 573 | break; |
574 | 574 |
|
| 575 | + case "map": |
| 576 | +
|
| 577 | + var mapParamValue = value?.ToString() ?? string.Empty; |
| 578 | +
|
| 579 | + @if (parameter.InputCapture == "latitude") { |
| 580 | + var lngPartner = Model.Parameters.FirstOrDefault(p => p.InputType == "map" && p.InputCapture == "longitude"); |
| 581 | + var lngName = lngPartner?.Name ?? string.Empty; |
| 582 | + <div id="id_map_@parameter.Name" style="height:300px; width:100%; border-radius:4px; margin-bottom:0.5rem;"></div> |
| 583 | + <script language="javascript"> |
| 584 | + (function () { |
| 585 | + $(document).ready(function () { |
| 586 | + mapboxgl.accessToken = mapPickerToken; |
| 587 | +
|
| 588 | + var latEl = document.getElementById('id_@parameter.Name'); |
| 589 | + var lngEl = document.getElementById('id_@lngName'); |
| 590 | +
|
| 591 | + var lat = parseFloat(latEl ? latEl.value : '') || 0; |
| 592 | + var lng = parseFloat(lngEl ? lngEl.value : '') || 0; |
| 593 | + var hasCoords = lat !== 0 || lng !== 0; |
| 594 | +
|
| 595 | + var map = new mapboxgl.Map({ |
| 596 | + container: 'id_map_@parameter.Name', |
| 597 | + style: 'mapbox://styles/mapbox/streets-v11', |
| 598 | + center: [hasCoords ? lng : 0, hasCoords ? lat : 0], |
| 599 | + zoom: hasCoords ? 14 : 2 |
| 600 | + }); |
| 601 | +
|
| 602 | + map.addControl(new mapboxgl.NavigationControl()); |
| 603 | + map.addControl(new mapboxgl.GeolocateControl({ positionOptions: { enableHighAccuracy: true } })); |
| 604 | +
|
| 605 | + var marker = new mapboxgl.Marker({ draggable: true, color: '#e74c3c' }) |
| 606 | + .setLngLat([hasCoords ? lng : 0, hasCoords ? lat : 0]) |
| 607 | + .addTo(map); |
| 608 | +
|
| 609 | + var syncing = false; |
| 610 | +
|
| 611 | + function setLocation(lngLat) { |
| 612 | + syncing = true; |
| 613 | + marker.setLngLat(lngLat); |
| 614 | + if (latEl) { latEl.value = lngLat.lat.toFixed(7); $(latEl).trigger('change'); } |
| 615 | + if (lngEl) { lngEl.value = lngLat.lng.toFixed(7); $(lngEl).trigger('change'); } |
| 616 | + syncing = false; |
| 617 | + } |
| 618 | +
|
| 619 | + marker.on('dragend', function () { |
| 620 | + setLocation(marker.getLngLat()); |
| 621 | + }); |
| 622 | +
|
| 623 | + map.on('click', function (e) { |
| 624 | + setLocation(e.lngLat); |
| 625 | + }); |
| 626 | +
|
| 627 | + function syncMarker() { |
| 628 | + if (syncing) return; |
| 629 | + var la = parseFloat(latEl ? latEl.value : NaN); |
| 630 | + var ln = parseFloat(lngEl ? lngEl.value : NaN); |
| 631 | + if (!isNaN(la) && !isNaN(ln)) { |
| 632 | + marker.setLngLat([ln, la]); |
| 633 | + map.flyTo({ center: [ln, la] }); |
| 634 | + } |
| 635 | + } |
| 636 | +
|
| 637 | + if (latEl) $(latEl).on('change blur', syncMarker); |
| 638 | + if (lngEl) $(lngEl).on('change blur', syncMarker); |
| 639 | +
|
| 640 | + map.on('load', function () { map.resize(); }); |
| 641 | + }); |
| 642 | + })(); |
| 643 | + </script> |
| 644 | + } |
| 645 | +
|
| 646 | + <div class="form-group @(parameter.Valid ? "is-valid" : "is-invalid") @parameter.Class"> |
| 647 | + <label for="@parameter.Name" class="form-label">@(parameter.Label == string.Empty ? parameter.Name : parameter.Label)</label> |
| 648 | + @if (parameter.Hint != string.Empty) { |
| 649 | + <span class="text-muted float-end"> @parameter.Hint</span> |
| 650 | + } |
| 651 | + <input type="number" |
| 652 | + class="form-control @(parameter.Valid ? "is-valid" : "is-invalid")" |
| 653 | + name="@parameter.Name" |
| 654 | + id="id_@parameter.Name" |
| 655 | + placeholder="@parameter.Label" |
| 656 | + value="@mapParamValue" |
| 657 | + step="0.0000001" |
| 658 | + data-tfl-post-back="@(parameter.PostBack)" |
| 659 | + @Html.Raw(parameter.ToParsley()) /> |
| 660 | + @* if you change location you must update parsley error container *@ |
| 661 | + <span class="help-container"> |
| 662 | + @if (!parameter.Valid) { |
| 663 | + <span class="help-block">@(parameter.Message.Replace('|', ' '))</span> |
| 664 | + } |
| 665 | + </span> |
| 666 | + </div> |
| 667 | +
|
| 668 | + break; |
| 669 | +
|
575 | 670 | default: |
576 | 671 | int length; |
577 | 672 | <div class="form-group @(parameter.Valid ? "is-valid" : "is-invalid") @parameter.Class"> |
|
0 commit comments