CRM-15294 - Fix multiple bugs in event location form
authorColeman Watts <coleman@civicrm.org>
Wed, 17 Sep 2014 18:24:31 +0000 (14:24 -0400)
committerColeman Watts <coleman@civicrm.org>
Wed, 17 Sep 2014 18:24:31 +0000 (14:24 -0400)
CRM/Core/Page/AJAX/Location.php
CRM/Event/Form/ManageEvent/Location.php
templates/CRM/Event/Form/ManageEvent/Location.tpl

index 3ffdf59cdeb536a5717f1997e9fc8e8e7a646d4a..831b590d2eaed4690662ac5f5aa820740a4dd68f 100644 (file)
@@ -213,8 +213,8 @@ class CRM_Core_Page_AJAX_Location {
   static function getLocBlock() {
     // i wish i could retrieve loc block info based on loc_block_id,
     // Anyway, lets retrieve an event which has loc_block_id set to 'lbid'.
-    if ($_POST['lbid']) {
-      $params = array('1' => array($_POST['lbid'], 'Integer'));
+    if ($_REQUEST['lbid']) {
+      $params = array('1' => array($_REQUEST['lbid'], 'Integer'));
       $eventId = CRM_Core_DAO::singleValueQuery('SELECT id FROM civicrm_event WHERE loc_block_id=%1 LIMIT 1', $params);
     }
     // now lets use the event-id obtained above, to retrieve loc block information.
@@ -260,7 +260,7 @@ class CRM_Core_Page_AJAX_Location {
     }
 
     // set the message if loc block is being used by more than one event.
-    $result['count_loc_used'] = CRM_Event_BAO_Event::countEventsUsingLocBlockId($_POST['lbid']);
+    $result['count_loc_used'] = CRM_Event_BAO_Event::countEventsUsingLocBlockId($_REQUEST['lbid']);
 
     CRM_Utils_JSON::output($result);
   }
index c105eccaf8c7f94c1cfc7984467d93593d84cc77..c5cc678f44b6fc3f7c2fc6cf9c224c7cddb78701 100644 (file)
@@ -110,9 +110,7 @@ class CRM_Event_Form_ManageEvent_Location extends CRM_Event_Form_ManageEvent {
     if (!empty($defaults['loc_block_id'])) {
       $defaults['loc_event_id'] = $defaults['loc_block_id'];
       $countLocUsed = CRM_Event_BAO_Event::countEventsUsingLocBlockId($defaults['loc_block_id']);
-      if ($countLocUsed > 1) {
-        $this->assign('locUsed', TRUE);
-      }
+      $this->assign('locUsed', $countLocUsed);
     }
 
     $config = CRM_Core_Config::singleton();
@@ -207,10 +205,7 @@ class CRM_Event_Form_ManageEvent_Location extends CRM_Event_Form_ManageEvent {
         '2' => ts('Use existing location'),
       );
 
-      $this->addRadio('location_option', ts("Choose Location"), $optionTypes,
-        array(
-          'onclick' => "showLocFields();"), '<br/>', FALSE
-      );
+      $this->addRadio('location_option', ts("Choose Location"), $optionTypes);
 
       if (!isset($locationEvents[$this->_oldLocBlockId]) || (!$this->_oldLocBlockId)) {
         $locationEvents = array(
index d5741974b6e711c1a01b5484c23e3cc2932c9a4b..4a32041df5850fba2822453c72adddffed76082f 100644 (file)
@@ -59,7 +59,6 @@
       </tr>
       <tr>
         <td id="locUsedMsg" colspan="3">
-        {assign var=locUsedMsgTxt value="<strong>Note:</strong> This location is used by multiple events. Modifying location information will change values for all events."}
         </td>
       </tr>
 
 
 <script type="text/javascript">
 {literal}
-var locUsedMsgTxt = {/literal}"{$locUsedMsgTxt}"{literal};
-var locBlockId    = {/literal}"{$form.loc_event_id.value.0}"{literal};
-
-if ( {/literal}"{$locUsed}"{literal} ) {
-   displayMessage( true );
-}
-
 CRM.$(function($) {
   //FIX ME: by default load 2 blocks and hide add and delete links
   //we should make additional block function more flexible to set max block limit
   buildBlocks('Email');
   buildBlocks('Phone');
 
+  var $form = $('form.{/literal}{$form.formClass}{literal}'),
+    locBlockId = {/literal}"{$form.loc_event_id.value.0}"{literal};
+
+  displayMessage({/literal}{$locUsed}{literal});
+
   // build blocks only if it is not built
   function buildBlocks(element) {
     if (!$('[id='+ element +'_Block_2]').length) {
@@ -124,69 +121,84 @@ CRM.$(function($) {
   hideAddDeleteLinks('Email');
   hideAddDeleteLinks('Phone');
   function hideAddDeleteLinks(element) {
-    $('#add'+ element).hide();
-    $('[id='+ element +'_Block_2] a:last').hide();
+    $('#add'+ element, $form).hide();
+    $('[id='+ element +'_Block_2] a:last', $form).hide();
   }
 
-  $('#loc_event_id').change(function() {
+  $('#loc_event_id', $form).change(function() {
     $.ajax({
       url: CRM.url('civicrm/ajax/locBlock', 'reset=1'),
-      type: 'POST',
       data: {'lbid': $(this).val()},
       dataType: 'json',
       success: function(data) {
         var selectLocBlockId = $('#loc_event_id').val();
+        // Only change state when options are loaded
+        if (data.address_1_state_province_id) {
+          var defaultState = data.address_1_state_province_id;
+          $('#address_1_state_province_id', $form).one('crmOptionsUpdated', function() {
+            $(this).val(defaultState).change();
+          });
+          delete data.address_1_state_province_id;
+        }
         for(i in data) {
           if ( i == 'count_loc_used' ) {
-            if ( ((selectLocBlockId == locBlockId) && data['count_loc_used'] > 1) ||
-                 ((selectLocBlockId != locBlockId) && data['count_loc_used'] > 0) ) {
-              displayMessage( true );
+            if ( ((selectLocBlockId == locBlockId) && data.count_loc_used > 1) ||
+                 ((selectLocBlockId != locBlockId) && data.count_loc_used > 0) ) {
+              displayMessage(data.count_loc_used);
             } else {
-              displayMessage( false );
+              displayMessage(0);
             }
           } else {
-            if (i == 'phone_1_phone_type_id' || i == 'phone_2_phone_type_id') {
-              $('#'+i).select2('val', data[i]);
-            }
-            else {
-              $('#'+i).val(data[i]);
-            }
+            $('#'+i, $form).val(data[i]).change();
           }
         }
       }
     });
     return false;
   });
-});
 
-function displayMessage( set ) {
-   CRM.$(function($) {
-     if ( set ) {
-       $('#locUsedMsg').html( locUsedMsgTxt ).addClass('status');
-     } else {
-       $('#locUsedMsg').html( ' ' ).removeClass('status');
-     }
-   });
-}
-
-function showLocFields( ) {
-   var createNew = document.getElementsByName("location_option")[0].checked;
-   var useExisting = document.getElementsByName("location_option")[1].checked;
-   if ( createNew ) {
-     cj('#existingLoc').hide();
-     //clear all location fields values.
-     cj("input[id *= 'address_1_']").val("");
-     cj("input[id *= 'email_1_']").val("");
-     cj("input[id *= 'phone_1_']").val("");
-     //reset country/state.
-     cj("select[id *= 'address_1_']").val("");
-     displayMessage(false);
-   } else if ( useExisting ) {
-     cj('#existingLoc').show();
-   }
-}
-
-showLocFields( );
+  function showLocFields(clear) {
+    var createNew = document.getElementsByName("location_option")[0].checked;
+    if (createNew) {
+      $('#existingLoc', $form).hide();
+      //clear all location fields values.
+      if (clear !== false) {
+        $(":input[id *= 'address_1_'], :input[id *= 'email_1_'], :input[id *= 'phone_1_']", $form).val("").change();
+        {/literal}{if $config->defaultContactCountry}
+          {if $config->defaultContactStateProvince}
+            // Set default state once options are loaded
+            var defaultState = {$config->defaultContactStateProvince}
+            {literal}
+              $('#address_1_state_province_id', $form).one('crmOptionsUpdated', function() {
+                $(this).val(defaultState).change();
+              });
+            {/literal}
+          {/if}
+          // Set default country
+          $('#address_1_country_id', $form).val({$config->defaultContactCountry}).change();
+        {/if}{literal}
+      }
+      displayMessage(0);
+    } else {
+      $('#existingLoc', $form).show();
+      if (clear !== false) {
+        $('#loc_event_id', $form).change();
+      }
+    }
+  }
+  
+  $('input[name=location_option]').click(showLocFields);
+  showLocFields(false);
+
+  function displayMessage(count) {
+    if (count) {
+      var msg = {/literal}'{ts escape="js" 1="%1"}This location is used by %1 other events. Modifying location information will change values for all events.{/ts}'{literal};
+      $('#locUsedMsg', $form).text(ts(msg, {1: count})).addClass('status');
+    } else {
+      $('#locUsedMsg', $form).text(' ').removeClass('status');
+    }
+  }
+});
 {/literal}
 </script>
 {/if}