WIP
authorJoey Hess <joey@kitenet.net>
Wed, 15 Jun 2011 19:21:59 +0000 (15:21 -0400)
committerJoey Hess <joey@kitenet.net>
Wed, 15 Jun 2011 19:21:59 +0000 (15:21 -0400)
IkiWiki/Plugin/attachment.pm
templates/editpage.tmpl

index 4bd08bf7b6da8bf3f0f4b7d6f48efa1ced9eadf0..cb4f4dcd6ebbb1470e1e0e531d81eb240564bf04 100644 (file)
@@ -119,11 +119,11 @@ sub formbuilder (@) {
 
        return if ! defined $form->field("do") || ($form->field("do") ne "edit" && $form->field("do") ne "create") ;
 
-       my $filename=Encode::decode_utf8($q->param('attachment'));
-       if (defined $filename && length $filename &&
-            ($form->submitted eq "Upload Attachment" || $form->submitted eq "Save Page")) {
+       my $filename=Encode::decode_utf8($q->param('attachments'));
+       if (defined $filename && length $filename) {
                attachment_store($filename, $form, $q, $params{session});
        }
+
        if ($form->submitted eq "Save Page") {
                attachments_save($form, $params{session});
        }
@@ -240,6 +240,22 @@ sub attachment_store {
                        IkiWiki::fast_file_copy($tempfile, $filename, $fh, @_);
                });
        }
+       
+       # Return JSON response for the jquery file upload widget.
+       eval q{use JSON};
+       error $@ if $@;
+       print "Content-type: application/json\n\n";
+       my $size=-s $dest."/".$filename;
+       print to_json([
+               {
+                       name => $filename,
+                       size => $size,
+                       humansize => IkiWiki::Plugin::filecheck::humansize($size),
+                       stored_msg => stored_msg(),
+                       
+               }
+       ]);
+       exit 0;
 }
 
 # Save all stored attachments for a page.
