diff --git a/file_metadata_table.info b/file_metadata_table.info index faf410e..28ecc07 100644 --- a/file_metadata_table.info +++ b/file_metadata_table.info @@ -1,5 +1,5 @@ name = File Metadata Table Formatter -description = Provides an extendible table formatter for file fields. +description = Provides an extendible table formatter and upload widget for file fields. core = 7.x package = Fields dependencies[] = file diff --git a/file_metadata_table.js b/file_metadata_table.js new file mode 100644 index 0000000..75f9630 --- /dev/null +++ b/file_metadata_table.js @@ -0,0 +1,52 @@ +(function ($, Drupal) { + + "use strict"; + + var showText = Drupal.t('Show hidden files'); + var hideText = Drupal.t('Hide hidden files'); + var toggleState = false; + + function hideRows ($table) { + var tableDragObject = Drupal.tableDrag[$table.attr('id')]; + var $toggleLink = $(''); + $toggleLink + .attr('title', Drupal.t('Show or hide rows with hidden files.')) + .bind('click.metadataTable', function (e) { + $table.find('.file-display:not(:checked)').closest('tr').toggle(toggleState); + tableDragObject.restripeTable(); + $toggleLink.html(toggleState ? hideText : showText); + toggleState = !toggleState; + e.preventDefault(); + }); + // Add a link before the table for users to show or hide files. + $table.parent().prepend( + $('
').prepend($toggleLink) + ); + } + + Drupal.behaviors.fileMetadataTable = { + attach: function (context) { + var $table = $(context).find('.field-widget-file-generic table[id]').once('file-metadata-advanced'); + if ($table.length) { + hideRows($table); + } + toggleState = false; + // By default hide the rows for hidden files. + $('.file-metadata-table-toggle-row').click(); + }, + detach: function (context, settings, trigger) { + if (trigger === 'unload') { + var $table = $(context).find('.field-widget-file-generic table[id]').removeOnce('file-metadata-advanced'); + if ($table.length) { + // Force display of hidden rows. + toggleState = true; + // We need to select the parent because the link is outside the table. + $table.parent().find('.file-metadata-table-toggle-row').click() + .unbind('click.metadataTable').remove(); + } + } + } + }; + + +})(jQuery, Drupal); diff --git a/file_metadata_table.module b/file_metadata_table.module index 24bb9da..14b807c 100755 --- a/file_metadata_table.module +++ b/file_metadata_table.module @@ -471,10 +471,14 @@ function file_metadata_table_field_formatter_view($entity_type, $entity, $field, // Add the file_metadata_table render element to our output if (!empty($rows)) { + $table_id = check_plain("file-metadata-table-" . str_replace('_', '-', $field['field_name'])); $elements[] = array( '#theme' => 'table', '#header' => $header, '#rows' => $rows, + '#attributes' => array( + 'id' => $table_id, + ), ); } @@ -591,6 +595,7 @@ function file_metadata_table_rowdata($item, $context) { 'class' => 'file-metadata-table-' . $column, ); } + // Assign a common class to all rows $class = array('file-metadata-table-row'); @@ -665,3 +670,18 @@ function file_metadata_table_celldata($column, $item, $context) { } return $data; } + +/** + * Implements hook_field_widget_form_alter(). + * + * Used to add the 'show hidden files' javascript to the widget, and override + * the theme used to render the file_widget_multiple widget when the + * 'file_metadata_prevent_remove' widget setting is enabled. + */ +function file_metadata_table_field_widget_form_alter(&$element, &$form_state, $context) { + // Restrict alterations to the file_generic widget type + if ($context['instance']['widget']['type'] == 'file_generic') { + // Add custom JS used for the 'Show/Hide hidden files' functionality + $element['#attached']['js'][] = drupal_get_path('module', 'file_metadata_table') . '/file_metadata_table.js'; + } +}