From 9534df78daa1fdc458926436d91d5637d7b2d19a Mon Sep 17 00:00:00 2001
From: Michael Ducharme <michael.ducharme@gmail.com>
Date: Tue, 29 Jan 2013 13:53:55 -0500
Subject: [PATCH] Issue 932994 by mducharme, rudiedirkx: Allow the default
 drupal upload method to be disabled.

---
 filefield_sources.js     |    6 +---
 filefield_sources.module |   82 ++++++++++++++++++++++++++++++++--------------
 2 files changed, 58 insertions(+), 30 deletions(-)

diff --git a/filefield_sources.js b/filefield_sources.js
index 88b9626..f1f9011 100644
--- a/filefield_sources.js
+++ b/filefield_sources.js
@@ -29,17 +29,13 @@ Drupal.behaviors.fileFieldSources.attach = function(context, settings) {
       // Add the active class.
       $(this).addClass('active');
       Drupal.fileFieldSources.updateHintText($fileFieldElement.get(0));
-    });
+    }).first().click();
 
     // Clipboard support.
     $fileFieldElement.find('.filefield-source-clipboard-capture')
       .bind('paste', Drupal.fileFieldSources.pasteEvent)
       .bind('focus', Drupal.fileFieldSources.pasteFocus)
       .bind('blur', Drupal.fileFieldSources.pasteBlur);
