ソースを参照

Updated Chado Node code to be aware of default vocabs and further developed the default vocab form so that they can be changed

Lacey Sanderson 11 年 前
コミット
0aa9fbf9f1

+ 66 - 45
tripal_core/api/tripal_core.chado_nodes.properties.api.inc

@@ -105,12 +105,12 @@
  * @param $form_state
  *   The corresponding form_state array for the form
  * @param $details
- *   An array defining details used by this form. 
+ *   An array defining details used by this form.
  *   Required keys that are always required:
  *     - property_table: the name of the property table (e.g.: featureprop, stockprop, etc.)
  *   Required keys for forms that update a record.
  *     - chado_id: the id of the record to which properties will be associated (e.g.: if a
- *       feature has a feature_id of 999 and we want to associate properties for that feature 
+ *       feature has a feature_id of 999 and we want to associate properties for that feature
  *       then the chado_id option should be 999)
  *   Require ONE of the following to identify the controlled vocabulary containing the properties to use:
  *     - cv_id: the unique key from the cv table
@@ -124,7 +124,7 @@
  *       to the default instructions
  *     - fieldset_title: An alternate name for the fieldset in which the properties
  *       form is placed. By default the title is 'Properties'.
- *     - default_properties:  An array of properties used to initialize the 
+ *     - default_properties:  An array of properties used to initialize the
  *       properties form.  Each property shoudl be represented as an array with
  *       the following keys and values:
  *          'cvterm':    The cvterm object for the property type
@@ -132,7 +132,7 @@
  *     - select_options: an array of terms to use for the drop down select box.
  *       this array will be used rather than populating the drop down with terms
  *       from the named vocabulary.  The array must have keys with the cvterm_id
- *       and values with the cvterm name. 
+ *       and values with the cvterm name.
  *
  * @ingroup tripal_chado_node_api
  */
@@ -156,17 +156,17 @@ function chado_add_node_form_properties(&$form, &$form_state, $details) {
       array());
     return;
   }