@@ -297,11 +313,12 @@ sub attachment_list ($) {
        my $std=sub {
                my $file=shift;
                my $mtime=shift;
+               my $date=shift;
                my $size=shift;
 
-               "field-select" => '<input type="checkbox" name="attachment_select" value="'.$file.'" />',
+               name => $file,
                size => IkiWiki::Plugin::filecheck::humansize($size),
-               mtime => displaytime($mtime),
+               mtime => $date,
                mtime_raw => $mtime,
        };
 
@@ -311,7 +328,7 @@ sub attachment_list ($) {
                if (! defined pagetype($f) &&
                    $f=~m/^\Q$loc\E[^\/]+$/) {
                        $attachments{$f}={
-                               $std->($f, $IkiWiki::pagemtime{$f}, (stat($f))[7]),
+                               $std->($f, $IkiWiki::pagemtime{$f}, displaytime($IkiWiki::pagemtime{$f}), (stat($f))[7]),
                                link => htmllink($page, $page, $f, noimageinline => 1),
                        };
                }
@@ -322,19 +339,21 @@ sub attachment_list ($) {
        my $heldmsg=gettext("this attachment is not yet saved");
        foreach my $file (glob("$dir/*")) {
                next unless -f $file;
-               my $mtime=(stat(_))[9];
                my $base=IkiWiki::basename($file);
                my $f=$loc.$base;
                $attachments{$f}={
-                       $std->($f, (stat($file))[9], (stat(_))[7]),
-                       link => "<span title=\"$heldmsg\">$base</span>",
+                       $std->($f, (stat($file))[9], stored_msg(), (stat(_))[7]),
+                       link => $base,
                }
        }
 
-       # Sort newer attachments to the top of the list, so a newly-added
-       # attachment appears just before the form used to add it.
-       return sort { $b->{mtime_raw} <=> $a->{mtime_raw} || $a->{link} cmp $b->{link} }
+       # Sort newer attachments to the end of the list.
+       return sort { $a->{mtime_raw} <=> $b->{mtime_raw} || $a->{link} cmp $b->{link} }
                values %attachments;
 }
 
+sub stored_msg {
+       gettext("just uploaded");
+}
+
 1
index d6ad8061420f2c8056b6c1d12f3da6223ba0582f..6fe495aa8d2843232ec6ab0c747ca7ec9f12f204 100644 (file)
@@ -1,3 +1,5 @@
+<link rel="stylesheet" href="http://localhost/~joey/tmp/blueimp-jQuery-File-Upload-7f89121/jquery-ui.css" id="theme"> 
+<link rel="stylesheet" href="http://localhost/~joey/tmp/blueimp-jQuery-File-Upload-7f89121/jquery.fileupload-ui.css"> 
 <TMPL_VAR JAVASCRIPT>
 <TMPL_VAR MESSAGE>
 <br />
 <TMPL_VAR HELPONFORMATTINGLINK>
 <TMPL_IF NAME="FIELD-ATTACHMENT">
 <a class="toggle" href="#attachments">Attachments</a>
-<div class="<TMPL_VAR ATTACHMENTS-CLASS>" id="attachments">
-<table>
+<noscript>
 <tr><td colspan="5"><TMPL_VAR FIELD-ATTACHMENT><TMPL_VAR FIELD-UPLOAD></td></tr>
-<TMPL_LOOP NAME="ATTACHMENT_LIST">
-<tr><td><TMPL_VAR FIELD-SELECT><TMPL_VAR LINK></td><td><TMPL_VAR SIZE></td><td><TMPL_VAR MTIME></td></tr>
-</TMPL_LOOP>
+</noscript>
+<div class="<TMPL_VAR ATTACHMENTS-CLASS>" id="attachments">
+<div id="fileupload"> 
+<div class="fileupload-buttonbar"> 
+<label class="fileinput-button"> 
+<span>Add files...</span> 
+<input type="file" name="attachments" multiple> 
+</label> 
+<button type="submit" class="start">Start upload</button> 
+<button type="reset" class="cancel">Cancel upload</button> 
 <TMPL_IF NAME="ATTACHMENT_LIST">
-<tr><td colspan="2"><TMPL_VAR FIELD-LINK><TMPL_VAR FIELD-RENAME><TMPL_VAR FIELD-REMOVE></td></tr>
+<TMPL_VAR FIELD-LINK><TMPL_VAR FIELD-RENAME><TMPL_VAR FIELD-REMOVE>
 </TMPL_IF>
+</div> 
+<script id="template-upload" type="text/x-jquery-tmpl"> 
+    <tr class="template-upload{{if error}} ui-state-error{{/if}}">
+        <td><input type="checkbox" name="dummy" />${name}</td>
+        <td>${sizef}</td>
+        {{if error}}
+            <td class="error" colspan="2">Error:
+                {{if error === 'maxFileSize'}}File is too big
+                {{else error === 'minFileSize'}}File is too small
+                {{else error === 'acceptFileTypes'}}Filetype not allowed
+                {{else error === 'maxNumberOfFiles'}}Max number of files exceeded
+                {{else}}${error}
+                {{/if}}
+            </td>
+        {{else}}
+            <td class="progress"><div></div></td>
+            <td class="start"><button>Start</button></td>
+        {{/if}}
+        <td class="cancel"><button>Cancel</button></td>
+    </tr>
+</script> 
+<script id="template-download" type="text/x-jquery-tmpl"> 
+    <tr class="template-download{{if error}} ui-state-error{{/if}}">
+        <td><input type="checkbox" name="attachment_select" value="${name}" />${name}</td>
+        <td>${humansize}</td>
+        {{if error}}
+            <td class="error" colspan="2">Error:
+                {{if error === 1}}File exceeds upload_max_filesize (php.ini directive)
+                {{else error === 2}}File exceeds MAX_FILE_SIZE (HTML form directive)
+                {{else error === 3}}File was only partially uploaded
+                {{else error === 4}}No File was uploaded
+                {{else error === 5}}Missing a temporary folder
+                {{else error === 6}}Failed to write file to disk
+                {{else error === 7}}File upload stopped by extension
+                {{else error === 'maxFileSize'}}File is too big
+                {{else error === 'minFileSize'}}File is too small
+                {{else error === 'acceptFileTypes'}}Filetype not allowed
+                {{else error === 'maxNumberOfFiles'}}Max number of files exceeded
+                {{else error === 'uploadedBytes'}}Uploaded bytes exceed file size
+                {{else error === 'emptyResult'}}Empty file upload result
+                {{else}}${error}
+                {{/if}}
+            </td>
+        {{else}}
+            <td>${stored_msg}</td>
+        {{/if}}
+    </tr>
+</script> 
+<script src="http://localhost/~joey/tmp/blueimp-jQuery-File-Upload-7f89121/jquery.min.js"></script> 
+<script src="http://localhost/~joey/tmp/blueimp-jQuery-File-Upload-7f89121/jquery-ui.min.js"></script> 
+<script src="http://localhost/~joey/tmp/blueimp-jQuery-File-Upload-7f89121/jquery.tmpl.min.js"></script> 
+<script src="http://localhost/~joey/tmp/blueimp-jQuery-File-Upload-7f89121/jquery.iframe-transport.js"></script> 
+<script src="http://localhost/~joey/tmp/blueimp-jQuery-File-Upload-7f89121/jquery.fileupload.js"></script> 
+<script src="http://localhost/~joey/tmp/blueimp-jQuery-File-Upload-7f89121/jquery.fileupload-ui.js"></script> 
+<script>
+$(function () { $('#fileupload').fileupload(); }); // initialize upload widget
+</script>
+<div class="fileupload-content">
+<table class="files">
+<TMPL_LOOP NAME="ATTACHMENT_LIST">
+<tr><td><input type="checkbox" name="attachment_select" value="<TMPL_VAR NAME ESCAPE="HTML">" /><TMPL_VAR LINK></td><td><TMPL_VAR SIZE></td><td><TMPL_VAR MTIME></td></tr>
+</TMPL_LOOP>
 </table>
 </div>
+</div> 
+</div>
 </TMPL_IF>
 <TMPL_VAR FORM-END>
 <TMPL_VAR WMD_PREVIEW>
-
 <TMPL_IF NAME="PAGE_PREVIEW">
 <hr />
 <div class="header">