From 10190cb0c5f44390c7c0ff3c1e155bc7b944a1d3 Mon Sep 17 00:00:00 2001
From: Dan Chadwick <dan899@gmail.com>
Date: Thu, 13 Nov 2014 16:17:15 -0500
Subject: [PATCH] Issue #2330557 by DanChadwick: Added Replace hard-coded
 tables with views.

---
 components/number.inc                           |   11 +
 includes/webform.report.inc                     |   52 +++++
 views/default_views/webform_results.inc         |  171 ++++++++++++++++
 views/default_views/webform_submissions.inc     |  213 ++++++++++++++++++++
 views/webform.views.inc                         |  240 +++++++++++++++++------
 views/webform_handler_area_result_pager.inc     |   89 +++++++++
 views/webform_handler_field_submission_data.inc |   74 +++++++-
 views/webform_handler_field_submission_link.inc |   69 +++----
 webform.api.php                                 |   55 +++++
 webform.info                                    |    1 +
 webform.module                                  |   17 ++-
 11 files changed, 880 insertions(+), 112 deletions(-)
 create mode 100644 views/default_views/webform_results.inc
 create mode 100644 views/default_views/webform_submissions.inc
 create mode 100644 views/webform_handler_area_result_pager.inc

diff --git a/components/number.inc b/components/number.inc
index 4ef210d..7383234 100644
--- a/components/number.inc
+++ b/components/number.inc
@@ -56,6 +56,17 @@ function _webform_theme_number() {
 }
 
 /**
+ * Adjusts the view field(s) that are automatically generated for number
+ * components.
+ */
+function _webform_view_field_number($component, $fields) {
+  foreach ($fields as &$field) {
+    $field['webform_datatype'] = 'number';
+  }
+  return $fields;
+}
+
+/**
  * Implements _webform_edit_component().
  */
 function _webform_edit_number($component) {
diff --git a/includes/webform.report.inc b/includes/webform.report.inc
index 6c6135b..9f4ddb3 100644
--- a/includes/webform.report.inc
+++ b/includes/webform.report.inc
@@ -16,6 +16,26 @@ module_load_include('inc', 'webform', 'includes/webform.submissions');
 function webform_results_submissions($node, $user_filter, $pager_count) {
   global $user;
 
+  // Determine whether views or hard-coded tables should be used for the submissions table.
+  if (!webform_variable_get('webform_table')) {
+    // Load the submissions view
+    $view = webform_get_view($node, 'webform_submissions');
+    if ($user_filter) {
+      if ($user->uid) {
+        drupal_set_title(t('Submissions for %user', array('%user' => $user->name)), PASS_THROUGH);
+      }
+      else {
+        drupal_set_title(t('Your submissions'));
+        webform_disable_page_cache();
+      }
+      webform_set_breadcrumb($node);
+      return $view->preview('default', array($node->nid, $user->uid));
+    }
+    else {
+      return $view->preview('default', array($node->nid));
+    }
+  }
+
   if (isset($_GET['results']) && is_numeric($_GET['results'])) {
     $pager_count = $_GET['results'];
   }
@@ -86,6 +106,29 @@ function webform_results_submissions($node, $user_filter, $pager_count) {
 }
 
 /**
+ * Returns the most appropriate view for this webform node.
+ *
+ * Site builders can customize the view that webform uses by webform node id or
+ * by webform content type. For example, use webform_results_123 to for node
+ * id 123 or webform_results_my_content_type for a node of type my_content_type.
+ *
+ * @param object $node
+ *   Loaded webform node.
+ * @param string $view_id
+ *   machine_id of the view, such as webform_results or webform_submissions.
+ * @return object|NULL
+ *   The loaded view.
+ */
+function webform_get_view($node, $view_id) {
+  foreach (array("{$view_id}_{$node->nid}", "{$view_id}_{$node->type}", $view_id) as $id) {
+    $view = views_get_view($id);
+    if ($view) {
+      return $view;
+    }
+  }
+}
+
+/**
  * Theme the list of links for selecting the number of results per page.
  *
  * @param $total_count
@@ -172,6 +215,15 @@ function template_preprocess_webform_results_submissions(&$vars) {
  * Create a table containing all submitted values for a webform node.
  */
 function webform_results_table($node, $pager_count = 0) {
+  
+  // Determine whether views or hard-coded tables should be used for the submissions table.
+  if (!webform_variable_get('webform_table')) {
+    // Load and preview the results view with a node id argument
+    $view = webform_get_view($node, 'webform_results');
+    return $view->preview('default', array($node->nid));
+  }
+
+  // Get all the submissions for the node
   if (isset($_GET['results']) && is_numeric($_GET['results'])) {
     $pager_count = $_GET['results'];
   }
diff --git a/views/default_views/webform_results.inc b/views/default_views/webform_results.inc
new file mode 100644
index 0000000..a376a30
--- /dev/null
+++ b/views/default_views/webform_results.inc
@@ -0,0 +1,171 @@
+<?php
+
+/**
+ * @file
+ * webform_results view definition.
+ */
+
+// --- Paste exported view below ---
+
+$view = new view();
+$view->name = 'webform_results';
+$view->description = '';
+$view->tag = 'default';
+$view->base_table = 'webform_submissions';
+$view->human_name = 'Webform Results';
+$view->core = 7;
+$view->api_version = '3.0';
+$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
+
+/* Display: Master */
+$handler = $view->new_display('default', 'Master', 'default');
+$handler->display->display_options['use_more_always'] = FALSE;
+$handler->display->display_options['access']['type'] = 'none';
+$handler->display->display_options['cache']['type'] = 'none';
+$handler->display->display_options['query']['type'] = 'views_query';
+$handler->display->display_options['exposed_form']['type'] = 'basic';
+$handler->display->display_options['pager']['type'] = 'full';
+$handler->display->display_options['pager']['options']['items_per_page'] = '50';
+$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['pager']['options']['expose']['items_per_page_options'] = '10, 50, 100, 200, 500, 1000';
+$handler->display->display_options['pager']['options']['expose']['items_per_page_options_all'] = TRUE;
+$handler->display->display_options['pager']['options']['expose']['items_per_page_options_all_label'] = 'All';
+
+$handler->display->display_options['style_plugin'] = 'table';
+$handler->display->display_options['style_options']['columns'] = array(
+  'view_submission' => 'view_submission',
+  'submitted' => 'submitted',
+  'name' => 'name',
+  'remote_addr' => 'remote_addr',
+);
+$handler->display->display_options['style_options']['default'] = 'view_submission';
+$handler->display->display_options['style_options']['info'] = array(
+  'view_submission' => array(
+    'sortable' => 1,
+    'default_sort_order' => 'desc',
+    'align' => '',
+    'separator' => '',
+    'empty_column' => 0,
+  ),
+  'submitted' => array(
+    'sortable' => 1,
+    'default_sort_order' => 'asc',
+    'align' => '',
+    'separator' => '',
+    'empty_column' => 0,
+  ),
+  'name' => array(
+    'sortable' => 1,
+    'default_sort_order' => 'asc',
+    'align' => '',
+    'separator' => '',
+    'empty_column' => 0,
+  ),
+  'remote_addr' => array(
+    'sortable' => 1,
+    'default_sort_order' => 'asc',
+    'align' => '',
+    'separator' => '',
+    'empty_column' => 0,
+  ),
+  'webform_all_fields' => array(
+    'sortable' => 1,
+    'default_sort_order' => 'asc',
+    'align' => '',
+    'separator' => '',
+    'empty_column' => 0,
+  ),
+);
+$handler->display->display_options['style_options']['sticky'] = TRUE;
+$handler->display->display_options['style_options']['empty_table'] = TRUE;
+/* Header: Global: Result summary with additional tokens */
+$handler->display->display_options['header']['webform_result']['id'] = 'webform_result';
+$handler->display->display_options['header']['webform_result']['table'] = 'views';
+$handler->display->display_options['header']['webform_result']['field'] = 'webform_result';
+$handler->display->display_options['header']['webform_result']['content'] = '<div class="webform-results-per-page">Showing @start - @end of @total. &nbsp; @items_per_page_links</div>';
+/* No results behavior: Global: Unfiltered text */
+$handler->display->display_options['empty']['area_text_custom']['id'] = 'area_text_custom';
+$handler->display->display_options['empty']['area_text_custom']['table'] = 'views';
+$handler->display->display_options['empty']['area_text_custom']['field'] = 'area_text_custom';
+$handler->display->display_options['empty']['area_text_custom']['empty'] = TRUE;
+$handler->display->display_options['empty']['area_text_custom']['content'] = 'There are no submissions for this form. <a href="/node/!1">View this form</a>.';
+$handler->display->display_options['empty']['area_text_custom']['tokenize'] = TRUE;
+/* Relationship: Webform submissions: User */
+$handler->display->display_options['relationships']['uid']['id'] = 'uid';
+$handler->display->display_options['relationships']['uid']['table'] = 'webform_submissions';
+$handler->display->display_options['relationships']['uid']['field'] = 'uid';
+/* Field: Webform submissions: View link */
+$handler->display->display_options['fields']['view_submission']['id'] = 'view_submission';
+$handler->display->display_options['fields']['view_submission']['table'] = 'webform_submissions';
+$handler->display->display_options['fields']['view_submission']['field'] = 'view_submission';
+$handler->display->display_options['fields']['view_submission']['label'] = '#';
+$handler->display->display_options['fields']['view_submission']['element_label_colon'] = FALSE;
+$handler->display->display_options['fields']['view_submission']['text'] = '[serial]';
+$handler->display->display_options['fields']['view_submission']['access_check'] = 0;
+/* Field: Webform submissions: Submitted */
+$handler->display->display_options['fields']['submitted']['id'] = 'submitted';
+$handler->display->display_options['fields']['submitted']['table'] = 'webform_submissions';
+$handler->display->display_options['fields']['submitted']['field'] = 'submitted';
+$handler->display->display_options['fields']['submitted']['date_format'] = 'short';
+$handler->display->display_options['fields']['submitted']['second_date_format'] = 'long';
+/* Field: User: Name */
+$handler->display->display_options['fields']['name']['id'] = 'name';
+$handler->display->display_options['fields']['name']['table'] = 'users';
+$handler->display->display_options['fields']['name']['field'] = 'name';
+$handler->display->display_options['fields']['name']['relationship'] = 'uid';
+$handler->display->display_options['fields']['name']['label'] = 'User';
+$handler->display->display_options['fields']['name']['element_label_colon'] = FALSE;
+/* Field: Webform submissions: Remote address */
+$handler->display->display_options['fields']['remote_addr']['id'] = 'remote_addr';
+$handler->display->display_options['fields']['remote_addr']['table'] = 'webform_submissions';
+$handler->display->display_options['fields']['remote_addr']['field'] = 'remote_addr';
+$handler->display->display_options['fields']['remote_addr']['label'] = 'IP address';
+/* Field: Webform submission data: All values */
+$handler->display->display_options['fields']['webform_all_fields']['id'] = 'webform_all_fields';
+$handler->display->display_options['fields']['webform_all_fields']['table'] = 'webform_submissions';
+$handler->display->display_options['fields']['webform_all_fields']['field'] = 'webform_all_fields';
+$handler->display->display_options['fields']['webform_all_fields']['label'] = '';
+$handler->display->display_options['fields']['webform_all_fields']['exclude'] = TRUE;
+$handler->display->display_options['fields']['webform_all_fields']['alter']['nl2br'] = TRUE;
+
+/* Contextual filter: Webform submissions: Node */
+$handler->display->display_options['arguments']['nid']['id'] = 'nid';
+$handler->display->display_options['arguments']['nid']['table'] = 'webform_submissions';
+$handler->display->display_options['arguments']['nid']['field'] = 'nid';
+$handler->display->display_options['arguments']['nid']['default_action'] = 'not found';
+$handler->display->display_options['arguments']['nid']['default_argument_type'] = 'fixed';
+$handler->display->display_options['arguments']['nid']['summary']['number_of_records'] = '0';
+$handler->display->display_options['arguments']['nid']['summary']['format'] = 'default_summary';
+$handler->display->display_options['arguments']['nid']['summary_options']['items_per_page'] = '25';
+$handler->display->display_options['arguments']['nid']['specify_validation'] = TRUE;
+$handler->display->display_options['arguments']['nid']['validate']['type'] = 'node';
+$translatables['webform_results'] = array(
+ t('Master'),
+  t('more'),
+  t('Apply'),
+  t('Reset'),
+  t('Sort by'),
+  t('Asc'),
+  t('Desc'),
+  t('Items per page'),
+  t('- All -'),
+  t('Offset'),
+  t('« first'),
+  t('‹ previous'),
+  t('next ›'),
+  t('last »'),
+  t('Showing @start - @end of @total'),
+  t('Webform Submission User'),
+  t('Serial Number'),
+  t('[serial]'),
+  t('Submitted'),
+  t('User'),
+  t('IP address'),
+  t('All'),
+);
+
+// --- Paste exported view above ---
+
+$views[$view->name] = $view;
diff --git a/views/default_views/webform_submissions.inc b/views/default_views/webform_submissions.inc
new file mode 100644
index 0000000..2de0b07
--- /dev/null
+++ b/views/default_views/webform_submissions.inc
@@ -0,0 +1,213 @@
+<?php
+
+/**
+ * @file
+ * webform_submissions view definition.
+ */
+
+// --- Paste exported view below ---
+
+$view = new view();
+$view->name = 'webform_submissions';
+$view->description = '';
+$view->tag = 'default';
+$view->base_table = 'webform_submissions';
+$view->human_name = 'Webform Submissions';
+$view->core = 7;
+$view->api_version = '3.0';
+$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
+
+/* Display: Master */
+$handler = $view->new_display('default', 'Master', 'default');
+$handler->display->display_options['use_more_always'] = FALSE;
+$handler->display->display_options['access']['type'] = 'none';
+$handler->display->display_options['cache']['type'] = 'none';
+$handler->display->display_options['query']['type'] = 'views_query';
+$handler->display->display_options['exposed_form']['type'] = 'basic';
+$handler->display->display_options['pager']['type'] = 'full';
+$handler->display->display_options['pager']['options']['items_per_page'] = '50';
+$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['pager']['options']['expose']['items_per_page_options'] = '10, 50, 100, 200, 500, 1000';
+$handler->display->display_options['pager']['options']['expose']['items_per_page_options_all'] = TRUE;
+$handler->display->display_options['pager']['options']['expose']['items_per_page_options_all_label'] = 'All';
+
+$handler->display->display_options['style_plugin'] = 'table';
+$handler->display->display_options['style_options']['columns'] = array(
+  'view_submission' => 'view_submission',
+  'submitted' => 'submitted',
+  'name' => 'name',
+  'remote_addr' => 'remote_addr',
+  'view_submission_1' => 'view_submission_1',
+  'edit_submission' => 'view_submission_1',
+  'delete_submission' => 'view_submission_1',
+);
+$handler->display->display_options['style_options']['default'] = 'view_submission';
+$handler->display->display_options['style_options']['info'] = array(
+  'view_submission' => array(
+    'sortable' => 1,
+    'default_sort_order' => 'desc',
+    'align' => '',
+    'separator' => '',
+    'empty_column' => 0,
+  ),
+  'submitted' => array(
+    'sortable' => 1,
+    'default_sort_order' => 'asc',
+    'align' => '',
+    'separator' => '',
+    'empty_column' => 0,
+  ),
+  'name' => array(
+    'sortable' => 1,
+    'default_sort_order' => 'asc',
+    'align' => '',
+    'separator' => '',
+    'empty_column' => 0,
+  ),
+  'remote_addr' => array(
+    'sortable' => 1,
+    'default_sort_order' => 'asc',
+    'align' => '',
+    'separator' => '',
+    'empty_column' => 0,
+  ),
+  'view_submission_1' => array(
+    'sortable' => 0,
+    'default_sort_order' => 'asc',
+    'align' => '',
+    'separator' => ' &nbsp; ',
+    'empty_column' => 0,
+  ),
+  'edit_submission' => array(
+    'sortable' => 0,
+    'default_sort_order' => 'asc',
+    'align' => '',
+    'separator' => '',
+    'empty_column' => 0,
+  ),
+  'delete_submission' => array(
+    'sortable' => 0,
+    'default_sort_order' => 'asc',
+    'align' => '',
+    'separator' => '',
+    'empty_column' => 0,
+  ),
+);
+$handler->display->display_options['style_options']['sticky'] = TRUE;
+$handler->display->display_options['style_options']['empty_table'] = TRUE;
+/* Header: Global: Result summary with additional tokens */
+$handler->display->display_options['header']['webform_result']['id'] = 'webform_result';
+$handler->display->display_options['header']['webform_result']['table'] = 'views';
+$handler->display->display_options['header']['webform_result']['field'] = 'webform_result';
+$handler->display->display_options['header']['webform_result']['content'] = '<div class="webform-results-per-page">Showing @start - @end of @total. &nbsp; @items_per_page_links</div>';
+/* No results behavior: Global: Unfiltered text */
+$handler->display->display_options['empty']['area_text_custom']['id'] = 'area_text_custom';
+$handler->display->display_options['empty']['area_text_custom']['table'] = 'views';
+$handler->display->display_options['empty']['area_text_custom']['field'] = 'area_text_custom';
+$handler->display->display_options['empty']['area_text_custom']['empty'] = TRUE;
+$handler->display->display_options['empty']['area_text_custom']['content'] = 'There are no submissions for this form. <a href="/node/!1">View this form</a>.';
+$handler->display->display_options['empty']['area_text_custom']['tokenize'] = TRUE;
+/* Relationship: Webform submissions: User */
+$handler->display->display_options['relationships']['uid']['id'] = 'uid';
+$handler->display->display_options['relationships']['uid']['table'] = 'webform_submissions';
+$handler->display->display_options['relationships']['uid']['field'] = 'uid';
+/* Field: Webform submissions: View link */
+$handler->display->display_options['fields']['view_submission']['id'] = 'view_submission';
+$handler->display->display_options['fields']['view_submission']['table'] = 'webform_submissions';
+$handler->display->display_options['fields']['view_submission']['field'] = 'view_submission';
+$handler->display->display_options['fields']['view_submission']['label'] = '#';
+$handler->display->display_options['fields']['view_submission']['element_label_colon'] = FALSE;
+$handler->display->display_options['fields']['view_submission']['text'] = '[serial]';
+$handler->display->display_options['fields']['view_submission']['access_check'] = 0;
+/* Field: Webform submissions: Submitted */
+$handler->display->display_options['fields']['submitted']['id'] = 'submitted';
+$handler->display->display_options['fields']['submitted']['table'] = 'webform_submissions';
+$handler->display->display_options['fields']['submitted']['field'] = 'submitted';
+$handler->display->display_options['fields']['submitted']['date_format'] = 'short';
+$handler->display->display_options['fields']['submitted']['second_date_format'] = 'long';
+/* Field: User: Name */
+$handler->display->display_options['fields']['name']['id'] = 'name';
+$handler->display->display_options['fields']['name']['table'] = 'users';
+$handler->display->display_options['fields']['name']['field'] = 'name';
+$handler->display->display_options['fields']['name']['relationship'] = 'uid';
+$handler->display->display_options['fields']['name']['label'] = 'User';
+$handler->display->display_options['fields']['name']['element_label_colon'] = FALSE;
+/* Field: Webform submissions: Remote address */
+$handler->display->display_options['fields']['remote_addr']['id'] = 'remote_addr';
+$handler->display->display_options['fields']['remote_addr']['table'] = 'webform_submissions';
+$handler->display->display_options['fields']['remote_addr']['field'] = 'remote_addr';
+$handler->display->display_options['fields']['remote_addr']['label'] = 'IP address';
+/* Field: Webform submissions: View link */
+$handler->display->display_options['fields']['view_submission_1']['id'] = 'view_submission_1';
+$handler->display->display_options['fields']['view_submission_1']['table'] = 'webform_submissions';
+$handler->display->display_options['fields']['view_submission_1']['field'] = 'view_submission';
+$handler->display->display_options['fields']['view_submission_1']['label'] = 'Operations';
+$handler->display->display_options['fields']['view_submission_1']['element_label_colon'] = FALSE;
+$handler->display->display_options['fields']['view_submission_1']['access_check'] = 0;
+/* Field: Webform submissions: Edit link */
+$handler->display->display_options['fields']['edit_submission']['id'] = 'edit_submission';
+$handler->display->display_options['fields']['edit_submission']['table'] = 'webform_submissions';
+$handler->display->display_options['fields']['edit_submission']['field'] = 'edit_submission';
+$handler->display->display_options['fields']['edit_submission']['label'] = '';
+$handler->display->display_options['fields']['edit_submission']['element_label_colon'] = FALSE;
+$handler->display->display_options['fields']['edit_submission']['access_check'] = 1;
+/* Field: Webform submissions: Delete link */
+$handler->display->display_options['fields']['delete_submission']['id'] = 'delete_submission';
+$handler->display->display_options['fields']['delete_submission']['table'] = 'webform_submissions';
+$handler->display->display_options['fields']['delete_submission']['field'] = 'delete_submission';
+$handler->display->display_options['fields']['delete_submission']['label'] = '';
+$handler->display->display_options['fields']['delete_submission']['element_label_colon'] = FALSE;
+$handler->display->display_options['fields']['delete_submission']['access_check'] = 1;
+/* Contextual filter: Webform submissions: Node */
+$handler->display->display_options['arguments']['nid']['id'] = 'nid';
+$handler->display->display_options['arguments']['nid']['table'] = 'webform_submissions';
+$handler->display->display_options['arguments']['nid']['field'] = 'nid';
+$handler->display->display_options['arguments']['nid']['default_action'] = 'not found';
+$handler->display->display_options['arguments']['nid']['default_argument_type'] = 'fixed';
+$handler->display->display_options['arguments']['nid']['summary']['number_of_records'] = '0';
+$handler->display->display_options['arguments']['nid']['summary']['format'] = 'default_summary';
+$handler->display->display_options['arguments']['nid']['summary_options']['items_per_page'] = '25';
+$handler->display->display_options['arguments']['nid']['specify_validation'] = TRUE;
+$handler->display->display_options['arguments']['nid']['validate']['type'] = 'node';
+/* Contextual filter: Webform submissions: User */
+$handler->display->display_options['arguments']['uid']['id'] = 'uid';
+$handler->display->display_options['arguments']['uid']['table'] = 'webform_submissions';
+$handler->display->display_options['arguments']['uid']['field'] = 'uid';
+$handler->display->display_options['arguments']['uid']['default_argument_type'] = 'fixed';
+$handler->display->display_options['arguments']['uid']['summary']['number_of_records'] = '0';
+$handler->display->display_options['arguments']['uid']['summary']['format'] = 'default_summary';
+$handler->display->display_options['arguments']['uid']['summary_options']['items_per_page'] = '25';
+$translatables['webform_submissions'] = array(
+  t('Master'),
+  t('more'),
+  t('Apply'),
+  t('Reset'),
+  t('Sort by'),
+  t('Asc'),
+  t('Desc'),
+  t('Items per page'),
+  t('All'),
+  t('Offset'),
+  t('« first'),
+  t('‹ previous'),
+  t('next ›'),
+  t('last »'),
+  t('Showing @start - @end of @total @items_per_page_links'),
+  t('Webform Submission User'),
+  t('#'),
+  t('[serial]'),
+  t('Submitted'),
+  t('User'),
+  t('IP address'),
+  t('Operations'),
+  t('view'),
+  t('edit'),
+  t('delete'),
+);
+
+
+// --- Paste exported view above ---
+
+$views[$view->name] = $view;
diff --git a/views/webform.views.inc b/views/webform.views.inc
index 6fa3b0e..3b84c8d 100644
--- a/views/webform.views.inc
+++ b/views/webform.views.inc
@@ -95,6 +95,21 @@ function webform_views_data() {
     'group' => t('Webform submission data'),
     'field' => array(
       'handler' => 'webform_handler_field_submission_data',
+      'webform_expand' => FALSE,
+      'click sortable' => TRUE,
+    ),
+  );
+
+  // Expanded to generate a field for every viewable component
+  $data['webform_submissions']['webform_all_fields'] = array(
+    'title' => t('All values'),
+    'help' => t('Displays all values as submitted by a user.'),
+    'real field' => 'sid',
+    'group' => t('Webform submission data'),
+    'field' => array(
+      'handler' => 'webform_handler_field_submission_data',
+      'webform_expand' => TRUE,
+      'click sortable' => TRUE,
     ),
   );
 
@@ -108,6 +123,18 @@ function webform_views_data() {
       'handler' => 'views_handler_relationship',
       'label' => t('Webform Node'),
     ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_numeric',
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_node_nid',
+      'name field' => 'title', // the field to display in the summary.
+      'numeric' => TRUE,
+      'validate type' => 'nid',
+    ),
   );
 
   // UID.
@@ -121,7 +148,7 @@ function webform_views_data() {
       'label' => t('Webform Submission User'),
     ),
     'filter' => array(
-      'handler' => 'views_handler_filter_numeric',
+      'handler' => 'views_handler_filter_user_name',
     ),
     'sort' => array(
       'handler' => 'views_handler_sort',
@@ -129,6 +156,9 @@ function webform_views_data() {
     'argument' => array(
       'handler' => 'views_handler_argument_numeric',
     ),
+    'field' => array(
+      'handler' => 'views_handler_field_user',
+    ),
   );
 
   // Is draft.
@@ -186,32 +216,48 @@ function webform_views_data() {
 
   // View submission link.
   $data['webform_submissions']['view_submission'] = array(
+    'title' => t('View link'),
+    'help' => t('Provide a simple link to view the submission.'),
+    'real field' => 'serial',
     'field' => array(
-      'title' => t('View link'),
-      'help' => t('Provide a simple link to view the submission.'),
       'handler' => 'webform_handler_field_submission_link',
+      'click sortable' => TRUE,
+      'real field' => 'serial',
       'link_type' => 'view',
     ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
   );
 
   // Edit submission link.
   $data['webform_submissions']['edit_submission'] = array(
+    'title' => t('Edit link'),
+    'help' => t('Provide a simple link to edit the submission.'),
+    'real field' => 'serial',
     'field' => array(
-      'title' => t('Edit link'),
-      'help' => t('Provide a simple link to edit the submission.'),
       'handler' => 'webform_handler_field_submission_link',
+      'click sortable' => TRUE,
       'link_type' => 'edit',
     ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
   );
 
   // Delete submission link.
   $data['webform_submissions']['delete_submission'] = array(
+    'title' => t('Delete link'),
+    'help' => t('Provide a simple link to delete the submission.'),
+    'real field' => 'serial',
     'field' => array(
-      'title' => t('Delete link'),
-      'help' => t('Provide a simple link to delete the submission.'),
       'handler' => 'webform_handler_field_submission_link',
+      'click sortable' => TRUE,
       'link_type' => 'delete',
     ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
   );
 
   // Relation to webform_submitted_data table.
@@ -363,76 +409,140 @@ function webform_views_data_alter(&$data) {
       'handler' => 'webform_handler_field_form_body',
     ),
   );
+
+  $data['views']['webform_result'] = array(
+    'title' => t('Result summary with additional tokens'),
+    'help' => t('Shows result summary, for example the items per page (and links to change the items per page).'),
+    'area' => array(
+      'handler' => 'webform_handler_area_result_pager',
+    ),
+  );
+
 }
 
 /**
- * Implements hook_views_handlers().
+ * Implements hook_views_plugins().
  */
-function webform_views_handlers() {
+function webform_views_plugins() {
   return array(
-    'info' => array(
-      'path' => drupal_get_path('module', 'webform') . '/views',
-    ),
-    'handlers' => array(
-      'webform_handler_field_submission_link' => array(
-        'parent' => 'views_handler_field',
-        'file' => 'webform_handler_field_submission_link.inc',
-      ),
-      'webform_handler_field_submission_data' => array(
-        'parent' => 'views_handler_field',
-        'file' => 'webform_handler_field_submission_data.inc',
-      ),
-      'webform_handler_field_submission_count' => array(
-        'parent' => 'views_handler_field',
-        'file' => 'webform_handler_field_submission_count.inc',
-      ),
-      'webform_handler_field_node_link_edit' => array(
-        'parent' => 'views_handler_field_node_link',
-      ),
-      'webform_handler_field_node_link_results' => array(
-        'parent' => 'views_handler_field_node_link',
-      ),
-      'webform_handler_field_form_body' => array(
-        'parent' => 'views_handler_field',
-        'file' => 'webform_handler_field_form_body.inc',
-      ),
-      'webform_handler_field_is_draft' => array(
-        'parent' => 'views_handler_field',
-        'file' => 'webform_handler_field_is_draft.inc',
-      ),
-      'webform_handler_filter_is_draft' => array(
-        'parent' => 'views_handler_filter_in_operator',
-        'file' => 'webform_handler_filter_is_draft.inc',
-      ),
-      'webform_handler_field_webform_status' => array(
-        'parent' => 'views_handler_field_boolean',
-        'file' => 'webform_handler_field_webform_status.inc',
-      ),
-      'webform_handler_filter_webform_status' => array(
-        'parent' => 'views_handler_filter_boolean_operator',
-        'file' => 'webform_handler_filter_webform_status.inc',
-      ),
-      'webform_handler_relationship_submission_data' => array(
-        'parent' => 'views_handler_relationship',
-        'file' => 'webform_handler_relationship_submission_data.inc',
+    'row' => array(
+      'webform_submission' => array(
+        'title' => t('Rendered submissions'),
+        'help' => t('Display the rendered submission'),
+        'handler' => 'webform_views_plugin_row_submission_view',
+        'uses options' => TRUE,
+        'type' => 'normal',
       ),
     ),
   );
+
+  return $plugins;
 }
 
 /**
- * Implements hook_views_plugins().
+ * Implements hook_view_pre_view().
  */
-function webform_views_plugins() {
-  $plugins['row']['webform_submission'] = array(
-    'title' => t('Rendered submissions'),
-    'help' => t('Display the rendered submission'),
-    'handler' => 'webform_views_plugin_row_submission_view',
-    'base' => array('webform_submissions'),
-    'uses options' => TRUE,
-    'type' => 'normal',
-  );
-  return $plugins;
+function webform_views_pre_view($view, $display_id, $args) {
+  $display = $view->display[$display_id];
+  $all_fields_id = _webform_view_find_id($view, $display_id, 'field', array('field' => 'webform_all_fields'));
+
+  if ($all_fields_id !== NULL &&
+      !empty($args[0]) && is_numeric($args[0]) && $args[0] > 0 &&
+      _webform_view_find_id($view, $display_id, 'argument', array('field' => 'nid', 'table' => 'webform_submissions')) !== NULL &&
+      ($node = node_load($args[0])) && isset($node->webform['components'])) {
+    // This is a view/display that needs its fields expanded. It contains the
+    // webform_all_fields field, has a nid argument to the webform_submission
+    // table that is a valid node.
+
+    // Retrieve the display's fields and remove any fields after the 'webform_all_fields' field.
+    $fields = $view->get_items('field', $display_id);
+    $prototype = $fields[$all_fields_id];
+    $field_index = array_flip(array_keys($fields));
+    $trailing_fields = array_slice($fields, $field_index[$all_fields_id] + 1, NULL, TRUE);
+    $fields = array_slice($fields, 0, $field_index[$all_fields_id], TRUE);
+
+    // Remove any fields after the webform_add_fields field.
+
+    $new_columns = array();
+    foreach ($node->webform['components'] as $component) {
+      if (webform_component_invoke($component['type'], 'table', $component, array('')) !== NULL) {
+        $new_id = 'webform_component_' . $component['cid'];
+        $new_fields = array(
+          array(
+            'id' => $new_id,
+            'field' => 'value',
+            'table' => 'webform_submissions',
+            'label' => $component['name'], // CHECK FOR XSS TODO
+            'format' => 'plain',
+            'webform_nid' => $node->nid,
+            'webform_cid' => $component['cid'],
+            'exclude' => 0,
+          ) + $prototype,
+        );
+        if (webform_component_implements($component['type'], 'view_field')) {
+          $new_fields = webform_component_invoke($component['type'], 'view_field', $component, $new_fields);
+        }
+        foreach($new_fields as $sub_id => $new_field) {
+          $field_id = $new_id . ($sub_id ? '_' . $sub_id : '');
+          $fields[$field_id] = $new_field;
+          $new_columns[$field_id] = $field_id;
+        }
+      }
+    }
+
+    // Add any trailing fields back in.
+    $fields += $trailing_fields;
+
+
+    // Store. Alas, there is no view::set_items() method.
+    $display->handler->set_option('fields', $fields);
+
+    // If this display's style is a table, add columns for click-sorting.
+    if ($display->handler->get_option('style_plugin') == 'table') {
+      $style_options = $display->handler->get_option('style_options');
+      $style_options['columns'] += $new_columns;
+      $style_prototype = isset($style_options['info'][$all_fields_id])
+                            ? $style_options['info'][$all_fields_id]
+                            : array();
+      $style_prototype += array(
+        'sortable' => 1,
+        'default_sort_order' => 'asc',
+        'align' => '',
+        'separator' => '',
+        'empty_column' => 0,
+      );
+      $style_options['info'] += array_combine($new_columns, array_fill(1, count($new_columns), $style_prototype));
+      
+      //
+      //$key_index = array_flip(array_keys($columns));
+      //$offset = isset($key_index[$id]) ? $key_index[$id] : count($columns);
+      //$columns = array_slice($columns, 0, $offset, TRUE) + $new_columns + array_slice($columns, $offset, NULL, TRUE);
+      // Drop PHP Reference.
+      $display->handler->set_option('style_options', $style_options);
+    }
+
+    // Reset field handlers cache and rebuild field handlers.
+    unset($display->handler->handlers['field']);
+    $display->handler->get_handlers('field');
+
+    // Allow other modules to alter these modifications to the view.
+    drupal_alter('webform_view', $view, $display_id, $args);
+  }
+}
+
+/**
+ * Helper; Finds an item by option.
+ */
+function _webform_view_find_id($view, $display_id, $type, $options) {
+  foreach ($view->get_items($type, $display_id) as $id => $item) {
+    foreach ($options as $option_key => $option_value) {
+      if ($item[$option_key] != $option_value) {
+        continue 2;
+      }
+    }
+    return $id;
+  }
+  return NULL;
 }
 
 /**
diff --git a/views/webform_handler_area_result_pager.inc b/views/webform_handler_area_result_pager.inc
new file mode 100644
index 0000000..bc633a6
--- /dev/null
+++ b/views/webform_handler_area_result_pager.inc
@@ -0,0 +1,89 @@
+<?php
+
+/**
+ * @file
+ * Definition of views_handler_area_result.
+ */
+
+/**
+ * Views area handler to display some configurable result summary.
+ *
+ * @ingroup views_area_handlers
+ */
+class webform_handler_area_result_pager extends views_handler_area_result {
+
+  function option_definition() {
+    $options = parent::option_definition();
+    $options['tokenize'] = array('default' => FALSE, 'bool' => TRUE);
+    return $options;
+  }
+
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+    $form['content']['#description'] .= '<br/>' . t('Plus @items_per_page_links -- the list of links to change the items/page, with prompt');
+
+    // @TODO: Refactor token handling into a base class.
+    $form['tokenize'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Use replacement tokens from the first row'),
+      '#default_value' => $this->options['tokenize'],
+    );
+  }
+
+
+  /**
+   * Find out the information to render.
+   */
+  function render($empty = FALSE) {
+    $output = parent::render($empty);
+    if (is_string($output) && isset($this->view->query->pager)) {
+      $output = str_replace('@items_per_page_links', $this->render_items_per_page($this->view->query->pager), $output);
+      if ($this->options['tokenize']) {
+        $output = $this->view->style_plugin->tokenize_value($output, 0);
+        $output = $this->sanitize_value($output, 'xss_admin');
+      }
+    }
+    return $output;
+  }
+
+  function query() {
+    $view = $this->view;
+    if (!empty($_GET['items_per_page']) && $_GET['items_per_page'] > 0) {
+      $view->set_items_per_page($_GET['items_per_page']);
+    }
+    elseif (!empty($_GET['items_per_page']) && $_GET['items_per_page'] == 'All') {
+      $view->set_items_per_page(0);
+    }
+  }
+
+  function render_items_per_page($pager) {
+    $options = explode(',', $pager->options['expose']['items_per_page_options']);
+    $sanitized_options = array();
+    if (is_array($options)) {
+      foreach ($options as $option) {
+        if ($pager->total_items <= intval($option)) {
+          break;
+        }
+        $sanitized_options[intval($option)] = intval($option);
+      }
+      if (!empty($sanitized_options) && !empty($pager->options['expose']['items_per_page_options_all']) && !empty($pager->options['expose']['items_per_page_options_all_label'])) {
+        $sanitized_options[0] = $pager->options['expose']['items_per_page_options_all_label'];
+      }
+      foreach ($sanitized_options as $items_per_page => &$label) {
+        $selected = $pager->options['items_per_page'] == $items_per_page ||
+                    ($items_per_page == 0 && $pager->total_items < intval($pager->options['items_per_page']));
+        $label = l($label, $_GET['q'], array('query' => array('items_per_page' => $label) + $_GET,
+                                             'attributes' => array(
+                                                'class' => $selected ? array('selected') : array(),
+                                            )));
+
+      }
+      unset($label); // Drop PHP reference
+
+      // Include CSS needed for 'selected' class.
+      drupal_add_library('webform', 'admin');
+    }
+    return $sanitized_options ? t('Show !links results per page.', array('!links' => implode(' | ', $sanitized_options))) : '';
+  }
+
+}
diff --git a/views/webform_handler_field_submission_data.inc b/views/webform_handler_field_submission_data.inc
index 73ee4d3..8bc1dc0 100644
--- a/views/webform_handler_field_submission_data.inc
+++ b/views/webform_handler_field_submission_data.inc
@@ -6,18 +6,26 @@
  */
 
 /**
- * Field handler to show if submission is draft or not.
+ * Field handler to show submission data.
  *
  * @ingroup views_field_handlers
  */
 class webform_handler_field_submission_data extends views_handler_field {
 
+  function construct() {
+    // We need to set this property before calling the construct() chain
+    // as we use it in the option_definintion() call.
+    $this->webform_expand = $this->definition['webform_expand'];
+    parent::construct();
+  }
+
   function option_definition() {
     $options = parent::option_definition();
     $options['format'] = array('default' => 'html');
     $options['custom_label'] = array('default' => 'default');
     $options['webform_nid'] = array('default' => NULL);
     $options['webform_cid'] = array('default' => NULL);
+    $options['webform_datatype'] = array('default' => 'string');
     return $options;
   }
 
@@ -34,11 +42,24 @@ class webform_handler_field_submission_data extends views_handler_field {
     $form['custom_label']['#default_value'] = $this->options['custom_label'];
     $form['label']['#dependency'] = array('radio:options[custom_label]' => array('custom'));
 
-    $nid = (int) $this->options['webform_nid'];
-    $cid = (int) $this->options['webform_cid'];
+    if (!$this->webform_expand) {
+      $nid = (int) $this->options['webform_nid'];
+      $cid = (int) $this->options['webform_cid'];
 
-    // Helper function provides webform_nid and webform_cid options.
-    _webform_views_options_form($form, $form_state, $nid, $cid);
+      // Helper function provides webform_nid and webform_cid options.
+      _webform_views_options_form($form, $form_state, $nid, $cid);
+    }
+
+    // Modify behavior for the type of data in the component.
+    $form['webform_datatype'] = array(
+      '#type' => 'select',
+      '#title' => t('Display format'),
+      '#options' => array(
+        'string' => t('String'),
+        'number' => t('Number'),
+      ),
+      '#default_value' => $this->options['format'],
+    );
 
     // Provide the selection for the display format.
     $form['format'] = array(
@@ -54,12 +75,51 @@ class webform_handler_field_submission_data extends views_handler_field {
 
   function options_validate(&$form, &$form_state) {
     parent::options_validate($form, $form_state);
-    _webform_views_options_validate($form, $form_state);
+    if (!$this->webform_expand) {
+      _webform_views_options_validate($form, $form_state);
+    }
   }
 
   function options_submit(&$form, &$form_state) {
     parent::options_submit($form, $form_state);
-    _webform_views_options_submit($form, $form_state);
+    if (!$this->webform_expand) {
+      _webform_views_options_submit($form, $form_state);
+    }
+  }
+
+  /**
+   * Called to determine what to tell the clicksorter.
+   */
+  function click_sort($order) {
+    if (isset($this->field_alias)) {
+      // Since fields should always have themselves already added, just
+      // add a sort on the field.
+      $params = $this->options['group_type'] != 'group' ? array('function' => $this->options['group_type']) : array();
+
+      $join = new views_join;
+      $extra = array(
+        array(
+          'field' => 'cid',
+          'value' => $this->options['webform_cid'],
+          'numeric' => TRUE,
+        ),
+        array(
+          'field' => 'no',
+          'value' => '0',
+          'numeric' => TRUE,
+        ),
+      );
+      $join->construct('webform_submitted_data', 'webform_submissions', 'sid', 'sid', $extra);
+      $this->query->add_relationship('webform_submitted_data_click_sort', $join, 'webform_submissions');
+      switch ($this->options['webform_datatype']) {
+        case 'number':
+          $this->query->add_orderby(NULL, "IF(webform_submitted_data_click_sort.data REGEXP '^-?[0-9]+(\\\\.[0-9]*)?$', webform_submitted_data_click_sort.data + 0, NULL)", $order, $this->field_alias . '_click_sort', $params);
+          break;
+        default:
+          $this->query->add_orderby('webform_submitted_data_click_sort', 'data', $order, $this->field_alias . '_click_sort', $params);
+          break;
+      }
+    }
   }
 
   /**
diff --git a/views/webform_handler_field_submission_link.inc b/views/webform_handler_field_submission_link.inc
index e369e26..ce9e827 100644
--- a/views/webform_handler_field_submission_link.inc
+++ b/views/webform_handler_field_submission_link.inc
@@ -19,12 +19,8 @@ class webform_handler_field_submission_link extends views_handler_field {
     parent::construct();
     $this->additional_fields['sid'] = 'sid';
     $this->additional_fields['nid'] = 'nid';
-    $this->additional_fields['uid'] = 'uid';
-
-    $this->additional_fields['node_uid'] = array(
-      'table' => 'node',
-      'field' => 'uid',
-    );
+    $this->additional_fields['serial'] = 'serial';
+    $this->additional_fields['is_draft'] = 'is_draft';
   }
 
   function allow_advanced_render() {
@@ -35,6 +31,7 @@ class webform_handler_field_submission_link extends views_handler_field {
     $options = parent::option_definition();
     $options['label'] = array('default' => '', 'translatable' => TRUE);
     $options['text'] = array('default' => $this->link_type, 'translatable' => TRUE);
+    $options['access_check'] = array('default' => TRUE);
     return $options;
   }
 
@@ -44,55 +41,49 @@ class webform_handler_field_submission_link extends views_handler_field {
       '#type' => 'textfield',
       '#title' => t('Text to display'),
       '#default_value' => $this->options['text'],
+      '#description' => t('The token [serial] will be replaced with the serial number and draft indication.'),
+    );
+    $form['access_check'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Verify submission access for each link'),
+      '#default_value' => $this->options['access_check'],
     );
-  }
-
-  function query() {
-    $this->ensure_my_table();
-
-    // Join to the node table to retrieve the node UID.
-    $join = new views_join();
-    $join->construct('node', $this->table_alias, 'nid', 'nid');
-    $this->query->ensure_table('node', $this->relationship, $join);
-
-    $this->add_additional_fields();
   }
 
   function render($values) {
-    $submission = new stdClass();
-    $submission->sid = $values->{$this->aliases['sid']};
-    $submission->nid = $values->{$this->aliases['nid']};
-    $submission->uid = $values->{$this->aliases['uid']};
-    $node = (object) array(
-      'nid' => $submission->nid,
-      'uid' => $values->{$this->aliases['node_uid']},
-    );
+    $sid = $values->{$this->aliases['sid']};
+    $nid = $values->{$this->aliases['nid']};
+    $serial = $values->{$this->aliases['serial']};
+    $is_draft = $values->{$this->aliases['is_draft']};
 
+    $text = str_ireplace('[serial]',
+                          $serial . ($is_draft ? ' (' . t('draft') . ')' : ''),
+                          $this->options['text']);
     switch ($this->link_type) {
       case 'view':
-        $text = !empty($this->options['text']) ? $this->options['text'] : t('view');
-        $link = l($text, "node/$submission->nid/submission/$submission->sid");
-        $access = webform_submission_access($node, $submission, 'view');
+        $text = !empty($text) ? $text : t('view');
+        $link = l($text, "node/$nid/submission/$sid");
         break;
       case 'edit':
-        $text = !empty($this->options['text']) ? $this->options['text'] : t('edit');
-        $link = l($text, "node/$submission->nid/submission/$submission->sid/edit");
-        $access = webform_submission_access($node, $submission, 'edit');
+        $text = !empty($text) ? $text : t('edit');
+        $link = l($text, "node/$nid/submission/$sid/edit");
         break;
       case 'delete':
-        $text = !empty($this->options['text']) ? $this->options['text'] : t('delete');
+        $text = !empty($text) ? $text : t('delete');
         $path = drupal_get_path_alias($_GET['q']);
-        $link = l($text, "node/$submission->nid/submission/$submission->sid/delete", array('query' => array('destination' => $path)));
-        $access = webform_submission_access($node, $submission, 'delete');
+        $link = l($text, "node/$nid/submission/$sid/delete", array('query' => array('destination' => $path)));
         break;
       default:
-        $text = '';
-        $link = NULL;
-        $access = FALSE;
+        return;
     }
 
-    if (!$access) {
-      return;
+    if ($this->options['access_check']) {
+      module_load_include('inc', 'webform', 'includes/webform.submissions');
+      $node = node_load($nid);
+      $submission = webform_get_submission($nid, $sid);
+      if (!webform_submission_access($node, $submission, $this->link_type)) {
+        return;
+      }
     }
 
     return $link;
diff --git a/webform.api.php b/webform.api.php
index 5f2b20f..a2bc31f 100644
--- a/webform.api.php
+++ b/webform.api.php
@@ -1256,6 +1256,61 @@ function _webform_csv_data_component($component, $export_options, $value) {
 }
 
 /**
+ * Adjusts the view field(s) that are automatically generated for number
+ * components.
+ *
+ * Provides each component the opportunity to adjust how this component is
+ * displayed in a view as a field in a view table. For example, a component may
+ * modify how it responds to click-sorting. Or it may add additional fields,
+ * such as a grid component having a column for each question.
+ *
+ * @param array $component
+ *   A Webform component array
+ * @param array $fields
+ *   An array of field-definition arrays. Will be passed one field definition,
+ *   which may be modified. Additional fields may be added to the array.
+ * @return array
+ *   The modified $fields array.
+ */
+function _webform_view_field_component($component, $fields) {
+  foreach ($fields as &$field) {
+    $field['webform_datatype'] = 'number';
+  }
+  return $fields;
+}
+
+/**
+ * Modify the how a view was expanded to show all the components.
+ *
+ * This alter function is only called when the view is actually modified. It
+ * provides modules an opportunity to alter the changes that webform made to
+ * the view.
+ *
+ * This hook is called from webform_views_pre_view. If another module also
+ * changes views by implementing this same views hook, the relative order of
+ * execution of the two implementations will depend upon the module weights of
+ * the two modules. Using hook_webform_view_alter instead guarantees an
+ * opportuinty to modify the view AFTER webform.
+ *
+ * @param object $view
+ *   The view object.
+ * @param string $display_id
+ *   The display_id that was expanded by webform.
+ * @param array $args
+ *   The argumentst that were passed to the view.
+ */
+function hook_webform_view_alter($view, $display_id, $args) {
+  // Don't show component with cid == 4
+  $fields = $view->get_items('field', $display_id);
+  foreach ($fields as $id => $field) {
+    if (isset($field['webform_cid']) && $field['webform_cid'] == 4) {
+      unset($fields[$id]);
+    }
+  }
+  $view->display[$display_id]->handler->set_option('fields', $fields);
+}
+
+/**
  * Modify the list of mail systems that are capable of sending HTML email.
  *
  * @param array &$systems
diff --git a/webform.info b/webform.info
index 8d9dd1c..a735218 100644
--- a/webform.info
+++ b/webform.info
@@ -26,6 +26,7 @@ files[] = views/webform_handler_field_webform_status.inc
 files[] = views/webform_handler_filter_is_draft.inc
 files[] = views/webform_handler_filter_submission_data.inc
 files[] = views/webform_handler_filter_webform_status.inc
+files[] = views/webform_handler_area_result_pager.inc
 files[] = views/webform_plugin_row_submission_view.inc
 files[] = views/webform_handler_relationship_submission_data.inc
 files[] = views/webform.views.inc
diff --git a/webform.module b/webform.module
index c0c5c0b..7737136 100644
--- a/webform.module
+++ b/webform.module
@@ -4028,6 +4028,9 @@ function webform_variable_get($variable) {
     case 'webform_progressbar_label_confirmation':
       $result = variable_get('webform_progressbar_label_confirmation', t('Complete'));
       break;
+    case 'webform_table':
+      $result = variable_get('webform_table', FALSE);
+      break;
   }
   return $result;
 }
@@ -4655,12 +4658,24 @@ function webform_email_html_capable() {
  */
 function webform_views_api() {
   return array(
-    'api' => 2.0,
+    'api' => 3.0,
     'path' => drupal_get_path('module', 'webform') . '/views',
   );
 }
 
 /**
+ * Implements hook_views_default_views().
+ */
+function webform_views_default_views() {
+  $path = './' . drupal_get_path('module', 'webform') . '/views/default_views/*.inc';
+  $views = array();
+  foreach (glob($path) as $views_filename) {
+    require_once($views_filename);
+  }
+  return $views;
+}
+
+/**
  * Implements hook_field_extra_fields().
  */
 function webform_field_extra_fields() {
-- 
1.7.8.msysgit.0

