Quellcode durchsuchen

Worked on linker_relationship field. Moved some views API functions out of legacy. Updated the widget_form arguments for the TripalField class. Added the CV Defaults admin page

Stephen Ficklin vor 10 Jahren
Ursprung
Commit
29a016cd4a
33 geänderte Dateien mit 1329 neuen und 1059 gelöschten Zeilen
  1. 0 320
      legacy/tripal_cv/includes/tripal_cv.admin.inc
  2. 0 14
      legacy/tripal_cv/tripal_cv.module
  3. 0 447
      legacy/tripal_cv/tripal_cv.views_default.inc
  4. 0 213
      legacy/tripal_views/api/tripal_views.api.inc
  5. 2 1
      tripal/includes/TripalField.inc
  6. 1 1
      tripal/includes/TripalFieldQuery.inc
  7. 4 0
      tripal/includes/tripal.entity.inc
  8. 8 1
      tripal_chado/api/modules/tripal_chado.cv.api.inc
  9. 35 0
      tripal_chado/api/modules/tripal_chado.feature.api.inc
  10. 224 0
      tripal_chado/api/tripal_chado.views.api.inc
  11. 6 6
      tripal_chado/includes/fields/chado_base__dbxref_id.inc
  12. 1 1
      tripal_chado/includes/fields/chado_base__organism_id.inc
  13. 3 1
      tripal_chado/includes/fields/chado_feature__md5checksum.inc
  14. 2 1
      tripal_chado/includes/fields/chado_feature__residues.inc
  15. 2 1
      tripal_chado/includes/fields/chado_feature__seqlen.inc
  16. 2 1
      tripal_chado/includes/fields/chado_gene__transcripts.inc
  17. 1 1
      tripal_chado/includes/fields/chado_linker__contact.inc
  18. 1 1
      tripal_chado/includes/fields/chado_linker__cvterm.inc
  19. 1 1
      tripal_chado/includes/fields/chado_linker__cvterm_adder.inc
  20. 1 1
      tripal_chado/includes/fields/chado_linker__dbxref.inc
  21. 1 1
      tripal_chado/includes/fields/chado_linker__expression.inc
  22. 2 1
      tripal_chado/includes/fields/chado_linker__featureloc.inc
  23. 1 1
      tripal_chado/includes/fields/chado_linker__genotype.inc
  24. 1 1
      tripal_chado/includes/fields/chado_linker__phenotype.inc
  25. 2 2
      tripal_chado/includes/fields/chado_linker__pub.inc
  26. 212 33
      tripal_chado/includes/fields/chado_linker__relationship.inc
  27. 2 2
      tripal_chado/includes/fields/chado_linker__synonym.inc
  28. 1 1
      tripal_chado/includes/fields/chado_organism__type_id.inc
  29. 321 0
      tripal_chado/includes/tripal_chado.cv_defaults.inc
  30. 1 0
      tripal_chado/includes/tripal_chado.field_storage.inc
  31. 6 1
      tripal_chado/theme/css/tripal_chado.css
  32. 30 0
      tripal_chado/tripal_chado.module
  33. 455 4
      tripal_chado/tripal_chado.views_default.inc

+ 0 - 320
legacy/tripal_cv/includes/tripal_cv.admin.inc

@@ -4,323 +4,3 @@
  * Provides administration of controlled vocabularies & their terms.
  */
 
-/**
- * Provide landing page to the new admin pages
- *
- * @ingroup tripal_cv
- */
-function tripal_cv_admin_cv_listing() {
-  $output = '';
-
-  // set the breadcrumb
-  $breadcrumb = array();
-  $breadcrumb[] = l('Home', '<front>');
-  $breadcrumb[] = l('Administration', 'admin');
-  $breadcrumb[] = l('Tripal', 'admin/tripal');
-  $breadcrumb[] = l('Chado Modules', 'admin/tripal/chado');
-  $breadcrumb[] = l('Vocabularies', 'admin/tripal/vocab');
-  drupal_set_breadcrumb($breadcrumb);
-
-  // Add the view
-  $cvs_view = views_embed_view('tripal_cv_admin_cvs','default');
-  $cvterms_view = views_embed_view('tripal_cv_admin_cvterms','default');
-  if (isset($cvs_view) && isset($cvterms_view)) {
-    $output .= $cvs_view;
-  }
-  else {
-    $output .= '<p>The Tripal Controlled Vocabulary module uses primarily views to provide an '
-      . 'administrative interface. Currently one or more views needed for this '
-      . 'administrative interface are disabled. <strong>Click each of the following links to '
-      . 'enable the pertinent views</strong>:</p>';
-    $output .= '<ul>';
-    if (!isset($cvs_view)) {
-      $output .= '<li>'.l('Tripal Vocabularies', 'admin/tripal/vocab/views/cvs/enable').'</li>';
-    }
-    if (!isset($cvterm_view)) {
-      $output .= '<li>'.l('Tripal Vocabulary Terms', 'admin/tripal/vocab/views/cvterms/enable').'</li>';
-    }
-    $output .= '</ul>';
-  }
-
-  return $output;
-}
-
-/**
- *
- */
-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, '.
-        'a feature must have a "type" which is typically a term from ' .
-        'the Sequence Ontology. Record properties typically have a type as well. '.
-        'Tripal allows the administrator to set a default type for each table in '.
-        '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'),
-    '#description' => t('The following tables have a default vocabulary'),
-    '#tree' => TRUE,
-  );
-  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,
-    );
-
-    // 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-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' => $default_cv,
-    );
-
-    // Actions
-    $view_terms = l('New Vocabulary', 'admin/tripal/vocab/cv/add');
-    $add_term = '';
-    if (!empty($cv)) {
-      $view_terms = l(
-        'View Terms',
-        'admin/tripal/vocab/cvterms',
-        array('query' => array('cv' => $cv->name))
-      );
-
-      $add_term = l(
-        'Add Term',
-        'admin/tripal/vocab/cv/' . $cv->cv_id . '/cvterm/add'
-      );
-    }
-    $form['settings']['existing'][$cv_default_id]["view-terms"] = array(
-      '#type' => 'markup',
-      '#markup' => $view_terms
-    );
-    $form['settings']['existing'][$cv_default_id]["add-new-term"] = array(
-      '#type' => 'markup',
-      '#markup' => $add_term
-    );
-
-  }
-
-  $form['settings']['submit'] = array(
-    '#type' => 'submit',
-    '#value' => 'Update Defaults'
-  );
-
-  // Adding new CV Defaults
-  $form['new'] = array(
-    '#type' => 'fieldset',
-    '#title' => 'Add New Defaults',
-    '#description' => 'You can use the form below to add a default controlled vocabulary
-      for a table/field combination not available in the "Configured Defaults" section above.',
-    '#collapsible' => TRUE,
-    '#collapsed' => TRUE,
-    '#tree' => TRUE,
-    '#prefix' => '<div id="new-default">',
-    '#suffix' => '</div>',
-  );
-
-  $tripal_msg = tripal_set_message(
-    'If you are developing a custom module and would like to use the Default Controlled
-      Vocabulary API to flexibly set the controlled vocabulary, then it is better to set
-      the default programatically rather than through this interface. To do this <ol>
-        <li>Tell Tripal about the table/field you would like to set the default for. This
-          is done by implementing hook_install() in your modules .install file and adding
-          a call to <code>tripal_set_default_cv([table name], [field name], [cv name])</code> which
-          will set the default for <code>[table name].[field name]</code> to the <code>[cv name]</code> controlled
-          vocabulary. This vocabulary must already exist.</li>
-        <li>Then everywhere in your module that you need to know the controlled vocabulary,
-          you call <code>tripal_get_default_cv([table name], [field name])</code> which will return
-          an object describing the set default controlled vocabulary or call
-          <code>tripal_get_cvterm_default_select_options([table name], [field name], [field friendly name])</code>
-          if you would like an array of options for use in a select or autocomplete form element.</li></ol>
-      ',
-    TRIPAL_NOTICE,
-    array('return_html' => TRUE)
-  );
-
-  $form['new']['instructions'] = array(
-    '#type' => 'markup',
-    '#markup' => $tripal_msg
-  );
-
-  $chado_tables = chado_get_table_names(TRUE);
-  $chado_tables[0] = 'Select a Table';
-  $form['new']['table'] = array(
-    '#type' => 'select',
-    '#title' => 'Table Name',
-    '#description' => 'The name of the table you would like to set a controlled vocabulary default for.',
-    '#options' => $chado_tables,
-    '#default_value' => 0,
-    '#ajax' => array(
-      'callback' => 'tripal_cv_admin_ajax_new_default_field_callback',
-      'wrapper' => 'new-default',
-    )
-  );
-
-  $table = (isset($form_state['values']['new']['table']))? $form_state['values']['new']['table'] : FALSE;
-  $columns = array('Select a Field');
-  if ($table) {
-    // get the table description
-    $table_desc = chado_get_schema($table);
-    if (isset($table_desc['foreign keys']['cvterm'])) {
-      foreach ($table_desc['foreign keys']['cvterm']['columns'] as $left_column => $right_column) {
-        $columns[$left_column] = $left_column;
-      }
-    }
-  }
-  $form['new']['field'] = array(
-    '#type' => 'select',
-    '#title' => 'Field Name',
-    '#description' => 'The name of the field you would like to set a controlled vocabulary default for.',
-    '#options' => $columns,
-    '#default_value' => 0
-  );
-
-  $cvs[0] = 'Select a Vocabulary';
-  $form['new']['vocabulary'] = array(
-    '#type' => 'select',
-    '#title' => 'Vocabulary',
-    '#description' => 'The default controlled vocabulary you would like to set for this field.',
-    '#options' => $cvs,
-    '#default_value' => 0
-  );
-
-  $form['new']['add_new'] = array(
-    '#type' => 'submit',
-    '#value' => 'Set New Default'
-  );
-
-  return $form;
-}
-
-function tripal_cv_admin_set_defaults_form_submit($form, $form_state) {
-
-  if ($form_state['triggering_element']['#value'] == 'Update Defaults') {
-    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']
-        );
-      }
-    }
-  }
-
-  if ($form_state['triggering_element']['#value'] == 'Set New Default') {
-    if (!empty($form_state['values']['new']['vocabulary'])) {
-      tripal_set_default_cv(
-        $form_state['values']['new']['table'],
-        $form_state['values']['new']['field'],
-        '', // We are passing in the cv_id so we don't need the name
-        $form_state['values']['new']['vocabulary']
-      );
-    }
-  }
-}
-
-function tripal_cv_admin_ajax_new_default_field_callback($form, $form_state) {
-  return $form['new'];
-}
-
-/**
- *
- * @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' => '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-display']),
-        drupal_render($value['field_name-display']),
-        drupal_render($value['vocabulary']),
-        $action_links
-      );
-    }
-  }
-  $settings_table = theme('table', array(
-    'header' => $header,
-    'rows' => $rows
-  ));
-  $element['settings']['existing'] = array(
-    '#type' => 'markup',
-    '#markup' => $settings_table,
-  );
-
-  // TODO: I believe rendering of the form should not happen here. But rather
-  // the form should be returned as is. This way other modules can have access
-  // to the form elements via the hook_form_alter.  Rather, there should
-  // be a theme function for the form where the rendering in the table
-  // should occur.  See the tripal_pub_importer_setup_form() for an exmaple.
-  return drupal_render_children($element);
-
-}

+ 0 - 14
legacy/tripal_cv/tripal_cv.module

@@ -49,15 +49,6 @@ function tripal_cv_menu() {
     'weight' => 2,
   );
 
-  $items['admin/tripal/vocab/defaults'] = array(
-    'title' => 'Defaults',
-    'description' => 'Set the default vocabularies for properties and relationships.',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('tripal_cv_admin_set_defaults_form'),
-    'access arguments' => array('administer controlled vocabularies'),
-    'type' => MENU_LOCAL_TASK,
-    'weight' => 5
-  );
 
   $items['admin/tripal/vocab/help'] = array(
     'title' => 'Help',
@@ -283,11 +274,6 @@ function tripal_cv_theme($existing, $type, $theme, $path) {
       'variables' =>  array(NULL),
       'path' => "$path/theme/templates"
     ),
-    // Default CV form
-    'tripal_cv_admin_set_defaults_form' => array(
-      'function' => 'theme_tripal_cv_admin_set_defaults_form',
-      'render element' => 'element',
-    ),
   );
 
   return $items;

+ 0 - 447
legacy/tripal_cv/tripal_cv.views_default.inc

@@ -12,454 +12,7 @@
 function tripal_cv_views_default_views() {
   $views = array();
 
-  // Default Tripal Admin View: CVs
-  $view = tripal_cv_defaultview_admin_cvs_listing();
-  $view = tripal_make_view_compatible_with_external($view);
-  $views[$view->name] = $view;
-
-  // Default Tripal Admin View: CV Terms
-  $view = tripal_cv_defaultview_admin_cvterms_listing();
-  $view = tripal_make_view_compatible_with_external($view);
-  $views[$view->name] = $view;
-
   return $views;
 }
 
-/**
- * Default Admin View for cv management
- *
- * @ingroup tripal_cv
- */
-function tripal_cv_defaultview_admin_cvs_listing() {
-
-  $view = new view();
-  $view->name = 'tripal_cv_admin_cvs';
-  $view->description = 'DO NOT DISABLE';
-  $view->tag = 'tripal admin';
-  $view->base_table = 'cv';
-  $view->human_name = 'CVs Admin';
-  $view->core = 6;
-  $view->api_version = '3.0';
-  $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
-
-  /* Display: Defaults */
-  $handler = $view->new_display('default', 'Defaults', 'default');
-  $handler->display->display_options['title'] = 'Controlled Vocabularies';
-  $handler->display->display_options['use_more_always'] = FALSE;
-  $handler->display->display_options['access']['type'] = 'perm';
-  $handler->display->display_options['access']['perm'] = 'administer controlled vocabularies';
-  $handler->display->display_options['cache']['type'] = 'none';
-  $handler->display->display_options['query']['type'] = 'views_query';
-  $handler->display->display_options['exposed_form']['type'] = 'input_required';
-  $handler->display->display_options['exposed_form']['options']['submit_button'] = 'Search';
-  $handler->display->display_options['exposed_form']['options']['text_input_required'] = 'Click search to see a listing of controlled vocabularies that meet the filter requirements. Use the filters to restrict this set to a more reasonable number of vocabularies or to find a specific vocabulary.';
-  $handler->display->display_options['exposed_form']['options']['text_input_required_format'] = 'full_html';
-  $handler->display->display_options['pager']['type'] = 'full';
-  $handler->display->display_options['pager']['options']['items_per_page'] = '25';
-  $handler->display->display_options['pager']['options']['offset'] = '0';
-  $handler->display->display_options['pager']['options']['id'] = '0';
-  $handler->display->display_options['pager']['options']['quantity'] = '9';
-  $handler->display->display_options['style_plugin'] = 'table';
-  $handler->display->display_options['style_options']['grouping'] = '';
-  $handler->display->display_options['style_options']['columns'] = array(
-    'name' => 'name',
-    'definition' => 'definition',
-    'nothing' => 'nothing',
-  );
-  $handler->display->display_options['style_options']['default'] = 'name';
-  $handler->display->display_options['style_options']['info'] = array(
-    'name' => array(
-      'sortable' => 1,
-      'separator' => '',
-    ),
-    'definition' => array(
-      'sortable' => 0,
-      'separator' => '',
-    ),
-    'nothing' => array(
-      'separator' => '',
-    ),
-  );
-/* Header: Global: Action Links */
-  $handler->display->display_options['header']['action_links_area']['id'] = 'action_links_area';
-  $handler->display->display_options['header']['action_links_area']['table'] = 'views';
-  $handler->display->display_options['header']['action_links_area']['field'] = 'action_links_area';
-  $handler->display->display_options['header']['action_links_area']['label'] = 'Action Links';
-  $handler->display->display_options['header']['action_links_area']['empty'] = TRUE;
-  $handler->display->display_options['header']['action_links_area']['link-1'] = array(
-    'label-1' => 'Add Vocabulary',
-    'path-1' => 'admin/tripal/vocab/cv/add',
-  );
-  $handler->display->display_options['header']['action_links_area']['link-2'] = array(
-    'label-2' => 'Load Ontology',
-    'path-2' => 'admin/tripal/vocab/obo_loader',
-  );
-  /* No results behavior: Global: Text area */
-  $handler->display->display_options['empty']['text']['id'] = 'area';
-  $handler->display->display_options['empty']['text']['table'] = 'views';
-  $handler->display->display_options['empty']['text']['field'] = 'area';
-  $handler->display->display_options['empty']['text']['content'] = 'No controlled vocabularies match the supplied criteria.';
-  $handler->display->display_options['empty']['text']['format'] = '2';
-  /* Field: Chado Cv: Cv Id */
-  $handler->display->display_options['fields']['cv_id']['id'] = 'cv_id';
-  $handler->display->display_options['fields']['cv_id']['table'] = 'cv';
-  $handler->display->display_options['fields']['cv_id']['field'] = 'cv_id';
-  $handler->display->display_options['fields']['cv_id']['exclude'] = TRUE;
-  $handler->display->display_options['fields']['cv_id']['separator'] = '';
-  /* Field: Chado Cv: Name */
-  $handler->display->display_options['fields']['name']['id'] = 'name';
-  $handler->display->display_options['fields']['name']['table'] = 'cv';
-  $handler->display->display_options['fields']['name']['field'] = 'name';
-  /* Field: Chado Cv: Definition */
-  $handler->display->display_options['fields']['definition']['id'] = 'definition';
-  $handler->display->display_options['fields']['definition']['table'] = 'cv';
-  $handler->display->display_options['fields']['definition']['field'] = 'definition';
-  /* Field: Global: Custom text */
-  $handler->display->display_options['fields']['nothing_1']['id'] = 'nothing_1';
-  $handler->display->display_options['fields']['nothing_1']['table'] = 'views';
-  $handler->display->display_options['fields']['nothing_1']['field'] = 'nothing';
-  $handler->display->display_options['fields']['nothing_1']['label'] = 'Edit Link';
-  $handler->display->display_options['fields']['nothing_1']['exclude'] = TRUE;
-  $handler->display->display_options['fields']['nothing_1']['alter']['text'] = 'edit';
-  $handler->display->display_options['fields']['nothing_1']['alter']['make_link'] = TRUE;
-  $handler->display->display_options['fields']['nothing_1']['alter']['path'] = 'admin/tripal/vocab/cv/edit/[cv_id]';
-  /* Field: Global: Custom text */
-  $handler->display->display_options['fields']['nothing']['id'] = 'nothing';
-  $handler->display->display_options['fields']['nothing']['table'] = 'views';
-  $handler->display->display_options['fields']['nothing']['field'] = 'nothing';
-  $handler->display->display_options['fields']['nothing']['label'] = 'View Terms link';
-  $handler->display->display_options['fields']['nothing']['exclude'] = TRUE;
-  $handler->display->display_options['fields']['nothing']['alter']['text'] = 'View Terms';
-  $handler->display->display_options['fields']['nothing']['alter']['make_link'] = TRUE;
-  $handler->display->display_options['fields']['nothing']['alter']['path'] = 'admin/tripal/vocab/cvterms?cv=[name]';
-  $handler->display->display_options['fields']['nothing']['hide_alter_empty'] = TRUE;
-  /* Field: Global: Custom text */
-  $handler->display->display_options['fields']['nothing_3']['id'] = 'nothing_3';
-  $handler->display->display_options['fields']['nothing_3']['table'] = 'views';
-  $handler->display->display_options['fields']['nothing_3']['field'] = 'nothing';
-  $handler->display->display_options['fields']['nothing_3']['label'] = 'Add term';
-  $handler->display->display_options['fields']['nothing_3']['exclude'] = TRUE;
-  $handler->display->display_options['fields']['nothing_3']['alter']['text'] = 'Add Term';
-  $handler->display->display_options['fields']['nothing_3']['alter']['make_link'] = TRUE;
-  $handler->display->display_options['fields']['nothing_3']['alter']['path'] = 'admin/tripal/vocab/cv/[cv_id]/cvterm/add';
-  /* Field: Global: Custom text */
-  $handler->display->display_options['fields']['nothing_2']['id'] = 'nothing_2';
-  $handler->display->display_options['fields']['nothing_2']['table'] = 'views';
-  $handler->display->display_options['fields']['nothing_2']['field'] = 'nothing';
-  $handler->display->display_options['fields']['nothing_2']['label'] = '';
-  $handler->display->display_options['fields']['nothing_2']['alter']['text'] = '[nothing_1]<br />
-    [nothing]   [nothing_3]';
-  $handler->display->display_options['fields']['nothing_2']['element_class'] = 'short-column';
-  $handler->display->display_options['fields']['nothing_2']['element_label_class'] = 'short-column';
-  $handler->display->display_options['fields']['nothing_2']['element_label_colon'] = FALSE;
-  /* Sort criterion: Chado Cv: Name */
-  $handler->display->display_options['sorts']['name']['id'] = 'name';
-  $handler->display->display_options['sorts']['name']['table'] = 'cv';
-  $handler->display->display_options['sorts']['name']['field'] = 'name';
-  /* Filter criterion: Chado Cv: Name */
-  $handler->display->display_options['filters']['name']['id'] = 'name';
-  $handler->display->display_options['filters']['name']['table'] = 'cv';
-  $handler->display->display_options['filters']['name']['field'] = 'name';
-  $handler->display->display_options['filters']['name']['operator'] = 'contains';
-  $handler->display->display_options['filters']['name']['group'] = '0';
-  $handler->display->display_options['filters']['name']['exposed'] = TRUE;
-  $handler->display->display_options['filters']['name']['expose']['operator_id'] = 'name_op';
-  $handler->display->display_options['filters']['name']['expose']['label'] = 'Name Contains';
-  $handler->display->display_options['filters']['name']['expose']['operator'] = 'name_op';
-  $handler->display->display_options['filters']['name']['expose']['identifier'] = 'name';
-  $handler->display->display_options['filters']['name']['expose']['remember_roles'] = array(
-    2 => '2',
-    1 => 0,
-    3 => 0,
-  );
-  /* Filter criterion: Chado Cv: Definition */
-  $handler->display->display_options['filters']['definition']['id'] = 'definition';
-  $handler->display->display_options['filters']['definition']['table'] = 'cv';
-  $handler->display->display_options['filters']['definition']['field'] = 'definition';
-  $handler->display->display_options['filters']['definition']['operator'] = 'contains';
-  $handler->display->display_options['filters']['definition']['group'] = '0';
-  $handler->display->display_options['filters']['definition']['exposed'] = TRUE;
-  $handler->display->display_options['filters']['definition']['expose']['operator_id'] = 'definition_op';
-  $handler->display->display_options['filters']['definition']['expose']['label'] = 'Definition Contains';
-  $handler->display->display_options['filters']['definition']['expose']['operator'] = 'definition_op';
-  $handler->display->display_options['filters']['definition']['expose']['identifier'] = 'definition';
-  $handler->display->display_options['filters']['definition']['expose']['remember_roles'] = array(
-    2 => '2',
-    1 => 0,
-    3 => 0,
-  );
-
-  /** MANUALLY ADD since filter handler not exporting correctly */
-  $handler->display->display_options['filters']['name']['expose']['values_form_type'] = 'textfield';
-  $handler->display->display_options['filters']['name']['expose']['select_multiple'] = FALSE;
-  $handler->display->display_options['filters']['name']['expose']['select_optional'] = FALSE;
-  $handler->display->display_options['filters']['name']['expose']['max_length'] = 40;
-
-  /* Display: Page */
-  $handler = $view->new_display('page', 'Page', 'page_1');
-  $handler->display->display_options['path'] = 'admin/tripal/vocab/cvs';
-  $handler->display->display_options['menu']['type'] = 'default tab';
-  $handler->display->display_options['menu']['title'] = 'Vocabularies';
-  $handler->display->display_options['menu']['description'] = 'A listing of all controlled vocabularies';
-  $handler->display->display_options['menu']['weight'] = '-10';
-  $handler->display->display_options['menu']['name'] = 'management';
-  $handler->display->display_options['menu']['context'] = 0;
-  $handler->display->display_options['menu']['context_only_inline'] = 0;
-  $handler->display->display_options['tab_options']['weight'] = '0';
-
-
-  /** MANUALLY ADD since filter handler no exporting correctly
-  $handler->display->display_options['filters']['name']['expose']['values_form_type'] = 'textfield';
-  $handler->display->display_options['filters']['name']['expose']['select_multiple'] = FALSE;
-  $handler->display->display_options['filters']['name']['expose']['select_optional'] = FALSE;
-  $handler->display->display_options['filters']['name']['expose']['max_length'] = 40;
-  */
-
-  return $view;
-}
 