-  
+
   // make sure the property table exists before proceeding.
   if (!chado_table_exists($details['property_table'])) {
-    drupal_set_message("Cannot add property elements to the form. The property table, '" . 
+    drupal_set_message("Cannot add property elements to the form. The property table, '" .
       $details['property_table'] . "', does not exists", "error");
-    tripal_report_error('tcprops_form', TRIPAL_ERROR, 
-     "Cannot add property elements to the form. The property table, '%name', cannot be found.", 
+    tripal_report_error('tcprops_form', TRIPAL_ERROR,
+     "Cannot add property elements to the form. The property table, '%name', cannot be found.",
       array('%name' => $details['property_table']));
     return;
   }
-  
+
   // if the chado_id_field is not specified then set it using the
   // typical chado naming scheme
   if (!array_key_exists('chado_id_field', $details)) {
@@ -174,7 +174,7 @@ function chado_add_node_form_properties(&$form, &$form_state, $details) {
     $chado_id_field = $chado_id_table . '_id';
     $details['chado_id_field'] = $chado_id_field;
   }
-  
+
   // make sure the specified cv exists
   if (isset($details['cv_name'])) {
     // make sure the cv_name is real
@@ -182,8 +182,8 @@ function chado_add_node_form_properties(&$form, &$form_state, $details) {
     if (count($result) == 0) {
       drupal_set_message("Cannot add property elements to the form. The CV name, '" .
         $details['cv_name'] . "', does not exists", "error");
-      tripal_report_error('tcprops_form', TRIPAL_ERROR, 
-        "Cannot add property elements to the form. The CV named, '%name', cannot be found.", 
+      tripal_report_error('tcprops_form', TRIPAL_ERROR,
+        "Cannot add property elements to the form. The CV named, '%name', cannot be found.",
         array('%name' => $details['cv_name']));
       return;
     }
@@ -196,8 +196,8 @@ function chado_add_node_form_properties(&$form, &$form_state, $details) {
     if (count($result) == 0) {
       drupal_set_message("Cannot add property elements to the form. The CV ID, '" .
         $details['cv_id'] . "', does not exist", "error");
-      tripal_report_error('tcprops_form', TRIPAL_ERROR, 
-        "Cannot add property elements to the form. The CV ID, '%id', cannot be found.", 
+      tripal_report_error('tcprops_form', TRIPAL_ERROR,
+        "Cannot add property elements to the form. The CV ID, '%id', cannot be found.",
         array('%id' => $details['cv_id']));
       return;
     }
@@ -205,26 +205,47 @@ function chado_add_node_form_properties(&$form, &$form_state, $details) {
     $details['cv_name'] = $result[0]->name;
   }
   else {
-    drupal_set_message("Please provide either a 'cv_name' or 'cv_id' as an 
-      option for adding properties to the form", "error");
-    tripal_report_error('tcprops_form', TRIPAL_ERROR, 
-      "Please provide either a 'cv_name' or 'cv_id' as an option for adding properties to the form", 
-      array());
+
+    // If we didn't get given a cv identifier, then try retrieving the default one
+    // using the new cv defaults api
+    $default_cv = tripal_get_default_cv($details['property_table'], 'type_id');
+    if (!empty($default_cv)) {
+      $details['cv_id'] = $default_cv->cv_id;
+      $details['cv_name'] = $default_cv->name;
+    }
+    else {
+
+      $default_form_link = l('vocabulary defaults configuration page',
+          'admin/tripal/chado/tripal_cv/defaults',
+          array('attributes' => array('target' => '_blank')));
+      $message = "There is not a default vocabulary set for Property Types. Please set one using the $default_form_link.";
+
+      if (preg_match('/(\w+)_id/',$details['chado_id_field'],$matches)) {
+        $table = $matches[1];
+        $table = ucwords(str_replace('_',' ',$table));
+        $message = "There is not a default vocabulary set for $table Property Types. Please set one using the  $default_form_link.";
+      }
+
+      tripal_set_message($message, TRIPAL_WARNING);
+      tripal_report_error('tcprops_form', TRIPAL_ERROR,
+        "Please provide either a 'cv_name' or 'cv_id' as an option for adding properties to the form",
+        array());
+    }
     return;
   }
 
   // Get property types for the select list. If the user has provided a set
-  // then use those, otherwise get them from the cvterm table for specified cv. 
-  if (isset($details['select_options']) and 
-      is_array($details['select_options']) and 
+  // then use those, otherwise get them from the cvterm table for specified cv.
+  if (isset($details['select_options']) and
+      is_array($details['select_options']) and
       count($details['select_options']) > 0) {
     $property_options = $details['select_options'];
   }
   // if the select options are not provided then try to get them on our own
   else {
-    
+
     // if the vocabulary name is provided in the details then use that to
-    // get the terms 
+    // get the terms
     if (isset($details['cv_name'])) {
       $property_options = array();
       $property_options[] = 'Select a Property';
@@ -241,9 +262,9 @@ function chado_add_node_form_properties(&$form, &$form_state, $details) {
       while ($prop = $prop_types->fetchObject()) {
         $property_options[$prop->cvterm_id] = $prop->name;
       }
-    } 
+    }
     // if the cv_id is set in the $details array then use that to get the terms
-    elseif (isset($details['cv_id'])) {      
+    elseif (isset($details['cv_id'])) {
       $property_options = array();
       $property_options[] = 'Select a Property';
       $sql = "
@@ -296,7 +317,7 @@ function chado_add_node_form_properties(&$form, &$form_state, $details) {
     '#type' => 'fieldset',
     '#title' => t($details['fieldset_title']),
     '#description' => t('Add properties by selecting a type
-      from the dropdown, enter a value and click the "Add" button. To 
+      from the dropdown, enter a value and click the "Add" button. To
       remove a property, click the remove button.' . $details['additional_instructions']),
     '#prefix' => "<div id='properties-fieldset'>",
     '#suffix' => '</div>',
@@ -325,8 +346,8 @@ function chado_add_node_form_properties(&$form, &$form_state, $details) {
   );
 
   /* Properties can come to us in two ways:
-   * 1) As entries in the $details['default_properties'] option 
-   * 
+   * 1) As entries in the $details['default_properties'] option
+   *
    * 2) In the form state in the $form_state['chado_properties']. Data is in this field
    *    when an AJAX call updates the form state or a validation error.
    *
@@ -340,34 +361,34 @@ function chado_add_node_form_properties(&$form, &$form_state, $details) {
   }
   else {
     $ranks = array(); // a temporary array used for calculating rank
-    
+
     // build the SQL for extracting properties already assigned to this record
     $sql_args = array();
     $sql_args[':chado_id'] = $details['chado_id'];
     if (array_key_exists('cv_name', $details)) {
       $cv_where = "CV.name = :cvname";
       $sql_args[':cvname'] = $details['cv_name'];
-    } 
+    }
     elseif (array_key_exists('cv_id', $details)) {
       $cv_where = "CV.cv_id = :cvid";
       $sql_args[':cvid'] = $details['cv_id'];
     }
     $existing_properties = chado_query(
-      "SELECT 
-         PP.".$details['property_table']."_id property_id, 
-         CVT.cvterm_id as type_id, 
-         CVT.name as type_name, 
-         CVT.definition, 
-         PP.value, 
+      "SELECT
+         PP.".$details['property_table']."_id property_id,
+         CVT.cvterm_id as type_id,
+         CVT.name as type_name,
+         CVT.definition,
+         PP.value,
          PP.rank
        FROM {" . $details['property_table'] . "} PP
          INNER JOIN {cvterm} CVT ON CVT.cvterm_id = PP.type_id
          INNER JOIN {cv} CV      ON CVT.cv_id     = CV.cv_id
        WHERE
          PP." . $details['chado_id_field'] . " = :chado_id AND
-         $cv_where 
+         $cv_where
        ORDER BY CVT.name, PP.rank", $sql_args)->fetchAll();
-    
+
     // iterate through the results and get the largest rank for each type
     foreach ($existing_properties as $property) {
       if (array_key_exists($property->type_id, $ranks)) {
@@ -379,10 +400,10 @@ function chado_add_node_form_properties(&$form, &$form_state, $details) {
         $ranks[$property->type_id] = $property->rank;
       }
     }
-    
+
     // next add in any default properties
     if (array_key_exists('default_properties', $details)) {
-    
+
       // next iterate through each of the default properties and create a new
       // stdClass array that contains the fields needed.
       foreach ($details['default_properties'] as $property) {
@@ -393,7 +414,7 @@ function chado_add_node_form_properties(&$form, &$form_state, $details) {
         $new_prop->value       = $property['value'];
         $new_prop->property_id = NULL;
         // to set the rank for this property, we need to make sure we set
-        // it greater than any already existing rank 
+        // it greater than any already existing rank
         if (array_key_exists($property['cvterm']->cvterm_id, $ranks)) {
           $ranks[$property['cvterm']->cvterm_id]++;
         }
@@ -514,7 +535,7 @@ function chado_add_node_form_properties(&$form, &$form_state, $details) {
     '#suffix' => '</span>'
   );
 
-  // get the value selected (only works on AJAX call) and print the 
+  // get the value selected (only works on AJAX call) and print the
   // description
   $type_desc = '';
   if (isset($form_state['input']['property_table']['new']['type'])) {
@@ -638,7 +659,7 @@ function chado_add_node_form_properties_add_button_submit(&$form, &$form_state)
 
   $key = $property['type_id'] . '-' . $property['rank'];
   $form_state['chado_properties'][$key] = (object) $property;
-  
+
   // we don't want the new element to pick up the values from the previous element so wipe them out
   unset($form_state['input']['property_table']['new']['type']);
   unset($form_state['input']['property_table']['new']['type_name']);
@@ -774,7 +795,7 @@ function theme_chado_add_node_form_properties($variables) {
       }
     }
   }
-  
+
   return theme('table', array(
     'header' => $header,
     'rows' => $rows

+ 27 - 9
tripal_core/api/tripal_core.chado_nodes.relationships.api.inc

@@ -134,7 +134,7 @@ function chado_add_node_form_relationships(&$form, &$form_state, $details) {
       The relationship table, '%name', cannot be found.", array('%name' => $details['relationship_table']));
     return;
   }
-  
+
   // make sure the specified cv exists
   if (isset($details['cv_name'])) {
     // make sure the cv_name is real
@@ -163,13 +163,31 @@ function chado_add_node_form_relationships(&$form, &$form_state, $details) {
     $details['cv_name'] = $result[0]->name;
   }
   else {
-    drupal_set_message("Please provide either a 'cv_name' or 'cv_id' as an
-        option for adding relationship to the form", "error");
-    tripal_report_error('tcprops_form', TRIPAL_ERROR, "Please provide either a
+
+    // If we didn't get given a cv identifier, then try retrieving the default one
+    // using the new cv defaults api
+    $default_cv = tripal_get_default_cv($details['relationship_table'], 'type_id');
+    if (!empty($default_cv)) {
+      $details['cv_id'] = $default_cv->cv_id;
+      $details['cv_name'] = $default_cv->name;
+    }
+    else {
+
+      $default_form_link = l('vocabulary defaults configuration page',
+          'admin/tripal/chado/tripal_cv/defaults',
+          array('attributes' => array('target' => '_blank')));
+
+      $table = ucwords(str_replace('_',' ',$details['base_table']));
+      $message = "There is not a default vocabulary set for $table Releationship Types. Please set one using the  $default_form_link.";
+
+      tripal_set_message($message, TRIPAL_WARNING);
+      tripal_report_error('tcprops_form', TRIPAL_ERROR, "Please provide either a
         'cv_name' or 'cv_id' as an option for adding relationship to the form", array());
+    }
+
     return;
   }
-  
+
   $form_state['rebuild'] = TRUE;
 
   // Set Defaults for optional fields
@@ -207,7 +225,7 @@ function chado_add_node_form_relationships(&$form, &$form_state, $details) {
         $type_options[$prop->cvterm_id] = $prop->name;
         $details['cv_id'] = $prop->cv_id;
       }
-    } 
+    }
     elseif (isset($details['cv_id'])) {
       $type_options = array();
       $type_options[] = 'Select a Property';
@@ -621,7 +639,7 @@ function chado_add_node_form_relationships_add_button_submit(&$form, &$form_stat
 
 
 
-  
+
   // get details for the new relationship
   if ($form_state['values']['relationship_table']['new']['subject_is_current']) {
     $relationship = array(
@@ -651,14 +669,14 @@ function chado_add_node_form_relationships_add_button_submit(&$form, &$form_stat
     unset($form_state['input']['relationship_table']['new']['subject_id']);
     unset($form_state['input']['relationship_table']['new']['subject_name']);
   }
-  
+
   $key = $relationship['type_id'] . '-' . $relationship['rank'];
   $form_state['chado_relationships'][$key] = (object) $relationship;
 
   // we don't want the new element to pick up the values from the previous element so wipe them out
   unset($form_state['input']['relationship_table']['new']['type_id']);
   unset($form_state['input']['relationship_table']['new']['type_name']);
-  
+
   $form_state['rebuild'] = TRUE;
 }
 

+ 19 - 11
tripal_cv/api/tripal_cv.api.inc

@@ -987,10 +987,15 @@ function tripal_associate_cvterm($basetable, $record_id, $cvterm) {
  * @return
  *   TRUE if set, FALSE if an error occured
  */
-function tripal_set_default_cv($table, $field, $cv_name) {
+function tripal_set_default_cv($table, $field, $cv_name, $cv_id = FALSE) {
 
-  // make sure the cv_id is valid
-  $cv = tripal_get_cv(array('name' => $cv_name));
+  // Get the CV object
+  if ($cv_id) {
+    $cv = tripal_get_cv(array('cv_id' => $cv_id));
+  }
+  else {
+    $cv = tripal_get_cv(array('name' => $cv_name));
+  }
 
   if ($cv) {
     // first delete any entries for this table and field
@@ -1075,6 +1080,16 @@ function tripal_get_cvterm_default_select_options($table, $field, $field_desc) {
 
   if ($default_cv) {
     $options = tripal_get_cvterm_select_options($default_cv->cv_id);
+
+    if (count($options) == 0) {
+      tripal_set_message('There are no ' . $field_desc . '. Please ' .
+        l('add terms',
+          'admin/tripal/chado/tripal_cv/cv/' .$default_cv->cv_id. '/cvterm/add',
+           array('attributes' => array('target' => '_blank'))) . ' to the ' .
+        $default_cv->name .' vocabulary.',
+        TRIPAL_WARNING);
+    }
+
   }
   else {
     tripal_set_message('There is not a default vocabulary set for ' . $field_desc . '. '.
@@ -1084,13 +1099,6 @@ function tripal_get_cvterm_default_select_options($table, $field, $field_desc) {
         array('attributes' => array('target' => '_blank'))) . '.',
       TRIPAL_WARNING);
   }
-  if (count($options) == 0) {
-    tripal_set_message('There are no ' . $field_desc . '. Please ' .
-      l('add terms',
-        'admin/tripal/chado/tripal_cv/cv/' .$default_cv->cv_id. '/cvterm/add',
-         array('attributes' => array('target' => '_blank'))) . ' to the ' .
-      $default_cv->name .' vocabulary.',
-      TRIPAL_WARNING);
-  }
+
   return $options;
 }

+ 99 - 52
tripal_cv/includes/tripal_cv.admin.inc

@@ -46,11 +46,10 @@ function tripal_cv_admin_cv_listing() {
 }
 
 /**
- * 
+ *
  */
-function tripal_cv_admin_set_defaults_form() {
-  $form = array();
-  
+function tripal_cv_admin_set_defaults_form($form, $form_state) {
+
   $form['instructions'] = array(
     '#markup' => t('Much of the data housed in Chado is typed, meaning that a ' .
         'controlled vocabulary describes what type of data the record is. For example, '.
@@ -60,20 +59,20 @@ function tripal_cv_admin_set_defaults_form() {
         'Chado that requires a type from a vocabulary. By default, autocomplete fields, '.
         'type select boxes and type validation occur using the default vocabularies set below. '),
   );
-  
+
   // get the list of all tables that use the cvterm table as an FK
   $cvterm_schema = chado_get_schema('cvterm');
   $referring_tables = $cvterm_schema['referring_tables'];
-  
+
   // get the list of tables that already have default set
   $cv_defaults = db_select('tripal_cv_defaults', 'TCD')
     ->fields('TCD', array('cv_default_id', 'table_name', 'field_name', 'cv_id'))
     ->orderBy('table_name', 'ASC')
     ->execute();
-  
+
   // get the list of vocabularies
   $cvs = tripal_get_cv_select_options();
-  
+
   $form['settings'] = array(
     '#type' => 'fieldset',
     '#title' => t('Configured Defaults'),
@@ -83,83 +82,131 @@ function tripal_cv_admin_set_defaults_form() {
   foreach ($cv_defaults as $cv_default) {
     $cv_default_id = $cv_default->cv_default_id;
     $cv = tripal_get_cv(array('cv_id' => $cv_default->cv_id));
+
     $form['settings']['existing'][$cv_default_id]["id"] = array(
       '#type' => 'hidden',
       '#value' => $cv_default_id,
     );
-    $form['settings']['existing'][$cv_default_id]["table_name"] = array(
+
+    // Display
+    $form['settings']['existing'][$cv_default_id]["table_name-display"] = array(
       '#type' => 'markup',
       '#markup' => $cv_default->table_name
     );
-    $form['settings']['existing'][$cv_default_id]["field_name"] = array(
+    $form['settings']['existing'][$cv_default_id]["field_name-display"] = array(
       '#type' => 'markup',
       '#markup' => $cv_default->field_name
     );
+
+    // Save for use in submit
+    $form['settings']['existing'][$cv_default_id]["table_name"] = array(
+      '#type' => 'hidden',
+      '#value' => $cv_default->table_name
+    );
+    $form['settings']['existing'][$cv_default_id]["field_name"] = array(
+      '#type' => 'hidden',
+      '#value' => $cv_default->field_name
+    );
+
+    // Selectbox to set the vocabulary
+    if (!empty($cv)) {
+      $default_cv = $cv_default->cv_id;
+    }
+    else {
+      $cvs[0] = 'NONE SET';
+      $default_cv = 0;
+    }
     $form['settings']['existing'][$cv_default_id]["vocabulary"] = array(
       '#type' => 'select',
       '#options' => $cvs,
-      '#default_value' => $cv_default->cv_id,
-      '#suffix' => '<a target="_blank" href="'. url('admin/tripal/chado/tripal_cv/cvterms') . '?cv=' . $cv->name . '">View terms</a>'
+      '#default_value' => $default_cv,
+    );
+
+    // Actions
+    $view_terms = l('New Vocabulary', 'admin/tripal/chado/tripal_cv/cv/add');
+    $add_term = '';
+    if (!empty($cv)) {
+      $view_terms = l(
+        'View Terms',
+        'admin/tripal/chado/tripal_cv/cvterms',
+        array('query' => array('cv' => $cv->name))
+      );
+
+      $add_term = l(
+        'Add Term',
+        'admin/tripal/chado/tripal_cv/cv/' . $cv->cv_id . '/cvterm/add'
+      );
+    }
+    $form['settings']['existing'][$cv_default_id]["view-terms"] = array(
+      '#type' => 'markup',
+      '#markup' => $view_terms
     );
-    // remove button
-    $form['settings']['existing'][$cv_default_id]['remove'] = array(
-      '#type' => 'submit',
-      '#value' => t('Remove'),
-      '#name' => "cv_remove-$cv_default_id",
-      '#ajax' => array(
-        'callback' => "tripal_cv_admin_set_defaults_ajax_update",
-        'wrapper' => 'tripal-generic-edit-properties-table',
-        'effect'   => 'fade',
-        'method'   => 'replace',
-        'prevent'  => 'click'
-      ),
-      // When this button is clicked, the form will be validated and submitted.
-      // Therefore, we set custom submit and validate functions to override the
-      // default node form submit.  In the validate function we validate only the
-      // property fields and in the submit we remove the indicated property
-      // from the chado_properties array. In order to keep validate errors
-      // from the node form validate and Drupal required errors for non-property fields
-      // preventing the user from removing properties we set the #limit_validation_errors below
-      '#validate' => array('chado_add_node_form_properties_remove_button_validate'),
-      '#submit' => array('chado_add_node_form_properties_remove_button_submit'),
-      // Limit the validation of the form upon clicking this button to the property_table tree
-      // No other fields will be validated (ie: no fields from the main form or any other api
-      // added form).
-      '#limit_validation_errors' => array(
-        array('property_table')  // Validate all fields within $form_state['values']['property_table']
-      )
+    $form['settings']['existing'][$cv_default_id]["add-new-term"] = array(
+      '#type' => 'markup',
+      '#markup' => $add_term
     );
+
   }
-  
+
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => 'Update Defaults'
+  );
+
   return $form;
 }
 
+function tripal_cv_admin_set_defaults_form_submit($form, $form_state) {
+
+  foreach ($form_state['values']['settings']['existing'] as $default_cv) {
+    if (!empty($default_cv['vocabulary'])) {
+      tripal_set_default_cv(
+        $default_cv['table_name'],
+        $default_cv['field_name'],
+        '', // We are passing in the cv_id so we don't need the name
+        $default_cv['vocabulary']
+      );
+    }
+  }
+
+}
+
 /**
- * 
+ *
  * @param unknown $variables
  */
 function theme_tripal_cv_admin_set_defaults_form($variables) {
   $element = $variables['element'];
 
   $header = array(
-    'table_name'      => array('data' => t('Table Name'),      'width' => '20%'),
-    'field_name'      => array('data' => t('Field Name'),      'width' => '20%'),
-    'vocabulary'      => array('data' => t('Default Vocabulary'), 'width' => '40%'),
-    'property_action' => array('data' => t('Actions'),    'width' => '20%'),
+    'table_name'      => array('data' => t('Table Name'),         'width' => '20%'),
+    'field_name'      => array('data' => t('Field Name'),         'width' => '20%'),
+    'vocabulary'      => array('data' => t('Default Vocabulary'), 'width' => '30%'),
+    'actions'         => array('data' => t('Actions'),            'width' => '30%'),
   );
 
   $rows = array();
-  
+
   foreach ($element['settings']['existing'] as $key => $value) {
     if (is_numeric($key)) {
+
+      $action_links = '<ul class="links inline">';
+      if (!empty($value['view-terms'])) {
+        $action_links .= '<li>' . drupal_render($value['view-terms']) . '</li>';
+      }
+      if (!empty($value['add-new-term'])) {
+        $action_links .= '<li>' . drupal_render($value['add-new-term']) . '</li>';
+      }
+      $action_links .= '</li></ul>';
+
       $rows[] = array(
-        drupal_render($value['table_name']),
-        drupal_render($value['field_name']),
+        drupal_render($value['table_name-display']),
+        drupal_render($value['field_name-display']),
         drupal_render($value['vocabulary']),
-        drupal_render($value['remove']),
+        $action_links
       );
     }
-  } 
+  }
   $settings_table = theme('table', array(
     'header' => $header,
     'rows' => $rows
@@ -168,7 +215,7 @@ function theme_tripal_cv_admin_set_defaults_form($variables) {
     '#type' => 'markup',
     '#markup' => $settings_table,
   );
-  
+
   return drupal_render_children($element);
-  
+
 }