Consolidated ASP Classic MVC framework from best components
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

135 lignes
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.