diff --git a/modules/farm/farm_livestock/farm_livestock.farm_quick.move.inc b/modules/farm/farm_livestock/farm_livestock.farm_quick.move.inc index 8d31376e..ceb8d4df 100644 --- a/modules/farm/farm_livestock/farm_livestock.farm_quick.move.inc +++ b/modules/farm/farm_livestock/farm_livestock.farm_quick.move.inc @@ -58,12 +58,22 @@ function farm_livestock_move_form($form, &$form_state) { '#title' => t('Moving to'), '#description' => t('Enter the name of the area that animals are moving to. A list of existing area options will appear as you type. If the area does not exist, a new one will be created.'), '#autocomplete_path' => 'taxonomy/autocomplete/field_farm_area', + '#ajax' => array( + 'callback' => 'farm_livestock_move_form_next_location_ajax', + ), '#required' => TRUE, ); + // Load the Moving To location geom in a hidden text field. + $form['move']['area']['next_location'] = array( + '#type' => 'hidden', + '#value' => '', + '#prefix' => '
', + '#suffix' => '
', + ); + // Geometry - // Add a farmOS map instance with the WKT and drawing controls. - $wkt = ''; + // Add a farmOS map instance. $form['move']['area']['geometry'] = array( '#type' => 'fieldset', '#title' => t('Geometry'), @@ -74,13 +84,11 @@ function farm_livestock_move_form($form, &$form_state) { $form['move']['area']['geometry']['map'] = array( '#type' => 'farm_map', '#map_name' => 'farm_movement', - '#wkt' => $wkt, - '#edit' => TRUE, ); $form['move']['area']['geometry']['data'] = array( '#type' => 'textarea', '#title' => t('Data'), - '#default_value' => $wkt, + '#default_value' => '', ); // Observations @@ -241,6 +249,42 @@ function farm_livestock_move_form_animal_location_ajax($form, $form_state) { return array('#type' => 'ajax', '#commands' => $commands); } +/** + * Ajax callback for farm_livestock_move_form(). + */ +function farm_livestock_move_form_next_location_ajax($form, $form_state) { + + // If the location is available, load areas. + $areas = array(); + if (!empty($form_state['values']['move']['area']['name'])) { + $areas = farm_term_parse_names($form_state['values']['move']['area']['name'], 'farm_areas', FALSE); + } + + // Get the "wkt" form element and CSS selector. + $element = $form['move']['area']['next_location']; + $selector = '#next-location'; + + // Update hidden wkt with area geometry. + $area_ids = array(); + foreach($areas as $area) { + $area_ids[] = $area->tid; + } + $geom = farm_area_extract_geoms($area_ids); + $element['#value'] = $geom; + + // Assemble commands... + $commands = array(); + + // Replace the hidden field. + $commands[] = ajax_command_replace($selector, render($element)); + + // Execute Javascript to add WKT to the map. + $commands[] = array('command' => 'updateMovementLayer'); + + // Return ajax commands. + return array('#type' => 'ajax', '#commands' => $commands); +} + /** * Submit function for movement quick form. */ diff --git a/modules/farm/farm_livestock/js/farm_livestock.farm_quick.move.js b/modules/farm/farm_livestock/js/farm_livestock.farm_quick.move.js index 6aaef73e..2202828a 100644 --- a/modules/farm/farm_livestock/js/farm_livestock.farm_quick.move.js +++ b/modules/farm/farm_livestock/js/farm_livestock.farm_quick.move.js @@ -7,4 +7,13 @@ farmOS.map.behaviors.move.previewCurrentLocation(wkt); } } + + // Define a Drupal ajax command for loading the Movement To area wkt + // from a hidden input field and preview it as an editable layer in the map. + Drupal.ajax.prototype.commands.updateMovementLayer = function() { + var wkt = $('#next-location input[name="move[area][next_location]"]').val(); + if (wkt) { + farmOS.map.behaviors.move.updateMovementLayer(wkt); + } + } }(jQuery)); diff --git a/modules/farm/farm_movement/js/farmOS.map.behaviors.move.js b/modules/farm/farm_movement/js/farmOS.map.behaviors.move.js index e9ecd4e7..52147948 100644 --- a/modules/farm/farm_movement/js/farmOS.map.behaviors.move.js +++ b/modules/farm/farm_movement/js/farmOS.map.behaviors.move.js @@ -10,10 +10,17 @@ */ this.instance = instance; - // When features are changed in the map, drop the WKT into the data field. - instance.edit.wktOn('featurechange', function(wkt) { - $('#' + instance.target).parent().find('textarea').val(wkt); - }); + // Create an editable movement layer. + // Init as an empty vector layer, the layer can be recreated + // as an editable WKT layer later. + var opts = { + title: 'Movement', + color: 'blue', + }; + this.movementLayer = this.instance.addLayer('vector', opts); + + // Make the layer editable. + this.instance.addBehavior('edit', { layer: this.movementLayer }); }, // Update the assets current location map layer. @@ -37,6 +44,43 @@ this.instance.zoomToLayer(this.currentLocationLayer); }, + // Recreate the Movement map layer. + updateMovementLayer: function (wkt) { + + // Remove current location layer. + if (this.movementLayer) { + this.instance.map.removeLayer(this.movementLayer); + this.movementLayer = null; + } + + // Create current location layer with the WKT. + // Do not put the layer inside a group, because map.removeLayer() (used + // above) does not recurse into layer groups. + var opts = { + title: 'Movement', + color: 'blue', + wkt: wkt, + }; + this.movementLayer = this.instance.addLayer('wkt', opts); + + // Make the layer editable. + this.instance.addBehavior('edit', { layer: this.movementLayer }); + + // Zoom to the new layer. + this.instance.zoomToLayer(this.movementLayer); + + // Save the map instance ID. + const target = this.instance.target; + + // Update the data field with the selected areas WKT. + $('#' + target).parent().find('textarea').val(wkt); + + // When features are changed in the map, drop the WKT into the data field. + this.instance.edit.wktOn('featurechange', function(wkt) { + $('#' + target).parent().find('textarea').val(wkt); + }); + }, + // Make sure this runs after farmOS.map.behaviors.wkt. weight: 101, };