Consolidated ASP Classic MVC framework from best components
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

135 wiersze
5.2KB

  1. <div class="container mt-4">
  2. <nav aria-label="breadcrumb">
  3. <ol class="breadcrumb">
  4. <li class="breadcrumb-item"><a href="/territories">Territories</a></li>
  5. <li class="breadcrumb-item active" aria-current="page">New Territory</li>
  6. </ol>
  7. </nav>
  8. <h1>New Territory</h1>
  9. <% Flash().ShowErrorsIfPresent %>
  10. <div class="card">
  11. <div class="card-body">
  12. <form method="post" action="/territories">
  13. <div class="row">
  14. <div class="col-md-4">
  15. <div class="mb-3">
  16. <label for="Name" class="form-label">Name <span class="text-danger">*</span></label>
  17. <input type="text" class="form-control" id="Name" name="Name" required maxlength="255">
  18. </div>
  19. <div class="mb-3">
  20. <label for="Description" class="form-label">Description</label>
  21. <textarea class="form-control" id="Description" name="Description" rows="2"></textarea>
  22. </div>
  23. <div class="mb-3">
  24. <label for="Coordinates" class="form-label">Coordinates (JSON)</label>
  25. <textarea class="form-control" id="Coordinates" name="Coordinates" rows="4" style="font-family: monospace; font-size: 12px;"></textarea>
  26. <small class="text-muted">Click on the map to draw the territory boundary.</small>
  27. </div>
  28. <div class="d-flex gap-2">
  29. <button type="submit" class="btn btn-primary">Create Territory</button>
  30. <a href="/territories" class="btn btn-secondary">Cancel</a>
  31. </div>
  32. </div>
  33. <div class="col-md-8">
  34. <label class="form-label">Territory Boundary</label>
  35. <div id="map" style="height: 400px; width: 100%; border-radius: 8px;"></div>
  36. <div class="mt-2">
  37. <button type="button" class="btn btn-sm btn-outline-secondary" onclick="clearPolygon()">Clear Polygon</button>
  38. <button type="button" class="btn btn-sm btn-outline-secondary" onclick="undoLastPoint()">Undo Last Point</button>
  39. </div>
  40. </div>
  41. </div>
  42. </form>
  43. </div>
  44. </div>
  45. </div>
  46. <script src="https://maps.googleapis.com/maps/api/js?key=<%= Server.HTMLEncode(GetAppSetting("GoogleMapsApiKey")) %>&callback=initMap" async defer></script>
  47. <script>
  48. var map, polygon;
  49. function initMap() {
  50. var defaultCenter = { lat: -33.8688, lng: 151.2093 }; // Sydney default
  51. map = new google.maps.Map(document.getElementById('map'), {
  52. zoom: 12,
  53. center: defaultCenter,
  54. mapTypeId: 'roadmap'
  55. });
  56. // Create editable polygon (empty initially)
  57. polygon = new google.maps.Polygon({
  58. paths: [],
  59. strokeColor: '#FF0000',
  60. strokeOpacity: 0.8,
  61. strokeWeight: 2,
  62. fillColor: '#FF0000',
  63. fillOpacity: 0.35,
  64. editable: true,
  65. draggable: true
  66. });
  67. polygon.setMap(map);
  68. // Click to add points
  69. map.addListener('click', function(event) {
  70. var path = polygon.getPath();
  71. path.push(event.latLng);
  72. updateCoordinatesField();
  73. });
  74. // Update field when polygon is edited
  75. google.maps.event.addListener(polygon.getPath(), 'set_at', updateCoordinatesField);
  76. google.maps.event.addListener(polygon.getPath(), 'insert_at', updateCoordinatesField);
  77. google.maps.event.addListener(polygon.getPath(), 'remove_at', updateCoordinatesField);
  78. // Also update when dragged
  79. google.maps.event.addListener(polygon, 'dragend', updateCoordinatesField);
  80. }
  81. function updateCoordinatesField() {
  82. var path = polygon.getPath();
  83. var coords = [];
  84. for (var i = 0; i < path.getLength(); i++) {
  85. var point = path.getAt(i);
  86. coords.push({ lat: point.lat(), lng: point.lng() });
  87. }
  88. document.getElementById('Coordinates').value = JSON.stringify(coords, null, 2);
  89. }
  90. function clearPolygon() {
  91. polygon.getPath().clear();
  92. updateCoordinatesField();
  93. }
  94. function undoLastPoint() {
  95. var path = polygon.getPath();
  96. if (path.getLength() > 0) {
  97. path.pop();
  98. updateCoordinatesField();
  99. }
  100. }
  101. // Allow manual JSON editing
  102. document.getElementById('Coordinates').addEventListener('change', function() {
  103. try {
  104. var coords = JSON.parse(this.value);
  105. if (Array.isArray(coords)) {
  106. var path = polygon.getPath();
  107. path.clear();
  108. coords.forEach(function(coord) {
  109. path.push(new google.maps.LatLng(coord.lat || coord[0], coord.lng || coord[1]));
  110. });
  111. }
  112. } catch (e) {
  113. // Invalid JSON, ignore
  114. }
  115. });
  116. </script>

Powered by TurnKey Linux.