From 46e2c3b3f0f8b068acc42afa421e2b0ffc4b00ad Mon Sep 17 00:00:00 2001
From: James Elliott <james.elliott@acquia.com>
Date: Wed, 13 Apr 2011 11:36:26 -0400
Subject: [PATCH 09/15] Changed the display type switcher to a separate menu callback

Added an iterator to enable dialog launching links elements that are set in the Drupal.settings object
---
 includes/media.admin.inc   |   19 +++++++++++-
 includes/media.browser.inc |   47 +++++++++------------------
 js/media.admin.js          |   21 ------------
 js/media.dialog.js         |   40 +++++++++++++++++++++---
 media.module               |   73 +++++++++++++++++++++++++------------------
 5 files changed, 111 insertions(+), 89 deletions(-)

diff --git a/includes/media.admin.inc b/includes/media.admin.inc
index 8f6488b..63877cc 100644
--- a/includes/media.admin.inc
+++ b/includes/media.admin.inc
@@ -51,7 +51,24 @@ function media_admin($form, $form_state) {
     '#submit' => array('media_admin_submit'),
     '#validate' => array('media_admin_validate'),
   );
-
+  
+  // Enable the add media button
+  $settings = array(
+    'media' => array(
+      'dialog' => array(
+        'launchers' => array(
+          '.action-links a[href="/admin/content/media/add"]' => array(
+            'submit' => array(
+              'disabledPlugins' => array('library'),
+            ),
+            'base' => 'media-admin-base',
+          ),
+        ),
+      ),
+    ),
+  );
+  
+  drupal_add_js($settings, 'setting');
   
   $form['browser'] = media_browser_build();
   
