Index: misc/upload.js =================================================================== RCS file: /cvs/drupal/drupal/misc/upload.js,v retrieving revision 1.12 diff -u -r1.12 upload.js --- misc/upload.js 1 Jun 2007 09:05:45 -0000 1.12 +++ misc/upload.js 7 Jun 2007 16:21:32 -0000 @@ -13,6 +13,11 @@ var hide = base + '-hide'; var upload = new Drupal.jsUpload(uri, button, wrapper, hide); }); + + $('.file-delete-wrapper').each(function () { + fileDeleteData = Drupal.getFileDeleteData(this.id); + Drupal.initFileDelete(fileDeleteData); + }); }; /** @@ -55,6 +60,12 @@ * Handler for the form redirection completion. */ Drupal.jsUpload.prototype.oncomplete = function (data) { + // Store status of the Delete checkboxes, so that they can be restored later + var fileDeleteData = new Array(); + $('.file-delete-wrapper').each(function () { + fileDeleteData[this.id] = Drupal.getFileDeleteData(this.id); + }); + // Remove old form Drupal.freezeHeight(); // Avoid unnecessary scrolling $(this.wrapper).html(''); @@ -65,11 +76,10 @@ // If uploading the first attachment fade in everything if ($('tr', div).size() == 2) { - // Replace form and re-attach behaviour + // Replace form and fade in items $(div).hide(); $(this.wrapper).append(div); $(div).fadeIn('slow'); - Drupal.uploadAutoAttach(); } // Else fade in only the last table row else { @@ -85,11 +95,15 @@ } }); - // Replace form, fade in items and re-attach behaviour + // Replace form and fade in items $(this.wrapper).append(div); $('table tr:last-of-type td', div).fadeIn('slow'); $(this.hide, div).fadeIn('slow'); - Drupal.uploadAutoAttach(); + } + // Re-attach behaviour and update previous marked-for-deletion status + Drupal.uploadAutoAttach(); + for (key in fileDeleteData) { + Drupal.updateFileDelete(fileDeleteData[key], 'show'); } Drupal.unfreezeHeight(); }; @@ -109,6 +123,75 @@ }); }; +/** + * Retrieve some ids and classes that will be modified when Delete is pressed. + * The id of each wrapper div is used as base name (e.g. files-0-remove), + * other elements will have to adjust their id or class accordingly. + */ +Drupal.getFileDeleteData = function(wrapper) { + var fileDeleteData = new Array(); + fileDeleteData['wrapper'] = wrapper; + // Transform stuff like update_0 to update-0, like Form API does + fileDeleteData['checkbox'] = 'edit-' + wrapper.replace(/_/g, '-'); + fileDeleteData['button'] = wrapper + '-button'; + fileDeleteData['classVisible'] = '.' + wrapper + '-visible'; + fileDeleteData['classHidden'] = '.' + wrapper + '-hidden'; + fileDeleteData['aboutToDelete'] = $('#' + fileDeleteData['checkbox']).attr('checked'); + fileDeleteData['textDelete'] = Drupal.settings.fileDeleteButton[0]; + fileDeleteData['textCancel'] = Drupal.settings.fileDeleteButton[1]; + return fileDeleteData; +}; + +/** + * Initialize the JS file delete buttons and behaviour. + */ +Drupal.initFileDelete = function(fileDeleteData) { + // Add a delete/cancel button instead of the checkbox + // (which is already hidden by having the "js-hide" class assigned). + $('#' + fileDeleteData['wrapper']).append( + "" + ); + // Remove this class, we now use hide(), show() and fadeIn() instead. + $('.file-delete-hidden').removeClass('file-delete-hidden').hide(); + + // When the button is clicked, toggle the checkbox and css class visibility + $('#' + fileDeleteData['button']).click(function () { + fileDeleteData['aboutToDelete'] = ! $('#' + fileDeleteData['checkbox']).attr('checked'); + Drupal.updateFileDelete(fileDeleteData, 'fade'); + }); +}; + +/** + * Set or unset the checkbox, and show the right button text (Delete or Cancel) + * and css class visibility: when Delete has been pressed, classVisible will + * be hidden and classHidden will be shown. + */ +Drupal.updateFileDelete = function(fileDeleteData, appearanceMethod) { + $('#' + fileDeleteData['checkbox']).attr('checked', fileDeleteData['aboutToDelete']); + + if (fileDeleteData['aboutToDelete']) { + $('#' + fileDeleteData['button']).val(fileDeleteData['textCancel']); + $(fileDeleteData['classVisible']).hide(); + toBeShown = $(fileDeleteData['classHidden']); + } + else { + $('#' + fileDeleteData['button']).val(fileDeleteData['textDelete']); + $(fileDeleteData['classHidden']).hide(); + toBeShown = $(fileDeleteData['classVisible']); + } + + // When re-initialization is done after an attachment upload, + // we don't want stuff to be faded in - just plain show it. + if (appearanceMethod == 'show') { + toBeShown.show(); + } + else { + toBeShown.fadeIn('fast'); + } +}; + // Global killswitch if (Drupal.jsEnabled) { Index: modules/system/system.css =================================================================== RCS file: /cvs/drupal/drupal/modules/system/system.css,v retrieving revision 1.29 diff -u -r1.29 system.css --- modules/system/system.css 4 Jun 2007 10:36:42 -0000 1.29 +++ modules/system/system.css 7 Jun 2007 16:21:33 -0000 @@ -388,6 +388,13 @@ } /* +** JavaScript file deletion +*/ +.file-delete-hidden { + display: none; +} + +/* ** Progressbar styles */ .progress { Index: modules/upload/upload.module =================================================================== RCS file: /cvs/drupal/drupal/modules/upload/upload.module,v retrieving revision 1.164 diff -u -r1.164 upload.module --- modules/upload/upload.module 4 Jun 2007 07:22:22 -0000 1.164 +++ modules/upload/upload.module 7 Jun 2007 16:21:33 -0000 @@ -368,6 +368,7 @@ if ($form['type']['#value'] .'_node_form' == $form_id && variable_get("upload_$node->type", TRUE)) { drupal_add_js('misc/progress.js'); drupal_add_js('misc/upload.js'); + drupal_add_js(array('fileDeleteButton' => array(t('Delete'), t('Cancel'))), 'setting'); // Attachments fieldset $form['attachments'] = array( @@ -617,7 +618,17 @@ $form['files'][$key]['description'] = array('#type' => 'textfield', '#default_value' => !empty($file->description) ? $file->description : $file->filename, '#maxlength' => 256, '#description' => $description ); $form['files'][$key]['size'] = array('#value' => format_size($file->filesize)); - $form['files'][$key]['remove'] = array('#type' => 'checkbox', '#default_value' => !empty($file->remove)); + + $form['files'][$key]['delete-text'] = array( + '#value' => '
'. t('"%filename" is marked for deletion.', array('%filename' => $file->filename)) .'
', + ); + $form['files'][$key]['remove'] = array( + '#type' => 'checkbox', + '#default_value' => !empty($file->remove), + '#attributes' => array('class' => 'js-hide'), + '#prefix' => '