-/**
- * Default Admin View for cvterm management
- *
- * @ingroup tripal_cv
- */
-function tripal_cv_defaultview_admin_cvterms_listing() {
-
-  $view = new view();
-  $view->name = 'tripal_cv_admin_cvterms';
-  $view->description = 'DO NOT DISABLE';
-  $view->tag = 'tripal admin';
-  $view->base_table = 'cvterm';
-  $view->human_name = 'CV Terms Admin';
-  $view->core = 0;
-  $view->api_version = '3.0';
-  $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
-
-  /* Display: Defaults */
-  $handler = $view->new_display('default', 'Defaults', 'default');
-  $handler->display->display_options['title'] = 'Controlled Vocabulary Terms';
-  $handler->display->display_options['use_more_always'] = FALSE;
-  $handler->display->display_options['access']['type'] = 'perm';
-  $handler->display->display_options['access']['perm'] = 'administer controlled vocabularies';
-  $handler->display->display_options['cache']['type'] = 'none';
-  $handler->display->display_options['query']['type'] = 'views_query';
-  $handler->display->display_options['exposed_form']['type'] = 'input_required';
-  $handler->display->display_options['exposed_form']['options']['submit_button'] = 'Search';
-  $handler->display->display_options['exposed_form']['options']['text_input_required'] = 'Click search to see a listing of controlled vocabulary terms that meet the filter requirements. Use the filters to restrict this set to a more reasonable number of terms or to find a specific term.';
-  $handler->display->display_options['exposed_form']['options']['text_input_required_format'] = 'full_html';
-  $handler->display->display_options['pager']['type'] = 'full';
-  $handler->display->display_options['pager']['options']['items_per_page'] = '25';
-  $handler->display->display_options['pager']['options']['offset'] = '0';
-  $handler->display->display_options['pager']['options']['id'] = '0';
-  $handler->display->display_options['pager']['options']['quantity'] = '9';
-  $handler->display->display_options['style_plugin'] = 'table';
-  $handler->display->display_options['style_options']['grouping'] = '';
-  $handler->display->display_options['style_options']['columns'] = array(
-    'name_1' => 'name_1',
-    'name' => 'name',
-    'definition' => 'definition',
-    'is_obsolete' => 'is_obsolete',
-    'is_relationshiptype' => 'is_relationshiptype',
-  );
-  $handler->display->display_options['style_options']['default'] = '-1';
-  $handler->display->display_options['style_options']['info'] = array(
-    'name_1' => array(
-      'sortable' => 1,
-      'separator' => '',
-    ),
-    'name' => array(
-      'sortable' => 1,
-      'separator' => '',
-    ),
-    'definition' => array(
-      'sortable' => 0,
-      'separator' => '',
-    ),
-    'is_obsolete' => array(
-      'sortable' => 1,
-      'separator' => '',
-    ),
-    'is_relationshiptype' => array(
-      'sortable' => 1,
-      'separator' => '',
-    ),
-  );
-/* Header: Global: Action Links */
-  $handler->display->display_options['header']['action_links_area']['id'] = 'action_links_area';
-  $handler->display->display_options['header']['action_links_area']['table'] = 'views';
-  $handler->display->display_options['header']['action_links_area']['field'] = 'action_links_area';
-  $handler->display->display_options['header']['action_links_area']['label'] = 'Action Links';
-  $handler->display->display_options['header']['action_links_area']['empty'] = TRUE;
-  $handler->display->display_options['header']['action_links_area']['link-1'] = array(
-    'label-1' => 'Add Term',
-    'path-1' => 'admin/tripal/vocab/cvterm/add',
-  );
-  /* No results behavior: Global: Text area */
-  $handler->display->display_options['empty']['text']['id'] = 'area';
-  $handler->display->display_options['empty']['text']['table'] = 'views';
-  $handler->display->display_options['empty']['text']['field'] = 'area';
-  $handler->display->display_options['empty']['text']['content'] = 'There are no terms associated with the selected controlled vocabulary. Please select a different vocabulary from the list above.';
-  $handler->display->display_options['empty']['text']['format'] = '1';
-  /* Field: Chado Cv: Cv Id */
-  $handler->display->display_options['fields']['cv_id']['id'] = 'cv_id';
-  $handler->display->display_options['fields']['cv_id']['table'] = 'cv';
-  $handler->display->display_options['fields']['cv_id']['field'] = 'cv_id';
-  $handler->display->display_options['fields']['cv_id']['exclude'] = TRUE;
-  $handler->display->display_options['fields']['cv_id']['separator'] = '';
-  /* Field: Chado Cv: Name */
-  $handler->display->display_options['fields']['name_1']['id'] = 'name_1';
-  $handler->display->display_options['fields']['name_1']['table'] = 'cv';
-  $handler->display->display_options['fields']['name_1']['field'] = 'name';
-  $handler->display->display_options['fields']['name_1']['label'] = 'Vocabulary';
-  $handler->display->display_options['fields']['name_1']['alter']['make_link'] = TRUE;
-  $handler->display->display_options['fields']['name_1']['alter']['path'] = 'admin/tripal/vocab/cvs?name=[name_1]';
-  /* Field: Chado Cvterm: Cvterm Id */
-  $handler->display->display_options['fields']['cvterm_id']['id'] = 'cvterm_id';
-  $handler->display->display_options['fields']['cvterm_id']['table'] = 'cvterm';
-  $handler->display->display_options['fields']['cvterm_id']['field'] = 'cvterm_id';
-  $handler->display->display_options['fields']['cvterm_id']['exclude'] = TRUE;
-  $handler->display->display_options['fields']['cvterm_id']['separator'] = '';
-  /* Field: Chado Cvterm: Name */
-  $handler->display->display_options['fields']['name']['id'] = 'name';
-  $handler->display->display_options['fields']['name']['table'] = 'cvterm';
-  $handler->display->display_options['fields']['name']['field'] = 'name';
-  /* Field: Chado Cvterm: Definition */
-  $handler->display->display_options['fields']['definition']['id'] = 'definition';
-  $handler->display->display_options['fields']['definition']['table'] = 'cvterm';
-  $handler->display->display_options['fields']['definition']['field'] = 'definition';
-  $handler->display->display_options['fields']['definition']['element_class'] = 'wide-column';
-  $handler->display->display_options['fields']['definition']['element_label_class'] = 'wide-column';
-  /* Field: Chado Cvterm: Is Obsolete */
-  $handler->display->display_options['fields']['is_obsolete']['id'] = 'is_obsolete';
-  $handler->display->display_options['fields']['is_obsolete']['table'] = 'cvterm';
-  $handler->display->display_options['fields']['is_obsolete']['field'] = 'is_obsolete';
-  $handler->display->display_options['fields']['is_obsolete']['label'] = 'Obsolete?';
-  $handler->display->display_options['fields']['is_obsolete']['alter']['alter_text'] = TRUE;
-  $handler->display->display_options['fields']['is_obsolete']['alter']['text'] = 'Yes';
-  $handler->display->display_options['fields']['is_obsolete']['element_class'] = 'short-column';
-  $handler->display->display_options['fields']['is_obsolete']['element_label_class'] = 'short-column';
-  $handler->display->display_options['fields']['is_obsolete']['empty'] = 'No';
-  $handler->display->display_options['fields']['is_obsolete']['empty_zero'] = TRUE;
-  $handler->display->display_options['fields']['is_obsolete']['separator'] = '';
-  /* Field: Chado Cvterm: Is Relationshiptype */
-  $handler->display->display_options['fields']['is_relationshiptype']['id'] = 'is_relationshiptype';
-  $handler->display->display_options['fields']['is_relationshiptype']['table'] = 'cvterm';
-  $handler->display->display_options['fields']['is_relationshiptype']['field'] = 'is_relationshiptype';
-  $handler->display->display_options['fields']['is_relationshiptype']['label'] = 'Relation-ship?';
-  $handler->display->display_options['fields']['is_relationshiptype']['alter']['alter_text'] = TRUE;
-  $handler->display->display_options['fields']['is_relationshiptype']['alter']['text'] = 'Yes';
-  $handler->display->display_options['fields']['is_relationshiptype']['element_class'] = 'short-column';
-  $handler->display->display_options['fields']['is_relationshiptype']['element_label_class'] = 'short-column';
-  $handler->display->display_options['fields']['is_relationshiptype']['empty'] = 'No';
-  $handler->display->display_options['fields']['is_relationshiptype']['empty_zero'] = TRUE;
-  $handler->display->display_options['fields']['is_relationshiptype']['separator'] = '';
-  /* Field: Global: Custom text */
-  $handler->display->display_options['fields']['nothing']['id'] = 'nothing';
-  $handler->display->display_options['fields']['nothing']['table'] = 'views';
-  $handler->display->display_options['fields']['nothing']['field'] = 'nothing';
-  $handler->display->display_options['fields']['nothing']['label'] = 'Edit Link';
-  $handler->display->display_options['fields']['nothing']['exclude'] = TRUE;
-  $handler->display->display_options['fields']['nothing']['alter']['text'] = 'edit';
-  $handler->display->display_options['fields']['nothing']['alter']['make_link'] = TRUE;
-  $handler->display->display_options['fields']['nothing']['alter']['path'] = 'admin/tripal/vocab/cv/[cv_id]/cvterm/edit/[cvterm_id]';
-  /* Field: Global: Custom text */
-  $handler->display->display_options['fields']['nothing_1']['id'] = 'nothing_1';
-  $handler->display->display_options['fields']['nothing_1']['table'] = 'views';
-  $handler->display->display_options['fields']['nothing_1']['field'] = 'nothing';
-  $handler->display->display_options['fields']['nothing_1']['label'] = '';
-  $handler->display->display_options['fields']['nothing_1']['alter']['text'] = '[nothing]';
-  $handler->display->display_options['fields']['nothing_1']['element_class'] = 'short-column';
-  $handler->display->display_options['fields']['nothing_1']['element_label_class'] = 'short-column';
-  $handler->display->display_options['fields']['nothing_1']['element_label_colon'] = FALSE;
-  /* Sort criterion: Chado Cv: Name */
-  $handler->display->display_options['sorts']['name']['id'] = 'name';
-  $handler->display->display_options['sorts']['name']['table'] = 'cv';
-  $handler->display->display_options['sorts']['name']['field'] = 'name';
-  /* Sort criterion: Chado Cvterm: Name */
-  $handler->display->display_options['sorts']['name_1']['id'] = 'name_1';
-  $handler->display->display_options['sorts']['name_1']['table'] = 'cvterm';
-  $handler->display->display_options['sorts']['name_1']['field'] = 'name';
-  /* Filter criterion: Chado Cv: Name */
-  $handler->display->display_options['filters']['name']['id'] = 'name';
-  $handler->display->display_options['filters']['name']['table'] = 'cv';
-  $handler->display->display_options['filters']['name']['field'] = 'name';
-  $handler->display->display_options['filters']['name']['value'] = 'All';
-  $handler->display->display_options['filters']['name']['group'] = '0';
-  $handler->display->display_options['filters']['name']['exposed'] = TRUE;
-  $handler->display->display_options['filters']['name']['expose']['operator_id'] = 'name_op';
-  $handler->display->display_options['filters']['name']['expose']['label'] = 'Vocabulary';
-  $handler->display->display_options['filters']['name']['expose']['operator'] = 'name_op';
-  $handler->display->display_options['filters']['name']['expose']['identifier'] = 'cv';
-  $handler->display->display_options['filters']['name']['expose']['remember_roles'] = array(
-    2 => '2',
-    1 => 0,
-    3 => 0,
-  );
-  /* Filter criterion: Chado Cvterm: Name */
-  $handler->display->display_options['filters']['name_1']['id'] = 'name_1';
-  $handler->display->display_options['filters']['name_1']['table'] = 'cvterm';
-  $handler->display->display_options['filters']['name_1']['field'] = 'name';
-  $handler->display->display_options['filters']['name_1']['operator'] = 'contains';
-  $handler->display->display_options['filters']['name_1']['group'] = '0';
-  $handler->display->display_options['filters']['name_1']['exposed'] = TRUE;
-  $handler->display->display_options['filters']['name_1']['expose']['operator_id'] = '';
-  $handler->display->display_options['filters']['name_1']['expose']['label'] = 'Name Contains';
-  $handler->display->display_options['filters']['name_1']['expose']['identifier'] = 'name';
-  $handler->display->display_options['filters']['name_1']['expose']['remember_roles'] = array(
-    2 => '2',
-    1 => 0,
-    3 => 0,
-  );
-  /* Filter criterion: Chado Cvterm: Definition */
-  $handler->display->display_options['filters']['definition']['id'] = 'definition';
-  $handler->display->display_options['filters']['definition']['table'] = 'cvterm';
-  $handler->display->display_options['filters']['definition']['field'] = 'definition';
-  $handler->display->display_options['filters']['definition']['operator'] = 'contains';
-  $handler->display->display_options['filters']['definition']['group'] = '0';
-  $handler->display->display_options['filters']['definition']['exposed'] = TRUE;
-  $handler->display->display_options['filters']['definition']['expose']['operator_id'] = 'definition_op';
-  $handler->display->display_options['filters']['definition']['expose']['label'] = 'Definition Contains';
-  $handler->display->display_options['filters']['definition']['expose']['operator'] = 'definition_op';
-  $handler->display->display_options['filters']['definition']['expose']['identifier'] = 'definition';
-  $handler->display->display_options['filters']['definition']['expose']['remember_roles'] = array(
-    2 => '2',
-    1 => 0,
-    3 => 0,
-  );
-
-  /** MANUALLY ADDED since filter handler no exporting correctly */
-  $handler->display->display_options['filters']['name']['expose']['values_form_type'] = 'select';
-  $handler->display->display_options['filters']['name']['expose']['select_multiple'] = FALSE;
-  $handler->display->display_options['filters']['name']['expose']['select_optional'] = TRUE;
-  $handler->display->display_options['filters']['name']['expose']['max_length'] = 40;
-
-  $handler->display->display_options['filters']['name_1']['expose']['values_form_type'] = 'textfield';
-  $handler->display->display_options['filters']['name_1']['expose']['select_multiple'] = FALSE;
-  $handler->display->display_options['filters']['name_1']['expose']['select_optional'] = FALSE;
-  $handler->display->display_options['filters']['name_1']['expose']['max_length'] = 40;
-
-  /* Display: Page */
-  $handler = $view->new_display('page', 'Page', 'page_1');
-  $handler->display->display_options['path'] = 'admin/tripal/vocab/cvterms';
-  $handler->display->display_options['menu']['type'] = 'tab';
-  $handler->display->display_options['menu']['title'] = 'Terms';
-  $handler->display->display_options['menu']['description'] = 'A listing of a controlled vocabulary terms for a given vocabulary';
-  $handler->display->display_options['menu']['weight'] = '-8';
-  $handler->display->display_options['menu']['name'] = 'management';
-  $handler->display->display_options['menu']['context'] = 0;
-  $handler->display->display_options['menu']['context_only_inline'] = 0;
-
-  /** MANUALLY ADD since filter handler no exporting correctly
-  $handler->display->display_options['filters']['name']['expose']['values_form_type'] = 'select';
-  $handler->display->display_options['filters']['name']['expose']['select_multiple'] = FALSE;
-  $handler->display->display_options['filters']['name']['expose']['select_optional'] = TRUE;
-  $handler->display->display_options['filters']['name']['expose']['max_length'] = 40;
-
-  $handler->display->display_options['filters']['name_1']['expose']['values_form_type'] = 'textfield';
-  $handler->display->display_options['filters']['name_1']['expose']['select_multiple'] = FALSE;
-  $handler->display->display_options['filters']['name_1']['expose']['select_optional'] = FALSE;
-  $handler->display->display_options['filters']['name_1']['expose']['max_length'] = 40;
-  */
-
-  return $view;
-}