diff --git a/includes/media.browser.inc b/includes/media.browser.inc
index 7772606..3a6295a 100644
--- a/includes/media.browser.inc
+++ b/includes/media.browser.inc
@@ -63,7 +63,7 @@ function media_browser($selected = NULL) {
   
   $tabs = array(); // List of tabs to render.
 
-  $settings = array('media' => array('dialog' => array('dialogs' => array('#media-browser-tabset' => array()))));
+  $settings = array('media' => array('dialog' => array('open' => array('selector' => '#media-browser-tabset', 'callback' => 'console.log'))));
   $browser_settings =& $settings['media']['dialog'];
 
   //@todo: replace with Tabs module if it gets upgraded.
@@ -124,36 +124,21 @@ function media_browser_get_display() {
   global $user;
   $types = media_display_types();
 
-  if (arg(3)) {
-    $display = arg(3);
-    if (!in_array($display, array_keys($types))) {
-      exit(drupal_not_found());
-    }
-    // Save their preference.
-    db_merge('media_list_type')
-      ->key(array('uid' => $user->uid))
-      ->fields(array(
-          'type' => $display,
-      ))
-      ->execute();
-  }
-  else {
-    $display = db_query("SELECT type FROM {media_list_type} WHERE uid = :uid", array(':uid' => $user->uid))->fetch();
-    if (!$display) {
-      $display = 'list';
-    }
-    else {
-      $display = $display->type;
-    }
+  $type = isset($user->data['media_display_type']) ? $user->data['media_display_type'] : 'list';
+  $display = array();
+  foreach($types[$type] as $key => $data) {
+    $display[$key] = $data;
   }
+  $display['name'] = $type;
   
-  $result = array();
-  foreach($types[$display] as $key => $data) {
-    $result[$key] = $data;
-  }
-  $result['name'] = $display;
-  
-  return $result;
+  return $display;
+}
+
+function media_browser_set_display($type) {
+  global $user;
+  $user->data['media_display_type'] = $type;
+  user_save($user);
+  drupal_goto(drupal_get_destination());
 }
 
 /**
@@ -295,7 +280,6 @@ function media_browser_thumbnails() {
  */
 function media_browser_display_switch($options = array()) {
   $options += array(
-    'form location' => 'admin/content/media',
     'active display' => 'list',
   );
   $display_types = media_display_types();
@@ -316,10 +300,11 @@ function media_browser_display_switch($options = array()) {
 
     $display_items[] = array(
       'data' => l(theme('image', array('path' => $icon, 'alt' => $item['title'])),
-        $options['form location'] . '/' . $delta,
+        'media/browser/' . $delta,
         array(
           'html' => TRUE,
           'attributes' => $attributes,
+          'query' => drupal_get_destination(),
         )),
     );
   }
diff --git a/js/media.admin.js b/js/media.admin.js
index e32ab70..41a8e97 100644
--- a/js/media.admin.js
+++ b/js/media.admin.js
@@ -24,27 +24,6 @@ Drupal.behaviors.mediaAdmin = {
     }
     $('.media-display-switch a', context).bind('click', show_confirm_if_existing_selections)
 
-    //$('a[href="/admin/content/media/add"]', context).bind('click', Drupal.media.admin.addMedia);
-    
-    $('a[href="/admin/content/media/add"]', context).once('media-ajax', function() {
-      var element_settings = {};
-      // Clicked links look better with the throbber than the progress bar.
-      element_settings.progress = { 'type': 'throbber' };
-      element_settings.wrapper = 'page';
-      element_settings.method = 'append';
-      // For anchor tags, these will go to the target of the anchor rather
-      // than the usual location.
-      element_settings.url = Drupal.settings.media.browserUrl;
-      element_settings.event = 'click';
-      element_settings.submit = {
-        js: true,
-        limit: 15
-      };
-      
-      var base = 'admin-media-add-media';
-      Drupal.ajax[base] = new Drupal.ajax(base, this, element_settings);
-    });
-
     // When any checkboxes are clicked on this form check to see if any are checked.
     // If any checkboxes are checked, show the edit options (@todo rename to edit-actions).
     $('#media-admin :checkbox', context).once('media-admin', function() {
diff --git a/js/media.dialog.js b/js/media.dialog.js
index e96dd04..0dfcc52 100644
--- a/js/media.dialog.js
+++ b/js/media.dialog.js
@@ -5,11 +5,21 @@ Drupal.media.dialog = Drupal.media.dialog || {};
 
 Drupal.behaviors.dialog = {
   attach: function (context) {
-    if (typeof Drupal.settings.media.dialog != 'undefined') {
-      for(var dialog in Drupal.settings.media.dialog.dialogs) {
-        $(dialog).once('media-dialog', function () {
-          $(this).dialog(Drupal.media.dialog.defaults(Drupal.settings.media.dialog.dialogs[dialog].callback));
-        });
+    // If we've just received a dialog back, load the dialog
+    if (typeof Drupal.settings.media.dialog.open != 'undefined') {
+      var selector = Drupal.settings.media.dialog.open.selector;
+      var callback = Drupal.settings.media.dialog.open.callback;
+      $(selector).dialog(Drupal.media.dialog.defaults(callback));
+    }
+    
+    // Enable any dialog launchers
+    for(var launcher in Drupal.settings.media.dialog.launchers) {
+      var element = $(launcher).not('.media-ajax');
+      if (element.length) {
+        element.addClass('media-ajax');
+        var options = Drupal.settings.media.dialog.launchers[launcher];
+        var base = element.attr('id') ? element.attr('id') : options.base;
+        Drupal.media.dialog.launcher(element, base, options);
       }
     }
   }
@@ -42,4 +52,24 @@ Drupal.media.dialog.confirm = function () {
   $(this).dialog('destory');
 };
 
+Drupal.media.dialog.launcher = function (element, base, options) {
+  var element_settings = $.extend(Drupal.media.dialog.ajaxDefaults(), options);
+  
+  Drupal.ajax[element_settings.base] = new Drupal.ajax(element_settings.base, element, element_settings);
+};
+
+Drupal.media.dialog.ajaxDefaults = function () {
+  var element_settings = {};
+  element_settings.progress = { 'type': 'throbber' };
+  element_settings.wrapper = 'page';
+  element_settings.method = 'append';
+  element_settings.url = Drupal.settings.media.browserUrl;
+  element_settings.event = 'click';
+  element_settings.submit = {
+    js: true,
+    limit: 15
+  };
+  return element_settings;
+}
+
 })(jQuery);
\ No newline at end of file
diff --git a/media.module b/media.module
index f09562f..637c9b2 100644
--- a/media.module
+++ b/media.module
@@ -148,42 +148,52 @@ function media_menu() {
     'delivery callback' => 'ajax_deliver',
     'theme callback' => 'media_dialog_theme',
   );
-
-  // A testbed to try out the media browser with different launch commands.
-  $items['media/browser/testbed'] = array(
-    'title' => 'Media Browser test',
-    'description' => 'Make it easier to test media browser',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('media_browser_testbed'),
-    'file' => 'includes/media.browser.inc',
-    'access arguments' => array('administer media'),
-    'type' => MENU_CALLBACK,
-  );
-
-
-  /**
-   * Browser callbacks
-   * @var unknown_type
-   */
-  $items['media/browser/list'] = array(
-    'title' => 'Media browser list',
-    'description' => 'Ajax Callback for getting media',
-    'page callback' => 'media_browser_list',
+  
+  $items['media/browser/%'] = array(
+    'title' => 'Media browser display type',
+    'page callback' => 'media_browser_set_display',
+    'page arguments' => array(2),
     'access callback' => 'media_access',
     'access arguments' => array('view'),
     'type' => MENU_CALLBACK,
     'file' => 'includes/media.browser.inc',
   );
 
-  $items['media/browser/library'] = array(
-    'title' => 'Media browser library',
-    'description' => 'Media Browser for picking media and uploading new media',
-    'page callback' => 'media_browser_library',
-    'access callback' => 'media_access',
-    'access arguments' => array('view'),
-    'type' => MENU_CALLBACK,
-    'file' => 'includes/media.browser.inc',
-  );
+//  // A testbed to try out the media browser with different launch commands.
+//  $items['media/browser/testbed'] = array(
+//    'title' => 'Media Browser test',
+//    'description' => 'Make it easier to test media browser',
+//    'page callback' => 'drupal_get_form',
+//    'page arguments' => array('media_browser_testbed'),
+//    'file' => 'includes/media.browser.inc',
+//    'access arguments' => array('administer media'),
+//    'type' => MENU_CALLBACK,
+//  );
+//
+//
+//  /**
+//   * Browser callbacks
+//   * @var unknown_type
+//   */
+//  $items['media/browser/list'] = array(
+//    'title' => 'Media browser list',
+//    'description' => 'Ajax Callback for getting media',
+//    'page callback' => 'media_browser_list',
+//    'access callback' => 'media_access',
+//    'access arguments' => array('view'),
+//    'type' => MENU_CALLBACK,
+//    'file' => 'includes/media.browser.inc',
+//  );
+//
+//  $items['media/browser/library'] = array(
+//    'title' => 'Media browser library',
+//    'description' => 'Media Browser for picking media and uploading new media',
+//    'page callback' => 'media_browser_library',
+//    'access callback' => 'media_access',
+//    'access arguments' => array('view'),
+//    'type' => MENU_CALLBACK,
+//    'file' => 'includes/media.browser.inc',
+//  );
 
   $items['media/%media/format-form'] = array(
     'title' => 'Style selector',
@@ -262,7 +272,8 @@ function media_menu() {
 }
 
 function media_dialog_theme() {
-  return $_POST['ajax_page_state']['theme'];
+  $ajax_theme = isset($_POST['ajax_page_state']['theme']) ? $_POST['ajax_page_state']['theme'] : variable_get('theme_default', 'bartik');
+  return $ajax_theme;
 }
 
 /**
-- 
1.7.4.msysgit.0

