瀏覽代碼

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 9 年之前
父節點
當前提交
29a016cd4a
共有 33 個文件被更改,包括 1329 次插入1059 次删除
  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;
+}