+ 0 - 213
legacy/tripal_views/api/tripal_views.api.inc

@@ -179,219 +179,6 @@ function mymodule_admin_landing_page() {
  * @}
  */
 
-/**
- * Programatically enable view
- *
- * This should be used in a hook_menu definition as the callback to provide a link
- * to enable the view (first example). It can also be called directly if needed (second example).
- * @code
-// Create a URL that when the user navigates there, a given view will be enabled.
-// You will still need to provide a link to this menu item somewhere appropriate (ie: an admin landing page).
-function mymodule_menu() {
-  $items = array();
-
-  // Create one of these for each of your default views
-  $items['admin/tripal/<PATH-TO-YOUR-ADMIN-SECTION>/views/<VIEW-MACHINE-NAME>/enable'] = array(
-    'title' => 'Enable <VIEW-HUMAN-READABLE-NAME>',
-    'page callback' => 'tripal_enable_view',
-    'page arguments' => array('<VIEW-MACHINE-NAME>', '<PATH-TO-REDIRECT-TO-AFTERWARDS>'),
-    'access arguments' => array('<YOUR-PERMISSION-KEY>'),
-    'type' => MENU_CALLBACK,
-  );
-
-  return $items;
-}
-
-// Call this function directly to disable a view
-// The example shows enabling your own default view when your module is enabled.
-// This might be useful if you disable your view when your module is disabled.
-function mymodule_enable() {
-
-  $view_name = '<VIEW-MACHINE-NAME>';
-  tripal_enable_view($view_name);
-
-}
- * @endcode
- *
- * @param $view_name
- *   The machine-name of the view to be enabled
- * @param $redirect_link
- *   The path to redirect to. FALSE if no redirect needed
- *
- * @ingroup tripal_views_api
- */
-function tripal_enable_view($view_name, $redirect_link = FALSE) {
-
-  $status = variable_get('views_defaults', array());
-  if (isset($status[$view_name])) {
-    $status[$view_name] = FALSE;
-    variable_set('views_defaults', $status);
-    drupal_set_message("Successfully Enabled $view_name");
-  }
-  else {
-    drupal_set_message("Unable to find a view by the name of '$view_name'. Unable to enable this view.",'error');
-  }
-  if ($redirect_link) {
-    drupal_goto($redirect_link);
-  }
-}
-
-/**
- * Programatically disable view.
- *
- * This should be used in a hook_menu definition as the callback to provide a link
- * to disable the view (first example). It can also be called directly if needed (second example).
- * @code
-// Create a URL that when the user navigates there, a given view will be disabled.
-// You will still need to provide a link to this menu item somewhere appropriate.
-function mymodule_menu() {
-  $items = array();
-
-  // Create one of these for each of your default views
-  $items['admin/tripal/<PATH-TO-YOUR-ADMIN-SECTION>/views/<VIEW-MACHINE-NAME>/disable'] = array(
-    'title' => 'Disable <VIEW-HUMAN-READABLE-NAME>',
-    'page callback' => 'tripal_disable_view',
-    'page arguments' => array('<VIEW-MACHINE-NAME>', '<PATH-TO-REDIRECT-TO-AFTERWARDS>'),
-    'access arguments' => array('<YOUR-PERMISSION-KEY>'),
-    'type' => MENU_CALLBACK,
-  );
-
-  return $items;
-}
-
-// Call this function directly to disable a view
-// The example shows disabling your own default view when your module is uninstalled
-function mymodule_uninstall() {
-
-  $view_name = '<VIEW-MACHINE-NAME>';
-  tripal_disable_view($view_name);
-
-}
- * @endcode
- *
- * @param $view_name
- *   The machine-name of the view to be enabled
- * @param $redirect_link
- *   The path to redirect to. FALSE if no redirect needed
- *
- * @ingroup tripal_views_api
- */
-function tripal_disable_view($view_name, $redirect_link = FALSE) {
-
-  $status = variable_get('views_defaults', array());
-  if (isset($status[$view_name])) {
-    $status[$view_name] = TRUE;
-    variable_set('views_defaults', $status);
-    drupal_set_message("Disabled $view_name");
-  }
-  else {
-    drupal_set_message("Unable to find a view by the name of '$view_name'. Unable to disable this view.",'error');
-  }
-  if ($redirect_link) {
-    drupal_goto($redirect_link);
-  }
-}
-
-/**
- * Remove any drupal fields from a chado-based default view definition if chado is external.
- * This ensures compatibility with an external chado database.
- *
- * You should be calling this function in your hook_views_default_views(). This function
- * will only remove drupal tables if chado is external; thus you do not need to worry about
- * checking yourself. For example, the following is a good hook_views_default_views():
- * @code
- function mymodule_views_default_views() {
-  $views = array();
-
-  // NOTE: <VIEW-TYPE> describes the type of view:
-  //     - 'admin' for views used for administration of your module
-  //     - 'search' for views used to search data
-  //     - 'list' for views used primarily as data listings
-
-  // <VIEW-HUMAN-READABLE-NAME>
-  $view = mymodule_defaultview_<VIEW-TYPE>_<VIEW-MACHINE-NAME>();
-  $view = tripal_make_view_compatible_with_external($view);
-  $views[$view->name] = $view;
-
-  // <VIEW-HUMAN-READABLE-NAME>
-  $view = mymodule_defaultview_<VIEW-TYPE>_<VIEW-MACHINE-NAME>();
-  $view = tripal_make_view_compatible_with_external($view);
-  $views[$view->name] = $view;
-
-  return $views;
-}
-
-function mymodule_defaultview_<VIEW-TYPE>_<VIEW-MACHINE-NAME>() {
-  // PASTE VIEWS EXPORT CODE HERE
-  return $view;
-}
-
-function mymodule_defaultview_<VIEW-TYPE>_<VIEW-MACHINE-NAME>() {
-  // PASTE VIEWS EXPORT CODE HERE
-  return $view;
-}
- * @endcode
- * Notice that the actual views export code is in a separate function. This makes your
- * hook_views_default_views() more readable.
- *
- * NOTE: Currently assumes all tables not in the tripal views integration tables are Drupal tables.
- *
- * @param $view
- *   The default view definition object
- * @return
- *   The default view with all relationships, fields, filters, sorts, arguements for
- *   Drupal tables removed.
- */
-function tripal_make_view_compatible_with_external($view) {
-  $remove_table = array();
-
-  // First check that the base table for the view is a chado table
-  // If it's not then don't do any filtering
-  $setup_id = tripal_is_table_integrated($view->base_table);
-  if (!$setup_id) {
-    return $view;
-  }
-
-  // IF chado is external then remove all config relating to drupal tables
-  if (!chado_is_local()) {
-
-    // Iterate through all displays
-    foreach ($view->display as $display_name => $display) {
-      $display_options = $display->handler->display->display_options;
-
-      $sections = array('fields', 'filters', 'sorts', 'relationships');
-      foreach ($sections as $section) {
-        $display_options[$section] = (isset($display_options[$section])) ? $display_options[$section] : array();
-        foreach ($display_options[$section] as $key => $defn) {
-          // If the table has not already been encountered; check if it's in tripal_views
-          if (!isset($remove_table[ $defn['table'] ])) {
-            // If the table is view then this is a general handler; thus keep
-            if ($defn['table'] == 'views') {
-              $remove_table[ $defn['table'] ] = FALSE;
-            }
-            // If this table is integrated then it is chado; thus keep
-            $setup_id = tripal_is_table_integrated($defn['table']);
-            if ($setup_id) {
-              $remove_table[ $defn['table'] ] = FALSE;
-            }
-            else {
-              $remove_table[ $defn['table'] ] = TRUE;
-            }
-          }
-
-          // Based on the $remove_table array, unset this field if its from a drupal table
-          if ($remove_table[ $defn['table'] ]) {
-            unset($view->display[$display_name]->handler->display->display_options[$section][$key]);
-          }
-        }
-      }
-
-    }
-  }
-
-  return $view;
-}
-
 /**
  * Retrieve the priority of the lightest priority for a given table.
  *

+ 2 - 1
tripal/includes/TripalField.inc

@@ -186,7 +186,7 @@ class TripalField {
    * @return
    *   A Drupal form. See the hook_field_widget_form() function for more information.
    */
