Browse Source

Split edit/add forms for simpler logic and added 'Register' instance form.

Lacey Sanderson 5 years ago
parent
commit
bbd193b397

+ 56 - 120
tripal_jbrowse_mgmt/includes/tripal_jbrowse_mgmt_add.form.inc

@@ -19,21 +19,6 @@ function tripal_jbrowse_mgmt_add_form($form, &$form_state) {
     return $form;
   }
 
-  // Check to see if this is an edit form.
-  $edit_form = FALSE;
-  if (isset($form_state['build_info']['args'][0]) AND is_numeric($form_state['build_info']['args'][0])) {
-    $instance_id = $form_state['build_info']['args'][0];
-    $result = tripal_jbrowse_mgmt_get_instances(['id' => $instance_id]);
-    if (!empty($result)) {
-      $instance = $result[0];
-      $edit_form = TRUE;
-    }
-    else {
-      drupal_set_message('Unable to access the instance you would like to edit.', 'error');
-      return $form;
-    }
-  }
-
   $organisms = tripal_jbrowse_mgmt_get_organisms_list();
   $mapped_organisms = [];
   foreach ($organisms as $organism) {
@@ -44,9 +29,6 @@ function tripal_jbrowse_mgmt_add_form($form, &$form_state) {
 
   $form_description = 'Create a new JBrowse instance for a given organism. Submitting this form
   creates all the necessary files for a new JBrowse instance.';
-  if ($edit_form) {
-    $form_description = 'Edit details regarding the current JBrowse instance.';
-  }
   $form['description_of_form'] = [
     '#type' => 'item',
     '#markup' => t($form_description),
@@ -58,14 +40,12 @@ function tripal_jbrowse_mgmt_add_form($form, &$form_state) {
     '#type' => 'select',
     '#options' => $mapped_organisms,
     '#required' => TRUE,
-    '#default_value' => ($edit_form) ? $instance->organism_id : NULL,
   ];
 
   $form['description'] = [
     '#title' => t('Description'),
     '#description' => t('Optional description for the instance.'),
     '#type' => 'textarea',
-    '#default_value' => ($edit_form) ? $instance->description : NULL,
   ];
 
   $form['data'] = [
@@ -85,7 +65,6 @@ function tripal_jbrowse_mgmt_add_form($form, &$form_state) {
   $form['data']['ref_seq_file'] = [
     '#type' => 'file',
     '#title' => t('Reference Sequence FASTA File'),
-    '#disabled' => ($edit_form) ? TRUE : FALSE,
   ];
 
   $form['data']['ref_seq_path'] = [
@@ -94,7 +73,6 @@ function tripal_jbrowse_mgmt_add_form($form, &$form_state) {
     '#description' => t(
       'This path will be ignored if a file is provided above. Ex: sites/default/files/file.fasta or /data/file.fasta'
     ),
-    '#disabled' => ($edit_form) ? TRUE : FALSE,
   ];
 
   $form['page'] = [
@@ -137,7 +115,6 @@ function tripal_jbrowse_mgmt_add_form($form, &$form_state) {
       position 0, starting position of the gene, to a certain end point.</p>\r\n
       <pre>     ctgA</pre>\r\n<p>Displays an arbitrary region from the ctgA
       reference.</p>",
-    '#default_value' => ($edit_form) ? tripal_jbrowse_mgmt_get_instance_property($instance_id, 'start-loc') : NULL,
   ];
 
   $form['page']['start-tracks'] = [
@@ -148,16 +125,11 @@ function tripal_jbrowse_mgmt_add_form($form, &$form_state) {
       each of which should correspond to the \"label\" element of the track
       information dictionaries that are currently viewed in the viewing field.</p>\r\n
       <pre>     DNA,knownGene,ccdsGene,snp131,pgWatson,simpleRepeat</pre>",
-    '#default_value' => ($edit_form) ? tripal_jbrowse_mgmt_get_instance_property($instance_id, 'start-tracks') : NULL,
   ];
 
-  $button = 'Create New Instance';
-  if ($edit_form) {
-    $button = 'Save Changes';
-  }
   $form['submit'] = [
     '#type' => 'submit',
-    '#value' => $button,
+    '#value' => 'Create New Instance',
   ];
 
   return $form;
@@ -180,41 +152,38 @@ function tripal_jbrowse_mgmt_add_form_validate($form, &$form_state) {
     $edit_form = TRUE;
   }
 
-  if (!$edit_form) {
-    $file = $_FILES['files']['tmp_name']['ref_seq_file'];
-    $local_file = isset($values['ref_seq_path']) ? $values['ref_seq_path'] : NULL;
 
-    if (empty($file) && empty($local_file)) {
-      form_set_error(
-        'ref_seq_file',
-        'Please provide a local file path or upload a new file.'
-      );
+  $file = $_FILES['files']['tmp_name']['ref_seq_file'];
+  $local_file = isset($values['ref_seq_path']) ? $values['ref_seq_path'] : NULL;
+
+  if (empty($file) && empty($local_file)) {
+    form_set_error(
+      'ref_seq_file',
+      'Please provide a local file path or upload a new file.'
+    );
+  }
+  elseif (empty($file) && !empty($local_file)) {
+    if (!file_exists($local_file)) {
+      form_set_error('ref_seq_path', 'The file path provided does not exist.');
     }
-    elseif (empty($file) && !empty($local_file)) {
-      if (!file_exists($local_file)) {
-        form_set_error('ref_seq_path', 'The file path provided does not exist.');
-      }
+  }
+  else {
+    $uploaded = tripal_jbrowse_mgmt_upload_file('ref_seq_file');
+    if (!$uploaded) {
+      form_set_error('ref_seq_file', 'Unable to upload file');
     }
     else {
-      $uploaded = tripal_jbrowse_mgmt_upload_file('ref_seq_file');
-      if (!$uploaded) {
-        form_set_error('ref_seq_file', 'Unable to upload file');
-      }
-      else {
-        $uploaded = tripal_jbrowse_mgmt_move_file($uploaded);
-        $form_state['values']['uploaded_file'] = $uploaded;
-      }
+      $uploaded = tripal_jbrowse_mgmt_move_file($uploaded);
+      $form_state['values']['uploaded_file'] = $uploaded;
     }
   }
 
   $instances = tripal_jbrowse_mgmt_get_instances(['organism_id' => $organism]);
   if (!empty($instances)) {
-    if (!$edit_form OR ($edit_form AND $instances[0]->id != $instance_id)) {
-      form_set_error(
-        'organism',
-        'A JBrowse instance for the selected organism already exists. You can edit the instance from the instances page.'
-      );
-    }
+    form_set_error(
+      'organism',
+      'A JBrowse instance for the selected organism already exists. You can edit the instance from the instances page.'
+    );
   }
 
   $organism = db_select('chado.organism', 'CO')
@@ -241,79 +210,46 @@ function tripal_jbrowse_mgmt_add_form_submit($form, &$form_state) {
   $organism_id = $values['organism'];
   $description = isset($values['description']) ? $values['description'] : '';
 
-  // Check if this is an add or edit form.
-  $edit_form = FALSE;
-  if (isset($form_state['build_info']['args'][0]) AND is_numeric($form_state['build_info']['args'][0])) {
-    $instance_id = $form_state['build_info']['args'][0];
-    $edit_form = TRUE;
+  if (empty($values['uploaded_file'])) {
+    $file = $values['ref_seq_path'];
+  }
+  else {
+    $file = $values['uploaded_file'];
   }
 
-  if ($edit_form) {
-
-    $organism = db_select('chado.organism', 'CO')
-      ->fields('CO')
-      ->condition('organism_id', $organism_id)
-      ->execute()
-      ->fetchObject();
-
-    $title = tripal_jbrowse_mgmt_construct_organism_name($organism);
+  $organism = db_select('chado.organism', 'CO')
+    ->fields('CO')
+    ->condition('organism_id', $organism_id)
+    ->execute()
+    ->fetchObject();
 
-    $data = [
+  $instance_id = tripal_jbrowse_mgmt_create_instance(
+    [
       'organism_id' => $organism_id,
-      'title' => $title,
+      'title' => tripal_jbrowse_mgmt_construct_organism_name($organism),
       'description' => $description,
-    ];
-    $success = tripal_jbrowse_mgmt_update_instance($instance_id, $data);
+      'created_at' => time(),
+      'file' => $file,
+    ]
+  );
 
-    if ($success) {
-      drupal_set_message("Successfully updated $title JBrowse instance.");
-      $form_state['redirect'] = 'admin/tripal/extension/tripal_jbrowse/management/instances';
-    }
-    else {
-      drupal_set_message('Failed to update the current instance!', 'error');
-    }
+  if ($instance_id) {
+    drupal_set_message('Instance created successfully!');
+    $name = 'Create JBrowse instance for ';
+    $name .= tripal_jbrowse_mgmt_construct_organism_name($organism);
+
+    tripal_add_job(
+      $name,
+      'tripal_jbrowse_mgmt',
+      'tripal_jbrowse_mgmt_create_instance_files',
+      [$instance_id],
+      $user->uid
+    );
+    $form_state['redirect'] = "admin/tripal/extension/tripal_jbrowse/management/instances/$instance_id";
   }
   else {
-    if (empty($values['uploaded_file'])) {
-      $file = $values['ref_seq_path'];
-    }
-    else {
-      $file = $values['uploaded_file'];
-    }
-
-    $organism = db_select('chado.organism', 'CO')
-      ->fields('CO')
-      ->condition('organism_id', $organism_id)
-      ->execute()
-      ->fetchObject();
-
-    $instance_id = tripal_jbrowse_mgmt_create_instance(
-      [
-        'organism_id' => $organism_id,
-        'title' => tripal_jbrowse_mgmt_construct_organism_name($organism),
-        'description' => $description,
-        'created_at' => time(),
-        'file' => $file,
-      ]
-    );
-
-    if ($instance_id) {
-      drupal_set_message('Instance created successfully!');
-      $name = 'Create JBrowse instance for ';
-      $name .= tripal_jbrowse_mgmt_construct_organism_name($organism);
-
-      tripal_add_job(
-        $name,
-        'tripal_jbrowse_mgmt',
-        'tripal_jbrowse_mgmt_create_instance_files',
-        [$instance_id],
-        $user->uid
-      );
-      $form_state['redirect'] = "admin/tripal/extension/tripal_jbrowse/management/instances/$instance_id";
-    }
-    else {
-      drupal_set_message('Failed to create instance!', 'error');
-    }
+    drupal_set_message('Failed to create instance!', 'error');
+    return;
   }
 
   // Now save the instance properties.

+ 126 - 0
tripal_jbrowse_mgmt/includes/tripal_jbrowse_mgmt_edit.form.inc

@@ -0,0 +1,126 @@
+<?php
+/**
+ * @file
+ * Instance Edit Form.
+ */
+
+/**
+ *
+ */
+function tripal_jbrowse_mgmt_edit_form($form, &$form_state) {
+
+  $instance_id = $form_state['build_info']['args'][0];
+  $result = tripal_jbrowse_mgmt_get_instances(['id' => $instance_id]);
+  if (!empty($result)) {
+    $instance = $result[0];
+    $edit_form = TRUE;
+  }
+  else {
+    drupal_set_message('Unable to access the instance you would like to edit.', 'error');
+    return $form;
+  }
+
+  // This is essentiall the add form with defaults.
+  // We use a second function here for cleaner validation and submit.
+  require_once 'tripal_jbrowse_mgmt_add.form.inc';
+  $form = tripal_jbrowse_mgmt_add_form($form, $form_state);
+
+  $form['description_of_form']['#markup'] = t('Edit details regarding the current JBrowse instance.');
+
+  // Set Default Values.
+  $form['organism']['#default_value'] = $instance->organism_id;
+  $form['description']['#default_value'] = $instance->description;
+  $form['page']['start-loc']['#default_value'] = tripal_jbrowse_mgmt_get_instance_property($instance_id, 'start-loc');
+  $form['page']['start-tracks']['#default_value'] = tripal_jbrowse_mgmt_get_instance_property($instance_id, 'start-tracks');
+
+  // Remove the file upload.
+  unset($form['data']);
+
+  // Change the submit button.
+  $form['submit']['#value'] = 'Save Changes';
+
+  return $form;
+}
+
+/**
+ * Validate the form.
+ *
+ * @param $form
+ * @param $form_state
+ */
+function tripal_jbrowse_mgmt_edit_form_validate($form, &$form_state) {
+  $values = $form_state['values'];
+  $organism = isset($values['organism']) ? $values['organism'] : NULL;
+
+  $instance_id = $form_state['build_info']['args'][0];
+  $instances = tripal_jbrowse_mgmt_get_instances(['organism_id' => $organism]);
+  if (!empty($instances)) {
+    if ($instances[0]->id != $instance_id) {
+      form_set_error(
+        'organism',
+        'A JBrowse instance for the selected organism already exists. You can edit the instance from the instances page.'
+      );
+    }
+  }
+
+  $organism = db_select('chado.organism', 'CO')
+    ->fields('CO')
+    ->condition('organism_id', $organism)
+    ->execute()
+    ->fetchObject();
+
+  if (empty($organism)) {
+    form_set_error('organism', 'Invalid organism selected ' . $organism);
+  }
+}
+
+/**
+ * @param $form
+ * @param $form_state
+ *
+ * @throws \Exception
+ */
+function tripal_jbrowse_mgmt_edit_form_submit($form, &$form_state) {
+  global $user;
+
+  $values = $form_state['values'];
+  $organism_id = $values['organism'];
+  $description = isset($values['description']) ? $values['description'] : '';
+
+  // Check if this is an add or edit form.
+  $edit_form = FALSE;
+  if (isset($form_state['build_info']['args'][0]) AND is_numeric($form_state['build_info']['args'][0])) {
+    $instance_id = $form_state['build_info']['args'][0];
+    $edit_form = TRUE;
+  }
+
+  $organism = db_select('chado.organism', 'CO')
+    ->fields('CO')
+    ->condition('organism_id', $organism_id)
+    ->execute()
+    ->fetchObject();
+
+  $title = tripal_jbrowse_mgmt_construct_organism_name($organism);
+
+  $data = [
+    'organism_id' => $organism_id,
+    'title' => $title,
+    'description' => $description,
+  ];
+  $success = tripal_jbrowse_mgmt_update_instance($instance_id, $data);
+
+  if ($success) {
+    drupal_set_message("Successfully updated $title JBrowse instance.");
+    $form_state['redirect'] = 'admin/tripal/extension/tripal_jbrowse/management/instances';
+  }
+  else {
+    drupal_set_message('Failed to update the current instance!', 'error');
+    return FALSE;
+  }
+
+  // Now save the instance properties.
+  tripal_jbrowse_mgmt_save_instance_properties(
+    $instance_id,
+    $form_state['values']['page']
+  );
+}

+ 112 - 0
tripal_jbrowse_mgmt/includes/tripal_jbrowse_mgmt_register.form.inc

@@ -0,0 +1,112 @@
+<?php
+/**
+ * @file
+ * Instance Register Form.
+ */
+
+/**
+ *
+ */
+function tripal_jbrowse_mgmt_register_form($form, &$form_state) {
+
+  // This is essentiall the add form without create JBrowse functionality.
+  // We use a second function here for cleaner validation and submit.
+  require_once 'tripal_jbrowse_mgmt_add.form.inc';
+  $form = tripal_jbrowse_mgmt_add_form($form, $form_state);
+
+  $form['description_of_form']['#markup'] = t('Register an already existing JBrowse instance to be managed by this module.');
+
+  // Remove the file upload.
+  unset($form['data']);
+
+
+  // Change the submit button.
+  $form['submit']['#value'] = 'Save Changes';
+
+  return $form;
+}
+
+/**
+ * Validate the form.
+ *
+ * @param $form
+ * @param $form_state
+ */
+function tripal_jbrowse_mgmt_register_form_validate($form, &$form_state) {
+  $values = $form_state['values'];
+  $organism = isset($values['organism']) ? $values['organism'] : NULL;
+
+  $instances = tripal_jbrowse_mgmt_get_instances(['organism_id' => $organism]);
+  if (!empty($instances)) {
+    form_set_error(
+      'organism',
+      'A JBrowse instance for the selected organism already exists. You can edit the instance from the instances page.'
+    );
+  }
+
+  $organism = db_select('chado.organism', 'CO')
+    ->fields('CO')
+    ->condition('organism_id', $organism)
+    ->execute()
+    ->fetchObject();
+
+  if (empty($organism)) {
+    form_set_error('organism', 'Invalid organism selected ' . $organism);
+  }
+}
+
+/**
+ * @param $form
+ * @param $form_state
+ *
+ * @throws \Exception
+ */
+function tripal_jbrowse_mgmt_register_form_submit($form, &$form_state) {
+  global $user;
+
+  $values = $form_state['values'];
+  $organism_id = $values['organism'];
+  $description = isset($values['description']) ? $values['description'] : '';
+
+  $organism = db_select('chado.organism', 'CO')
+    ->fields('CO')
+    ->condition('organism_id', $organism_id)
+    ->execute()
+    ->fetchObject();
+
+  $instance_id = tripal_jbrowse_mgmt_create_instance(
+    [
+      'organism_id' => $organism_id,
+      'title' => tripal_jbrowse_mgmt_construct_organism_name($organism),
+      'description' => $description,
+      'created_at' => time(),
+      'file' => '',
+    ]
+  );
+
+  if ($instance_id) {
+    $instance = tripal_jbrowse_mgmt_get_instance($instance_id);
+    $settings = tripal_jbrowse_mgmt_get_settings();
+    $slug = tripal_jbrowse_mgmt_make_slug($instance->title);
+    if (isset($settings['data_path']) and !empty($settings['data_path'])) {
+      $data_path = 'WEB_ROOT/' . $settings['data_path'] . '/' . $slug . '/data';
+    }
+    else {
+      $data_path = 'JBROWSE_ROOT/data/' . $slug . '/data';
+    }
+    drupal_set_message('Instance registered successfully!');
+    drupal_set_message(t('This assumes you have an existing JBrowse set-up at @path. If the link below does not work, perhaps you need to create, rather then register, a new JBrowse Instance.',
+      ['@path' => $data_path]), 'warning');
+    $form_state['redirect'] = "admin/tripal/extension/tripal_jbrowse/management/instances/$instance_id";
+  }
+  else {
+    drupal_set_message('Failed to create instance!', 'error');
+    return;
+  }
+
+  // Now save the instance properties.
+  tripal_jbrowse_mgmt_save_instance_properties(
+    $instance_id,
+    $form_state['values']['page']
+  );
+}

+ 13 - 3
tripal_jbrowse_mgmt/tripal_jbrowse_mgmt.module

@@ -46,8 +46,18 @@ function tripal_jbrowse_mgmt_menu() {
     'type' => MENU_LOCAL_TASK,
   ];
 
+  $items['admin/tripal/extension/tripal_jbrowse/management/instances/register'] = [
+    'title' => 'Register Existing Instance',
+    'description' => 'Adds an existing JBrowse to the list of instances managed within Tripal.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => ['tripal_jbrowse_mgmt_register_form'],
+    'access arguments' => ['administer tripal_jbrowse_mgmt'],
+    'file' => 'includes/tripal_jbrowse_mgmt_register.form.inc',
+    'type' => MENU_LOCAL_ACTION,
+  ];
+
   $items['admin/tripal/extension/tripal_jbrowse/management/instances/add'] = [
-    'title' => 'Add New Instance',
+    'title' => 'Create New Instance',
     'description' => 'List and create JBrowse instances.',
     'page callback' => 'drupal_get_form',
     'page arguments' => ['tripal_jbrowse_mgmt_add_form'],
@@ -70,9 +80,9 @@ function tripal_jbrowse_mgmt_menu() {
     'title' => 'Edit Instance',
     'description' => 'Edit metadata for existing JBrowse instances.',
     'page callback' => 'drupal_get_form',
-    'page arguments' => ['tripal_jbrowse_mgmt_add_form', 6],
+    'page arguments' => ['tripal_jbrowse_mgmt_edit_form', 6],
     'access arguments' => ['administer tripal_jbrowse_mgmt'],
-    'file' => 'includes/tripal_jbrowse_mgmt_add.form.inc',
+    'file' => 'includes/tripal_jbrowse_mgmt_edit.form.inc',
     'type' => MENU_LOCAL_ACTION,
   ];