This patch adds JavaScript-based inline uploading (screenshot).

It does this by redirecting the submission of the form to a hidden <iframe> when you click "Attach" (we cannot submit data through Ajax directly because you cannot read file contents from JS for security reasons).
Once the file is submitted, the upload-section of the form is updated.

Things to note:

  • The feature degrades back to the current behaviour without JS.
  • If there are errors with the uploaded file (disallowed type, too big, ...), they are displayed at the top of the file attachments fieldset.
  • Though the hidden-iframe method sounds dirty, it's quite compact and is 100% implemented in .js files. The drupal.js api makes it a snap to use.
  • I included some minor improvements to the Drupal JS API and code.
  • I added an API drupal_call_js() to bridge the PHP/JS gap: it takes a function name and arguments, and outputs a <script> tag. The kicker is that it preserves the structure and type of arguments, so e.g. PHP associative arrays end up as objects in JS.
  • I also included a progressbar widget that I wrote for drumm's ongoing update.php work. It includes Ajax status updating/monitoring, but it is only used as a pure throbber in this patch. But as the code was already written and is going to be used in the near future, I left that part in. It's pretty small ;). If PHP supports ad-hoc upload info in the future like Ruby on Rails, we can implement that in 5 minutes.
Support from Acquia helps fund testing for Drupal Acquia logo

Comments

Steven’s picture

FileSize
1.22 KB

This image belongs in the misc directory.

m3avrck’s picture

This sounds like a great and much needed feature! I'm curious as to how extendable this feature is because I would like to very soon create a window that can be opened from a link (maybe even through TinyMCE) to basically include links to documents on a Drupal website within the content itself, instead of merely "attaching" them to the end of the document. Taking this upload feature, along with better a file manager could create quite an awesome webbased FTP like program that I know many would find useful. I'll have to take a look at this patch much more closely very soon.

drumm’s picture

+1

Works as expected and it degrades well (at first I didn't do a hard refresh and my browser wasn't seeing the new js or css).

drumm’s picture

Version: 4.6.0 »
Steven’s picture

FileSize
14.6 KB

Keeping up to date. Still needs confirmed testing on KHTML browsers like Konqueror and Safari, please.

Gabriel R.’s picture

I'd be happy to test on Safari (1.2 and 2/1.3) and other WebKit browsers and report the results here, but I can't apply the patch on any of my installs (too risky) and don't have the time to set up a new Drupal installation.

Steven, any chance for you to share a web page for me to test?

Thanks.

Stefan Nagtegaal’s picture

Maybe it is me, but Steven why do you bother about the fact that this will work on Safari? All other JS/AJAX we currently have in core doesn't work with Safari...

Is it something special, or is t just curiocity?

Stefan

Steven’s picture

Mostly because I can't test it, and Javascript is a fidgety business. But I have to admit I was surprised when I found out (recently!) that Drupal JS doesn't work in Safari. The features we check for are all basic W3C DOM stuff, I assumed Safari would support them.

Do we know why Safari doesn't work?

Crell’s picture

I'm not sure about Drupal in particular, but Safari is missing a LOT Of W3C DOM "stuff". Many functions are there, but stubbed out and do nothing. Others are badly implemented. It's closer to the standard than IE is, but with the missing functionality I'm not sure which is really easier to code for. I don't know if Konqueror is crippled in the same way, but I would suspect it is. (I've not gotten any decent Ajax to work in Konqueror myself, although I freely admit to not being an expert on the subject.)

Stefan Nagtegaal’s picture

Okay, I found out how to debug with Safari..

When I goto: '?q=node/add/$type', I get these errors:
- SyntaxError - Parse error (line 37)
drupal.js
- TypeError - Object (result of expression isJsEnabled) does not allow calls (line 3)
collapse.js
- TypeError - Object (result of expression isJsEnabled) does not allow calls (line 4)
autocomplete.js

Maybe you know what's wrong or what todo about it?

Thox’s picture

Status: Needs review » Needs work

After successfully attaching a file, the user can navigate away from the page without pressing submit. The attachment shows up in the table, but in this case the attachment isn't linked to the node.

m3avrck’s picture

Now I haven't had time to play with this patch yet, but that last comment gave me an idea.

Is there a JS check to see if the user is trying to navigate away from the page? For example, they are uploading a file and click a link in another app, all of a sudden that upload page they are on is replaced by some other page. A simple JS check for this saying "Do you want to leave this page and cancel the upload?" would certainly be a great usability boost and prevent this from happening.

tostinni’s picture

Retaking this idea of controlling if user is living a page or not, I recently saw the new IPB permission panel demo, it makes an intense use of AJAX and provide a way to keep track if the user is living the page.
See the demo here.

Steven’s picture

Status: Needs work » Needs review

Thox: this is by design, and no different from submitting a file by doing a preview, and then navigating away from the edit page. "Changes made to the attachments list will not be permanent until you save this post."

The patch simply streamlines the workflow.

Dries’s picture

Status: Needs review » Needs work

Patch doesn't apply.

(BTW, is it me or is the progress bar somewhat toy-ish and somewhat flashy?)

Thox’s picture

When attaching two or more files with the same without pressing submit, the original file is overwritten and the table shows two files with the same name. After pressing submit, the table shows one file.

Steven’s picture

Status: Needs work » Needs review
FileSize
14.63 KB

Thox: this is also an existing behaviour/bug in upload.module. This patch does not affect any of the underlying file saving or storage mechanisms.

It simply introduces an asynchronous form submission and result display, but otherwise uses exactly the same code as the non-JS version.

Attached is an up-to-date, but otherwise unchanged version.

Bèr Kessels’s picture

Steven: I will test this on KHTML, but might need some help, for I am very limited in time (read: reallyy have no time for testing). HOwever: in contrary to what Stefan says, the current ajax/js works well on konq. AND on safari (and beleive me I have a hell of a testing environment :))

m3avrck’s picture

What's the status of this? Can we get this into core before the freeze, seems to be working great for me!

Stefan Nagtegaal’s picture

I retested this patch and I can verify that it works the way it would work on Safari..
Please apply..

BTW Ber: Macs just works! Only microsoft screws it!

Steven’s picture

Status: Needs review » Reviewed & tested by the community
FileSize
14.63 KB

Keeping up to date, setting to commit-ready given that there were no bugs reported that are caused by this patch.

Bèr Kessels’s picture

I don't want to be a nitpick, but IMO the progressbar should animate from left to right. That just feels better.

Dries’s picture

Status: Reviewed & tested by the community » Fixed

Committed to HEAD. Thanks.

Anonymous’s picture

Anonymous’s picture

Anonymous’s picture

Status: Fixed » Closed (fixed)