-
-    // Hide all the other upload mechanisms on page load.
-    $fileFieldElement.find('div.filefield-source', this).css('display', 'none');
-    $(this).find('a:first').addClass('active');
   });
 
   if (context === document) {
diff --git a/filefield_sources.module b/filefield_sources.module
index 4ca5796..56d1903 100644
--- a/filefield_sources.module
+++ b/filefield_sources.module
@@ -87,6 +87,9 @@ function filefield_sources_field_widget_info_alter(&$info) {
 function filefield_sources_form($instance) {
   $settings = $instance['widget']['settings']['filefield_sources'];
 
+  // Backward compatibility: auto-enable 'upload'.
+  $enabled = _filefield_sources_enabled($settings);
+
   $form['filefield_sources'] = array(
     '#type' => 'fieldset',
     '#title' => t('File sources'),
@@ -95,13 +98,12 @@ function filefield_sources_form($instance) {
     '#weight' => 20,
   );
 
-  $sources = filefield_sources_list(FALSE);
-  $sources = isset($settings['filefield_sources']) ? array_intersect_key(array_merge($settings['filefield_sources'], $sources), $sources) : $sources;
+  $sources = filefield_sources_list();
   $form['filefield_sources']['filefield_sources'] = array(
     '#type' => 'checkboxes',
     '#title' => t('Enabled sources'),
     '#options' => $sources,
-    '#default_value' => $settings['filefield_sources'],
+    '#default_value' => $enabled,
     '#description' => t('Select the available locations from which this widget may select files.'),
   );
 
@@ -128,7 +130,7 @@ function filefield_sources_field_process($element, &$form_state, $form) {
 
   // Do all processing as needed by each source.
   $sources = filefield_sources_info();
-  $enabled_sources = $instance['widget']['settings']['filefield_sources']['filefield_sources'];
+  $enabled_sources = _filefield_sources_enabled($instance['widget']['settings']['filefield_sources']);
   foreach ($sources as $source_name => $source) {
     if (empty($enabled_sources[$source_name])) {
       unset($sources[$source_name]);
@@ -138,12 +140,22 @@ function filefield_sources_field_process($element, &$form_state, $form) {
       $element = $function($element, $form_state, $form);
     }
   }
+  $element['#filefield_sources'] = $sources;
 
   // Exit out if not adding any sources.
   if (empty($sources)) {
     return $element;
   }
 
+  // Hide default 'upload' type?
+  if (!isset($enabled_sources['upload'])) {
+    foreach (array('upload_button', 'upload') as $field) {
+      if (isset($element[$field])) {
+        $element[$field]['#access'] = FALSE;
+      }
+    }
+  }
+
   // Add basic JS and CSS.
   $path = drupal_get_path('module', 'filefield_sources');
   $element['#attached']['css'][] = $path . '/filefield_sources.css';
@@ -180,11 +192,13 @@ function filefield_sources_field_process($element, &$form_state, $form) {
 
   // Add the list of sources to the element for toggling between sources.
   if (empty($element['fid']['#value'])) {
-    $element['filefield_sources_list'] = array(
-      '#type' => 'markup',
-      '#markup' => theme('filefield_sources_list', array('element' => $element, 'sources' => $sources)),
-      '#weight' => -20,
-    );
+    if (count($enabled_sources) > 1) {
+      $element['filefield_sources_list'] = array(
+        '#type' => 'markup',
+        '#markup' => theme('filefield_sources_list', array('element' => $element, 'sources' => $sources)),
+        '#weight' => -20,
+      );
+    }
   }
 
   return $element;
@@ -298,10 +312,26 @@ function filefield_sources_invoke_all($method, &$params) {
 /**
  * Load hook_filefield_sources_info() data from all modules.
  */
-function filefield_sources_info() {
-  $info = module_invoke_all('filefield_sources_info');
-  drupal_alter('filefield_sources_info', $info);
-  uasort($info, '_filefield_sources_sort');
+function filefield_sources_info($include_default = TRUE) {
+  // Cache the expensive part.
+  $cache = &drupal_static(__FUNCTION__);
+  if (!$cache) {
+    $default = array('upload' => array('name' => 'Upload', 'label' => 'Upload', 'description' => 'Upload a file from your computer.', 'weight' => -10));
+    $info = module_invoke_all('filefield_sources_info');
+    $info = $default + $info;
+
+    drupal_alter('filefield_sources_info', $info);
+    uasort($info, '_filefield_sources_sort');
+
+    $cache = $info;
+  }
+  $info = $cache;
+
+  // Maybe don't include the 'upload' type.
+  if (!$include_default) {
+    unset($info['upload']);
+  }
+
   return $info;
 }
 
@@ -309,13 +339,9 @@ function filefield_sources_info() {
  * Create a list of FileField Sources by name, suitable for a select list.
  */
 function filefield_sources_list($include_default = TRUE) {
-  $info = filefield_sources_info();
+  $info = filefield_sources_info($include_default);
   $list = array();
 
-  if ($include_default) {
-    $list['upload'] = t('Upload');
-  }
-
   foreach ($info as $key => $source) {
     $list[$key] = $source['name'];
   }
@@ -533,13 +559,6 @@ function theme_filefield_sources_list($variables) {
 
   $links = array();
 
-  // Add the default "Upload" since it's not in our list.
-  $default['upload'] = array(
-    'label' => t('Upload'),
-    'description' => t('Upload a file from your computer.'),
-  );
-  $sources = array_merge($default, $sources);
-
   foreach ($sources as $name => $source) {
     $links[] = '<a href="#" onclick="return false;" title="' . $source['description'] . '" id="' . $element['#id'] . '-' . $name . '-source" class="filefield-source filefield-source-' . $name . '">' . $source['label'] . '</a>';
   }
@@ -615,3 +634,16 @@ function _filefield_sources_sort($a, $b) {
   $b = (array)$b + array('weight' => 0, 'label' => '');
   return $a['weight'] < $b['weight'] ? -1 : ($a['weight'] > $b['weight'] ? 1 : strnatcasecmp($a['label'], $b['label']));
 }
+
+/**
+ * Helper to return enabled sources for a field, to provide
+ * backward compatibility for 'upload' type.
+ */
+function _filefield_sources_enabled($settings) {
+  if (!isset($settings['filefield_sources']['upload'])) {
+    $settings['filefield_sources']['upload'] = 'upload';
+  }
+
+  $enabled = array_keys(array_filter($settings['filefield_sources']));
+  return drupal_map_assoc($enabled);
+}
-- 
1.7.10.2 (Apple Git-33)