-  public function widget_form(&$widget, $form, $form_state, $field, $instance,
+  public function widget_form(&$widget, &$form, &$form_state, $field, $instance,
       $langcode, $items, $delta, $element) {
 
     $widget['value'] = array(
@@ -194,6 +194,7 @@ class TripalField {
       '#value' => array_key_exists($delta, $items) ? $items[$delta]['value'] : '',
     );
   }
+
   /**
    * Loads the field values from the underlying data store.
    *

+ 1 - 1
tripal/includes/TripalFieldQuery.inc

@@ -66,7 +66,7 @@ class TripalFieldQuery {
     // Are there any conditions?  If so, then let the field storage
     // systems handle the query. If there are no fields then just pull out
     // the list of entities.
-    dpm($this->conditions);
+    //dpm($this->conditions);
 
     $entity_ids = array();
     if (count($this->conditions) > 0) {

+ 4 - 0
tripal/includes/tripal.entity.inc

@@ -259,4 +259,8 @@ function tripal_entity_info_alter(&$entity_info){
 function tripal_entity_access($entity) {
   // TODO: need to implement this function.
   return TRUE;
+}
+
+function tripal_form_tripal_entity_form_alter(&$form, &$form_state, $form_id) {
+  //dpm($form);
 }

+ 8 - 1
tripal_chado/api/modules/tripal_chado.cv.api.inc

@@ -282,6 +282,10 @@ function tripal_get_cvterm($identifiers, $options = array()) {
  *
  * @param $cv_id
  *   The chado cv_id; only cvterms with the supplied cv_id will be returned
+ * @param $rel_type
+ *   Set to TRUE if the terms returned should only be relationship types in
+ *   the vocabulary.  This is useful for creating drop-downs of terms
+ *   used for relationship linker tables.
  *
  * @return
  *   An associative array with the cvterm_id's as keys. The first
@@ -289,9 +293,12 @@ function tripal_get_cvterm($identifiers, $options = array()) {
  *
  * @ingroup tripal_chado_api
  */
-function tripal_get_cvterm_select_options($cv_id) {
+function tripal_get_cvterm_select_options($cv_id, $rel_type = FALSE) {
   $columns = array('cvterm_id', 'name');
   $values = array('cv_id' => $cv_id);
+  if ($rel_type) {
+    $values['is_relationshiptype'] = 1;
+  }
   $s_options = array('order_by' => array('name' => 'ASC'));
 
   $cvterms = chado_select_record('cvterm', $columns, $values, $s_options);

+ 35 - 0
tripal_chado/api/modules/tripal_chado.feature.api.inc

@@ -11,6 +11,41 @@
  * Provides an application programming interface (API) for working with features
  * @}
  */
+/**
+ * Used for autocomplete in forms for identifying for publications.
+ *
+ * @param $field
+ *   The field in the publication to search on.
+ * @param $string
+ *   The string to search for
+ *
+ * @return
+ *   A json array of terms that begin with the provided string
+ *
+ * @ingroup tripal_chado_api
+ */
+function tripal_autocomplete_feature($string = '') {
+  $items = array();
+  $sql = "
+    SELECT
+      F.feature_id, F.uniquename, F.name,
+      O.genus, O,species,
+      CVT.name as type
+    FROM {feature} F
+      INNER JOIN {organism} O ON O.organism_id = F.organism_id
+      INNER JOIN {cvterm} CVT ON CVT.cvterm_id = F.type_id
+    WHERE lower(F.uniquename) like lower(:str)
+    ORDER by F.uniquename
+    LIMIT 25 OFFSET 0
+  ";
+  $features = chado_query($sql, array(':str' => $string . '%'));
+  while ($feature = $features->fetchObject()) {
+    $key = "$feature->uniquename [id: $feature->feature_id]";
+    $items[$key] = "$feature->uniquename ($feature->name, $feature->type, $feature->genus $feature->species)";
+  }
+
+  drupal_json_output($items);
+}
 
 /**
  * Performs a reverse compliment of a nucleotide sequence

+ 224 - 0
tripal_chado/api/tripal_chado.views.api.inc

@@ -0,0 +1,224 @@
+<?php
+/**
+ * Removes Chado fields from a view, if Chado is external.
+ *
+ * Remove any drupal fields from a chado-based default view definition if
+ * chado is external. This ensures compatibility with an external chado
+ * database.
+ *
+ * You should be calling this function in your hook_views_default_views().
+ * This function will only remove drupal tables if chado is external; thus you
+ * do not need to worry about checking yourself. For example, the following is
+ * a good hook_views_default_views():
+ *
+ * @code
+ * function mymodule_views_default_views() {
+ *   $views = array();
+ *
+ *   // NOTE: <VIEW-TYPE> describes the type of view:
+ *   //     - 'admin' for views used for administration of your module
+ *   //     - 'search' for views used to search data
+ *   //     - 'list' for views used primarily as data listings
+ *
+ *   // <VIEW-HUMAN-READABLE-NAME>
+ *   $view = mymodule_defaultview_<VIEW-TYPE>_<VIEW-MACHINE-NAME>();
+ *   $view = tripal_make_view_compatible_with_external($view);
+ *   $views[$view->name] = $view;*
+ *
+ *   // <VIEW-HUMAN-READABLE-NAME>
+ *   $view = mymodule_defaultview_<VIEW-TYPE>_<VIEW-MACHINE-NAME>();
+ *   $view = tripal_make_view_compatible_with_external($view);
+ *   $views[$view->name] = $view;
+ *
+ *   return $views;
+ * }
+ *
+ * function mymodule_defaultview_<VIEW-TYPE>_<VIEW-MACHINE-NAME>() {
+ *   // PASTE VIEWS EXPORT CODE HERE
+ *   return $view;
+ * }
+ *
+ * function mymodule_defaultview_<VIEW-TYPE>_<VIEW-MACHINE-NAME>() {
+ *   // PASTE VIEWS EXPORT CODE HERE
+ *   return $view;
+ * }
+ * @endcode
+ *
+ * Notice that the actual views export code is in a separate function. This
+ * makes your hook_views_default_views() more readable.
+ *
+ * NOTE: Currently assumes all tables not in the tripal views integration
+ * tables are Drupal tables.
+ *
+ * @param $view
+ *   The default view definition object
+ * @return
+ *   The default view with all relationships, fields, filters, sorts,
+ *   arguements for Drupal tables removed.
+ */
+function tripal_make_view_compatible_with_external($view) {
+  $remove_table = array();
+
+  // First check that the base table for the view is a chado table
+  // If it's not then don't do any filtering
+  $schema = chado_get_schema($view->base_table);
+  if (!$schema) {
+    return $view;
+  }
+//   $setup_id = tripal_is_table_integrated($view->base_table);
+//   if (!$setup_id) {
+//     return $view;
+//   }
+
+  // IF chado is external then remove all config relating to drupal tables
+  if (!chado_is_local()) {
+
+    // Iterate through all displays
+    foreach ($view->display as $display_name => $display) {
+      $display_options = $display->handler->display->display_options;
+
+      $sections = array('fields', 'filters', 'sorts', 'relationships');
+      foreach ($sections as $section) {
+        $display_options[$section] = (isset($display_options[$section])) ? $display_options[$section] : array();
+        foreach ($display_options[$section] as $key => $defn) {
+          // If the table has not already been encountered; check if it's in tripal_views
+          if (!isset($remove_table[ $defn['table'] ])) {
+            // If the table is view then this is a general handler; thus keep
+            if ($defn['table'] == 'views') {
+              $remove_table[ $defn['table'] ] = FALSE;
+            }
+            // If this table is integrated then it is chado; thus keep
+            //$setup_id = tripal_is_table_integrated($defn['table']);
+            $schema = chado_get_schema($defn['table']);
+            //if ($setup_id) {
+            if ($schema) {
+              $remove_table[ $defn['table'] ] = FALSE;
+            }
+            else {
+              $remove_table[ $defn['table'] ] = TRUE;
+            }
+          }
+
+          // Based on the $remove_table array, unset this field if its from a drupal table
+          if ($remove_table[ $defn['table'] ]) {
+            unset($view->display[$display_name]->handler->display->display_options[$section][$key]);
+          }
+        }
+      }
+
+    }
+  }
+
+  return $view;
+}
+
+/**
+ * Programatically disable view.
+ *
+ * This should be used in a hook_menu definition as the callback to provide a link
+ * to disable the view (first example). It can also be called directly if needed (second example).
+ * @code
+ * // Create a URL that when the user navigates there, a given view will be disabled.
+ * // You will still need to provide a link to this menu item somewhere appropriate.
+ * function mymodule_menu() {
+ *   $items = array();
+ *
+ *   // Create one of these for each of your default views
+ *   $items['admin/tripal/<PATH-TO-YOUR-ADMIN-SECTION>/views/<VIEW-MACHINE-NAME>/disable'] = array(
+ *     'title' => 'Disable <VIEW-HUMAN-READABLE-NAME>',
+ *     'page callback' => 'tripal_disable_view',
+ *     'page arguments' => array('<VIEW-MACHINE-NAME>', '<PATH-TO-REDIRECT-TO-AFTERWARDS>'),
+ *     'access arguments' => array('<YOUR-PERMISSION-KEY>'),
+ *     'type' => MENU_CALLBACK,
+ *   );
+ *
+ *   return $items;
+ * }
+ *
+ * // Call this function directly to disable a view
+ * // The example shows disabling your own default view when your module is uninstalled
+ * function mymodule_uninstall() {
+ *
+ *   $view_name = '<VIEW-MACHINE-NAME>';
+ *   tripal_disable_view($view_name);
+ *
+ * }
+ * @endcode
+ *
+ * @param $view_name
+ *   The machine-name of the view to be enabled
+ * @param $redirect_link
+ *   The path to redirect to. FALSE if no redirect needed
+ *
+ * @ingroup tripal_views_api
+ */
+function tripal_disable_view($view_name, $redirect_link = FALSE) {
+
+  $status = variable_get('views_defaults', array());
+  if (isset($status[$view_name])) {
+    $status[$view_name] = TRUE;
+    variable_set('views_defaults', $status);
+    drupal_set_message("Disabled $view_name");
+  }
+  else {
+    drupal_set_message("Unable to find a view by the name of '$view_name'. Unable to disable this view.",'error');
+  }
+  if ($redirect_link) {
+    drupal_goto($redirect_link);
+  }
+}
+
+/**
+ * Programatically enable view
+ *
+ * This should be used in a hook_menu definition as the callback to provide a link
+ * to enable the view (first example). It can also be called directly if needed (second example).
+ * @code
+ * // Create a URL that when the user navigates there, a given view will be enabled.
+ * // You will still need to provide a link to this menu item somewhere appropriate (ie: an admin landing page).
+ * function mymodule_menu() {
+ *   $items = array();
+ *
+ *   // Create one of these for each of your default views
+ *   $items['admin/tripal/<PATH-TO-YOUR-ADMIN-SECTION>/views/<VIEW-MACHINE-NAME>/enable'] = array(
+ *     'title' => 'Enable <VIEW-HUMAN-READABLE-NAME>',
+ *     'page callback' => 'tripal_enable_view',
+ *     'page arguments' => array('<VIEW-MACHINE-NAME>', '<PATH-TO-REDIRECT-TO-AFTERWARDS>'),
+ *     'access arguments' => array('<YOUR-PERMISSION-KEY>'),
+ *     'type' => MENU_CALLBACK,
+ *   );
+ *
+ *   return $items;
+ * }
+ *
+ * // Call this function directly to disable a view
+ * // The example shows enabling your own default view when your module is enabled.
+ * // This might be useful if you disable your view when your module is disabled.
+ * function mymodule_enable() {
+ *   $view_name = '<VIEW-MACHINE-NAME>';
+ *   tripal_enable_view($view_name);
+ * }
+ * @endcode
+ *
+ * @param $view_name
+ *   The machine-name of the view to be enabled
+ * @param $redirect_link
+ *   The path to redirect to. FALSE if no redirect needed
+ *
+ * @ingroup tripal_views_api
+ */
+function tripal_enable_view($view_name, $redirect_link = FALSE) {
+
+  $status = variable_get('views_defaults', array());
+  if (isset($status[$view_name])) {
+    $status[$view_name] = FALSE;
+    variable_set('views_defaults', $status);
+    drupal_set_message("Successfully Enabled $view_name");
+  }
+  else {
+    drupal_set_message("Unable to find a view by the name of '$view_name'. Unable to enable this view.",'error');
+  }
+  if ($redirect_link) {
+    drupal_goto($redirect_link);
+  }
+}

+ 6 - 6
tripal_chado/includes/fields/chado_base__dbxref_id.inc

@@ -106,7 +106,7 @@ class chado_base__dbxref_id extends TripalField {
   /**
    * @see TripalField::widget_form()
    */
-  function widget_form(&$widget, $form, $form_state, $field, $instance,
+  function widget_form(&$widget, &$form, &$form_state, $field, $instance,
       $langcode, $items, $delta, $element) {
 
     $field_name = $field['field_name'];
@@ -255,11 +255,11 @@ class chado_base__dbxref_id extends TripalField {
     $entity->{$field_name}['und'][0] = array(
       'value' => array(),
       $field_table . '__' . $field_column => '',
-      'dbxref__dbxref_id' => '',
-      'dbxref__db_id' => '',
-      'dbxref__accession' => '',
-      'dbxref__version' => '',
-      'dbxref__description' => '',
+      $field_table . '__dbxref_id--dbxref_id' => '',
+      $field_table . '__dbxref_id--db_id' => '',
+      $field_table . '__dbxref_id--accession' => '',
+      $field_table . '__dbxref_id--version' => '',
+      $field_table . '__dbxref_id--description' => '',
     );
 
     // Get the primary dbxref record (if it's not NULL).  Because we have a

+ 1 - 1
tripal_chado/includes/fields/chado_base__organism_id.inc

@@ -118,7 +118,7 @@ class chado_base__organism_id extends TripalField {
   /**
    * @see TripalField::widget()
    */
-  public function widget_form(&$widget, $form, $form_state, $field, $instance,
+  public function widget_form(&$widget, &$form, &$form_state, $field, $instance,
       $langcode, $items, $delta, $element) {
 
     $settings = $field['settings'];

+ 3 - 1
tripal_chado/includes/fields/chado_feature__md5checksum.inc

@@ -95,7 +95,9 @@ class chado_feature__md5checksum  extends TripalField {
   /**
    * @see TripalField::widget_form()
    */
-  function widget_form(&$widget, $form, $form_state, $field, $instance, $langcode, $items, $delta, $element) {
+  public function widget_form(&$widget, &$form, &$form_state, $field, $instance,
+      $langcode, $items, $delta, $element) {
+
     $settings = $field['settings'];
     $field_name = $field['field_name'];
     $field_type = $field['type'];

+ 2 - 1
tripal_chado/includes/fields/chado_feature__residues.inc

@@ -139,7 +139,8 @@ class chado_feature__residues extends TripalField {
   /**
    * @see TripalField::widget_form()
    */
-  function widget_form(&$widget, $form, $form_state, $field, $instance, $langcode, $items, $delta, $element) {
+  public function widget_form(&$widget, &$form, &$form_state, $field, $instance,
+      $langcode, $items, $delta, $element) {
     $settings = $field['settings'];
     $field_name = $field['field_name'];
     $field_type = $field['type'];

+ 2 - 1
tripal_chado/includes/fields/chado_feature__seqlen.inc

@@ -91,7 +91,8 @@ class chado_feature__seqlen extends TripalField {
   /**
    * @see TripalField::widget_form()
    */
-  function widget_form(&$widget, $form, $form_state, $field, $instance, $langcode, $items, $delta, $element) {
+  public function widget_form(&$widget, &$form, &$form_state, $field, $instance,
+      $langcode, $items, $delta, $element) {
 
     $settings = $field['settings'];
     $field_name = $field['field_name'];

+ 2 - 1
tripal_chado/includes/fields/chado_gene__transcripts.inc

@@ -220,7 +220,8 @@ class chado_gene__transcripts extends TripalField {
   /**
    * @see TripalField::widget_form()
    */
-  public function widget_form(&$widget, $form, $form_state, $field, $instance, $langcode, $items, $delta, $element) {
+  public function widget_form(&$widget, &$form, &$form_state, $field, $instance,
+      $langcode, $items, $delta, $element) {
 
   }
 }

+ 1 - 1
tripal_chado/includes/fields/chado_linker__contact.inc

@@ -139,7 +139,7 @@ class chado_linker__contact extends TripalField {
   /**
    * @see TripalField::widget_form()
    */
-  public function widget_form(&$widget, $form, $form_state, $field, $instance,
+  public function widget_form(&$widget, &$form, &$form_state, $field, $instance,
       $langcode, $items, $delta, $element) {
 
 

+ 1 - 1
tripal_chado/includes/fields/chado_linker__cvterm.inc

@@ -113,7 +113,7 @@ class chado_linker__cvterm extends TripalField {
   /**
    * @see TripalField::widget_form()
    */
-  function widget_form(&$widget, $form, $form_state, $field, $instance,
+  public function widget_form(&$widget, &$form, &$form_state, $field, $instance,
       $langcode, $items, $delta, $element) {
 
     $entity = $form['#entity'];

+ 1 - 1
tripal_chado/includes/fields/chado_linker__cvterm_adder.inc

@@ -71,7 +71,7 @@ class chado_linker__cvterm_addr extends TripalField {
   /**
    * @see TripalField::widget_form()
    */
-  function widget_form(&$widget, $form, $form_state, $field, $instance,
+  public function widget_form(&$widget, &$form, &$form_state, $field, $instance,
       $langcode, $items, $delta, $element) {
 
     // This field has no value field.  Just a fieldset for adding new annotation types.

+ 1 - 1
tripal_chado/includes/fields/chado_linker__dbxref.inc

@@ -124,7 +124,7 @@ class chado_linker__dbxref extends TripalField {
   /**
    * @see TripalField::widget_form()
    */
-  function widget_form(&$widget, $form, $form_state, $field, $instance,
+  public function widget_form(&$widget, &$form, &$form_state, $field, $instance,
       $langcode, $items, $delta, $element) {
 
     $field_name = $field['field_name'];

+ 1 - 1
tripal_chado/includes/fields/chado_linker__expression.inc

@@ -153,7 +153,7 @@ class chado_linker__expression extends TripalField {
   }
 
 
-  public function widget_form(&$widget, $form, $form_state, $field, $instance,
+  public function widget_form(&$widget, &$form, &$form_state, $field, $instance,
       $langcode, $items, $delta, $element) {
 
 

+ 2 - 1
tripal_chado/includes/fields/chado_linker__featureloc.inc

@@ -359,7 +359,8 @@ class chado_linker__featureloc extends TripalField {
   /**
    * @see TripalField::widget_form()
    */
-  function widget_form(&$widget, $form, $form_state, $field, $instance, $langcode, $items, $delta, $element) {
+   public function widget_form(&$widget, &$form, &$form_state, $field, $instance,
+      $langcode, $items, $delta, $element) {
 
   }
 

+ 1 - 1
tripal_chado/includes/fields/chado_linker__genotype.inc

@@ -139,7 +139,7 @@ class chado_linker__genotype extends TripalField {
   /**
    * @see TripalField::widget_form()
    */
-  public function widget_form(&$widget, $form, $form_state, $field, $instance,
+  public function widget_form(&$widget, &$form, &$form_state, $field, $instance,
       $langcode, $items, $delta, $element) {
 
   }

+ 1 - 1
tripal_chado/includes/fields/chado_linker__phenotype.inc

@@ -139,7 +139,7 @@ class chado_linker__phenotype extends TripalField {
   /**
    * @see TripalField::widget_form()
    */
-  public function widget_form(&$widget, $form, $form_state, $field, $instance,
+  public function widget_form(&$widget, &$form, &$form_state, $field, $instance,
       $langcode, $items, $delta, $element) {
 
   }

+ 2 - 2
tripal_chado/includes/fields/chado_linker__pub.inc

@@ -111,8 +111,8 @@ class chado_linker_pub extends TripalField {
   /**
    * @see TripalField::widget_form()
    */
-  function widget_form(&$widget, $form, $form_state, $field,
-      $instance, $langcode, $items, $delta, $element) {
+  public function widget_form(&$widget, &$form, &$form_state, $field, $instance,
+      $langcode, $items, $delta, $element) {
 
     $entity = $form['#entity'];
     $field_name = $field['field_name'];

+ 212 - 33
tripal_chado/includes/fields/chado_linker__relationship.inc

@@ -164,7 +164,7 @@ class chado_linker__relationship extends TripalField {
   /**
    * @see TripalField::widget_form()
    */
-  function widget_form(&$widget, $form, $form_state, $field, $instance,
+  function widget_form(&$widget, &$form, &$form_state, $field, $instance,
       $langcode, $items, $delta, $element) {
 
     $field_name = $field['field_name'];
@@ -197,32 +197,37 @@ class chado_linker__relationship extends TripalField {
     if (array_key_exists($delta, $items)) {
       $record_id = $items[$delta][$field_table . '__' . $pkey];
       $subject_id = $items[$delta][$field_table . '__subject_id'];
-      $subject_uniquename = $items[$delta][$field_table . '__subject_id--uniquename'];
       $type_id = $items[$delta][$field_table . '__type_id'];
-      $type = $items[$delta][$field_table . '__type_id--name'];
       $object_id = $items[$delta][$field_table . '__object_id'];
-      $object_uniquename = $items[$delta][$field_table . '__object_id--uniquename'];
+
       $value = $items[$delta][$field_table . '__value'];
       $rank = $items[$delta][$field_table . '__rank'];
+
+      $object_uniquename = $items[$delta]['object_name'];
+      $subject_uniquename = $items[$delta]['subject_name'];
+      $type = $items[$delta]['type_name'];
     }
 
     // Check $form_state['values'] to see if an AJAX call set the values.
     if (array_key_exists('values', $form_state) and array_key_exists($delta, $form_state['values'])) {
       $record_id = tripal_chado_get_field_form_values($field_name, $form_state, $delta, $field_table . '__' . $pkey);
       $subject_id = tripal_chado_get_field_form_values($field_name, $form_state, $delta, $field_table . '__subject_id');
-      $subject_uniquename = tripal_chado_get_field_form_values($field_name, $form_state, $delta, $field_table . '__subject_id--uniquename');
+      $subject_uniquename = tripal_chado_get_field_form_values($field_name, $form_state, $delta, 'subject_name');
       $type_id = tripal_chado_get_field_form_values($field_name, $form_state, $delta, $field_table . '__type_id');
-      $type = tripal_chado_get_field_form_values($field_name, $form_state, $delta, $field_table . '__type_id--name');
+      $type = tripal_chado_get_field_form_values($field_name, $form_state, $delta, 'type_name');
       $object_id = tripal_chado_get_field_form_values($field_name, $form_state, $delta, $field_table . '__object_id');
-      $object_uniquename = tripal_chado_get_field_form_values($field_name, $form_state, $delta, $field_table . '__object_id--uniquename');
+      $object_uniquename = tripal_chado_get_field_form_values($field_name, $form_state, $delta, 'object_name');
       $value = tripal_chado_get_field_form_values($field_name, $form_state, $delta, $field_table . '__value');
       $rank = tripal_chado_get_field_form_values($field_name, $form_state, $delta, $field_table . '__rank');
     }
 
     $widget['#table_name'] = $chado_table;
-    $widget['#fkey_field'] = $fkey;
-//    $widget['#element_validate'] = array('chado_linker__relationship_validate');
-//    $widget['#theme'] = 'chado_linker__relationship_widget';
+
+    $widget['#fkeys'] = $schema['foreign keys'];
+    $widget['#base_table'] = $base_table;
+    $widget['#chado_record_id'] = $form['#entity']->chado_record_id;
+    $widget['#element_validate'] = array('chado_linker__relationship_validate');
+    $widget['#theme'] = 'chado_linker__relationship_widget';
     $widget['#prefix'] =  "<span id='$chado_table-$delta'>";
     $widget['#suffix'] =  "</span>";
 
@@ -230,7 +235,6 @@ class chado_linker__relationship extends TripalField {
       '#type' => 'value',
       '#value' => array_key_exists($delta, $items) ? $items[$delta]['value'] : '',
     );
-
     $widget[$field_table . '__' . $pkey] = array(
       '#type' => 'value',
       '#default_value' => $record_id,
@@ -259,35 +263,35 @@ class chado_linker__relationship extends TripalField {
         '#default_value' => $rank,
       );
     }
-    $widget[$field_table . '__subject_id--uniquename'] = array(
+    $widget['subject_name'] = array(
       '#type' => 'textfield',
-      '#title' => t('Subject Uniquename'),
+      '#title' => t('Subject'),
       '#default_value' => $subject_uniquename,
       '#required' => $element['#required'],
       '#maxlength' => array_key_exists('length', $schema['fields']['subject_id']) ? $schema['fields']['subject_id']['length'] : 255,
-      '#size' => 15,
+      '#size' => 35,
+      '#autocomplete_path' => "admin/tripal/storage/chado/auto_name/$base_table",
     );
-    $options = array($type);
-    $widget[$field_table . '__cvterm_id--name'] = array(
+    $default_cv = tripal_get_default_cv($field_table, 'type_id');
+    if (!$default_cv) {
+      drupal_set_message("There is no default vocabulary set for the relationships....");
+    }
+    $options = tripal_get_cvterm_select_options($default_cv->cv_id, TRUE);
+    $widget['type_name'] = array(
       '#type' => 'select',
       '#title' => t('Type'),
       '#options' => $options,
       '#required' => $element['#required'],
-      '#default_value' => $type,
-      '#ajax' => array(
-        'callback' => "chado_linker__relationship_widget_form_ajax_callback",
-        'wrapper' => "$field_name-relationship--cvterm-id-$delta",
-        'effect' => 'fade',
-        'method' => 'replace'
-      ),
+      '#default_value' => $type_id,
     );
-    $widget[$field_table . '__object_id--uniquename'] = array(
+    $widget['object_name'] = array(
       '#type' => 'textfield',
-      '#title' => t('Object Uniquename'),
+      '#title' => t('Object'),
       '#default_value' => $object_uniquename,
       '#required' => $element['#required'],
       '#maxlength' => array_key_exists('length', $schema['fields']['object_id']) ? $schema['fields']['object_id']['length'] : 255,
-      '#size' => 15,
+      '#size' => 35,
+      '#autocomplete_path' => "admin/tripal/storage/chado/auto_name/$base_table",
     );
   }
 
@@ -334,12 +338,19 @@ class chado_linker__relationship extends TripalField {
     $fkey_rcolumn = $schema['foreign keys'][$base_table]['columns'][$fkey_lcolumn];
 
     // Set some defaults for the empty record.
+    // TODO: don't hardcode the uniquename as all tables won't have that.
     $entity->{$field_name}['und'][0] = array(
       'value' => array(),
       $field_table . '__' . $pkey => '',
       $field_table . '__subject_id' => '',
       $field_table . '__object_id' => '',
-      $field_table . '__type_id' => TRUE,
+      $field_table . '__type_id' => '',
+      // These elements don't need to follow the naming scheme above
+      // becasue we don't need the chado_field_storage to try and
+      // save these values.
+      'object_name' => '',
+      'subject_name' => '',
+      'type_name' => '',
     );
     if (array_key_exists('value', $schema['fields'])) {
       $entity->{$field_name}['und'][0][$field_table . '__value'] = '';
@@ -425,13 +436,16 @@ class chado_linker__relationship extends TripalField {
         $entity->{$field_name}['und'][$i]['value']['phrase'] = 'The ' . $subject_type . ', ' .
           $subject_name . ', ' . $verb . ' '  . $rel_type_clean . ' this '  .
           $object_type . '.';
+
+
         $entity->{$field_name}['und'][$i][$field_table . '__' . $pkey] = $relationship->$pkey;
         $entity->{$field_name}['und'][$i][$field_table . '__subject_id'] = $relationship->subject_id->$subject_pkey;
-        $entity->{$field_name}['und'][$i][$field_table . '__subject_id--uniquename'] = $relationship->subject_id->uniquename;
         $entity->{$field_name}['und'][$i][$field_table . '__type_id'] = $relationship->type_id->cvterm_id;
-        $entity->{$field_name}['und'][$i][$field_table . '__type_id--name'] = $relationship->type_id->name;
         $entity->{$field_name}['und'][$i][$field_table . '__object_id'] = $relationship->object_id->$object_pkey;
-        $entity->{$field_name}['und'][$i][$field_table . '__object_id--uniquename'] = $relationship->object_id->uniquename;
+
+        $entity->{$field_name}['und'][$i]['type_name'] = $relationship->type_id->name;
+        $entity->{$field_name}['und'][$i]['subject_name'] = $relationship->subject_id->uniquename . ' [id: ' . $relationship->subject_id->$fkey_rcolumn . ']';
+        $entity->{$field_name}['und'][$i]['object_name'] = $relationship->object_id->uniquename  . ' [id: ' . $relationship->object_id->$fkey_rcolumn . ']';
         if (array_key_exists('value', $schema['fields'])) {
           $entity->{$field_name}['und'][$i][$field_table . '__value'] = $relationship->value;
         }
@@ -488,11 +502,13 @@ class chado_linker__relationship extends TripalField {
           $object_type . ', ' . $object_name . '.';
         $entity->{$field_name}['und'][$i][$field_table . '__' . $pkey] = $relationship->$pkey;
         $entity->{$field_name}['und'][$i][$field_table . '__subject_id'] = $relationship->subject_id->$subject_pkey;
-        $entity->{$field_name}['und'][$i][$field_table . '__subject_id--uniquename'] = $relationship->subject_id->uniquename;
         $entity->{$field_name}['und'][$i][$field_table . '__type_id'] = $relationship->type_id->cvterm_id;
-        $entity->{$field_name}['und'][$i][$field_table . '__type_id--name'] = $relationship->type_id->name;
         $entity->{$field_name}['und'][$i][$field_table . '__object_id'] = $relationship->object_id->$object_pkey;
-        $entity->{$field_name}['und'][$i][$field_table . '__object_id--uniquename'] = $relationship->object_id->uniquename;
+
+        $entity->{$field_name}['und'][$i]['type_name'] = $relationship->type_id->name;
+        $entity->{$field_name}['und'][$i]['subject_name'] = $relationship->subject_id->uniquename  . ' [id: ' . $relationship->subject_id->$fkey_rcolumn . ']';
+        $entity->{$field_name}['und'][$i]['object_name'] = $relationship->object_id->uniquename  . ' [id: ' . $relationship->object_id->$fkey_rcolumn . ']';
+
         if (array_key_exists('value', $schema['fields'])) {
           $entity->{$field_name}['und'][$i][$field_table . '__value'] = $relationship->value;
         }
@@ -550,3 +566,166 @@ class chado_linker__relationship extends TripalField {
     return $verb;
   }
 }
+
+/**
+ * Theme function for the chado_linker__relationship_widget.
+ */
+function theme_chado_linker__relationship_widget($variables) {
+  $element = $variables['element'];
+  $field_name = $element['#field_name'];
+  $field = field_info_field($field_name);
+  $field_type = $field['type'];
+  $field_table = $field['settings']['chado_table'];
+  $field_column = $field['settings']['chado_column'];
+
+  $layout = "
+      <div class=\"chado-linker--relationship-widget\">
+        <div class=\"chado-linker--relationship-widget-item\">" .
+          drupal_render($element['subject_name']) . "
+        </div>
+        <div class=\"chado-linker--relationship-widget-item\">" .
+          drupal_render($element['type_name']) . "
+        </div>
+        <div class=\"chado-linker--relationship-widget-item\">" .
+          drupal_render($element['object_name']) . "
+        </div>
+      </div>
+    ";
+  return $layout;
+}
+
+/**
+ *
+ */
+function chado_linker__relationship_validate($element, &$form_state) {
+
+  $field_name = $element['#field_name'];
+  $delta = $element['#delta'];
+  $table_name = $element['#table_name'];
+  $fkeys = $element['#fkeys'];
+  $base_table = $element['#base_table'];
+  $chado_record_id = $element['#chado_record_id'];
+  $field = field_info_field($field_name);
+  $field_type = $field['type'];
+  $field_table = $field['settings']['chado_table'];
+  $field_column = $field['settings']['chado_column'];
+
+  // If the form ID is field_ui_field_edit_form, then the user is editing the
+  // field's values in the manage fields form of Drupal.  We don't want
+  // to validate it as if it were being used in a data entry form.
+  if ($form_state['build_info']['form_id'] =='field_ui_field_edit_form') {
+    return;
+  }
+
+  // Get the field values.
+  $subject_id = tripal_chado_get_field_form_values($field_name, $form_state, $delta, $field_table . '__subject_id');
+  $object_id = tripal_chado_get_field_form_values($field_name, $form_state, $delta, $field_table . '__object_id');
+  $type_id = tripal_chado_get_field_form_values($field_name, $form_state, $delta, $field_table . '__type_id');
+  $type_name = tripal_chado_get_field_form_values($field_name, $form_state, $delta, 'type_name');
+  $subject_name = tripal_chado_get_field_form_values($field_name, $form_state, $delta, 'subject_name');
+  $object_name = tripal_chado_get_field_form_values($field_name, $form_state, $delta, 'object_name');
+
+  // If the row is empty then just return, there's nothing to validate.
+  if (!$type_name and !$subject_name and !$object_name) {
+    return;
+  }
+
+  // Make sure we have values for all of the fields.
+  $form_error = FALSE;
+  if (!$type_name) {
+    form_set_error(implode('][', $element ['#parents']) . '][type_name',
+        t("Please provide the type of relationship."));
+  }
+  if (!$subject_name) {
+    form_set_error(implode('][', $element ['#parents']) . '][subject_name',
+        t("Please provide the subject of the relationship."));
+  }
+  if (!$object_name) {
+    form_set_error(implode('][', $element ['#parents']) . '][object_name',
+        t("Please provide the object of the relationship."));
+  }
+  if ($form_error) {
+    return;
+  }
+
+  // Before submitting this form we need to make sure that our subject_id and
+  // object_ids are real values.  There are two ways to get the value, either
+  // just with the text value or with an [id: \d+] string embedded.  If the
+  // later we will pull it out.
+  $subject_id = '';
+  $matches = array();
+  if (preg_match('/\[id: (\d+)\]/', $subject_name, $matches)) {
+    $subject_id = $matches[1];
+    tripal_chado_set_field_form_values($field_name, $form_state, $subject_id, $delta, $field_table . '__subject_id');
+  }
+  else {
+    $values = array(
+      'uniquename' => $subject_name,
+    );
+    $fkey_rcolumn = $fkeys[$base_table]['columns']['subject_id'];
+    $subject = chado_select_record($base_table, array($fkey_rcolumn), $values);
+    if (count($subject) == 0) {
+      form_set_error(implode('][', $element ['#parents']) . '][subject_name',
+          t("The subject record cannot be found. Please check spelling."));
+    }
+    elseif (count($subject) > 1) {
+      form_set_error(implode('][', $element ['#parents']) . '][subject_name',
+          t("The subject is not unique and therefore the relationship cannot be made."));
+    }
+    else {
+      $subject_id = $subject[0]->$fkey_rcolumn;
+      tripal_chado_set_field_form_values($field_name, $form_state, $subject_id, $delta, $field_table . '__subject_id');
+    }
+  }
+
+  // Now check for a matching object.
+  $object_id = '';
+  $matches = array();
+  if (preg_match('/\[id: (\d+)\]/', $object_name, $matches)) {
+    $object_id = $matches[1];
+    tripal_chado_set_field_form_values($field_name, $form_state, $object_id, $delta, $field_table . '__object_id');
+  }
+  else {
+    $values = array(
+      'uniquename' => $object_name,
+    );
+    $fkey_rcolumn = $fkeys[$base_table]['columns']['object_id'];
+    $object = chado_select_record($base_table, array($fkey_rcolumn), $values);
+    if (count($object) == 0) {
+      form_set_error(implode('][', $element ['#parents']) . '][object_name',
+          t("The object record cannot be found. Please check spelling."));
+    }
+    elseif (count($object) > 1) {
+      form_set_error(implode('][', $element ['#parents']) . '][object_name',
+          t("The object is not unique and therefore the relationship cannot be made."));
+    }
+    else {
+      $object_id = $object[0]->$fkey_rcolumn;
+      tripal_chado_set_field_form_values($field_name, $form_state, $object_id, $delta, $field_table . '__object_id');
+    }
+  }
+
+  // Make sure that either our object or our subject refers to the base record.
+  if ($object_id != $chado_record_id  and $subject_id != $chado_record_id) {
+    form_set_error(implode('][', $element ['#parents']) . '][subject_name',
+        t("Either the subject or the object in the relationship must refer to this record."));
+  }
+
+  if ($object_id == $chado_record_id  and $subject_id == $chado_record_id) {
+    form_set_error(implode('][', $element ['#parents']) . '][subject_name',
+        t("The subject and the object in the relationship cannot both refer to this record."));
+  }
+
+  // Now set the type_id to be the setting of the type_name field.
+  tripal_chado_set_field_form_values($field_name, $form_state, $type_name, $delta, $field_table . '__type_id');
+
+  // Reset the ranks of all fields based on their re-ordering in the form.
+  $schema = chado_get_schema($field_table);
+  if (array_key_exists('rank', $schema['fields'])) {
+    $weight = tripal_chado_get_field_form_values($field_name, $form_state, $delta, '_weight');
+    tripal_chado_set_field_form_values($field_name, $form_state, $weight, $delta, $field_table . '__rank');
+  }
+
+ // form_set_error(implode('][', $element ['#parents']) . ']['type_name',
+ //     t("Please provide the type of relationship."));
+}

+ 2 - 2
tripal_chado/includes/fields/chado_linker__synonym.inc

@@ -104,8 +104,8 @@ class chado_linker__synonym extends TripalField {
   /**
    * @see TripalField::widget_form()
    */
-  function widget_form(&$widget, $form, $form_state, $field,
-      $instance, $langcode, $items, $delta, $element) {
+  public function widget_form(&$widget, &$form, &$form_state, $field, $instance,
+      $langcode, $items, $delta, $element) {
 
     $entity = $form['#entity'];
     $field_name = $field['field_name'];

+ 1 - 1
tripal_chado/includes/fields/chado_organism__type_id.inc

@@ -82,7 +82,7 @@ class chado_organism__type_id extends TripalField {
   /**
    * @see TripalField::widget()
    */
-  public function widget_form(&$widget, $form, $form_state, $field, $instance,
+  public function widget_form(&$widget, &$form, &$form_state, $field, $instance,
       $langcode, $items, $delta, $element) {
 
     $settings = $field['settings'];

+ 321 - 0
tripal_chado/includes/tripal_chado.cv_defaults.inc

@@ -0,0 +1,321 @@
+<?php
+/**
+ * Provide landing page to the new admin pages
+ *
+ * @ingroup tripal_chado
+ */
+function tripal_chado_admin_cv_listing() {
+  $output = '';
+
+  // set the breadcrumb
+  $breadcrumb = array();
+  $breadcrumb[] = l('Home', '<front>');
+  $breadcrumb[] = l('Administration', 'admin');
+  $breadcrumb[] = l('Tripal', 'admin/tripal');
+  $breadcrumb[] = l('Chado Modules', 'admin/tripal/chado');
+  $breadcrumb[] = l('Vocabularies', 'admin/tripal/vocab');
+  drupal_set_breadcrumb($breadcrumb);
+
+  // Add the view
+  $cvs_view = views_embed_view('tripal_chado_admin_cvs','default');
+  $cvterms_view = views_embed_view('tripal_chado_admin_cvterms','default');
+  if (isset($cvs_view) && isset($cvterms_view)) {
+    $output .= $cvs_view;
+  }
+  else {
+    $output .= '<p>The Tripal Controlled Vocabulary module uses primarily views to provide an '
+        . 'administrative interface. Currently one or more views needed for this '
+            . 'administrative interface are disabled. <strong>Click each of the following links to '
+                . 'enable the pertinent views</strong>:</p>';
+    $output .= '<ul>';
+    if (!isset($cvs_view)) {
+      $output .= '<li>'.l('Tripal Vocabularies', 'admin/tripal/vocab/views/cvs/enable').'</li>';
+    }
+    if (!isset($cvterm_view)) {
+      $output .= '<li>'.l('Tripal Vocabulary Terms', 'admin/tripal/vocab/views/cvterms/enable').'</li>';
+    }
+    $output .= '</ul>';
+  }
+
+  return $output;
+}
+
+/**
+ *
+ */
+function tripal_chado_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, '.
+        'a feature must have a "type" which is typically a term from ' .
+        'the Sequence Ontology. Record properties typically have a type as well. '.
+        'Tripal allows the administrator to set a default type for each table in '.
+        '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'),
+    '#description' => t('The following tables have a default vocabulary'),
+    '#tree' => TRUE,
+  );
+  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,
+    );
+
+    // 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-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' => $default_cv,
+    );
+
+    // Actions
+    $view_terms = l('New Vocabulary', 'admin/tripal/vocab/cv/add');
+    $add_term = '';
+    if (!empty($cv)) {
+      $view_terms = l(
+          'View Terms',
+          'admin/tripal/vocab/cvterms',
+          array('query' => array('cv' => $cv->name))
+      );
+
+      $add_term = l(
+          'Add Term',
+          'admin/tripal/vocab/cv/' . $cv->cv_id . '/cvterm/add'
+      );
+    }
+    $form['settings']['existing'][$cv_default_id]["view-terms"] = array(
+      '#type' => 'markup',
+      '#markup' => $view_terms
+    );
+    $form['settings']['existing'][$cv_default_id]["add-new-term"] = array(
+      '#type' => 'markup',
+      '#markup' => $add_term
+    );
+
+  }
+
+  $form['settings']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => 'Update Defaults'
+  );
+
+  // Adding new CV Defaults
+  $form['new'] = array(
+    '#type' => 'fieldset',
+    '#title' => 'Add New Defaults',
+    '#description' => 'You can use the form below to add a default controlled vocabulary
+      for a table/field combination not available in the "Configured Defaults" section above.',
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+    '#tree' => TRUE,
+    '#prefix' => '<div id="new-default">',
+    '#suffix' => '</div>',
+  );
+
+  $tripal_msg = tripal_set_message(
+      'If you are developing a custom module and would like to use the Default Controlled
+      Vocabulary API to flexibly set the controlled vocabulary, then it is better to set
+      the default programatically rather than through this interface. To do this <ol>
+        <li>Tell Tripal about the table/field you would like to set the default for. This
+          is done by implementing hook_install() in your modules .install file and adding
+          a call to <code>tripal_set_default_cv([table name], [field name], [cv name])</code> which
+          will set the default for <code>[table name].[field name]</code> to the <code>[cv name]</code> controlled
+          vocabulary. This vocabulary must already exist.</li>
+        <li>Then everywhere in your module that you need to know the controlled vocabulary,
+          you call <code>tripal_get_default_cv([table name], [field name])</code> which will return
+          an object describing the set default controlled vocabulary or call
+          <code>tripal_get_cvterm_default_select_options([table name], [field name], [field friendly name])</code>
+          if you would like an array of options for use in a select or autocomplete form element.</li></ol>
+      ',
+      TRIPAL_NOTICE,
+      array('return_html' => TRUE)
+  );
+
+  $form['new']['instructions'] = array(
+    '#type' => 'markup',
+    '#markup' => $tripal_msg
+  );
+
+  $chado_tables = chado_get_table_names(TRUE);
+  $chado_tables[0] = 'Select a Table';
+  $form['new']['table'] = array(
+    '#type' => 'select',
+    '#title' => 'Table Name',
+    '#description' => 'The name of the table you would like to set a controlled vocabulary default for.',
+    '#options' => $chado_tables,
+    '#default_value' => 0,
+    '#ajax' => array(
+      'callback' => 'tripal_chado_admin_ajax_new_default_field_callback',
+      'wrapper' => 'new-default',
+    )
+  );
+
+  $table = (isset($form_state['values']['new']['table']))? $form_state['values']['new']['table'] : FALSE;
+  $columns = array('Select a Field');
+  if ($table) {
+    // get the table description
+    $table_desc = chado_get_schema($table);
+    if (isset($table_desc['foreign keys']['cvterm'])) {
+      foreach ($table_desc['foreign keys']['cvterm']['columns'] as $left_column => $right_column) {
+        $columns[$left_column] = $left_column;
+      }
+    }
+  }
+  $form['new']['field'] = array(
+    '#type' => 'select',
+    '#title' => 'Field Name',
+    '#description' => 'The name of the field you would like to set a controlled vocabulary default for.',
+    '#options' => $columns,
+    '#default_value' => 0
+  );
+
+  $cvs[0] = 'Select a Vocabulary';
+  $form['new']['vocabulary'] = array(
+    '#type' => 'select',
+    '#title' => 'Vocabulary',
+    '#description' => 'The default controlled vocabulary you would like to set for this field.',
+    '#options' => $cvs,
+    '#default_value' => 0
+  );
+
+  $form['new']['add_new'] = array(
+    '#type' => 'submit',
+    '#value' => 'Set New Default'
+  );
+
+  return $form;
+}
+
+function tripal_chado_admin_set_defaults_form_submit($form, $form_state) {
+
+  if ($form_state['triggering_element']['#value'] == 'Update Defaults') {
+    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']
+        );
+      }
+    }
+  }
+
+  if ($form_state['triggering_element']['#value'] == 'Set New Default') {
+    if (!empty($form_state['values']['new']['vocabulary'])) {
+      tripal_set_default_cv(
+          $form_state['values']['new']['table'],
+          $form_state['values']['new']['field'],
+          '', // We are passing in the cv_id so we don't need the name
+          $form_state['values']['new']['vocabulary']
+      );
+    }
+  }
+}
+
+function tripal_chado_admin_ajax_new_default_field_callback($form, $form_state) {
+  return $form['new'];
+}
+
+/**
+ *
+ * @param unknown $variables
+ */
+function theme_tripal_chado_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' => '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-display']),
+        drupal_render($value['field_name-display']),
+        drupal_render($value['vocabulary']),
+        $action_links
+      );
+    }
+  }
+  $settings_table = theme('table', array(
+    'header' => $header,
+    'rows' => $rows
+  ));
+  $element['settings']['existing'] = array(
+    '#type' => 'markup',
+    '#markup' => $settings_table,
+  );
+
+  // TODO: I believe rendering of the form should not happen here. But rather
+  // the form should be returned as is. This way other modules can have access
+  // to the form elements via the hook_form_alter.  Rather, there should
+  // be a theme function for the form where the rendering in the table
+  // should occur.  See the tripal_pub_importer_setup_form() for an exmaple.
+  return drupal_render_children($element);
+
+}

+ 1 - 0
tripal_chado/includes/tripal_chado.field_storage.inc

@@ -39,6 +39,7 @@ function tripal_chado_field_storage_write($entity_type, $entity, $op, $fields) {
 
   // Convert the fields into a key/value list of fields and their values.
   $field_vals = tripal_chado_field_storage_write_merge_fields($fields, $entity_type, $entity);
+  //dpm($field_vals);
 
   // First, write the record for the base table.  If we have a record id then
   // this is an upate and we need to set the primary key.  If not, then this

+ 6 - 1
tripal_chado/theme/css/tripal_chado.css

@@ -3,7 +3,8 @@
 .synonym-widget-item,
 .primary-dbxref-widget-item,
 .secondary-dbxref-widget-item,
-.kvproperty-adder-widget-item {
+.kvproperty-adder-widget-item,
+.chado-linker--relationship-widget-item {
    float: left;
    margin-right: 10px;
 }
@@ -32,4 +33,8 @@
   white-space: normal;
   margin: 0;
   border-bottom: 0.5px solid #666666;
+}
+
+#autocomplete {
+  width: 600px !important;
 }

+ 30 - 0
tripal_chado/tripal_chado.module

@@ -16,6 +16,7 @@ require_once 'api/tripal_chado.schema_v1.3.api.inc';
 require_once 'api/tripal_chado.schema_v1.2.api.inc';
 require_once 'api/tripal_chado.schema_v1.11.api.inc';
 require_once 'api/tripal_chado.semweb.api.inc';
+require_once 'api/tripal_chado.views.api.inc';
 
 // Chado module specific API functions
 require_once 'api/modules/tripal_chado.analysis.api.inc';
@@ -152,6 +153,7 @@ function tripal_chado_menu() {
     'weight' => -99
   );
 
+  // Adds a +Publish Chado Content link on the 'Tripal Content Types' page.
   $items['admin/structure/bio_data/publish'] = array(
     'title' => 'Publish Chado Content',
     'description' => t('Publish data that is present in Chado but which does
@@ -166,6 +168,17 @@ function tripal_chado_menu() {
     'weight' => 2
   );
 
+  $items['admin/tripal/storage/chado/vocab'] = array(
+    'title' => 'Vocabulary Defaults',
+    'description' => 'Set the default vocabularies for properties and relationships.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('tripal_chado_admin_set_defaults_form'),
+    'file' => 'includes/tripal_chado.cv_defaults.inc',
+    'file path' => drupal_get_path('module', 'tripal_chado'),
+    'access arguments' => array('administer controlled vocabularies'),
+    'type' => MENU_NORMAL_ITEM,
+  );
+
 
   //////////////////////////////////////////////////////////////////////////////
   //                       Materialized Views
@@ -492,6 +505,14 @@ function tripal_chado_menu() {
     'file path' => drupal_get_path('module', 'tripal_chado'),
     'type' => MENU_CALLBACK,
   );
+  $items['admin/tripal/storage/chado/auto_name/feature/%'] = array(
+    'page callback' => 'tripal_autocomplete_feature',
+    'page arguments' => array(6),
+    'access arguments' => array('access content'),
+    'file' => 'api/modules/tripal_chado.feature.api.inc',
+    'file path' => drupal_get_path('module', 'tripal_chado'),
+    'type' => MENU_CALLBACK,
+  );
   return $items;
 
 }
@@ -530,6 +551,7 @@ function tripal_chado_permission() {
  */
 function tripal_chado_theme($existing, $type, $theme, $path) {
   $themes = array(
+
     // Theme fields.
     'chado_base__dbxref_id_widget' => array(
       'render element' => 'element',
@@ -547,6 +569,10 @@ function tripal_chado_theme($existing, $type, $theme, $path) {
       'render element' => 'element',
       'file' => 'includes/fields/chado_linker__synonym.inc',
     ),
+    'chado_linker__relationship_widget' => array(
+      'render element' => 'element',
+      'file' => 'includes/fields/chado_linker__relationship.inc',
+    ),
     'chado_linker__pub_widget' => array(
       'render element' => 'element',
       'file' => 'includes/fields/chado_linker__pub.inc',
@@ -569,6 +595,10 @@ function tripal_chado_theme($existing, $type, $theme, $path) {
       'render element' => 'form',
       'file' => 'includes/loaders/tripal_chado.pub_importers.inc',
     ),
+    'tripal_chado_admin_set_defaults_form' => array(
+      'function' => 'theme_tripal_chado_admin_set_defaults_form',
+      'render element' => 'element',
+    ),
   );
 
   // Override the theme for each entity to use the legacy modules

+ 455 - 4
tripal_chado/tripal_chado.views_default.inc

@@ -12,10 +12,22 @@
 function tripal_chado_views_default_views() {
   $views = array();
 
-  $view = tripal_admin_defaultview_custom_tables();
+  // Default Tripal custom tables view.
+  $view = tripal_chado_defaultview_admin_custom_tables();
   $views[$view->name] = $view;
 
-  $view = tripal_admin_defaultview_mviews();
+  // Default Trial materialized views view.
+  $view = tripal_chado_defaultview_admin_mviews();
+  $views[$view->name] = $view;
+
+  // Default Tripal admin view: CVs.
+  $view = tripal_chado_defaultview_admin_cvs_listing();
+  $view = tripal_make_view_compatible_with_external($view);
+  $views[$view->name] = $view;
+
+  // Default Tripal admin view: CV Terms.
+  $view = tripal_chado_defaultview_admin_cvterms_listing();
+  $view = tripal_make_view_compatible_with_external($view);
   $views[$view->name] = $view;
 
   return $views;
@@ -26,7 +38,7 @@ function tripal_chado_views_default_views() {
  *
  * @ingroup tripal
  */
-function tripal_admin_defaultview_custom_tables() {
+function tripal_chado_defaultview_admin_custom_tables() {
 
   $view = new view();
   $view->name = 'tripal_admin_custom_table';
@@ -157,7 +169,7 @@ function tripal_admin_defaultview_custom_tables() {
  *
  * @ingroup tripal
  */
-function tripal_admin_defaultview_mviews() {
+function tripal_chado_defaultview_admin_mviews() {
 
   $view = new view();
   $view->name = 'tripal_admin_mviews';
@@ -418,3 +430,442 @@ function tripal_admin_defaultview_mviews() {
 
   return $view;
 }
+
+/**
+ * Default Admin View for cv management
+ *
+ * @ingroup tripal_cv
+ */
+function tripal_chado_defaultview_admin_cvs_listing() {
+
+  $view = new view();
+  $view->name = 'tripal_cv_admin_cvs';
+  $view->description = 'DO NOT DISABLE';
+  $view->tag = 'tripal admin';
+  $view->base_table = 'cv';
+  $view->human_name = 'CVs Admin';
+  $view->core = 6;
+  $view->api_version = '3.0';
+  $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
+
+  /* Display: Defaults */
+  $handler = $view->new_display('default', 'Defaults', 'default');
+  $handler->display->display_options['title'] = 'Controlled Vocabularies';
+  $handler->display->display_options['use_more_always'] = FALSE;
+  $handler->display->display_options['access']['type'] = 'perm';
+  $handler->display->display_options['access']['perm'] = 'administer controlled vocabularies';
+  $handler->display->display_options['cache']['type'] = 'none';
+  $handler->display->display_options['query']['type'] = 'views_query';
+  $handler->display->display_options['exposed_form']['type'] = 'input_required';
+  $handler->display->display_options['exposed_form']['options']['submit_button'] = 'Search';
+  $handler->display->display_options['exposed_form']['options']['text_input_required'] = 'Click search to see a listing of controlled vocabularies that meet the filter requirements. Use the filters to restrict this set to a more reasonable number of vocabularies or to find a specific vocabulary.';
+  $handler->display->display_options['exposed_form']['options']['text_input_required_format'] = 'full_html';
+  $handler->display->display_options['pager']['type'] = 'full';
+  $handler->display->display_options['pager']['options']['items_per_page'] = '25';
+  $handler->display->display_options['pager']['options']['offset'] = '0';
+  $handler->display->display_options['pager']['options']['id'] = '0';
+  $handler->display->display_options['pager']['options']['quantity'] = '9';
+  $handler->display->display_options['style_plugin'] = 'table';
+  $handler->display->display_options['style_options']['grouping'] = '';
+  $handler->display->display_options['style_options']['columns'] = array(
+    'name' => 'name',
+    'definition' => 'definition',
+    'nothing' => 'nothing',
+  );
+  $handler->display->display_options['style_options']['default'] = 'name';
+  $handler->display->display_options['style_options']['info'] = array(
+    'name' => array(
+      'sortable' => 1,
+      'separator' => '',
+    ),
+    'definition' => array(
+      'sortable' => 0,
+      'separator' => '',
+    ),
+    'nothing' => array(
+      'separator' => '',
+    ),
+  );
+  /* Header: Global: Action Links */
+  $handler->display->display_options['header']['action_links_area']['id'] = 'action_links_area';
+  $handler->display->display_options['header']['action_links_area']['table'] = 'views';
+  $handler->display->display_options['header']['action_links_area']['field'] = 'action_links_area';
+  $handler->display->display_options['header']['action_links_area']['label'] = 'Action Links';
+  $handler->display->display_options['header']['action_links_area']['empty'] = TRUE;
+  $handler->display->display_options['header']['action_links_area']['link-1'] = array(
+    'label-1' => 'Add Vocabulary',
+    'path-1' => 'admin/tripal/vocab/cv/add',
+  );
+  $handler->display->display_options['header']['action_links_area']['link-2'] = array(
+    'label-2' => 'Load Ontology',
+    'path-2' => 'admin/tripal/vocab/obo_loader',
+  );
+  /* No results behavior: Global: Text area */
+  $handler->display->display_options['empty']['text']['id'] = 'area';
+  $handler->display->display_options['empty']['text']['table'] = 'views';
+  $handler->display->display_options['empty']['text']['field'] = 'area';
+  $handler->display->display_options['empty']['text']['content'] = 'No controlled vocabularies match the supplied criteria.';
+  $handler->display->display_options['empty']['text']['format'] = '2';
+  /* Field: Chado Cv: Cv Id */
+  $handler->display->display_options['fields']['cv_id']['id'] = 'cv_id';
+  $handler->display->display_options['fields']['cv_id']['table'] = 'cv';
+  $handler->display->display_options['fields']['cv_id']['field'] = 'cv_id';
+  $handler->display->display_options['fields']['cv_id']['exclude'] = TRUE;
+  $handler->display->display_options['fields']['cv_id']['separator'] = '';
+  /* Field: Chado Cv: Name */
+  $handler->display->display_options['fields']['name']['id'] = 'name';
+  $handler->display->display_options['fields']['name']['table'] = 'cv';
+  $handler->display->display_options['fields']['name']['field'] = 'name';
+  /* Field: Chado Cv: Definition */
+  $handler->display->display_options['fields']['definition']['id'] = 'definition';
+  $handler->display->display_options['fields']['definition']['table'] = 'cv';
+  $handler->display->display_options['fields']['definition']['field'] = 'definition';
+  /* Field: Global: Custom text */
+  $handler->display->display_options['fields']['nothing_1']['id'] = 'nothing_1';
+  $handler->display->display_options['fields']['nothing_1']['table'] = 'views';
+  $handler->display->display_options['fields']['nothing_1']['field'] = 'nothing';
+  $handler->display->display_options['fields']['nothing_1']['label'] = 'Edit Link';
+  $handler->display->display_options['fields']['nothing_1']['exclude'] = TRUE;
+  $handler->display->display_options['fields']['nothing_1']['alter']['text'] = 'edit';
+  $handler->display->display_options['fields']['nothing_1']['alter']['make_link'] = TRUE;
+  $handler->display->display_options['fields']['nothing_1']['alter']['path'] = 'admin/tripal/vocab/cv/edit/[cv_id]';
+  /* Field: Global: Custom text */
+  $handler->display->display_options['fields']['nothing']['id'] = 'nothing';
+  $handler->display->display_options['fields']['nothing']['table'] = 'views';
+  $handler->display->display_options['fields']['nothing']['field'] = 'nothing';
+  $handler->display->display_options['fields']['nothing']['label'] = 'View Terms link';
+  $handler->display->display_options['fields']['nothing']['exclude'] = TRUE;
+  $handler->display->display_options['fields']['nothing']['alter']['text'] = 'View Terms';
+  $handler->display->display_options['fields']['nothing']['alter']['make_link'] = TRUE;
+  $handler->display->display_options['fields']['nothing']['alter']['path'] = 'admin/tripal/vocab/cvterms?cv=[name]';
+  $handler->display->display_options['fields']['nothing']['hide_alter_empty'] = TRUE;
+  /* Field: Global: Custom text */
+  $handler->display->display_options['fields']['nothing_3']['id'] = 'nothing_3';
+  $handler->display->display_options['fields']['nothing_3']['table'] = 'views';
+  $handler->display->display_options['fields']['nothing_3']['field'] = 'nothing';
+  $handler->display->display_options['fields']['nothing_3']['label'] = 'Add term';
+  $handler->display->display_options['fields']['nothing_3']['exclude'] = TRUE;
+  $handler->display->display_options['fields']['nothing_3']['alter']['text'] = 'Add Term';
+  $handler->display->display_options['fields']['nothing_3']['alter']['make_link'] = TRUE;
+  $handler->display->display_options['fields']['nothing_3']['alter']['path'] = 'admin/tripal/vocab/cv/[cv_id]/cvterm/add';
+  /* Field: Global: Custom text */
+  $handler->display->display_options['fields']['nothing_2']['id'] = 'nothing_2';
+  $handler->display->display_options['fields']['nothing_2']['table'] = 'views';
+  $handler->display->display_options['fields']['nothing_2']['field'] = 'nothing';
+  $handler->display->display_options['fields']['nothing_2']['label'] = '';
+  $handler->display->display_options['fields']['nothing_2']['alter']['text'] = '[nothing_1]<br />
+    [nothing]   [nothing_3]';
+  $handler->display->display_options['fields']['nothing_2']['element_class'] = 'short-column';
+  $handler->display->display_options['fields']['nothing_2']['element_label_class'] = 'short-column';
+  $handler->display->display_options['fields']['nothing_2']['element_label_colon'] = FALSE;
+  /* Sort criterion: Chado Cv: Name */
+  $handler->display->display_options['sorts']['name']['id'] = 'name';
+  $handler->display->display_options['sorts']['name']['table'] = 'cv';
+  $handler->display->display_options['sorts']['name']['field'] = 'name';
+  /* Filter criterion: Chado Cv: Name */
+  $handler->display->display_options['filters']['name']['id'] = 'name';
+  $handler->display->display_options['filters']['name']['table'] = 'cv';
+  $handler->display->display_options['filters']['name']['field'] = 'name';
+  $handler->display->display_options['filters']['name']['operator'] = 'contains';
+  $handler->display->display_options['filters']['name']['group'] = '0';
+  $handler->display->display_options['filters']['name']['exposed'] = TRUE;
+  $handler->display->display_options['filters']['name']['expose']['operator_id'] = 'name_op';
+  $handler->display->display_options['filters']['name']['expose']['label'] = 'Name Contains';
+  $handler->display->display_options['filters']['name']['expose']['operator'] = 'name_op';
+  $handler->display->display_options['filters']['name']['expose']['identifier'] = 'name';
+  $handler->display->display_options['filters']['name']['expose']['remember_roles'] = array(
+    2 => '2',
+    1 => 0,
+    3 => 0,
+  );
+  /* Filter criterion: Chado Cv: Definition */
+  $handler->display->display_options['filters']['definition']['id'] = 'definition';
+  $handler->display->display_options['filters']['definition']['table'] = 'cv';
+  $handler->display->display_options['filters']['definition']['field'] = 'definition';
+  $handler->display->display_options['filters']['definition']['operator'] = 'contains';
+  $handler->display->display_options['filters']['definition']['group'] = '0';
+  $handler->display->display_options['filters']['definition']['exposed'] = TRUE;
+  $handler->display->display_options['filters']['definition']['expose']['operator_id'] = 'definition_op';
+  $handler->display->display_options['filters']['definition']['expose']['label'] = 'Definition Contains';
+  $handler->display->display_options['filters']['definition']['expose']['operator'] = 'definition_op';
+  $handler->display->display_options['filters']['definition']['expose']['identifier'] = 'definition';
+  $handler->display->display_options['filters']['definition']['expose']['remember_roles'] = array(
+    2 => '2',
+    1 => 0,
+    3 => 0,
+  );
+
+  /** MANUALLY ADD since filter handler not exporting correctly */
+  $handler->display->display_options['filters']['name']['expose']['values_form_type'] = 'textfield';
+  $handler->display->display_options['filters']['name']['expose']['select_multiple'] = FALSE;
+  $handler->display->display_options['filters']['name']['expose']['select_optional'] = FALSE;
+  $handler->display->display_options['filters']['name']['expose']['max_length'] = 40;
+
+  /* Display: Page */
+  $handler = $view->new_display('page', 'Page', 'page_1');
+  $handler->display->display_options['path'] = 'admin/tripal/vocab/cvs';
+  $handler->display->display_options['menu']['type'] = 'default tab';
+  $handler->display->display_options['menu']['title'] = 'Vocabularies';
+  $handler->display->display_options['menu']['description'] = 'A listing of all controlled vocabularies';
+  $handler->display->display_options['menu']['weight'] = '-10';
+  $handler->display->display_options['menu']['name'] = 'management';
+  $handler->display->display_options['menu']['context'] = 0;
+  $handler->display->display_options['menu']['context_only_inline'] = 0;
+  $handler->display->display_options['tab_options']['weight'] = '0';
+
+
+  /** MANUALLY ADD since filter handler no exporting correctly
+   $handler->display->display_options['filters']['name']['expose']['values_form_type'] = 'textfield';
+   $handler->display->display_options['filters']['name']['expose']['select_multiple'] = FALSE;
+   $handler->display->display_options['filters']['name']['expose']['select_optional'] = FALSE;
+   $handler->display->display_options['filters']['name']['expose']['max_length'] = 40;
+   */
+
+  return $view;
+}
+
+/**
+ * Default Admin View for cvterm management
+ *
+ * @ingroup tripal_cv
+ */
+function tripal_chado_defaultview_admin_cvterms_listing() {
+
+  $view = new view();
+  $view->name = 'tripal_cv_admin_cvterms';
+  $view->description = 'DO NOT DISABLE';
+  $view->tag = 'tripal admin';
+  $view->base_table = 'cvterm';
+  $view->human_name = 'CV Terms Admin';
+  $view->core = 0;
+  $view->api_version = '3.0';
+  $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
+
+  /* Display: Defaults */
+  $handler = $view->new_display('default', 'Defaults', 'default');
+  $handler->display->display_options['title'] = 'Controlled Vocabulary Terms';
+  $handler->display->display_options['use_more_always'] = FALSE;
+  $handler->display->display_options['access']['type'] = 'perm';
+  $handler->display->display_options['access']['perm'] = 'administer controlled vocabularies';
+  $handler->display->display_options['cache']['type'] = 'none';
+  $handler->display->display_options['query']['type'] = 'views_query';
+  $handler->display->display_options['exposed_form']['type'] = 'input_required';
+  $handler->display->display_options['exposed_form']['options']['submit_button'] = 'Search';
+  $handler->display->display_options['exposed_form']['options']['text_input_required'] = 'Click search to see a listing of controlled vocabulary terms that meet the filter requirements. Use the filters to restrict this set to a more reasonable number of terms or to find a specific term.';
+  $handler->display->display_options['exposed_form']['options']['text_input_required_format'] = 'full_html';
+  $handler->display->display_options['pager']['type'] = 'full';
+  $handler->display->display_options['pager']['options']['items_per_page'] = '25';
+  $handler->display->display_options['pager']['options']['offset'] = '0';
+  $handler->display->display_options['pager']['options']['id'] = '0';
+  $handler->display->display_options['pager']['options']['quantity'] = '9';
+  $handler->display->display_options['style_plugin'] = 'table';
+  $handler->display->display_options['style_options']['grouping'] = '';
+  $handler->display->display_options['style_options']['columns'] = array(
+    'name_1' => 'name_1',
+    'name' => 'name',
+    'definition' => 'definition',
+    'is_obsolete' => 'is_obsolete',
+    'is_relationshiptype' => 'is_relationshiptype',
+  );
+  $handler->display->display_options['style_options']['default'] = '-1';
+  $handler->display->display_options['style_options']['info'] = array(
+    'name_1' => array(
+      'sortable' => 1,
+      'separator' => '',
+    ),
+    'name' => array(
+      'sortable' => 1,
+      'separator' => '',
+    ),
+    'definition' => array(
+      'sortable' => 0,
+      'separator' => '',
+    ),
+    'is_obsolete' => array(
+      'sortable' => 1,
+      'separator' => '',
+    ),
+    'is_relationshiptype' => array(
+      'sortable' => 1,
+      'separator' => '',
+    ),
+  );
+  /* Header: Global: Action Links */
+  $handler->display->display_options['header']['action_links_area']['id'] = 'action_links_area';
+  $handler->display->display_options['header']['action_links_area']['table'] = 'views';
+  $handler->display->display_options['header']['action_links_area']['field'] = 'action_links_area';
+  $handler->display->display_options['header']['action_links_area']['label'] = 'Action Links';
+  $handler->display->display_options['header']['action_links_area']['empty'] = TRUE;
+  $handler->display->display_options['header']['action_links_area']['link-1'] = array(
+    'label-1' => 'Add Term',
+    'path-1' => 'admin/tripal/vocab/cvterm/add',
+  );
+  /* No results behavior: Global: Text area */
+  $handler->display->display_options['empty']['text']['id'] = 'area';
+  $handler->display->display_options['empty']['text']['table'] = 'views';
+  $handler->display->display_options['empty']['text']['field'] = 'area';
+  $handler->display->display_options['empty']['text']['content'] = 'There are no terms associated with the selected controlled vocabulary. Please select a different vocabulary from the list above.';
+  $handler->display->display_options['empty']['text']['format'] = '1';
+  /* Field: Chado Cv: Cv Id */
+  $handler->display->display_options['fields']['cv_id']['id'] = 'cv_id';
+  $handler->display->display_options['fields']['cv_id']['table'] = 'cv';
+  $handler->display->display_options['fields']['cv_id']['field'] = 'cv_id';
+  $handler->display->display_options['fields']['cv_id']['exclude'] = TRUE;
+  $handler->display->display_options['fields']['cv_id']['separator'] = '';
+  /* Field: Chado Cv: Name */
+  $handler->display->display_options['fields']['name_1']['id'] = 'name_1';
+  $handler->display->display_options['fields']['name_1']['table'] = 'cv';
+  $handler->display->display_options['fields']['name_1']['field'] = 'name';
+  $handler->display->display_options['fields']['name_1']['label'] = 'Vocabulary';
+  $handler->display->display_options['fields']['name_1']['alter']['make_link'] = TRUE;
+  $handler->display->display_options['fields']['name_1']['alter']['path'] = 'admin/tripal/vocab/cvs?name=[name_1]';
+  /* Field: Chado Cvterm: Cvterm Id */
+  $handler->display->display_options['fields']['cvterm_id']['id'] = 'cvterm_id';
+  $handler->display->display_options['fields']['cvterm_id']['table'] = 'cvterm';
+  $handler->display->display_options['fields']['cvterm_id']['field'] = 'cvterm_id';
+  $handler->display->display_options['fields']['cvterm_id']['exclude'] = TRUE;
+  $handler->display->display_options['fields']['cvterm_id']['separator'] = '';
+  /* Field: Chado Cvterm: Name */
+  $handler->display->display_options['fields']['name']['id'] = 'name';
+  $handler->display->display_options['fields']['name']['table'] = 'cvterm';
+  $handler->display->display_options['fields']['name']['field'] = 'name';
+  /* Field: Chado Cvterm: Definition */
+  $handler->display->display_options['fields']['definition']['id'] = 'definition';
+  $handler->display->display_options['fields']['definition']['table'] = 'cvterm';
+  $handler->display->display_options['fields']['definition']['field'] = 'definition';
+  $handler->display->display_options['fields']['definition']['element_class'] = 'wide-column';
+  $handler->display->display_options['fields']['definition']['element_label_class'] = 'wide-column';
+  /* Field: Chado Cvterm: Is Obsolete */
+  $handler->display->display_options['fields']['is_obsolete']['id'] = 'is_obsolete';
+  $handler->display->display_options['fields']['is_obsolete']['table'] = 'cvterm';
+  $handler->display->display_options['fields']['is_obsolete']['field'] = 'is_obsolete';
+  $handler->display->display_options['fields']['is_obsolete']['label'] = 'Obsolete?';
+  $handler->display->display_options['fields']['is_obsolete']['alter']['alter_text'] = TRUE;
+  $handler->display->display_options['fields']['is_obsolete']['alter']['text'] = 'Yes';
+  $handler->display->display_options['fields']['is_obsolete']['element_class'] = 'short-column';
+  $handler->display->display_options['fields']['is_obsolete']['element_label_class'] = 'short-column';
+  $handler->display->display_options['fields']['is_obsolete']['empty'] = 'No';
+  $handler->display->display_options['fields']['is_obsolete']['empty_zero'] = TRUE;
+  $handler->display->display_options['fields']['is_obsolete']['separator'] = '';
+  /* Field: Chado Cvterm: Is Relationshiptype */
+  $handler->display->display_options['fields']['is_relationshiptype']['id'] = 'is_relationshiptype';
+  $handler->display->display_options['fields']['is_relationshiptype']['table'] = 'cvterm';
+  $handler->display->display_options['fields']['is_relationshiptype']['field'] = 'is_relationshiptype';
+  $handler->display->display_options['fields']['is_relationshiptype']['label'] = 'Relation-ship?';
+  $handler->display->display_options['fields']['is_relationshiptype']['alter']['alter_text'] = TRUE;
+  $handler->display->display_options['fields']['is_relationshiptype']['alter']['text'] = 'Yes';
+  $handler->display->display_options['fields']['is_relationshiptype']['element_class'] = 'short-column';
+  $handler->display->display_options['fields']['is_relationshiptype']['element_label_class'] = 'short-column';
+  $handler->display->display_options['fields']['is_relationshiptype']['empty'] = 'No';
+  $handler->display->display_options['fields']['is_relationshiptype']['empty_zero'] = TRUE;
+  $handler->display->display_options['fields']['is_relationshiptype']['separator'] = '';
+  /* Field: Global: Custom text */
+  $handler->display->display_options['fields']['nothing']['id'] = 'nothing';
+  $handler->display->display_options['fields']['nothing']['table'] = 'views';
+  $handler->display->display_options['fields']['nothing']['field'] = 'nothing';
+  $handler->display->display_options['fields']['nothing']['label'] = 'Edit Link';
+  $handler->display->display_options['fields']['nothing']['exclude'] = TRUE;
+  $handler->display->display_options['fields']['nothing']['alter']['text'] = 'edit';
+  $handler->display->display_options['fields']['nothing']['alter']['make_link'] = TRUE;
+  $handler->display->display_options['fields']['nothing']['alter']['path'] = 'admin/tripal/vocab/cv/[cv_id]/cvterm/edit/[cvterm_id]';
+  /* Field: Global: Custom text */
+  $handler->display->display_options['fields']['nothing_1']['id'] = 'nothing_1';
+  $handler->display->display_options['fields']['nothing_1']['table'] = 'views';
+  $handler->display->display_options['fields']['nothing_1']['field'] = 'nothing';
+  $handler->display->display_options['fields']['nothing_1']['label'] = '';
+  $handler->display->display_options['fields']['nothing_1']['alter']['text'] = '[nothing]';
+  $handler->display->display_options['fields']['nothing_1']['element_class'] = 'short-column';
+  $handler->display->display_options['fields']['nothing_1']['element_label_class'] = 'short-column';
+  $handler->display->display_options['fields']['nothing_1']['element_label_colon'] = FALSE;
+  /* Sort criterion: Chado Cv: Name */
+  $handler->display->display_options['sorts']['name']['id'] = 'name';
+  $handler->display->display_options['sorts']['name']['table'] = 'cv';
+  $handler->display->display_options['sorts']['name']['field'] = 'name';
+  /* Sort criterion: Chado Cvterm: Name */
+  $handler->display->display_options['sorts']['name_1']['id'] = 'name_1';
+  $handler->display->display_options['sorts']['name_1']['table'] = 'cvterm';
+  $handler->display->display_options['sorts']['name_1']['field'] = 'name';
+  /* Filter criterion: Chado Cv: Name */
+  $handler->display->display_options['filters']['name']['id'] = 'name';
+  $handler->display->display_options['filters']['name']['table'] = 'cv';
+  $handler->display->display_options['filters']['name']['field'] = 'name';
+  $handler->display->display_options['filters']['name']['value'] = 'All';
+  $handler->display->display_options['filters']['name']['group'] = '0';
+  $handler->display->display_options['filters']['name']['exposed'] = TRUE;
+  $handler->display->display_options['filters']['name']['expose']['operator_id'] = 'name_op';
+  $handler->display->display_options['filters']['name']['expose']['label'] = 'Vocabulary';
+  $handler->display->display_options['filters']['name']['expose']['operator'] = 'name_op';
+  $handler->display->display_options['filters']['name']['expose']['identifier'] = 'cv';
+  $handler->display->display_options['filters']['name']['expose']['remember_roles'] = array(
+    2 => '2',
+    1 => 0,
+    3 => 0,
+  );
+  /* Filter criterion: Chado Cvterm: Name */
+  $handler->display->display_options['filters']['name_1']['id'] = 'name_1';
+  $handler->display->display_options['filters']['name_1']['table'] = 'cvterm';
+  $handler->display->display_options['filters']['name_1']['field'] = 'name';
+  $handler->display->display_options['filters']['name_1']['operator'] = 'contains';
+  $handler->display->display_options['filters']['name_1']['group'] = '0';
+  $handler->display->display_options['filters']['name_1']['exposed'] = TRUE;
+  $handler->display->display_options['filters']['name_1']['expose']['operator_id'] = '';
+  $handler->display->display_options['filters']['name_1']['expose']['label'] = 'Name Contains';
+  $handler->display->display_options['filters']['name_1']['expose']['identifier'] = 'name';
+  $handler->display->display_options['filters']['name_1']['expose']['remember_roles'] = array(
+    2 => '2',
+    1 => 0,
+    3 => 0,
+  );
+  /* Filter criterion: Chado Cvterm: Definition */
+  $handler->display->display_options['filters']['definition']['id'] = 'definition';
+  $handler->display->display_options['filters']['definition']['table'] = 'cvterm';
+  $handler->display->display_options['filters']['definition']['field'] = 'definition';
+  $handler->display->display_options['filters']['definition']['operator'] = 'contains';
+  $handler->display->display_options['filters']['definition']['group'] = '0';
+  $handler->display->display_options['filters']['definition']['exposed'] = TRUE;
+  $handler->display->display_options['filters']['definition']['expose']['operator_id'] = 'definition_op';
+  $handler->display->display_options['filters']['definition']['expose']['label'] = 'Definition Contains';
+  $handler->display->display_options['filters']['definition']['expose']['operator'] = 'definition_op';
+  $handler->display->display_options['filters']['definition']['expose']['identifier'] = 'definition';
+  $handler->display->display_options['filters']['definition']['expose']['remember_roles'] = array(
+    2 => '2',
+    1 => 0,
+    3 => 0,
+  );
+
+  /** MANUALLY ADDED since filter handler no exporting correctly */
+  $handler->display->display_options['filters']['name']['expose']['values_form_type'] = 'select';
+  $handler->display->display_options['filters']['name']['expose']['select_multiple'] = FALSE;
+  $handler->display->display_options['filters']['name']['expose']['select_optional'] = TRUE;
+  $handler->display->display_options['filters']['name']['expose']['max_length'] = 40;
+
+  $handler->display->display_options['filters']['name_1']['expose']['values_form_type'] = 'textfield';
+  $handler->display->display_options['filters']['name_1']['expose']['select_multiple'] = FALSE;
+  $handler->display->display_options['filters']['name_1']['expose']['select_optional'] = FALSE;
+  $handler->display->display_options['filters']['name_1']['expose']['max_length'] = 40;
+
+  /* Display: Page */
+  $handler = $view->new_display('page', 'Page', 'page_1');
+  $handler->display->display_options['path'] = 'admin/tripal/vocab/cvterms';
+  $handler->display->display_options['menu']['type'] = 'tab';
+  $handler->display->display_options['menu']['title'] = 'Terms';
+  $handler->display->display_options['menu']['description'] = 'A listing of a controlled vocabulary terms for a given vocabulary';
+  $handler->display->display_options['menu']['weight'] = '-8';
+  $handler->display->display_options['menu']['name'] = 'management';
+  $handler->display->display_options['menu']['context'] = 0;
+  $handler->display->display_options['menu']['context_only_inline'] = 0;
+
+  /** MANUALLY ADD since filter handler no exporting correctly
+   $handler->display->display_options['filters']['name']['expose']['values_form_type'] = 'select';
+   $handler->display->display_options['filters']['name']['expose']['select_multiple'] = FALSE;
+   $handler->display->display_options['filters']['name']['expose']['select_optional'] = TRUE;
+   $handler->display->display_options['filters']['name']['expose']['max_length'] = 40;
+
+   $handler->display->display_options['filters']['name_1']['expose']['values_form_type'] = 'textfield';
+   $handler->display->display_options['filters']['name_1']['expose']['select_multiple'] = FALSE;
+   $handler->display->display_options['filters']['name_1']['expose']['select_optional'] = FALSE;
+   $handler->display->display_options['filters']['name_1']['expose']['max_length'] = 40;
+   */
+
+  return $view;
+}